From 6f1f89d34f2dd36521ae7dfae0229c5fb793034d Mon Sep 17 00:00:00 2001
From: Claude
Date: Tue, 13 Oct 2026 20:05:52 +0000
Subject: [PATCH 1/5] feat(quiz): strict window-leave level on a reusable
three-position switch
The quiz reset on leaving now has three levels stored in
quiz_reset_on_leave (0 Off, 1 Moderate, 2 Strict; existing forms keep
their behaviour). Strict also counts the window losing the focus, after
a global grace period (Settings -> Certificates), ignoring focus moving
into an iframe of the page. "Start again" reloads the page so shuffled
options are shuffled again.
Adds AdminUI::render_tri_toggle (severity and traffic palettes, pure
CSS over native radios) and an enum type to both autosave endpoints.
Closes #1745
Co-Authored-By: Claude Opus 5.5
Claude-Session: https://claude.ai/code/session_018srx5hc431EYmG4MHUr2KA
---
CHANGELOG.md | 1 +
assets/css/ffc-common.css | 138 ++++++++++++++
assets/css/ffc-common.min.css | 2 +-
assets/js/ffc-admin-autosave.js | 15 +-
assets/js/ffc-admin-autosave.min.js | 2 +-
assets/js/ffc-quiz-leave.js | 169 ++++++++++++++----
assets/js/ffc-quiz-leave.min.js | 2 +-
includes/admin/class-ffc-admin-ui.php | 96 ++++++++++
.../class-ffc-form-editor-quiz-metabox.php | 24 ++-
.../class-ffc-form-editor-save-handler.php | 5 +-
.../class-ffc-form-meta-ajax-endpoint.php | 37 +++-
.../class-ffc-settings-ajax-endpoint.php | 18 ++
.../admin/class-ffc-settings-save-handler.php | 6 +
includes/admin/class-ffc-settings.php | 1 +
includes/core/class-ffc-quiz-leave-level.php | 99 ++++++++++
includes/frontend/class-ffc-shortcodes.php | 41 ++++-
.../class-ffc-submission-persister.php | 2 +-
.../settings/class-ffc-settings-reader.php | 10 ++
.../documentation/feature-certificates.php | 1 +
.../views/documentation/feature-quiz.php | 2 +-
.../settings/views/ffc-tab-certificates.php | 11 ++
languages/ffcertificate-pt_BR.l10n.php | 2 +-
languages/ffcertificate-pt_BR.mo | Bin 982739 -> 986110 bytes
languages/ffcertificate-pt_BR.po | 72 ++++++--
languages/ffcertificate.pot | 72 ++++++--
tests/Unit/AdminUITest.php | 67 +++++++
tests/Unit/DarkModeCssTest.php | 8 +
tests/Unit/FormEditorQuizMetaboxTest.php | 21 ++-
tests/Unit/FormEditorSaveHandlerTest.php | 22 +++
tests/Unit/FormMetaAjaxEndpointTest.php | 38 +++-
tests/Unit/FrontendShortcodesTest.php | 18 ++
tests/Unit/OpacityContrastTest.php | 1 +
tests/Unit/QuizLeaveLevelTest.php | 39 ++++
tests/Unit/SettingsAjaxEndpointTest.php | 9 +
tests/Unit/SettingsSaveHandlerTest.php | 17 ++
tests/Unit/SubmissionPersisterTest.php | 1 +
tests/js/admin-autosave.test.js | 25 +++
tests/js/quiz-leave.test.js | 117 +++++++++++-
38 files changed, 1097 insertions(+), 114 deletions(-)
create mode 100644 includes/core/class-ffc-quiz-leave-level.php
create mode 100644 tests/Unit/QuizLeaveLevelTest.php
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9154fe145..209a3b20d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,7 @@ The format follows [Keep a Changelog] (https://keepachangelog.com/en/1.1.0/).
- **Quiz questions are scored per field** (#1730). Each field can be scored or left out; choices by correct option(s), a checkbox only on the exact set, or by points per option; text when answered; number and date by a correct range. "Show which answers were correct" now works. New tokens `{{correct_count}}` and `{{question_count}}`; existing forms score as before.
- **A quiz can clear its answers when the participant leaves the window** (#1731). Off by default; the form warns first, switching tabs clears the scored answers and a dialog says why. It is not an attempt; the count is stored and shown on the submission. A deterrent, not a lock.
- **Open quiz answers can be graded by a person** (#1732). A manually graded text question holds the attempt as "Awaiting Grading"; grading it on the edit screen issues the certificate or records Retry/Failed and emails the result. New capability `ffc_grade_certificates`, seeded from `ffc_edit_certificates`.
+- **A quiz can also reset when its window loses the focus** (#1745). Leaving the Window is Off / Moderate / Strict; Strict catches two windows side by side, after a grace set on Settings → Certificates. Start again reloads, reshuffling options. Built on a reusable three-position switch with autosave.
### Changed
diff --git a/assets/css/ffc-common.css b/assets/css/ffc-common.css
index 6db72bf40..d51439a6d 100644
--- a/assets/css/ffc-common.css
+++ b/assets/css/ffc-common.css
@@ -2097,6 +2097,144 @@
}
}
+/* ==========================================================================
+ THREE-POSITION SWITCH (#1745) — AdminUI::render_tri_toggle().
+ Three native radios drive a knob through sibling selectors, so the
+ control posts and works without a script. The knob's position and colour
+ say the level; the level's name beside it says it in words, so colour is
+ never the only signal. Palettes:
+ .ffc-tri-toggle-severity grey → amber → red (the default)
+ .ffc-tri-toggle-traffic red → amber → green
+ ========================================================================== */
+.ffc-tri-toggle {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: var(--ffc-spacing-xs) var(--ffc-spacing-md);
+ margin: 0;
+ padding: 0;
+ border: 0;
+ min-width: 0;
+}
+
+.ffc-tri-toggle-input {
+ /* Visually hidden but reachable by keyboard + assistive tech. */
+ position: absolute;
+ opacity: 0;
+ width: 0;
+ height: 0;
+ margin: 0;
+ pointer-events: none;
+}
+
+.ffc-tri-toggle-track {
+ position: relative;
+ display: inline-flex;
+ flex: 0 0 auto;
+ width: 84px;
+ height: 30px;
+ border-radius: 15px;
+ background: var(--ffc-bg-card);
+ box-shadow: inset 0 0 0 1px var(--ffc-border);
+}
+
+/* Each third of the track is the label of one radio: clicking it chooses. */
+.ffc-tri-toggle-stop {
+ flex: 1 1 0;
+ cursor: pointer;
+}
+
+.ffc-tri-toggle-knob {
+ position: absolute;
+ top: 3px;
+ left: 3px;
+ width: 24px;
+ height: 24px;
+ border-radius: var(--ffc-radius-full);
+ background: var(--ffc-tri-knob);
+ box-shadow: var(--ffc-shadow-sm);
+ pointer-events: none;
+ transition: transform 0.15s ease, background-color 0.15s ease;
+}
+
+.ffc-tri-toggle-input:nth-of-type(2):checked ~ .ffc-tri-toggle-track .ffc-tri-toggle-knob {
+ transform: translateX(27px);
+}
+
+.ffc-tri-toggle-input:nth-of-type(3):checked ~ .ffc-tri-toggle-track .ffc-tri-toggle-knob {
+ transform: translateX(54px);
+}
+
+.ffc-tri-toggle-severity .ffc-tri-toggle-input:nth-of-type(1):checked ~ .ffc-tri-toggle-track {
+ --ffc-tri-knob: var(--ffc-gray-600);
+}
+
+.ffc-tri-toggle-severity .ffc-tri-toggle-input:nth-of-type(2):checked ~ .ffc-tri-toggle-track,
+.ffc-tri-toggle-traffic .ffc-tri-toggle-input:nth-of-type(2):checked ~ .ffc-tri-toggle-track {
+ --ffc-tri-knob: var(--ffc-warning);
+}
+
+.ffc-tri-toggle-severity .ffc-tri-toggle-input:nth-of-type(3):checked ~ .ffc-tri-toggle-track,
+.ffc-tri-toggle-traffic .ffc-tri-toggle-input:nth-of-type(1):checked ~ .ffc-tri-toggle-track {
+ --ffc-tri-knob: var(--ffc-danger);
+}
+
+.ffc-tri-toggle-traffic .ffc-tri-toggle-input:nth-of-type(3):checked ~ .ffc-tri-toggle-track {
+ --ffc-tri-knob: var(--ffc-success);
+}
+
+.ffc-tri-toggle-input:focus-visible ~ .ffc-tri-toggle-track {
+ outline: 2px solid var(--ffc-primary);
+ outline-offset: 2px;
+}
+
+.ffc-tri-toggle-input:disabled ~ .ffc-tri-toggle-track .ffc-tri-toggle-stop {
+ cursor: not-allowed;
+}
+
+.ffc-tri-toggle-value {
+ min-width: 7em;
+ font-weight: 600;
+}
+
+/* Only the chosen level's name and description show. */
+.ffc-tri-toggle-value > span,
+.ffc-tri-toggle-desc {
+ display: none;
+}
+
+.ffc-tri-toggle-desc {
+ flex: 1 0 100%;
+}
+
+.ffc-tri-toggle-input:nth-of-type(1):checked ~ .ffc-tri-toggle-value .ffc-tri-toggle-at-1,
+.ffc-tri-toggle-input:nth-of-type(2):checked ~ .ffc-tri-toggle-value .ffc-tri-toggle-at-2,
+.ffc-tri-toggle-input:nth-of-type(3):checked ~ .ffc-tri-toggle-value .ffc-tri-toggle-at-3 {
+ display: inline;
+}
+
+.ffc-tri-toggle-input:nth-of-type(1):checked ~ .ffc-tri-toggle-desc.ffc-tri-toggle-at-1,
+.ffc-tri-toggle-input:nth-of-type(2):checked ~ .ffc-tri-toggle-desc.ffc-tri-toggle-at-2,
+.ffc-tri-toggle-input:nth-of-type(3):checked ~ .ffc-tri-toggle-desc.ffc-tri-toggle-at-3 {
+ display: block;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .ffc-tri-toggle-knob {
+ transition: none;
+ }
+}
+
+@media (forced-colors: active) {
+ .ffc-tri-toggle-track {
+ border: 1px solid CanvasText;
+ }
+
+ .ffc-tri-toggle-knob {
+ background: Highlight;
+ }
+}
+
/* ==========================================================================
AUTO-SAVE BADGE — companion to FFC.Admin.autoSaveField.
Renders next to a field showing the live save state.
diff --git a/assets/css/ffc-common.min.css b/assets/css/ffc-common.min.css
index 7809a281a..9babeb667 100644
--- a/assets/css/ffc-common.min.css
+++ b/assets/css/ffc-common.min.css
@@ -1,2 +1,2 @@
-:root{--ffc-primary:#2271b1;--ffc-primary-hover:#135e96;--ffc-primary-light:#e7f3ff;--ffc-success:#00801e;--ffc-success-hover:#006618;--ffc-success-light:#e7f5ec;--ffc-warning:#ba8d14;--ffc-warning-light:#fff8e5;--ffc-danger:#d63638;--ffc-danger-hover:#b32d2e;--ffc-danger-light:#fcf0f1;--ffc-info:#006ba1;--ffc-info-light:#e5f5fa;--ffc-gray-50:#fafafa;--ffc-gray-100:#f6f7f7;--ffc-gray-200:#e7e8ea;--ffc-gray-300:#c3c4c7;--ffc-gray-400:#8c8f94;--ffc-gray-500:#646970;--ffc-gray-600:#50575e;--ffc-gray-700:#3c434a;--ffc-gray-800:#1d2327;--ffc-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;--ffc-font-size-2xs:max(11px, 0.6875rem);--ffc-font-size-xs:max(12px, 0.75rem);--ffc-font-size-sm:max(13px, 0.8125rem);--ffc-font-size-base:max(14px, 0.875rem);--ffc-font-size-lg:max(16px, 1rem);--ffc-font-size-xl:max(18px, 1.125rem);--ffc-font-size-2xl:max(24px, 1.5rem);--ffc-spacing-3xs:2px;--ffc-spacing-2xs:4px;--ffc-spacing-xs:6px;--ffc-spacing-sm:8px;--ffc-spacing-md:10px;--ffc-spacing-lg:12px;--ffc-spacing-xl:16px;--ffc-spacing-2xl:20px;--ffc-spacing-3xl:24px;--ffc-radius-xs:3px;--ffc-radius-sm:4px;--ffc-radius-md:6px;--ffc-radius-lg:8px;--ffc-radius-full:50%;--ffc-radius-pill:12px;--ffc-form-width:600px;--ffc-z-raised:1;--ffc-z-sticky:10;--ffc-z-dropdown:100;--ffc-z-overlay:1000;--ffc-z-modal:100000;--ffc-shadow-sm:0 1px 3px rgba(0, 0, 0, 0.1);--ffc-shadow-md:0 2px 8px rgba(0, 0, 0, 0.1);--ffc-shadow-lg:0 5px 30px rgba(0, 0, 0, 0.15);--ffc-transition-fast:0.15s ease;--ffc-transition-base:0.2s ease;--ffc-transition-slow:0.3s ease;--ffc-bg:#ffffff;--ffc-bg-alt:#f6f7f7;--ffc-badge-row-bg:var(--ffc-bg-alt);--ffc-badge-row-text:var(--ffc-text);--ffc-bg-card:#ffffff;--ffc-bg-input:#ffffff;--ffc-bg-overlay:rgba(0, 0, 0, 0.5);--ffc-text:#1d2327;--ffc-text-secondary:#50575e;--ffc-text-muted:#646970;--ffc-text-light:#737579;--ffc-text-on-primary:#ffffff;--ffc-text-on-danger:#ffffff;--ffc-text-on-success:#ffffff;--ffc-text-on-warning:#2e2200;--ffc-inverse-surface:#1d2327;--ffc-inverse-on-surface:#ffffff;--ffc-border:#8e8f91;--ffc-border-light:#dcdcde;--ffc-border-focus:#2271b1;--ffc-success-bg:#e7f5ec;--ffc-success-border:#00801e;--ffc-success-text:#0a5c1a;--ffc-warning-bg:#fff8e5;--ffc-warning-border:#dba617;--ffc-warning-text:#6e4e00;--ffc-danger-bg:#fcf0f1;--ffc-danger-border:#d63638;--ffc-danger-text:#8a2424;--ffc-info-bg:#e5f5fa;--ffc-info-border:#006ba1;--ffc-info-text:#004b70;--ffc-accent-bg:#f3eefb;--ffc-accent-border:#6b4fa8;--ffc-accent-text:#4b2e83;--ffc-link:#2271b1;--ffc-link-hover:#135e96;--ffc-focus-ring:rgba(34, 113, 177, 0.75)}:root.ffc-dark-mode{--ffc-primary:#5dabde;--ffc-primary-hover:#7cbde8;--ffc-primary-light:#1a2f42;--ffc-success:#4caf50;--ffc-success-hover:#6ec071;--ffc-success-light:#1a2e1a;--ffc-warning:#f0b849;--ffc-warning-light:#332b10;--ffc-danger:#e88080;--ffc-danger-hover:#ee9595;--ffc-danger-light:#2e1515;--ffc-info:#4fc3f7;--ffc-info-light:#0d2b3a;--ffc-gray-50:#1d2327;--ffc-gray-100:#23282d;--ffc-gray-200:#2c3338;--ffc-gray-300:#3c434a;--ffc-gray-400:#646970;--ffc-gray-500:#8c8f94;--ffc-gray-600:#a7aaad;--ffc-gray-700:#c3c4c7;--ffc-gray-800:#e7e8ea;--ffc-shadow-sm:0 1px 3px rgba(0, 0, 0, 0.3);--ffc-shadow-md:0 2px 8px rgba(0, 0, 0, 0.3);--ffc-shadow-lg:0 5px 30px rgba(0, 0, 0, 0.4);--ffc-bg:#1d2327;--ffc-bg-alt:#23282d;--ffc-bg-card:#2c3338;--ffc-bg-input:#23282d;--ffc-bg-overlay:rgba(0, 0, 0, 0.7);--ffc-inverse-surface:#e7e8ea;--ffc-inverse-on-surface:#1d2327;--ffc-text:#e7e8ea;--ffc-text-secondary:#c3c4c7;--ffc-text-muted:#a7aaad;--ffc-text-light:#9a9ea3;--ffc-text-on-primary:#213c4e;--ffc-text-on-danger:#452020;--ffc-text-on-success:#10361a;--ffc-border:#6f7c89;--ffc-border-light:#2c3338;--ffc-border-focus:#5dabde;--ffc-success-bg:#1a2e1a;--ffc-success-border:#4caf50;--ffc-success-text:#81c784;--ffc-warning-bg:#332b10;--ffc-warning-border:#f0b849;--ffc-warning-text:#ffe082;--ffc-danger-bg:#2e1515;--ffc-danger-border:#e88080;--ffc-danger-text:#ef9a9a;--ffc-info-bg:#0d2b3a;--ffc-info-border:#4fc3f7;--ffc-info-text:#81d4fa;--ffc-accent-bg:#2a2136;--ffc-accent-border:#b39ddb;--ffc-accent-text:#c5b3e6;--ffc-link:#5dabde;--ffc-link-hover:#7cbde8;--ffc-focus-ring:rgba(93, 171, 222, 0.6)}:root.ffc-dark-mode .ffc-cancel-page,:root.ffc-dark-mode .ffc-rereg-form-container,:root.ffc-dark-mode .ffc-shortcode,:root.ffc-dark-mode body.wp-admin{color:var(--ffc-text)}:root.ffc-dark-mode body.wp-admin{background-color:var(--ffc-bg)}:root.ffc-dark-mode:has(> body.wp-admin){color-scheme:dark}:root.ffc-dark-mode .wp-heading-inline,:root.ffc-dark-mode .wrap h1,:root.ffc-dark-mode .wrap h2,:root.ffc-dark-mode .wrap h3{color:var(--ffc-text)}:root.ffc-dark-mode .form-table td,:root.ffc-dark-mode .form-table td label,:root.ffc-dark-mode .form-table th,:root.ffc-dark-mode .form-table th label,:root.ffc-dark-mode fieldset legend{color:var(--ffc-text)}:root.ffc-dark-mode .form-table,:root.ffc-dark-mode .form-table tr{border-color:var(--ffc-border)}:root.ffc-dark-mode .description,:root.ffc-dark-mode .displaying-num,:root.ffc-dark-mode .howto,:root.ffc-dark-mode .subsubsub .count,:root.ffc-dark-mode p.description{color:var(--ffc-text-muted)}:root.ffc-dark-mode #titlediv #title,:root.ffc-dark-mode input[type=date],:root.ffc-dark-mode input[type=datetime-local],:root.ffc-dark-mode input[type=email],:root.ffc-dark-mode input[type=number],:root.ffc-dark-mode input[type=password],:root.ffc-dark-mode input[type=search],:root.ffc-dark-mode input[type=tel],:root.ffc-dark-mode input[type=text],:root.ffc-dark-mode input[type=time],:root.ffc-dark-mode input[type=url],:root.ffc-dark-mode select,:root.ffc-dark-mode textarea{color:var(--ffc-text);background-color:var(--ffc-bg-input);border-color:var(--ffc-border)}:root.ffc-dark-mode input::placeholder,:root.ffc-dark-mode textarea::placeholder{color:var(--ffc-text-light)}:root.ffc-dark-mode input:focus,:root.ffc-dark-mode select:focus,:root.ffc-dark-mode textarea:focus{border-color:var(--ffc-border-focus);box-shadow:0 0 0 1px var(--ffc-border-focus)}:root.ffc-dark-mode input[type=checkbox],:root.ffc-dark-mode input[type=radio]{color:var(--ffc-text);background-color:var(--ffc-bg-alt);border-color:var(--ffc-text-muted)}:root.ffc-dark-mode input:disabled,:root.ffc-dark-mode select:disabled,:root.ffc-dark-mode textarea:disabled{color:var(--ffc-text-muted);background-color:var(--ffc-bg-alt)}:root.ffc-dark-mode .card,:root.ffc-dark-mode .postbox{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border)}:root.ffc-dark-mode .postbox .hndle,:root.ffc-dark-mode .postbox .postbox-header,:root.ffc-dark-mode .postbox h2{color:var(--ffc-text);border-bottom-color:var(--ffc-border)}:root.ffc-dark-mode .wp-list-table,:root.ffc-dark-mode table.widefat{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border)}:root.ffc-dark-mode .wp-list-table th,:root.ffc-dark-mode .wp-list-table thead td,:root.ffc-dark-mode table.widefat th,:root.ffc-dark-mode table.widefat thead td{color:var(--ffc-text);background:var(--ffc-bg-alt);border-bottom-color:var(--ffc-border)}:root.ffc-dark-mode .wp-list-table td,:root.ffc-dark-mode table.widefat td{color:var(--ffc-text);border-top-color:var(--ffc-border)}:root.ffc-dark-mode .alternate,:root.ffc-dark-mode .striped>tbody>:nth-child(odd),:root.ffc-dark-mode .wp-list-table.striped>tbody>:nth-child(odd){background-color:var(--ffc-bg-alt)}:root.ffc-dark-mode .subsubsub,:root.ffc-dark-mode .subsubsub a,:root.ffc-dark-mode .tablenav,:root.ffc-dark-mode .tablenav .displaying-num,:root.ffc-dark-mode .tablenav-pages a{color:var(--ffc-text-secondary)}:root.ffc-dark-mode .button,:root.ffc-dark-mode .button-secondary{color:var(--ffc-text);background:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .button-secondary:hover,:root.ffc-dark-mode .button:hover{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border-focus)}:root.ffc-dark-mode .button.disabled,:root.ffc-dark-mode .button:disabled{color:var(--ffc-text-light);background:var(--ffc-bg);border-color:var(--ffc-border-light)}:root.ffc-dark-mode #major-publishing-actions{background:var(--ffc-bg-alt);border-top-color:var(--ffc-border)}:root.ffc-dark-mode .submitdelete{color:var(--ffc-danger)}:root.ffc-dark-mode .row-actions{color:var(--ffc-text-muted)}:root.ffc-dark-mode #screen-meta,:root.ffc-dark-mode #screen-meta-links .show-settings{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border)}:root.ffc-dark-mode .notice a,:root.ffc-dark-mode div.error a,:root.ffc-dark-mode div.updated a{color:var(--ffc-primary)}:where(:root.ffc-dark-mode body.wp-admin) a{color:var(--ffc-primary)}:where(:root.ffc-dark-mode body.wp-admin) a:focus,:where(:root.ffc-dark-mode body.wp-admin) a:hover{color:var(--ffc-primary-hover)}:root.ffc-dark-mode .page-title-action{color:var(--ffc-text);background:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .page-title-action:focus,:root.ffc-dark-mode .page-title-action:hover{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border-focus)}:root.ffc-dark-mode .button-primary.disabled,:root.ffc-dark-mode .button-primary:disabled,:root.ffc-dark-mode .button-primary[disabled]{color:var(--ffc-text-light)!important;background:var(--ffc-bg)!important;border-color:var(--ffc-border-light)!important}:root.ffc-dark-mode input[type=color]{color:var(--ffc-text);background-color:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .mce-panel,:root.ffc-dark-mode .mce-statusbar,:root.ffc-dark-mode .mce-toolbar-grp,:root.ffc-dark-mode .quicktags-toolbar,:root.ffc-dark-mode .wp-editor-container,:root.ffc-dark-mode .wp-switch-editor{color:var(--ffc-text);background:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .html-active .switch-html,:root.ffc-dark-mode .tmce-active .switch-tmce{background:var(--ffc-bg-card)}:root.ffc-dark-mode .mce-btn .mce-ico,:root.ffc-dark-mode .mce-btn button,:root.ffc-dark-mode .mce-path-item,:root.ffc-dark-mode .mce-wordcount{color:var(--ffc-text)}:root.ffc-dark-mode .mce-btn.mce-active,:root.ffc-dark-mode .mce-btn:hover{background:var(--ffc-bg-card);border-color:var(--ffc-border-focus)}:root.ffc-dark-mode #titlediv #title-prompt-text{color:var(--ffc-text-muted)}:root.ffc-dark-mode input[type=file]{color:var(--ffc-text)}:root.ffc-dark-mode input[type=file]::file-selector-button{margin-right:var(--ffc-spacing-sm);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);color:var(--ffc-text);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);cursor:pointer}:root.ffc-dark-mode input[type=file]::file-selector-button:hover{background:var(--ffc-bg-card);border-color:var(--ffc-border-focus)}:root.ffc-dark-mode .button-link:not(.button-link-delete){color:var(--ffc-primary)}:root.ffc-dark-mode .wp-picker-container .wp-color-result-text{color:var(--ffc-text);background:var(--ffc-bg-alt);border-left-color:var(--ffc-border)}:root.ffc-dark-mode .wp-picker-container .wp-color-result:focus .wp-color-result-text,:root.ffc-dark-mode .wp-picker-container .wp-color-result:hover .wp-color-result-text{background:var(--ffc-bg-card)}:root.ffc-dark-mode .wp-picker-container .iris-picker{background:var(--ffc-bg-card);border-color:var(--ffc-border)}:root.ffc-dark-mode .nav-tab-wrapper{border-bottom-color:var(--ffc-border)}:root.ffc-dark-mode .nav-tab{color:var(--ffc-text-secondary);background:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .nav-tab-active,:root.ffc-dark-mode .nav-tab:hover{color:var(--ffc-text);background:var(--ffc-bg-card)}:root.ffc-dark-mode .notice,:root.ffc-dark-mode div.error,:root.ffc-dark-mode div.updated{color:var(--ffc-text);background:var(--ffc-bg-card)}:root.ffc-dark-mode .notice li,:root.ffc-dark-mode .notice p,:root.ffc-dark-mode .notice strong,:root.ffc-dark-mode div.error p,:root.ffc-dark-mode div.updated p{color:var(--ffc-text)}:root.ffc-dark-mode code,:root.ffc-dark-mode kbd{color:var(--ffc-text);background:var(--ffc-bg-alt)}:root.ffc-dark-mode .wp-header-end,:root.ffc-dark-mode hr{border-color:var(--ffc-border)}.ffc-shortcode .ffc-modal,.ffc-shortcode.ffc-modal{position:fixed;top:0;left:0;right:0;bottom:0;z-index:var(--ffc-z-modal);display:flex;align-items:center;justify-content:center}.ffc-shortcode .ffc-modal[hidden]{display:none}.ffc-shortcode .ffc-modal-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--ffc-bg-overlay)}.ffc-shortcode .ffc-modal-content{position:relative;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-sm);box-shadow:var(--ffc-shadow-lg);max-width:500px;width:90%;max-height:90vh;overflow:auto}.ffc-shortcode .ffc-modal-lg{max-width:min(700px,95vw)}@media screen and (max-width:768px){.ffc-shortcode .ffc-modal-content{width:95%;max-height:95vh}}.ffc-shortcode .ffc-modal-header{display:flex;justify-content:space-between;align-items:center;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);border-bottom:1px solid var(--ffc-gray-200)}.ffc-shortcode .ffc-modal-header h3{margin:0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-modal-close{background:0 0;border:none;font-size:var(--ffc-font-size-2xl);cursor:pointer;color:var(--ffc-gray-600);padding:0;line-height:1}.ffc-shortcode .ffc-modal-close:hover{color:var(--ffc-gray-800)}.ffc-shortcode .ffc-modal-body{padding:var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-modal-footer{display:flex;justify-content:flex-end;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);border-top:1px solid var(--ffc-gray-200)}.ffc-shortcode .ffc-modal-body .ffc-form-group label{display:block;font-weight:600;margin-bottom:var(--ffc-spacing-2xs)}.ffc-shortcode .ffc-modal-body .ffc-form-group textarea{width:100%;box-sizing:border-box;padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);color:var(--ffc-text);background:var(--ffc-bg-input);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-cancel-summary{margin:1.5rem 0;padding:1rem;background:var(--ffc-bg-alt);border-radius:var(--ffc-radius-sm)}.ffc-cancel-summary dt{font-weight:600;color:var(--ffc-text-secondary)}.ffc-cancel-summary dd{margin:0 0 .75rem}.ffc-cancel-summary dd:last-child{margin-bottom:0}.ffc-hidden{position:absolute!important;left:-9999px!important;display:none!important}.ffc-initially-hidden{display:none}.ffc-honeypot-field{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.ffc-status-badge{display:inline-block;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border-radius:10px;font-size:var(--ffc-font-size-2xs);font-weight:600;text-transform:uppercase;white-space:nowrap}.ffc-status-pending{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-loading{position:relative;pointer-events:none;opacity:.6}.ffc-loading::after{content:'';position:absolute;top:50%;left:50%;width:20px;height:20px;margin:-10px 0 0 -10px;border:2px solid var(--ffc-border-light);border-top:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:ffc-spin 1s linear infinite}@keyframes ffc-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.ffc-rate-limit-notice{background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm);padding:var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-2xl);display:flex;align-items:center;gap:var(--ffc-spacing-md)}.ffc-rate-limit-icon{font-size:var(--ffc-font-size-2xl);color:var(--ffc-warning-text)}.ffc-rate-limit-icon::before{margin-right:0}.ffc-rate-limit-message{flex:1;color:var(--ffc-warning-text)}.ffc-rate-limit-message strong{color:var(--ffc-danger);font-family:monospace}.ffc-form button[type=submit]:disabled{opacity:.6;cursor:not-allowed}.ffc-empty-state{text-align:center;padding:56px var(--ffc-spacing-2xl);color:var(--ffc-text-muted)}.ffc-empty-state .ffc-empty-state__icon{margin-bottom:var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xl)}.ffc-empty-state .ffc-empty-state__title{margin:0 0 var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}.ffc-empty-state .ffc-empty-state__text{max-width:36em;margin:0 auto;font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted)}.ffc-empty-state .ffc-empty-state__actions{margin:var(--ffc-spacing-lg) 0 0}@media (prefers-reduced-motion:reduce){.ffc-loading::after{animation:none}}.ffc-icon-api::before,.ffc-icon-award::before,.ffc-icon-building::before,.ffc-icon-bulb::before,.ffc-icon-calendar::before,.ffc-icon-chart::before,.ffc-icon-checkmark::before,.ffc-icon-chevron-down::before,.ffc-icon-chevron-left::before,.ffc-icon-chevron-right::before,.ffc-icon-chevron-up::before,.ffc-icon-clipboard::before,.ffc-icon-clock::before,.ffc-icon-cloud::before,.ffc-icon-code::before,.ffc-icon-copy::before,.ffc-icon-cross::before,.ffc-icon-database::before,.ffc-icon-debug::before,.ffc-icon-delete::before,.ffc-icon-doc::before,.ffc-icon-download::before,.ffc-icon-edit::before,.ffc-icon-email::before,.ffc-icon-error::before,.ffc-icon-external::before,.ffc-icon-eye::before,.ffc-icon-file::before,.ffc-icon-filter::before,.ffc-icon-gauge::before,.ffc-icon-globe::before,.ffc-icon-grid::before,.ffc-icon-grip::before,.ffc-icon-help::before,.ffc-icon-history::before,.ffc-icon-id::before,.ffc-icon-image::before,.ffc-icon-inbox::before,.ffc-icon-info::before,.ffc-icon-key::before,.ffc-icon-layout::before,.ffc-icon-link::before,.ffc-icon-list::before,.ffc-icon-lock::before,.ffc-icon-logout::before,.ffc-icon-map-pin::before,.ffc-icon-megaphone::before,.ffc-icon-minus::before,.ffc-icon-monitor::before,.ffc-icon-network::before,.ffc-icon-package::before,.ffc-icon-palette::before,.ffc-icon-phone::before,.ffc-icon-plus::before,.ffc-icon-print::before,.ffc-icon-qr::before,.ffc-icon-restore::before,.ffc-icon-robot::before,.ffc-icon-scroll::before,.ffc-icon-search::before,.ffc-icon-send::before,.ffc-icon-server::before,.ffc-icon-settings::before,.ffc-icon-share::before,.ffc-icon-shield::before,.ffc-icon-skip::before,.ffc-icon-sliders::before,.ffc-icon-success::before,.ffc-icon-sync::before,.ffc-icon-tag::before,.ffc-icon-unlock::before,.ffc-icon-upload::before,.ffc-icon-user-check::before,.ffc-icon-user::before,.ffc-icon-users::before,.ffc-icon-warning::before,.ffc-icon-wrench::before,.ffc-icon-zap::before{content:"";display:inline-block;flex-shrink:0;width:1.15em;height:1.15em;margin-right:.4em;vertical-align:-.2em;background-color:var(--ffc-icon-tone,currentColor);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.ffc-icon-api::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 19H6a4.25 4.25 0 0 1-.6-8.46 6.75 6.75 0 0 1 13.1-1.3A3.6 3.6 0 0 1 21 11.7'/%3E%3Cpath d='M15.6 14.4L15.8 13.0L18.2 13.0L18.4 14.4L18.7 14.6L20.1 14.1L21.3 16.1L20.1 17.0L20.1 17.4L21.3 18.3L20.1 20.3L18.7 19.8L18.4 20.0L18.2 21.4L15.8 21.4L15.6 20.0L15.3 19.8L13.9 20.3L12.7 18.3L13.9 17.4L13.9 17.0L12.7 16.1L13.9 14.1L15.3 14.6z'/%3E%3Ccircle cx='17' cy='17.2' r='1.3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 19H6a4.25 4.25 0 0 1-.6-8.46 6.75 6.75 0 0 1 13.1-1.3A3.6 3.6 0 0 1 21 11.7'/%3E%3Cpath d='M15.6 14.4L15.8 13.0L18.2 13.0L18.4 14.4L18.7 14.6L20.1 14.1L21.3 16.1L20.1 17.0L20.1 17.4L21.3 18.3L20.1 20.3L18.7 19.8L18.4 20.0L18.2 21.4L15.8 21.4L15.6 20.0L15.3 19.8L13.9 20.3L12.7 18.3L13.9 17.4L13.9 17.0L12.7 16.1L13.9 14.1L15.3 14.6z'/%3E%3Ccircle cx='17' cy='17.2' r='1.3'/%3E%3C/svg%3E")}.ffc-icon-award::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='9' r='6'/%3E%3Cpath d='M8.5 13.9L7 21l5-2.5 5 2.5-1.5-7.1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='9' r='6'/%3E%3Cpath d='M8.5 13.9L7 21l5-2.5 5 2.5-1.5-7.1'/%3E%3C/svg%3E")}.ffc-icon-building::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 21V5a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v16M15 9h4a1 1 0 0 1 1 1v11M3 21h18'/%3E%3Cpath d='M8 8h3M8 12h3M8 16h3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 21V5a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v16M15 9h4a1 1 0 0 1 1 1v11M3 21h18'/%3E%3Cpath d='M8 8h3M8 12h3M8 16h3'/%3E%3C/svg%3E")}.ffc-icon-bulb::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18h6M10 21h4M12 3a6 6 0 0 0-3.5 10.9c.6.5 1 1.2 1 2V16h5v-.1c0-.8.4-1.5 1-2A6 6 0 0 0 12 3z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18h6M10 21h4M12 3a6 6 0 0 0-3.5 10.9c.6.5 1 1.2 1 2V16h5v-.1c0-.8.4-1.5 1-2A6 6 0 0 0 12 3z'/%3E%3C/svg%3E")}.ffc-icon-calendar::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M3 10h18M8 3v4M16 3v4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M3 10h18M8 3v4M16 3v4'/%3E%3C/svg%3E")}.ffc-icon-chart::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h16'/%3E%3Cpath d='M7 20v-6M12 20V8M17 20V10'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h16'/%3E%3Cpath d='M7 20v-6M12 20V8M17 20V10'/%3E%3C/svg%3E")}.ffc-icon-checkmark::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7'/%3E%3C/svg%3E")}.ffc-icon-chevron-down::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E")}.ffc-icon-chevron-left::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 6l-6 6 6 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 6l-6 6 6 6'/%3E%3C/svg%3E")}.ffc-icon-chevron-right::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6l6 6-6 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6l6 6-6 6'/%3E%3C/svg%3E")}.ffc-icon-chevron-up::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 15l6-6 6 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 15l6-6 6 6'/%3E%3C/svg%3E")}.ffc-icon-clipboard::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='4' width='14' height='17' rx='2'/%3E%3Cpath d='M9 4V3h6v1M9 10h6M9 14h6M9 18h4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='4' width='14' height='17' rx='2'/%3E%3Cpath d='M9 4V3h6v1M9 10h6M9 14h6M9 18h4'/%3E%3C/svg%3E")}.ffc-icon-clock::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E")}.ffc-icon-cloud::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 18a4.5 4.5 0 0 1-.5-9A6 6 0 0 1 18 8.5a4.75 4.75 0 0 1-.5 9.5z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 18a4.5 4.5 0 0 1-.5-9A6 6 0 0 1 18 8.5a4.75 4.75 0 0 1-.5 9.5z'/%3E%3C/svg%3E")}.ffc-icon-code::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 7l-5 5 5 5M16 7l5 5-5 5M14 4l-4 16'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 7l-5 5 5 5M16 7l5 5-5 5M14 4l-4 16'/%3E%3C/svg%3E")}.ffc-icon-copy::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='11' height='11' rx='2'/%3E%3Cpath d='M5 15V5a2 2 0 0 1 2-2h10'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='11' height='11' rx='2'/%3E%3Cpath d='M5 15V5a2 2 0 0 1 2-2h10'/%3E%3C/svg%3E")}.ffc-icon-cross::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E")}.ffc-icon-database::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6c0-1.7 3.6-3 8-3s8 1.3 8 3-3.6 3-8 3-8-1.3-8-3z'/%3E%3Cpath d='M4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6M4 12c0 1.7 3.6 3 8 3s8-1.3 8-3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6c0-1.7 3.6-3 8-3s8 1.3 8 3-3.6 3-8 3-8-1.3-8-3z'/%3E%3Cpath d='M4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6M4 12c0 1.7 3.6 3 8 3s8-1.3 8-3'/%3E%3C/svg%3E")}.ffc-icon-debug::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='7' y='8' width='10' height='12' rx='5'/%3E%3Cpath d='M12 8v12M9 5l1.5 2M15 5l-1.5 2M3 12h4M17 12h4M4 7l3 2.5M20 7l-3 2.5M4 18l3-2M20 18l-3-2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='7' y='8' width='10' height='12' rx='5'/%3E%3Cpath d='M12 8v12M9 5l1.5 2M15 5l-1.5 2M3 12h4M17 12h4M4 7l3 2.5M20 7l-3 2.5M4 18l3-2M20 18l-3-2'/%3E%3C/svg%3E")}.ffc-icon-delete::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16M10 11v6M14 11v6M9 7V4h6v3M6 7l1 13h10l1-13'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16M10 11v6M14 11v6M9 7V4h6v3M6 7l1 13h10l1-13'/%3E%3C/svg%3E")}.ffc-icon-doc::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5a2 2 0 0 1 2-2h14v16H6a2 2 0 0 0-2 2z'/%3E%3Cpath d='M4 19V5M8 7h8'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5a2 2 0 0 1 2-2h14v16H6a2 2 0 0 0-2 2z'/%3E%3Cpath d='M4 19V5M8 7h8'/%3E%3C/svg%3E")}.ffc-icon-download::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11M7 10l5 5 5-5M5 20h14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11M7 10l5 5 5-5M5 20h14'/%3E%3C/svg%3E")}.ffc-icon-edit::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h4L19 9l-4-4L4 16z'/%3E%3Cpath d='M13.5 6.5l4 4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h4L19 9l-4-4L4 16z'/%3E%3Cpath d='M13.5 6.5l4 4'/%3E%3C/svg%3E")}.ffc-icon-email::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='2'/%3E%3Cpath d='M3.5 7l8.5 6 8.5-6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='2'/%3E%3Cpath d='M3.5 7l8.5 6 8.5-6'/%3E%3C/svg%3E")}.ffc-icon-error::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E")}.ffc-icon-external::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 4h6v6M20 4l-9 9'/%3E%3Cpath d='M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 4h6v6M20 4l-9 9'/%3E%3Cpath d='M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5'/%3E%3C/svg%3E")}.ffc-icon-eye::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E")}.ffc-icon-file::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5M9 13h6M9 17h6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5M9 13h6M9 17h6'/%3E%3C/svg%3E")}.ffc-icon-filter::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 5h18l-7 8v6l-4-2v-4z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 5h18l-7 8v6l-4-2v-4z'/%3E%3C/svg%3E")}.ffc-icon-gauge::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.2 17a9 9 0 1 1 15.6 0'/%3E%3Cpath d='M12.9 12.8L16 8.5'/%3E%3Ccircle cx='12' cy='14' r='1.6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.2 17a9 9 0 1 1 15.6 0'/%3E%3Cpath d='M12.9 12.8L16 8.5'/%3E%3Ccircle cx='12' cy='14' r='1.6'/%3E%3C/svg%3E")}.ffc-icon-globe::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18'/%3E%3C/svg%3E")}.ffc-icon-grid::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='7' height='7' rx='1.5'/%3E%3Crect x='13' y='4' width='7' height='7' rx='1.5'/%3E%3Crect x='4' y='13' width='7' height='7' rx='1.5'/%3E%3Crect x='13' y='13' width='7' height='7' rx='1.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='7' height='7' rx='1.5'/%3E%3Crect x='13' y='4' width='7' height='7' rx='1.5'/%3E%3Crect x='4' y='13' width='7' height='7' rx='1.5'/%3E%3Crect x='13' y='13' width='7' height='7' rx='1.5'/%3E%3C/svg%3E")}.ffc-icon-grip::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='6' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='6' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='9' cy='12' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='12' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='9' cy='18' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='18' r='1.2' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='6' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='6' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='9' cy='12' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='12' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='9' cy='18' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='18' r='1.2' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-help::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.6.3-1 .9-1 1.6v.6'/%3E%3Ccircle cx='12' cy='17' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.6.3-1 .9-1 1.6v.6'/%3E%3Ccircle cx='12' cy='17' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-history::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12a9 9 0 1 0 3-6.7L3 8'/%3E%3Cpath d='M3 3v5h5M12 7.5V12l3 2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12a9 9 0 1 0 3-6.7L3 8'/%3E%3Cpath d='M3 3v5h5M12 7.5V12l3 2'/%3E%3C/svg%3E")}.ffc-icon-id::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='5' width='19' height='14' rx='2'/%3E%3Cpath d='M6.5 15V9M10 9h2.5a3 3 0 0 1 0 6H10z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='5' width='19' height='14' rx='2'/%3E%3Cpath d='M6.5 15V9M10 9h2.5a3 3 0 0 1 0 6H10z'/%3E%3C/svg%3E")}.ffc-icon-image::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Ccircle cx='9' cy='10' r='2'/%3E%3Cpath d='M21 16l-5-5-9 9'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Ccircle cx='9' cy='10' r='2'/%3E%3Cpath d='M21 16l-5-5-9 9'/%3E%3C/svg%3E")}.ffc-icon-inbox::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 13l2.5-8h13L21 13v6H3z'/%3E%3Cpath d='M3 13h5l1.5 2.5h5L16 13h5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 13l2.5-8h13L21 13v6H3z'/%3E%3Cpath d='M3 13h5l1.5 2.5h5L16 13h5'/%3E%3C/svg%3E")}.ffc-icon-info::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11v6'/%3E%3Ccircle cx='12' cy='7.5' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11v6'/%3E%3Ccircle cx='12' cy='7.5' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-key::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='7.5' cy='15.5' r='4'/%3E%3Cpath d='M10.5 12.5L20 3M16 7l3 3M13.5 9.5l2 2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='7.5' cy='15.5' r='4'/%3E%3Cpath d='M10.5 12.5L20 3M16 7l3 3M13.5 9.5l2 2'/%3E%3C/svg%3E")}.ffc-icon-layout::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Cpath d='M3 9h18M9 9v11'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Cpath d='M3 9h18M9 9v11'/%3E%3C/svg%3E")}.ffc-icon-link::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 14a4.5 4.5 0 0 0 6.4 0l3-3a4.5 4.5 0 0 0-6.4-6.4l-1 1'/%3E%3Cpath d='M14 10a4.5 4.5 0 0 0-6.4 0l-3 3a4.5 4.5 0 0 0 6.4 6.4l1-1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 14a4.5 4.5 0 0 0 6.4 0l3-3a4.5 4.5 0 0 0-6.4-6.4l-1 1'/%3E%3Cpath d='M14 10a4.5 4.5 0 0 0-6.4 0l-3 3a4.5 4.5 0 0 0 6.4 6.4l1-1'/%3E%3C/svg%3E")}.ffc-icon-list::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6h11M9 12h11M9 18h11'/%3E%3Ccircle cx='4.5' cy='6' r='1' fill='currentColor' stroke='none'/%3E%3Ccircle cx='4.5' cy='12' r='1' fill='currentColor' stroke='none'/%3E%3Ccircle cx='4.5' cy='18' r='1' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6h11M9 12h11M9 18h11'/%3E%3Ccircle cx='4.5' cy='6' r='1' fill='currentColor' stroke='none'/%3E%3Ccircle cx='4.5' cy='12' r='1' fill='currentColor' stroke='none'/%3E%3Ccircle cx='4.5' cy='18' r='1' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-lock::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='11' width='14' height='10' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='11' width='14' height='10' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E")}.ffc-icon-logout::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4M15 8l4 4-4 4M19 12H9'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4M15 8l4 4-4 4M19 12H9'/%3E%3C/svg%3E")}.ffc-icon-map-pin::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21s-7-6.2-7-11.5A7 7 0 0 1 19 9.5C19 14.8 12 21 12 21z'/%3E%3Ccircle cx='12' cy='9.5' r='2.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21s-7-6.2-7-11.5A7 7 0 0 1 19 9.5C19 14.8 12 21 12 21z'/%3E%3Ccircle cx='12' cy='9.5' r='2.5'/%3E%3C/svg%3E")}.ffc-icon-megaphone::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 10v4h3l7 4V6l-7 4z'/%3E%3Cpath d='M6 14l1.5 5h2.5l-1.3-4.3M17 9a4 4 0 0 1 0 6M19.5 6.5a7.5 7.5 0 0 1 0 11'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 10v4h3l7 4V6l-7 4z'/%3E%3Cpath d='M6 14l1.5 5h2.5l-1.3-4.3M17 9a4 4 0 0 1 0 6M19.5 6.5a7.5 7.5 0 0 1 0 11'/%3E%3C/svg%3E")}.ffc-icon-minus::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3C/svg%3E")}.ffc-icon-monitor::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4' width='15' height='10.5' rx='1.5'/%3E%3Cpath d='M7 18.5h6M10 14.5v4'/%3E%3Crect x='16' y='9' width='5.5' height='11' rx='1.2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4' width='15' height='10.5' rx='1.5'/%3E%3Cpath d='M7 18.5h6M10 14.5v4'/%3E%3Crect x='16' y='9' width='5.5' height='11' rx='1.2'/%3E%3C/svg%3E")}.ffc-icon-network::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='3' width='6' height='5' rx='1'/%3E%3Crect x='3' y='16' width='6' height='5' rx='1'/%3E%3Crect x='15' y='16' width='6' height='5' rx='1'/%3E%3Cpath d='M12 8v4M6 16v-2h12v2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='3' width='6' height='5' rx='1'/%3E%3Crect x='3' y='16' width='6' height='5' rx='1'/%3E%3Crect x='15' y='16' width='6' height='5' rx='1'/%3E%3Cpath d='M12 8v4M6 16v-2h12v2'/%3E%3C/svg%3E")}.ffc-icon-package::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 7.5L12 3l9 4.5v9L12 21l-9-4.5z'/%3E%3Cpath d='M3 7.5l9 4.5 9-4.5M12 12v9'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 7.5L12 3l9 4.5v9L12 21l-9-4.5z'/%3E%3Cpath d='M3 7.5l9 4.5 9-4.5M12 12v9'/%3E%3C/svg%3E")}.ffc-icon-palette::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3a9 9 0 1 0 0 18c1.1 0 1.6-.8 1.6-1.6 0-1.2-1-1.6-1-2.6 0-.9.7-1.6 1.6-1.6H17a4 4 0 0 0 4-4c0-4.6-4-8.2-9-8.2z'/%3E%3Ccircle cx='7.5' cy='11' r='1'/%3E%3Ccircle cx='10' cy='7' r='1'/%3E%3Ccircle cx='15' cy='7' r='1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3a9 9 0 1 0 0 18c1.1 0 1.6-.8 1.6-1.6 0-1.2-1-1.6-1-2.6 0-.9.7-1.6 1.6-1.6H17a4 4 0 0 0 4-4c0-4.6-4-8.2-9-8.2z'/%3E%3Ccircle cx='7.5' cy='11' r='1'/%3E%3Ccircle cx='10' cy='7' r='1'/%3E%3Ccircle cx='15' cy='7' r='1'/%3E%3C/svg%3E")}.ffc-icon-phone::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 4h3.5l1.8 4.6-2.3 1.5a11 11 0 0 0 5.9 5.9l1.5-2.3L20 15.5V19a2 2 0 0 1-2 2A15 15 0 0 1 3 6a2 2 0 0 1 2-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 4h3.5l1.8 4.6-2.3 1.5a11 11 0 0 0 5.9 5.9l1.5-2.3L20 15.5V19a2 2 0 0 1-2 2A15 15 0 0 1 3 6a2 2 0 0 1 2-2z'/%3E%3C/svg%3E")}.ffc-icon-plus::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14M5 12h14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14M5 12h14'/%3E%3C/svg%3E")}.ffc-icon-print::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 9V3h10v6'/%3E%3Crect x='3' y='9' width='18' height='8' rx='2'/%3E%3Cpath d='M7 14h10v7H7z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 9V3h10v6'/%3E%3Crect x='3' y='9' width='18' height='8' rx='2'/%3E%3Cpath d='M7 14h10v7H7z'/%3E%3C/svg%3E")}.ffc-icon-qr::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='7' height='7' rx='1'/%3E%3Crect x='14' y='3' width='7' height='7' rx='1'/%3E%3Crect x='3' y='14' width='7' height='7' rx='1'/%3E%3Cpath d='M14 14h3v3h-3zM20.5 14v.01M14 20.5h.01M17.5 20.5H21v-3.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='7' height='7' rx='1'/%3E%3Crect x='14' y='3' width='7' height='7' rx='1'/%3E%3Crect x='3' y='14' width='7' height='7' rx='1'/%3E%3Cpath d='M14 14h3v3h-3zM20.5 14v.01M14 20.5h.01M17.5 20.5H21v-3.5'/%3E%3C/svg%3E")}.ffc-icon-restore::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12a9 9 0 1 0 3-6.7L3 8'/%3E%3Cpath d='M3 3v5h5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12a9 9 0 1 0 3-6.7L3 8'/%3E%3Cpath d='M3 3v5h5'/%3E%3C/svg%3E")}.ffc-icon-robot::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='8' width='16' height='12' rx='3'/%3E%3Cpath d='M12 4.5V8M9 13v1M15 13v1M9 17h6'/%3E%3Ccircle cx='12' cy='3.5' r='1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='8' width='16' height='12' rx='3'/%3E%3Cpath d='M12 4.5V8M9 13v1M15 13v1M9 17h6'/%3E%3Ccircle cx='12' cy='3.5' r='1'/%3E%3C/svg%3E")}.ffc-icon-scroll::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5M9 13h6M9 17h6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5M9 13h6M9 17h6'/%3E%3C/svg%3E")}.ffc-icon-search::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='6.5'/%3E%3Cpath d='M20 20l-4.4-4.4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='6.5'/%3E%3Cpath d='M20 20l-4.4-4.4'/%3E%3C/svg%3E")}.ffc-icon-send::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 3L3 10.5l7 2.5 2.5 7z'/%3E%3Cpath d='M21 3L10 13'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 3L3 10.5l7 2.5 2.5 7z'/%3E%3Cpath d='M21 3L10 13'/%3E%3C/svg%3E")}.ffc-icon-server::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='7' rx='1.5'/%3E%3Crect x='3' y='13' width='18' height='7' rx='1.5'/%3E%3Cpath d='M7 7.5h.01M7 16.5h.01M11 7.5h6M11 16.5h6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='7' rx='1.5'/%3E%3Crect x='3' y='13' width='18' height='7' rx='1.5'/%3E%3Cpath d='M7 7.5h.01M7 16.5h.01M11 7.5h6M11 16.5h6'/%3E%3C/svg%3E")}.ffc-icon-settings::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='7'/%3E%3Cpath d='M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9L7 7M17 17l2.1 2.1M4.9 19.1L7 17M17 7l2.1-2.1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='7'/%3E%3Cpath d='M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9L7 7M17 17l2.1 2.1M4.9 19.1L7 17M17 7l2.1-2.1'/%3E%3C/svg%3E")}.ffc-icon-share::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='18' cy='5.5' r='2.5'/%3E%3Ccircle cx='6' cy='12' r='2.5'/%3E%3Ccircle cx='18' cy='18.5' r='2.5'/%3E%3Cpath d='M8.2 10.8l7.6-4.1M8.2 13.2l7.6 4.1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='18' cy='5.5' r='2.5'/%3E%3Ccircle cx='6' cy='12' r='2.5'/%3E%3Ccircle cx='18' cy='18.5' r='2.5'/%3E%3Cpath d='M8.2 10.8l7.6-4.1M8.2 13.2l7.6 4.1'/%3E%3C/svg%3E")}.ffc-icon-shield::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z'/%3E%3C/svg%3E")}.ffc-icon-skip::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 5l9 7-9 7zM18 5v14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 5l9 7-9 7zM18 5v14'/%3E%3C/svg%3E")}.ffc-icon-sliders::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6h9M17 6h3M4 12h3M11 12h9M4 18h11M19 18h1'/%3E%3Ccircle cx='15' cy='6' r='2'/%3E%3Ccircle cx='9' cy='12' r='2'/%3E%3Ccircle cx='17' cy='18' r='2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6h9M17 6h3M4 12h3M11 12h9M4 18h11M19 18h1'/%3E%3Ccircle cx='15' cy='6' r='2'/%3E%3Ccircle cx='9' cy='12' r='2'/%3E%3Ccircle cx='17' cy='18' r='2'/%3E%3C/svg%3E")}.ffc-icon-success::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M8 12.5l2.8 2.8L16.5 9'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M8 12.5l2.8 2.8L16.5 9'/%3E%3C/svg%3E")}.ffc-icon-sync::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 11a8 8 0 0 0-14.3-4.9L4 8M4 4v4h4M4 13a8 8 0 0 0 14.3 4.9L20 16M20 20v-4h-4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 11a8 8 0 0 0-14.3-4.9L4 8M4 4v4h4M4 13a8 8 0 0 0 14.3 4.9L20 16M20 20v-4h-4'/%3E%3C/svg%3E")}.ffc-icon-tag::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12V4a1 1 0 0 1 1-1h8l9 9-9 9z'/%3E%3Ccircle cx='7.5' cy='7.5' r='1.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12V4a1 1 0 0 1 1-1h8l9 9-9 9z'/%3E%3Ccircle cx='7.5' cy='7.5' r='1.5'/%3E%3C/svg%3E")}.ffc-icon-unlock::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='11' width='14' height='10' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 7.7-1.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='11' width='14' height='10' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 7.7-1.5'/%3E%3C/svg%3E")}.ffc-icon-upload::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 16V5M7 10l5-5 5 5M5 20h14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 16V5M7 10l5-5 5 5M5 20h14'/%3E%3C/svg%3E")}.ffc-icon-user::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='4'/%3E%3Cpath d='M4 21c1.5-4 4.5-6 8-6s6.5 2 8 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='4'/%3E%3Cpath d='M4 21c1.5-4 4.5-6 8-6s6.5 2 8 6'/%3E%3C/svg%3E")}.ffc-icon-user-check::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10' cy='8' r='4'/%3E%3Cpath d='M3 21c1.4-3.8 4-5.8 7-5.8 1.6 0 3 .5 4.2 1.5M15.5 18.5l2 2 4-4.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10' cy='8' r='4'/%3E%3Cpath d='M3 21c1.4-3.8 4-5.8 7-5.8 1.6 0 3 .5 4.2 1.5M15.5 18.5l2 2 4-4.5'/%3E%3C/svg%3E")}.ffc-icon-users::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='3.5'/%3E%3Cpath d='M2.5 20c.8-3.5 3.4-5.5 6.5-5.5s5.7 2 6.5 5.5'/%3E%3Cpath d='M16 4.6a3.5 3.5 0 0 1 0 6.8M18 14.8c2 .7 3.2 2.5 3.5 5.2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='3.5'/%3E%3Cpath d='M2.5 20c.8-3.5 3.4-5.5 6.5-5.5s5.7 2 6.5 5.5'/%3E%3Cpath d='M16 4.6a3.5 3.5 0 0 1 0 6.8M18 14.8c2 .7 3.2 2.5 3.5 5.2'/%3E%3C/svg%3E")}.ffc-icon-warning::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.5L2.5 20h19z'/%3E%3Cpath d='M12 10v4.5'/%3E%3Ccircle cx='12' cy='17.3' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.5L2.5 20h19z'/%3E%3Cpath d='M12 10v4.5'/%3E%3Ccircle cx='12' cy='17.3' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-wrench::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 6.5a4 4 0 0 0 5 5L21 10a6 6 0 0 1-7.9 5.4L6 22.5 1.5 18l7.1-7.1A6 6 0 0 1 14 3l-1.5 1.5z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 6.5a4 4 0 0 0 5 5L21 10a6 6 0 0 1-7.9 5.4L6 22.5 1.5 18l7.1-7.1A6 6 0 0 1 14 3l-1.5 1.5z'/%3E%3C/svg%3E")}.ffc-icon-zap::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13 2L4 14h7l-1 8 9-12h-7z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13 2L4 14h7l-1 8 9-12h-7z'/%3E%3C/svg%3E")}.ffc-svg-icon{color:var(--ffc-icon-tone,currentColor)}.ffc-icon-tone-primary{--ffc-icon-tone:var(--ffc-primary)}.ffc-icon-tone-info{--ffc-icon-tone:var(--ffc-info)}.ffc-icon-tone-success{--ffc-icon-tone:var(--ffc-success)}.ffc-icon-tone-warning{--ffc-icon-tone:var(--ffc-warning-text)}.ffc-icon-tone-danger{--ffc-icon-tone:var(--ffc-danger)}.ffc-icon-tone-neutral{--ffc-icon-tone:var(--ffc-text-secondary)}.ffc-icon-badge{--ffc-icon-tone:currentColor;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:2.25em;height:2.25em;border-radius:var(--ffc-radius-lg);background:var(--ffc-bg-alt);color:var(--ffc-text-secondary)}.ffc-icon-badge::before{margin-right:0}.ffc-icon-badge.ffc-icon-badge-primary{background:var(--ffc-primary-light);color:var(--ffc-primary)}.ffc-icon-badge.ffc-icon-badge-info{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-icon-badge.ffc-icon-badge-success{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-icon-badge.ffc-icon-badge-warning{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-icon-badge.ffc-icon-badge-danger{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-icon-spin::before{animation:ffc-icon-spin 1s linear infinite}@keyframes ffc-icon-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.ffc-icon-spin::before{animation:none}}@media (forced-colors:active){.ffc-icon-api::before,.ffc-icon-award::before,.ffc-icon-building::before,.ffc-icon-bulb::before,.ffc-icon-calendar::before,.ffc-icon-chart::before,.ffc-icon-checkmark::before,.ffc-icon-chevron-down::before,.ffc-icon-chevron-left::before,.ffc-icon-chevron-right::before,.ffc-icon-chevron-up::before,.ffc-icon-clipboard::before,.ffc-icon-clock::before,.ffc-icon-cloud::before,.ffc-icon-code::before,.ffc-icon-copy::before,.ffc-icon-cross::before,.ffc-icon-database::before,.ffc-icon-debug::before,.ffc-icon-delete::before,.ffc-icon-doc::before,.ffc-icon-download::before,.ffc-icon-edit::before,.ffc-icon-email::before,.ffc-icon-error::before,.ffc-icon-external::before,.ffc-icon-eye::before,.ffc-icon-file::before,.ffc-icon-filter::before,.ffc-icon-gauge::before,.ffc-icon-globe::before,.ffc-icon-grid::before,.ffc-icon-grip::before,.ffc-icon-help::before,.ffc-icon-history::before,.ffc-icon-id::before,.ffc-icon-image::before,.ffc-icon-inbox::before,.ffc-icon-info::before,.ffc-icon-key::before,.ffc-icon-layout::before,.ffc-icon-link::before,.ffc-icon-list::before,.ffc-icon-lock::before,.ffc-icon-logout::before,.ffc-icon-map-pin::before,.ffc-icon-megaphone::before,.ffc-icon-minus::before,.ffc-icon-monitor::before,.ffc-icon-network::before,.ffc-icon-package::before,.ffc-icon-palette::before,.ffc-icon-phone::before,.ffc-icon-plus::before,.ffc-icon-print::before,.ffc-icon-qr::before,.ffc-icon-restore::before,.ffc-icon-robot::before,.ffc-icon-scroll::before,.ffc-icon-search::before,.ffc-icon-send::before,.ffc-icon-server::before,.ffc-icon-settings::before,.ffc-icon-share::before,.ffc-icon-shield::before,.ffc-icon-skip::before,.ffc-icon-sliders::before,.ffc-icon-success::before,.ffc-icon-sync::before,.ffc-icon-tag::before,.ffc-icon-unlock::before,.ffc-icon-upload::before,.ffc-icon-user-check::before,.ffc-icon-user::before,.ffc-icon-users::before,.ffc-icon-warning::before,.ffc-icon-wrench::before,.ffc-icon-zap::before{forced-color-adjust:none;background-color:CanvasText}.ffc-icon-badge,.ffc-icon-badge.ffc-icon-badge-danger,.ffc-icon-badge.ffc-icon-badge-info,.ffc-icon-badge.ffc-icon-badge-primary,.ffc-icon-badge.ffc-icon-badge-success,.ffc-icon-badge.ffc-icon-badge-warning{border:1px solid CanvasText}}.ffc-visibility-restricted{padding:var(--ffc-spacing-2xl);background:var(--ffc-warning-light);border:1px solid var(--ffc-warning);border-radius:var(--ffc-radius-md);text-align:center}.ffc-visibility-restricted .ffc-calendar-title{margin:0 0 var(--ffc-spacing-md);font-size:1.2em;color:var(--ffc-text)}.ffc-visibility-restricted .ffc-restricted-message{color:var(--ffc-text-muted)}.ffc-visibility-restricted .ffc-restricted-message a{color:var(--ffc-primary);font-weight:600}.ffc-scheduling-restricted{padding:var(--ffc-spacing-2xl);text-align:center}.ffc-scheduling-restricted .ffc-restricted-message{color:var(--ffc-text-muted)}.ffc-scheduling-restricted .ffc-restricted-message a{color:var(--ffc-primary);font-weight:600}.ffc-admin-bypass-notice{padding:var(--ffc-spacing-md) var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-xl);background:var(--ffc-info-light);border:1px solid var(--ffc-info);border-radius:var(--ffc-radius-sm);font-size:.9em;color:var(--ffc-info)}.ffc-badge{display:inline-block;padding:3px var(--ffc-spacing-sm);border-radius:var(--ffc-radius-xs);font-size:var(--ffc-font-size-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.3px}.ffc-pill{display:inline-block;padding:3px var(--ffc-spacing-md);border-radius:var(--ffc-radius-pill);font-size:var(--ffc-font-size-xs);font-weight:500;cursor:default}.ffc-pill-has-tip{cursor:help}.ffc-pill-row-color{background:var(--ffc-badge-row-bg);color:var(--ffc-badge-row-text)}.ffc-btn{display:inline-block;padding:var(--ffc-spacing-md) var(--ffc-spacing-2xl);border:none;border-radius:var(--ffc-radius-sm);font-family:var(--ffc-font-family);font-size:var(--ffc-font-size-base);font-weight:500;cursor:pointer;text-decoration:none;text-align:center;transition:all .2s ease}.ffc-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-btn:disabled{opacity:.6;cursor:not-allowed}.ffc-btn-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-btn-primary:hover{background:var(--ffc-primary-hover)}.ffc-btn-primary:disabled{background:var(--ffc-gray-300)}.ffc-btn-secondary{background:var(--ffc-gray-200);color:var(--ffc-gray-800)}.ffc-btn-secondary:hover{background:var(--ffc-gray-300)}.ffc-btn-success{background:var(--ffc-success);color:var(--ffc-text-on-success)}.ffc-btn-success:hover{background:var(--ffc-success-hover)}.ffc-btn-danger{background:var(--ffc-danger);color:var(--ffc-text-on-danger)}.ffc-btn-danger:hover{background:var(--ffc-danger-hover)}@media (prefers-reduced-motion:reduce){.ffc-btn{transition:none}}.ffc-badge-private{background:var(--ffc-danger-light);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger)}.ffc-flex{display:flex}.ffc-mb-md{margin-bottom:var(--ffc-spacing-lg)}.ffc-color-dot{display:inline-block;width:12px;height:12px;border-radius:var(--ffc-radius-full);vertical-align:middle;background-color:var(--ffc-color,currentColor)}.ffc-toggle,.form-table td .ffc-toggle,.form-table td fieldset .ffc-toggle{display:inline-flex;align-items:center;gap:var(--ffc-spacing-md);cursor:pointer;user-select:none;line-height:1.3;position:relative}.ffc-toggle input[type=checkbox]{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.ffc-toggle-track{position:relative;flex:0 0 auto;width:38px;height:22px;background:var(--ffc-border);border-radius:11px;transition:background-color .15s ease}.ffc-toggle-track::after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:var(--ffc-radius-full);background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform .15s ease}.ffc-toggle input[type=checkbox]:checked+.ffc-toggle-track{background:var(--ffc-primary)}.ffc-toggle input[type=checkbox]:checked+.ffc-toggle-track::after{transform:translateX(16px)}.ffc-toggle input[type=checkbox]:focus-visible+.ffc-toggle-track{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-toggle input[type=checkbox]:disabled+.ffc-toggle-track{opacity:.5;cursor:not-allowed}.ffc-toggle-label{color:inherit}@media (prefers-reduced-motion:reduce){.ffc-toggle-track,.ffc-toggle-track::after{transition:none}}.ffc-autosave-badge{display:inline-block;margin-left:var(--ffc-spacing-sm);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border-radius:10px;font-size:var(--ffc-font-size-xs);font-weight:500;line-height:1.5;vertical-align:middle}.ffc-autosave-badge--saving{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-autosave-badge--saved{background:var(--ffc-success-light);color:var(--ffc-success)}.ffc-autosave-badge--error{background:var(--ffc-danger-light);color:var(--ffc-danger-text)}.ffc-features-cell{display:flex;flex-direction:column;align-items:flex-start;gap:var(--ffc-spacing-2xs)}.ffc-features-cell .ffc-toggle{margin:0}.ffc-features-badge{display:inline-block;margin-top:var(--ffc-spacing-2xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border-radius:10px;font-size:var(--ffc-font-size-2xs);font-weight:500;line-height:1.4}.ffc-features-badge--saving{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-features-badge--saved{background:var(--ffc-success-light);color:var(--ffc-success)}.ffc-features-badge--error{background:var(--ffc-danger-light);color:var(--ffc-danger-text)}#ffc-activity-log-table.ffc-loading{position:relative;opacity:.55;pointer-events:none;transition:opacity .15s ease}.ffc-captcha-mode{margin:0 0 var(--ffc-spacing-xl);max-width:46em}.ffc-captcha-mode-note,.ffc-captcha-mode-summary{display:block;margin-left:var(--ffc-spacing-3xl)}.ffc-captcha-mode-note{margin-top:var(--ffc-spacing-2xs);padding-left:var(--ffc-spacing-md);border-left:3px solid transparent}.ffc-captcha-mode-note--warning{border-left-color:var(--ffc-warning-border)}.ffc-captcha-mode-note--info{border-left-color:var(--ffc-info-border)}.ffc-email-disabled-notice{margin:0 0 var(--ffc-spacing-xl);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border-left:4px solid var(--ffc-warning-border);background:var(--ffc-warning-bg);color:var(--ffc-warning-text);border-radius:2px}.ffc-email-disabled-notice p{margin:0}@media (forced-colors:active){.ffc-btn-danger,.ffc-btn-primary,.ffc-btn-secondary,.ffc-btn-success,:root.ffc-dark-mode .button,:root.ffc-dark-mode .button-primary.disabled,:root.ffc-dark-mode .button-primary[disabled],:root.ffc-dark-mode .button-secondary,:root.ffc-dark-mode .button.disabled,:root.ffc-dark-mode .mce-btn.mce-active{border:1px solid ButtonText}.ffc-autosave-badge--error,.ffc-autosave-badge--saved,.ffc-autosave-badge--saving,.ffc-features-badge--error,.ffc-features-badge--saved,.ffc-features-badge--saving,.ffc-pill-row-color,.ffc-status-pending{border:1px solid CanvasText}}.ffc-admin-page .ffc-required{color:var(--ffc-danger)}
+:root{--ffc-primary:#2271b1;--ffc-primary-hover:#135e96;--ffc-primary-light:#e7f3ff;--ffc-success:#00801e;--ffc-success-hover:#006618;--ffc-success-light:#e7f5ec;--ffc-warning:#ba8d14;--ffc-warning-light:#fff8e5;--ffc-danger:#d63638;--ffc-danger-hover:#b32d2e;--ffc-danger-light:#fcf0f1;--ffc-info:#006ba1;--ffc-info-light:#e5f5fa;--ffc-gray-50:#fafafa;--ffc-gray-100:#f6f7f7;--ffc-gray-200:#e7e8ea;--ffc-gray-300:#c3c4c7;--ffc-gray-400:#8c8f94;--ffc-gray-500:#646970;--ffc-gray-600:#50575e;--ffc-gray-700:#3c434a;--ffc-gray-800:#1d2327;--ffc-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;--ffc-font-size-2xs:max(11px, 0.6875rem);--ffc-font-size-xs:max(12px, 0.75rem);--ffc-font-size-sm:max(13px, 0.8125rem);--ffc-font-size-base:max(14px, 0.875rem);--ffc-font-size-lg:max(16px, 1rem);--ffc-font-size-xl:max(18px, 1.125rem);--ffc-font-size-2xl:max(24px, 1.5rem);--ffc-spacing-3xs:2px;--ffc-spacing-2xs:4px;--ffc-spacing-xs:6px;--ffc-spacing-sm:8px;--ffc-spacing-md:10px;--ffc-spacing-lg:12px;--ffc-spacing-xl:16px;--ffc-spacing-2xl:20px;--ffc-spacing-3xl:24px;--ffc-radius-xs:3px;--ffc-radius-sm:4px;--ffc-radius-md:6px;--ffc-radius-lg:8px;--ffc-radius-full:50%;--ffc-radius-pill:12px;--ffc-form-width:600px;--ffc-z-raised:1;--ffc-z-sticky:10;--ffc-z-dropdown:100;--ffc-z-overlay:1000;--ffc-z-modal:100000;--ffc-shadow-sm:0 1px 3px rgba(0, 0, 0, 0.1);--ffc-shadow-md:0 2px 8px rgba(0, 0, 0, 0.1);--ffc-shadow-lg:0 5px 30px rgba(0, 0, 0, 0.15);--ffc-transition-fast:0.15s ease;--ffc-transition-base:0.2s ease;--ffc-transition-slow:0.3s ease;--ffc-bg:#ffffff;--ffc-bg-alt:#f6f7f7;--ffc-badge-row-bg:var(--ffc-bg-alt);--ffc-badge-row-text:var(--ffc-text);--ffc-bg-card:#ffffff;--ffc-bg-input:#ffffff;--ffc-bg-overlay:rgba(0, 0, 0, 0.5);--ffc-text:#1d2327;--ffc-text-secondary:#50575e;--ffc-text-muted:#646970;--ffc-text-light:#737579;--ffc-text-on-primary:#ffffff;--ffc-text-on-danger:#ffffff;--ffc-text-on-success:#ffffff;--ffc-text-on-warning:#2e2200;--ffc-inverse-surface:#1d2327;--ffc-inverse-on-surface:#ffffff;--ffc-border:#8e8f91;--ffc-border-light:#dcdcde;--ffc-border-focus:#2271b1;--ffc-success-bg:#e7f5ec;--ffc-success-border:#00801e;--ffc-success-text:#0a5c1a;--ffc-warning-bg:#fff8e5;--ffc-warning-border:#dba617;--ffc-warning-text:#6e4e00;--ffc-danger-bg:#fcf0f1;--ffc-danger-border:#d63638;--ffc-danger-text:#8a2424;--ffc-info-bg:#e5f5fa;--ffc-info-border:#006ba1;--ffc-info-text:#004b70;--ffc-accent-bg:#f3eefb;--ffc-accent-border:#6b4fa8;--ffc-accent-text:#4b2e83;--ffc-link:#2271b1;--ffc-link-hover:#135e96;--ffc-focus-ring:rgba(34, 113, 177, 0.75)}:root.ffc-dark-mode{--ffc-primary:#5dabde;--ffc-primary-hover:#7cbde8;--ffc-primary-light:#1a2f42;--ffc-success:#4caf50;--ffc-success-hover:#6ec071;--ffc-success-light:#1a2e1a;--ffc-warning:#f0b849;--ffc-warning-light:#332b10;--ffc-danger:#e88080;--ffc-danger-hover:#ee9595;--ffc-danger-light:#2e1515;--ffc-info:#4fc3f7;--ffc-info-light:#0d2b3a;--ffc-gray-50:#1d2327;--ffc-gray-100:#23282d;--ffc-gray-200:#2c3338;--ffc-gray-300:#3c434a;--ffc-gray-400:#646970;--ffc-gray-500:#8c8f94;--ffc-gray-600:#a7aaad;--ffc-gray-700:#c3c4c7;--ffc-gray-800:#e7e8ea;--ffc-shadow-sm:0 1px 3px rgba(0, 0, 0, 0.3);--ffc-shadow-md:0 2px 8px rgba(0, 0, 0, 0.3);--ffc-shadow-lg:0 5px 30px rgba(0, 0, 0, 0.4);--ffc-bg:#1d2327;--ffc-bg-alt:#23282d;--ffc-bg-card:#2c3338;--ffc-bg-input:#23282d;--ffc-bg-overlay:rgba(0, 0, 0, 0.7);--ffc-inverse-surface:#e7e8ea;--ffc-inverse-on-surface:#1d2327;--ffc-text:#e7e8ea;--ffc-text-secondary:#c3c4c7;--ffc-text-muted:#a7aaad;--ffc-text-light:#9a9ea3;--ffc-text-on-primary:#213c4e;--ffc-text-on-danger:#452020;--ffc-text-on-success:#10361a;--ffc-border:#6f7c89;--ffc-border-light:#2c3338;--ffc-border-focus:#5dabde;--ffc-success-bg:#1a2e1a;--ffc-success-border:#4caf50;--ffc-success-text:#81c784;--ffc-warning-bg:#332b10;--ffc-warning-border:#f0b849;--ffc-warning-text:#ffe082;--ffc-danger-bg:#2e1515;--ffc-danger-border:#e88080;--ffc-danger-text:#ef9a9a;--ffc-info-bg:#0d2b3a;--ffc-info-border:#4fc3f7;--ffc-info-text:#81d4fa;--ffc-accent-bg:#2a2136;--ffc-accent-border:#b39ddb;--ffc-accent-text:#c5b3e6;--ffc-link:#5dabde;--ffc-link-hover:#7cbde8;--ffc-focus-ring:rgba(93, 171, 222, 0.6)}:root.ffc-dark-mode .ffc-cancel-page,:root.ffc-dark-mode .ffc-rereg-form-container,:root.ffc-dark-mode .ffc-shortcode,:root.ffc-dark-mode body.wp-admin{color:var(--ffc-text)}:root.ffc-dark-mode body.wp-admin{background-color:var(--ffc-bg)}:root.ffc-dark-mode:has(> body.wp-admin){color-scheme:dark}:root.ffc-dark-mode .wp-heading-inline,:root.ffc-dark-mode .wrap h1,:root.ffc-dark-mode .wrap h2,:root.ffc-dark-mode .wrap h3{color:var(--ffc-text)}:root.ffc-dark-mode .form-table td,:root.ffc-dark-mode .form-table td label,:root.ffc-dark-mode .form-table th,:root.ffc-dark-mode .form-table th label,:root.ffc-dark-mode fieldset legend{color:var(--ffc-text)}:root.ffc-dark-mode .form-table,:root.ffc-dark-mode .form-table tr{border-color:var(--ffc-border)}:root.ffc-dark-mode .description,:root.ffc-dark-mode .displaying-num,:root.ffc-dark-mode .howto,:root.ffc-dark-mode .subsubsub .count,:root.ffc-dark-mode p.description{color:var(--ffc-text-muted)}:root.ffc-dark-mode #titlediv #title,:root.ffc-dark-mode input[type=date],:root.ffc-dark-mode input[type=datetime-local],:root.ffc-dark-mode input[type=email],:root.ffc-dark-mode input[type=number],:root.ffc-dark-mode input[type=password],:root.ffc-dark-mode input[type=search],:root.ffc-dark-mode input[type=tel],:root.ffc-dark-mode input[type=text],:root.ffc-dark-mode input[type=time],:root.ffc-dark-mode input[type=url],:root.ffc-dark-mode select,:root.ffc-dark-mode textarea{color:var(--ffc-text);background-color:var(--ffc-bg-input);border-color:var(--ffc-border)}:root.ffc-dark-mode input::placeholder,:root.ffc-dark-mode textarea::placeholder{color:var(--ffc-text-light)}:root.ffc-dark-mode input:focus,:root.ffc-dark-mode select:focus,:root.ffc-dark-mode textarea:focus{border-color:var(--ffc-border-focus);box-shadow:0 0 0 1px var(--ffc-border-focus)}:root.ffc-dark-mode input[type=checkbox],:root.ffc-dark-mode input[type=radio]{color:var(--ffc-text);background-color:var(--ffc-bg-alt);border-color:var(--ffc-text-muted)}:root.ffc-dark-mode input:disabled,:root.ffc-dark-mode select:disabled,:root.ffc-dark-mode textarea:disabled{color:var(--ffc-text-muted);background-color:var(--ffc-bg-alt)}:root.ffc-dark-mode .card,:root.ffc-dark-mode .postbox{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border)}:root.ffc-dark-mode .postbox .hndle,:root.ffc-dark-mode .postbox .postbox-header,:root.ffc-dark-mode .postbox h2{color:var(--ffc-text);border-bottom-color:var(--ffc-border)}:root.ffc-dark-mode .wp-list-table,:root.ffc-dark-mode table.widefat{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border)}:root.ffc-dark-mode .wp-list-table th,:root.ffc-dark-mode .wp-list-table thead td,:root.ffc-dark-mode table.widefat th,:root.ffc-dark-mode table.widefat thead td{color:var(--ffc-text);background:var(--ffc-bg-alt);border-bottom-color:var(--ffc-border)}:root.ffc-dark-mode .wp-list-table td,:root.ffc-dark-mode table.widefat td{color:var(--ffc-text);border-top-color:var(--ffc-border)}:root.ffc-dark-mode .alternate,:root.ffc-dark-mode .striped>tbody>:nth-child(odd),:root.ffc-dark-mode .wp-list-table.striped>tbody>:nth-child(odd){background-color:var(--ffc-bg-alt)}:root.ffc-dark-mode .subsubsub,:root.ffc-dark-mode .subsubsub a,:root.ffc-dark-mode .tablenav,:root.ffc-dark-mode .tablenav .displaying-num,:root.ffc-dark-mode .tablenav-pages a{color:var(--ffc-text-secondary)}:root.ffc-dark-mode .button,:root.ffc-dark-mode .button-secondary{color:var(--ffc-text);background:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .button-secondary:hover,:root.ffc-dark-mode .button:hover{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border-focus)}:root.ffc-dark-mode .button.disabled,:root.ffc-dark-mode .button:disabled{color:var(--ffc-text-light);background:var(--ffc-bg);border-color:var(--ffc-border-light)}:root.ffc-dark-mode #major-publishing-actions{background:var(--ffc-bg-alt);border-top-color:var(--ffc-border)}:root.ffc-dark-mode .submitdelete{color:var(--ffc-danger)}:root.ffc-dark-mode .row-actions{color:var(--ffc-text-muted)}:root.ffc-dark-mode #screen-meta,:root.ffc-dark-mode #screen-meta-links .show-settings{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border)}:root.ffc-dark-mode .notice a,:root.ffc-dark-mode div.error a,:root.ffc-dark-mode div.updated a{color:var(--ffc-primary)}:where(:root.ffc-dark-mode body.wp-admin) a{color:var(--ffc-primary)}:where(:root.ffc-dark-mode body.wp-admin) a:focus,:where(:root.ffc-dark-mode body.wp-admin) a:hover{color:var(--ffc-primary-hover)}:root.ffc-dark-mode .page-title-action{color:var(--ffc-text);background:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .page-title-action:focus,:root.ffc-dark-mode .page-title-action:hover{color:var(--ffc-text);background:var(--ffc-bg-card);border-color:var(--ffc-border-focus)}:root.ffc-dark-mode .button-primary.disabled,:root.ffc-dark-mode .button-primary:disabled,:root.ffc-dark-mode .button-primary[disabled]{color:var(--ffc-text-light)!important;background:var(--ffc-bg)!important;border-color:var(--ffc-border-light)!important}:root.ffc-dark-mode input[type=color]{color:var(--ffc-text);background-color:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .mce-panel,:root.ffc-dark-mode .mce-statusbar,:root.ffc-dark-mode .mce-toolbar-grp,:root.ffc-dark-mode .quicktags-toolbar,:root.ffc-dark-mode .wp-editor-container,:root.ffc-dark-mode .wp-switch-editor{color:var(--ffc-text);background:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .html-active .switch-html,:root.ffc-dark-mode .tmce-active .switch-tmce{background:var(--ffc-bg-card)}:root.ffc-dark-mode .mce-btn .mce-ico,:root.ffc-dark-mode .mce-btn button,:root.ffc-dark-mode .mce-path-item,:root.ffc-dark-mode .mce-wordcount{color:var(--ffc-text)}:root.ffc-dark-mode .mce-btn.mce-active,:root.ffc-dark-mode .mce-btn:hover{background:var(--ffc-bg-card);border-color:var(--ffc-border-focus)}:root.ffc-dark-mode #titlediv #title-prompt-text{color:var(--ffc-text-muted)}:root.ffc-dark-mode input[type=file]{color:var(--ffc-text)}:root.ffc-dark-mode input[type=file]::file-selector-button{margin-right:var(--ffc-spacing-sm);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);color:var(--ffc-text);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);cursor:pointer}:root.ffc-dark-mode input[type=file]::file-selector-button:hover{background:var(--ffc-bg-card);border-color:var(--ffc-border-focus)}:root.ffc-dark-mode .button-link:not(.button-link-delete){color:var(--ffc-primary)}:root.ffc-dark-mode .wp-picker-container .wp-color-result-text{color:var(--ffc-text);background:var(--ffc-bg-alt);border-left-color:var(--ffc-border)}:root.ffc-dark-mode .wp-picker-container .wp-color-result:focus .wp-color-result-text,:root.ffc-dark-mode .wp-picker-container .wp-color-result:hover .wp-color-result-text{background:var(--ffc-bg-card)}:root.ffc-dark-mode .wp-picker-container .iris-picker{background:var(--ffc-bg-card);border-color:var(--ffc-border)}:root.ffc-dark-mode .nav-tab-wrapper{border-bottom-color:var(--ffc-border)}:root.ffc-dark-mode .nav-tab{color:var(--ffc-text-secondary);background:var(--ffc-bg-alt);border-color:var(--ffc-border)}:root.ffc-dark-mode .nav-tab-active,:root.ffc-dark-mode .nav-tab:hover{color:var(--ffc-text);background:var(--ffc-bg-card)}:root.ffc-dark-mode .notice,:root.ffc-dark-mode div.error,:root.ffc-dark-mode div.updated{color:var(--ffc-text);background:var(--ffc-bg-card)}:root.ffc-dark-mode .notice li,:root.ffc-dark-mode .notice p,:root.ffc-dark-mode .notice strong,:root.ffc-dark-mode div.error p,:root.ffc-dark-mode div.updated p{color:var(--ffc-text)}:root.ffc-dark-mode code,:root.ffc-dark-mode kbd{color:var(--ffc-text);background:var(--ffc-bg-alt)}:root.ffc-dark-mode .wp-header-end,:root.ffc-dark-mode hr{border-color:var(--ffc-border)}.ffc-shortcode .ffc-modal,.ffc-shortcode.ffc-modal{position:fixed;top:0;left:0;right:0;bottom:0;z-index:var(--ffc-z-modal);display:flex;align-items:center;justify-content:center}.ffc-shortcode .ffc-modal[hidden]{display:none}.ffc-shortcode .ffc-modal-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--ffc-bg-overlay)}.ffc-shortcode .ffc-modal-content{position:relative;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-sm);box-shadow:var(--ffc-shadow-lg);max-width:500px;width:90%;max-height:90vh;overflow:auto}.ffc-shortcode .ffc-modal-lg{max-width:min(700px,95vw)}@media screen and (max-width:768px){.ffc-shortcode .ffc-modal-content{width:95%;max-height:95vh}}.ffc-shortcode .ffc-modal-header{display:flex;justify-content:space-between;align-items:center;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);border-bottom:1px solid var(--ffc-gray-200)}.ffc-shortcode .ffc-modal-header h3{margin:0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-modal-close{background:0 0;border:none;font-size:var(--ffc-font-size-2xl);cursor:pointer;color:var(--ffc-gray-600);padding:0;line-height:1}.ffc-shortcode .ffc-modal-close:hover{color:var(--ffc-gray-800)}.ffc-shortcode .ffc-modal-body{padding:var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-modal-footer{display:flex;justify-content:flex-end;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);border-top:1px solid var(--ffc-gray-200)}.ffc-shortcode .ffc-modal-body .ffc-form-group label{display:block;font-weight:600;margin-bottom:var(--ffc-spacing-2xs)}.ffc-shortcode .ffc-modal-body .ffc-form-group textarea{width:100%;box-sizing:border-box;padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);color:var(--ffc-text);background:var(--ffc-bg-input);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-cancel-summary{margin:1.5rem 0;padding:1rem;background:var(--ffc-bg-alt);border-radius:var(--ffc-radius-sm)}.ffc-cancel-summary dt{font-weight:600;color:var(--ffc-text-secondary)}.ffc-cancel-summary dd{margin:0 0 .75rem}.ffc-cancel-summary dd:last-child{margin-bottom:0}.ffc-hidden{position:absolute!important;left:-9999px!important;display:none!important}.ffc-initially-hidden{display:none}.ffc-honeypot-field{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.ffc-status-badge{display:inline-block;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border-radius:10px;font-size:var(--ffc-font-size-2xs);font-weight:600;text-transform:uppercase;white-space:nowrap}.ffc-status-pending{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-loading{position:relative;pointer-events:none;opacity:.6}.ffc-loading::after{content:'';position:absolute;top:50%;left:50%;width:20px;height:20px;margin:-10px 0 0 -10px;border:2px solid var(--ffc-border-light);border-top:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:ffc-spin 1s linear infinite}@keyframes ffc-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.ffc-rate-limit-notice{background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm);padding:var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-2xl);display:flex;align-items:center;gap:var(--ffc-spacing-md)}.ffc-rate-limit-icon{font-size:var(--ffc-font-size-2xl);color:var(--ffc-warning-text)}.ffc-rate-limit-icon::before{margin-right:0}.ffc-rate-limit-message{flex:1;color:var(--ffc-warning-text)}.ffc-rate-limit-message strong{color:var(--ffc-danger);font-family:monospace}.ffc-form button[type=submit]:disabled{opacity:.6;cursor:not-allowed}.ffc-empty-state{text-align:center;padding:56px var(--ffc-spacing-2xl);color:var(--ffc-text-muted)}.ffc-empty-state .ffc-empty-state__icon{margin-bottom:var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xl)}.ffc-empty-state .ffc-empty-state__title{margin:0 0 var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}.ffc-empty-state .ffc-empty-state__text{max-width:36em;margin:0 auto;font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted)}.ffc-empty-state .ffc-empty-state__actions{margin:var(--ffc-spacing-lg) 0 0}@media (prefers-reduced-motion:reduce){.ffc-loading::after{animation:none}}.ffc-icon-api::before,.ffc-icon-award::before,.ffc-icon-building::before,.ffc-icon-bulb::before,.ffc-icon-calendar::before,.ffc-icon-chart::before,.ffc-icon-checkmark::before,.ffc-icon-chevron-down::before,.ffc-icon-chevron-left::before,.ffc-icon-chevron-right::before,.ffc-icon-chevron-up::before,.ffc-icon-clipboard::before,.ffc-icon-clock::before,.ffc-icon-cloud::before,.ffc-icon-code::before,.ffc-icon-copy::before,.ffc-icon-cross::before,.ffc-icon-database::before,.ffc-icon-debug::before,.ffc-icon-delete::before,.ffc-icon-doc::before,.ffc-icon-download::before,.ffc-icon-edit::before,.ffc-icon-email::before,.ffc-icon-error::before,.ffc-icon-external::before,.ffc-icon-eye::before,.ffc-icon-file::before,.ffc-icon-filter::before,.ffc-icon-gauge::before,.ffc-icon-globe::before,.ffc-icon-grid::before,.ffc-icon-grip::before,.ffc-icon-help::before,.ffc-icon-history::before,.ffc-icon-id::before,.ffc-icon-image::before,.ffc-icon-inbox::before,.ffc-icon-info::before,.ffc-icon-key::before,.ffc-icon-layout::before,.ffc-icon-link::before,.ffc-icon-list::before,.ffc-icon-lock::before,.ffc-icon-logout::before,.ffc-icon-map-pin::before,.ffc-icon-megaphone::before,.ffc-icon-minus::before,.ffc-icon-monitor::before,.ffc-icon-network::before,.ffc-icon-package::before,.ffc-icon-palette::before,.ffc-icon-phone::before,.ffc-icon-plus::before,.ffc-icon-print::before,.ffc-icon-qr::before,.ffc-icon-restore::before,.ffc-icon-robot::before,.ffc-icon-scroll::before,.ffc-icon-search::before,.ffc-icon-send::before,.ffc-icon-server::before,.ffc-icon-settings::before,.ffc-icon-share::before,.ffc-icon-shield::before,.ffc-icon-skip::before,.ffc-icon-sliders::before,.ffc-icon-success::before,.ffc-icon-sync::before,.ffc-icon-tag::before,.ffc-icon-unlock::before,.ffc-icon-upload::before,.ffc-icon-user-check::before,.ffc-icon-user::before,.ffc-icon-users::before,.ffc-icon-warning::before,.ffc-icon-wrench::before,.ffc-icon-zap::before{content:"";display:inline-block;flex-shrink:0;width:1.15em;height:1.15em;margin-right:.4em;vertical-align:-.2em;background-color:var(--ffc-icon-tone,currentColor);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.ffc-icon-api::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 19H6a4.25 4.25 0 0 1-.6-8.46 6.75 6.75 0 0 1 13.1-1.3A3.6 3.6 0 0 1 21 11.7'/%3E%3Cpath d='M15.6 14.4L15.8 13.0L18.2 13.0L18.4 14.4L18.7 14.6L20.1 14.1L21.3 16.1L20.1 17.0L20.1 17.4L21.3 18.3L20.1 20.3L18.7 19.8L18.4 20.0L18.2 21.4L15.8 21.4L15.6 20.0L15.3 19.8L13.9 20.3L12.7 18.3L13.9 17.4L13.9 17.0L12.7 16.1L13.9 14.1L15.3 14.6z'/%3E%3Ccircle cx='17' cy='17.2' r='1.3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 19H6a4.25 4.25 0 0 1-.6-8.46 6.75 6.75 0 0 1 13.1-1.3A3.6 3.6 0 0 1 21 11.7'/%3E%3Cpath d='M15.6 14.4L15.8 13.0L18.2 13.0L18.4 14.4L18.7 14.6L20.1 14.1L21.3 16.1L20.1 17.0L20.1 17.4L21.3 18.3L20.1 20.3L18.7 19.8L18.4 20.0L18.2 21.4L15.8 21.4L15.6 20.0L15.3 19.8L13.9 20.3L12.7 18.3L13.9 17.4L13.9 17.0L12.7 16.1L13.9 14.1L15.3 14.6z'/%3E%3Ccircle cx='17' cy='17.2' r='1.3'/%3E%3C/svg%3E")}.ffc-icon-award::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='9' r='6'/%3E%3Cpath d='M8.5 13.9L7 21l5-2.5 5 2.5-1.5-7.1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='9' r='6'/%3E%3Cpath d='M8.5 13.9L7 21l5-2.5 5 2.5-1.5-7.1'/%3E%3C/svg%3E")}.ffc-icon-building::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 21V5a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v16M15 9h4a1 1 0 0 1 1 1v11M3 21h18'/%3E%3Cpath d='M8 8h3M8 12h3M8 16h3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 21V5a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v16M15 9h4a1 1 0 0 1 1 1v11M3 21h18'/%3E%3Cpath d='M8 8h3M8 12h3M8 16h3'/%3E%3C/svg%3E")}.ffc-icon-bulb::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18h6M10 21h4M12 3a6 6 0 0 0-3.5 10.9c.6.5 1 1.2 1 2V16h5v-.1c0-.8.4-1.5 1-2A6 6 0 0 0 12 3z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18h6M10 21h4M12 3a6 6 0 0 0-3.5 10.9c.6.5 1 1.2 1 2V16h5v-.1c0-.8.4-1.5 1-2A6 6 0 0 0 12 3z'/%3E%3C/svg%3E")}.ffc-icon-calendar::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M3 10h18M8 3v4M16 3v4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M3 10h18M8 3v4M16 3v4'/%3E%3C/svg%3E")}.ffc-icon-chart::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h16'/%3E%3Cpath d='M7 20v-6M12 20V8M17 20V10'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h16'/%3E%3Cpath d='M7 20v-6M12 20V8M17 20V10'/%3E%3C/svg%3E")}.ffc-icon-checkmark::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7'/%3E%3C/svg%3E")}.ffc-icon-chevron-down::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E")}.ffc-icon-chevron-left::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 6l-6 6 6 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 6l-6 6 6 6'/%3E%3C/svg%3E")}.ffc-icon-chevron-right::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6l6 6-6 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6l6 6-6 6'/%3E%3C/svg%3E")}.ffc-icon-chevron-up::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 15l6-6 6 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 15l6-6 6 6'/%3E%3C/svg%3E")}.ffc-icon-clipboard::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='4' width='14' height='17' rx='2'/%3E%3Cpath d='M9 4V3h6v1M9 10h6M9 14h6M9 18h4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='4' width='14' height='17' rx='2'/%3E%3Cpath d='M9 4V3h6v1M9 10h6M9 14h6M9 18h4'/%3E%3C/svg%3E")}.ffc-icon-clock::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E")}.ffc-icon-cloud::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 18a4.5 4.5 0 0 1-.5-9A6 6 0 0 1 18 8.5a4.75 4.75 0 0 1-.5 9.5z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 18a4.5 4.5 0 0 1-.5-9A6 6 0 0 1 18 8.5a4.75 4.75 0 0 1-.5 9.5z'/%3E%3C/svg%3E")}.ffc-icon-code::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 7l-5 5 5 5M16 7l5 5-5 5M14 4l-4 16'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 7l-5 5 5 5M16 7l5 5-5 5M14 4l-4 16'/%3E%3C/svg%3E")}.ffc-icon-copy::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='11' height='11' rx='2'/%3E%3Cpath d='M5 15V5a2 2 0 0 1 2-2h10'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='11' height='11' rx='2'/%3E%3Cpath d='M5 15V5a2 2 0 0 1 2-2h10'/%3E%3C/svg%3E")}.ffc-icon-cross::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E")}.ffc-icon-database::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6c0-1.7 3.6-3 8-3s8 1.3 8 3-3.6 3-8 3-8-1.3-8-3z'/%3E%3Cpath d='M4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6M4 12c0 1.7 3.6 3 8 3s8-1.3 8-3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6c0-1.7 3.6-3 8-3s8 1.3 8 3-3.6 3-8 3-8-1.3-8-3z'/%3E%3Cpath d='M4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6M4 12c0 1.7 3.6 3 8 3s8-1.3 8-3'/%3E%3C/svg%3E")}.ffc-icon-debug::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='7' y='8' width='10' height='12' rx='5'/%3E%3Cpath d='M12 8v12M9 5l1.5 2M15 5l-1.5 2M3 12h4M17 12h4M4 7l3 2.5M20 7l-3 2.5M4 18l3-2M20 18l-3-2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='7' y='8' width='10' height='12' rx='5'/%3E%3Cpath d='M12 8v12M9 5l1.5 2M15 5l-1.5 2M3 12h4M17 12h4M4 7l3 2.5M20 7l-3 2.5M4 18l3-2M20 18l-3-2'/%3E%3C/svg%3E")}.ffc-icon-delete::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16M10 11v6M14 11v6M9 7V4h6v3M6 7l1 13h10l1-13'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16M10 11v6M14 11v6M9 7V4h6v3M6 7l1 13h10l1-13'/%3E%3C/svg%3E")}.ffc-icon-doc::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5a2 2 0 0 1 2-2h14v16H6a2 2 0 0 0-2 2z'/%3E%3Cpath d='M4 19V5M8 7h8'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5a2 2 0 0 1 2-2h14v16H6a2 2 0 0 0-2 2z'/%3E%3Cpath d='M4 19V5M8 7h8'/%3E%3C/svg%3E")}.ffc-icon-download::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11M7 10l5 5 5-5M5 20h14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11M7 10l5 5 5-5M5 20h14'/%3E%3C/svg%3E")}.ffc-icon-edit::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h4L19 9l-4-4L4 16z'/%3E%3Cpath d='M13.5 6.5l4 4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h4L19 9l-4-4L4 16z'/%3E%3Cpath d='M13.5 6.5l4 4'/%3E%3C/svg%3E")}.ffc-icon-email::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='2'/%3E%3Cpath d='M3.5 7l8.5 6 8.5-6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='2'/%3E%3Cpath d='M3.5 7l8.5 6 8.5-6'/%3E%3C/svg%3E")}.ffc-icon-error::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E")}.ffc-icon-external::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 4h6v6M20 4l-9 9'/%3E%3Cpath d='M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 4h6v6M20 4l-9 9'/%3E%3Cpath d='M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5'/%3E%3C/svg%3E")}.ffc-icon-eye::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E")}.ffc-icon-file::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5M9 13h6M9 17h6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5M9 13h6M9 17h6'/%3E%3C/svg%3E")}.ffc-icon-filter::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 5h18l-7 8v6l-4-2v-4z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 5h18l-7 8v6l-4-2v-4z'/%3E%3C/svg%3E")}.ffc-icon-gauge::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.2 17a9 9 0 1 1 15.6 0'/%3E%3Cpath d='M12.9 12.8L16 8.5'/%3E%3Ccircle cx='12' cy='14' r='1.6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.2 17a9 9 0 1 1 15.6 0'/%3E%3Cpath d='M12.9 12.8L16 8.5'/%3E%3Ccircle cx='12' cy='14' r='1.6'/%3E%3C/svg%3E")}.ffc-icon-globe::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18'/%3E%3C/svg%3E")}.ffc-icon-grid::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='7' height='7' rx='1.5'/%3E%3Crect x='13' y='4' width='7' height='7' rx='1.5'/%3E%3Crect x='4' y='13' width='7' height='7' rx='1.5'/%3E%3Crect x='13' y='13' width='7' height='7' rx='1.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='7' height='7' rx='1.5'/%3E%3Crect x='13' y='4' width='7' height='7' rx='1.5'/%3E%3Crect x='4' y='13' width='7' height='7' rx='1.5'/%3E%3Crect x='13' y='13' width='7' height='7' rx='1.5'/%3E%3C/svg%3E")}.ffc-icon-grip::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='6' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='6' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='9' cy='12' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='12' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='9' cy='18' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='18' r='1.2' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='6' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='6' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='9' cy='12' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='12' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='9' cy='18' r='1.2' fill='currentColor' stroke='none'/%3E%3Ccircle cx='15' cy='18' r='1.2' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-help::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.6.3-1 .9-1 1.6v.6'/%3E%3Ccircle cx='12' cy='17' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.6.3-1 .9-1 1.6v.6'/%3E%3Ccircle cx='12' cy='17' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-history::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12a9 9 0 1 0 3-6.7L3 8'/%3E%3Cpath d='M3 3v5h5M12 7.5V12l3 2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12a9 9 0 1 0 3-6.7L3 8'/%3E%3Cpath d='M3 3v5h5M12 7.5V12l3 2'/%3E%3C/svg%3E")}.ffc-icon-id::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='5' width='19' height='14' rx='2'/%3E%3Cpath d='M6.5 15V9M10 9h2.5a3 3 0 0 1 0 6H10z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='5' width='19' height='14' rx='2'/%3E%3Cpath d='M6.5 15V9M10 9h2.5a3 3 0 0 1 0 6H10z'/%3E%3C/svg%3E")}.ffc-icon-image::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Ccircle cx='9' cy='10' r='2'/%3E%3Cpath d='M21 16l-5-5-9 9'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Ccircle cx='9' cy='10' r='2'/%3E%3Cpath d='M21 16l-5-5-9 9'/%3E%3C/svg%3E")}.ffc-icon-inbox::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 13l2.5-8h13L21 13v6H3z'/%3E%3Cpath d='M3 13h5l1.5 2.5h5L16 13h5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 13l2.5-8h13L21 13v6H3z'/%3E%3Cpath d='M3 13h5l1.5 2.5h5L16 13h5'/%3E%3C/svg%3E")}.ffc-icon-info::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11v6'/%3E%3Ccircle cx='12' cy='7.5' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11v6'/%3E%3Ccircle cx='12' cy='7.5' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-key::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='7.5' cy='15.5' r='4'/%3E%3Cpath d='M10.5 12.5L20 3M16 7l3 3M13.5 9.5l2 2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='7.5' cy='15.5' r='4'/%3E%3Cpath d='M10.5 12.5L20 3M16 7l3 3M13.5 9.5l2 2'/%3E%3C/svg%3E")}.ffc-icon-layout::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Cpath d='M3 9h18M9 9v11'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Cpath d='M3 9h18M9 9v11'/%3E%3C/svg%3E")}.ffc-icon-link::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 14a4.5 4.5 0 0 0 6.4 0l3-3a4.5 4.5 0 0 0-6.4-6.4l-1 1'/%3E%3Cpath d='M14 10a4.5 4.5 0 0 0-6.4 0l-3 3a4.5 4.5 0 0 0 6.4 6.4l1-1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 14a4.5 4.5 0 0 0 6.4 0l3-3a4.5 4.5 0 0 0-6.4-6.4l-1 1'/%3E%3Cpath d='M14 10a4.5 4.5 0 0 0-6.4 0l-3 3a4.5 4.5 0 0 0 6.4 6.4l1-1'/%3E%3C/svg%3E")}.ffc-icon-list::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6h11M9 12h11M9 18h11'/%3E%3Ccircle cx='4.5' cy='6' r='1' fill='currentColor' stroke='none'/%3E%3Ccircle cx='4.5' cy='12' r='1' fill='currentColor' stroke='none'/%3E%3Ccircle cx='4.5' cy='18' r='1' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6h11M9 12h11M9 18h11'/%3E%3Ccircle cx='4.5' cy='6' r='1' fill='currentColor' stroke='none'/%3E%3Ccircle cx='4.5' cy='12' r='1' fill='currentColor' stroke='none'/%3E%3Ccircle cx='4.5' cy='18' r='1' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-lock::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='11' width='14' height='10' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='11' width='14' height='10' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E")}.ffc-icon-logout::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4M15 8l4 4-4 4M19 12H9'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4M15 8l4 4-4 4M19 12H9'/%3E%3C/svg%3E")}.ffc-icon-map-pin::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21s-7-6.2-7-11.5A7 7 0 0 1 19 9.5C19 14.8 12 21 12 21z'/%3E%3Ccircle cx='12' cy='9.5' r='2.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21s-7-6.2-7-11.5A7 7 0 0 1 19 9.5C19 14.8 12 21 12 21z'/%3E%3Ccircle cx='12' cy='9.5' r='2.5'/%3E%3C/svg%3E")}.ffc-icon-megaphone::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 10v4h3l7 4V6l-7 4z'/%3E%3Cpath d='M6 14l1.5 5h2.5l-1.3-4.3M17 9a4 4 0 0 1 0 6M19.5 6.5a7.5 7.5 0 0 1 0 11'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 10v4h3l7 4V6l-7 4z'/%3E%3Cpath d='M6 14l1.5 5h2.5l-1.3-4.3M17 9a4 4 0 0 1 0 6M19.5 6.5a7.5 7.5 0 0 1 0 11'/%3E%3C/svg%3E")}.ffc-icon-minus::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3C/svg%3E")}.ffc-icon-monitor::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4' width='15' height='10.5' rx='1.5'/%3E%3Cpath d='M7 18.5h6M10 14.5v4'/%3E%3Crect x='16' y='9' width='5.5' height='11' rx='1.2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4' width='15' height='10.5' rx='1.5'/%3E%3Cpath d='M7 18.5h6M10 14.5v4'/%3E%3Crect x='16' y='9' width='5.5' height='11' rx='1.2'/%3E%3C/svg%3E")}.ffc-icon-network::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='3' width='6' height='5' rx='1'/%3E%3Crect x='3' y='16' width='6' height='5' rx='1'/%3E%3Crect x='15' y='16' width='6' height='5' rx='1'/%3E%3Cpath d='M12 8v4M6 16v-2h12v2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='3' width='6' height='5' rx='1'/%3E%3Crect x='3' y='16' width='6' height='5' rx='1'/%3E%3Crect x='15' y='16' width='6' height='5' rx='1'/%3E%3Cpath d='M12 8v4M6 16v-2h12v2'/%3E%3C/svg%3E")}.ffc-icon-package::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 7.5L12 3l9 4.5v9L12 21l-9-4.5z'/%3E%3Cpath d='M3 7.5l9 4.5 9-4.5M12 12v9'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 7.5L12 3l9 4.5v9L12 21l-9-4.5z'/%3E%3Cpath d='M3 7.5l9 4.5 9-4.5M12 12v9'/%3E%3C/svg%3E")}.ffc-icon-palette::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3a9 9 0 1 0 0 18c1.1 0 1.6-.8 1.6-1.6 0-1.2-1-1.6-1-2.6 0-.9.7-1.6 1.6-1.6H17a4 4 0 0 0 4-4c0-4.6-4-8.2-9-8.2z'/%3E%3Ccircle cx='7.5' cy='11' r='1'/%3E%3Ccircle cx='10' cy='7' r='1'/%3E%3Ccircle cx='15' cy='7' r='1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3a9 9 0 1 0 0 18c1.1 0 1.6-.8 1.6-1.6 0-1.2-1-1.6-1-2.6 0-.9.7-1.6 1.6-1.6H17a4 4 0 0 0 4-4c0-4.6-4-8.2-9-8.2z'/%3E%3Ccircle cx='7.5' cy='11' r='1'/%3E%3Ccircle cx='10' cy='7' r='1'/%3E%3Ccircle cx='15' cy='7' r='1'/%3E%3C/svg%3E")}.ffc-icon-phone::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 4h3.5l1.8 4.6-2.3 1.5a11 11 0 0 0 5.9 5.9l1.5-2.3L20 15.5V19a2 2 0 0 1-2 2A15 15 0 0 1 3 6a2 2 0 0 1 2-2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 4h3.5l1.8 4.6-2.3 1.5a11 11 0 0 0 5.9 5.9l1.5-2.3L20 15.5V19a2 2 0 0 1-2 2A15 15 0 0 1 3 6a2 2 0 0 1 2-2z'/%3E%3C/svg%3E")}.ffc-icon-plus::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14M5 12h14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14M5 12h14'/%3E%3C/svg%3E")}.ffc-icon-print::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 9V3h10v6'/%3E%3Crect x='3' y='9' width='18' height='8' rx='2'/%3E%3Cpath d='M7 14h10v7H7z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 9V3h10v6'/%3E%3Crect x='3' y='9' width='18' height='8' rx='2'/%3E%3Cpath d='M7 14h10v7H7z'/%3E%3C/svg%3E")}.ffc-icon-qr::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='7' height='7' rx='1'/%3E%3Crect x='14' y='3' width='7' height='7' rx='1'/%3E%3Crect x='3' y='14' width='7' height='7' rx='1'/%3E%3Cpath d='M14 14h3v3h-3zM20.5 14v.01M14 20.5h.01M17.5 20.5H21v-3.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='7' height='7' rx='1'/%3E%3Crect x='14' y='3' width='7' height='7' rx='1'/%3E%3Crect x='3' y='14' width='7' height='7' rx='1'/%3E%3Cpath d='M14 14h3v3h-3zM20.5 14v.01M14 20.5h.01M17.5 20.5H21v-3.5'/%3E%3C/svg%3E")}.ffc-icon-restore::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12a9 9 0 1 0 3-6.7L3 8'/%3E%3Cpath d='M3 3v5h5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12a9 9 0 1 0 3-6.7L3 8'/%3E%3Cpath d='M3 3v5h5'/%3E%3C/svg%3E")}.ffc-icon-robot::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='8' width='16' height='12' rx='3'/%3E%3Cpath d='M12 4.5V8M9 13v1M15 13v1M9 17h6'/%3E%3Ccircle cx='12' cy='3.5' r='1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='8' width='16' height='12' rx='3'/%3E%3Cpath d='M12 4.5V8M9 13v1M15 13v1M9 17h6'/%3E%3Ccircle cx='12' cy='3.5' r='1'/%3E%3C/svg%3E")}.ffc-icon-scroll::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5M9 13h6M9 17h6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5M9 13h6M9 17h6'/%3E%3C/svg%3E")}.ffc-icon-search::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='6.5'/%3E%3Cpath d='M20 20l-4.4-4.4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='6.5'/%3E%3Cpath d='M20 20l-4.4-4.4'/%3E%3C/svg%3E")}.ffc-icon-send::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 3L3 10.5l7 2.5 2.5 7z'/%3E%3Cpath d='M21 3L10 13'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 3L3 10.5l7 2.5 2.5 7z'/%3E%3Cpath d='M21 3L10 13'/%3E%3C/svg%3E")}.ffc-icon-server::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='7' rx='1.5'/%3E%3Crect x='3' y='13' width='18' height='7' rx='1.5'/%3E%3Cpath d='M7 7.5h.01M7 16.5h.01M11 7.5h6M11 16.5h6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='7' rx='1.5'/%3E%3Crect x='3' y='13' width='18' height='7' rx='1.5'/%3E%3Cpath d='M7 7.5h.01M7 16.5h.01M11 7.5h6M11 16.5h6'/%3E%3C/svg%3E")}.ffc-icon-settings::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='7'/%3E%3Cpath d='M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9L7 7M17 17l2.1 2.1M4.9 19.1L7 17M17 7l2.1-2.1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='7'/%3E%3Cpath d='M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9L7 7M17 17l2.1 2.1M4.9 19.1L7 17M17 7l2.1-2.1'/%3E%3C/svg%3E")}.ffc-icon-share::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='18' cy='5.5' r='2.5'/%3E%3Ccircle cx='6' cy='12' r='2.5'/%3E%3Ccircle cx='18' cy='18.5' r='2.5'/%3E%3Cpath d='M8.2 10.8l7.6-4.1M8.2 13.2l7.6 4.1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='18' cy='5.5' r='2.5'/%3E%3Ccircle cx='6' cy='12' r='2.5'/%3E%3Ccircle cx='18' cy='18.5' r='2.5'/%3E%3Cpath d='M8.2 10.8l7.6-4.1M8.2 13.2l7.6 4.1'/%3E%3C/svg%3E")}.ffc-icon-shield::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z'/%3E%3C/svg%3E")}.ffc-icon-skip::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 5l9 7-9 7zM18 5v14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 5l9 7-9 7zM18 5v14'/%3E%3C/svg%3E")}.ffc-icon-sliders::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6h9M17 6h3M4 12h3M11 12h9M4 18h11M19 18h1'/%3E%3Ccircle cx='15' cy='6' r='2'/%3E%3Ccircle cx='9' cy='12' r='2'/%3E%3Ccircle cx='17' cy='18' r='2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6h9M17 6h3M4 12h3M11 12h9M4 18h11M19 18h1'/%3E%3Ccircle cx='15' cy='6' r='2'/%3E%3Ccircle cx='9' cy='12' r='2'/%3E%3Ccircle cx='17' cy='18' r='2'/%3E%3C/svg%3E")}.ffc-icon-success::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M8 12.5l2.8 2.8L16.5 9'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M8 12.5l2.8 2.8L16.5 9'/%3E%3C/svg%3E")}.ffc-icon-sync::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 11a8 8 0 0 0-14.3-4.9L4 8M4 4v4h4M4 13a8 8 0 0 0 14.3 4.9L20 16M20 20v-4h-4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 11a8 8 0 0 0-14.3-4.9L4 8M4 4v4h4M4 13a8 8 0 0 0 14.3 4.9L20 16M20 20v-4h-4'/%3E%3C/svg%3E")}.ffc-icon-tag::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12V4a1 1 0 0 1 1-1h8l9 9-9 9z'/%3E%3Ccircle cx='7.5' cy='7.5' r='1.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12V4a1 1 0 0 1 1-1h8l9 9-9 9z'/%3E%3Ccircle cx='7.5' cy='7.5' r='1.5'/%3E%3C/svg%3E")}.ffc-icon-unlock::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='11' width='14' height='10' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 7.7-1.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='11' width='14' height='10' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 7.7-1.5'/%3E%3C/svg%3E")}.ffc-icon-upload::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 16V5M7 10l5-5 5 5M5 20h14'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 16V5M7 10l5-5 5 5M5 20h14'/%3E%3C/svg%3E")}.ffc-icon-user::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='4'/%3E%3Cpath d='M4 21c1.5-4 4.5-6 8-6s6.5 2 8 6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='4'/%3E%3Cpath d='M4 21c1.5-4 4.5-6 8-6s6.5 2 8 6'/%3E%3C/svg%3E")}.ffc-icon-user-check::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10' cy='8' r='4'/%3E%3Cpath d='M3 21c1.4-3.8 4-5.8 7-5.8 1.6 0 3 .5 4.2 1.5M15.5 18.5l2 2 4-4.5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10' cy='8' r='4'/%3E%3Cpath d='M3 21c1.4-3.8 4-5.8 7-5.8 1.6 0 3 .5 4.2 1.5M15.5 18.5l2 2 4-4.5'/%3E%3C/svg%3E")}.ffc-icon-users::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='3.5'/%3E%3Cpath d='M2.5 20c.8-3.5 3.4-5.5 6.5-5.5s5.7 2 6.5 5.5'/%3E%3Cpath d='M16 4.6a3.5 3.5 0 0 1 0 6.8M18 14.8c2 .7 3.2 2.5 3.5 5.2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='3.5'/%3E%3Cpath d='M2.5 20c.8-3.5 3.4-5.5 6.5-5.5s5.7 2 6.5 5.5'/%3E%3Cpath d='M16 4.6a3.5 3.5 0 0 1 0 6.8M18 14.8c2 .7 3.2 2.5 3.5 5.2'/%3E%3C/svg%3E")}.ffc-icon-warning::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.5L2.5 20h19z'/%3E%3Cpath d='M12 10v4.5'/%3E%3Ccircle cx='12' cy='17.3' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.5L2.5 20h19z'/%3E%3Cpath d='M12 10v4.5'/%3E%3Ccircle cx='12' cy='17.3' r='1.1' fill='currentColor' stroke='none'/%3E%3C/svg%3E")}.ffc-icon-wrench::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 6.5a4 4 0 0 0 5 5L21 10a6 6 0 0 1-7.9 5.4L6 22.5 1.5 18l7.1-7.1A6 6 0 0 1 14 3l-1.5 1.5z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 6.5a4 4 0 0 0 5 5L21 10a6 6 0 0 1-7.9 5.4L6 22.5 1.5 18l7.1-7.1A6 6 0 0 1 14 3l-1.5 1.5z'/%3E%3C/svg%3E")}.ffc-icon-zap::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13 2L4 14h7l-1 8 9-12h-7z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13 2L4 14h7l-1 8 9-12h-7z'/%3E%3C/svg%3E")}.ffc-svg-icon{color:var(--ffc-icon-tone,currentColor)}.ffc-icon-tone-primary{--ffc-icon-tone:var(--ffc-primary)}.ffc-icon-tone-info{--ffc-icon-tone:var(--ffc-info)}.ffc-icon-tone-success{--ffc-icon-tone:var(--ffc-success)}.ffc-icon-tone-warning{--ffc-icon-tone:var(--ffc-warning-text)}.ffc-icon-tone-danger{--ffc-icon-tone:var(--ffc-danger)}.ffc-icon-tone-neutral{--ffc-icon-tone:var(--ffc-text-secondary)}.ffc-icon-badge{--ffc-icon-tone:currentColor;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:2.25em;height:2.25em;border-radius:var(--ffc-radius-lg);background:var(--ffc-bg-alt);color:var(--ffc-text-secondary)}.ffc-icon-badge::before{margin-right:0}.ffc-icon-badge.ffc-icon-badge-primary{background:var(--ffc-primary-light);color:var(--ffc-primary)}.ffc-icon-badge.ffc-icon-badge-info{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-icon-badge.ffc-icon-badge-success{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-icon-badge.ffc-icon-badge-warning{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-icon-badge.ffc-icon-badge-danger{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-icon-spin::before{animation:ffc-icon-spin 1s linear infinite}@keyframes ffc-icon-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.ffc-icon-spin::before{animation:none}}@media (forced-colors:active){.ffc-icon-api::before,.ffc-icon-award::before,.ffc-icon-building::before,.ffc-icon-bulb::before,.ffc-icon-calendar::before,.ffc-icon-chart::before,.ffc-icon-checkmark::before,.ffc-icon-chevron-down::before,.ffc-icon-chevron-left::before,.ffc-icon-chevron-right::before,.ffc-icon-chevron-up::before,.ffc-icon-clipboard::before,.ffc-icon-clock::before,.ffc-icon-cloud::before,.ffc-icon-code::before,.ffc-icon-copy::before,.ffc-icon-cross::before,.ffc-icon-database::before,.ffc-icon-debug::before,.ffc-icon-delete::before,.ffc-icon-doc::before,.ffc-icon-download::before,.ffc-icon-edit::before,.ffc-icon-email::before,.ffc-icon-error::before,.ffc-icon-external::before,.ffc-icon-eye::before,.ffc-icon-file::before,.ffc-icon-filter::before,.ffc-icon-gauge::before,.ffc-icon-globe::before,.ffc-icon-grid::before,.ffc-icon-grip::before,.ffc-icon-help::before,.ffc-icon-history::before,.ffc-icon-id::before,.ffc-icon-image::before,.ffc-icon-inbox::before,.ffc-icon-info::before,.ffc-icon-key::before,.ffc-icon-layout::before,.ffc-icon-link::before,.ffc-icon-list::before,.ffc-icon-lock::before,.ffc-icon-logout::before,.ffc-icon-map-pin::before,.ffc-icon-megaphone::before,.ffc-icon-minus::before,.ffc-icon-monitor::before,.ffc-icon-network::before,.ffc-icon-package::before,.ffc-icon-palette::before,.ffc-icon-phone::before,.ffc-icon-plus::before,.ffc-icon-print::before,.ffc-icon-qr::before,.ffc-icon-restore::before,.ffc-icon-robot::before,.ffc-icon-scroll::before,.ffc-icon-search::before,.ffc-icon-send::before,.ffc-icon-server::before,.ffc-icon-settings::before,.ffc-icon-share::before,.ffc-icon-shield::before,.ffc-icon-skip::before,.ffc-icon-sliders::before,.ffc-icon-success::before,.ffc-icon-sync::before,.ffc-icon-tag::before,.ffc-icon-unlock::before,.ffc-icon-upload::before,.ffc-icon-user-check::before,.ffc-icon-user::before,.ffc-icon-users::before,.ffc-icon-warning::before,.ffc-icon-wrench::before,.ffc-icon-zap::before{forced-color-adjust:none;background-color:CanvasText}.ffc-icon-badge,.ffc-icon-badge.ffc-icon-badge-danger,.ffc-icon-badge.ffc-icon-badge-info,.ffc-icon-badge.ffc-icon-badge-primary,.ffc-icon-badge.ffc-icon-badge-success,.ffc-icon-badge.ffc-icon-badge-warning{border:1px solid CanvasText}}.ffc-visibility-restricted{padding:var(--ffc-spacing-2xl);background:var(--ffc-warning-light);border:1px solid var(--ffc-warning);border-radius:var(--ffc-radius-md);text-align:center}.ffc-visibility-restricted .ffc-calendar-title{margin:0 0 var(--ffc-spacing-md);font-size:1.2em;color:var(--ffc-text)}.ffc-visibility-restricted .ffc-restricted-message{color:var(--ffc-text-muted)}.ffc-visibility-restricted .ffc-restricted-message a{color:var(--ffc-primary);font-weight:600}.ffc-scheduling-restricted{padding:var(--ffc-spacing-2xl);text-align:center}.ffc-scheduling-restricted .ffc-restricted-message{color:var(--ffc-text-muted)}.ffc-scheduling-restricted .ffc-restricted-message a{color:var(--ffc-primary);font-weight:600}.ffc-admin-bypass-notice{padding:var(--ffc-spacing-md) var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-xl);background:var(--ffc-info-light);border:1px solid var(--ffc-info);border-radius:var(--ffc-radius-sm);font-size:.9em;color:var(--ffc-info)}.ffc-badge{display:inline-block;padding:3px var(--ffc-spacing-sm);border-radius:var(--ffc-radius-xs);font-size:var(--ffc-font-size-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.3px}.ffc-pill{display:inline-block;padding:3px var(--ffc-spacing-md);border-radius:var(--ffc-radius-pill);font-size:var(--ffc-font-size-xs);font-weight:500;cursor:default}.ffc-pill-has-tip{cursor:help}.ffc-pill-row-color{background:var(--ffc-badge-row-bg);color:var(--ffc-badge-row-text)}.ffc-btn{display:inline-block;padding:var(--ffc-spacing-md) var(--ffc-spacing-2xl);border:none;border-radius:var(--ffc-radius-sm);font-family:var(--ffc-font-family);font-size:var(--ffc-font-size-base);font-weight:500;cursor:pointer;text-decoration:none;text-align:center;transition:all .2s ease}.ffc-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-btn:disabled{opacity:.6;cursor:not-allowed}.ffc-btn-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-btn-primary:hover{background:var(--ffc-primary-hover)}.ffc-btn-primary:disabled{background:var(--ffc-gray-300)}.ffc-btn-secondary{background:var(--ffc-gray-200);color:var(--ffc-gray-800)}.ffc-btn-secondary:hover{background:var(--ffc-gray-300)}.ffc-btn-success{background:var(--ffc-success);color:var(--ffc-text-on-success)}.ffc-btn-success:hover{background:var(--ffc-success-hover)}.ffc-btn-danger{background:var(--ffc-danger);color:var(--ffc-text-on-danger)}.ffc-btn-danger:hover{background:var(--ffc-danger-hover)}@media (prefers-reduced-motion:reduce){.ffc-btn{transition:none}}.ffc-badge-private{background:var(--ffc-danger-light);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger)}.ffc-flex{display:flex}.ffc-mb-md{margin-bottom:var(--ffc-spacing-lg)}.ffc-color-dot{display:inline-block;width:12px;height:12px;border-radius:var(--ffc-radius-full);vertical-align:middle;background-color:var(--ffc-color,currentColor)}.ffc-toggle,.form-table td .ffc-toggle,.form-table td fieldset .ffc-toggle{display:inline-flex;align-items:center;gap:var(--ffc-spacing-md);cursor:pointer;user-select:none;line-height:1.3;position:relative}.ffc-toggle input[type=checkbox]{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.ffc-toggle-track{position:relative;flex:0 0 auto;width:38px;height:22px;background:var(--ffc-border);border-radius:11px;transition:background-color .15s ease}.ffc-toggle-track::after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:var(--ffc-radius-full);background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform .15s ease}.ffc-toggle input[type=checkbox]:checked+.ffc-toggle-track{background:var(--ffc-primary)}.ffc-toggle input[type=checkbox]:checked+.ffc-toggle-track::after{transform:translateX(16px)}.ffc-toggle input[type=checkbox]:focus-visible+.ffc-toggle-track{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-toggle input[type=checkbox]:disabled+.ffc-toggle-track{opacity:.5;cursor:not-allowed}.ffc-toggle-label{color:inherit}@media (prefers-reduced-motion:reduce){.ffc-toggle-track,.ffc-toggle-track::after{transition:none}}.ffc-tri-toggle{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ffc-spacing-xs) var(--ffc-spacing-md);margin:0;padding:0;border:0;min-width:0}.ffc-tri-toggle-input{position:absolute;opacity:0;width:0;height:0;margin:0;pointer-events:none}.ffc-tri-toggle-track{position:relative;display:inline-flex;flex:0 0 auto;width:84px;height:30px;border-radius:15px;background:var(--ffc-bg-card);box-shadow:inset 0 0 0 1px var(--ffc-border)}.ffc-tri-toggle-stop{flex:1 1 0;cursor:pointer}.ffc-tri-toggle-knob{position:absolute;top:3px;left:3px;width:24px;height:24px;border-radius:var(--ffc-radius-full);background:var(--ffc-tri-knob);box-shadow:var(--ffc-shadow-sm);pointer-events:none;transition:transform .15s ease,background-color .15s ease}.ffc-tri-toggle-input:nth-of-type(2):checked~.ffc-tri-toggle-track .ffc-tri-toggle-knob{transform:translateX(27px)}.ffc-tri-toggle-input:nth-of-type(3):checked~.ffc-tri-toggle-track .ffc-tri-toggle-knob{transform:translateX(54px)}.ffc-tri-toggle-severity .ffc-tri-toggle-input:first-of-type:checked~.ffc-tri-toggle-track{--ffc-tri-knob:var(--ffc-gray-600)}.ffc-tri-toggle-severity .ffc-tri-toggle-input:nth-of-type(2):checked~.ffc-tri-toggle-track,.ffc-tri-toggle-traffic .ffc-tri-toggle-input:nth-of-type(2):checked~.ffc-tri-toggle-track{--ffc-tri-knob:var(--ffc-warning)}.ffc-tri-toggle-severity .ffc-tri-toggle-input:nth-of-type(3):checked~.ffc-tri-toggle-track,.ffc-tri-toggle-traffic .ffc-tri-toggle-input:first-of-type:checked~.ffc-tri-toggle-track{--ffc-tri-knob:var(--ffc-danger)}.ffc-tri-toggle-traffic .ffc-tri-toggle-input:nth-of-type(3):checked~.ffc-tri-toggle-track{--ffc-tri-knob:var(--ffc-success)}.ffc-tri-toggle-input:focus-visible~.ffc-tri-toggle-track{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-tri-toggle-input:disabled~.ffc-tri-toggle-track .ffc-tri-toggle-stop{cursor:not-allowed}.ffc-tri-toggle-value{min-width:7em;font-weight:600}.ffc-tri-toggle-desc,.ffc-tri-toggle-value>span{display:none}.ffc-tri-toggle-desc{flex:1 0 100%}.ffc-tri-toggle-input:first-of-type:checked~.ffc-tri-toggle-value .ffc-tri-toggle-at-1,.ffc-tri-toggle-input:nth-of-type(2):checked~.ffc-tri-toggle-value .ffc-tri-toggle-at-2,.ffc-tri-toggle-input:nth-of-type(3):checked~.ffc-tri-toggle-value .ffc-tri-toggle-at-3{display:inline}.ffc-tri-toggle-input:first-of-type:checked~.ffc-tri-toggle-desc.ffc-tri-toggle-at-1,.ffc-tri-toggle-input:nth-of-type(2):checked~.ffc-tri-toggle-desc.ffc-tri-toggle-at-2,.ffc-tri-toggle-input:nth-of-type(3):checked~.ffc-tri-toggle-desc.ffc-tri-toggle-at-3{display:block}@media (prefers-reduced-motion:reduce){.ffc-tri-toggle-knob{transition:none}}@media (forced-colors:active){.ffc-tri-toggle-track{border:1px solid CanvasText}.ffc-tri-toggle-knob{background:Highlight}}.ffc-autosave-badge{display:inline-block;margin-left:var(--ffc-spacing-sm);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border-radius:10px;font-size:var(--ffc-font-size-xs);font-weight:500;line-height:1.5;vertical-align:middle}.ffc-autosave-badge--saving{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-autosave-badge--saved{background:var(--ffc-success-light);color:var(--ffc-success)}.ffc-autosave-badge--error{background:var(--ffc-danger-light);color:var(--ffc-danger-text)}.ffc-features-cell{display:flex;flex-direction:column;align-items:flex-start;gap:var(--ffc-spacing-2xs)}.ffc-features-cell .ffc-toggle{margin:0}.ffc-features-badge{display:inline-block;margin-top:var(--ffc-spacing-2xs);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border-radius:10px;font-size:var(--ffc-font-size-2xs);font-weight:500;line-height:1.4}.ffc-features-badge--saving{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-features-badge--saved{background:var(--ffc-success-light);color:var(--ffc-success)}.ffc-features-badge--error{background:var(--ffc-danger-light);color:var(--ffc-danger-text)}#ffc-activity-log-table.ffc-loading{position:relative;opacity:.55;pointer-events:none;transition:opacity .15s ease}.ffc-captcha-mode{margin:0 0 var(--ffc-spacing-xl);max-width:46em}.ffc-captcha-mode-note,.ffc-captcha-mode-summary{display:block;margin-left:var(--ffc-spacing-3xl)}.ffc-captcha-mode-note{margin-top:var(--ffc-spacing-2xs);padding-left:var(--ffc-spacing-md);border-left:3px solid transparent}.ffc-captcha-mode-note--warning{border-left-color:var(--ffc-warning-border)}.ffc-captcha-mode-note--info{border-left-color:var(--ffc-info-border)}.ffc-email-disabled-notice{margin:0 0 var(--ffc-spacing-xl);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border-left:4px solid var(--ffc-warning-border);background:var(--ffc-warning-bg);color:var(--ffc-warning-text);border-radius:2px}.ffc-email-disabled-notice p{margin:0}@media (forced-colors:active){.ffc-btn-danger,.ffc-btn-primary,.ffc-btn-secondary,.ffc-btn-success,:root.ffc-dark-mode .button,:root.ffc-dark-mode .button-primary.disabled,:root.ffc-dark-mode .button-primary[disabled],:root.ffc-dark-mode .button-secondary,:root.ffc-dark-mode .button.disabled,:root.ffc-dark-mode .mce-btn.mce-active{border:1px solid ButtonText}.ffc-autosave-badge--error,.ffc-autosave-badge--saved,.ffc-autosave-badge--saving,.ffc-features-badge--error,.ffc-features-badge--saved,.ffc-features-badge--saving,.ffc-pill-row-color,.ffc-status-pending{border:1px solid CanvasText}}.ffc-admin-page .ffc-required{color:var(--ffc-danger)}
/*# sourceMappingURL=ffc-common.min.css.map */
\ No newline at end of file
diff --git a/assets/js/ffc-admin-autosave.js b/assets/js/ffc-admin-autosave.js
index 03232e168..a60a14d3e 100644
--- a/assets/js/ffc-admin-autosave.js
+++ b/assets/js/ffc-admin-autosave.js
@@ -83,7 +83,9 @@
// the track on toggle-on — so the toggle visually stays "off"
// even after the save succeeds. Anchor the badge AFTER the
// wrapping label instead so the track stays adjacent.
- var $anchor = $field.closest('.ffc-toggle');
+ // A three-position switch (#1745) is one field made of three radios:
+ // its badge goes after the whole control, once.
+ var $anchor = $field.closest('.ffc-toggle, .ffc-tri-toggle');
if (!$anchor.length) {
$anchor = $field;
}
@@ -346,6 +348,10 @@
}
var key = $input.attr(attr);
var isMulti = $input.attr('data-ffc-autosave-multi') !== undefined;
+ // A radio group saves as one field (#1745): the first radio is the
+ // anchor, the group feeds its change handler, and the value read is
+ // the checked member's.
+ var isRadio = $input.is(':radio');
if (!key) {
return;
}
@@ -355,7 +361,7 @@
// call). Siblings still get marked bound so this loop skips
// them on the next pass, but their changes are funneled
// through the anchor's change handler via config.$group.
- if (isMulti) {
+ if (isMulti || isRadio) {
if (multiBound[key]) {
$input.data('ffcAutoSaveBound', true);
return;
@@ -373,6 +379,11 @@
if (confirmOff) {
config.confirmOff = confirmOff;
}
+ if (isRadio) {
+ var $radios = $('[' + attr + '="' + key + '"]:radio');
+ $radios.not($input).data('ffcAutoSaveBound', true);
+ config.$group = $radios;
+ }
if (isMulti) {
var $group = $('[' + attr + '="' + key + '"][data-ffc-autosave-multi]');
$group.not($input).data('ffcAutoSaveBound', true);
diff --git a/assets/js/ffc-admin-autosave.min.js b/assets/js/ffc-admin-autosave.min.js
index 652f16fb8..a586fb491 100644
--- a/assets/js/ffc-admin-autosave.min.js
+++ b/assets/js/ffc-admin-autosave.min.js
@@ -1,2 +1,2 @@
-!function(e){"use strict";if(window.FFC&&window.FFC.Admin){var t="ffc-autosave-badge";window.FFC.Admin.autoSaveField=function(a,o){if(!(o=o||{}).key)return window.console&&window.console.warn("FFC.Admin.autoSaveField: missing config.key"),{destroy:function(){}};var i=o.strings||{},r=i.saving||"Saving…",f=i.saved||"Saved",u=i.error||"Save failed",c=i.invalid||"Enter a valid value",d="number"==typeof o.debounce?o.debounce:400,s=function(n,a){if(a&&a.length)return a;var o=n.closest(".ffc-toggle");o.length||(o=n);var i=o.next("."+t);if(i.length)return i;var r=e(' ');return o.after(r),r}(a,o.$badge),v=null,l=null;function m(){if(v=null,!(t=a[0])||"function"!=typeof t.checkValidity||t.checkValidity()||(n(s,"error",t.validationMessage||c),"function"==typeof t.reportValidity&&t.reportValidity(),0)){var t;n(s,"saving",r);var i=function(t,n){if("function"==typeof n)return n(t);if(t.is(":checkbox"))return t.is(":checked")?"1":"0";if(t.is(":radio")){var a=t.attr("name");return a?e('input[name="'+a+'"]:checked').val():t.val()}return t.val()}(a,o.transform),d=e.extend({key:o.key,value:i},o.payload||{}),m=window.ffcAdminAutosave;!o.request&&m&&m.nonce&&(d.nonce=m.nonce),window.FFC.request(o.action||"ffc_update_setting",d,o.request).then(function(){n(s,"saved",f),l=setTimeout(function(){!function(e){e.attr("hidden","hidden").text("")}(s)},1800),function(e,t){"function"==typeof window.CustomEvent&&document.dispatchEvent(new window.CustomEvent("ffc:setting-saved",{detail:{key:e,value:t}}))}(o.key,i)}).catch(function(e){n(s,"error",e&&e.message?e.message:u)})}}var g=o.$group&&o.$group.length?o.$group:a,p=o.confirmOff?"change.ffcAutoSave":"change.ffcAutoSave input.ffcAutoSave";return g.on(p,function(){!o.confirmOff||!a.is(":checkbox")||a.is(":checked")||window.confirm(o.confirmOff)?(v&&clearTimeout(v),l&&(clearTimeout(l),l=null),v=setTimeout(m,d)):a.prop("checked",!0)}),{destroy:function(){g.off("change.ffcAutoSave input.ffcAutoSave"),v&&clearTimeout(v),l&&clearTimeout(l),s.remove()}}},window.FFC.Admin.bootAutoSaveFields=o,e(o)}function n(e,n,a){e.removeClass(t+"--saving "+t+"--saved "+t+"--error").addClass(t+"--"+n).text(a||"").removeAttr("hidden")}function a(t,n){var a={};e("["+t+"]").each(function(){var o=e(this);if(!o.data("ffcAutoSaveBound")){var i=o.attr(t),r=void 0!==o.attr("data-ffc-autosave-multi");if(i){if(r){if(a[i])return void o.data("ffcAutoSaveBound",!0);a[i]=!0}o.data("ffcAutoSaveBound",!0);var f=e.extend({key:i},n||{}),u=o.attr("data-ffc-autosave-debounce");u&&!isNaN(parseInt(u,10))&&(f.debounce=parseInt(u,10));var c=o.attr("data-ffc-confirm-off");if(c&&(f.confirmOff=c),r){var d=e("["+t+'="'+i+'"][data-ffc-autosave-multi]');d.not(o).data("ffcAutoSaveBound",!0),f.$group=d,f.transform=function(){return function(t){var n=[];return t.filter(":checked").each(function(){n.push(e(this).val())}),n}(d)}}window.FFC.Admin.autoSaveField(o,f)}}})}function o(){var e;a("data-ffc-autosave-key",{strings:(e=window.ffcAdminAutosave)&&e.strings||{}});var t=function(){var e=window.ffcFormMetaAutosave;return e&&e.ajaxUrl&&e.postId?{action:e.action||"ffc_update_form_meta",payload:{post_id:e.postId},request:{nonce:e.nonce,ajaxUrl:e.ajaxUrl},strings:e.strings||{}}:null}();t&&a("data-ffc-autosave-form-key",t)}}(jQuery);
+!function(e){"use strict";if(window.FFC&&window.FFC.Admin){var t="ffc-autosave-badge";window.FFC.Admin.autoSaveField=function(a,o){if(!(o=o||{}).key)return window.console&&window.console.warn("FFC.Admin.autoSaveField: missing config.key"),{destroy:function(){}};var i=o.strings||{},r=i.saving||"Saving…",f=i.saved||"Saved",u=i.error||"Save failed",c=i.invalid||"Enter a valid value",d="number"==typeof o.debounce?o.debounce:400,s=function(n,a){if(a&&a.length)return a;var o=n.closest(".ffc-toggle, .ffc-tri-toggle");o.length||(o=n);var i=o.next("."+t);if(i.length)return i;var r=e(' ');return o.after(r),r}(a,o.$badge),v=null,l=null;function m(){if(v=null,!(t=a[0])||"function"!=typeof t.checkValidity||t.checkValidity()||(n(s,"error",t.validationMessage||c),"function"==typeof t.reportValidity&&t.reportValidity(),0)){var t;n(s,"saving",r);var i=function(t,n){if("function"==typeof n)return n(t);if(t.is(":checkbox"))return t.is(":checked")?"1":"0";if(t.is(":radio")){var a=t.attr("name");return a?e('input[name="'+a+'"]:checked').val():t.val()}return t.val()}(a,o.transform),d=e.extend({key:o.key,value:i},o.payload||{}),m=window.ffcAdminAutosave;!o.request&&m&&m.nonce&&(d.nonce=m.nonce),window.FFC.request(o.action||"ffc_update_setting",d,o.request).then(function(){n(s,"saved",f),l=setTimeout(function(){!function(e){e.attr("hidden","hidden").text("")}(s)},1800),function(e,t){"function"==typeof window.CustomEvent&&document.dispatchEvent(new window.CustomEvent("ffc:setting-saved",{detail:{key:e,value:t}}))}(o.key,i)}).catch(function(e){n(s,"error",e&&e.message?e.message:u)})}}var g=o.$group&&o.$group.length?o.$group:a,p=o.confirmOff?"change.ffcAutoSave":"change.ffcAutoSave input.ffcAutoSave";return g.on(p,function(){!o.confirmOff||!a.is(":checkbox")||a.is(":checked")||window.confirm(o.confirmOff)?(v&&clearTimeout(v),l&&(clearTimeout(l),l=null),v=setTimeout(m,d)):a.prop("checked",!0)}),{destroy:function(){g.off("change.ffcAutoSave input.ffcAutoSave"),v&&clearTimeout(v),l&&clearTimeout(l),s.remove()}}},window.FFC.Admin.bootAutoSaveFields=o,e(o)}function n(e,n,a){e.removeClass(t+"--saving "+t+"--saved "+t+"--error").addClass(t+"--"+n).text(a||"").removeAttr("hidden")}function a(t,n){var a={};e("["+t+"]").each(function(){var o=e(this);if(!o.data("ffcAutoSaveBound")){var i=o.attr(t),r=void 0!==o.attr("data-ffc-autosave-multi"),f=o.is(":radio");if(i){if(r||f){if(a[i])return void o.data("ffcAutoSaveBound",!0);a[i]=!0}o.data("ffcAutoSaveBound",!0);var u=e.extend({key:i},n||{}),c=o.attr("data-ffc-autosave-debounce");c&&!isNaN(parseInt(c,10))&&(u.debounce=parseInt(c,10));var d=o.attr("data-ffc-confirm-off");if(d&&(u.confirmOff=d),f){var s=e("["+t+'="'+i+'"]:radio');s.not(o).data("ffcAutoSaveBound",!0),u.$group=s}if(r){var v=e("["+t+'="'+i+'"][data-ffc-autosave-multi]');v.not(o).data("ffcAutoSaveBound",!0),u.$group=v,u.transform=function(){return function(t){var n=[];return t.filter(":checked").each(function(){n.push(e(this).val())}),n}(v)}}window.FFC.Admin.autoSaveField(o,u)}}})}function o(){var e;a("data-ffc-autosave-key",{strings:(e=window.ffcAdminAutosave)&&e.strings||{}});var t=function(){var e=window.ffcFormMetaAutosave;return e&&e.ajaxUrl&&e.postId?{action:e.action||"ffc_update_form_meta",payload:{post_id:e.postId},request:{nonce:e.nonce,ajaxUrl:e.ajaxUrl},strings:e.strings||{}}:null}();t&&a("data-ffc-autosave-form-key",t)}}(jQuery);
//# sourceMappingURL=ffc-admin-autosave.min.js.map
\ No newline at end of file
diff --git a/assets/js/ffc-quiz-leave.js b/assets/js/ffc-quiz-leave.js
index 855b5a073..f6c38a4d6 100644
--- a/assets/js/ffc-quiz-leave.js
+++ b/assets/js/ffc-quiz-leave.js
@@ -1,14 +1,23 @@
/**
- * FFC quiz — clear the answers when the participant leaves the window (#1731).
+ * FFC quiz — clear the answers when the participant leaves the window
+ * (#1731, #1745).
*
* A form carrying `data-ffc-quiz-leave` (a JSON list of the scored question
- * names) watches `visibilitychange`, not `blur`: a system notification, a
- * screen reader or a click inside an embedded video blurs the window without
- * the person leaving it. Once the participant has started, leaving the page:
+ * names) watches the participant once they have started. Two levels, read
+ * from `data-ffc-quiz-leave-level`:
*
- * - counts one exit in the hidden `ffc_quiz_focus_losses` input, kept in
- * sessionStorage so a reload does not reset it;
- * - on return, clears the scored answers and opens the dialog that says why.
+ * - Moderate (`1`): `visibilitychange` to hidden — another tab, a minimised
+ * browser. Not `blur`: a system notification, a screen reader or a click
+ * inside an embedded video blurs the window without the person leaving it.
+ * - Strict (`2`): also the window's `blur`, so two windows side by side are
+ * caught. A blur counts only when the focus stays away longer than
+ * `data-ffc-quiz-leave-grace` milliseconds, and never when the focus moved
+ * into an iframe of the page itself (a video, the ALTCHA widget).
+ *
+ * Each departure counts once in the hidden `ffc_quiz_focus_losses` input,
+ * kept in sessionStorage so a reload does not reset it. On return the scored
+ * answers are cleared and a dialog says why; its "Start again" reloads the
+ * page, so options marked to shuffle are shuffled again.
*
* Only the scored answers are cleared; the name, the CPF/RF and the other
* fields are the participant's. It is a deterrent, not a lock: another device
@@ -21,6 +30,9 @@
'use strict';
var STORAGE_PREFIX = 'ffc_quiz_leaves_';
+ var STRICT = '2';
+
+ var api = {};
function storageKey(form) {
var id = form.querySelector('input[name="form_id"]');
@@ -57,6 +69,11 @@
}
}
+ function grace(form) {
+ var n = parseInt(form.getAttribute('data-ffc-quiz-leave-grace'), 10);
+ return isNaN(n) || n < 0 ? 0 : n;
+ }
+
/**
* Clear one question's answer, whatever its control.
*/
@@ -89,17 +106,22 @@
}
}
- function closeDialog(form) {
- var overlay = form.querySelector('.ffc-quiz-leave-overlay');
- if (overlay) {
- overlay.hidden = true;
- }
- var first = form.querySelector('input:not([type="hidden"]), select, textarea');
- if (first) {
- first.focus();
- }
+ /**
+ * Whether the focus went into a frame of this page rather than away
+ * from it: the window blurs in both cases.
+ */
+ function focusIsInPageFrame() {
+ var active = document.activeElement;
+ return !!active && active.tagName === 'IFRAME';
}
+ /**
+ * Reload the page. A property of the API so a test can observe it.
+ */
+ api.reload = function() {
+ window.location.reload();
+ };
+
/**
* Watch one form. Returns the visibility handler, for tests.
*/
@@ -109,8 +131,12 @@
}
form.setAttribute('data-ffc-quiz-leave-bound', '1');
+ var strict = form.getAttribute('data-ffc-quiz-leave-level') === STRICT;
+ var graceMs = grace(form);
var started = false;
var left = false;
+ var reloading = false;
+ var blurTimer = null;
writeCount(form, readCount(form));
form.addEventListener('input', function() {
@@ -123,38 +149,107 @@
var restart = form.querySelector('.ffc-quiz-leave-restart');
if (restart) {
restart.addEventListener('click', function() {
- closeDialog(form);
+ // Unloading hides the page: that is not a departure.
+ reloading = true;
+ api.reload();
+ });
+ }
+
+ function cancelBlur() {
+ if (blurTimer !== null) {
+ window.clearTimeout(blurTimer);
+ blurTimer = null;
+ return true;
+ }
+ return false;
+ }
+
+ function depart() {
+ cancelBlur();
+ if (!started || left || reloading) {
+ return;
+ }
+ left = true;
+ writeCount(form, readCount(form) + 1);
+ }
+
+ function comeBack() {
+ if (!left) {
+ return;
+ }
+ left = false;
+ questions(form).forEach(function(name) {
+ clearQuestion(form, name);
});
+ openDialog(form);
+ }
+
+ function detached() {
+ if (document.documentElement.contains(form)) {
+ return false;
+ }
+ stop();
+ return true;
+ }
+
+ function onBlur() {
+ if (detached()) {
+ return;
+ }
+ if (!started || left || reloading || focusIsInPageFrame()) {
+ return;
+ }
+ cancelBlur();
+ if (graceMs === 0) {
+ depart();
+ return;
+ }
+ blurTimer = window.setTimeout(function() {
+ blurTimer = null;
+ depart();
+ }, graceMs);
+ }
+
+ function onFocus() {
+ if (detached()) {
+ return;
+ }
+ // Back within the grace: the loss does not count.
+ if (cancelBlur()) {
+ return;
+ }
+ comeBack();
+ }
+
+ function stop() {
+ cancelBlur();
+ document.removeEventListener('visibilitychange', onVisibility);
+ window.removeEventListener('blur', onBlur);
+ window.removeEventListener('focus', onFocus);
+ try {
+ window.sessionStorage.removeItem(storageKey(form));
+ } catch (e) {
+ // Nothing to clean up without storage.
+ }
}
function onVisibility() {
// A submitted form is replaced by the result; stop watching it.
- if (!document.documentElement.contains(form)) {
- document.removeEventListener('visibilitychange', onVisibility);
- try {
- window.sessionStorage.removeItem(storageKey(form));
- } catch (e) {
- // Nothing to clean up without storage.
- }
+ if (detached()) {
return;
}
if (document.visibilityState === 'hidden') {
- if (started) {
- left = true;
- writeCount(form, readCount(form) + 1);
- }
+ depart();
return;
}
- if (left) {
- left = false;
- questions(form).forEach(function(name) {
- clearQuestion(form, name);
- });
- openDialog(form);
- }
+ comeBack();
}
document.addEventListener('visibilitychange', onVisibility);
+ if (strict) {
+ window.addEventListener('blur', onBlur);
+ window.addEventListener('focus', onFocus);
+ }
return onVisibility;
}
@@ -163,7 +258,9 @@
}
// Not on window.FFC: this file may load before ffc-core.js (#1739).
- window.ffcQuizLeave = { init: init, watch: watch };
+ api.init = init;
+ api.watch = watch;
+ window.ffcQuizLeave = api;
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
diff --git a/assets/js/ffc-quiz-leave.min.js b/assets/js/ffc-quiz-leave.min.js
index 9c42bb8da..6dec6005c 100644
--- a/assets/js/ffc-quiz-leave.min.js
+++ b/assets/js/ffc-quiz-leave.min.js
@@ -1,2 +1,2 @@
-!function(e,t){"use strict";function n(e){var t=e.querySelector('input[name="form_id"]');return"ffc_quiz_leaves_"+(t?t.value:e.id)}function r(t){try{var r=parseInt(e.sessionStorage.getItem(n(t)),10);return isNaN(r)||r<0?0:r}catch(e){return 0}}function a(t,r){var a=t.querySelector(".ffc-quiz-focus-losses");a&&(a.value=String(r));try{e.sessionStorage.setItem(n(t),String(r))}catch(e){}}function i(i){if("1"===i.getAttribute("data-ffc-quiz-leave-bound"))return null;i.setAttribute("data-ffc-quiz-leave-bound","1");var c=!1,u=!1;a(i,r(i)),i.addEventListener("input",function(){c=!0}),i.addEventListener("change",function(){c=!0});var o=i.querySelector(".ffc-quiz-leave-restart");function f(){if(t.documentElement.contains(i))"hidden"!==t.visibilityState?u&&(u=!1,function(e){try{var t=JSON.parse(e.getAttribute("data-ffc-quiz-leave")||"[]");return Array.isArray(t)?t.map(String):[]}catch(e){return[]}}(i).forEach(function(t){!function(t,n){var r=e.CSS&&e.CSS.escape?e.CSS.escape(n):n,a=t.querySelectorAll('[name="'+r+'"], [name="'+r+'\\[\\]"]');Array.prototype.forEach.call(a,function(e){"radio"===e.type||"checkbox"===e.type?(e.checked=!1,e.disabled=!1):"SELECT"===e.tagName?e.selectedIndex=e.options.length&&""===e.options[0].value?0:-1:e.value="",e.dispatchEvent(new Event("input",{bubbles:!0})),e.dispatchEvent(new Event("change",{bubbles:!0}))})}(i,t)}),function(e){var t=e.querySelector(".ffc-quiz-leave-overlay");if(t){t.hidden=!1;var n=t.querySelector(".ffc-quiz-leave-restart");n&&n.focus()}}(i)):c&&(u=!0,a(i,r(i)+1));else{t.removeEventListener("visibilitychange",f);try{e.sessionStorage.removeItem(n(i))}catch(e){}}}return o&&o.addEventListener("click",function(){!function(e){var t=e.querySelector(".ffc-quiz-leave-overlay");t&&(t.hidden=!0);var n=e.querySelector('input:not([type="hidden"]), select, textarea');n&&n.focus()}(i)}),t.addEventListener("visibilitychange",f),f}function c(){Array.prototype.forEach.call(t.querySelectorAll("form[data-ffc-quiz-leave]"),i)}e.ffcQuizLeave={init:c,watch:i},"loading"===t.readyState?t.addEventListener("DOMContentLoaded",c):c()}(window,document);
+!function(e,t){"use strict";var n={};function r(e){var t=e.querySelector('input[name="form_id"]');return"ffc_quiz_leaves_"+(t?t.value:e.id)}function a(t){try{var n=parseInt(e.sessionStorage.getItem(r(t)),10);return isNaN(n)||n<0?0:n}catch(e){return 0}}function i(t,n){var a=t.querySelector(".ffc-quiz-focus-losses");a&&(a.value=String(n));try{e.sessionStorage.setItem(r(t),String(n))}catch(e){}}function u(u){if("1"===u.getAttribute("data-ffc-quiz-leave-bound"))return null;u.setAttribute("data-ffc-quiz-leave-bound","1");var c="2"===u.getAttribute("data-ffc-quiz-leave-level"),o=function(e){var t=parseInt(e.getAttribute("data-ffc-quiz-leave-grace"),10);return isNaN(t)||t<0?0:t}(u),l=!1,f=!1,s=!1,v=null;i(u,a(u)),u.addEventListener("input",function(){l=!0}),u.addEventListener("change",function(){l=!0});var d=u.querySelector(".ffc-quiz-leave-restart");function y(){return null!==v&&(e.clearTimeout(v),v=null,!0)}function S(){y(),!l||f||s||(f=!0,i(u,a(u)+1))}function E(){f&&(f=!1,function(e){try{var t=JSON.parse(e.getAttribute("data-ffc-quiz-leave")||"[]");return Array.isArray(t)?t.map(String):[]}catch(e){return[]}}(u).forEach(function(t){!function(t,n){var r=e.CSS&&e.CSS.escape?e.CSS.escape(n):n,a=t.querySelectorAll('[name="'+r+'"], [name="'+r+'\\[\\]"]');Array.prototype.forEach.call(a,function(e){"radio"===e.type||"checkbox"===e.type?(e.checked=!1,e.disabled=!1):"SELECT"===e.tagName?e.selectedIndex=e.options.length&&""===e.options[0].value?0:-1:e.value="",e.dispatchEvent(new Event("input",{bubbles:!0})),e.dispatchEvent(new Event("change",{bubbles:!0}))})}(u,t)}),function(e){var t=e.querySelector(".ffc-quiz-leave-overlay");if(t){t.hidden=!1;var n=t.querySelector(".ffc-quiz-leave-restart");n&&n.focus()}}(u))}function m(){return!t.documentElement.contains(u)&&(function(){y(),t.removeEventListener("visibilitychange",h),e.removeEventListener("blur",b),e.removeEventListener("focus",g);try{e.sessionStorage.removeItem(r(u))}catch(e){}}(),!0)}function b(){var n;m()||(!l||f||s||(n=t.activeElement)&&"IFRAME"===n.tagName||(y(),0!==o?v=e.setTimeout(function(){v=null,S()},o):S()))}function g(){m()||y()||E()}function h(){m()||("hidden"!==t.visibilityState?E():S())}return d&&d.addEventListener("click",function(){s=!0,n.reload()}),t.addEventListener("visibilitychange",h),c&&(e.addEventListener("blur",b),e.addEventListener("focus",g)),h}function c(){Array.prototype.forEach.call(t.querySelectorAll("form[data-ffc-quiz-leave]"),u)}n.reload=function(){e.location.reload()},n.init=c,n.watch=u,e.ffcQuizLeave=n,"loading"===t.readyState?t.addEventListener("DOMContentLoaded",c):c()}(window,document);
//# sourceMappingURL=ffc-quiz-leave.min.js.map
\ No newline at end of file
diff --git a/includes/admin/class-ffc-admin-ui.php b/includes/admin/class-ffc-admin-ui.php
index f629dc993..f5240728d 100644
--- a/includes/admin/class-ffc-admin-ui.php
+++ b/includes/admin/class-ffc-admin-ui.php
@@ -127,6 +127,102 @@ public static function render_toggle( array $args ): void {
echo '';
}
+ /**
+ * Palettes a three-position switch can wear (#1745), passed as `palette`.
+ * Each colours the knob through the `ffc-tri-toggle-` class.
+ *
+ * - `severity`: grey, amber, red -- the further right, the harsher.
+ * - `traffic`: red, amber, green -- a traffic light, for a scale where
+ * the right-hand end is the good one.
+ */
+ public const TRI_PALETTES = array( 'severity', 'traffic' );
+
+ /**
+ * Render a three-position switch: a track and a knob whose position and
+ * colour say which of three ordered values is chosen (#1745).
+ *
+ * Underneath are three native radios, so the arrow keys, screen readers
+ * and forced colours work, and the form posts the value without any
+ * script. The chosen value's name and its description sit beside the
+ * switch and are swapped by CSS alone. Use it for an ordered scale --
+ * off, moderate, strict -- not for three unrelated choices, which a
+ * position and a colour would misrepresent.
+ *
+ * For autosave pass `data-ffc-autosave-key` (or `-form-key`) in `data`:
+ * it lands on each radio, and the widget saves the group as one field.
+ *
+ * @param array $args Render arguments -- `name` (required),
+ * `options` (required: exactly three
+ * value => label pairs, mildest first),
+ * `value` (the chosen value; the first
+ * option when it is not one of them),
+ * `id` (optional base id, derived from
+ * `name`), `legend` (optional group
+ * name read by screen readers),
+ * `palette` (optional, a
+ * {@see self::TRI_PALETTES} key, default
+ * `severity`), `descriptions` (optional
+ * value => text), `disabled` (optional
+ * bool), `data` (optional data-*
+ * attributes on each radio).
+ */
+ public static function render_tri_toggle( array $args ): void {
+ $name = is_string( $args['name'] ?? null ) ? $args['name'] : '';
+ $options = is_array( $args['options'] ?? null ) ? $args['options'] : array();
+ if ( '' === $name || 3 !== count( $options ) ) {
+ return;
+ }
+ $values = array_map( 'strval', array_keys( $options ) );
+ $value = (string) ( $args['value'] ?? '' );
+ $value = in_array( $value, $values, true ) ? $value : $values[0];
+ $base_id = is_string( $args['id'] ?? null ) && '' !== $args['id'] ? $args['id'] : trim( (string) preg_replace( '/[^a-z0-9_-]+/i', '-', $name ), '-' );
+ $palette = in_array( $args['palette'] ?? null, self::TRI_PALETTES, true ) ? (string) $args['palette'] : self::TRI_PALETTES[0];
+ $legend = is_string( $args['legend'] ?? null ) ? $args['legend'] : '';
+ $descs = is_array( $args['descriptions'] ?? null ) ? $args['descriptions'] : array();
+ $data = is_array( $args['data'] ?? null ) ? $args['data'] : array();
+
+ $data_attrs = '';
+ foreach ( $data as $k => $v ) {
+ $data_attrs .= ' data-' . esc_attr( (string) $k ) . '="' . esc_attr( (string) $v ) . '"';
+ }
+
+ printf( '', esc_attr( $palette ) );
+ if ( '' !== $legend ) {
+ echo '' . esc_html( $legend ) . ' ';
+ }
+ foreach ( $values as $i => $v ) {
+ printf(
+ ' ',
+ esc_attr( $base_id . '-' . ( $i + 1 ) ),
+ esc_attr( $name ),
+ esc_attr( $v ),
+ $v === $value ? ' checked' : '',
+ ! empty( $args['disabled'] ) ? ' disabled' : '',
+ $data_attrs // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- pre-escaped above.
+ );
+ }
+ echo '';
+ foreach ( $values as $i => $v ) {
+ printf(
+ '%2$s ',
+ esc_attr( $base_id . '-' . ( $i + 1 ) ),
+ esc_html( (string) $options[ $v ] )
+ );
+ }
+ echo ' ';
+ echo '';
+ foreach ( $values as $i => $v ) {
+ printf( '%2$s ', (int) $i + 1, esc_html( (string) $options[ $v ] ) );
+ }
+ echo ' ';
+ foreach ( $values as $i => $v ) {
+ if ( isset( $descs[ $v ] ) && '' !== (string) $descs[ $v ] ) {
+ printf( '%2$s ', (int) $i + 1, esc_html( (string) $descs[ $v ] ) );
+ }
+ }
+ echo ' ';
+ }
+
/**
* Same as {@see self::render_toggle()} but returns the markup as a string
* instead of echoing — for callers that build an HTML string.
diff --git a/includes/admin/class-ffc-form-editor-quiz-metabox.php b/includes/admin/class-ffc-form-editor-quiz-metabox.php
index b16154844..562ccb660 100644
--- a/includes/admin/class-ffc-form-editor-quiz-metabox.php
+++ b/includes/admin/class-ffc-form-editor-quiz-metabox.php
@@ -41,7 +41,7 @@ public function render( WP_Post $post ): void {
$quiz_max_attempts = $config['quiz_max_attempts'] ?? '0';
$quiz_show_score = ( $config['quiz_show_score'] ?? '1' ) === '1';
$quiz_show_correct = ( $config['quiz_show_correct'] ?? '0' ) === '1';
- $quiz_reset_leave = ( $config['quiz_reset_on_leave'] ?? '0' ) === '1';
+ $quiz_leave_level = \FreeFormCertificate\Core\QuizLeaveLevel::sanitize( $config['quiz_reset_on_leave'] ?? '0' );
?>
diff --git a/includes/admin/class-ffc-form-editor-save-handler.php b/includes/admin/class-ffc-form-editor-save-handler.php
index 9f3749904..9f77d2996 100644
--- a/includes/admin/class-ffc-form-editor-save-handler.php
+++ b/includes/admin/class-ffc-form-editor-save-handler.php
@@ -326,8 +326,9 @@ private function save_config_meta( int $post_id ): void {
$clean_config['quiz_max_attempts'] = absint( ArrayValue::int( $config, 'quiz_max_attempts', 0 ) );
$clean_config['quiz_show_score'] = isset( $config['quiz_show_score'] ) ? '1' : '0';
$clean_config['quiz_show_correct'] = isset( $config['quiz_show_correct'] ) ? '1' : '0';
- // Clear the answers when the participant leaves the window (#1731).
- $clean_config['quiz_reset_on_leave'] = isset( $config['quiz_reset_on_leave'] ) ? '1' : '0';
+ // Clear the answers when the participant leaves the window
+ // (#1731): Off / Moderate / Strict since #1745.
+ $clean_config['quiz_reset_on_leave'] = \FreeFormCertificate\Core\QuizLeaveLevel::sanitize( $config['quiz_reset_on_leave'] ?? '0' );
}
// Tag Validation (server-side backstop): warn if the layout is
diff --git a/includes/admin/class-ffc-form-meta-ajax-endpoint.php b/includes/admin/class-ffc-form-meta-ajax-endpoint.php
index 1d459f31a..c52bd474e 100644
--- a/includes/admin/class-ffc-form-meta-ajax-endpoint.php
+++ b/includes/admin/class-ffc-form-meta-ajax-endpoint.php
@@ -65,7 +65,10 @@ public static function init(): void {
*
* Adding a new auto-saveable toggle is a single-line append here.
*
- * @return array}>
+ * - 'type' — optional; 'enum' with an 'options' list for a radio
+ * group (#1745). Absent means a '1' / '0' toggle.
+ *
+ * @return array, type?: string, options?: array}>
*/
public static function allowlist(): array {
return array(
@@ -116,6 +119,13 @@ public static function allowlist(): array {
'meta' => '_ffc_form_config',
'path' => array( 'quiz_enabled' ),
),
+ // Off / Moderate / Strict (#1745) -- a radio group, not a toggle.
+ 'quiz_reset_on_leave' => array(
+ 'meta' => '_ffc_form_config',
+ 'path' => array( 'quiz_reset_on_leave' ),
+ 'type' => 'enum',
+ 'options' => \FreeFormCertificate\Core\QuizLeaveLevel::LEVELS,
+ ),
'restriction_password' => array(
'meta' => '_ffc_form_config',
'path' => array( 'restrictions', 'password' ),
@@ -189,16 +199,25 @@ public static function handle(): void {
wp_send_json_error( array( 'message' => __( 'This toggle is not exposed for incremental updates.', 'ffcertificate' ) ), 403 );
}
- // Normalise to '1' / '0' string — the rest of the plugin reads
- // these toggles via `'1' === (string) $meta`, so we persist the
- // canonical string form. `sanitize_value` returns a native bool;
- // cast it to the canonical string here.
- // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitised on the next line by SettingsAjaxEndpoint::sanitize_value() against the allowlisted type.
+ // A toggle normalises to the '1' / '0' string -- the rest of the
+ // plugin reads these via `'1' === (string) $meta` -- and
+ // `sanitize_value` returns a native bool, cast below.
+ // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitised below by SettingsAjaxEndpoint::sanitize_value() against the allowlisted type.
$raw_value = isset( $_POST['value'] ) ? wp_unslash( $_POST['value'] ) : '';
- $value = SettingsAjaxEndpoint::sanitize_value( $raw_value, 'bool' ) ? '1' : '0';
+ $entry = $allowlist[ $key ];
+
+ // A toggle is a bool stored as '1' / '0'; a radio group (#1745)
+ // carries a closed list and stores the chosen member as is.
+ if ( 'enum' === ( $entry['type'] ?? 'bool' ) ) {
+ $value = SettingsAjaxEndpoint::sanitize_value( $raw_value, 'enum', $entry );
+ if ( null === $value ) {
+ wp_send_json_error( array( 'message' => __( 'That value is not one of the choices.', 'ffcertificate' ) ), 400 );
+ }
+ } else {
+ $value = SettingsAjaxEndpoint::sanitize_value( $raw_value, 'bool' ) ? '1' : '0';
+ }
- $entry = $allowlist[ $key ];
- $path = $entry['path'];
+ $path = $entry['path'];
if ( empty( $path ) ) {
update_post_meta( $post_id, $entry['meta'], $value );
diff --git a/includes/admin/class-ffc-settings-ajax-endpoint.php b/includes/admin/class-ffc-settings-ajax-endpoint.php
index 3119d2200..88ee3d75c 100644
--- a/includes/admin/class-ffc-settings-ajax-endpoint.php
+++ b/includes/admin/class-ffc-settings-ajax-endpoint.php
@@ -333,6 +333,14 @@ public static function allowlist(): array {
'string',
array( 'as' => 'multiline_text' ),
),
+ // Certificates tab — the Strict quiz level's grace (#1745).
+ 'quiz_focus_grace_ms' => array(
+ 'int',
+ array(
+ 'min' => \FreeFormCertificate\Core\QuizLeaveLevel::GRACE_MIN_MS,
+ 'max' => \FreeFormCertificate\Core\QuizLeaveLevel::GRACE_MAX_MS,
+ ),
+ ),
'public_csv_sync_max_rows' => array(
'int',
array(
@@ -584,6 +592,9 @@ public static function handle(): void {
}
$value = self::sanitize_value( $raw_value, $entry['type'] ?? 'bool', $entry );
+ if ( null === $value ) {
+ wp_send_json_error( array( 'message' => __( 'That value is not one of the choices.', 'ffcertificate' ) ), 400 );
+ }
// Optional bool inversion — the SMTP tab's "Ativar envios" toggle is
// stored on disk as `disable_all_emails` for historical reasons, so the
@@ -643,6 +654,9 @@ private static function set_nested( array &$arr, array $path, $value ): void {
* - 'string' — defaults to `sanitize_text_field`. The `$entry['as']`
* key can switch behaviour: 'url' → `esc_url_raw`,
* 'multiline_text' → `sanitize_textarea_field`.
+ * - 'enum' — one of `$entry['options']`, compared as strings; anything
+ * else returns null, which the handlers refuse with a 400
+ * (#1745). For a radio group whose values are a closed list.
*
* @param mixed $raw Raw POST value (already wp_unslash'd).
* @param string $type Allowlist entry type.
@@ -708,6 +722,10 @@ public static function sanitize_value( $raw, string $type, array $entry = array(
}
return $values;
+ case 'enum':
+ $options = isset( $entry['options'] ) && is_array( $entry['options'] ) ? array_map( 'strval', $entry['options'] ) : array();
+ return is_scalar( $raw ) && in_array( (string) $raw, $options, true ) ? (string) $raw : null;
+
default:
return null;
}
diff --git a/includes/admin/class-ffc-settings-save-handler.php b/includes/admin/class-ffc-settings-save-handler.php
index 8058ad6bf..27f50c0dd 100644
--- a/includes/admin/class-ffc-settings-save-handler.php
+++ b/includes/admin/class-ffc-settings-save-handler.php
@@ -202,6 +202,12 @@ private function save_general_settings( array $clean, array $new ): array {
$clean['required_form_fields'] = self::sanitize_required_form_fields( $raw_settings['required_form_fields'] );
}
+ // The Strict quiz level's grace (#1745). An emptied field is not 0:
+ // it keeps the stored value, as every bounded number here does.
+ if ( 'certificates' === $ffc_tab && isset( $raw_settings['quiz_focus_grace_ms'] ) && is_scalar( $raw_settings['quiz_focus_grace_ms'] ) && '' !== trim( (string) $raw_settings['quiz_focus_grace_ms'] ) ) {
+ $clean['quiz_focus_grace_ms'] = \FreeFormCertificate\Core\QuizLeaveLevel::clamp_grace( absint( $raw_settings['quiz_focus_grace_ms'] ) );
+ }
+
if ( 'advanced' === $ffc_tab ) {
$clean['enable_activity_log'] = isset( $new['enable_activity_log'] ) ? 1 : 0;
diff --git a/includes/admin/class-ffc-settings.php b/includes/admin/class-ffc-settings.php
index 193933f57..6c115ac86 100644
--- a/includes/admin/class-ffc-settings.php
+++ b/includes/admin/class-ffc-settings.php
@@ -281,6 +281,7 @@ public function get_default_settings(): array {
'cleanup_enabled' => false,
'validate_rf_check_digit' => false,
'cleanup_days' => 365,
+ 'quiz_focus_grace_ms' => 1000,
'smtp_mode' => 'wp',
'smtp_host' => '',
'smtp_port' => 587,
diff --git a/includes/core/class-ffc-quiz-leave-level.php b/includes/core/class-ffc-quiz-leave-level.php
new file mode 100644
index 000000000..134d47648
--- /dev/null
+++ b/includes/core/class-ffc-quiz-leave-level.php
@@ -0,0 +1,99 @@
+
+ */
+ public const LEVELS = array( self::OFF, self::MODERATE, self::STRICT );
+
+ /**
+ * Default grace before a lost focus counts, in milliseconds.
+ */
+ public const GRACE_DEFAULT_MS = 1000;
+
+ /**
+ * Smallest grace: every loss counts.
+ */
+ public const GRACE_MIN_MS = 0;
+
+ /**
+ * Largest grace.
+ */
+ public const GRACE_MAX_MS = 10000;
+
+ /**
+ * A stored or posted level, or Off when it is not one.
+ *
+ * @param mixed $raw Raw value.
+ */
+ public static function sanitize( $raw ): string {
+ $value = is_scalar( $raw ) ? (string) $raw : '';
+ return in_array( $value, self::LEVELS, true ) ? $value : self::OFF;
+ }
+
+ /**
+ * The level a form is set to. A form that is not a quiz has none.
+ *
+ * @param array $form_config Form configuration.
+ */
+ public static function of( array $form_config ): string {
+ if ( '1' !== ( $form_config['quiz_enabled'] ?? '' ) ) {
+ return self::OFF;
+ }
+ return self::sanitize( $form_config['quiz_reset_on_leave'] ?? self::OFF );
+ }
+
+ /**
+ * A grace value clamped to its bounds.
+ *
+ * @param int $ms Milliseconds.
+ */
+ public static function clamp_grace( int $ms ): int {
+ return max( self::GRACE_MIN_MS, min( self::GRACE_MAX_MS, $ms ) );
+ }
+}
diff --git a/includes/frontend/class-ffc-shortcodes.php b/includes/frontend/class-ffc-shortcodes.php
index 6a1fb5289..f6216cefb 100644
--- a/includes/frontend/class-ffc-shortcodes.php
+++ b/includes/frontend/class-ffc-shortcodes.php
@@ -213,6 +213,7 @@ public function render_form( array $atts ): string {
$form_config = get_post_meta( $form_id, '_ffc_form_config', true );
$quiz_leave = $this->quiz_leave_questions( is_array( $form_config ) ? $form_config : array(), $fields );
+ $leave_level = \FreeFormCertificate\Core\QuizLeaveLevel::of( is_array( $form_config ) ? $form_config : array() );
ob_start();
?>
@@ -235,10 +236,10 @@ public function render_form( array $atts ): string {
-