diff --git a/.github/scripts/ffc-compile-translations.php b/.github/scripts/ffc-compile-translations.php index edc1157ba..ea3dbc43e 100644 --- a/.github/scripts/ffc-compile-translations.php +++ b/.github/scripts/ffc-compile-translations.php @@ -12,10 +12,14 @@ * conversion each time. * * The `.mo` comes from GNU gettext's `msgfmt --check`. The `.l10n.php` is - * written here, in the shape Loco writes it (the headers, then `messages` in - * the `.po`'s order, on one line), from the same `.po` reader the guards use, so the - * compiler and the guard cannot disagree about what an entry is. Only - * translated, non-fuzzy entries are written, as `msgfmt` does. + * written here in `wp i18n make-php`'s shape, byte for byte (#1721): `domain` + * (WP-CLI reads it from the `.po`'s `X-Domain` header), then the headers in + * FFC_L10N_HEADERS the `.po` carries, then `messages` in the `.po`'s order, on + * one line. Loco writes the same shape, so a catalogue compiled here, saved + * from Loco or made by WP-CLI is the same file. It reads the `.po` through the + * reader the guards use, so the compiler and the guard cannot disagree about + * what an entry is. Only translated, non-fuzzy entries are written, as + * `msgfmt` does. * * @package FreeFormCertificate\Build */ @@ -26,6 +30,11 @@ use FreeFormCertificate\Tests\Support\PoCatalogue; +/** + * The headers `wp i18n make-php` writes after `domain`, in its order. + */ +const FFC_L10N_HEADERS = array( 'plural-forms', 'language', 'project-id-version', 'pot-creation-date', 'po-revision-date', 'x-generator' ); + $root = dirname( __DIR__, 2 ); $files = glob( $root . '/languages/*.po' ) ?: array(); if ( array() === $files ) { @@ -49,13 +58,17 @@ } } - $pairs = array(); - foreach ( ffc_po_headers( $po ) as $name => $value ) { - $pairs[] = var_export( $name, true ) . '=>' . var_export( $value, true ); + $headers = ffc_po_headers( $po ); + $pairs = array( "'domain'=>" . var_export( $headers['x-domain'] ?? null, true ) ); + foreach ( FFC_L10N_HEADERS as $name ) { + if ( isset( $headers[ $name ] ) ) { + $pairs[] = var_export( $name, true ) . '=>' . var_export( $headers[ $name ], true ); + } } $items = array(); foreach ( $messages as $key => $value ) { - $items[] = var_export( (string) $key, true ) . '=>' . var_export( $value, true ); + // An integer-like key is written bare, as PHP and WP-CLI write it: `302=>`. + $items[] = var_export( $key, true ) . '=>' . var_export( $value, true ); } $pairs[] = "'messages'=>[" . implode( ',', $items ) . ']'; diff --git a/CHANGELOG.md b/CHANGELOG.md index 15a300dd7..0eb8efca5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,33 @@ The format follows [Keep a Changelog] (https://keepachangelog.com/en/1.1.0/). ## [Unreleased] -## [6.38.0] (2026-10-12) +## [6.39.0] (2026-10-13) + +### Added + +- **The plugin has an icon on Dashboard → Updates and in the plugin list** (#1712). A certificate with a seal, white on blue, replaces WordPress's grey placeholder, read from the installed copy. `assets/img/brand/` also ships black, white, dark-screen and no-background variants, each as SVG and as 128 px and 256 px PNG. +- **"View details" shows a banner, the readme's tabs and screenshots in place, in Portuguese too** (#1714, #1716). Description, Installation, FAQ, Screenshots and Other notes come from the offered release's `readme.txt` (or `languages/readme-pt_BR.txt` for a pt_BR viewer), the changelog renders its Markdown, and a screenshot opens in an overlay with arrows, swipe and zoom. +- **Choice fields take one option per row, and every field can carry limits** (#1729). Options may contain commas and can be shuffled per participant; a checkbox can cap how many are ticked; text and textarea take a length range (server ceilings 255 and 2,000) with a live counter; number and date take a range. A "Checkbox" field now renders as a group of boxes instead of one text box, and the server enforces every field's rules, not only the browser. +- **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, with new tokens `{{correct_count}}` and `{{question_count}}`; existing forms score as before. +- **A quiz can clear its answers when the participant leaves** (#1731, #1745). Leaving the Window is Off / Moderate / Strict: Moderate reacts to switching tabs, Strict also to a second window side by side, after a grace set on Settings → Certificates. The form warns first, Start again reloads and reshuffles, and the count is 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`. + +### Changed + +- **Required tags and required fields have their own Settings → Certificates tab** (#1734, #1741, #1736). The layout tags moved from Advanced, one per line, and the layout and template screens list them instead of a fixed three. Apart from them, the fields every form needs (default `name`, `cpf_rf`, `email`) have a label and a locked type: new forms start with them, the editor adds missing ones, and they are badged, always required and cannot be removed. +- **Settings use one family of controls** (#1745, #1748, #1750). An on/off is a toggle (`.ffc-control-toggle`, with a hover halo, a greyed disabled state and an optional check / cross mark); an ordered scale is a steps rail (the geofence display modes, the private-calendar displays, the IP API fallback); a short unordered choice is a segmented row (Dark Mode, Code Editor Theme, Time Behavior). Stored values are unchanged. +- **Form fields follow the form's font, and Public Design offers Arial** (#1727). Fields, selects and buttons inherit the font the labels use instead of the browser's; the font is the theme's (default), the plugin's system font or Arial, as in Email Signature Generator and Institutional Email. +- **Tests and translation files are steadier** (#1719, #1721, #1718). Clock-reading tests no longer fail when a run crosses a boundary, the compiled `.l10n.php` is `wp i18n make-php`'s shape byte for byte, and a `readme.txt` change carries its pt_BR copy in the same PR. + +### Fixed + +- **Dark mode reaches what core paints on its own** (#1723, #1725). Admin screens declare `color-scheme: dark`; links, notices, buttons, the colour picker, checkboxes, the Publish box, row actions and Screen Options follow the palette, and Personal Calendars and Certificate templates, WordPress post screens the toggle never reached, turn dark with their e-mail editor. +- **The standard fields validate as they claim** (#1734). An invalid CPF/RF blocks the submit and its message stays until corrected; an invalid email says so instead of "Email address is required."; a name needs at least two words and 4 characters, in the browser and on the server. +- **A certificate form submits again** (#1739). A script printed before `ffc-core.js` that created the `FFC` namespace made the core skip its own API, so every submit failed on `FFC.request is not a function`. +- **A quiz attempt that did not pass is no longer a certificate** (#1744). It was saved as issued and its link emailed before the result was known, and its code verified; the email, verification, the REST lookup and the user dashboard now skip it. +- **The dashboard's notification toggles can be reached by keyboard** (#1748). They used a second toggle that hid its checkbox with `display: none`; they now use the plugin's one toggle. + +## [6.38.0] (2026-10-12) — `529e80a1` The licence moves to AGPLv3 or later. Identity resolution names each number in "One address, several people" and can consolidate a candidate imported twice, the recruitment CSV import honours the RF check digit, and a manage-only role reaches the Reregistration screen. Behind the screens, tests now cover error paths across the plugin and the PHP coverage floor rises to 90%. diff --git a/CLAUDE.md b/CLAUDE.md index 1457af57d..85312a1c7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -72,6 +72,8 @@ Don't poll CI manually after step 2 unless the user asks. The webhook subscripti **Documentation travels with the change, in the same PR.** A PR that changes what an operator sees or configures — a screen, a setting, a default, a capability, a menu, an e-mail — updates the topic under `includes/settings/views/documentation/` that describes it, with its strings in the three catalogues. Measured by #1638: an audit of Settings → Documentation found seven shipped features with no or partial coverage, and five of them had shipped after the previous documentation review without touching a topic. The review that catches drift after the fact is the release cross-check below; the place it is cheapest to prevent is here, while the author still knows what changed. `DocumentationCoverageTest` guards the mechanical half (every tab and module has a topic, the index and the topic files agree); whether a topic tells the truth is not reachable by a test, and the guard says so. +**The translated readme travels with `readme.txt`, in the same PR.** `languages/readme-pt_BR.txt` is what "View details" shows a pt_BR administrator (#1716). `PluginDetailsAssetsTest` holds it to `readme.txt` by structure only — the same tab sections, the same count of other sections, the same screenshot captions — and cannot see a sentence: a changed answer in English passes CI with the translation still saying the old thing (#1718). Content agreement between two languages is not reachable by a test, so the discipline belongs to the PR that changes the English, and the release cross-check below reads the two side by side. + **Closing an issue — leave no false-positive checkboxes.** When an issue closes as `completed`, its acceptance-criteria / delivery checkboxes must reflect reality: either tick every delivered box (`- [x]`) **or** leave a short closing comment that maps each delivered item to the PR that shipped it. An issue that closes with unticked `- [ ]` boxes for work that actually shipped reads as pending to a later scan — this is exactly the false positive reconciled across #249, #647, #649, #650, #697 (delivered work split across separate PRs, boxes never revisited). Legitimately-deferred boxes stay unticked, but the closing comment must name them as deferred (see #711's engine deferral) so "unticked" is never ambiguous between *done* and *dropped*. **`Closes #NNN` does not auto-close in this workflow — close feature issues by hand.** GitHub only auto-closes a linked issue when the PR merges into the repository's **default branch**, which is deliberately kept as `main` (see "Develop branch workflow"), not `develop`. So a feature PR that merges to `develop` with `Closes #NNN` in its body leaves the issue **open**. Close it manually — with the checkbox reconciliation above — as soon as its work lands on `develop` (matching the repo's precedent that issues close on work-complete, e.g. #711 / #591 / #249, not on release-to-prod); do **not** wait for the release PR to carry it to `main`, or done work lingers as an open, unticked issue (the #728 case). Genuinely-future work (a removal scheduled releases out, like #730) correctly stays open — this rule is about work that has actually shipped to `develop`. @@ -160,6 +162,7 @@ When the batch on develop is validated against the testes site and ready to ship - **Rewrite the `== Upgrade Notice ==` entry in `readme.txt` to summarise THIS release, replacing the previous one.** It is what WordPress prints under the plugin on Dashboard → Updates, so it is the only sentence an operator reads before deciding to apply the update — and the only place a ⚠ breaking change can warn them beforehand. **Exactly one entry, naming the version `Stable tag` declares, at most 300 characters**, ending with the section's pointer to `CHANGELOG.md` for the detail and the issues. One entry because `get_latest_release()` fetches `releases/latest`, so an entry for an older version is text no code path can display; 300 because that is the WordPress.org norm, adopted although the directory does not bind us, so publishing there later never means rewriting entries. `ReadmeUpgradeNoticeTest` enforces all three and calls the updater's own parser rather than mirroring it. **This is not a second changelog** — that mirror existed, drifted, and was deleted, which the file's own `== Changelog ==` section records; a 300-character summary of the version being offered is a different artefact from a per-release history, and the pointer is what keeps it honest rather than partial. - **Correct the `@since` tags the batch wrote against the wrong version.** A feature PR cannot know which release it will ship in, so an `@since` written mid-batch names the version `develop` was *sitting at*, not the one the code debuts in. Three classes did this in the 6.25.0 batch (`@since 6.24.0` on code that shipped in 6.25.0), while four others had guessed the next number correctly — so the file disagreed with itself. The release PR is the only moment the number is known; `git diff origin/main...origin/develop -- '*.php' | grep '^+.*@since'` finds them. Nothing else will: no gate reads these, and it was found by accident while looking for something else. - **Cross-check the documentation against the batch.** For each `Added` / `Changed` bullet in the section being released that changes what an operator sees or configures, confirm its topic changed in the batch: `git diff --stat origin/main...origin/develop -- includes/settings/views/documentation` lists the topics that did. A bullet with no matching topic is a gap to close before the tag, not after. This is a narrow check on purpose — rereading every topic each release is the step that gets skipped in silence; the full audit (#1638's method) is a periodic one-off. + - **Cross-check the translated readme.** `git diff origin/main...origin/develop -- readme.txt languages/readme-pt_BR.txt`: a change on one side only is a translation left behind (see "Pull-request workflow"). - Run `npm run build:js` if any JS/CSS in `assets/` changed across the batch and the bundles weren't already rebuilt mid-flight (the "Verify minified assets are up to date" gate would catch this anyway). 3. Auto-merge SQUASH into `main`. The squash commit subject should follow main's convention: `X.Y.Z — `. 4. **Tag the release to publish it.** The GitHub Release + distributable zip are automated — `.github/workflows/release.yml` triggers on pushing a tag matching `v*`: it validates the tag equals the `ffcertificate.php` `Version:` header, builds `ffcertificate-X.Y.Z.zip` (staged via `.distignore`), extracts the `## [X.Y.Z]` section of `CHANGELOG.md` as the release notes, and publishes the GitHub Release. So there is **no manual "create release" step** — after the squash lands on `main`, tag that commit and push: @@ -382,6 +385,8 @@ The `data-ffc-*` seam measured the same way: every apparent dead listener was em A fresh install also makes a check possible that no established install can make honestly: the `ffc_*` tables and options in the database are **exactly** what this activation created, with no legacy residue to explain away. So the comparison against `uninstall.php` runs **both ways** — every declared object must exist, and every existing object must be declared. The second direction found two tables and 21 activation-written options that deletion had never removed; most are written through a constant or a variable, so no static scan could have seen them. The job then deletes the plugin with the Danger Zone opt-in on and asserts the footprint is zero, which makes `uninstall.php` an **enforced manifest** rather than a list nothing checks. +**It runs locally too, minus its last step.** A cloud session's container ships MariaDB (started by the environment's setup script, credentials `root` / `root` as in CI): install a throwaway WordPress with WP-CLI, symlink this checkout into its `wp-content/plugins`, activate, and run `fresh-install-check.php uninstall.php activate`, `dbdelta-idempotence-check.php ` and `identity-index-invariant-check.php ` — all three passed that way when #1721 measured it. **Never run the job's uninstall step against a symlinked checkout**: `wp plugin uninstall` deletes the plugin directory, which is the repository. And the container's MariaDB is 10.11 where CI pins 11.8, so a local pass is evidence, not the gate. + Three things to know before touching it. **`uninstall.php` is the single manifest** — `.github/scripts/ffc-uninstall-manifest.php` parses it as text (never includes it) and both this job and the post-deploy smoke read it, so the two can't disagree about the footprint; adding a table or option to `uninstall.php` is what covers it everywhere. **The MariaDB service image is a deliberate pin** — the point is to reproduce the provider's dbDelta behaviour, so the smoke prints the host's real `VERSION()` and `@@sql_mode` on every deploy and the pin moves when those drift. It was pinned to `10.11` on a guess and corrected to `11.8` the moment the first smoke reported the host's actual `11.8.8-MariaDB-log` (whose `sql_mode` also lacks `ERROR_FOR_DIVISION_BY_ZERO`) — read the smoke, don't pick a familiar LTS. **It is not a substitute for the smoke**: the runner's MariaDB is not the host's, and only the host has the provider's PHP SAPI and wp-config. The cheap half of the same defect class runs with no database at all in `tests/Unit/ActivatorSqlTest.php`, which enforces two `dbDelta` rules on every `CREATE TABLE` literal: no semicolon before the final one (it splits its input on `;`, truncating the statement), and every line a column or key definition — a blank line or an SQL comment is read as a column and becomes a malformed `ALTER` on every run against an existing table. Measured against a real MariaDB, the three self-scheduling tables produced **41** database errors before that cleanup and 1 after (#997); the survivor is a `Duplicate key name 'validation_code'`, where the CREATE declares a plain `KEY` that `ensure_unique_validation_code_index()` later converts to `UNIQUE`. All of it was latent — every affected activator guards its `dbDelta` call on `table_exists()` — and would fire the day someone adds a column the normal WordPress way. #### dbDelta idempotence gate (#1087) @@ -464,7 +469,7 @@ What it does not see, deliberately: a **single** Portuguese word — `_x( 'ficha It exists because they had already disagreed **in production, for two releases**: the `.po` and `.l10n.php` carried #1209's fix while the shipped `.mo` still said `Estado` and `Agradecimentos`. WordPress reads `.l10n.php` only from **6.5** and this plugin's floor was then **6.4**, so on the floor the defect #1209 existed to fix was never delivered. The floor is **6.8** since #1590, so every supported WordPress now prefers the `.l10n.php`; the guard stays because the `.mo` is still what WordPress loads when the `.l10n.php` is missing or a site forces the format through the `translation_file_format` filter, and what translation tools read — a stale `.mo` is still a wrong translation somewhere. -**Recompile, never hand-edit.** After changing the `.po`, `php .github/scripts/ffc-compile-translations.php` writes the `.mo` (GNU gettext's `msgfmt --check`) and the `.l10n.php` from the same `PoCatalogue` reader this guard uses, so the compiler and the guard cannot disagree about what an entry is (#1675). +**Recompile, never hand-edit.** After changing the `.po`, `php .github/scripts/ffc-compile-translations.php` writes the `.mo` (GNU gettext's `msgfmt --check`) and the `.l10n.php` from the same `PoCatalogue` reader this guard uses, so the compiler and the guard cannot disagree about what an entry is (#1675). **The `.l10n.php` is `wp i18n make-php`'s shape, byte for byte** (#1721) — `domain` from the `.po`'s `X-Domain` header, six named headers in WP-CLI's order, then `messages`, with an integer-like key written bare (`302=>`) as PHP stores it. Loco writes the same shape, so a catalogue compiled here, saved from Loco or made by WP-CLI is the same file, and the four plugins now share it. It was measured by running WP-CLI over the committed `.po`, which is the check to repeat when the compiler changes. **Parse the file with its own language where you can.** The `.l10n.php` is read by **including** it — a side-effect-free `return array()` — which removes two traps outright, because PHP is the authority on how PHP escapes a string. The contrast with `.github/scripts/ffc-uninstall-manifest.php`, which parses `uninstall.php` as *text*, is deliberate: including that one would run the uninstaller. The rule is not "never include" — it is **include when the file does nothing**. @@ -528,6 +533,7 @@ A rule switched off in `phpcs.xml.dist`, `.stylelintrc.json`, `phpstan.neon.dist - **A closure parameter taken by reference breaks under Patchwork, and only sometimes.** Patchwork instruments every dynamic call and dispatches it through `call_user_func_array()`, which cannot pass by reference — so `$add = static function ( array &$bucket, … )` dies with `Argument #1 ($bucket) must be passed by reference, value given` at `CallRerouting.php`. The dispatch only happens once *some* patch is live in the process, so the file passes alone and fails after any Brain\Monkey test that ran before it: a `--filter` scoped to names alphabetically *after* the file under test reports green while CI reports ten errors (#1177). Capture the array with `use ( &$bucket )` instead — a captured variable is not a parameter, so the dispatch never touches it. And when reproducing an order-dependent failure, pick a filter that keeps a patching class *before* the one you are testing. - **An `expect()` on a function `setUp()` already stubbed is never consulted.** `Functions\when( 'x' )` in `setUp()` keeps answering, so a later `Functions\expect( 'x' )->never()` passes whether or not `x` runs — and `AssertionCoverageTest` counts it as an assertion, so the test is vacuous without being reported. Measured in #1699: twelve such `never()` sites, every one still green with a direct call injected after it, and one (`RestControllerTest`) had been hiding a call the constructor makes. A second `when()` *does* replace the first, so count instead: `$log = CallLog::record( 'x', )` from `tests/Support/CallLog.php`, then `assertSame( 0, $log->count() )` after the act. `ExpectAfterSetUpStubTest` refuses the shape; it reads `setUp()` only, and a method that runs `Monkey\tearDown()` before its expectation is exempt, because the reset drops the stub. +- **A test that reads the clock must not take one reading against code that snaps to a boundary.** Code that rounds the current time to a minute, a day, a week or a site-timezone midnight answers with the next boundary when the run crosses it between the test's reading and the call, so an expectation read once, before or after, fails a few times a year with nothing changed. Read it on both sides and accept either (`RateLimitRepositoryTest::assertClockBound()`), or pass the time in. A fixed offset with a wide margin (`time() + 3600` against a 24-hour interval) is safe and needs neither. The audit of every clock-reading test, with a verdict each, is in #1719; total-mail-queue#146 is the failure that prompted it. - **`templates/` is outside the coverage scope.** `phpunit.xml` includes only `./includes` for coverage, so extracting inline markup from a god-class into `templates/*.php` partials reduces the class without touching the coverage floor (the F1/F2 lesson). Logic stays in `includes/` (and stays covered); pure markup moves to `templates/`. - **`tests/` is tab-indented, and that is enforced.** `phpcs.xml.dist` excludes `tests/` on purpose — `WordPress-Docs` would demand a file, class and method docblock in every file under it. Indentation is the one exception: `phpcs-tests.xml.dist` carries exactly two sniffs (`DisallowSpaceIndent`, `ScopeIndent`) and runs over the whole directory in the PHPCS workflow. The suite was 250 space-indented files against 170 tab-indented ones with nothing enforcing either, so a one-off reformat would have drifted back; the gate is what makes the reindent worth doing. Do not widen that ruleset — line length, docblocks, naming and Yoda conditions are how it stops being cheap. Two mechanics to know. The ruleset **must** set ``: without it PHPCS measures a tab as one column and reports every tab-indented line as `expected 1 tabs, found 1 spaces` — 105,985 errors, the gate failing the files it exists to approve. The main ruleset never needed it explicitly because WPCS sets it inside `WordPress-Core`; this one references only `Generic` sniffs. And the reindent commit is listed in **`.git-blame-ignore-revs`**, so `git blame` still names whoever wrote a test rather than the reformat — GitHub honours that file automatically, locally it is `git config blame.ignoreRevsFile .git-blame-ignore-revs` once per clone. Add a commit there only when it is genuinely whitespace-only. - **Running the suite locally.** Install pcov once (`apt-get install -y --no-install-recommends php8.4-pcov`); the full suite is ~10 min. **The full run is required evidence only when the change can reach another file** — a stub added or removed (`Functions\when()`), a shared `tests/Support/` helper, a renamed identifier, or anything in `includes/`. That is what the order-dependence rule above is scoped to: `--filter` is not evidence *there*. For a change that provably cannot pollute the process — a comment-only or assertion-message-only edit, where the token skeleton is byte-identical — the full local run buys nothing the `--filter` run and CI do not already give, and costs ~9 minutes per slice. Measured over the #1260 slices: two of four were comment-only and the full run found nothing in either. Do not skip it on the strength of *intent* — skip it on the strength of the skeleton diff being empty. Scope while iterating with `vendor/bin/phpunit --filter `; `vendor/bin/phpstan analyse --no-progress ` and `vendor/bin/phpcs --standard=phpcs.xml.dist -q ` (auto-fix with `vendor/bin/phpcbf`) reproduce the PHPStan/WPCS gates. @@ -790,6 +796,26 @@ Every icon the plugin draws comes from `Core\Icons`: a 24×24 stroke drawing in - **An area wears one icon and one name everywhere, the admin menu included** (#1640, #1641). `Core\PluginAreas` maps each plugin area to its menu item, its registry class and its translated name, and the WordPress menu, the documentation tree and Settings → Modules all read it; `PluginAreasAgreementTest` holds them together. It is its own class rather than a map inside `Icons` because it now carries names too — a name that encodes a neighbour's scope (see the opening of this file). The canonical names are the menu's: Certificates, Scheduling (its two modules Personal Calendars and Audience Calendars), Reregistration, Recruitment, Short URLs, Date Messages, FFC Settings. A module name is Title Case where it names the area (menu, headings, tabs, groups); a label describing a kind of message or option stays sentence case like its neighbours. **A path a reader is sent to — "Settings → *Tab*" — must name a tab that exists**: `SettingsPathReferenceTest` reads every translatable string, so renaming a tab fails CI until each path to it is rewritten. The menus register with the icon `'none'` and `Icons::menu_stylesheet()`, attached to core's `admin-menu` sheet on every screen, draws the registry mask in `currentColor`, so the icon takes the colour WordPress gives the item for the scheme, hover, current page and folded menu, and `LinkText` in forced colours. **Not a base64 SVG `icon_url`**: core's svg-painter recolours `fill`, and the registry draws strokes, so the icon would keep one colour whatever the scheme. A new top-level menu joins `AREAS` and registers with `'none'`. - **Dashicons stay only where they are WordPress chrome the registry does not draw** — the separator labels printed into `#adminmenu` — and nowhere else. `DashiconsChromeOnlyTest` freezes the allowed files with an exact count and a reason each. Tab lists that a filter can extend (Scheduling settings, Recruitment, the form editor) name a registry class and go through `Icons::tab_class()`, which still draws a bare dashicon slug a third-party tab passes, so opening the list to plugins did not break when the plugin's own tabs moved. +### Controls (one family — #1745) + +A setting that picks among a few values is drawn by a control from the `ffc-control-*` family, chosen by what the values ARE, never by how they look: + +| Values | Control | Helper | +| --- | --- | --- | +| two (on/off) | toggle | `AdminUI::render_toggle()` | +| an ORDERED scale of 3 to 11 | steps | `AdminUI::render_steps()` | +| 2 to 6 with no order | segmented | `AdminUI::render_segmented()` | +| anything else | a ` - - Field label text + + Field label text + It shares the family's state language: a halo for hover and pressed, the + 2px primary ring for keyboard focus, and a disabled state that greys + instead of fading. .ffc-control-toggle-mark adds a check or a cross on the + knob, so on and off do not rest on colour alone. ========================================================================== */ -.ffc-toggle, -.form-table td .ffc-toggle, -.form-table td fieldset .ffc-toggle { +/* The family's shared hover / pressed halo. */ +.ffc-control-toggle, +.ffc-control-steps, +.ffc-control-segmented { + --ffc-control-halo: color-mix(in srgb, var(--ffc-primary) 18%, transparent); + --ffc-control-knob-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + /* The ink of a mark drawn on the toggle's knob. The knob is white in both + themes (see below), so its ink is fixed too: --ffc-primary lightens in + the dark theme and would fall under 3:1 on white (#1748). */ + --ffc-control-knob-ink: #50575e; +} + +.ffc-control-toggle, +.form-table td .ffc-control-toggle, +.form-table td fieldset .ffc-control-toggle { /* Multiple selectors win the specificity battle against WP admin's `.form-table td fieldset label { display: inline-block }` which would otherwise collapse the toggle and overlap the label text. */ @@ -1845,7 +2052,7 @@ position: relative; } -.ffc-toggle input[type="checkbox"] { +.ffc-control-toggle input[type="checkbox"] { /* Visually hidden but reachable by keyboard + assistive tech. */ position: absolute; opacity: 0; @@ -1854,8 +2061,9 @@ pointer-events: none; } -.ffc-toggle-track { +.ffc-control-toggle-track { position: relative; + isolation: isolate; flex: 0 0 auto; width: 38px; height: 22px; @@ -1864,7 +2072,7 @@ transition: background-color 0.15s ease; } -.ffc-toggle-track::after { +.ffc-control-toggle-track::after { content: ""; position: absolute; top: 2px; @@ -1876,39 +2084,592 @@ theme the track is dark, and a knob in var(--ffc-bg-card) would vanish into it. Literal by decision, not by oversight (#1126 B). */ background: #fff; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - transition: transform 0.15s ease; + box-shadow: var(--ffc-control-knob-shadow); + transition: transform 0.15s ease, width 0.15s ease, box-shadow 0.15s ease; } -.ffc-toggle input[type="checkbox"]:checked + .ffc-toggle-track { +.ffc-control-toggle input[type="checkbox"]:checked + .ffc-control-toggle-track { background: var(--ffc-primary); } -.ffc-toggle input[type="checkbox"]:checked + .ffc-toggle-track::after { +.ffc-control-toggle input[type="checkbox"]:checked + .ffc-control-toggle-track::after { transform: translateX(16px); } -.ffc-toggle input[type="checkbox"]:focus-visible + .ffc-toggle-track { +.ffc-control-toggle:hover input[type="checkbox"]:not(:disabled) + .ffc-control-toggle-track::after { + box-shadow: var(--ffc-control-knob-shadow), 0 0 0 7px var(--ffc-control-halo); +} + +/* Pressed: the knob stretches towards where it is going. */ +.ffc-control-toggle:active input[type="checkbox"]:not(:disabled) + .ffc-control-toggle-track::after { + width: 22px; + box-shadow: var(--ffc-control-knob-shadow), 0 0 0 9px var(--ffc-control-halo); +} + +.ffc-control-toggle:active input[type="checkbox"]:checked:not(:disabled) + .ffc-control-toggle-track::after { + transform: translateX(12px); +} + +.ffc-control-toggle input[type="checkbox"]:focus-visible + .ffc-control-toggle-track { outline: 2px solid var(--ffc-primary); outline-offset: 2px; } -.ffc-toggle input[type="checkbox"]:disabled + .ffc-toggle-track { - opacity: 0.5; +/* Disabled: the colour leaves, nothing fades. */ +.ffc-control-toggle input[type="checkbox"]:disabled + .ffc-control-toggle-track { + background: var(--ffc-gray-300); cursor: not-allowed; } -.ffc-toggle-label { +.ffc-control-toggle input[type="checkbox"]:disabled:checked + .ffc-control-toggle-track { + background: var(--ffc-gray-400); +} + +.ffc-control-toggle input[type="checkbox"]:disabled + .ffc-control-toggle-track::after { + box-shadow: none; +} + +.ffc-control-toggle:has(input[type="checkbox"]:disabled) { + cursor: not-allowed; +} + +.ffc-control-toggle:has(input[type="checkbox"]:disabled) .ffc-control-toggle-label { + color: var(--ffc-text-muted); +} + +.ffc-control-toggle-label { color: inherit; } +/* Mark: the glyph rides above the knob; its shape, not its colour, says on or off. */ +.ffc-control-toggle-mark .ffc-control-toggle-track::before { + content: ""; + position: absolute; + /* Above the knob (::after, which paints later at z-index auto). */ + z-index: var(--ffc-z-raised); + top: 6px; + left: 6px; + width: 10px; + height: 10px; + background-color: var(--ffc-control-knob-ink); + -webkit-mask: var(--ffc-icon-mask-x) center / contain no-repeat; + mask: var(--ffc-icon-mask-x) center / contain no-repeat; + transition: transform 0.15s ease; +} + +.ffc-control-toggle-mark input[type="checkbox"]:checked + .ffc-control-toggle-track::before { + -webkit-mask-image: var(--ffc-icon-mask-check); + mask-image: var(--ffc-icon-mask-check); + transform: translateX(16px); +} + +.ffc-control-toggle-mark input[type="checkbox"]:disabled + .ffc-control-toggle-track::before { + background-color: var(--ffc-gray-400); +} + +@media (prefers-reduced-motion: reduce) { + .ffc-control-toggle-track, + .ffc-control-toggle-track::before, + .ffc-control-toggle-track::after { + transition: none; + } +} + +@media (forced-colors: active) { + .ffc-control-toggle-mark .ffc-control-toggle-track::before { + forced-color-adjust: none; + background-color: CanvasText; + } +} + +/* ========================================================================== + CONTROLS (#1745) — the .ffc-control-* family, drawn by AdminUI. + One state language for all of them: a halo (--ffc-control-halo) for hover + and pressed, the 2px primary ring for keyboard focus, and a disabled + state that takes the colour away instead of fading (OpacityContrastTest). + Fine tuning goes through the --ffc-control-* custom properties. + + STEPS — AdminUI::render_steps(): an ORDERED scale of 3 to 11 values. + One native radio per stop, so it posts and works without a script; the + rail fills up to the chosen stop and that step's name is set in bold, so + colour is never the only signal. Palettes colour the fill and the thumb's + ring after the chosen step: + .ffc-control-steps-primary the accent (the default) + .ffc-control-steps-severity grey → amber → red + .ffc-control-steps-traffic red → amber → green + A stop's data-tone overrides the palette for that step. + ========================================================================== */ +.ffc-control-steps { + --ffc-control-steps-rail: 6px; + --ffc-control-steps-dot: 8px; + --ffc-control-steps-thumb: 20px; + --ffc-control-steps-shape: var(--ffc-radius-full); + --ffc-control-steps-gap: 76px; + --ffc-control-steps-idle: var(--ffc-border); + --ffc-control-steps-rail-bg: var(--ffc-gray-300); + --ffc-control-steps-fill: var(--ffc-primary); + + display: inline-block; + vertical-align: top; + min-width: 0; + margin: 0; + padding: 0; + border: 0; +} + +.ffc-control-steps-track { + display: flex; +} + +.ffc-control-steps-stop { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + gap: var(--ffc-spacing-xs); + width: var(--ffc-control-steps-gap); + text-align: center; + cursor: pointer; +} + +/* Inside a .form-table, WordPress's `.form-table td fieldset label` makes + every label inline-block with a forced margin (!important). A stop is a + label in a fieldset, so it would lose its column and its mark would sit + left of the rail it belongs on. */ +.form-table td fieldset .ffc-control-steps-stop { + display: flex; + margin: 0 !important; +} + +.ffc-control-steps-stop input { + /* Visually hidden but reachable by keyboard + assistive tech. */ + position: absolute; + width: 1px; + height: 1px; + margin: 0; + opacity: 0; +} + +/* The rail segment leading to each stop from the one before it. */ +.ffc-control-steps-stop:not(:first-child)::before { + content: ""; + position: absolute; + top: calc(var(--ffc-control-steps-thumb) / 2 - var(--ffc-control-steps-rail) / 2); + right: 50%; + width: 100%; + height: var(--ffc-control-steps-rail); + border-radius: var(--ffc-control-steps-rail); + background: var(--ffc-control-steps-rail-bg); +} + +.ffc-control-steps-mark { + position: relative; + z-index: var(--ffc-z-raised); + display: grid; + place-items: center; + width: var(--ffc-control-steps-thumb); + height: var(--ffc-control-steps-thumb); +} + +.ffc-control-steps-mark::after { + content: ""; + width: var(--ffc-control-steps-dot); + height: var(--ffc-control-steps-dot); + border-radius: var(--ffc-control-steps-shape); + background: var(--ffc-bg-card); + box-shadow: inset 0 0 0 2px var(--ffc-control-steps-idle); + transition: width 0.15s ease, height 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease; +} + +.ffc-control-steps-label { + padding: 0 var(--ffc-spacing-3xs); + color: var(--ffc-text-muted); + font-size: var(--ffc-font-size-xs); + line-height: 1.25; +} + +/* Filled: every stop up to the chosen one, and the rail leading to it. */ +.ffc-control-steps-stop:has(~ .ffc-control-steps-stop input:checked)::before, +.ffc-control-steps-stop:has(input:checked)::before { + background: var(--ffc-control-steps-fill); +} + +.ffc-control-steps-stop:has(~ .ffc-control-steps-stop input:checked) .ffc-control-steps-mark::after { + background: var(--ffc-control-steps-fill); + box-shadow: none; +} + +/* Chosen: the thumb, the card's colour inside a ring of the step's tone. */ +.ffc-control-steps-stop:has(input:checked) .ffc-control-steps-mark::after { + width: var(--ffc-control-steps-thumb); + height: var(--ffc-control-steps-thumb); + background: var(--ffc-bg-card); + box-shadow: inset 0 0 0 3px var(--ffc-control-steps-fill), var(--ffc-shadow-sm); +} + +.ffc-control-steps-stop:has(input:checked) .ffc-control-steps-label { + color: var(--ffc-text); + font-weight: 600; +} + +.ffc-control-steps-stop:hover:not(:has(input:checked)) .ffc-control-steps-mark::after { + box-shadow: inset 0 0 0 2px var(--ffc-control-steps-fill); +} + +.ffc-control-steps-stop:has(input:checked):hover .ffc-control-steps-mark::after { + box-shadow: inset 0 0 0 3px var(--ffc-control-steps-fill), 0 0 0 8px var(--ffc-control-halo); +} + +.ffc-control-steps-stop:has(input:focus-visible) .ffc-control-steps-mark::after { + box-shadow: inset 0 0 0 3px var(--ffc-control-steps-fill), 0 0 0 2px var(--ffc-bg-card), 0 0 0 4px var(--ffc-primary); +} + +.ffc-control-steps-stop:has(input:checked):active .ffc-control-steps-mark::after { + box-shadow: inset 0 0 0 3px var(--ffc-control-steps-fill), 0 0 0 12px var(--ffc-control-halo); +} + +/* Palettes and tones. :where() keeps each at one class, so a state such as + disabled always outranks the colour of the chosen step. */ +.ffc-control-steps-severity:where(:has(.ffc-control-steps-stop:first-child input:checked)) { + --ffc-control-steps-fill: var(--ffc-gray-600); +} + +.ffc-control-steps-severity:where(:has(.ffc-control-steps-stop:not(:first-child):not(:last-child) input:checked)), +.ffc-control-steps-traffic:where(:has(.ffc-control-steps-stop:not(:first-child):not(:last-child) input:checked)) { + --ffc-control-steps-fill: var(--ffc-warning); +} + +.ffc-control-steps-severity:where(:has(.ffc-control-steps-stop:last-child input:checked)), +.ffc-control-steps-traffic:where(:has(.ffc-control-steps-stop:first-child input:checked)) { + --ffc-control-steps-fill: var(--ffc-danger); +} + +.ffc-control-steps-traffic:where(:has(.ffc-control-steps-stop:last-child input:checked)) { + --ffc-control-steps-fill: var(--ffc-success); +} + +.ffc-control-steps:where(:has([data-tone="neutral"] input:checked)) { + --ffc-control-steps-fill: var(--ffc-gray-600); +} + +.ffc-control-steps:where(:has([data-tone="primary"] input:checked)) { + --ffc-control-steps-fill: var(--ffc-primary); +} + +.ffc-control-steps:where(:has([data-tone="info"] input:checked)) { + --ffc-control-steps-fill: var(--ffc-info); +} + +.ffc-control-steps:where(:has([data-tone="success"] input:checked)) { + --ffc-control-steps-fill: var(--ffc-success); +} + +.ffc-control-steps:where(:has([data-tone="warning"] input:checked)) { + --ffc-control-steps-fill: var(--ffc-warning); +} + +.ffc-control-steps:where(:has([data-tone="danger"] input:checked)) { + --ffc-control-steps-fill: var(--ffc-danger); +} + +/* Sizes, shape, width. */ +.ffc-control-steps-sm { + --ffc-control-steps-rail: 4px; + --ffc-control-steps-dot: 6px; + --ffc-control-steps-thumb: 16px; + --ffc-control-steps-gap: 60px; +} + +.ffc-control-steps-lg { + --ffc-control-steps-rail: 8px; + --ffc-control-steps-dot: 10px; + --ffc-control-steps-thumb: 26px; + --ffc-control-steps-gap: 96px; +} + +.ffc-control-steps-many { + --ffc-control-steps-gap: 56px; +} + +.ffc-control-steps-square { + --ffc-control-steps-shape: var(--ffc-radius-sm); +} + +.ffc-control-steps-fluid { + display: block; +} + +.ffc-control-steps-fluid .ffc-control-steps-stop { + flex: 1 1 0; + width: auto; +} + +/* labels: selected — the other names stay for screen readers only. */ +.ffc-control-steps-labels-selected .ffc-control-steps-stop:not(:has(input:checked)) .ffc-control-steps-label { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; +} + +.ffc-control-steps-labels-selected .ffc-control-steps-stop:has(input:checked) .ffc-control-steps-label { + white-space: nowrap; +} + +/* Disabled: the colour leaves, nothing fades. */ +.ffc-control-steps:disabled { + --ffc-control-steps-fill: var(--ffc-gray-400); + --ffc-control-steps-idle: var(--ffc-gray-300); +} + +.ffc-control-steps:disabled .ffc-control-steps-stop { + cursor: not-allowed; +} + +.ffc-control-steps:disabled .ffc-control-steps-label { + color: var(--ffc-text-muted); +} + +/* Only the chosen step's description shows. */ +.ffc-control-steps-desc { + display: none; + margin-top: var(--ffc-spacing-xs); +} + +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(1) input:checked) .ffc-control-steps-desc[data-step="1"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(2) input:checked) .ffc-control-steps-desc[data-step="2"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(3) input:checked) .ffc-control-steps-desc[data-step="3"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(4) input:checked) .ffc-control-steps-desc[data-step="4"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(5) input:checked) .ffc-control-steps-desc[data-step="5"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(6) input:checked) .ffc-control-steps-desc[data-step="6"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(7) input:checked) .ffc-control-steps-desc[data-step="7"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(8) input:checked) .ffc-control-steps-desc[data-step="8"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(9) input:checked) .ffc-control-steps-desc[data-step="9"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(10) input:checked) .ffc-control-steps-desc[data-step="10"], +.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(11) input:checked) .ffc-control-steps-desc[data-step="11"] { + display: block; +} + +/* A phone: the stops share the width, and a long scale names only the + chosen step. */ +@media (max-width: 480px) { + .ffc-control-steps { + display: block; + } + + .ffc-control-steps .ffc-control-steps-stop { + flex: 1 1 0; + width: auto; + } + + .ffc-control-steps-many .ffc-control-steps-stop:not(:has(input:checked)) .ffc-control-steps-label { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; + } + + .ffc-control-steps-many .ffc-control-steps-stop:has(input:checked) .ffc-control-steps-label { + white-space: nowrap; + } +} + +/* ========================================================================== + SEGMENTED (#1750) — AdminUI::render_segmented(): 2 to 6 choices with NO + order between them, joined in one pill. One native radio per segment, so + it posts and works without a script. The chosen segment is filled with + the accent and set in bold, so colour is never the only signal. + ========================================================================== */ +.ffc-control-segmented { + --ffc-control-segmented-pad-y: var(--ffc-spacing-2xs); + --ffc-control-segmented-pad-x: var(--ffc-spacing-lg); + --ffc-control-segmented-font: var(--ffc-font-size-sm); + --ffc-control-segmented-shape: var(--ffc-radius-pill); + + display: inline-block; + vertical-align: top; + min-width: 0; + margin: 0; + padding: 0; + border: 0; +} + +.ffc-control-segmented-track { + display: inline-flex; + gap: var(--ffc-spacing-3xs); + padding: var(--ffc-spacing-3xs); + border: 1px solid var(--ffc-border); + border-radius: var(--ffc-control-segmented-shape); + background: var(--ffc-gray-100); +} + +.ffc-control-segmented-option { + position: relative; + display: flex; + cursor: pointer; +} + +/* The same WordPress rule as for the steps stops above. */ +.form-table td fieldset .ffc-control-segmented-option { + display: flex; + margin: 0 !important; +} + +.ffc-control-segmented-option input { + /* Visually hidden but reachable by keyboard + assistive tech. */ + position: absolute; + width: 1px; + height: 1px; + margin: 0; + overflow: hidden; + clip-path: inset(50%); +} + +.ffc-control-segmented-label { + flex: 1 1 auto; + padding: var(--ffc-control-segmented-pad-y) var(--ffc-control-segmented-pad-x); + border-radius: var(--ffc-control-segmented-shape); + color: var(--ffc-text); + font-size: var(--ffc-control-segmented-font); + line-height: 1.4; + text-align: center; + white-space: nowrap; + transition: background-color 0.15s ease, box-shadow 0.15s ease; +} + +.ffc-control-segmented-option:hover input:not(:checked) + .ffc-control-segmented-label { + background: var(--ffc-control-halo); +} + +.ffc-control-segmented-option input:checked + .ffc-control-segmented-label { + background: var(--ffc-primary); + color: var(--ffc-text-on-primary); + font-weight: 600; + box-shadow: var(--ffc-shadow-sm); +} + +.ffc-control-segmented-option:active input:checked + .ffc-control-segmented-label { + box-shadow: 0 0 0 4px var(--ffc-control-halo); +} + +.ffc-control-segmented-option input:focus-visible + .ffc-control-segmented-label { + outline: 2px solid var(--ffc-primary); + outline-offset: 2px; +} + +/* Sizes and width. */ +.ffc-control-segmented-sm { + --ffc-control-segmented-pad-y: var(--ffc-spacing-3xs); + --ffc-control-segmented-pad-x: var(--ffc-spacing-sm); + --ffc-control-segmented-font: var(--ffc-font-size-xs); +} + +.ffc-control-segmented-lg { + --ffc-control-segmented-pad-y: var(--ffc-spacing-xs); + --ffc-control-segmented-pad-x: var(--ffc-spacing-xl); + --ffc-control-segmented-font: var(--ffc-font-size-base); +} + +.ffc-control-segmented-fluid { + display: block; +} + +.ffc-control-segmented-fluid .ffc-control-segmented-track { + display: flex; +} + +.ffc-control-segmented-fluid .ffc-control-segmented-option { + flex: 1 1 0; +} + +/* Disabled: the colour leaves, nothing fades. */ +.ffc-control-segmented:disabled .ffc-control-segmented-option { + cursor: not-allowed; +} + +.ffc-control-segmented:disabled .ffc-control-segmented-option input:checked + .ffc-control-segmented-label { + background: var(--ffc-gray-200); + color: var(--ffc-text-muted); + box-shadow: inset 0 0 0 1px var(--ffc-gray-300); +} + +/* Only the chosen option's description shows. */ +.ffc-control-segmented-desc { + display: none; + margin-top: var(--ffc-spacing-xs); +} + +.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(1) input:checked) .ffc-control-segmented-desc[data-option="1"], +.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(2) input:checked) .ffc-control-segmented-desc[data-option="2"], +.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(3) input:checked) .ffc-control-segmented-desc[data-option="3"], +.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(4) input:checked) .ffc-control-segmented-desc[data-option="4"], +.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(5) input:checked) .ffc-control-segmented-desc[data-option="5"], +.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(6) input:checked) .ffc-control-segmented-desc[data-option="6"] { + display: block; +} + +/* A phone: the segments share the width and may wrap their names. */ +@media (max-width: 480px) { + .ffc-control-segmented { + display: block; + } + + .ffc-control-segmented .ffc-control-segmented-track { + display: flex; + } + + .ffc-control-segmented .ffc-control-segmented-option { + flex: 1 1 0; + } + + .ffc-control-segmented .ffc-control-segmented-label { + white-space: normal; + } +} + @media (prefers-reduced-motion: reduce) { - .ffc-toggle-track, - .ffc-toggle-track::after { + .ffc-control-segmented-label { transition: none; } } +@media (forced-colors: active) { + .ffc-control-segmented-option input:checked + .ffc-control-segmented-label { + forced-color-adjust: none; + background: Highlight; + color: HighlightText; + } +} + +@media (prefers-reduced-motion: reduce) { + .ffc-control-steps-mark::after { + transition: none; + } +} + +@media (forced-colors: active) { + .ffc-control-steps-mark::after { + forced-color-adjust: none; + background: Canvas; + box-shadow: inset 0 0 0 2px CanvasText; + } + + .ffc-control-steps-stop:has(~ .ffc-control-steps-stop input:checked) .ffc-control-steps-mark::after, + .ffc-control-steps-stop:has(input:checked) .ffc-control-steps-mark::after { + background: Highlight; + box-shadow: none; + } + + .ffc-control-steps-stop:not(:first-child)::before { + forced-color-adjust: none; + background: CanvasText; + } +} + /* ========================================================================== AUTO-SAVE BADGE — companion to FFC.Admin.autoSaveField. Renders next to a field showing the live save state. @@ -1950,7 +2711,7 @@ gap: var(--ffc-spacing-2xs); } -.ffc-features-cell .ffc-toggle { +.ffc-features-cell .ffc-control-toggle { margin: 0; } @@ -2067,7 +2828,10 @@ .ffc-btn-success, :root.ffc-dark-mode .button, :root.ffc-dark-mode .button-secondary, - :root.ffc-dark-mode .button.disabled { + :root.ffc-dark-mode .button.disabled, + :root.ffc-dark-mode .button-primary.disabled, + :root.ffc-dark-mode .button-primary[disabled], + :root.ffc-dark-mode .mce-btn.mce-active { border: 1px solid ButtonText; } @@ -2086,3 +2850,9 @@ border: 1px solid CanvasText; } } + +/* The asterisk beside a required admin field. Core's `.required` red measured + 2,03:1 on the dark card; the danger token is tuned for both themes. */ +.ffc-admin-page .ffc-required { + color: var(--ffc-danger); +} diff --git a/assets/css/ffc-common.min.css b/assets/css/ffc-common.min.css index 5b6c1453a..3c4b38e23 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 .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: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 .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-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-secondary,:root.ffc-dark-mode .button.disabled{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}} +: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")}:root{--ffc-icon-mask-check:url("data:image/svg+xml,%3Csvg xmlns='http://www.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-mask-x:url("data:image/svg+xml,%3Csvg xmlns='http://www.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-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-control-segmented,.ffc-control-steps,.ffc-control-toggle{--ffc-control-halo:color-mix(in srgb, var(--ffc-primary) 18%, transparent);--ffc-control-knob-shadow:0 1px 2px rgba(0, 0, 0, 0.2);--ffc-control-knob-ink:#50575e}.ffc-control-toggle,.form-table td .ffc-control-toggle,.form-table td fieldset .ffc-control-toggle{display:inline-flex;align-items:center;gap:var(--ffc-spacing-md);cursor:pointer;user-select:none;line-height:1.3;position:relative}.ffc-control-toggle input[type=checkbox]{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.ffc-control-toggle-track{position:relative;isolation:isolate;flex:0 0 auto;width:38px;height:22px;background:var(--ffc-border);border-radius:11px;transition:background-color .15s ease}.ffc-control-toggle-track::after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:var(--ffc-radius-full);background:#fff;box-shadow:var(--ffc-control-knob-shadow);transition:transform .15s ease,width .15s ease,box-shadow .15s ease}.ffc-control-toggle input[type=checkbox]:checked+.ffc-control-toggle-track{background:var(--ffc-primary)}.ffc-control-toggle input[type=checkbox]:checked+.ffc-control-toggle-track::after{transform:translateX(16px)}.ffc-control-toggle:hover input[type=checkbox]:not(:disabled)+.ffc-control-toggle-track::after{box-shadow:var(--ffc-control-knob-shadow),0 0 0 7px var(--ffc-control-halo)}.ffc-control-toggle:active input[type=checkbox]:not(:disabled)+.ffc-control-toggle-track::after{width:22px;box-shadow:var(--ffc-control-knob-shadow),0 0 0 9px var(--ffc-control-halo)}.ffc-control-toggle:active input[type=checkbox]:checked:not(:disabled)+.ffc-control-toggle-track::after{transform:translateX(12px)}.ffc-control-toggle input[type=checkbox]:focus-visible+.ffc-control-toggle-track{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-control-toggle input[type=checkbox]:disabled+.ffc-control-toggle-track{background:var(--ffc-gray-300);cursor:not-allowed}.ffc-control-toggle input[type=checkbox]:disabled:checked+.ffc-control-toggle-track{background:var(--ffc-gray-400)}.ffc-control-toggle input[type=checkbox]:disabled+.ffc-control-toggle-track::after{box-shadow:none}.ffc-control-toggle:has(input[type=checkbox]:disabled){cursor:not-allowed}.ffc-control-toggle:has(input[type=checkbox]:disabled) .ffc-control-toggle-label{color:var(--ffc-text-muted)}.ffc-control-toggle-label{color:inherit}.ffc-control-toggle-mark .ffc-control-toggle-track::before{content:"";position:absolute;z-index:var(--ffc-z-raised);top:6px;left:6px;width:10px;height:10px;background-color:var(--ffc-control-knob-ink);-webkit-mask:var(--ffc-icon-mask-x) center/contain no-repeat;mask:var(--ffc-icon-mask-x) center/contain no-repeat;transition:transform .15s ease}.ffc-control-toggle-mark input[type=checkbox]:checked+.ffc-control-toggle-track::before{-webkit-mask-image:var(--ffc-icon-mask-check);mask-image:var(--ffc-icon-mask-check);transform:translateX(16px)}.ffc-control-toggle-mark input[type=checkbox]:disabled+.ffc-control-toggle-track::before{background-color:var(--ffc-gray-400)}@media (prefers-reduced-motion:reduce){.ffc-control-toggle-track,.ffc-control-toggle-track::after,.ffc-control-toggle-track::before{transition:none}}@media (forced-colors:active){.ffc-control-toggle-mark .ffc-control-toggle-track::before{forced-color-adjust:none;background-color:CanvasText}}.ffc-control-steps{--ffc-control-steps-rail:6px;--ffc-control-steps-dot:8px;--ffc-control-steps-thumb:20px;--ffc-control-steps-shape:var(--ffc-radius-full);--ffc-control-steps-gap:76px;--ffc-control-steps-idle:var(--ffc-border);--ffc-control-steps-rail-bg:var(--ffc-gray-300);--ffc-control-steps-fill:var(--ffc-primary);display:inline-block;vertical-align:top;min-width:0;margin:0;padding:0;border:0}.ffc-control-steps-track{display:flex}.ffc-control-steps-stop{position:relative;display:flex;flex-direction:column;align-items:center;gap:var(--ffc-spacing-xs);width:var(--ffc-control-steps-gap);text-align:center;cursor:pointer}.form-table td fieldset .ffc-control-steps-stop{display:flex;margin:0!important}.ffc-control-steps-stop input{position:absolute;width:1px;height:1px;margin:0;opacity:0}.ffc-control-steps-stop:not(:first-child)::before{content:"";position:absolute;top:calc(var(--ffc-control-steps-thumb)/ 2 - var(--ffc-control-steps-rail)/ 2);right:50%;width:100%;height:var(--ffc-control-steps-rail);border-radius:var(--ffc-control-steps-rail);background:var(--ffc-control-steps-rail-bg)}.ffc-control-steps-mark{position:relative;z-index:var(--ffc-z-raised);display:grid;place-items:center;width:var(--ffc-control-steps-thumb);height:var(--ffc-control-steps-thumb)}.ffc-control-steps-mark::after{content:"";width:var(--ffc-control-steps-dot);height:var(--ffc-control-steps-dot);border-radius:var(--ffc-control-steps-shape);background:var(--ffc-bg-card);box-shadow:inset 0 0 0 2px var(--ffc-control-steps-idle);transition:width .15s ease,height .15s ease,box-shadow .15s ease,background-color .15s ease}.ffc-control-steps-label{padding:0 var(--ffc-spacing-3xs);color:var(--ffc-text-muted);font-size:var(--ffc-font-size-xs);line-height:1.25}.ffc-control-steps-stop:has(input:checked)::before,.ffc-control-steps-stop:has(~ .ffc-control-steps-stop input:checked)::before{background:var(--ffc-control-steps-fill)}.ffc-control-steps-stop:has(~ .ffc-control-steps-stop input:checked) .ffc-control-steps-mark::after{background:var(--ffc-control-steps-fill);box-shadow:none}.ffc-control-steps-stop:has(input:checked) .ffc-control-steps-mark::after{width:var(--ffc-control-steps-thumb);height:var(--ffc-control-steps-thumb);background:var(--ffc-bg-card);box-shadow:inset 0 0 0 3px var(--ffc-control-steps-fill),var(--ffc-shadow-sm)}.ffc-control-steps-stop:has(input:checked) .ffc-control-steps-label{color:var(--ffc-text);font-weight:600}.ffc-control-steps-stop:hover:not(:has(input:checked)) .ffc-control-steps-mark::after{box-shadow:inset 0 0 0 2px var(--ffc-control-steps-fill)}.ffc-control-steps-stop:has(input:checked):hover .ffc-control-steps-mark::after{box-shadow:inset 0 0 0 3px var(--ffc-control-steps-fill),0 0 0 8px var(--ffc-control-halo)}.ffc-control-steps-stop:has(input:focus-visible) .ffc-control-steps-mark::after{box-shadow:inset 0 0 0 3px var(--ffc-control-steps-fill),0 0 0 2px var(--ffc-bg-card),0 0 0 4px var(--ffc-primary)}.ffc-control-steps-stop:has(input:checked):active .ffc-control-steps-mark::after{box-shadow:inset 0 0 0 3px var(--ffc-control-steps-fill),0 0 0 12px var(--ffc-control-halo)}.ffc-control-steps-severity:where(:has(.ffc-control-steps-stop:first-child input:checked)){--ffc-control-steps-fill:var(--ffc-gray-600)}.ffc-control-steps-severity:where(:has(.ffc-control-steps-stop:not(:first-child):not(:last-child) input:checked)),.ffc-control-steps-traffic:where(:has(.ffc-control-steps-stop:not(:first-child):not(:last-child) input:checked)){--ffc-control-steps-fill:var(--ffc-warning)}.ffc-control-steps-severity:where(:has(.ffc-control-steps-stop:last-child input:checked)),.ffc-control-steps-traffic:where(:has(.ffc-control-steps-stop:first-child input:checked)){--ffc-control-steps-fill:var(--ffc-danger)}.ffc-control-steps-traffic:where(:has(.ffc-control-steps-stop:last-child input:checked)){--ffc-control-steps-fill:var(--ffc-success)}.ffc-control-steps:where(:has([data-tone=neutral] input:checked)){--ffc-control-steps-fill:var(--ffc-gray-600)}.ffc-control-steps:where(:has([data-tone=primary] input:checked)){--ffc-control-steps-fill:var(--ffc-primary)}.ffc-control-steps:where(:has([data-tone=info] input:checked)){--ffc-control-steps-fill:var(--ffc-info)}.ffc-control-steps:where(:has([data-tone=success] input:checked)){--ffc-control-steps-fill:var(--ffc-success)}.ffc-control-steps:where(:has([data-tone=warning] input:checked)){--ffc-control-steps-fill:var(--ffc-warning)}.ffc-control-steps:where(:has([data-tone=danger] input:checked)){--ffc-control-steps-fill:var(--ffc-danger)}.ffc-control-steps-sm{--ffc-control-steps-rail:4px;--ffc-control-steps-dot:6px;--ffc-control-steps-thumb:16px;--ffc-control-steps-gap:60px}.ffc-control-steps-lg{--ffc-control-steps-rail:8px;--ffc-control-steps-dot:10px;--ffc-control-steps-thumb:26px;--ffc-control-steps-gap:96px}.ffc-control-steps-many{--ffc-control-steps-gap:56px}.ffc-control-steps-square{--ffc-control-steps-shape:var(--ffc-radius-sm)}.ffc-control-steps-fluid{display:block}.ffc-control-steps-fluid .ffc-control-steps-stop{flex:1 1 0;width:auto}.ffc-control-steps-labels-selected .ffc-control-steps-stop:not(:has(input:checked)) .ffc-control-steps-label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.ffc-control-steps-labels-selected .ffc-control-steps-stop:has(input:checked) .ffc-control-steps-label{white-space:nowrap}.ffc-control-steps:disabled{--ffc-control-steps-fill:var(--ffc-gray-400);--ffc-control-steps-idle:var(--ffc-gray-300)}.ffc-control-steps:disabled .ffc-control-steps-stop{cursor:not-allowed}.ffc-control-steps:disabled .ffc-control-steps-label{color:var(--ffc-text-muted)}.ffc-control-steps-desc{display:none;margin-top:var(--ffc-spacing-xs)}.ffc-control-steps:has(.ffc-control-steps-stop:first-child input:checked) .ffc-control-steps-desc[data-step="1"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(10) input:checked) .ffc-control-steps-desc[data-step="10"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(11) input:checked) .ffc-control-steps-desc[data-step="11"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(2) input:checked) .ffc-control-steps-desc[data-step="2"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(3) input:checked) .ffc-control-steps-desc[data-step="3"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(4) input:checked) .ffc-control-steps-desc[data-step="4"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(5) input:checked) .ffc-control-steps-desc[data-step="5"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(6) input:checked) .ffc-control-steps-desc[data-step="6"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(7) input:checked) .ffc-control-steps-desc[data-step="7"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(8) input:checked) .ffc-control-steps-desc[data-step="8"],.ffc-control-steps:has(.ffc-control-steps-stop:nth-child(9) input:checked) .ffc-control-steps-desc[data-step="9"]{display:block}@media (max-width:480px){.ffc-control-steps{display:block}.ffc-control-steps .ffc-control-steps-stop{flex:1 1 0;width:auto}.ffc-control-steps-many .ffc-control-steps-stop:not(:has(input:checked)) .ffc-control-steps-label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.ffc-control-steps-many .ffc-control-steps-stop:has(input:checked) .ffc-control-steps-label{white-space:nowrap}}.ffc-control-segmented{--ffc-control-segmented-pad-y:var(--ffc-spacing-2xs);--ffc-control-segmented-pad-x:var(--ffc-spacing-lg);--ffc-control-segmented-font:var(--ffc-font-size-sm);--ffc-control-segmented-shape:var(--ffc-radius-pill);display:inline-block;vertical-align:top;min-width:0;margin:0;padding:0;border:0}.ffc-control-segmented-track{display:inline-flex;gap:var(--ffc-spacing-3xs);padding:var(--ffc-spacing-3xs);border:1px solid var(--ffc-border);border-radius:var(--ffc-control-segmented-shape);background:var(--ffc-gray-100)}.ffc-control-segmented-option{position:relative;display:flex;cursor:pointer}.form-table td fieldset .ffc-control-segmented-option{display:flex;margin:0!important}.ffc-control-segmented-option input{position:absolute;width:1px;height:1px;margin:0;overflow:hidden;clip-path:inset(50%)}.ffc-control-segmented-label{flex:1 1 auto;padding:var(--ffc-control-segmented-pad-y) var(--ffc-control-segmented-pad-x);border-radius:var(--ffc-control-segmented-shape);color:var(--ffc-text);font-size:var(--ffc-control-segmented-font);line-height:1.4;text-align:center;white-space:nowrap;transition:background-color .15s ease,box-shadow .15s ease}.ffc-control-segmented-option:hover input:not(:checked)+.ffc-control-segmented-label{background:var(--ffc-control-halo)}.ffc-control-segmented-option input:checked+.ffc-control-segmented-label{background:var(--ffc-primary);color:var(--ffc-text-on-primary);font-weight:600;box-shadow:var(--ffc-shadow-sm)}.ffc-control-segmented-option:active input:checked+.ffc-control-segmented-label{box-shadow:0 0 0 4px var(--ffc-control-halo)}.ffc-control-segmented-option input:focus-visible+.ffc-control-segmented-label{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-control-segmented-sm{--ffc-control-segmented-pad-y:var(--ffc-spacing-3xs);--ffc-control-segmented-pad-x:var(--ffc-spacing-sm);--ffc-control-segmented-font:var(--ffc-font-size-xs)}.ffc-control-segmented-lg{--ffc-control-segmented-pad-y:var(--ffc-spacing-xs);--ffc-control-segmented-pad-x:var(--ffc-spacing-xl);--ffc-control-segmented-font:var(--ffc-font-size-base)}.ffc-control-segmented-fluid{display:block}.ffc-control-segmented-fluid .ffc-control-segmented-track{display:flex}.ffc-control-segmented-fluid .ffc-control-segmented-option{flex:1 1 0}.ffc-control-segmented:disabled .ffc-control-segmented-option{cursor:not-allowed}.ffc-control-segmented:disabled .ffc-control-segmented-option input:checked+.ffc-control-segmented-label{background:var(--ffc-gray-200);color:var(--ffc-text-muted);box-shadow:inset 0 0 0 1px var(--ffc-gray-300)}.ffc-control-segmented-desc{display:none;margin-top:var(--ffc-spacing-xs)}.ffc-control-segmented:has(.ffc-control-segmented-option:first-child input:checked) .ffc-control-segmented-desc[data-option="1"],.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(2) input:checked) .ffc-control-segmented-desc[data-option="2"],.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(3) input:checked) .ffc-control-segmented-desc[data-option="3"],.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(4) input:checked) .ffc-control-segmented-desc[data-option="4"],.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(5) input:checked) .ffc-control-segmented-desc[data-option="5"],.ffc-control-segmented:has(.ffc-control-segmented-option:nth-child(6) input:checked) .ffc-control-segmented-desc[data-option="6"]{display:block}@media (max-width:480px){.ffc-control-segmented{display:block}.ffc-control-segmented .ffc-control-segmented-track{display:flex}.ffc-control-segmented .ffc-control-segmented-option{flex:1 1 0}.ffc-control-segmented .ffc-control-segmented-label{white-space:normal}}@media (prefers-reduced-motion:reduce){.ffc-control-segmented-label{transition:none}}@media (forced-colors:active){.ffc-control-segmented-option input:checked+.ffc-control-segmented-label{forced-color-adjust:none;background:Highlight;color:HighlightText}}@media (prefers-reduced-motion:reduce){.ffc-control-steps-mark::after{transition:none}}@media (forced-colors:active){.ffc-control-steps-mark::after{forced-color-adjust:none;background:Canvas;box-shadow:inset 0 0 0 2px CanvasText}.ffc-control-steps-stop:has(input:checked) .ffc-control-steps-mark::after,.ffc-control-steps-stop:has(~ .ffc-control-steps-stop input:checked) .ffc-control-steps-mark::after{background:Highlight;box-shadow:none}.ffc-control-steps-stop:not(:first-child)::before{forced-color-adjust:none;background:CanvasText}}.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-control-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/css/ffc-frontend.css b/assets/css/ffc-frontend.css index c3db765b3..70f2857e9 100644 --- a/assets/css/ffc-frontend.css +++ b/assets/css/ffc-frontend.css @@ -8,6 +8,14 @@ /* ========================================================================== 1. CORE INPUT STYLE ========================================================================== */ + +/* A control does not inherit the font: the browser gives fields and buttons + its own (Arial, or the system's), so the labels read in the form's font and + the fields beside them in another. The size, the weight and the line height + stay each control's own rule. */ +.ffc-shortcode :is(input, select, textarea, button) { + font-family: inherit; +} .ffc-shortcode .ffc-input { width: 100% !important; /* ← 100% of the field (already 450px) */ max-width: none !important; /* ← Drops the old cap */ @@ -102,7 +110,8 @@ text-transform: none; } -.ffc-shortcode .ffc-form-field label .ffc-required { +.ffc-shortcode .ffc-form-field label .ffc-required, +.ffc-shortcode .ffc-field-legend .ffc-required { color: var(--ffc-danger); font-weight: 700; margin-left: 3px; @@ -122,6 +131,74 @@ cursor: pointer; } +/* A radio or checkbox group is a fieldset whose legend reads as the label + of any other field (#1729). */ +.ffc-shortcode fieldset.ffc-choice-field { + border: 0; + margin: 0 0 var(--ffc-spacing-2xl); + padding: 0; + min-width: 0; +} + +.ffc-shortcode .ffc-field-legend { + display: block; + padding: 0; + margin-bottom: var(--ffc-spacing-sm); + font-weight: 500; + color: var(--ffc-text-secondary); + font-size: var(--ffc-font-size-xl); +} + +.ffc-shortcode .ffc-radio-group label.is-disabled { + color: var(--ffc-text-muted); + cursor: not-allowed; +} + +.ffc-shortcode .ffc-field-hint, +.ffc-shortcode .ffc-field-counter { + margin: var(--ffc-spacing-xs) 0 0; + font-size: var(--ffc-font-size-sm); + color: var(--ffc-text-secondary); +} + +.ffc-shortcode .ffc-field-legend + .ffc-field-hint { + margin: 0 0 var(--ffc-spacing-sm); +} + +/* A control keeps the bottom margin every field has; what follows it + directly is pulled up under it, so it reads as part of the field. */ +.ffc-shortcode .ffc-input + .ffc-length-counter, +.ffc-shortcode .ffc-input + .ffc-field-hint { + margin-top: calc(var(--ffc-spacing-xl) * -1 + var(--ffc-spacing-xs)); +} + +.ffc-shortcode .ffc-length-counter { + text-align: right; +} + +.ffc-shortcode .ffc-length-counter.is-below-min { + color: var(--ffc-warning-text); +} + +/* Per-question verdict after a quiz attempt (#1730): the word carries the + meaning, the colour and the icon only repeat it. */ +.ffc-shortcode .ffc-quiz-verdict { + display: flex; + align-items: center; + gap: var(--ffc-spacing-2xs); + margin: var(--ffc-spacing-xs) 0 0; + font-size: var(--ffc-font-size-sm); + font-weight: 600; +} + +.ffc-shortcode .ffc-quiz-right .ffc-quiz-verdict { + color: var(--ffc-success-text); +} + +.ffc-shortcode .ffc-quiz-wrong .ffc-quiz-verdict { + color: var(--ffc-danger-text); +} + /* ============================================ INFO BLOCK - v4.9.0 ============================================ */ @@ -2318,3 +2395,17 @@ details.ffc-consent-description > p { border: 1px solid CanvasText; } } + +/* Quiz "leave the window" dialog (#1731). It reuses the shared modal; the + theme's paragraph size would otherwise dwarf the dialog's own title. */ +.ffc-shortcode .ffc-quiz-leave-overlay .ffc-modal-header h3 { + font-weight: 600; + color: var(--ffc-text); +} + +.ffc-shortcode .ffc-quiz-leave-overlay .ffc-modal-body p { + margin: 0; + font-size: var(--ffc-font-size-base); + line-height: 1.5; + color: var(--ffc-text); +} diff --git a/assets/css/ffc-frontend.min.css b/assets/css/ffc-frontend.min.css index cb097c220..7f814bc76 100644 --- a/assets/css/ffc-frontend.min.css +++ b/assets/css/ffc-frontend.min.css @@ -1,2 +1,2 @@ -.ffc-shortcode .ffc-input{width:100%!important;max-width:none!important;height:45px!important;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg)!important;border:1px solid var(--ffc-border)!important;border-radius:var(--ffc-radius-sm)!important;font-size:var(--ffc-font-size-xl)!important;line-height:1.5!important;box-sizing:border-box!important;background-color:var(--ffc-bg-input)!important;color:var(--ffc-text);display:block!important;margin-bottom:var(--ffc-spacing-xl);transition:border-color var(--ffc-transition-base),box-shadow var(--ffc-transition-base);-webkit-appearance:none}.ffc-shortcode .ffc-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-form-field textarea.ffc-textarea,.ffc-shortcode textarea.ffc-input,.ffc-shortcode.ffc-form-wrapper textarea.ffc-input{height:auto!important;min-height:45px!important;max-height:300px!important;overflow-y:auto!important;resize:vertical!important}.ffc-shortcode.ffc-form-wrapper{max-width:var(--ffc-form-width);margin:30px auto;padding:30px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-form-title{margin:0 0 25px 0;font-size:var(--ffc-font-size-2xl);color:var(--ffc-text);text-align:center;font-weight:600;width:100%}.ffc-shortcode .ffc-submission-form{width:100%;max-width:calc(var(--ffc-form-width) - 150px);display:flex;flex-direction:column;align-items:stretch}.ffc-shortcode .ffc-submission-form:has(.ffc-success-response){max-width:100%}.ffc-shortcode .ffc-form-field{margin-bottom:var(--ffc-spacing-2xl);width:100%}.ffc-shortcode .ffc-form-field label{display:block;margin-bottom:var(--ffc-spacing-sm);font-weight:500;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-xl);text-transform:none}.ffc-shortcode .ffc-form-field label .ffc-required{color:var(--ffc-danger);font-weight:700;margin-left:3px}.ffc-shortcode .ffc-radio-group{display:flex;flex-direction:column;gap:var(--ffc-spacing-md)}.ffc-shortcode .ffc-radio-group label{display:flex;align-items:center;gap:var(--ffc-spacing-sm);font-weight:400;cursor:pointer}.ffc-shortcode .ffc-form-info-block{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-schedule-exception-banner{max-width:calc(var(--ffc-form-width) - 150px);margin-left:auto;margin-right:auto;border:2px solid var(--ffc-primary);border-left-width:2px}.ffc-shortcode .ffc-schedule-exception-banner p{margin:0;font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-shortcode .ffc-info-title{margin:0 0 var(--ffc-spacing-sm) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}.ffc-shortcode .ffc-info-content{font-size:var(--ffc-font-size-base);line-height:1.6;color:var(--ffc-text-secondary)}.ffc-shortcode .ffc-info-content p{margin:0 0 var(--ffc-spacing-sm) 0}.ffc-shortcode .ffc-info-content p:last-child{margin-bottom:0}.ffc-shortcode .ffc-info-content a{color:var(--ffc-link);text-decoration:underline}.ffc-shortcode .ffc-info-content a:hover{color:var(--ffc-link-hover)}.ffc-shortcode .ffc-info-content ol,.ffc-shortcode .ffc-info-content ul{margin:var(--ffc-spacing-sm) 0;padding-left:var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-form-embed-block{margin-bottom:var(--ffc-spacing-2xl);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-embed-caption{margin:0 0 var(--ffc-spacing-sm) 0;font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted);font-style:italic}.ffc-shortcode .ffc-embed-media{max-width:var(--ffc-form-width);width:100%}.ffc-shortcode .ffc-embed-media iframe{max-width:100%;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-embed-image{max-width:100%;height:auto;border-radius:var(--ffc-radius-sm);display:block}.ffc-shortcode .ffc-embed-media a{color:var(--ffc-link);word-break:break-all}.ffc-shortcode .ffc-lgpd-consent{margin:25px 0 var(--ffc-spacing-2xl) 0;padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring)}.ffc-shortcode .ffc-consent-label{display:flex;align-items:flex-start;gap:var(--ffc-spacing-lg);cursor:pointer;margin-bottom:0;font-weight:400}.ffc-shortcode .ffc-consent-label input[type=checkbox]{width:20px;height:20px;min-width:20px;margin:var(--ffc-spacing-3xs) 0 0 0;cursor:pointer;flex-shrink:0;accent-color:var(--ffc-primary)}.ffc-shortcode .ffc-consent-text{flex:1;font-size:var(--ffc-font-size-base);line-height:1.6;color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text a{color:var(--ffc-link);text-decoration:underline;font-weight:500;transition:color var(--ffc-transition-base)}.ffc-shortcode .ffc-consent-text a:hover{color:var(--ffc-link-hover);text-decoration:none}.ffc-shortcode .ffc-consent-text .ffc-required{color:var(--ffc-danger);font-weight:700;margin-left:3px}.ffc-shortcode .ffc-consent-description{margin:var(--ffc-spacing-lg) 0 0 0;padding:var(--ffc-spacing-lg);background:var(--ffc-bg);border-left:3px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);line-height:1.5;color:var(--ffc-text-muted);box-sizing:border-box}.ffc-shortcode .ffc-consent-description a{color:var(--ffc-link);text-decoration:none;font-weight:500}.ffc-shortcode .ffc-consent-description a:hover{text-decoration:underline}details.ffc-consent-description>summary{cursor:pointer;list-style:none;outline:0}details.ffc-consent-description>summary::-webkit-details-marker{display:none}details.ffc-consent-description>summary::marker{content:''}details.ffc-consent-description>summary:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-device-disclosure-more{margin-left:var(--ffc-spacing-2xs);color:var(--ffc-link);text-decoration:underline;font-weight:500}details.ffc-consent-description[open]>summary>.ffc-device-disclosure-more{text-decoration:none}details.ffc-consent-description>p{margin:var(--ffc-spacing-sm) 0 0 0}.ffc-shortcode .ffc-consent-label input[type=checkbox]:invalid{outline:2px solid var(--ffc-danger);outline-offset:2px}.ffc-shortcode .ffc-consent-label input[type=checkbox]:valid{outline:0}.ffc-shortcode .ffc-consent-label input[type=checkbox]:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}@media (max-width:768px){.ffc-shortcode .ffc-lgpd-consent{padding:var(--ffc-spacing-xl);margin:var(--ffc-spacing-2xl) 0 var(--ffc-spacing-xl) 0}.ffc-shortcode .ffc-consent-label{gap:var(--ffc-spacing-md)}.ffc-shortcode .ffc-consent-text{font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-consent-description{margin-left:0;font-size:var(--ffc-font-size-xs)}}@media (prefers-contrast:more){.ffc-shortcode .ffc-lgpd-consent{border-width:3px;border-color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text{color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text a{color:var(--ffc-link);text-decoration:underline}}@media print{.ffc-shortcode .ffc-lgpd-consent{display:none}}.ffc-shortcode .ffc-security-container{margin-top:25px;padding-top:25px;border-top:1px solid var(--ffc-border-light);width:100%}.ffc-shortcode .ffc-altcha-row{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-2xl);background:var(--ffc-primary-light);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-altcha-row altcha-widget{--altcha-max-width:100%;display:block;width:100%;font-family:var(--ffc-font-family);font-size:var(--ffc-font-size-xl);--altcha-border-color:var(--ffc-border);--altcha-border-radius:var(--ffc-radius-sm);--altcha-checkbox-border-color:var(--ffc-border);--altcha-color-base:var(--ffc-bg-input);--altcha-color-base-content:var(--ffc-text);--altcha-color-error:var(--ffc-danger);--altcha-color-primary:var(--ffc-primary);--altcha-color-success:var(--ffc-success);--altcha-spinner-color:var(--ffc-primary)}.ffc-shortcode .ffc-altcha-error,.ffc-shortcode .ffc-altcha-noscript{margin:var(--ffc-spacing-md) 0 0;color:var(--ffc-danger);font-weight:600}.ffc-shortcode .ffc-captcha-row{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-2xl);background:var(--ffc-primary-light);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-captcha-row label{display:block;margin-bottom:var(--ffc-spacing-md);font-weight:600;color:var(--ffc-primary);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-captcha-row .ffc-input{color:var(--ffc-text);border:2px solid var(--ffc-primary)!important;background:var(--ffc-bg-input)!important;margin-bottom:0!important}.ffc-shortcode .ffc-captcha-row .ffc-input:focus{border-color:var(--ffc-primary-hover);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-submit-btn{width:100%;padding:var(--ffc-spacing-xl);background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:none;border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl);font-weight:600;cursor:pointer;transition:background var(--ffc-transition-slow),transform .1s;box-sizing:border-box}.ffc-shortcode .ffc-submit-btn:hover{background:var(--ffc-primary-hover)}.ffc-shortcode .ffc-submit-btn:active{transform:scale(.98)}.ffc-shortcode .ffc-submit-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-shortcode .ffc-submit-btn:disabled{background:var(--ffc-border);cursor:not-allowed;transform:none}.ffc-shortcode .ffc-message{margin-top:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-shortcode .ffc-message.ffc-success{background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success-border)}.ffc-shortcode .ffc-message.ffc-error{background:var(--ffc-danger-bg);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger-border)}.ffc-shortcode.ffc-verification-container{max-width:var(--ffc-form-width);margin:30px auto;padding:30px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-verification-header{margin-bottom:30px;text-align:center;width:100%}.ffc-shortcode .ffc-verification-header h2{margin:0 0 var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-2xl);color:var(--ffc-text);font-weight:600}.ffc-shortcode .ffc-verification-header p{margin:0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-verification-manual,.ffc-shortcode.ffc-verification-manual{width:100%;display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-verification-form{width:100%;max-width:calc(var(--ffc-form-width) - 150px);display:flex;flex-direction:column;align-items:stretch}.ffc-shortcode .ffc-verify-input{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border:2px solid var(--ffc-border-light);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl);font-family:monospace;text-transform:uppercase;letter-spacing:2px;text-align:center;background:var(--ffc-bg-input);color:var(--ffc-text);transition:border-color var(--ffc-transition-slow)}.ffc-shortcode .ffc-verify-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-no-js-security{margin-top:var(--ffc-spacing-2xs);width:100%}.ffc-shortcode .ffc-verify-result{margin-top:var(--ffc-spacing-2xl);width:100%}.ffc-shortcode .ffc-verify-error{padding:var(--ffc-spacing-xl);background:var(--ffc-danger-bg);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success{padding:var(--ffc-spacing-2xl);background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success-border);border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-verify-success h3{margin:0 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success p{margin:var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success hr{margin:var(--ffc-spacing-xl) 0;border:none;border-top:1px solid var(--ffc-success-border)}.ffc-shortcode .ffc-verify-success h4{margin:var(--ffc-spacing-xl) 0 var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode.ffc-magic-link-container{position:relative;min-height:200px}.ffc-shortcode .ffc-certificate-preview{width:100%;max-width:700px;margin:0 auto;background:var(--ffc-bg-card);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);overflow:hidden;box-shadow:0 4px 12px var(--ffc-focus-ring);animation:fadeInUp .5s ease}@keyframes fadeInUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.ffc-shortcode .ffc-preview-header{background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary);padding:var(--ffc-spacing-2xl);text-align:center}.ffc-shortcode .ffc-status-badge{display:inline-block;font-size:var(--ffc-font-size-2xl);font-weight:600;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xl);background:rgba(255,255,255,.2);border-radius:20px;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.ffc-shortcode .ffc-status-badge.ffc-status-badge-success{background:rgba(212,237,218,.3)}.ffc-shortcode .ffc-certificate-preview.ffc-error{border-color:var(--ffc-danger);box-shadow:0 4px 12px var(--ffc-danger-bg)}.ffc-shortcode .ffc-certificate-preview.ffc-error .ffc-preview-header{background:linear-gradient(135deg,var(--ffc-danger) 0,var(--ffc-danger-hover) 100%)}.ffc-shortcode .ffc-status-badge.ffc-status-badge-error{background:rgba(252,240,241,.25)}.ffc-shortcode .ffc-error-message{margin:0 0 var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-lg);line-height:1.5;color:var(--ffc-text)}.ffc-shortcode .ffc-manual-verification-form{padding-top:var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-manual-verification-form h4{margin:0 0 var(--ffc-spacing-lg);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text-secondary);border-bottom:none;padding-bottom:0}.ffc-shortcode .ffc-manual-verification-form .ffc-manual-auth-code{width:100%;max-width:320px;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);font-family:'Courier New',monospace;margin:0 0 var(--ffc-spacing-lg);box-sizing:border-box}.ffc-shortcode .ffc-manual-verification-form .ffc-manual-verify-btn{display:inline-block;padding:var(--ffc-spacing-md) var(--ffc-spacing-3xl);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-preview-body{padding:30px}.ffc-shortcode .ffc-preview-body h3{margin:0 0 var(--ffc-spacing-2xl) 0;font-size:var(--ffc-font-size-xl);color:var(--ffc-text);font-weight:600;border-bottom:2px solid var(--ffc-primary);padding-bottom:var(--ffc-spacing-md)}.ffc-shortcode .ffc-preview-body h4{margin:25px 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-lg);color:var(--ffc-text-secondary);font-weight:600;border-bottom:2px solid var(--ffc-primary);padding-bottom:var(--ffc-spacing-md)}.ffc-shortcode .ffc-detail-row{display:flex;justify-content:space-between;align-items:center;padding:var(--ffc-spacing-lg) 0;border-bottom:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-detail-row:last-child{border-bottom:none}.ffc-shortcode .ffc-detail-row .ffc-detail-label{font-weight:600;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-detail-row .ffc-detail-value{color:var(--ffc-text);font-size:var(--ffc-font-size-base);text-align:right;max-width:60%;overflow-wrap:break-word}.ffc-shortcode .ffc-detail-row .ffc-detail-value.ffc-detail-value-code{font-family:'Courier New',monospace;font-size:var(--ffc-font-size-lg);color:var(--ffc-primary);font-weight:600;letter-spacing:1px}.ffc-shortcode .ffc-preview-body hr{margin:var(--ffc-spacing-2xl) 0;border:none;border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-verification-status{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);font-weight:600;text-transform:uppercase}.ffc-shortcode .ffc-verification-status-pending{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-shortcode .ffc-verification-status-confirmed{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-shortcode .ffc-verification-status-cancelled{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-shortcode .ffc-verification-status-completed{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-no_show{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-shortcode .ffc-verification-status-in_progress{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-submitted{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-approved{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-shortcode .ffc-verification-status-rejected{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-shortcode .ffc-verification-status-expired{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-shortcode .ffc-schedule-exception-block{margin:25px 0 var(--ffc-spacing-2xs);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-preview-body .ffc-schedule-exception-block h4{display:flex;align-items:center;gap:var(--ffc-spacing-sm);margin:0 0 var(--ffc-spacing-sm);padding-bottom:var(--ffc-spacing-sm);border-bottom:1px solid var(--ffc-warning-border);color:var(--ffc-warning-text);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-schedule-exception-icon{width:18px;height:18px;flex-shrink:0}.ffc-shortcode .ffc-schedule-exception-block .description{margin:0 0 var(--ffc-spacing-lg);font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-warning-text)}.ffc-shortcode .ffc-schedule-exception-block .ffc-detail-row{border-bottom-color:var(--ffc-warning-border);padding:var(--ffc-spacing-sm) 0}.ffc-shortcode .ffc-schedule-exception-block .ffc-detail-row:last-child{border-bottom:none;padding-bottom:0}.ffc-shortcode .ffc-preview-actions{padding:25px 30px;text-align:center;background:var(--ffc-bg-alt);border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-download-btn{display:inline-block;background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary);border:none;padding:var(--ffc-spacing-xl) 40px;font-size:var(--ffc-font-size-xl);font-weight:600;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:all var(--ffc-transition-slow);box-shadow:0 4px 12px var(--ffc-focus-ring)}.ffc-shortcode .ffc-download-btn:hover{transform:translateY(-2px);box-shadow:0 6px 16px var(--ffc-focus-ring)}.ffc-shortcode .ffc-download-btn:active{transform:translateY(0);box-shadow:var(--ffc-shadow-sm)}.ffc-shortcode .ffc-download-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-shortcode .ffc-download-btn:disabled{background:var(--ffc-border);cursor:not-allowed;transform:none;box-shadow:none}.ffc-shortcode.ffc-has-geofence .ffc-submission-form{display:none!important}.ffc-shortcode.ffc-has-geofence.ffc-validated .ffc-submission-form{display:block!important}.ffc-shortcode .ffc-geofence-loading-msg{text-align:center;padding:30px var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-geofence-loading-msg p{margin:var(--ffc-spacing-2xl) 0 0 0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-geofence-blocked{background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:var(--ffc-spacing-2xl) 0;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-geofence-blocked p{margin:0;color:var(--ffc-warning-text);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-geofence-reload-btn{margin-top:var(--ffc-spacing-lg)}.ffc-shortcode .ffc-geofence-admin-bypass{background:var(--ffc-info-bg);border-left:4px solid var(--ffc-info-border);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-2xl) 0;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-geofence-admin-bypass p{margin:0;color:var(--ffc-info-text);font-size:var(--ffc-font-size-base);font-weight:500}.ffc-shortcode .ffc-geofence-bypass-badge{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);margin:0 0 var(--ffc-spacing-sm) 0;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border:1px solid var(--ffc-info-border);border-radius:var(--ffc-radius-sm);background:var(--ffc-info-bg);color:var(--ffc-info-text);font-size:var(--ffc-font-size-xs);font-weight:600;line-height:1.4;cursor:help}.ffc-shortcode .ffc-verify-loading{text-align:center;padding:60px var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-verify-loading p{margin:var(--ffc-spacing-2xl) 0 0 0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-spinner{width:50px;height:50px;margin:0 auto;border:4px solid var(--ffc-border-light);border-top:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media (max-width:768px){.ffc-shortcode .ffc-certificate-preview,.ffc-shortcode.ffc-form-wrapper,.ffc-shortcode.ffc-verification-container{padding:var(--ffc-spacing-2xl);margin:var(--ffc-spacing-xl)}.ffc-shortcode .ffc-form-title,.ffc-shortcode .ffc-verification-header h2{font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-detail-row{flex-direction:column;align-items:flex-start;gap:var(--ffc-spacing-sm)}.ffc-shortcode .ffc-detail-row .ffc-detail-value{text-align:left;max-width:100%}.ffc-shortcode .ffc-download-btn{width:100%;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-preview-body h3{font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-status-badge{font-size:var(--ffc-font-size-xl)}}@media print{.ffc-shortcode .ffc-preview-actions,.ffc-shortcode .ffc-preview-header,.ffc-shortcode .ffc-submit-btn{display:none}.ffc-shortcode .ffc-certificate-preview{border:none;box-shadow:none}}.ffc-shortcode .ffc-success-auth-code .ffc-detail-value.ffc-detail-value-code{display:inline-flex;align-items:center;gap:var(--ffc-spacing-sm);flex-wrap:wrap;justify-content:flex-end}.ffc-shortcode .ffc-success-code{white-space:nowrap}.ffc-shortcode .ffc-success-row-hint{margin:var(--ffc-spacing-xs) 0 var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);line-height:1.5}.ffc-shortcode .ffc-detail-row.ffc-success-magic-link-row{justify-content:flex-start;gap:var(--ffc-spacing-md);flex-wrap:wrap}.ffc-shortcode .ffc-magic-link-url{color:var(--ffc-primary);text-decoration:underline;font-family:'Courier New',monospace;font-size:var(--ffc-font-size-sm);word-break:break-all;flex:1 1 200px;min-width:0}.ffc-shortcode .ffc-copy-btn{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border:1px solid var(--ffc-primary);background:0 0;color:var(--ffc-primary);border-radius:var(--ffc-radius-sm);font-family:inherit;font-size:var(--ffc-font-size-xs);font-weight:600;letter-spacing:normal;line-height:1.4;cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.ffc-shortcode .ffc-copy-btn:focus,.ffc-shortcode .ffc-copy-btn:hover{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-shortcode .ffc-success-where-is-file{max-width:calc(var(--ffc-form-width) - 150px);margin:var(--ffc-spacing-xl) auto 0;padding:0;text-align:left;box-sizing:border-box}.ffc-shortcode .ffc-success-where-title{cursor:pointer;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);list-style:revert;padding:0}.ffc-shortcode .ffc-success-where-is-file[open] .ffc-success-where-title{margin-bottom:var(--ffc-spacing-sm)}.ffc-shortcode .ffc-success-where-is-file ul{margin:0;padding-left:var(--ffc-spacing-xl)}.ffc-shortcode .ffc-success-where-is-file li{font-size:var(--ffc-font-size-base);line-height:1.5;margin:var(--ffc-spacing-2xs) 0}.ffc-preflight-banner{border:1px solid var(--ffc-warning-border);background:var(--ffc-warning-bg);color:var(--ffc-warning-text);padding:var(--ffc-spacing-xl) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-md);margin:var(--ffc-spacing-lg) 0;text-align:left}.ffc-preflight-banner-title{display:block;font-size:var(--ffc-font-size-lg);margin-bottom:var(--ffc-spacing-xs);color:var(--ffc-warning-text)}.ffc-preflight-banner-body,.ffc-preflight-banner-how{margin:var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-preflight-banner-how{color:var(--ffc-warning-text);font-style:italic}.ffc-preflight-try-anyway{display:inline-block;margin-top:var(--ffc-spacing-md);padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);background:0 0;color:var(--ffc-warning-text);border:1px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm);font-weight:600;cursor:pointer;transition:background .15s ease}.ffc-preflight-try-anyway:focus,.ffc-preflight-try-anyway:hover{background:var(--ffc-warning);color:var(--ffc-text-on-warning)}.ffc-submit-btn.ffc-btn-loading{opacity:.7;cursor:not-allowed}.ffc-public-csv-download .ffc-info-screen{width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-header{display:flex;align-items:center;gap:var(--ffc-spacing-lg);margin-bottom:var(--ffc-spacing-3xl);padding-bottom:var(--ffc-spacing-xl);border-bottom:1px solid var(--ffc-border);width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-header h2{margin:0;font-size:var(--ffc-font-size-2xl);font-weight:600;color:var(--ffc-text);flex:1}.ffc-public-csv-download .ffc-info-back{background:0 0;border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm,4px);padding:var(--ffc-spacing-xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);white-space:nowrap}.ffc-public-csv-download .ffc-info-back:hover{border-color:var(--ffc-primary);color:var(--ffc-primary)}.ffc-public-csv-download .ffc-info-back-arrow{font-size:var(--ffc-font-size-lg);line-height:1}.ffc-public-csv-download .ffc-info-section{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl);background:var(--ffc-bg-alt);border-radius:var(--ffc-radius-sm,6px);border:1px solid var(--ffc-border);width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-section h3{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);font-weight:600;color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.5px}.ffc-public-csv-download .ffc-info-section.ffc-info-summary{background:var(--ffc-bg-card);border-color:var(--ffc-primary);border-left:3px solid var(--ffc-primary)}.ffc-public-csv-download .ffc-info-row{display:flex;justify-content:space-between;align-items:center;gap:var(--ffc-spacing-lg);padding:var(--ffc-spacing-xs) 0;width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-row+.ffc-info-row{border-top:1px solid var(--ffc-border)}.ffc-public-csv-download .ffc-info-label{font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-value{font-size:var(--ffc-font-size-base);font-weight:500;color:var(--ffc-text);text-align:right}.ffc-public-csv-download .ffc-info-subsection{margin-bottom:var(--ffc-spacing-sm)}.ffc-public-csv-download .ffc-info-subsection:last-child{margin-bottom:0}.ffc-public-csv-download .ffc-info-sublabel{font-size:var(--ffc-font-size-sm);font-weight:500;color:var(--ffc-text-muted);display:block;margin-bottom:var(--ffc-spacing-2xs)}.ffc-public-csv-download .ffc-info-list{margin:0;padding:0 0 0 var(--ffc-spacing-2xl);list-style:disc}.ffc-public-csv-download .ffc-info-list li{font-size:var(--ffc-font-size-base);color:var(--ffc-text);padding:var(--ffc-spacing-3xs) 0}.ffc-public-csv-download .ffc-info-list-restrictions li{color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-list-locations li a{color:var(--ffc-primary);text-decoration:none}.ffc-public-csv-download .ffc-info-list-locations li a:hover{text-decoration:underline}.ffc-public-csv-download .ffc-info-alert{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm,6px);font-size:var(--ffc-font-size-base);line-height:1.5;margin-top:var(--ffc-spacing-lg)}.ffc-public-csv-download .ffc-info-alert-warning{background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);color:var(--ffc-warning-text)}.ffc-public-csv-download .ffc-info-alert-info{background:var(--ffc-info-bg);border:1px solid var(--ffc-info-border);color:var(--ffc-info-text)}.ffc-public-csv-download .ffc-info-alert-success{background:var(--ffc-success-bg);border:1px solid var(--ffc-success-border);color:var(--ffc-success-text)}.ffc-public-csv-download .ffc-info-actions{display:flex;gap:var(--ffc-spacing-lg);margin-top:var(--ffc-spacing-3xl);flex-wrap:wrap;width:100%;box-sizing:border-box}.ffc-extend-end-modal .ffc-info-btn,.ffc-open-early-modal .ffc-info-btn,.ffc-public-csv-download .ffc-info-btn{flex:1;min-width:160px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);border:none;border-radius:var(--ffc-radius-sm,6px);font-size:var(--ffc-font-size-base);font-weight:600;cursor:pointer;transition:all .2s ease;text-align:center}.ffc-extend-end-modal .ffc-info-btn-primary,.ffc-open-early-modal .ffc-info-btn-primary,.ffc-public-csv-download .ffc-info-btn-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-extend-end-modal .ffc-info-btn-primary:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-primary:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-primary:hover:not([disabled]){background:var(--ffc-primary-hover)}.ffc-extend-end-modal .ffc-info-btn-primary[disabled],.ffc-open-early-modal .ffc-info-btn-primary[disabled],.ffc-public-csv-download .ffc-info-btn-primary[disabled]{opacity:.5;cursor:not-allowed}.ffc-extend-end-modal .ffc-info-btn-secondary,.ffc-open-early-modal .ffc-info-btn-secondary,.ffc-public-csv-download .ffc-info-btn-secondary{background:var(--ffc-bg-alt);color:var(--ffc-text);border:1px solid var(--ffc-border)}.ffc-extend-end-modal .ffc-info-btn-secondary:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-secondary:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-secondary:hover:not([disabled]){background:var(--ffc-border)}.ffc-extend-end-modal .ffc-info-btn-secondary[disabled],.ffc-open-early-modal .ffc-info-btn-secondary[disabled],.ffc-public-csv-download .ffc-info-btn-secondary[disabled]{opacity:.5;cursor:not-allowed}.ffc-extend-end-modal .ffc-info-btn-warning,.ffc-open-early-modal .ffc-info-btn-warning,.ffc-public-csv-download .ffc-info-btn-warning{background:var(--ffc-warning);color:var(--ffc-text-on-warning);border:1px solid var(--ffc-warning)}.ffc-extend-end-modal .ffc-info-btn-warning:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-warning:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-warning:hover:not([disabled]){background:var(--ffc-warning-text);border-color:var(--ffc-warning-text)}.ffc-extend-end-modal .ffc-info-btn-warning[disabled],.ffc-open-early-modal .ffc-info-btn-warning[disabled],.ffc-public-csv-download .ffc-info-btn-warning[disabled]{opacity:.5;cursor:not-allowed}.ffc-open-early-modal{position:fixed;inset:0;z-index:100001;display:flex;align-items:center;justify-content:center}.ffc-schedule-exception-opening{display:flex;align-items:center;gap:var(--ffc-spacing-md);margin:0}.ffc-schedule-exception-spinner{display:inline-block;flex:0 0 auto;width:22px;height:22px;border:3px solid var(--ffc-border-light);border-top:3px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:spin 1s linear infinite}.ffc-public-csv-download .ffc-info-form-link{color:var(--ffc-primary);font-weight:600;text-decoration:none;white-space:nowrap}.ffc-public-csv-download .ffc-info-form-link:hover{text-decoration:underline}.ffc-public-csv-download .ffc-info-table{width:100%;border-collapse:collapse;font-size:var(--ffc-font-size-base)}.ffc-public-csv-download .ffc-info-table thead th{font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--ffc-text-muted);border-bottom:1px solid var(--ffc-border);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xs)}.ffc-public-csv-download .ffc-info-table thead th.ffc-info-table-col{text-align:right}.ffc-public-csv-download .ffc-info-table td{padding:var(--ffc-spacing-xs);border-bottom:1px solid var(--ffc-border)}.ffc-public-csv-download .ffc-info-table tbody tr:last-child td{border-bottom:0}.ffc-public-csv-download .ffc-info-table .ffc-info-table-label{color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-table .ffc-info-table-value{text-align:right;font-weight:500;color:var(--ffc-text);font-variant-numeric:tabular-nums}.ffc-public-csv-download .ffc-info-table .ffc-info-table-dash{text-align:right;color:var(--ffc-border)}.ffc-public-csv-download .ffc-info-schedule-ref-note{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);margin:var(--ffc-spacing-sm) 0 0}.ffc-open-early-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-open-early-container{position:relative;z-index:var(--ffc-z-raised);width:92%;max-width:540px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg,8px);box-shadow:var(--ffc-shadow-lg);display:flex;flex-direction:column;overflow:hidden}.ffc-open-early-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary)}.ffc-open-early-header h2{margin:0;font-size:var(--ffc-font-size-xl);font-weight:600;color:var(--ffc-text-on-primary);display:flex;align-items:center;gap:var(--ffc-spacing-sm)}.ffc-open-early-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:26px;cursor:pointer;padding:0 var(--ffc-spacing-2xs);line-height:1;transition:color var(--ffc-transition-base)}.ffc-open-early-close:focus-visible,.ffc-open-early-close:hover{color:var(--ffc-inverse-on-surface);outline:0}.ffc-open-early-body{padding:var(--ffc-spacing-2xl) var(--ffc-spacing-3xl);color:var(--ffc-text);font-size:var(--ffc-font-size-base);line-height:1.55}.ffc-open-early-body p{margin:0 0 var(--ffc-spacing-lg)}.ffc-open-early-times{list-style:none;padding:0;margin:var(--ffc-spacing-sm) 0 var(--ffc-spacing-lg)}.ffc-open-early-times li{margin:var(--ffc-spacing-2xs) 0}.ffc-open-early-warn{color:var(--ffc-danger-text);background:var(--ffc-danger-bg);border-left:3px solid var(--ffc-danger);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);margin:var(--ffc-spacing-lg) 0 var(--ffc-spacing-2xs);border-radius:var(--ffc-radius-sm,4px);font-weight:500}.ffc-open-early-warn-cache{background:var(--ffc-warning-light);border-left:3px solid var(--ffc-warning);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);margin:var(--ffc-spacing-lg) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-warning-text);border-radius:var(--ffc-radius-sm,4px)}.ffc-extend-end-modal .ffc-extend-end-input{width:100%;height:45px;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm,4px);font-size:var(--ffc-font-size-lg);line-height:1.5;background:var(--ffc-bg-input);color:var(--ffc-text);box-sizing:border-box;transition:border-color var(--ffc-transition-base),box-shadow var(--ffc-transition-base)}.ffc-extend-end-modal .ffc-extend-end-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-extend-end-modal .ffc-extend-end-input-invalid{border-color:var(--ffc-danger)}.ffc-extend-end-error{margin:var(--ffc-spacing-xs) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-danger)}.ffc-open-early-actions{display:flex;justify-content:flex-end;gap:var(--ffc-spacing-lg);padding:var(--ffc-spacing-lg) var(--ffc-spacing-3xl) var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border);background:var(--ffc-bg-alt)}.ffc-open-early-actions .ffc-extend-end-cancel,.ffc-open-early-actions .ffc-open-early-cancel{flex:0 1 auto;min-width:120px;font-weight:600;padding:var(--ffc-spacing-lg) var(--ffc-spacing-3xl);font-size:var(--ffc-font-size-base)}.ffc-open-early-actions .ffc-extend-end-confirm,.ffc-open-early-actions .ffc-open-early-confirm{flex:0 1 auto;min-width:120px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-base)}.ffc-open-early-actions .ffc-open-early-confirm{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm)}#ffc-preview-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;opacity:0;transition:opacity .2s ease;pointer-events:none}#ffc-preview-modal.ffc-preview-visible{opacity:1;pointer-events:auto}.ffc-preview-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-preview-container{position:relative;width:90%;max-width:900px;height:85vh;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg,8px);display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--ffc-shadow-lg)}#ffc-preview-modal .ffc-preview-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);background:var(--ffc-inverse-surface);color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-header h2{margin:0;font-size:var(--ffc-font-size-lg);font-weight:500;color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:var(--ffc-font-size-2xl);cursor:pointer;padding:0 var(--ffc-spacing-2xs);line-height:1}#ffc-preview-modal .ffc-preview-close:hover{color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-note{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);background:var(--ffc-primary-light);border-bottom:1px solid var(--ffc-border);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary)}#ffc-preview-modal .ffc-preview-body{flex:1;display:flex;align-items:center;justify-content:center;overflow:auto;padding:var(--ffc-spacing-lg)}.ffc-preview-stage{position:relative;flex:0 0 auto;overflow:hidden}#ffc-preview-iframe{display:block;border:none;background:#fff}@media (prefers-reduced-motion:reduce){.ffc-shortcode .ffc-certificate-preview{animation:none}.ffc-shortcode .ffc-spinner{animation:none}.ffc-shortcode .ffc-consent-text a,.ffc-shortcode .ffc-csv-progress-bar-fill,.ffc-shortcode .ffc-download-btn,.ffc-shortcode .ffc-input,.ffc-shortcode .ffc-submit-btn,.ffc-shortcode .ffc-verify-input{transition:none}}.ffc-webview-warning{display:flex;gap:var(--ffc-spacing-xl);align-items:flex-start;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-3xl) 0;background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);border-left:4px solid var(--ffc-warning);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-sm)}.ffc-webview-warning-icon{font-size:26px;line-height:1;color:var(--ffc-warning-text);flex-shrink:0}.ffc-webview-warning-icon::before{margin-right:0}.ffc-webview-warning-content{flex:1;min-width:0}.ffc-webview-warning-content h3{margin:0 0 var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-warning-text);line-height:1.3}.ffc-webview-warning-content p{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-text)}.ffc-webview-warning-actions{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-md)}.ffc-webview-warning-dismiss,.ffc-webview-warning-open{padding:var(--ffc-spacing-md) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-base);font-weight:600;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background var(--ffc-transition-base),border-color var(--ffc-transition-base)}.ffc-webview-warning-open{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary)}.ffc-webview-warning-open:focus-visible,.ffc-webview-warning-open:hover{background:var(--ffc-primary-hover,var(--ffc-link-hover));outline:0}.ffc-webview-warning-dismiss{background:0 0;color:var(--ffc-text-secondary);border:1px solid var(--ffc-border)}.ffc-webview-warning-dismiss:focus-visible,.ffc-webview-warning-dismiss:hover{background:var(--ffc-bg-alt);border-color:var(--ffc-border-focus);outline:0}@media (max-width:600px){.ffc-webview-warning{flex-direction:column;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-xl)}.ffc-webview-warning-actions{flex-direction:column;align-items:stretch}.ffc-webview-warning-dismiss,.ffc-webview-warning-open{width:100%;text-align:center}}.ffc-already-submitted-notice{display:flex;gap:var(--ffc-spacing-xl);align-items:flex-start;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-3xl) 0;background:var(--ffc-info-bg);border:1px solid var(--ffc-info-border);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-sm)}.ffc-already-submitted-icon{font-size:var(--ffc-font-size-2xl);line-height:1;color:var(--ffc-primary);flex-shrink:0;font-weight:700}.ffc-already-submitted-icon::before{margin-right:0}.ffc-already-submitted-content{flex:1;min-width:0}.ffc-already-submitted-content h3{margin:0 0 var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-info-text);line-height:1.3}.ffc-already-submitted-content p{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-info-text)}.ffc-already-submitted-dismiss{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);font-weight:600;background:0 0;color:var(--ffc-primary);border:1px solid var(--ffc-info-border);border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background var(--ffc-transition-base),border-color var(--ffc-transition-base)}.ffc-already-submitted-dismiss:focus-visible,.ffc-already-submitted-dismiss:hover{background:var(--ffc-primary-light);border-color:var(--ffc-primary);outline:0}@media (max-width:600px){.ffc-already-submitted-notice{flex-direction:column;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl)}.ffc-already-submitted-dismiss{width:100%;text-align:center}}@media (forced-colors:active){.ffc-extend-end-modal .ffc-info-btn-primary,.ffc-open-early-modal .ffc-info-btn-primary,.ffc-public-csv-download .ffc-info-btn-primary,.ffc-shortcode .ffc-download-btn,.ffc-shortcode .ffc-submit-btn{border:1px solid ButtonText}.ffc-shortcode .ffc-status-badge,.ffc-shortcode .ffc-status-badge.ffc-status-badge-error,.ffc-shortcode .ffc-status-badge.ffc-status-badge-success,.ffc-shortcode .ffc-verification-status-approved,.ffc-shortcode .ffc-verification-status-cancelled,.ffc-shortcode .ffc-verification-status-completed,.ffc-shortcode .ffc-verification-status-confirmed,.ffc-shortcode .ffc-verification-status-expired,.ffc-shortcode .ffc-verification-status-in_progress,.ffc-shortcode .ffc-verification-status-no_show,.ffc-shortcode .ffc-verification-status-pending,.ffc-shortcode .ffc-verification-status-rejected,.ffc-shortcode .ffc-verification-status-submitted{border:1px solid CanvasText}} +.ffc-shortcode :is(input,select,textarea,button){font-family:inherit}.ffc-shortcode .ffc-input{width:100%!important;max-width:none!important;height:45px!important;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg)!important;border:1px solid var(--ffc-border)!important;border-radius:var(--ffc-radius-sm)!important;font-size:var(--ffc-font-size-xl)!important;line-height:1.5!important;box-sizing:border-box!important;background-color:var(--ffc-bg-input)!important;color:var(--ffc-text);display:block!important;margin-bottom:var(--ffc-spacing-xl);transition:border-color var(--ffc-transition-base),box-shadow var(--ffc-transition-base);-webkit-appearance:none}.ffc-shortcode .ffc-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-form-field textarea.ffc-textarea,.ffc-shortcode textarea.ffc-input,.ffc-shortcode.ffc-form-wrapper textarea.ffc-input{height:auto!important;min-height:45px!important;max-height:300px!important;overflow-y:auto!important;resize:vertical!important}.ffc-shortcode.ffc-form-wrapper{max-width:var(--ffc-form-width);margin:30px auto;padding:30px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-form-title{margin:0 0 25px 0;font-size:var(--ffc-font-size-2xl);color:var(--ffc-text);text-align:center;font-weight:600;width:100%}.ffc-shortcode .ffc-submission-form{width:100%;max-width:calc(var(--ffc-form-width) - 150px);display:flex;flex-direction:column;align-items:stretch}.ffc-shortcode .ffc-submission-form:has(.ffc-success-response){max-width:100%}.ffc-shortcode .ffc-form-field{margin-bottom:var(--ffc-spacing-2xl);width:100%}.ffc-shortcode .ffc-form-field label{display:block;margin-bottom:var(--ffc-spacing-sm);font-weight:500;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-xl);text-transform:none}.ffc-shortcode .ffc-field-legend .ffc-required,.ffc-shortcode .ffc-form-field label .ffc-required{color:var(--ffc-danger);font-weight:700;margin-left:3px}.ffc-shortcode .ffc-radio-group{display:flex;flex-direction:column;gap:var(--ffc-spacing-md)}.ffc-shortcode .ffc-radio-group label{display:flex;align-items:center;gap:var(--ffc-spacing-sm);font-weight:400;cursor:pointer}.ffc-shortcode fieldset.ffc-choice-field{border:0;margin:0 0 var(--ffc-spacing-2xl);padding:0;min-width:0}.ffc-shortcode .ffc-field-legend{display:block;padding:0;margin-bottom:var(--ffc-spacing-sm);font-weight:500;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-radio-group label.is-disabled{color:var(--ffc-text-muted);cursor:not-allowed}.ffc-shortcode .ffc-field-counter,.ffc-shortcode .ffc-field-hint{margin:var(--ffc-spacing-xs) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-text-secondary)}.ffc-shortcode .ffc-field-legend+.ffc-field-hint{margin:0 0 var(--ffc-spacing-sm)}.ffc-shortcode .ffc-input+.ffc-field-hint,.ffc-shortcode .ffc-input+.ffc-length-counter{margin-top:calc(var(--ffc-spacing-xl) * -1 + var(--ffc-spacing-xs))}.ffc-shortcode .ffc-length-counter{text-align:right}.ffc-shortcode .ffc-length-counter.is-below-min{color:var(--ffc-warning-text)}.ffc-shortcode .ffc-quiz-verdict{display:flex;align-items:center;gap:var(--ffc-spacing-2xs);margin:var(--ffc-spacing-xs) 0 0;font-size:var(--ffc-font-size-sm);font-weight:600}.ffc-shortcode .ffc-quiz-right .ffc-quiz-verdict{color:var(--ffc-success-text)}.ffc-shortcode .ffc-quiz-wrong .ffc-quiz-verdict{color:var(--ffc-danger-text)}.ffc-shortcode .ffc-form-info-block{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-schedule-exception-banner{max-width:calc(var(--ffc-form-width) - 150px);margin-left:auto;margin-right:auto;border:2px solid var(--ffc-primary);border-left-width:2px}.ffc-shortcode .ffc-schedule-exception-banner p{margin:0;font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-shortcode .ffc-info-title{margin:0 0 var(--ffc-spacing-sm) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}.ffc-shortcode .ffc-info-content{font-size:var(--ffc-font-size-base);line-height:1.6;color:var(--ffc-text-secondary)}.ffc-shortcode .ffc-info-content p{margin:0 0 var(--ffc-spacing-sm) 0}.ffc-shortcode .ffc-info-content p:last-child{margin-bottom:0}.ffc-shortcode .ffc-info-content a{color:var(--ffc-link);text-decoration:underline}.ffc-shortcode .ffc-info-content a:hover{color:var(--ffc-link-hover)}.ffc-shortcode .ffc-info-content ol,.ffc-shortcode .ffc-info-content ul{margin:var(--ffc-spacing-sm) 0;padding-left:var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-form-embed-block{margin-bottom:var(--ffc-spacing-2xl);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-embed-caption{margin:0 0 var(--ffc-spacing-sm) 0;font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted);font-style:italic}.ffc-shortcode .ffc-embed-media{max-width:var(--ffc-form-width);width:100%}.ffc-shortcode .ffc-embed-media iframe{max-width:100%;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-embed-image{max-width:100%;height:auto;border-radius:var(--ffc-radius-sm);display:block}.ffc-shortcode .ffc-embed-media a{color:var(--ffc-link);word-break:break-all}.ffc-shortcode .ffc-lgpd-consent{margin:25px 0 var(--ffc-spacing-2xl) 0;padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring)}.ffc-shortcode .ffc-consent-label{display:flex;align-items:flex-start;gap:var(--ffc-spacing-lg);cursor:pointer;margin-bottom:0;font-weight:400}.ffc-shortcode .ffc-consent-label input[type=checkbox]{width:20px;height:20px;min-width:20px;margin:var(--ffc-spacing-3xs) 0 0 0;cursor:pointer;flex-shrink:0;accent-color:var(--ffc-primary)}.ffc-shortcode .ffc-consent-text{flex:1;font-size:var(--ffc-font-size-base);line-height:1.6;color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text a{color:var(--ffc-link);text-decoration:underline;font-weight:500;transition:color var(--ffc-transition-base)}.ffc-shortcode .ffc-consent-text a:hover{color:var(--ffc-link-hover);text-decoration:none}.ffc-shortcode .ffc-consent-text .ffc-required{color:var(--ffc-danger);font-weight:700;margin-left:3px}.ffc-shortcode .ffc-consent-description{margin:var(--ffc-spacing-lg) 0 0 0;padding:var(--ffc-spacing-lg);background:var(--ffc-bg);border-left:3px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);line-height:1.5;color:var(--ffc-text-muted);box-sizing:border-box}.ffc-shortcode .ffc-consent-description a{color:var(--ffc-link);text-decoration:none;font-weight:500}.ffc-shortcode .ffc-consent-description a:hover{text-decoration:underline}details.ffc-consent-description>summary{cursor:pointer;list-style:none;outline:0}details.ffc-consent-description>summary::-webkit-details-marker{display:none}details.ffc-consent-description>summary::marker{content:''}details.ffc-consent-description>summary:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-device-disclosure-more{margin-left:var(--ffc-spacing-2xs);color:var(--ffc-link);text-decoration:underline;font-weight:500}details.ffc-consent-description[open]>summary>.ffc-device-disclosure-more{text-decoration:none}details.ffc-consent-description>p{margin:var(--ffc-spacing-sm) 0 0 0}.ffc-shortcode .ffc-consent-label input[type=checkbox]:invalid{outline:2px solid var(--ffc-danger);outline-offset:2px}.ffc-shortcode .ffc-consent-label input[type=checkbox]:valid{outline:0}.ffc-shortcode .ffc-consent-label input[type=checkbox]:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}@media (max-width:768px){.ffc-shortcode .ffc-lgpd-consent{padding:var(--ffc-spacing-xl);margin:var(--ffc-spacing-2xl) 0 var(--ffc-spacing-xl) 0}.ffc-shortcode .ffc-consent-label{gap:var(--ffc-spacing-md)}.ffc-shortcode .ffc-consent-text{font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-consent-description{margin-left:0;font-size:var(--ffc-font-size-xs)}}@media (prefers-contrast:more){.ffc-shortcode .ffc-lgpd-consent{border-width:3px;border-color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text{color:var(--ffc-text)}.ffc-shortcode .ffc-consent-text a{color:var(--ffc-link);text-decoration:underline}}@media print{.ffc-shortcode .ffc-lgpd-consent{display:none}}.ffc-shortcode .ffc-security-container{margin-top:25px;padding-top:25px;border-top:1px solid var(--ffc-border-light);width:100%}.ffc-shortcode .ffc-altcha-row{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-2xl);background:var(--ffc-primary-light);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-altcha-row altcha-widget{--altcha-max-width:100%;display:block;width:100%;font-family:var(--ffc-font-family);font-size:var(--ffc-font-size-xl);--altcha-border-color:var(--ffc-border);--altcha-border-radius:var(--ffc-radius-sm);--altcha-checkbox-border-color:var(--ffc-border);--altcha-color-base:var(--ffc-bg-input);--altcha-color-base-content:var(--ffc-text);--altcha-color-error:var(--ffc-danger);--altcha-color-primary:var(--ffc-primary);--altcha-color-success:var(--ffc-success);--altcha-spinner-color:var(--ffc-primary)}.ffc-shortcode .ffc-altcha-error,.ffc-shortcode .ffc-altcha-noscript{margin:var(--ffc-spacing-md) 0 0;color:var(--ffc-danger);font-weight:600}.ffc-shortcode .ffc-captcha-row{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-2xl);background:var(--ffc-primary-light);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:0 2px 8px var(--ffc-focus-ring);width:100%;box-sizing:border-box}.ffc-shortcode .ffc-captcha-row label{display:block;margin-bottom:var(--ffc-spacing-md);font-weight:600;color:var(--ffc-primary);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-captcha-row .ffc-input{color:var(--ffc-text);border:2px solid var(--ffc-primary)!important;background:var(--ffc-bg-input)!important;margin-bottom:0!important}.ffc-shortcode .ffc-captcha-row .ffc-input:focus{border-color:var(--ffc-primary-hover);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-submit-btn{width:100%;padding:var(--ffc-spacing-xl);background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:none;border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl);font-weight:600;cursor:pointer;transition:background var(--ffc-transition-slow),transform .1s;box-sizing:border-box}.ffc-shortcode .ffc-submit-btn:hover{background:var(--ffc-primary-hover)}.ffc-shortcode .ffc-submit-btn:active{transform:scale(.98)}.ffc-shortcode .ffc-submit-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-shortcode .ffc-submit-btn:disabled{background:var(--ffc-border);cursor:not-allowed;transform:none}.ffc-shortcode .ffc-message{margin-top:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-shortcode .ffc-message.ffc-success{background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success-border)}.ffc-shortcode .ffc-message.ffc-error{background:var(--ffc-danger-bg);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger-border)}.ffc-shortcode.ffc-verification-container{max-width:var(--ffc-form-width);margin:30px auto;padding:30px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-verification-header{margin-bottom:30px;text-align:center;width:100%}.ffc-shortcode .ffc-verification-header h2{margin:0 0 var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-2xl);color:var(--ffc-text);font-weight:600}.ffc-shortcode .ffc-verification-header p{margin:0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-verification-manual,.ffc-shortcode.ffc-verification-manual{width:100%;display:flex;flex-direction:column;align-items:center}.ffc-shortcode .ffc-verification-form{width:100%;max-width:calc(var(--ffc-form-width) - 150px);display:flex;flex-direction:column;align-items:stretch}.ffc-shortcode .ffc-verify-input{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border:2px solid var(--ffc-border-light);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl);font-family:monospace;text-transform:uppercase;letter-spacing:2px;text-align:center;background:var(--ffc-bg-input);color:var(--ffc-text);transition:border-color var(--ffc-transition-slow)}.ffc-shortcode .ffc-verify-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-shortcode .ffc-no-js-security{margin-top:var(--ffc-spacing-2xs);width:100%}.ffc-shortcode .ffc-verify-result{margin-top:var(--ffc-spacing-2xl);width:100%}.ffc-shortcode .ffc-verify-error{padding:var(--ffc-spacing-xl);background:var(--ffc-danger-bg);color:var(--ffc-danger-text);border:1px solid var(--ffc-danger-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success{padding:var(--ffc-spacing-2xl);background:var(--ffc-success-bg);color:var(--ffc-success-text);border:1px solid var(--ffc-success-border);border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-verify-success h3{margin:0 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success p{margin:var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-verify-success hr{margin:var(--ffc-spacing-xl) 0;border:none;border-top:1px solid var(--ffc-success-border)}.ffc-shortcode .ffc-verify-success h4{margin:var(--ffc-spacing-xl) 0 var(--ffc-spacing-md) 0;font-size:var(--ffc-font-size-xl)}.ffc-shortcode.ffc-magic-link-container{position:relative;min-height:200px}.ffc-shortcode .ffc-certificate-preview{width:100%;max-width:700px;margin:0 auto;background:var(--ffc-bg-card);border:2px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);overflow:hidden;box-shadow:0 4px 12px var(--ffc-focus-ring);animation:fadeInUp .5s ease}@keyframes fadeInUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.ffc-shortcode .ffc-preview-header{background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary);padding:var(--ffc-spacing-2xl);text-align:center}.ffc-shortcode .ffc-status-badge{display:inline-block;font-size:var(--ffc-font-size-2xl);font-weight:600;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xl);background:rgba(255,255,255,.2);border-radius:20px;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.ffc-shortcode .ffc-status-badge.ffc-status-badge-success{background:rgba(212,237,218,.3)}.ffc-shortcode .ffc-certificate-preview.ffc-error{border-color:var(--ffc-danger);box-shadow:0 4px 12px var(--ffc-danger-bg)}.ffc-shortcode .ffc-certificate-preview.ffc-error .ffc-preview-header{background:linear-gradient(135deg,var(--ffc-danger) 0,var(--ffc-danger-hover) 100%)}.ffc-shortcode .ffc-status-badge.ffc-status-badge-error{background:rgba(252,240,241,.25)}.ffc-shortcode .ffc-error-message{margin:0 0 var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-lg);line-height:1.5;color:var(--ffc-text)}.ffc-shortcode .ffc-manual-verification-form{padding-top:var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-manual-verification-form h4{margin:0 0 var(--ffc-spacing-lg);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text-secondary);border-bottom:none;padding-bottom:0}.ffc-shortcode .ffc-manual-verification-form .ffc-manual-auth-code{width:100%;max-width:320px;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);font-family:'Courier New',monospace;margin:0 0 var(--ffc-spacing-lg);box-sizing:border-box}.ffc-shortcode .ffc-manual-verification-form .ffc-manual-verify-btn{display:inline-block;padding:var(--ffc-spacing-md) var(--ffc-spacing-3xl);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-preview-body{padding:30px}.ffc-shortcode .ffc-preview-body h3{margin:0 0 var(--ffc-spacing-2xl) 0;font-size:var(--ffc-font-size-xl);color:var(--ffc-text);font-weight:600;border-bottom:2px solid var(--ffc-primary);padding-bottom:var(--ffc-spacing-md)}.ffc-shortcode .ffc-preview-body h4{margin:25px 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-lg);color:var(--ffc-text-secondary);font-weight:600;border-bottom:2px solid var(--ffc-primary);padding-bottom:var(--ffc-spacing-md)}.ffc-shortcode .ffc-detail-row{display:flex;justify-content:space-between;align-items:center;padding:var(--ffc-spacing-lg) 0;border-bottom:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-detail-row:last-child{border-bottom:none}.ffc-shortcode .ffc-detail-row .ffc-detail-label{font-weight:600;color:var(--ffc-text-secondary);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-detail-row .ffc-detail-value{color:var(--ffc-text);font-size:var(--ffc-font-size-base);text-align:right;max-width:60%;overflow-wrap:break-word}.ffc-shortcode .ffc-detail-row .ffc-detail-value.ffc-detail-value-code{font-family:'Courier New',monospace;font-size:var(--ffc-font-size-lg);color:var(--ffc-primary);font-weight:600;letter-spacing:1px}.ffc-shortcode .ffc-preview-body hr{margin:var(--ffc-spacing-2xl) 0;border:none;border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-verification-status{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);font-weight:600;text-transform:uppercase}.ffc-shortcode .ffc-verification-status-pending{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-shortcode .ffc-verification-status-confirmed{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-shortcode .ffc-verification-status-cancelled{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-shortcode .ffc-verification-status-completed{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-no_show{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-shortcode .ffc-verification-status-in_progress{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-submitted{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-shortcode .ffc-verification-status-approved{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-shortcode .ffc-verification-status-rejected{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-shortcode .ffc-verification-status-expired{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-shortcode .ffc-schedule-exception-block{margin:25px 0 var(--ffc-spacing-2xs);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-preview-body .ffc-schedule-exception-block h4{display:flex;align-items:center;gap:var(--ffc-spacing-sm);margin:0 0 var(--ffc-spacing-sm);padding-bottom:var(--ffc-spacing-sm);border-bottom:1px solid var(--ffc-warning-border);color:var(--ffc-warning-text);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-schedule-exception-icon{width:18px;height:18px;flex-shrink:0}.ffc-shortcode .ffc-schedule-exception-block .description{margin:0 0 var(--ffc-spacing-lg);font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-warning-text)}.ffc-shortcode .ffc-schedule-exception-block .ffc-detail-row{border-bottom-color:var(--ffc-warning-border);padding:var(--ffc-spacing-sm) 0}.ffc-shortcode .ffc-schedule-exception-block .ffc-detail-row:last-child{border-bottom:none;padding-bottom:0}.ffc-shortcode .ffc-preview-actions{padding:25px 30px;text-align:center;background:var(--ffc-bg-alt);border-top:1px solid var(--ffc-border-light)}.ffc-shortcode .ffc-download-btn{display:inline-block;background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary);border:none;padding:var(--ffc-spacing-xl) 40px;font-size:var(--ffc-font-size-xl);font-weight:600;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:all var(--ffc-transition-slow);box-shadow:0 4px 12px var(--ffc-focus-ring)}.ffc-shortcode .ffc-download-btn:hover{transform:translateY(-2px);box-shadow:0 6px 16px var(--ffc-focus-ring)}.ffc-shortcode .ffc-download-btn:active{transform:translateY(0);box-shadow:var(--ffc-shadow-sm)}.ffc-shortcode .ffc-download-btn:focus-visible{outline:2px solid var(--ffc-primary);outline-offset:2px}.ffc-shortcode .ffc-download-btn:disabled{background:var(--ffc-border);cursor:not-allowed;transform:none;box-shadow:none}.ffc-shortcode.ffc-has-geofence .ffc-submission-form{display:none!important}.ffc-shortcode.ffc-has-geofence.ffc-validated .ffc-submission-form{display:block!important}.ffc-shortcode .ffc-geofence-loading-msg{text-align:center;padding:30px var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-geofence-loading-msg p{margin:var(--ffc-spacing-2xl) 0 0 0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-lg)}.ffc-shortcode .ffc-geofence-blocked{background:var(--ffc-warning-bg);border-left:4px solid var(--ffc-warning-border);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:var(--ffc-spacing-2xl) 0;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-geofence-blocked p{margin:0;color:var(--ffc-warning-text);font-size:var(--ffc-font-size-base)}.ffc-shortcode .ffc-geofence-reload-btn{margin-top:var(--ffc-spacing-lg)}.ffc-shortcode .ffc-geofence-admin-bypass{background:var(--ffc-info-bg);border-left:4px solid var(--ffc-info-border);padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-2xl) 0;border-radius:var(--ffc-radius-sm)}.ffc-shortcode .ffc-geofence-admin-bypass p{margin:0;color:var(--ffc-info-text);font-size:var(--ffc-font-size-base);font-weight:500}.ffc-shortcode .ffc-geofence-bypass-badge{display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);margin:0 0 var(--ffc-spacing-sm) 0;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border:1px solid var(--ffc-info-border);border-radius:var(--ffc-radius-sm);background:var(--ffc-info-bg);color:var(--ffc-info-text);font-size:var(--ffc-font-size-xs);font-weight:600;line-height:1.4;cursor:help}.ffc-shortcode .ffc-verify-loading{text-align:center;padding:60px var(--ffc-spacing-2xl)}.ffc-shortcode .ffc-verify-loading p{margin:var(--ffc-spacing-2xl) 0 0 0;color:var(--ffc-text-muted);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-spinner{width:50px;height:50px;margin:0 auto;border:4px solid var(--ffc-border-light);border-top:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media (max-width:768px){.ffc-shortcode .ffc-certificate-preview,.ffc-shortcode.ffc-form-wrapper,.ffc-shortcode.ffc-verification-container{padding:var(--ffc-spacing-2xl);margin:var(--ffc-spacing-xl)}.ffc-shortcode .ffc-form-title,.ffc-shortcode .ffc-verification-header h2{font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-detail-row{flex-direction:column;align-items:flex-start;gap:var(--ffc-spacing-sm)}.ffc-shortcode .ffc-detail-row .ffc-detail-value{text-align:left;max-width:100%}.ffc-shortcode .ffc-download-btn{width:100%;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-preview-body h3{font-size:var(--ffc-font-size-xl)}.ffc-shortcode .ffc-status-badge{font-size:var(--ffc-font-size-xl)}}@media print{.ffc-shortcode .ffc-preview-actions,.ffc-shortcode .ffc-preview-header,.ffc-shortcode .ffc-submit-btn{display:none}.ffc-shortcode .ffc-certificate-preview{border:none;box-shadow:none}}.ffc-shortcode .ffc-success-auth-code .ffc-detail-value.ffc-detail-value-code{display:inline-flex;align-items:center;gap:var(--ffc-spacing-sm);flex-wrap:wrap;justify-content:flex-end}.ffc-shortcode .ffc-success-code{white-space:nowrap}.ffc-shortcode .ffc-success-row-hint{margin:var(--ffc-spacing-xs) 0 var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);line-height:1.5}.ffc-shortcode .ffc-detail-row.ffc-success-magic-link-row{justify-content:flex-start;gap:var(--ffc-spacing-md);flex-wrap:wrap}.ffc-shortcode .ffc-magic-link-url{color:var(--ffc-primary);text-decoration:underline;font-family:'Courier New',monospace;font-size:var(--ffc-font-size-sm);word-break:break-all;flex:1 1 200px;min-width:0}.ffc-shortcode .ffc-copy-btn{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border:1px solid var(--ffc-primary);background:0 0;color:var(--ffc-primary);border-radius:var(--ffc-radius-sm);font-family:inherit;font-size:var(--ffc-font-size-xs);font-weight:600;letter-spacing:normal;line-height:1.4;cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.ffc-shortcode .ffc-copy-btn:focus,.ffc-shortcode .ffc-copy-btn:hover{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-shortcode .ffc-success-where-is-file{max-width:calc(var(--ffc-form-width) - 150px);margin:var(--ffc-spacing-xl) auto 0;padding:0;text-align:left;box-sizing:border-box}.ffc-shortcode .ffc-success-where-title{cursor:pointer;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);list-style:revert;padding:0}.ffc-shortcode .ffc-success-where-is-file[open] .ffc-success-where-title{margin-bottom:var(--ffc-spacing-sm)}.ffc-shortcode .ffc-success-where-is-file ul{margin:0;padding-left:var(--ffc-spacing-xl)}.ffc-shortcode .ffc-success-where-is-file li{font-size:var(--ffc-font-size-base);line-height:1.5;margin:var(--ffc-spacing-2xs) 0}.ffc-preflight-banner{border:1px solid var(--ffc-warning-border);background:var(--ffc-warning-bg);color:var(--ffc-warning-text);padding:var(--ffc-spacing-xl) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-md);margin:var(--ffc-spacing-lg) 0;text-align:left}.ffc-preflight-banner-title{display:block;font-size:var(--ffc-font-size-lg);margin-bottom:var(--ffc-spacing-xs);color:var(--ffc-warning-text)}.ffc-preflight-banner-body,.ffc-preflight-banner-how{margin:var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-preflight-banner-how{color:var(--ffc-warning-text);font-style:italic}.ffc-preflight-try-anyway{display:inline-block;margin-top:var(--ffc-spacing-md);padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);background:0 0;color:var(--ffc-warning-text);border:1px solid var(--ffc-warning-border);border-radius:var(--ffc-radius-sm);font-weight:600;cursor:pointer;transition:background .15s ease}.ffc-preflight-try-anyway:focus,.ffc-preflight-try-anyway:hover{background:var(--ffc-warning);color:var(--ffc-text-on-warning)}.ffc-submit-btn.ffc-btn-loading{opacity:.7;cursor:not-allowed}.ffc-public-csv-download .ffc-info-screen{width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-header{display:flex;align-items:center;gap:var(--ffc-spacing-lg);margin-bottom:var(--ffc-spacing-3xl);padding-bottom:var(--ffc-spacing-xl);border-bottom:1px solid var(--ffc-border);width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-header h2{margin:0;font-size:var(--ffc-font-size-2xl);font-weight:600;color:var(--ffc-text);flex:1}.ffc-public-csv-download .ffc-info-back{background:0 0;border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm,4px);padding:var(--ffc-spacing-xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;gap:var(--ffc-spacing-2xs);white-space:nowrap}.ffc-public-csv-download .ffc-info-back:hover{border-color:var(--ffc-primary);color:var(--ffc-primary)}.ffc-public-csv-download .ffc-info-back-arrow{font-size:var(--ffc-font-size-lg);line-height:1}.ffc-public-csv-download .ffc-info-section{margin-bottom:var(--ffc-spacing-2xl);padding:var(--ffc-spacing-xl);background:var(--ffc-bg-alt);border-radius:var(--ffc-radius-sm,6px);border:1px solid var(--ffc-border);width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-section h3{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);font-weight:600;color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.5px}.ffc-public-csv-download .ffc-info-section.ffc-info-summary{background:var(--ffc-bg-card);border-color:var(--ffc-primary);border-left:3px solid var(--ffc-primary)}.ffc-public-csv-download .ffc-info-row{display:flex;justify-content:space-between;align-items:center;gap:var(--ffc-spacing-lg);padding:var(--ffc-spacing-xs) 0;width:100%;box-sizing:border-box}.ffc-public-csv-download .ffc-info-row+.ffc-info-row{border-top:1px solid var(--ffc-border)}.ffc-public-csv-download .ffc-info-label{font-size:var(--ffc-font-size-base);color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-value{font-size:var(--ffc-font-size-base);font-weight:500;color:var(--ffc-text);text-align:right}.ffc-public-csv-download .ffc-info-subsection{margin-bottom:var(--ffc-spacing-sm)}.ffc-public-csv-download .ffc-info-subsection:last-child{margin-bottom:0}.ffc-public-csv-download .ffc-info-sublabel{font-size:var(--ffc-font-size-sm);font-weight:500;color:var(--ffc-text-muted);display:block;margin-bottom:var(--ffc-spacing-2xs)}.ffc-public-csv-download .ffc-info-list{margin:0;padding:0 0 0 var(--ffc-spacing-2xl);list-style:disc}.ffc-public-csv-download .ffc-info-list li{font-size:var(--ffc-font-size-base);color:var(--ffc-text);padding:var(--ffc-spacing-3xs) 0}.ffc-public-csv-download .ffc-info-list-restrictions li{color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-list-locations li a{color:var(--ffc-primary);text-decoration:none}.ffc-public-csv-download .ffc-info-list-locations li a:hover{text-decoration:underline}.ffc-public-csv-download .ffc-info-alert{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-sm,6px);font-size:var(--ffc-font-size-base);line-height:1.5;margin-top:var(--ffc-spacing-lg)}.ffc-public-csv-download .ffc-info-alert-warning{background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);color:var(--ffc-warning-text)}.ffc-public-csv-download .ffc-info-alert-info{background:var(--ffc-info-bg);border:1px solid var(--ffc-info-border);color:var(--ffc-info-text)}.ffc-public-csv-download .ffc-info-alert-success{background:var(--ffc-success-bg);border:1px solid var(--ffc-success-border);color:var(--ffc-success-text)}.ffc-public-csv-download .ffc-info-actions{display:flex;gap:var(--ffc-spacing-lg);margin-top:var(--ffc-spacing-3xl);flex-wrap:wrap;width:100%;box-sizing:border-box}.ffc-extend-end-modal .ffc-info-btn,.ffc-open-early-modal .ffc-info-btn,.ffc-public-csv-download .ffc-info-btn{flex:1;min-width:160px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);border:none;border-radius:var(--ffc-radius-sm,6px);font-size:var(--ffc-font-size-base);font-weight:600;cursor:pointer;transition:all .2s ease;text-align:center}.ffc-extend-end-modal .ffc-info-btn-primary,.ffc-open-early-modal .ffc-info-btn-primary,.ffc-public-csv-download .ffc-info-btn-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary)}.ffc-extend-end-modal .ffc-info-btn-primary:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-primary:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-primary:hover:not([disabled]){background:var(--ffc-primary-hover)}.ffc-extend-end-modal .ffc-info-btn-primary[disabled],.ffc-open-early-modal .ffc-info-btn-primary[disabled],.ffc-public-csv-download .ffc-info-btn-primary[disabled]{opacity:.5;cursor:not-allowed}.ffc-extend-end-modal .ffc-info-btn-secondary,.ffc-open-early-modal .ffc-info-btn-secondary,.ffc-public-csv-download .ffc-info-btn-secondary{background:var(--ffc-bg-alt);color:var(--ffc-text);border:1px solid var(--ffc-border)}.ffc-extend-end-modal .ffc-info-btn-secondary:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-secondary:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-secondary:hover:not([disabled]){background:var(--ffc-border)}.ffc-extend-end-modal .ffc-info-btn-secondary[disabled],.ffc-open-early-modal .ffc-info-btn-secondary[disabled],.ffc-public-csv-download .ffc-info-btn-secondary[disabled]{opacity:.5;cursor:not-allowed}.ffc-extend-end-modal .ffc-info-btn-warning,.ffc-open-early-modal .ffc-info-btn-warning,.ffc-public-csv-download .ffc-info-btn-warning{background:var(--ffc-warning);color:var(--ffc-text-on-warning);border:1px solid var(--ffc-warning)}.ffc-extend-end-modal .ffc-info-btn-warning:hover:not([disabled]),.ffc-open-early-modal .ffc-info-btn-warning:hover:not([disabled]),.ffc-public-csv-download .ffc-info-btn-warning:hover:not([disabled]){background:var(--ffc-warning-text);border-color:var(--ffc-warning-text)}.ffc-extend-end-modal .ffc-info-btn-warning[disabled],.ffc-open-early-modal .ffc-info-btn-warning[disabled],.ffc-public-csv-download .ffc-info-btn-warning[disabled]{opacity:.5;cursor:not-allowed}.ffc-open-early-modal{position:fixed;inset:0;z-index:100001;display:flex;align-items:center;justify-content:center}.ffc-schedule-exception-opening{display:flex;align-items:center;gap:var(--ffc-spacing-md);margin:0}.ffc-schedule-exception-spinner{display:inline-block;flex:0 0 auto;width:22px;height:22px;border:3px solid var(--ffc-border-light);border-top:3px solid var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:spin 1s linear infinite}.ffc-public-csv-download .ffc-info-form-link{color:var(--ffc-primary);font-weight:600;text-decoration:none;white-space:nowrap}.ffc-public-csv-download .ffc-info-form-link:hover{text-decoration:underline}.ffc-public-csv-download .ffc-info-table{width:100%;border-collapse:collapse;font-size:var(--ffc-font-size-base)}.ffc-public-csv-download .ffc-info-table thead th{font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--ffc-text-muted);border-bottom:1px solid var(--ffc-border);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xs)}.ffc-public-csv-download .ffc-info-table thead th.ffc-info-table-col{text-align:right}.ffc-public-csv-download .ffc-info-table td{padding:var(--ffc-spacing-xs);border-bottom:1px solid var(--ffc-border)}.ffc-public-csv-download .ffc-info-table tbody tr:last-child td{border-bottom:0}.ffc-public-csv-download .ffc-info-table .ffc-info-table-label{color:var(--ffc-text-muted)}.ffc-public-csv-download .ffc-info-table .ffc-info-table-value{text-align:right;font-weight:500;color:var(--ffc-text);font-variant-numeric:tabular-nums}.ffc-public-csv-download .ffc-info-table .ffc-info-table-dash{text-align:right;color:var(--ffc-border)}.ffc-public-csv-download .ffc-info-schedule-ref-note{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);margin:var(--ffc-spacing-sm) 0 0}.ffc-open-early-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-open-early-container{position:relative;z-index:var(--ffc-z-raised);width:92%;max-width:540px;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg,8px);box-shadow:var(--ffc-shadow-lg);display:flex;flex-direction:column;overflow:hidden}.ffc-open-early-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);background:linear-gradient(135deg,var(--ffc-primary) 0,var(--ffc-primary-hover) 100%);color:var(--ffc-text-on-primary)}.ffc-open-early-header h2{margin:0;font-size:var(--ffc-font-size-xl);font-weight:600;color:var(--ffc-text-on-primary);display:flex;align-items:center;gap:var(--ffc-spacing-sm)}.ffc-open-early-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:26px;cursor:pointer;padding:0 var(--ffc-spacing-2xs);line-height:1;transition:color var(--ffc-transition-base)}.ffc-open-early-close:focus-visible,.ffc-open-early-close:hover{color:var(--ffc-inverse-on-surface);outline:0}.ffc-open-early-body{padding:var(--ffc-spacing-2xl) var(--ffc-spacing-3xl);color:var(--ffc-text);font-size:var(--ffc-font-size-base);line-height:1.55}.ffc-open-early-body p{margin:0 0 var(--ffc-spacing-lg)}.ffc-open-early-times{list-style:none;padding:0;margin:var(--ffc-spacing-sm) 0 var(--ffc-spacing-lg)}.ffc-open-early-times li{margin:var(--ffc-spacing-2xs) 0}.ffc-open-early-warn{color:var(--ffc-danger-text);background:var(--ffc-danger-bg);border-left:3px solid var(--ffc-danger);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);margin:var(--ffc-spacing-lg) 0 var(--ffc-spacing-2xs);border-radius:var(--ffc-radius-sm,4px);font-weight:500}.ffc-open-early-warn-cache{background:var(--ffc-warning-light);border-left:3px solid var(--ffc-warning);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);margin:var(--ffc-spacing-lg) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-warning-text);border-radius:var(--ffc-radius-sm,4px)}.ffc-extend-end-modal .ffc-extend-end-input{width:100%;height:45px;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm,4px);font-size:var(--ffc-font-size-lg);line-height:1.5;background:var(--ffc-bg-input);color:var(--ffc-text);box-sizing:border-box;transition:border-color var(--ffc-transition-base),box-shadow var(--ffc-transition-base)}.ffc-extend-end-modal .ffc-extend-end-input:focus{outline:0;border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-extend-end-modal .ffc-extend-end-input-invalid{border-color:var(--ffc-danger)}.ffc-extend-end-error{margin:var(--ffc-spacing-xs) 0 0;font-size:var(--ffc-font-size-sm);color:var(--ffc-danger)}.ffc-open-early-actions{display:flex;justify-content:flex-end;gap:var(--ffc-spacing-lg);padding:var(--ffc-spacing-lg) var(--ffc-spacing-3xl) var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border);background:var(--ffc-bg-alt)}.ffc-open-early-actions .ffc-extend-end-cancel,.ffc-open-early-actions .ffc-open-early-cancel{flex:0 1 auto;min-width:120px;font-weight:600;padding:var(--ffc-spacing-lg) var(--ffc-spacing-3xl);font-size:var(--ffc-font-size-base)}.ffc-open-early-actions .ffc-extend-end-confirm,.ffc-open-early-actions .ffc-open-early-confirm{flex:0 1 auto;min-width:120px;padding:var(--ffc-spacing-lg) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-base)}.ffc-open-early-actions .ffc-open-early-confirm{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm)}#ffc-preview-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;opacity:0;transition:opacity .2s ease;pointer-events:none}#ffc-preview-modal.ffc-preview-visible{opacity:1;pointer-events:auto}.ffc-preview-backdrop{position:absolute;inset:0;background:var(--ffc-bg-overlay)}.ffc-preview-container{position:relative;width:90%;max-width:900px;height:85vh;background:var(--ffc-bg-card);border-radius:var(--ffc-radius-lg,8px);display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--ffc-shadow-lg)}#ffc-preview-modal .ffc-preview-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);background:var(--ffc-inverse-surface);color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-header h2{margin:0;font-size:var(--ffc-font-size-lg);font-weight:500;color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-close{background:0 0;border:none;color:var(--ffc-inverse-on-surface);font-size:var(--ffc-font-size-2xl);cursor:pointer;padding:0 var(--ffc-spacing-2xs);line-height:1}#ffc-preview-modal .ffc-preview-close:hover{color:var(--ffc-inverse-on-surface)}#ffc-preview-modal .ffc-preview-note{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);background:var(--ffc-primary-light);border-bottom:1px solid var(--ffc-border);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary)}#ffc-preview-modal .ffc-preview-body{flex:1;display:flex;align-items:center;justify-content:center;overflow:auto;padding:var(--ffc-spacing-lg)}.ffc-preview-stage{position:relative;flex:0 0 auto;overflow:hidden}#ffc-preview-iframe{display:block;border:none;background:#fff}@media (prefers-reduced-motion:reduce){.ffc-shortcode .ffc-certificate-preview{animation:none}.ffc-shortcode .ffc-spinner{animation:none}.ffc-shortcode .ffc-consent-text a,.ffc-shortcode .ffc-csv-progress-bar-fill,.ffc-shortcode .ffc-download-btn,.ffc-shortcode .ffc-input,.ffc-shortcode .ffc-submit-btn,.ffc-shortcode .ffc-verify-input{transition:none}}.ffc-webview-warning{display:flex;gap:var(--ffc-spacing-xl);align-items:flex-start;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-3xl) 0;background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);border-left:4px solid var(--ffc-warning);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-sm)}.ffc-webview-warning-icon{font-size:26px;line-height:1;color:var(--ffc-warning-text);flex-shrink:0}.ffc-webview-warning-icon::before{margin-right:0}.ffc-webview-warning-content{flex:1;min-width:0}.ffc-webview-warning-content h3{margin:0 0 var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-warning-text);line-height:1.3}.ffc-webview-warning-content p{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-text)}.ffc-webview-warning-actions{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-md)}.ffc-webview-warning-dismiss,.ffc-webview-warning-open{padding:var(--ffc-spacing-md) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-base);font-weight:600;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background var(--ffc-transition-base),border-color var(--ffc-transition-base)}.ffc-webview-warning-open{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary)}.ffc-webview-warning-open:focus-visible,.ffc-webview-warning-open:hover{background:var(--ffc-primary-hover,var(--ffc-link-hover));outline:0}.ffc-webview-warning-dismiss{background:0 0;color:var(--ffc-text-secondary);border:1px solid var(--ffc-border)}.ffc-webview-warning-dismiss:focus-visible,.ffc-webview-warning-dismiss:hover{background:var(--ffc-bg-alt);border-color:var(--ffc-border-focus);outline:0}@media (max-width:600px){.ffc-webview-warning{flex-direction:column;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-xl)}.ffc-webview-warning-actions{flex-direction:column;align-items:stretch}.ffc-webview-warning-dismiss,.ffc-webview-warning-open{width:100%;text-align:center}}.ffc-already-submitted-notice{display:flex;gap:var(--ffc-spacing-xl);align-items:flex-start;padding:var(--ffc-spacing-xl) var(--ffc-spacing-2xl);margin:0 0 var(--ffc-spacing-3xl) 0;background:var(--ffc-info-bg);border:1px solid var(--ffc-info-border);border-left:4px solid var(--ffc-primary);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-sm)}.ffc-already-submitted-icon{font-size:var(--ffc-font-size-2xl);line-height:1;color:var(--ffc-primary);flex-shrink:0;font-weight:700}.ffc-already-submitted-icon::before{margin-right:0}.ffc-already-submitted-content{flex:1;min-width:0}.ffc-already-submitted-content h3{margin:0 0 var(--ffc-spacing-xs) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-info-text);line-height:1.3}.ffc-already-submitted-content p{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-info-text)}.ffc-already-submitted-dismiss{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);font-weight:600;background:0 0;color:var(--ffc-primary);border:1px solid var(--ffc-info-border);border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background var(--ffc-transition-base),border-color var(--ffc-transition-base)}.ffc-already-submitted-dismiss:focus-visible,.ffc-already-submitted-dismiss:hover{background:var(--ffc-primary-light);border-color:var(--ffc-primary);outline:0}@media (max-width:600px){.ffc-already-submitted-notice{flex-direction:column;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl)}.ffc-already-submitted-dismiss{width:100%;text-align:center}}@media (forced-colors:active){.ffc-extend-end-modal .ffc-info-btn-primary,.ffc-open-early-modal .ffc-info-btn-primary,.ffc-public-csv-download .ffc-info-btn-primary,.ffc-shortcode .ffc-download-btn,.ffc-shortcode .ffc-submit-btn{border:1px solid ButtonText}.ffc-shortcode .ffc-status-badge,.ffc-shortcode .ffc-status-badge.ffc-status-badge-error,.ffc-shortcode .ffc-status-badge.ffc-status-badge-success,.ffc-shortcode .ffc-verification-status-approved,.ffc-shortcode .ffc-verification-status-cancelled,.ffc-shortcode .ffc-verification-status-completed,.ffc-shortcode .ffc-verification-status-confirmed,.ffc-shortcode .ffc-verification-status-expired,.ffc-shortcode .ffc-verification-status-in_progress,.ffc-shortcode .ffc-verification-status-no_show,.ffc-shortcode .ffc-verification-status-pending,.ffc-shortcode .ffc-verification-status-rejected,.ffc-shortcode .ffc-verification-status-submitted{border:1px solid CanvasText}}.ffc-shortcode .ffc-quiz-leave-overlay .ffc-modal-header h3{font-weight:600;color:var(--ffc-text)}.ffc-shortcode .ffc-quiz-leave-overlay .ffc-modal-body p{margin:0;font-size:var(--ffc-font-size-base);line-height:1.5;color:var(--ffc-text)} /*# sourceMappingURL=ffc-frontend.min.css.map */ \ No newline at end of file diff --git a/assets/css/ffc-screenshots.css b/assets/css/ffc-screenshots.css new file mode 100644 index 000000000..4a34b8082 --- /dev/null +++ b/assets/css/ffc-screenshots.css @@ -0,0 +1,156 @@ +/** + * Screenshot viewer in the "View details" modal (assets/js/ffc-screenshots.js). + * + * Loaded only inside that modal, where ffc-common.css and its colour tokens are + * not, so the colours here are literal. The viewer is dark in both themes on + * purpose, like any image viewer: the image is the content, and a dark + * backdrop keeps a light screenshot readable. + */ + +.ffc-shots-open, +.ffc-shots-open body { + overflow: hidden; +} + +.ffc-shots { + position: fixed; + inset: 0; + z-index: 100200; + background: rgba(0, 0, 0, 0.9); + color: #fff; +} + +.ffc-shots[hidden] { + display: none; +} + +.ffc-shots-stage { + position: absolute; + inset: 48px 56px 72px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + touch-action: none; +} + +.ffc-shots-img { + max-width: 100%; + max-height: 100%; + transform-origin: center; + transition: transform 0.15s ease-out; + cursor: zoom-in; + user-select: none; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5); +} + +.ffc-shots.is-zoomed .ffc-shots-img { + cursor: grab; + transition: none; +} + +.ffc-shots-button { + min-width: 40px; + height: 40px; + padding: 0 8px; + border: 0; + border-radius: 4px; + background: rgba(255, 255, 255, 0.12); + color: #fff; + font-size: 24px; + line-height: 1; + cursor: pointer; +} + +.ffc-shots-button:hover, +.ffc-shots-button:focus-visible { + background: rgba(255, 255, 255, 0.25); +} + +.ffc-shots-button:focus-visible { + outline: 2px solid #fff; + outline-offset: 2px; +} + +.ffc-shots-button:disabled { + opacity: 0.4; + cursor: default; +} + +.ffc-shots-button[hidden] { + display: none; +} + +.ffc-shots-tools { + position: absolute; + top: 4px; + right: 8px; + display: flex; + gap: 6px; +} + +.ffc-shots-previous, +.ffc-shots-next { + position: absolute; + top: 50%; + height: 64px; + margin-top: -32px; + font-size: 36px; +} + +.ffc-shots-previous { + left: 8px; +} + +.ffc-shots-next { + right: 8px; +} + +.ffc-shots-bar { + position: absolute; + right: 16px; + bottom: 12px; + left: 16px; + display: flex; + gap: 12px; + align-items: baseline; + justify-content: center; + text-align: center; +} + +.ffc-shots-count { + flex: none; + color: #ccc; + font-size: 13px; +} + +.ffc-shots-caption { + margin: 0; + font-size: 14px; +} + +@media (max-width: 600px) { + .ffc-shots-stage { + inset: 48px 8px 88px; + } + + .ffc-shots-previous, + .ffc-shots-next { + top: auto; + bottom: 40px; + margin-top: 0; + height: 40px; + } + + .ffc-shots-bar { + bottom: 8px; + flex-direction: column; + gap: 2px; + } +} + +@media (prefers-reduced-motion: reduce) { + .ffc-shots-img { + transition: none; + } +} diff --git a/assets/css/ffc-screenshots.min.css b/assets/css/ffc-screenshots.min.css new file mode 100644 index 000000000..2496de04e --- /dev/null +++ b/assets/css/ffc-screenshots.min.css @@ -0,0 +1,2 @@ +.ffc-shots-open,.ffc-shots-open body{overflow:hidden}.ffc-shots{position:fixed;inset:0;z-index:100200;background:rgba(0,0,0,.9);color:#fff}.ffc-shots[hidden]{display:none}.ffc-shots-stage{position:absolute;inset:48px 56px 72px;display:flex;align-items:center;justify-content:center;overflow:hidden;touch-action:none}.ffc-shots-img{max-width:100%;max-height:100%;transform-origin:center;transition:transform .15s ease-out;cursor:zoom-in;user-select:none;box-shadow:0 4px 24px rgba(0,0,0,.5)}.ffc-shots.is-zoomed .ffc-shots-img{cursor:grab;transition:none}.ffc-shots-button{min-width:40px;height:40px;padding:0 8px;border:0;border-radius:4px;background:rgba(255,255,255,.12);color:#fff;font-size:24px;line-height:1;cursor:pointer}.ffc-shots-button:focus-visible,.ffc-shots-button:hover{background:rgba(255,255,255,.25)}.ffc-shots-button:focus-visible{outline:2px solid #fff;outline-offset:2px}.ffc-shots-button:disabled{opacity:.4;cursor:default}.ffc-shots-button[hidden]{display:none}.ffc-shots-tools{position:absolute;top:4px;right:8px;display:flex;gap:6px}.ffc-shots-next,.ffc-shots-previous{position:absolute;top:50%;height:64px;margin-top:-32px;font-size:36px}.ffc-shots-previous{left:8px}.ffc-shots-next{right:8px}.ffc-shots-bar{position:absolute;right:16px;bottom:12px;left:16px;display:flex;gap:12px;align-items:baseline;justify-content:center;text-align:center}.ffc-shots-count{flex:none;color:#ccc;font-size:13px}.ffc-shots-caption{margin:0;font-size:14px}@media (max-width:600px){.ffc-shots-stage{inset:48px 8px 88px}.ffc-shots-next,.ffc-shots-previous{top:auto;bottom:40px;margin-top:0;height:40px}.ffc-shots-bar{bottom:8px;flex-direction:column;gap:2px}}@media (prefers-reduced-motion:reduce){.ffc-shots-img{transition:none}} +/*# sourceMappingURL=ffc-screenshots.min.css.map */ \ No newline at end of file diff --git a/assets/css/ffc-user-dashboard.css b/assets/css/ffc-user-dashboard.css index 30a4b151f..33747011d 100644 --- a/assets/css/ffc-user-dashboard.css +++ b/assets/css/ffc-user-dashboard.css @@ -1199,54 +1199,6 @@ gap: var(--ffc-spacing-md); } -.ffc-toggle-label { - display: flex; - align-items: center; - gap: var(--ffc-spacing-lg); - cursor: pointer; - font-size: var(--ffc-font-size-base); - color: var(--ffc-text); - padding: var(--ffc-spacing-xs) 0; -} - -.ffc-toggle-label input[type="checkbox"] { - display: none; -} - -.ffc-toggle-switch { - position: relative; - width: 40px; - height: 22px; - background: var(--ffc-border); - border-radius: 11px; - transition: background 0.2s; - flex-shrink: 0; -} - -.ffc-toggle-switch::after { - content: ''; - position: absolute; - top: 2px; - left: 2px; - width: 18px; - height: 18px; - /* Branco nos dois temas de propósito: no escuro a pista é escura, e um - botão em var(--ffc-bg-card) sumiria dentro dela. Mesma decisão do - interruptor de ffc-common.css (#1126). */ - background: #fff; - border-radius: var(--ffc-radius-full); - transition: transform 0.2s; - box-shadow: var(--ffc-shadow-sm); -} - -.ffc-toggle-label input:checked + .ffc-toggle-switch { - background: var(--ffc-primary); -} - -.ffc-toggle-label input:checked + .ffc-toggle-switch::after { - transform: translateX(18px); -} - /* ========================================================================== LGPD SECTION ========================================================================== */ diff --git a/assets/css/ffc-user-dashboard.min.css b/assets/css/ffc-user-dashboard.min.css index 76b712c9b..3645c6d0d 100644 --- a/assets/css/ffc-user-dashboard.min.css +++ b/assets/css/ffc-user-dashboard.min.css @@ -1,2 +1,2 @@ -.ffc-user-dashboard{max-width:1500px;margin:var(--ffc-spacing-2xl) auto;padding:var(--ffc-spacing-3xl);background:var(--ffc-bg);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;color:var(--ffc-text)}.ffc-dashboard-notice{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-2xl);border-radius:var(--ffc-radius-md);border-left:4px solid var(--ffc-border);font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-notice-info{background:var(--ffc-info-bg);border-left-color:var(--ffc-primary);color:var(--ffc-info-text)}.ffc-notice-warning{background:var(--ffc-warning-bg);border-left-color:var(--ffc-warning);color:var(--ffc-warning-text)}.ffc-notice-admin-viewing{background:var(--ffc-warning-bg);border-left-color:var(--ffc-warning-border);color:var(--ffc-warning-text);font-weight:600}.ffc-notice-admin-viewing strong{color:var(--ffc-warning-text)}.ffc-dashboard-notice p{margin:.4em 0}.ffc-dashboard-notice .button{margin-top:var(--ffc-spacing-sm)}.ffc-dashboard-tabs{display:flex;gap:var(--ffc-spacing-3xs);margin-bottom:var(--ffc-spacing-3xl);border-bottom:2px solid var(--ffc-border-light)}.ffc-tab{padding:var(--ffc-spacing-md) var(--ffc-spacing-2xl);background:0 0;border:none;border-bottom:3px solid transparent;cursor:pointer;font-size:var(--ffc-font-size-base);font-weight:500;color:var(--ffc-text-muted);transition:color .2s,border-color .2s,background .2s;border-radius:var(--ffc-radius-md) var(--ffc-radius-md) 0 0;margin-bottom:-2px;white-space:nowrap}.ffc-tab:hover{color:var(--ffc-text);background:var(--ffc-bg-alt)}.ffc-tab.is-active{color:var(--ffc-primary);border-bottom-color:var(--ffc-primary);font-weight:600;background:0 0}.ffc-tab-content{display:none;padding:var(--ffc-spacing-2xs) 0;animation:ffcFadeIn .25s ease}.ffc-tab-content.is-active{display:block}@keyframes ffcFadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.ffc-loading{text-align:center;padding:48px var(--ffc-spacing-2xl);color:var(--ffc-text-muted);font-size:var(--ffc-font-size-base)}.ffc-loading::after{content:'';display:inline-block;width:18px;height:18px;margin-left:var(--ffc-spacing-sm);border:2px solid var(--ffc-border);border-top-color:var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:ffcSpin .8s linear infinite;vertical-align:middle}@keyframes ffcSpin{to{transform:rotate(360deg)}}.ffc-dashboard-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:var(--ffc-spacing-lg);margin-bottom:var(--ffc-spacing-3xl)}.ffc-dashboard-summary:empty{display:none}.ffc-summary-card{background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-lg);padding:var(--ffc-spacing-xl) var(--ffc-spacing-xl);text-align:center;transition:box-shadow .2s,border-color .2s}.ffc-summary-card:hover{border-color:var(--ffc-border);box-shadow:var(--ffc-shadow-sm)}.ffc-summary-number{font-size:28px;font-weight:700;color:var(--ffc-primary);line-height:1.2}.ffc-summary-number.ffc-summary-date{font-size:var(--ffc-font-size-lg);font-weight:600}.ffc-summary-detail{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-secondary);margin-top:var(--ffc-spacing-3xs)}.ffc-summary-label{font-size:var(--ffc-font-size-2xs);color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.6px;font-weight:600;margin-top:var(--ffc-spacing-sm)}.ffc-filter-bar{display:flex;align-items:center;gap:var(--ffc-spacing-sm);flex-wrap:wrap;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-xl);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md)}.ffc-filter-bar label{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-secondary);display:flex;align-items:center;gap:var(--ffc-spacing-xs);font-weight:500}.ffc-filter-bar input[type=date],.ffc-filter-bar input[type=text]{padding:var(--ffc-spacing-xs) var(--ffc-spacing-md);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);background:var(--ffc-bg);color:var(--ffc-text);transition:border-color .15s,box-shadow .15s}.ffc-filter-bar input[type=date]:focus,.ffc-filter-bar input[type=text]:focus{border-color:var(--ffc-primary);box-shadow:0 0 0 1px var(--ffc-primary);outline:0}.ffc-filter-bar input[type=text]{min-width:160px}.ffc-filter-bar .button{padding:var(--ffc-spacing-xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-sm);font-weight:500;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:all .15s;line-height:1.4}.ffc-filter-bar .ffc-filter-apply{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary)}.ffc-filter-bar .ffc-filter-apply:hover{background:var(--ffc-primary-hover);border-color:var(--ffc-primary-hover)}.ffc-filter-bar .ffc-filter-clear{background:var(--ffc-bg);color:var(--ffc-text-secondary);border:1px solid var(--ffc-border)}.ffc-filter-bar .ffc-filter-clear:hover{background:var(--ffc-bg-alt);color:var(--ffc-text)}.ffc-page-size-select{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);margin-left:auto}.ffc-page-size-select a{color:var(--ffc-primary);text-decoration:none;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);border-radius:var(--ffc-radius-xs);transition:background .15s}.ffc-page-size-select a:hover{background:var(--ffc-primary-light)}.ffc-page-size-select strong{color:var(--ffc-text);background:var(--ffc-primary-light);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border-radius:var(--ffc-radius-xs);font-weight:600}.ffc-appointments-table,.ffc-audience-bookings-table,.ffc-certificates-table,.ffc-recruitment-table,.ffc-reregistrations-table{width:100%;border-collapse:separate;border-spacing:0;margin-top:0;border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);overflow:hidden}.ffc-appointments-table th,.ffc-audience-bookings-table th,.ffc-certificates-table th,.ffc-recruitment-table th,.ffc-reregistrations-table th{background:var(--ffc-bg-alt);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);text-align:left;font-weight:600;font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary);text-transform:uppercase;letter-spacing:.3px;border-bottom:1px solid var(--ffc-border-light)}.ffc-appointments-table td,.ffc-audience-bookings-table td,.ffc-certificates-table td,.ffc-recruitment-table td,.ffc-reregistrations-table td{padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border-bottom:1px solid var(--ffc-border-light);vertical-align:middle;font-size:var(--ffc-font-size-sm);color:var(--ffc-text)}.ffc-appointments-table tr:last-child td,.ffc-audience-bookings-table tr:last-child td,.ffc-certificates-table tr:last-child td,.ffc-recruitment-table tr:last-child td,.ffc-reregistrations-table tr:last-child td{border-bottom:none}.ffc-appointments-table tbody tr:hover,.ffc-audience-bookings-table tbody tr:hover,.ffc-certificates-table tbody tr:hover,.ffc-recruitment-table tbody tr:hover,.ffc-reregistrations-table tbody tr:hover{background:var(--ffc-primary-light)}.ffc-certificates-table{table-layout:fixed}.ffc-certificates-table td:first-child,.ffc-certificates-table th:first-child{width:20%}.ffc-certificates-table td:nth-child(2),.ffc-certificates-table th:nth-child(2){width:13%}.ffc-certificates-table td:nth-child(3),.ffc-certificates-table th:nth-child(3){width:15%;text-align:center}.ffc-certificates-table td:nth-child(4),.ffc-certificates-table th:nth-child(4){width:22%;word-break:break-all}.ffc-certificates-table td:nth-child(5),.ffc-certificates-table th:nth-child(5){width:17%}.ffc-certificates-table td:nth-child(5){font-family:'Courier New',Courier,monospace;font-size:var(--ffc-font-size-2xs);font-weight:500;letter-spacing:.3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ffc-certificates-table td:nth-child(6),.ffc-certificates-table th:nth-child(6){width:13%;text-align:center}.ffc-certificates-table .ffc-consent-yes{color:var(--ffc-success);font-weight:600}.ffc-certificates-table .ffc-consent-no{color:var(--ffc-danger);font-weight:600}.ffc-btn-edit,.ffc-btn-pdf,.ffc-btn-receipt{display:inline-flex!important;align-items:center;vertical-align:middle;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg)!important;font-size:var(--ffc-font-size-xs)!important;font-weight:500;text-decoration:none!important;white-space:nowrap;border-radius:var(--ffc-radius-sm)!important;transition:all .15s;line-height:1.4;cursor:pointer}.ffc-btn-pdf{background:var(--ffc-danger)!important;color:var(--ffc-text-on-danger)!important;border:1px solid var(--ffc-danger)!important}.ffc-btn-pdf:hover{background:var(--ffc-danger-hover)!important;border-color:var(--ffc-danger-hover)!important;color:var(--ffc-text-on-danger)!important}.ffc-btn-pdf::before{content:'';display:inline-block;width:14px;height:14px;background:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M4 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5L9.5 0H4zm5.5 1.5v3h3l-3-3zM5.5 8a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H6.75v1h.75a.5.5 0 0 1 0 1h-.75v1.5a.5.5 0 0 1-1 0V8zm3.5-.5a.5.5 0 0 0-.5.5v3.5a.5.5 0 0 0 .5.5h.5a1.5 1.5 0 0 0 0-3H9.5v-1a.5.5 0 0 0-.5-.5z'/%3E%3C/svg%3E") no-repeat center;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M4 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5L9.5 0H4zm5.5 1.5v3h3l-3-3zM5.5 8a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H6.75v1h.75a.5.5 0 0 1 0 1h-.75v1.5a.5.5 0 0 1-1 0V8zm3.5-.5a.5.5 0 0 0-.5.5v3.5a.5.5 0 0 0 .5.5h.5a1.5 1.5 0 0 0 0-3H9.5v-1a.5.5 0 0 0-.5-.5z'/%3E%3C/svg%3E") no-repeat center;flex-shrink:0}.ffc-btn-receipt{background:var(--ffc-primary)!important;color:var(--ffc-text-on-primary)!important;border:1px solid var(--ffc-primary)!important}.ffc-btn-receipt:hover{background:var(--ffc-primary-hover)!important;border-color:var(--ffc-primary-hover)!important;color:var(--ffc-text-on-primary)!important}.ffc-btn-receipt::before{content:'';display:inline-block;width:14px;height:14px;background:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M1.92.506a.5.5 0 0 1 .434.14L3 1.293l.646-.647a.5.5 0 0 1 .708 0L5 1.293l.646-.647a.5.5 0 0 1 .708 0L7 1.293l.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .801.13l.5 1A.5.5 0 0 1 13 2v12a.5.5 0 0 1-.053.224l-.5 1a.5.5 0 0 1-.8.13L11 14.707l-.646.647a.5.5 0 0 1-.708 0L9 14.707l-.646.647a.5.5 0 0 1-.708 0L7 14.707l-.646.647a.5.5 0 0 1-.708 0L5 14.707l-.646.647a.5.5 0 0 1-.708 0L3 14.707l-.646.647a.5.5 0 0 1-.801-.13l-.5-1A.5.5 0 0 1 1 14V2a.5.5 0 0 1 .053-.224l.5-1a.5.5 0 0 1 .367-.27zM4 5a.5.5 0 0 0 0 1h8a.5.5 0 0 0 0-1H4zm0 2.5a.5.5 0 0 0 0 1h8a.5.5 0 0 0 0-1H4zm0 2.5a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1H4z'/%3E%3C/svg%3E") no-repeat center;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M1.92.506a.5.5 0 0 1 .434.14L3 1.293l.646-.647a.5.5 0 0 1 .708 0L5 1.293l.646-.647a.5.5 0 0 1 .708 0L7 1.293l.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .801.13l.5 1A.5.5 0 0 1 13 2v12a.5.5 0 0 1-.053.224l-.5 1a.5.5 0 0 1-.8.13L11 14.707l-.646.647a.5.5 0 0 1-.708 0L9 14.707l-.646.647a.5.5 0 0 1-.708 0L7 14.707l-.646.647a.5.5 0 0 1-.708 0L5 14.707l-.646.647a.5.5 0 0 1-.708 0L3 14.707l-.646.647a.5.5 0 0 1-.801-.13l-.5-1A.5.5 0 0 1 1 14V2a.5.5 0 0 1 .053-.224l.5-1a.5.5 0 0 1 .367-.27zM4 5a.5.5 0 0 0 0 1h8a.5.5 0 0 0 0-1H4zm0 2.5a.5.5 0 0 0 0 1h8a.5.5 0 0 0 0-1H4zm0 2.5a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1H4z'/%3E%3C/svg%3E") no-repeat center;flex-shrink:0}.ffc-btn-edit{background:var(--ffc-primary)!important;color:var(--ffc-text-on-primary)!important;border:1px solid var(--ffc-primary)!important}.ffc-btn-edit:hover{background:var(--ffc-primary-hover)!important;border-color:var(--ffc-primary-hover)!important;color:var(--ffc-text-on-primary)!important}.ffc-btn-edit::before{content:'';display:inline-block;width:14px;height:14px;background:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z'/%3E%3C/svg%3E") no-repeat center;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z'/%3E%3C/svg%3E") no-repeat center;flex-shrink:0}.ffc-appointments-table td:last-child,.ffc-certificates-table td:last-child,.ffc-reregistrations-table td:last-child{white-space:nowrap}.ffc-appointments-table td:last-child>*+*,.ffc-reregistrations-table td:last-child>*+*{margin-left:var(--ffc-spacing-xs)}.ffc-dashboard-status{padding:3px var(--ffc-spacing-md);border-radius:10px;font-size:var(--ffc-font-size-2xs);font-weight:600;display:inline-block;letter-spacing:.2px;text-transform:capitalize}.ffc-dashboard-status.ffc-dashboard-status-pending{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-dashboard-status.ffc-dashboard-status-confirmed{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-dashboard-status.ffc-dashboard-status-cancelled{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-dashboard-status.ffc-dashboard-status-completed{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-dashboard-status.ffc-dashboard-status-no_show{background:var(--ffc-bg-alt);color:var(--ffc-text-secondary)}.ffc-appointments-table .ffc-cancel-appointment{display:inline-block;vertical-align:middle;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-xs);line-height:1.4;min-height:0;background:0 0;color:var(--ffc-danger);border:1px solid var(--ffc-danger);border-radius:var(--ffc-radius-sm);cursor:pointer;white-space:nowrap;transition:all .15s}.ffc-appointments-table .ffc-cancel-appointment:hover{background:var(--ffc-danger);color:var(--ffc-text-on-danger)}.ffc-appointments-table.ffc-table-past td{color:var(--ffc-text-muted)}.ffc-appointments-table .ffc-row-past{background:var(--ffc-bg-alt)}.ffc-appointments-table .ffc-row-cancelled{background:var(--ffc-danger-bg)}.ffc-appointments-table .ffc-row-cancelled td{color:var(--ffc-text-muted)}#ffc-tabpanel-appointments h3,#ffc-tabpanel-audience h3,#ffc-tabpanel-reregistrations h3{margin-top:0;margin-bottom:var(--ffc-spacing-lg);color:var(--ffc-text);font-size:var(--ffc-font-size-lg);font-weight:600;border-bottom:1px solid var(--ffc-border-light);padding-bottom:var(--ffc-spacing-md)}.ffc-audience-bookings-table td:first-child,.ffc-audience-bookings-table th:first-child{width:17%}.ffc-audience-bookings-table td:nth-child(2),.ffc-audience-bookings-table th:nth-child(2){width:12%}.ffc-audience-bookings-table td:nth-child(3),.ffc-audience-bookings-table th:nth-child(3){width:10%}.ffc-audience-bookings-table td:nth-child(4),.ffc-audience-bookings-table th:nth-child(4){width:24%}.ffc-audience-bookings-table td:nth-child(5),.ffc-audience-bookings-table th:nth-child(5){width:17%}.ffc-audience-bookings-table td:nth-child(6),.ffc-audience-bookings-table th:nth-child(6){width:20%}.ffc-audience-bookings-table.ffc-table-past td{color:var(--ffc-text-muted)}.ffc-audience-bookings-table .ffc-row-past{background:var(--ffc-bg-alt)}.ffc-audience-bookings-table .ffc-row-cancelled{background:var(--ffc-danger-bg)}.ffc-audience-bookings-table .ffc-row-cancelled td{color:var(--ffc-text-muted)}.ffc-audience-bookings-table .ffc-audience-tag{display:block;margin-bottom:var(--ffc-spacing-2xs)}.ffc-audience-bookings-table .ffc-audience-tag:last-child{margin-bottom:0}.ffc-reregistrations-table.ffc-table-past td{color:var(--ffc-text-muted)}.ffc-reregistrations-table .ffc-row-past{background:var(--ffc-bg-alt)}.ffc-reregistrations-table .ffc-auth-code{font-family:'Courier New',Courier,monospace;font-size:var(--ffc-font-size-xs);font-weight:600;letter-spacing:.5px;background:var(--ffc-bg-alt);padding:3px var(--ffc-spacing-sm);border-radius:var(--ffc-radius-sm);border:1px solid var(--ffc-border-light);white-space:nowrap}.ffc-dashboard-status.ffc-dashboard-status-submitted{background:var(--ffc-primary-light);color:var(--ffc-primary-hover)}.ffc-dashboard-status.ffc-dashboard-status-approved{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-dashboard-status.ffc-dashboard-status-rejected{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-dashboard-status.ffc-dashboard-status-expired{background:var(--ffc-bg-alt);color:var(--ffc-text-secondary)}.ffc-dashboard-status.ffc-dashboard-status-in_progress{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-profile-logout{text-align:right;margin-bottom:var(--ffc-spacing-lg)}.ffc-logout-link{display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs);color:var(--ffc-text-secondary);text-decoration:none;font-size:var(--ffc-font-size-sm);font-weight:500;padding:var(--ffc-spacing-xs) var(--ffc-spacing-lg);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);background:var(--ffc-bg);transition:all .2s ease}.ffc-logout-link:hover{color:var(--ffc-danger-text);border-color:var(--ffc-danger);background:var(--ffc-danger-bg)}.ffc-logout-link .ffc-icon-logout{display:inline-flex}.ffc-logout-link .ffc-icon-logout::before{margin-right:0}.ffc-profile-info{background:var(--ffc-bg);padding:0;border-radius:var(--ffc-radius-md);margin-top:0;display:grid;grid-template-columns:1fr 1fr;gap:0;border:1px solid var(--ffc-border-light);overflow:hidden}.ffc-profile-field{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);margin:0;border-bottom:1px solid var(--ffc-border-light);border-right:1px solid var(--ffc-border-light)}.ffc-profile-field:nth-child(2n){border-right:none}.ffc-profile-field:last-child,.ffc-profile-field:nth-last-child(2):nth-child(odd){border-bottom:none}.ffc-profile-field:last-child:nth-child(2n){border-bottom:none}.ffc-profile-field label{display:block;font-size:var(--ffc-font-size-2xs);font-weight:600;color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:var(--ffc-spacing-2xs)}.ffc-profile-field .ffc-field-value{color:var(--ffc-text);font-size:var(--ffc-font-size-base);font-weight:500;line-height:1.5}.ffc-profile-field .ffc-cpf-list,.ffc-profile-field .ffc-email-list,.ffc-profile-field .ffc-name-list{list-style:none;padding:0;margin:0}.ffc-profile-field .ffc-cpf-list li,.ffc-profile-field .ffc-email-list li,.ffc-profile-field .ffc-name-list li{padding:var(--ffc-spacing-3xs) 0;color:var(--ffc-text);font-size:var(--ffc-font-size-base);font-weight:500}.ffc-profile-field .ffc-cpf-list li::before,.ffc-profile-field .ffc-email-list li::before,.ffc-profile-field .ffc-name-list li::before{content:'';display:inline-block;width:6px;height:6px;border-radius:var(--ffc-radius-full);background:var(--ffc-primary);margin-right:var(--ffc-spacing-sm);vertical-align:middle}.ffc-profile-actions{display:flex;gap:var(--ffc-spacing-md);margin-top:var(--ffc-spacing-xl)}.ffc-profile-actions .button{padding:9px var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-sm);font-weight:500;border-radius:var(--ffc-radius-md);cursor:pointer;transition:all .15s;line-height:1.4;text-decoration:none;display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs)}.ffc-profile-actions .button-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary);box-shadow:var(--ffc-shadow-sm)}.ffc-profile-actions .button-primary:hover{background:var(--ffc-primary-hover);border-color:var(--ffc-primary-hover)}.ffc-profile-actions .button:not(.button-primary){background:var(--ffc-bg);color:var(--ffc-text-secondary);border:1px solid var(--ffc-border)}.ffc-profile-actions .button:not(.button-primary):hover{background:var(--ffc-bg-alt);color:var(--ffc-text);border-color:var(--ffc-border)}.ffc-profile-actions .ffc-leave-all-groups-btn{color:var(--ffc-danger-text);border-color:var(--ffc-danger)}.ffc-profile-actions .ffc-leave-all-groups-btn:hover{background:var(--ffc-danger);color:var(--ffc-text-on-danger);border-color:var(--ffc-danger)}.ffc-password-form{margin-top:var(--ffc-spacing-lg);padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md)}.ffc-password-form .ffc-profile-field{padding:0;border:none;margin-bottom:var(--ffc-spacing-lg)}.ffc-password-form .ffc-profile-field label{font-size:var(--ffc-font-size-sm);text-transform:none;letter-spacing:0;font-weight:600;color:var(--ffc-text);margin-bottom:var(--ffc-spacing-2xs)}.ffc-password-form input[type=password]{color:var(--ffc-text);width:100%;max-width:340px;padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);background:var(--ffc-bg);transition:border-color .15s,box-shadow .15s}.ffc-password-form input[type=password]:focus{border-color:var(--ffc-primary);box-shadow:0 0 0 1px var(--ffc-primary);outline:0}.ffc-password-form .button-primary{padding:var(--ffc-spacing-sm) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-sm);border-radius:var(--ffc-radius-md)}.ffc-profile-section{margin-top:var(--ffc-spacing-3xl);padding-top:var(--ffc-spacing-2xl);border-top:1px solid var(--ffc-border-light)}.ffc-profile-section h3{font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);margin:0 0 var(--ffc-spacing-lg) 0}.ffc-audience-join-section{margin-top:var(--ffc-spacing-3xl);padding-top:var(--ffc-spacing-2xl);border-top:1px solid var(--ffc-border-light)}.ffc-audience-join-section h3{font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);margin:0 0 var(--ffc-spacing-xs) 0}.ffc-audience-limit-msg{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);margin:0 0 var(--ffc-spacing-xl) 0}.ffc-audience-parent-group{margin-bottom:var(--ffc-spacing-xl)}.ffc-audience-parent-group:last-child{margin-bottom:0}.ffc-audience-parent-header{display:flex;align-items:center;gap:var(--ffc-spacing-md);width:100%;font-size:var(--ffc-font-size-base);font-weight:600;font-family:inherit;color:var(--ffc-text);padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md) var(--ffc-radius-md) 0 0;cursor:pointer;transition:background .15s;text-align:left}.ffc-audience-parent-header:hover{background:var(--ffc-bg-alt)}.ffc-audience-parent-header[aria-expanded=true]{border-radius:var(--ffc-radius-md) var(--ffc-radius-md) 0 0}.ffc-audience-parent-header[aria-expanded=false]{border-radius:var(--ffc-radius-md)}.ffc-audience-header-name{flex:1}.ffc-audience-toggle-icon{flex-shrink:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:var(--ffc-font-size-lg);font-weight:700;color:var(--ffc-text-muted);line-height:1}.ffc-audience-children-list.ffc-audience-collapsed{display:none}.ffc-audience-subgroup{margin-bottom:0}.ffc-audience-subgroup .ffc-audience-parent-header{font-size:var(--ffc-font-size-sm);font-weight:500;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg) var(--ffc-spacing-md) 28px;min-height:44px;box-sizing:border-box;background:var(--ffc-bg);border-radius:0;border-bottom:1px solid var(--ffc-border-light);border-top:none;border-left:none;border-right:none}.ffc-audience-subgroup .ffc-audience-parent-header[aria-expanded=false],.ffc-audience-subgroup .ffc-audience-parent-header[aria-expanded=true]{border-radius:0}.ffc-audience-subgroup .ffc-audience-children-list{border:none;border-radius:0}.ffc-audience-subgroup .ffc-audience-join-item{padding-left:42px}.ffc-audience-children-list{display:flex;flex-direction:column;border-left:1px solid var(--ffc-border-light);border-right:1px solid var(--ffc-border-light);border-bottom:1px solid var(--ffc-border-light);border-radius:0 0 var(--ffc-radius-md) var(--ffc-radius-md);overflow:hidden}.ffc-audience-join-item{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg) var(--ffc-spacing-md) 28px;min-height:44px;box-sizing:border-box;background:var(--ffc-bg);border-bottom:1px solid var(--ffc-border-light);transition:background .15s}.ffc-audience-join-item:last-child{border-bottom:none}.ffc-audience-join-item:hover{background:var(--ffc-bg-alt)}.ffc-audience-join-item .ffc-audience-name{font-weight:500;font-size:var(--ffc-font-size-base);color:var(--ffc-text);display:flex;align-items:center;gap:var(--ffc-spacing-md)}.ffc-audience-dot{width:12px;height:12px;border-radius:var(--ffc-radius-full);display:inline-block;flex-shrink:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1)}.ffc-audience-join-item .button{flex-shrink:0;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-xs);font-weight:500;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:all .15s;line-height:1.4}.ffc-audience-join-item .button.button-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary)}.ffc-audience-join-item .button.button-primary:hover{background:var(--ffc-primary-hover)}.ffc-audience-join-item .button.button-primary:disabled{background:var(--ffc-border);border-color:var(--ffc-border);cursor:not-allowed;opacity:.7}.ffc-audience-join-item .ffc-audience-leave-btn{background:0 0;color:var(--ffc-danger);border:1px solid var(--ffc-danger)}.ffc-audience-join-item .ffc-audience-leave-btn:hover{background:var(--ffc-danger);color:var(--ffc-text-on-danger)}.ffc-audience-join-item.is-member{background:var(--ffc-primary-light);border-color:var(--ffc-border-focus)}.ffc-audience-item-actions{display:flex;align-items:center;gap:var(--ffc-spacing-sm);flex-shrink:0}.ffc-audience-inline-toggle{background:0 0;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center}.ffc-notif-list{display:flex;flex-direction:column;gap:var(--ffc-spacing-md)}.ffc-toggle-label{display:flex;align-items:center;gap:var(--ffc-spacing-lg);cursor:pointer;font-size:var(--ffc-font-size-base);color:var(--ffc-text);padding:var(--ffc-spacing-xs) 0}.ffc-toggle-label input[type=checkbox]{display:none}.ffc-toggle-switch{position:relative;width:40px;height:22px;background:var(--ffc-border);border-radius:11px;transition:background .2s;flex-shrink:0}.ffc-toggle-switch::after{content:'';position:absolute;top:2px;left:2px;width:18px;height:18px;background:#fff;border-radius:var(--ffc-radius-full);transition:transform .2s;box-shadow:var(--ffc-shadow-sm)}.ffc-toggle-label input:checked+.ffc-toggle-switch{background:var(--ffc-primary)}.ffc-toggle-label input:checked+.ffc-toggle-switch::after{transform:translateX(18px)}.ffc-lgpd-section .ffc-lgpd-desc{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-secondary);margin:0 0 var(--ffc-spacing-md) 0;line-height:1.5}.ffc-lgpd-export-btn{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl)!important;font-size:var(--ffc-font-size-sm)!important;border-radius:var(--ffc-radius-md)!important}.ffc-lgpd-delete-btn{color:var(--ffc-danger)!important;border-color:var(--ffc-danger)!important;padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl)!important;font-size:var(--ffc-font-size-sm)!important;border-radius:var(--ffc-radius-md)!important}.ffc-lgpd-delete-btn:hover{background:var(--ffc-danger)!important;color:var(--ffc-text-on-danger)!important}.ffc-profile-edit-form{border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-alt)}.ffc-profile-edit-form h3{margin:0 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}.ffc-profile-edit-form .ffc-profile-field{padding:0;border:none;margin-bottom:var(--ffc-spacing-lg)}.ffc-profile-edit-form .ffc-profile-field label{font-size:var(--ffc-font-size-sm);text-transform:none;letter-spacing:0;font-weight:600;color:var(--ffc-text);margin-bottom:var(--ffc-spacing-2xs)}.ffc-profile-edit-form input[type=tel],.ffc-profile-edit-form input[type=text],.ffc-profile-edit-form textarea{color:var(--ffc-text);width:100%;max-width:450px;padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);background:var(--ffc-bg);transition:border-color .15s,box-shadow .15s}.ffc-profile-edit-form input:focus,.ffc-profile-edit-form textarea:focus{border-color:var(--ffc-primary);box-shadow:0 0 0 1px var(--ffc-primary);outline:0}.ffc-profile-edit-form textarea{resize:vertical;font-family:inherit}.ffc-profile-edit-actions{display:flex;align-items:center;gap:var(--ffc-spacing-md);margin-top:var(--ffc-spacing-xl)}.ffc-profile-edit-actions .button{padding:var(--ffc-spacing-sm) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-sm);border-radius:var(--ffc-radius-md)}.ffc-pagination{display:flex;align-items:center;justify-content:center;gap:var(--ffc-spacing-md);margin-top:var(--ffc-spacing-xl);padding-top:var(--ffc-spacing-lg);border-top:1px solid var(--ffc-border-light)}.ffc-pagination-btn{padding:var(--ffc-spacing-xs) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);font-weight:500;background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background .15s;line-height:1.4}.ffc-pagination-btn:hover{background:var(--ffc-primary-hover);border-color:var(--ffc-primary-hover)}.ffc-pagination-btn:disabled{background:var(--ffc-bg-alt);border-color:var(--ffc-border);color:var(--ffc-text-muted);cursor:not-allowed}.ffc-pagination-info{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted)}.ffc-appointments-table{overflow:visible}.ffc-cal-export-wrap{position:relative;display:inline-block;vertical-align:middle}.ffc-cal-export-btn{display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-xs);line-height:1.4;background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);cursor:pointer;white-space:nowrap;transition:background .15s}.ffc-cal-export-btn:hover{background:var(--ffc-primary-hover);border-color:var(--ffc-primary-hover);color:var(--ffc-text-on-primary)}.ffc-cal-export-btn svg{flex-shrink:0}.ffc-cal-export-dropdown{display:none;position:absolute;right:0;top:100%;margin-top:var(--ffc-spacing-2xs);min-width:200px;background:var(--ffc-bg);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);box-shadow:var(--ffc-shadow-md);z-index:var(--ffc-z-overlay);overflow:hidden}.ffc-cal-export-dropdown.is-open{display:block}.ffc-cal-export-dropdown a{display:flex;align-items:center;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);color:var(--ffc-text);text-decoration:none;font-size:var(--ffc-font-size-sm);transition:background .15s;border-bottom:1px solid var(--ffc-border-light)}.ffc-cal-export-dropdown a:last-child{border-bottom:none}.ffc-cal-export-dropdown a:hover{background:var(--ffc-primary-light)}.ffc-cal-export-dropdown a svg{flex-shrink:0}.ffc-error{background:var(--ffc-danger-bg);border-left:4px solid var(--ffc-danger);color:var(--ffc-danger-text);padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-md);margin:var(--ffc-spacing-2xl) 0;font-size:var(--ffc-font-size-base)}.ffc-empty-state p{font-size:var(--ffc-font-size-lg);margin:var(--ffc-spacing-sm) 0}@media (max-width:768px){.ffc-user-dashboard{padding:var(--ffc-spacing-xl);margin:var(--ffc-spacing-lg) auto}.ffc-dashboard-summary{grid-template-columns:1fr}.ffc-filter-bar{flex-direction:column;align-items:stretch;gap:var(--ffc-spacing-md)}.ffc-filter-bar label{flex-direction:column;align-items:stretch}.ffc-filter-bar input[type=text]{min-width:0;width:100%}.ffc-filter-bar input[type=date]{width:100%}.ffc-filter-bar .button{width:100%;text-align:center;padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg)}.ffc-page-size-select{margin-left:0;text-align:center}.ffc-dashboard-tabs{flex-direction:column;gap:0;border-bottom:none}.ffc-tab{border-bottom:1px solid var(--ffc-border-light);border-radius:0;text-align:left;margin-bottom:0}.ffc-tab.is-active{border-left:3px solid var(--ffc-primary);border-bottom:1px solid var(--ffc-border-light);background:var(--ffc-primary-light)}.ffc-profile-info{grid-template-columns:1fr}.ffc-profile-field{border-right:none}.ffc-profile-field:last-child{border-bottom:none}.ffc-profile-actions{flex-direction:column}.ffc-profile-actions .button{justify-content:center}.ffc-appointments-table,.ffc-audience-bookings-table,.ffc-certificates-table,.ffc-reregistrations-table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch}.ffc-certificates-table tbody,.ffc-certificates-table thead,.ffc-certificates-table tr{display:table;width:100%;table-layout:fixed}.ffc-certificates-table td,.ffc-certificates-table th{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xs);font-size:var(--ffc-font-size-xs)}.ffc-certificates-table td:nth-child(5){font-size:10px}.ffc-certificates-table .button{padding:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);font-size:var(--ffc-font-size-2xs)}}#ffc-tabpanel-recruitment .ffc-recruitment-my-calls>h2{margin:0 0 var(--ffc-spacing-xl);font-size:var(--ffc-font-size-xl);font-weight:600;color:var(--ffc-text)}#ffc-tabpanel-recruitment .ffc-recruitment-my-notice{border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-card);padding:var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-xl)}#ffc-tabpanel-recruitment .ffc-recruitment-my-notice header{margin-bottom:var(--ffc-spacing-lg);border-bottom:1px solid var(--ffc-border-light);padding-bottom:var(--ffc-spacing-lg)}#ffc-tabpanel-recruitment .ffc-recruitment-my-notice header h3{margin:0 0 var(--ffc-spacing-sm);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}#ffc-tabpanel-recruitment .ffc-recruitment-my-notice h4{margin:var(--ffc-spacing-xl) 0 var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-text-secondary);text-transform:uppercase;letter-spacing:.3px}#ffc-tabpanel-recruitment .ffc-recruitment-banner{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-md);border-radius:var(--ffc-radius-md);font-size:var(--ffc-font-size-xs);font-weight:500}#ffc-tabpanel-recruitment .ffc-banner-preliminary{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}#ffc-tabpanel-recruitment .ffc-banner-definitive{background:var(--ffc-success-bg);color:var(--ffc-success-text)}@media (prefers-reduced-motion:reduce){.ffc-tab-content{animation:none}.ffc-loading::after{animation:none}.ffc-tab{transition:none}.ffc-audience-join-item{transition:none}.ffc-password-form input{transition:none}}@media (forced-colors:active){.ffc-dashboard-status.ffc-dashboard-status-approved,.ffc-dashboard-status.ffc-dashboard-status-cancelled,.ffc-dashboard-status.ffc-dashboard-status-completed,.ffc-dashboard-status.ffc-dashboard-status-confirmed,.ffc-dashboard-status.ffc-dashboard-status-expired,.ffc-dashboard-status.ffc-dashboard-status-in_progress,.ffc-dashboard-status.ffc-dashboard-status-no_show,.ffc-dashboard-status.ffc-dashboard-status-pending,.ffc-dashboard-status.ffc-dashboard-status-rejected,.ffc-dashboard-status.ffc-dashboard-status-submitted{border:1px solid CanvasText}}.ffc-set-password-card{max-width:420px;margin:0 auto;padding:var(--ffc-spacing-3xl);background:var(--ffc-bg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-lg)}.ffc-set-password-card h2{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-xl);color:var(--ffc-text)}.ffc-set-password-card>p{margin:0 0 var(--ffc-spacing-2xl) 0;font-size:var(--ffc-font-size-base);color:var(--ffc-text-secondary)}.ffc-set-password-field{margin:0 0 var(--ffc-spacing-xl) 0}.ffc-set-password-field label{display:block;margin-bottom:var(--ffc-spacing-xs);font-size:var(--ffc-font-size-sm);font-weight:600;color:var(--ffc-text)}.ffc-set-password-field input[type=password]{width:100%;box-sizing:border-box;padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);font-size:var(--ffc-font-size-base);background:var(--ffc-bg);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-set-password-actions{margin:0}.ffc-set-password-actions .button{width:100%;padding:var(--ffc-spacing-md) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-base);font-weight:600;text-align:center;vertical-align:middle} +.ffc-user-dashboard{max-width:1500px;margin:var(--ffc-spacing-2xl) auto;padding:var(--ffc-spacing-3xl);background:var(--ffc-bg);border-radius:var(--ffc-radius-lg);box-shadow:var(--ffc-shadow-md);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;color:var(--ffc-text)}.ffc-dashboard-notice{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-2xl);border-radius:var(--ffc-radius-md);border-left:4px solid var(--ffc-border);font-size:var(--ffc-font-size-base);line-height:1.5}.ffc-notice-info{background:var(--ffc-info-bg);border-left-color:var(--ffc-primary);color:var(--ffc-info-text)}.ffc-notice-warning{background:var(--ffc-warning-bg);border-left-color:var(--ffc-warning);color:var(--ffc-warning-text)}.ffc-notice-admin-viewing{background:var(--ffc-warning-bg);border-left-color:var(--ffc-warning-border);color:var(--ffc-warning-text);font-weight:600}.ffc-notice-admin-viewing strong{color:var(--ffc-warning-text)}.ffc-dashboard-notice p{margin:.4em 0}.ffc-dashboard-notice .button{margin-top:var(--ffc-spacing-sm)}.ffc-dashboard-tabs{display:flex;gap:var(--ffc-spacing-3xs);margin-bottom:var(--ffc-spacing-3xl);border-bottom:2px solid var(--ffc-border-light)}.ffc-tab{padding:var(--ffc-spacing-md) var(--ffc-spacing-2xl);background:0 0;border:none;border-bottom:3px solid transparent;cursor:pointer;font-size:var(--ffc-font-size-base);font-weight:500;color:var(--ffc-text-muted);transition:color .2s,border-color .2s,background .2s;border-radius:var(--ffc-radius-md) var(--ffc-radius-md) 0 0;margin-bottom:-2px;white-space:nowrap}.ffc-tab:hover{color:var(--ffc-text);background:var(--ffc-bg-alt)}.ffc-tab.is-active{color:var(--ffc-primary);border-bottom-color:var(--ffc-primary);font-weight:600;background:0 0}.ffc-tab-content{display:none;padding:var(--ffc-spacing-2xs) 0;animation:ffcFadeIn .25s ease}.ffc-tab-content.is-active{display:block}@keyframes ffcFadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.ffc-loading{text-align:center;padding:48px var(--ffc-spacing-2xl);color:var(--ffc-text-muted);font-size:var(--ffc-font-size-base)}.ffc-loading::after{content:'';display:inline-block;width:18px;height:18px;margin-left:var(--ffc-spacing-sm);border:2px solid var(--ffc-border);border-top-color:var(--ffc-primary);border-radius:var(--ffc-radius-full);animation:ffcSpin .8s linear infinite;vertical-align:middle}@keyframes ffcSpin{to{transform:rotate(360deg)}}.ffc-dashboard-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:var(--ffc-spacing-lg);margin-bottom:var(--ffc-spacing-3xl)}.ffc-dashboard-summary:empty{display:none}.ffc-summary-card{background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-lg);padding:var(--ffc-spacing-xl) var(--ffc-spacing-xl);text-align:center;transition:box-shadow .2s,border-color .2s}.ffc-summary-card:hover{border-color:var(--ffc-border);box-shadow:var(--ffc-shadow-sm)}.ffc-summary-number{font-size:28px;font-weight:700;color:var(--ffc-primary);line-height:1.2}.ffc-summary-number.ffc-summary-date{font-size:var(--ffc-font-size-lg);font-weight:600}.ffc-summary-detail{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-secondary);margin-top:var(--ffc-spacing-3xs)}.ffc-summary-label{font-size:var(--ffc-font-size-2xs);color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.6px;font-weight:600;margin-top:var(--ffc-spacing-sm)}.ffc-filter-bar{display:flex;align-items:center;gap:var(--ffc-spacing-sm);flex-wrap:wrap;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-xl);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md)}.ffc-filter-bar label{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-secondary);display:flex;align-items:center;gap:var(--ffc-spacing-xs);font-weight:500}.ffc-filter-bar input[type=date],.ffc-filter-bar input[type=text]{padding:var(--ffc-spacing-xs) var(--ffc-spacing-md);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-sm);background:var(--ffc-bg);color:var(--ffc-text);transition:border-color .15s,box-shadow .15s}.ffc-filter-bar input[type=date]:focus,.ffc-filter-bar input[type=text]:focus{border-color:var(--ffc-primary);box-shadow:0 0 0 1px var(--ffc-primary);outline:0}.ffc-filter-bar input[type=text]{min-width:160px}.ffc-filter-bar .button{padding:var(--ffc-spacing-xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-sm);font-weight:500;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:all .15s;line-height:1.4}.ffc-filter-bar .ffc-filter-apply{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary)}.ffc-filter-bar .ffc-filter-apply:hover{background:var(--ffc-primary-hover);border-color:var(--ffc-primary-hover)}.ffc-filter-bar .ffc-filter-clear{background:var(--ffc-bg);color:var(--ffc-text-secondary);border:1px solid var(--ffc-border)}.ffc-filter-bar .ffc-filter-clear:hover{background:var(--ffc-bg-alt);color:var(--ffc-text)}.ffc-page-size-select{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted);margin-left:auto}.ffc-page-size-select a{color:var(--ffc-primary);text-decoration:none;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-xs);border-radius:var(--ffc-radius-xs);transition:background .15s}.ffc-page-size-select a:hover{background:var(--ffc-primary-light)}.ffc-page-size-select strong{color:var(--ffc-text);background:var(--ffc-primary-light);padding:var(--ffc-spacing-3xs) var(--ffc-spacing-sm);border-radius:var(--ffc-radius-xs);font-weight:600}.ffc-appointments-table,.ffc-audience-bookings-table,.ffc-certificates-table,.ffc-recruitment-table,.ffc-reregistrations-table{width:100%;border-collapse:separate;border-spacing:0;margin-top:0;border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);overflow:hidden}.ffc-appointments-table th,.ffc-audience-bookings-table th,.ffc-certificates-table th,.ffc-recruitment-table th,.ffc-reregistrations-table th{background:var(--ffc-bg-alt);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);text-align:left;font-weight:600;font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary);text-transform:uppercase;letter-spacing:.3px;border-bottom:1px solid var(--ffc-border-light)}.ffc-appointments-table td,.ffc-audience-bookings-table td,.ffc-certificates-table td,.ffc-recruitment-table td,.ffc-reregistrations-table td{padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);border-bottom:1px solid var(--ffc-border-light);vertical-align:middle;font-size:var(--ffc-font-size-sm);color:var(--ffc-text)}.ffc-appointments-table tr:last-child td,.ffc-audience-bookings-table tr:last-child td,.ffc-certificates-table tr:last-child td,.ffc-recruitment-table tr:last-child td,.ffc-reregistrations-table tr:last-child td{border-bottom:none}.ffc-appointments-table tbody tr:hover,.ffc-audience-bookings-table tbody tr:hover,.ffc-certificates-table tbody tr:hover,.ffc-recruitment-table tbody tr:hover,.ffc-reregistrations-table tbody tr:hover{background:var(--ffc-primary-light)}.ffc-certificates-table{table-layout:fixed}.ffc-certificates-table td:first-child,.ffc-certificates-table th:first-child{width:20%}.ffc-certificates-table td:nth-child(2),.ffc-certificates-table th:nth-child(2){width:13%}.ffc-certificates-table td:nth-child(3),.ffc-certificates-table th:nth-child(3){width:15%;text-align:center}.ffc-certificates-table td:nth-child(4),.ffc-certificates-table th:nth-child(4){width:22%;word-break:break-all}.ffc-certificates-table td:nth-child(5),.ffc-certificates-table th:nth-child(5){width:17%}.ffc-certificates-table td:nth-child(5){font-family:'Courier New',Courier,monospace;font-size:var(--ffc-font-size-2xs);font-weight:500;letter-spacing:.3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ffc-certificates-table td:nth-child(6),.ffc-certificates-table th:nth-child(6){width:13%;text-align:center}.ffc-certificates-table .ffc-consent-yes{color:var(--ffc-success);font-weight:600}.ffc-certificates-table .ffc-consent-no{color:var(--ffc-danger);font-weight:600}.ffc-btn-edit,.ffc-btn-pdf,.ffc-btn-receipt{display:inline-flex!important;align-items:center;vertical-align:middle;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg)!important;font-size:var(--ffc-font-size-xs)!important;font-weight:500;text-decoration:none!important;white-space:nowrap;border-radius:var(--ffc-radius-sm)!important;transition:all .15s;line-height:1.4;cursor:pointer}.ffc-btn-pdf{background:var(--ffc-danger)!important;color:var(--ffc-text-on-danger)!important;border:1px solid var(--ffc-danger)!important}.ffc-btn-pdf:hover{background:var(--ffc-danger-hover)!important;border-color:var(--ffc-danger-hover)!important;color:var(--ffc-text-on-danger)!important}.ffc-btn-pdf::before{content:'';display:inline-block;width:14px;height:14px;background:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M4 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5L9.5 0H4zm5.5 1.5v3h3l-3-3zM5.5 8a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H6.75v1h.75a.5.5 0 0 1 0 1h-.75v1.5a.5.5 0 0 1-1 0V8zm3.5-.5a.5.5 0 0 0-.5.5v3.5a.5.5 0 0 0 .5.5h.5a1.5 1.5 0 0 0 0-3H9.5v-1a.5.5 0 0 0-.5-.5z'/%3E%3C/svg%3E") no-repeat center;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M4 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5L9.5 0H4zm5.5 1.5v3h3l-3-3zM5.5 8a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H6.75v1h.75a.5.5 0 0 1 0 1h-.75v1.5a.5.5 0 0 1-1 0V8zm3.5-.5a.5.5 0 0 0-.5.5v3.5a.5.5 0 0 0 .5.5h.5a1.5 1.5 0 0 0 0-3H9.5v-1a.5.5 0 0 0-.5-.5z'/%3E%3C/svg%3E") no-repeat center;flex-shrink:0}.ffc-btn-receipt{background:var(--ffc-primary)!important;color:var(--ffc-text-on-primary)!important;border:1px solid var(--ffc-primary)!important}.ffc-btn-receipt:hover{background:var(--ffc-primary-hover)!important;border-color:var(--ffc-primary-hover)!important;color:var(--ffc-text-on-primary)!important}.ffc-btn-receipt::before{content:'';display:inline-block;width:14px;height:14px;background:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M1.92.506a.5.5 0 0 1 .434.14L3 1.293l.646-.647a.5.5 0 0 1 .708 0L5 1.293l.646-.647a.5.5 0 0 1 .708 0L7 1.293l.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .801.13l.5 1A.5.5 0 0 1 13 2v12a.5.5 0 0 1-.053.224l-.5 1a.5.5 0 0 1-.8.13L11 14.707l-.646.647a.5.5 0 0 1-.708 0L9 14.707l-.646.647a.5.5 0 0 1-.708 0L7 14.707l-.646.647a.5.5 0 0 1-.708 0L5 14.707l-.646.647a.5.5 0 0 1-.708 0L3 14.707l-.646.647a.5.5 0 0 1-.801-.13l-.5-1A.5.5 0 0 1 1 14V2a.5.5 0 0 1 .053-.224l.5-1a.5.5 0 0 1 .367-.27zM4 5a.5.5 0 0 0 0 1h8a.5.5 0 0 0 0-1H4zm0 2.5a.5.5 0 0 0 0 1h8a.5.5 0 0 0 0-1H4zm0 2.5a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1H4z'/%3E%3C/svg%3E") no-repeat center;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M1.92.506a.5.5 0 0 1 .434.14L3 1.293l.646-.647a.5.5 0 0 1 .708 0L5 1.293l.646-.647a.5.5 0 0 1 .708 0L7 1.293l.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .801.13l.5 1A.5.5 0 0 1 13 2v12a.5.5 0 0 1-.053.224l-.5 1a.5.5 0 0 1-.8.13L11 14.707l-.646.647a.5.5 0 0 1-.708 0L9 14.707l-.646.647a.5.5 0 0 1-.708 0L7 14.707l-.646.647a.5.5 0 0 1-.708 0L5 14.707l-.646.647a.5.5 0 0 1-.708 0L3 14.707l-.646.647a.5.5 0 0 1-.801-.13l-.5-1A.5.5 0 0 1 1 14V2a.5.5 0 0 1 .053-.224l.5-1a.5.5 0 0 1 .367-.27zM4 5a.5.5 0 0 0 0 1h8a.5.5 0 0 0 0-1H4zm0 2.5a.5.5 0 0 0 0 1h8a.5.5 0 0 0 0-1H4zm0 2.5a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1H4z'/%3E%3C/svg%3E") no-repeat center;flex-shrink:0}.ffc-btn-edit{background:var(--ffc-primary)!important;color:var(--ffc-text-on-primary)!important;border:1px solid var(--ffc-primary)!important}.ffc-btn-edit:hover{background:var(--ffc-primary-hover)!important;border-color:var(--ffc-primary-hover)!important;color:var(--ffc-text-on-primary)!important}.ffc-btn-edit::before{content:'';display:inline-block;width:14px;height:14px;background:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z'/%3E%3C/svg%3E") no-repeat center;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z'/%3E%3C/svg%3E") no-repeat center;flex-shrink:0}.ffc-appointments-table td:last-child,.ffc-certificates-table td:last-child,.ffc-reregistrations-table td:last-child{white-space:nowrap}.ffc-appointments-table td:last-child>*+*,.ffc-reregistrations-table td:last-child>*+*{margin-left:var(--ffc-spacing-xs)}.ffc-dashboard-status{padding:3px var(--ffc-spacing-md);border-radius:10px;font-size:var(--ffc-font-size-2xs);font-weight:600;display:inline-block;letter-spacing:.2px;text-transform:capitalize}.ffc-dashboard-status.ffc-dashboard-status-pending{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-dashboard-status.ffc-dashboard-status-confirmed{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-dashboard-status.ffc-dashboard-status-cancelled{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-dashboard-status.ffc-dashboard-status-completed{background:var(--ffc-info-bg);color:var(--ffc-info-text)}.ffc-dashboard-status.ffc-dashboard-status-no_show{background:var(--ffc-bg-alt);color:var(--ffc-text-secondary)}.ffc-appointments-table .ffc-cancel-appointment{display:inline-block;vertical-align:middle;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-xs);line-height:1.4;min-height:0;background:0 0;color:var(--ffc-danger);border:1px solid var(--ffc-danger);border-radius:var(--ffc-radius-sm);cursor:pointer;white-space:nowrap;transition:all .15s}.ffc-appointments-table .ffc-cancel-appointment:hover{background:var(--ffc-danger);color:var(--ffc-text-on-danger)}.ffc-appointments-table.ffc-table-past td{color:var(--ffc-text-muted)}.ffc-appointments-table .ffc-row-past{background:var(--ffc-bg-alt)}.ffc-appointments-table .ffc-row-cancelled{background:var(--ffc-danger-bg)}.ffc-appointments-table .ffc-row-cancelled td{color:var(--ffc-text-muted)}#ffc-tabpanel-appointments h3,#ffc-tabpanel-audience h3,#ffc-tabpanel-reregistrations h3{margin-top:0;margin-bottom:var(--ffc-spacing-lg);color:var(--ffc-text);font-size:var(--ffc-font-size-lg);font-weight:600;border-bottom:1px solid var(--ffc-border-light);padding-bottom:var(--ffc-spacing-md)}.ffc-audience-bookings-table td:first-child,.ffc-audience-bookings-table th:first-child{width:17%}.ffc-audience-bookings-table td:nth-child(2),.ffc-audience-bookings-table th:nth-child(2){width:12%}.ffc-audience-bookings-table td:nth-child(3),.ffc-audience-bookings-table th:nth-child(3){width:10%}.ffc-audience-bookings-table td:nth-child(4),.ffc-audience-bookings-table th:nth-child(4){width:24%}.ffc-audience-bookings-table td:nth-child(5),.ffc-audience-bookings-table th:nth-child(5){width:17%}.ffc-audience-bookings-table td:nth-child(6),.ffc-audience-bookings-table th:nth-child(6){width:20%}.ffc-audience-bookings-table.ffc-table-past td{color:var(--ffc-text-muted)}.ffc-audience-bookings-table .ffc-row-past{background:var(--ffc-bg-alt)}.ffc-audience-bookings-table .ffc-row-cancelled{background:var(--ffc-danger-bg)}.ffc-audience-bookings-table .ffc-row-cancelled td{color:var(--ffc-text-muted)}.ffc-audience-bookings-table .ffc-audience-tag{display:block;margin-bottom:var(--ffc-spacing-2xs)}.ffc-audience-bookings-table .ffc-audience-tag:last-child{margin-bottom:0}.ffc-reregistrations-table.ffc-table-past td{color:var(--ffc-text-muted)}.ffc-reregistrations-table .ffc-row-past{background:var(--ffc-bg-alt)}.ffc-reregistrations-table .ffc-auth-code{font-family:'Courier New',Courier,monospace;font-size:var(--ffc-font-size-xs);font-weight:600;letter-spacing:.5px;background:var(--ffc-bg-alt);padding:3px var(--ffc-spacing-sm);border-radius:var(--ffc-radius-sm);border:1px solid var(--ffc-border-light);white-space:nowrap}.ffc-dashboard-status.ffc-dashboard-status-submitted{background:var(--ffc-primary-light);color:var(--ffc-primary-hover)}.ffc-dashboard-status.ffc-dashboard-status-approved{background:var(--ffc-success-bg);color:var(--ffc-success-text)}.ffc-dashboard-status.ffc-dashboard-status-rejected{background:var(--ffc-danger-bg);color:var(--ffc-danger-text)}.ffc-dashboard-status.ffc-dashboard-status-expired{background:var(--ffc-bg-alt);color:var(--ffc-text-secondary)}.ffc-dashboard-status.ffc-dashboard-status-in_progress{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}.ffc-profile-logout{text-align:right;margin-bottom:var(--ffc-spacing-lg)}.ffc-logout-link{display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs);color:var(--ffc-text-secondary);text-decoration:none;font-size:var(--ffc-font-size-sm);font-weight:500;padding:var(--ffc-spacing-xs) var(--ffc-spacing-lg);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);background:var(--ffc-bg);transition:all .2s ease}.ffc-logout-link:hover{color:var(--ffc-danger-text);border-color:var(--ffc-danger);background:var(--ffc-danger-bg)}.ffc-logout-link .ffc-icon-logout{display:inline-flex}.ffc-logout-link .ffc-icon-logout::before{margin-right:0}.ffc-profile-info{background:var(--ffc-bg);padding:0;border-radius:var(--ffc-radius-md);margin-top:0;display:grid;grid-template-columns:1fr 1fr;gap:0;border:1px solid var(--ffc-border-light);overflow:hidden}.ffc-profile-field{padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);margin:0;border-bottom:1px solid var(--ffc-border-light);border-right:1px solid var(--ffc-border-light)}.ffc-profile-field:nth-child(2n){border-right:none}.ffc-profile-field:last-child,.ffc-profile-field:nth-last-child(2):nth-child(odd){border-bottom:none}.ffc-profile-field:last-child:nth-child(2n){border-bottom:none}.ffc-profile-field label{display:block;font-size:var(--ffc-font-size-2xs);font-weight:600;color:var(--ffc-text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:var(--ffc-spacing-2xs)}.ffc-profile-field .ffc-field-value{color:var(--ffc-text);font-size:var(--ffc-font-size-base);font-weight:500;line-height:1.5}.ffc-profile-field .ffc-cpf-list,.ffc-profile-field .ffc-email-list,.ffc-profile-field .ffc-name-list{list-style:none;padding:0;margin:0}.ffc-profile-field .ffc-cpf-list li,.ffc-profile-field .ffc-email-list li,.ffc-profile-field .ffc-name-list li{padding:var(--ffc-spacing-3xs) 0;color:var(--ffc-text);font-size:var(--ffc-font-size-base);font-weight:500}.ffc-profile-field .ffc-cpf-list li::before,.ffc-profile-field .ffc-email-list li::before,.ffc-profile-field .ffc-name-list li::before{content:'';display:inline-block;width:6px;height:6px;border-radius:var(--ffc-radius-full);background:var(--ffc-primary);margin-right:var(--ffc-spacing-sm);vertical-align:middle}.ffc-profile-actions{display:flex;gap:var(--ffc-spacing-md);margin-top:var(--ffc-spacing-xl)}.ffc-profile-actions .button{padding:9px var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-sm);font-weight:500;border-radius:var(--ffc-radius-md);cursor:pointer;transition:all .15s;line-height:1.4;text-decoration:none;display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs)}.ffc-profile-actions .button-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary);box-shadow:var(--ffc-shadow-sm)}.ffc-profile-actions .button-primary:hover{background:var(--ffc-primary-hover);border-color:var(--ffc-primary-hover)}.ffc-profile-actions .button:not(.button-primary){background:var(--ffc-bg);color:var(--ffc-text-secondary);border:1px solid var(--ffc-border)}.ffc-profile-actions .button:not(.button-primary):hover{background:var(--ffc-bg-alt);color:var(--ffc-text);border-color:var(--ffc-border)}.ffc-profile-actions .ffc-leave-all-groups-btn{color:var(--ffc-danger-text);border-color:var(--ffc-danger)}.ffc-profile-actions .ffc-leave-all-groups-btn:hover{background:var(--ffc-danger);color:var(--ffc-text-on-danger);border-color:var(--ffc-danger)}.ffc-password-form{margin-top:var(--ffc-spacing-lg);padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md)}.ffc-password-form .ffc-profile-field{padding:0;border:none;margin-bottom:var(--ffc-spacing-lg)}.ffc-password-form .ffc-profile-field label{font-size:var(--ffc-font-size-sm);text-transform:none;letter-spacing:0;font-weight:600;color:var(--ffc-text);margin-bottom:var(--ffc-spacing-2xs)}.ffc-password-form input[type=password]{color:var(--ffc-text);width:100%;max-width:340px;padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);background:var(--ffc-bg);transition:border-color .15s,box-shadow .15s}.ffc-password-form input[type=password]:focus{border-color:var(--ffc-primary);box-shadow:0 0 0 1px var(--ffc-primary);outline:0}.ffc-password-form .button-primary{padding:var(--ffc-spacing-sm) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-sm);border-radius:var(--ffc-radius-md)}.ffc-profile-section{margin-top:var(--ffc-spacing-3xl);padding-top:var(--ffc-spacing-2xl);border-top:1px solid var(--ffc-border-light)}.ffc-profile-section h3{font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);margin:0 0 var(--ffc-spacing-lg) 0}.ffc-audience-join-section{margin-top:var(--ffc-spacing-3xl);padding-top:var(--ffc-spacing-2xl);border-top:1px solid var(--ffc-border-light)}.ffc-audience-join-section h3{font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text);margin:0 0 var(--ffc-spacing-xs) 0}.ffc-audience-limit-msg{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted);margin:0 0 var(--ffc-spacing-xl) 0}.ffc-audience-parent-group{margin-bottom:var(--ffc-spacing-xl)}.ffc-audience-parent-group:last-child{margin-bottom:0}.ffc-audience-parent-header{display:flex;align-items:center;gap:var(--ffc-spacing-md);width:100%;font-size:var(--ffc-font-size-base);font-weight:600;font-family:inherit;color:var(--ffc-text);padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md) var(--ffc-radius-md) 0 0;cursor:pointer;transition:background .15s;text-align:left}.ffc-audience-parent-header:hover{background:var(--ffc-bg-alt)}.ffc-audience-parent-header[aria-expanded=true]{border-radius:var(--ffc-radius-md) var(--ffc-radius-md) 0 0}.ffc-audience-parent-header[aria-expanded=false]{border-radius:var(--ffc-radius-md)}.ffc-audience-header-name{flex:1}.ffc-audience-toggle-icon{flex-shrink:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:var(--ffc-font-size-lg);font-weight:700;color:var(--ffc-text-muted);line-height:1}.ffc-audience-children-list.ffc-audience-collapsed{display:none}.ffc-audience-subgroup{margin-bottom:0}.ffc-audience-subgroup .ffc-audience-parent-header{font-size:var(--ffc-font-size-sm);font-weight:500;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg) var(--ffc-spacing-md) 28px;min-height:44px;box-sizing:border-box;background:var(--ffc-bg);border-radius:0;border-bottom:1px solid var(--ffc-border-light);border-top:none;border-left:none;border-right:none}.ffc-audience-subgroup .ffc-audience-parent-header[aria-expanded=false],.ffc-audience-subgroup .ffc-audience-parent-header[aria-expanded=true]{border-radius:0}.ffc-audience-subgroup .ffc-audience-children-list{border:none;border-radius:0}.ffc-audience-subgroup .ffc-audience-join-item{padding-left:42px}.ffc-audience-children-list{display:flex;flex-direction:column;border-left:1px solid var(--ffc-border-light);border-right:1px solid var(--ffc-border-light);border-bottom:1px solid var(--ffc-border-light);border-radius:0 0 var(--ffc-radius-md) var(--ffc-radius-md);overflow:hidden}.ffc-audience-join-item{display:flex;align-items:center;justify-content:space-between;padding:var(--ffc-spacing-md) var(--ffc-spacing-lg) var(--ffc-spacing-md) 28px;min-height:44px;box-sizing:border-box;background:var(--ffc-bg);border-bottom:1px solid var(--ffc-border-light);transition:background .15s}.ffc-audience-join-item:last-child{border-bottom:none}.ffc-audience-join-item:hover{background:var(--ffc-bg-alt)}.ffc-audience-join-item .ffc-audience-name{font-weight:500;font-size:var(--ffc-font-size-base);color:var(--ffc-text);display:flex;align-items:center;gap:var(--ffc-spacing-md)}.ffc-audience-dot{width:12px;height:12px;border-radius:var(--ffc-radius-full);display:inline-block;flex-shrink:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1)}.ffc-audience-join-item .button{flex-shrink:0;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-xs);font-weight:500;border-radius:var(--ffc-radius-sm);cursor:pointer;transition:all .15s;line-height:1.4}.ffc-audience-join-item .button.button-primary{background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary)}.ffc-audience-join-item .button.button-primary:hover{background:var(--ffc-primary-hover)}.ffc-audience-join-item .button.button-primary:disabled{background:var(--ffc-border);border-color:var(--ffc-border);cursor:not-allowed;opacity:.7}.ffc-audience-join-item .ffc-audience-leave-btn{background:0 0;color:var(--ffc-danger);border:1px solid var(--ffc-danger)}.ffc-audience-join-item .ffc-audience-leave-btn:hover{background:var(--ffc-danger);color:var(--ffc-text-on-danger)}.ffc-audience-join-item.is-member{background:var(--ffc-primary-light);border-color:var(--ffc-border-focus)}.ffc-audience-item-actions{display:flex;align-items:center;gap:var(--ffc-spacing-sm);flex-shrink:0}.ffc-audience-inline-toggle{background:0 0;border:none;padding:0;margin:0;cursor:pointer;display:inline-flex;align-items:center}.ffc-notif-list{display:flex;flex-direction:column;gap:var(--ffc-spacing-md)}.ffc-lgpd-section .ffc-lgpd-desc{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-secondary);margin:0 0 var(--ffc-spacing-md) 0;line-height:1.5}.ffc-lgpd-export-btn{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl)!important;font-size:var(--ffc-font-size-sm)!important;border-radius:var(--ffc-radius-md)!important}.ffc-lgpd-delete-btn{color:var(--ffc-danger)!important;border-color:var(--ffc-danger)!important;padding:var(--ffc-spacing-sm) var(--ffc-spacing-xl)!important;font-size:var(--ffc-font-size-sm)!important;border-radius:var(--ffc-radius-md)!important}.ffc-lgpd-delete-btn:hover{background:var(--ffc-danger)!important;color:var(--ffc-text-on-danger)!important}.ffc-profile-edit-form{border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);padding:var(--ffc-spacing-2xl);background:var(--ffc-bg-alt)}.ffc-profile-edit-form h3{margin:0 0 var(--ffc-spacing-xl) 0;font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}.ffc-profile-edit-form .ffc-profile-field{padding:0;border:none;margin-bottom:var(--ffc-spacing-lg)}.ffc-profile-edit-form .ffc-profile-field label{font-size:var(--ffc-font-size-sm);text-transform:none;letter-spacing:0;font-weight:600;color:var(--ffc-text);margin-bottom:var(--ffc-spacing-2xs)}.ffc-profile-edit-form input[type=tel],.ffc-profile-edit-form input[type=text],.ffc-profile-edit-form textarea{color:var(--ffc-text);width:100%;max-width:450px;padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm);font-size:var(--ffc-font-size-base);background:var(--ffc-bg);transition:border-color .15s,box-shadow .15s}.ffc-profile-edit-form input:focus,.ffc-profile-edit-form textarea:focus{border-color:var(--ffc-primary);box-shadow:0 0 0 1px var(--ffc-primary);outline:0}.ffc-profile-edit-form textarea{resize:vertical;font-family:inherit}.ffc-profile-edit-actions{display:flex;align-items:center;gap:var(--ffc-spacing-md);margin-top:var(--ffc-spacing-xl)}.ffc-profile-edit-actions .button{padding:var(--ffc-spacing-sm) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-sm);border-radius:var(--ffc-radius-md)}.ffc-pagination{display:flex;align-items:center;justify-content:center;gap:var(--ffc-spacing-md);margin-top:var(--ffc-spacing-xl);padding-top:var(--ffc-spacing-lg);border-top:1px solid var(--ffc-border-light)}.ffc-pagination-btn{padding:var(--ffc-spacing-xs) var(--ffc-spacing-xl);font-size:var(--ffc-font-size-sm);font-weight:500;background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);cursor:pointer;transition:background .15s;line-height:1.4}.ffc-pagination-btn:hover{background:var(--ffc-primary-hover);border-color:var(--ffc-primary-hover)}.ffc-pagination-btn:disabled{background:var(--ffc-bg-alt);border-color:var(--ffc-border);color:var(--ffc-text-muted);cursor:not-allowed}.ffc-pagination-info{font-size:var(--ffc-font-size-sm);color:var(--ffc-text-muted)}.ffc-appointments-table{overflow:visible}.ffc-cal-export-wrap{position:relative;display:inline-block;vertical-align:middle}.ffc-cal-export-btn{display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);font-size:var(--ffc-font-size-xs);line-height:1.4;background:var(--ffc-primary);color:var(--ffc-text-on-primary);border:1px solid var(--ffc-primary);border-radius:var(--ffc-radius-sm);cursor:pointer;white-space:nowrap;transition:background .15s}.ffc-cal-export-btn:hover{background:var(--ffc-primary-hover);border-color:var(--ffc-primary-hover);color:var(--ffc-text-on-primary)}.ffc-cal-export-btn svg{flex-shrink:0}.ffc-cal-export-dropdown{display:none;position:absolute;right:0;top:100%;margin-top:var(--ffc-spacing-2xs);min-width:200px;background:var(--ffc-bg);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);box-shadow:var(--ffc-shadow-md);z-index:var(--ffc-z-overlay);overflow:hidden}.ffc-cal-export-dropdown.is-open{display:block}.ffc-cal-export-dropdown a{display:flex;align-items:center;gap:var(--ffc-spacing-md);padding:var(--ffc-spacing-md) var(--ffc-spacing-lg);color:var(--ffc-text);text-decoration:none;font-size:var(--ffc-font-size-sm);transition:background .15s;border-bottom:1px solid var(--ffc-border-light)}.ffc-cal-export-dropdown a:last-child{border-bottom:none}.ffc-cal-export-dropdown a:hover{background:var(--ffc-primary-light)}.ffc-cal-export-dropdown a svg{flex-shrink:0}.ffc-error{background:var(--ffc-danger-bg);border-left:4px solid var(--ffc-danger);color:var(--ffc-danger-text);padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-radius:var(--ffc-radius-md);margin:var(--ffc-spacing-2xl) 0;font-size:var(--ffc-font-size-base)}.ffc-empty-state p{font-size:var(--ffc-font-size-lg);margin:var(--ffc-spacing-sm) 0}@media (max-width:768px){.ffc-user-dashboard{padding:var(--ffc-spacing-xl);margin:var(--ffc-spacing-lg) auto}.ffc-dashboard-summary{grid-template-columns:1fr}.ffc-filter-bar{flex-direction:column;align-items:stretch;gap:var(--ffc-spacing-md)}.ffc-filter-bar label{flex-direction:column;align-items:stretch}.ffc-filter-bar input[type=text]{min-width:0;width:100%}.ffc-filter-bar input[type=date]{width:100%}.ffc-filter-bar .button{width:100%;text-align:center;padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg)}.ffc-page-size-select{margin-left:0;text-align:center}.ffc-dashboard-tabs{flex-direction:column;gap:0;border-bottom:none}.ffc-tab{border-bottom:1px solid var(--ffc-border-light);border-radius:0;text-align:left;margin-bottom:0}.ffc-tab.is-active{border-left:3px solid var(--ffc-primary);border-bottom:1px solid var(--ffc-border-light);background:var(--ffc-primary-light)}.ffc-profile-info{grid-template-columns:1fr}.ffc-profile-field{border-right:none}.ffc-profile-field:last-child{border-bottom:none}.ffc-profile-actions{flex-direction:column}.ffc-profile-actions .button{justify-content:center}.ffc-appointments-table,.ffc-audience-bookings-table,.ffc-certificates-table,.ffc-reregistrations-table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch}.ffc-certificates-table tbody,.ffc-certificates-table thead,.ffc-certificates-table tr{display:table;width:100%;table-layout:fixed}.ffc-certificates-table td,.ffc-certificates-table th{padding:var(--ffc-spacing-sm) var(--ffc-spacing-xs);font-size:var(--ffc-font-size-xs)}.ffc-certificates-table td:nth-child(5){font-size:10px}.ffc-certificates-table .button{padding:var(--ffc-spacing-2xs) var(--ffc-spacing-sm);font-size:var(--ffc-font-size-2xs)}}#ffc-tabpanel-recruitment .ffc-recruitment-my-calls>h2{margin:0 0 var(--ffc-spacing-xl);font-size:var(--ffc-font-size-xl);font-weight:600;color:var(--ffc-text)}#ffc-tabpanel-recruitment .ffc-recruitment-my-notice{border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-card);padding:var(--ffc-spacing-xl);margin-bottom:var(--ffc-spacing-xl)}#ffc-tabpanel-recruitment .ffc-recruitment-my-notice header{margin-bottom:var(--ffc-spacing-lg);border-bottom:1px solid var(--ffc-border-light);padding-bottom:var(--ffc-spacing-lg)}#ffc-tabpanel-recruitment .ffc-recruitment-my-notice header h3{margin:0 0 var(--ffc-spacing-sm);font-size:var(--ffc-font-size-lg);font-weight:600;color:var(--ffc-text)}#ffc-tabpanel-recruitment .ffc-recruitment-my-notice h4{margin:var(--ffc-spacing-xl) 0 var(--ffc-spacing-sm);font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-text-secondary);text-transform:uppercase;letter-spacing:.3px}#ffc-tabpanel-recruitment .ffc-recruitment-banner{display:inline-block;padding:var(--ffc-spacing-2xs) var(--ffc-spacing-md);border-radius:var(--ffc-radius-md);font-size:var(--ffc-font-size-xs);font-weight:500}#ffc-tabpanel-recruitment .ffc-banner-preliminary{background:var(--ffc-warning-bg);color:var(--ffc-warning-text)}#ffc-tabpanel-recruitment .ffc-banner-definitive{background:var(--ffc-success-bg);color:var(--ffc-success-text)}@media (prefers-reduced-motion:reduce){.ffc-tab-content{animation:none}.ffc-loading::after{animation:none}.ffc-tab{transition:none}.ffc-audience-join-item{transition:none}.ffc-password-form input{transition:none}}@media (forced-colors:active){.ffc-dashboard-status.ffc-dashboard-status-approved,.ffc-dashboard-status.ffc-dashboard-status-cancelled,.ffc-dashboard-status.ffc-dashboard-status-completed,.ffc-dashboard-status.ffc-dashboard-status-confirmed,.ffc-dashboard-status.ffc-dashboard-status-expired,.ffc-dashboard-status.ffc-dashboard-status-in_progress,.ffc-dashboard-status.ffc-dashboard-status-no_show,.ffc-dashboard-status.ffc-dashboard-status-pending,.ffc-dashboard-status.ffc-dashboard-status-rejected,.ffc-dashboard-status.ffc-dashboard-status-submitted{border:1px solid CanvasText}}.ffc-set-password-card{max-width:420px;margin:0 auto;padding:var(--ffc-spacing-3xl);background:var(--ffc-bg);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-lg)}.ffc-set-password-card h2{margin:0 0 var(--ffc-spacing-lg) 0;font-size:var(--ffc-font-size-xl);color:var(--ffc-text)}.ffc-set-password-card>p{margin:0 0 var(--ffc-spacing-2xl) 0;font-size:var(--ffc-font-size-base);color:var(--ffc-text-secondary)}.ffc-set-password-field{margin:0 0 var(--ffc-spacing-xl) 0}.ffc-set-password-field label{display:block;margin-bottom:var(--ffc-spacing-xs);font-size:var(--ffc-font-size-sm);font-weight:600;color:var(--ffc-text)}.ffc-set-password-field input[type=password]{width:100%;box-sizing:border-box;padding:var(--ffc-spacing-sm) var(--ffc-spacing-md);font-size:var(--ffc-font-size-base);background:var(--ffc-bg);color:var(--ffc-text);border:1px solid var(--ffc-border);border-radius:var(--ffc-radius-sm)}.ffc-set-password-actions{margin:0}.ffc-set-password-actions .button{width:100%;padding:var(--ffc-spacing-md) var(--ffc-spacing-2xl);font-size:var(--ffc-font-size-base);font-weight:600;text-align:center;vertical-align:middle} /*# sourceMappingURL=ffc-user-dashboard.min.css.map */ \ No newline at end of file diff --git a/assets/css/ffc-user-permissions.css b/assets/css/ffc-user-permissions.css index 5c356bb41..ecd22586e 100644 --- a/assets/css/ffc-user-permissions.css +++ b/assets/css/ffc-user-permissions.css @@ -3,7 +3,7 @@ * * Grouped-card layout for the per-user capability manager on the WordPress * user-edit / profile screen. The toggle switch itself comes from - * ffc-common.css (.ffc-toggle); this file adds the panel, context summary, + * ffc-common.css (.ffc-control-toggle); this file adds the panel, context summary, * search/preset toolbar, collapsible group cards, slug chips and origin * badges. * @@ -429,12 +429,12 @@ } /* role-granted capability: amber, "locked" toggle */ -.ffc-toggle.ffc-cap-toggle--byrole input[type="checkbox"]:checked + .ffc-toggle-track { +.ffc-control-toggle.ffc-cap-toggle--byrole input[type="checkbox"]:checked + .ffc-control-toggle-track { background: var(--ffc-warning); cursor: not-allowed; } -.ffc-toggle.ffc-cap-toggle--byrole .ffc-toggle-track::after { +.ffc-control-toggle.ffc-cap-toggle--byrole .ffc-control-toggle-track::after { box-shadow: 0 0 0 2px var(--ffc-warning-bg); } diff --git a/assets/css/ffc-user-permissions.min.css b/assets/css/ffc-user-permissions.min.css index 25dc1b49f..b73a93409 100644 --- a/assets/css/ffc-user-permissions.min.css +++ b/assets/css/ffc-user-permissions.min.css @@ -1,2 +1,2 @@ -.ffc-cap-panel{width:100%;margin:var(--ffc-spacing-sm) 0 var(--ffc-spacing-2xs);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-card);overflow:hidden}.ffc-cap-context{display:grid;grid-template-columns:1fr;gap:1px;background:var(--ffc-border-light);border-bottom:1px solid var(--ffc-border-light)}.ffc-cap-context-item{display:flex;flex-direction:column;gap:var(--ffc-spacing-2xs);padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);background:var(--ffc-bg-alt)}.ffc-cap-context-label{font-size:var(--ffc-font-size-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--ffc-text-muted)}.ffc-cap-context-val{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-xs);align-items:center}.ffc-cap-context-hint{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-cap-chip{display:inline-block;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-md);border-radius:11px;font-size:var(--ffc-font-size-xs);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border);color:var(--ffc-text)}.ffc-cap-chip--color{border-color:var(--ffc-cap-chip-color,var(--ffc-border));box-shadow:inset 3px 0 0 var(--ffc-cap-chip-color,var(--ffc-border))}.ffc-cap-audiences{grid-column:1/-1}.ffc-cap-audience-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--ffc-spacing-3xs) var(--ffc-spacing-lg);max-height:180px;overflow-y:auto;padding:var(--ffc-spacing-3xs) 0}.ffc-cap-aud{display:flex;align-items:center;gap:7px;padding:3px 0;font-size:var(--ffc-font-size-sm);cursor:pointer}.ffc-cap-aud input{margin:0}.ffc-cap-aud-dot{width:9px;height:9px;border-radius:var(--ffc-radius-full);flex:0 0 auto;background:var(--ffc-cap-chip-color,var(--ffc-border))}.ffc-cap-aud-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ffc-cap-toolbar{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-sm);align-items:center;justify-content:space-between;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-bottom:1px solid var(--ffc-border-light)}.ffc-cap-search{flex:1 1 220px;min-width:180px;max-width:360px;padding:var(--ffc-spacing-xs) var(--ffc-spacing-md)}.ffc-cap-presets{display:inline-flex;gap:var(--ffc-spacing-xs)}.ffc-cap-group{border-bottom:1px solid var(--ffc-bg-alt)}.ffc-cap-group:last-child{border-bottom:0}.ffc-cap-group-h{display:flex;align-items:center;gap:var(--ffc-spacing-md);width:100%;padding:11px var(--ffc-spacing-xl);background:var(--ffc-bg-alt);border:0;border-bottom:1px solid var(--ffc-bg-alt);cursor:pointer;text-align:left;font:inherit;color:var(--ffc-text)}.ffc-cap-group-h:hover{background:var(--ffc-bg-alt)}.ffc-cap-caret{width:0;height:0;border-left:6px solid var(--ffc-text-muted);border-top:5px solid transparent;border-bottom:5px solid transparent;transition:transform .15s ease}.ffc-cap-group:not(.is-collapsed) .ffc-cap-caret{transform:rotate(90deg)}.ffc-cap-gtitle{font-weight:600;font-size:var(--ffc-font-size-sm)}.ffc-cap-badge-admin{font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.4px;padding:1px 7px;border-radius:10px;color:var(--ffc-warning-text);background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border)}.ffc-cap-section{margin:var(--ffc-spacing-xl) 0 var(--ffc-spacing-sm);padding-bottom:var(--ffc-spacing-2xs);border-bottom:1px solid var(--ffc-border-light);font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:var(--ffc-text-muted)}.ffc-cap-section:first-child{margin-top:0}.ffc-cap-badge-surface{display:inline-block;margin-left:var(--ffc-spacing-xs);padding:1px var(--ffc-spacing-xs);border-radius:9px;font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.3px;vertical-align:middle;border:1px solid transparent}.ffc-cap-badge-surface--api{color:var(--ffc-info-text);background:var(--ffc-info-bg);border-color:var(--ffc-info-border)}.ffc-cap-badge-surface--frontend{color:var(--ffc-success-text);background:var(--ffc-success-bg);border-color:var(--ffc-success-border)}.ffc-cap-badge-surface--admin{color:var(--ffc-text-secondary);background:var(--ffc-bg-alt);border-color:var(--ffc-border-light)}.ffc-cap-gmeta{margin-left:auto;font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-cap-group.is-collapsed .ffc-cap-group-body{display:none}.ffc-cap-row{display:grid;grid-template-columns:48px 1fr auto;gap:var(--ffc-spacing-lg);align-items:start;padding:11px var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border-light)}.ffc-cap-row:first-child{border-top:0}.ffc-cap-row:hover{background:var(--ffc-bg-alt)}.ffc-cap-row-toggle{padding-top:1px}.ffc-cap-row-name{display:block;font-weight:600}.ffc-cap-row-desc{display:block;margin-top:var(--ffc-spacing-3xs);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-cap-slug{display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs);margin-top:var(--ffc-spacing-xs);padding:3px 7px;border-radius:var(--ffc-radius-sm);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border)}.ffc-cap-copy{border:0;background:0 0;padding:0;cursor:pointer;font-size:var(--ffc-font-size-xs);line-height:1;color:var(--ffc-text-muted)}.ffc-cap-copy:hover{color:var(--ffc-text)}.ffc-cap-origin{align-self:center;white-space:nowrap;font-size:var(--ffc-font-size-2xs);font-weight:600;padding:var(--ffc-spacing-3xs) 9px;border-radius:11px}.ffc-cap-origin--user{color:var(--ffc-success-text);background:var(--ffc-success-bg);border:1px solid var(--ffc-success-border)}.ffc-cap-origin--role{color:var(--ffc-warning-text);background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border)}.ffc-cap-origin--none{color:var(--ffc-text-muted);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border)}.ffc-cap-role-chips{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-sm);margin:var(--ffc-spacing-3xs) 0 var(--ffc-spacing-xs)}.ffc-cap-role{display:inline-flex;align-items:center;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border-radius:20px;border:1px solid var(--ffc-border);background:var(--ffc-bg-card);cursor:pointer;font:inherit;color:var(--ffc-text);transition:box-shadow .12s,border-color .12s,background .12s}.ffc-cap-role:hover{border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-cap-role.is-on{background:var(--ffc-primary-light);border-color:var(--ffc-primary);color:var(--ffc-primary-hover)}.ffc-cap-role-mark{width:16px;height:16px;border-radius:var(--ffc-radius-full);border:1.5px solid var(--ffc-border);display:inline-flex;align-items:center;justify-content:center}.ffc-cap-role.is-on .ffc-cap-role-mark{background:var(--ffc-primary);border-color:var(--ffc-primary)}.ffc-cap-role.is-on .ffc-cap-role-mark::after{content:"✓";color:var(--ffc-bg-card);font-size:var(--ffc-font-size-2xs);line-height:1}.ffc-cap-role-nm{font-weight:600;font-size:var(--ffc-font-size-sm)}.ffc-cap-role-ct{font-size:var(--ffc-font-size-2xs);color:var(--ffc-text-muted)}.ffc-cap-role.is-on .ffc-cap-role-ct{color:var(--ffc-primary-hover)}.ffc-cap-role[disabled]{opacity:.6;cursor:progress}.ffc-cap-role-other{display:block;margin-top:var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-cap-chip--muted{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-toggle.ffc-cap-toggle--byrole input[type=checkbox]:checked+.ffc-toggle-track{background:var(--ffc-warning);cursor:not-allowed}.ffc-toggle.ffc-cap-toggle--byrole .ffc-toggle-track::after{box-shadow:0 0 0 2px var(--ffc-warning-bg)}.ffc-cap-row.is-lit{background:var(--ffc-warning-bg);box-shadow:inset 3px 0 0 var(--ffc-warning-border)}.ffc-cap-role-tag{display:none;margin-left:var(--ffc-spacing-sm);font-size:var(--ffc-font-size-2xs);font-weight:600;color:var(--ffc-warning-text);background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);border-radius:9px;padding:1px 7px;vertical-align:middle}.ffc-cap-row.is-lit .ffc-cap-role-tag:not(:empty){display:inline-block}.ffc-role-impact{max-width:860px}.ffc-role-pick{font-weight:600}.ffc-role-pick select{margin-left:var(--ffc-spacing-2xs);max-width:320px}.ffc-cap-savestate{align-self:center;min-width:48px;text-align:right;font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-success-text)}.ffc-cap-group[hidden],.ffc-cap-row[hidden]{display:none}.ffc-cap-group[data-ffc-hue=certificates]{--ffc-cap-hue:#2271b1}.ffc-cap-group[data-ffc-hue=forms]{--ffc-cap-hue:#7c3aed}.ffc-cap-group[data-ffc-hue=appointments]{--ffc-cap-hue:#0d9488}.ffc-cap-group[data-ffc-hue=calendars]{--ffc-cap-hue:#16a34a}.ffc-cap-group[data-ffc-hue=audiences]{--ffc-cap-hue:#ca8a04}.ffc-cap-group[data-ffc-hue=reregistration]{--ffc-cap-hue:#db2777}.ffc-cap-group[data-ffc-hue=custom_fields]{--ffc-cap-hue:#dc2626}.ffc-cap-group[data-ffc-hue=url_shortener]{--ffc-cap-hue:#ea580c}.ffc-cap-group[data-ffc-hue=settings]{--ffc-cap-hue:#64748b}.ffc-cap-group[data-ffc-hue=system]{--ffc-cap-hue:#334155}.ffc-cap-group[data-ffc-hue=recruitment]{--ffc-cap-hue:#4338ca}.ffc-cap-group[data-ffc-hue=date_messages]{--ffc-cap-hue:#c026d3}.ffc-cap-group[data-ffc-hue=neutral]{--ffc-cap-hue:#9ca3af}.ffc-cap-group-h{border-left:4px solid var(--ffc-cap-hue,transparent)}.ffc-cap-row{position:relative}.ffc-cap-row::before{content:"";position:absolute;top:0;bottom:0;left:0;width:3px;background:var(--ffc-cap-hue,var(--ffc-border));opacity:var(--ffc-tier-strength, .5)}.ffc-cap-row[data-ffc-tier=view]{--ffc-tier-strength:0.32}.ffc-cap-row[data-ffc-tier=download]{--ffc-tier-strength:0.40}.ffc-cap-row[data-ffc-tier=book]{--ffc-tier-strength:0.42}.ffc-cap-row[data-ffc-tier=cancel]{--ffc-tier-strength:0.46}.ffc-cap-row[data-ffc-tier=call]{--ffc-tier-strength:0.50}.ffc-cap-row[data-ffc-tier=reveal]{--ffc-tier-strength:0.58}.ffc-cap-row[data-ffc-tier=export]{--ffc-tier-strength:0.58}.ffc-cap-row[data-ffc-tier=import]{--ffc-tier-strength:0.64}.ffc-cap-row[data-ffc-tier=edit]{--ffc-tier-strength:0.70}.ffc-cap-row[data-ffc-tier=manage]{--ffc-tier-strength:0.85}.ffc-cap-row[data-ffc-tier=bypass]{--ffc-tier-strength:0.85}.ffc-cap-row[data-ffc-tier=delete]{--ffc-tier-strength:1}.ffc-blocked-roles__group{margin:0 0 var(--ffc-spacing-lg)}.ffc-blocked-roles__legend{margin:0 0 var(--ffc-spacing-xs);font-weight:600}.ffc-blocked-roles__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:var(--ffc-spacing-2xs) var(--ffc-spacing-2xl)}.ffc-blocked-roles__grid .ffc-checkbox-label{display:flex;align-items:center;gap:var(--ffc-spacing-xs);margin:0;padding:var(--ffc-spacing-3xs) 0}.ffc-blocked-roles__group--recommended .ffc-blocked-roles__legend{color:var(--ffc-success-text)}.ffc-blocked-roles__group--recommended em{color:var(--ffc-success-text);font-style:normal;font-size:var(--ffc-font-size-xs)}.ffc-blocked-roles__group--admin{padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-alt)}.ffc-blocked-roles__group--admin>summary{cursor:pointer;font-weight:600;list-style:revert}.ffc-blocked-roles__hint{margin:var(--ffc-spacing-xs) 0 var(--ffc-spacing-md)}@media (forced-colors:active){.ffc-cap-badge-surface--admin,.ffc-cap-badge-surface--api,.ffc-cap-badge-surface--frontend,.ffc-cap-chip--muted{border:1px solid CanvasText}} +.ffc-cap-panel{width:100%;margin:var(--ffc-spacing-sm) 0 var(--ffc-spacing-2xs);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-card);overflow:hidden}.ffc-cap-context{display:grid;grid-template-columns:1fr;gap:1px;background:var(--ffc-border-light);border-bottom:1px solid var(--ffc-border-light)}.ffc-cap-context-item{display:flex;flex-direction:column;gap:var(--ffc-spacing-2xs);padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);background:var(--ffc-bg-alt)}.ffc-cap-context-label{font-size:var(--ffc-font-size-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--ffc-text-muted)}.ffc-cap-context-val{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-xs);align-items:center}.ffc-cap-context-hint{font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-cap-chip{display:inline-block;padding:var(--ffc-spacing-3xs) var(--ffc-spacing-md);border-radius:11px;font-size:var(--ffc-font-size-xs);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border);color:var(--ffc-text)}.ffc-cap-chip--color{border-color:var(--ffc-cap-chip-color,var(--ffc-border));box-shadow:inset 3px 0 0 var(--ffc-cap-chip-color,var(--ffc-border))}.ffc-cap-audiences{grid-column:1/-1}.ffc-cap-audience-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--ffc-spacing-3xs) var(--ffc-spacing-lg);max-height:180px;overflow-y:auto;padding:var(--ffc-spacing-3xs) 0}.ffc-cap-aud{display:flex;align-items:center;gap:7px;padding:3px 0;font-size:var(--ffc-font-size-sm);cursor:pointer}.ffc-cap-aud input{margin:0}.ffc-cap-aud-dot{width:9px;height:9px;border-radius:var(--ffc-radius-full);flex:0 0 auto;background:var(--ffc-cap-chip-color,var(--ffc-border))}.ffc-cap-aud-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ffc-cap-toolbar{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-sm);align-items:center;justify-content:space-between;padding:var(--ffc-spacing-lg) var(--ffc-spacing-xl);border-bottom:1px solid var(--ffc-border-light)}.ffc-cap-search{flex:1 1 220px;min-width:180px;max-width:360px;padding:var(--ffc-spacing-xs) var(--ffc-spacing-md)}.ffc-cap-presets{display:inline-flex;gap:var(--ffc-spacing-xs)}.ffc-cap-group{border-bottom:1px solid var(--ffc-bg-alt)}.ffc-cap-group:last-child{border-bottom:0}.ffc-cap-group-h{display:flex;align-items:center;gap:var(--ffc-spacing-md);width:100%;padding:11px var(--ffc-spacing-xl);background:var(--ffc-bg-alt);border:0;border-bottom:1px solid var(--ffc-bg-alt);cursor:pointer;text-align:left;font:inherit;color:var(--ffc-text)}.ffc-cap-group-h:hover{background:var(--ffc-bg-alt)}.ffc-cap-caret{width:0;height:0;border-left:6px solid var(--ffc-text-muted);border-top:5px solid transparent;border-bottom:5px solid transparent;transition:transform .15s ease}.ffc-cap-group:not(.is-collapsed) .ffc-cap-caret{transform:rotate(90deg)}.ffc-cap-gtitle{font-weight:600;font-size:var(--ffc-font-size-sm)}.ffc-cap-badge-admin{font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.4px;padding:1px 7px;border-radius:10px;color:var(--ffc-warning-text);background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border)}.ffc-cap-section{margin:var(--ffc-spacing-xl) 0 var(--ffc-spacing-sm);padding-bottom:var(--ffc-spacing-2xs);border-bottom:1px solid var(--ffc-border-light);font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:var(--ffc-text-muted)}.ffc-cap-section:first-child{margin-top:0}.ffc-cap-badge-surface{display:inline-block;margin-left:var(--ffc-spacing-xs);padding:1px var(--ffc-spacing-xs);border-radius:9px;font-size:var(--ffc-font-size-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.3px;vertical-align:middle;border:1px solid transparent}.ffc-cap-badge-surface--api{color:var(--ffc-info-text);background:var(--ffc-info-bg);border-color:var(--ffc-info-border)}.ffc-cap-badge-surface--frontend{color:var(--ffc-success-text);background:var(--ffc-success-bg);border-color:var(--ffc-success-border)}.ffc-cap-badge-surface--admin{color:var(--ffc-text-secondary);background:var(--ffc-bg-alt);border-color:var(--ffc-border-light)}.ffc-cap-gmeta{margin-left:auto;font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-cap-group.is-collapsed .ffc-cap-group-body{display:none}.ffc-cap-row{display:grid;grid-template-columns:48px 1fr auto;gap:var(--ffc-spacing-lg);align-items:start;padding:11px var(--ffc-spacing-xl);border-top:1px solid var(--ffc-border-light)}.ffc-cap-row:first-child{border-top:0}.ffc-cap-row:hover{background:var(--ffc-bg-alt)}.ffc-cap-row-toggle{padding-top:1px}.ffc-cap-row-name{display:block;font-weight:600}.ffc-cap-row-desc{display:block;margin-top:var(--ffc-spacing-3xs);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-cap-slug{display:inline-flex;align-items:center;gap:var(--ffc-spacing-xs);margin-top:var(--ffc-spacing-xs);padding:3px 7px;border-radius:var(--ffc-radius-sm);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--ffc-font-size-xs);color:var(--ffc-text-secondary);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border)}.ffc-cap-copy{border:0;background:0 0;padding:0;cursor:pointer;font-size:var(--ffc-font-size-xs);line-height:1;color:var(--ffc-text-muted)}.ffc-cap-copy:hover{color:var(--ffc-text)}.ffc-cap-origin{align-self:center;white-space:nowrap;font-size:var(--ffc-font-size-2xs);font-weight:600;padding:var(--ffc-spacing-3xs) 9px;border-radius:11px}.ffc-cap-origin--user{color:var(--ffc-success-text);background:var(--ffc-success-bg);border:1px solid var(--ffc-success-border)}.ffc-cap-origin--role{color:var(--ffc-warning-text);background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border)}.ffc-cap-origin--none{color:var(--ffc-text-muted);background:var(--ffc-bg-alt);border:1px solid var(--ffc-border)}.ffc-cap-role-chips{display:flex;flex-wrap:wrap;gap:var(--ffc-spacing-sm);margin:var(--ffc-spacing-3xs) 0 var(--ffc-spacing-xs)}.ffc-cap-role{display:inline-flex;align-items:center;gap:var(--ffc-spacing-sm);padding:var(--ffc-spacing-2xs) var(--ffc-spacing-lg);border-radius:20px;border:1px solid var(--ffc-border);background:var(--ffc-bg-card);cursor:pointer;font:inherit;color:var(--ffc-text);transition:box-shadow .12s,border-color .12s,background .12s}.ffc-cap-role:hover{border-color:var(--ffc-primary);box-shadow:0 0 0 3px var(--ffc-focus-ring)}.ffc-cap-role.is-on{background:var(--ffc-primary-light);border-color:var(--ffc-primary);color:var(--ffc-primary-hover)}.ffc-cap-role-mark{width:16px;height:16px;border-radius:var(--ffc-radius-full);border:1.5px solid var(--ffc-border);display:inline-flex;align-items:center;justify-content:center}.ffc-cap-role.is-on .ffc-cap-role-mark{background:var(--ffc-primary);border-color:var(--ffc-primary)}.ffc-cap-role.is-on .ffc-cap-role-mark::after{content:"✓";color:var(--ffc-bg-card);font-size:var(--ffc-font-size-2xs);line-height:1}.ffc-cap-role-nm{font-weight:600;font-size:var(--ffc-font-size-sm)}.ffc-cap-role-ct{font-size:var(--ffc-font-size-2xs);color:var(--ffc-text-muted)}.ffc-cap-role.is-on .ffc-cap-role-ct{color:var(--ffc-primary-hover)}.ffc-cap-role[disabled]{opacity:.6;cursor:progress}.ffc-cap-role-other{display:block;margin-top:var(--ffc-spacing-2xs);font-size:var(--ffc-font-size-xs);color:var(--ffc-text-muted)}.ffc-cap-chip--muted{background:var(--ffc-bg-alt);color:var(--ffc-text-muted)}.ffc-control-toggle.ffc-cap-toggle--byrole input[type=checkbox]:checked+.ffc-control-toggle-track{background:var(--ffc-warning);cursor:not-allowed}.ffc-control-toggle.ffc-cap-toggle--byrole .ffc-control-toggle-track::after{box-shadow:0 0 0 2px var(--ffc-warning-bg)}.ffc-cap-row.is-lit{background:var(--ffc-warning-bg);box-shadow:inset 3px 0 0 var(--ffc-warning-border)}.ffc-cap-role-tag{display:none;margin-left:var(--ffc-spacing-sm);font-size:var(--ffc-font-size-2xs);font-weight:600;color:var(--ffc-warning-text);background:var(--ffc-warning-bg);border:1px solid var(--ffc-warning-border);border-radius:9px;padding:1px 7px;vertical-align:middle}.ffc-cap-row.is-lit .ffc-cap-role-tag:not(:empty){display:inline-block}.ffc-role-impact{max-width:860px}.ffc-role-pick{font-weight:600}.ffc-role-pick select{margin-left:var(--ffc-spacing-2xs);max-width:320px}.ffc-cap-savestate{align-self:center;min-width:48px;text-align:right;font-size:var(--ffc-font-size-xs);font-weight:600;color:var(--ffc-success-text)}.ffc-cap-group[hidden],.ffc-cap-row[hidden]{display:none}.ffc-cap-group[data-ffc-hue=certificates]{--ffc-cap-hue:#2271b1}.ffc-cap-group[data-ffc-hue=forms]{--ffc-cap-hue:#7c3aed}.ffc-cap-group[data-ffc-hue=appointments]{--ffc-cap-hue:#0d9488}.ffc-cap-group[data-ffc-hue=calendars]{--ffc-cap-hue:#16a34a}.ffc-cap-group[data-ffc-hue=audiences]{--ffc-cap-hue:#ca8a04}.ffc-cap-group[data-ffc-hue=reregistration]{--ffc-cap-hue:#db2777}.ffc-cap-group[data-ffc-hue=custom_fields]{--ffc-cap-hue:#dc2626}.ffc-cap-group[data-ffc-hue=url_shortener]{--ffc-cap-hue:#ea580c}.ffc-cap-group[data-ffc-hue=settings]{--ffc-cap-hue:#64748b}.ffc-cap-group[data-ffc-hue=system]{--ffc-cap-hue:#334155}.ffc-cap-group[data-ffc-hue=recruitment]{--ffc-cap-hue:#4338ca}.ffc-cap-group[data-ffc-hue=date_messages]{--ffc-cap-hue:#c026d3}.ffc-cap-group[data-ffc-hue=neutral]{--ffc-cap-hue:#9ca3af}.ffc-cap-group-h{border-left:4px solid var(--ffc-cap-hue,transparent)}.ffc-cap-row{position:relative}.ffc-cap-row::before{content:"";position:absolute;top:0;bottom:0;left:0;width:3px;background:var(--ffc-cap-hue,var(--ffc-border));opacity:var(--ffc-tier-strength, .5)}.ffc-cap-row[data-ffc-tier=view]{--ffc-tier-strength:0.32}.ffc-cap-row[data-ffc-tier=download]{--ffc-tier-strength:0.40}.ffc-cap-row[data-ffc-tier=book]{--ffc-tier-strength:0.42}.ffc-cap-row[data-ffc-tier=cancel]{--ffc-tier-strength:0.46}.ffc-cap-row[data-ffc-tier=call]{--ffc-tier-strength:0.50}.ffc-cap-row[data-ffc-tier=reveal]{--ffc-tier-strength:0.58}.ffc-cap-row[data-ffc-tier=export]{--ffc-tier-strength:0.58}.ffc-cap-row[data-ffc-tier=import]{--ffc-tier-strength:0.64}.ffc-cap-row[data-ffc-tier=edit]{--ffc-tier-strength:0.70}.ffc-cap-row[data-ffc-tier=manage]{--ffc-tier-strength:0.85}.ffc-cap-row[data-ffc-tier=bypass]{--ffc-tier-strength:0.85}.ffc-cap-row[data-ffc-tier=delete]{--ffc-tier-strength:1}.ffc-blocked-roles__group{margin:0 0 var(--ffc-spacing-lg)}.ffc-blocked-roles__legend{margin:0 0 var(--ffc-spacing-xs);font-weight:600}.ffc-blocked-roles__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:var(--ffc-spacing-2xs) var(--ffc-spacing-2xl)}.ffc-blocked-roles__grid .ffc-checkbox-label{display:flex;align-items:center;gap:var(--ffc-spacing-xs);margin:0;padding:var(--ffc-spacing-3xs) 0}.ffc-blocked-roles__group--recommended .ffc-blocked-roles__legend{color:var(--ffc-success-text)}.ffc-blocked-roles__group--recommended em{color:var(--ffc-success-text);font-style:normal;font-size:var(--ffc-font-size-xs)}.ffc-blocked-roles__group--admin{padding:var(--ffc-spacing-sm) var(--ffc-spacing-lg);border:1px solid var(--ffc-border-light);border-radius:var(--ffc-radius-md);background:var(--ffc-bg-alt)}.ffc-blocked-roles__group--admin>summary{cursor:pointer;font-weight:600;list-style:revert}.ffc-blocked-roles__hint{margin:var(--ffc-spacing-xs) 0 var(--ffc-spacing-md)}@media (forced-colors:active){.ffc-cap-badge-surface--admin,.ffc-cap-badge-surface--api,.ffc-cap-badge-surface--frontend,.ffc-cap-chip--muted{border:1px solid CanvasText}} /*# sourceMappingURL=ffc-user-permissions.min.css.map */ \ No newline at end of file diff --git a/assets/img/brand/banner-1544x500-pt_BR.png b/assets/img/brand/banner-1544x500-pt_BR.png new file mode 100644 index 000000000..1821af961 Binary files /dev/null and b/assets/img/brand/banner-1544x500-pt_BR.png differ diff --git a/assets/img/brand/banner-1544x500.png b/assets/img/brand/banner-1544x500.png new file mode 100644 index 000000000..d9a449f65 Binary files /dev/null and b/assets/img/brand/banner-1544x500.png differ diff --git a/assets/img/brand/banner-772x250-pt_BR.png b/assets/img/brand/banner-772x250-pt_BR.png new file mode 100644 index 000000000..eae2f853d Binary files /dev/null and b/assets/img/brand/banner-772x250-pt_BR.png differ diff --git a/assets/img/brand/banner-772x250.png b/assets/img/brand/banner-772x250.png new file mode 100644 index 000000000..ce881c916 Binary files /dev/null and b/assets/img/brand/banner-772x250.png differ diff --git a/assets/img/brand/icon-128.png b/assets/img/brand/icon-128.png new file mode 100644 index 000000000..1258bbb31 Binary files /dev/null and b/assets/img/brand/icon-128.png differ diff --git a/assets/img/brand/icon-256.png b/assets/img/brand/icon-256.png new file mode 100644 index 000000000..6892a1dd8 Binary files /dev/null and b/assets/img/brand/icon-256.png differ diff --git a/assets/img/brand/icon-black-128.png b/assets/img/brand/icon-black-128.png new file mode 100644 index 000000000..cb26ed35f Binary files /dev/null and b/assets/img/brand/icon-black-128.png differ diff --git a/assets/img/brand/icon-black-256.png b/assets/img/brand/icon-black-256.png new file mode 100644 index 000000000..c1260616e Binary files /dev/null and b/assets/img/brand/icon-black-256.png differ diff --git a/assets/img/brand/icon-black.svg b/assets/img/brand/icon-black.svg new file mode 100644 index 000000000..e86b6097b --- /dev/null +++ b/assets/img/brand/icon-black.svg @@ -0,0 +1 @@ +Free Form Certificate diff --git a/assets/img/brand/icon-dark-128.png b/assets/img/brand/icon-dark-128.png new file mode 100644 index 000000000..83480302d Binary files /dev/null and b/assets/img/brand/icon-dark-128.png differ diff --git a/assets/img/brand/icon-dark-256.png b/assets/img/brand/icon-dark-256.png new file mode 100644 index 000000000..74eb158aa Binary files /dev/null and b/assets/img/brand/icon-dark-256.png differ diff --git a/assets/img/brand/icon-dark.svg b/assets/img/brand/icon-dark.svg new file mode 100644 index 000000000..c9b2281ce --- /dev/null +++ b/assets/img/brand/icon-dark.svg @@ -0,0 +1 @@ +Free Form Certificate diff --git a/assets/img/brand/icon-outline-128.png b/assets/img/brand/icon-outline-128.png new file mode 100644 index 000000000..26c14a62f Binary files /dev/null and b/assets/img/brand/icon-outline-128.png differ diff --git a/assets/img/brand/icon-outline-256.png b/assets/img/brand/icon-outline-256.png new file mode 100644 index 000000000..385f3701b Binary files /dev/null and b/assets/img/brand/icon-outline-256.png differ diff --git a/assets/img/brand/icon-outline.svg b/assets/img/brand/icon-outline.svg new file mode 100644 index 000000000..eb58543f7 --- /dev/null +++ b/assets/img/brand/icon-outline.svg @@ -0,0 +1 @@ +Free Form Certificate diff --git a/assets/img/brand/icon-white-128.png b/assets/img/brand/icon-white-128.png new file mode 100644 index 000000000..c2f0444fa Binary files /dev/null and b/assets/img/brand/icon-white-128.png differ diff --git a/assets/img/brand/icon-white-256.png b/assets/img/brand/icon-white-256.png new file mode 100644 index 000000000..5d025a3b1 Binary files /dev/null and b/assets/img/brand/icon-white-256.png differ diff --git a/assets/img/brand/icon-white.svg b/assets/img/brand/icon-white.svg new file mode 100644 index 000000000..160e5294b --- /dev/null +++ b/assets/img/brand/icon-white.svg @@ -0,0 +1 @@ +Free Form Certificate diff --git a/assets/img/brand/icon.svg b/assets/img/brand/icon.svg new file mode 100644 index 000000000..8d9e4da45 --- /dev/null +++ b/assets/img/brand/icon.svg @@ -0,0 +1 @@ +Free Form Certificate diff --git a/assets/js/ffc-admin-autosave.js b/assets/js/ffc-admin-autosave.js index 03232e168..05bf6b2e4 100644 --- a/assets/js/ffc-admin-autosave.js +++ b/assets/js/ffc-admin-autosave.js @@ -77,13 +77,16 @@ if ($explicit && $explicit.length) { return $explicit; } - // `.ffc-toggle` wraps `` + `` + label + // `.ffc-control-toggle` wraps `` + `` + label // text. Injecting the badge between the input and the track kills - // the `input:checked + .ffc-toggle-track` CSS rule that recolors + // the `input:checked + .ffc-control-toggle-track` CSS rule that recolors // 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 steps (#1745) or segmented (#1750) control is one field made of + // one radio per option: its badge goes after the whole control, once. + // Inside it the badge would also break `input:checked + label`. + var $anchor = $field.closest('.ffc-control-toggle, .ffc-control-steps, .ffc-control-segmented'); if (!$anchor.length) { $anchor = $field; } @@ -346,6 +349,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 +362,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 +380,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..437785542 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",c=i.error||"Save failed",u=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-control-toggle, .ffc-control-steps, .ffc-control-segmented");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||u),"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:c)})}}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 c=e.extend({key:i},n||{}),u=o.attr("data-ffc-autosave-debounce");u&&!isNaN(parseInt(u,10))&&(c.debounce=parseInt(u,10));var d=o.attr("data-ffc-confirm-off");if(d&&(c.confirmOff=d),f){var s=e("["+t+'="'+i+'"]:radio');s.not(o).data("ffcAutoSaveBound",!0),c.$group=s}if(r){var v=e("["+t+'="'+i+'"][data-ffc-autosave-multi]');v.not(o).data("ffcAutoSaveBound",!0),c.$group=v,c.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,c)}}})}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-admin-field-builder.js b/assets/js/ffc-admin-field-builder.js index 6a449f889..b93579385 100644 --- a/assets/js/ffc-admin-field-builder.js +++ b/assets/js/ffc-admin-field-builder.js @@ -1,13 +1,16 @@ /** * FFC Admin - Field Builder Module - * v3.1.0 - Extracted from ffc-admin.js * - * Handles form field creation, editing, and management in the admin area + * Adds, removes, reorders and reshapes the rows of the certificate form's + * field builder. A new row is a copy of the server-rendered template row, so + * the markup a row is born with and the markup it is saved and re-rendered + * with are the same (#1729) — the builder used to assemble its own, different + * row out of strings, and every option the server row gained had to be + * written a second time here. * * Dependencies: * - jQuery * - jQuery UI Sortable - * - FFC Core (for notifications via window.FFC.Admin.showNotification) * * @since 3.1.0 */ @@ -15,336 +18,393 @@ (function($, FFC) { 'use strict'; - // ========================================================================== - // FIELD BUILDER - Add/Remove Fields - // ========================================================================== + var CHOICE_TYPES = ['select', 'radio', 'checkbox']; + var TEXT_TYPES = ['text', 'textarea']; + var RANGE_TYPES = ['number', 'date']; var fieldCounter = 0; + function strings() { + return (typeof ffc_ajax !== 'undefined' && ffc_ajax.strings) ? ffc_ajax.strings : {}; + } + // Field types — the ordered {value,label} list localized from the canonical - // PHP source (FormEditorBuilderMetabox::field_types_ordered), so the JS - // builder and the server-rendered row . function getFieldTypes() { if (typeof ffc_ajax !== 'undefined' && Array.isArray(ffc_ajax.fieldTypes) && ffc_ajax.fieldTypes.length) { return ffc_ajax.fieldTypes; } - var strings = (typeof ffc_ajax !== 'undefined' && ffc_ajax.strings) ? ffc_ajax.strings : {}; return [ - { value: 'checkbox', label: strings.checkbox || 'Checkbox' }, - { value: 'date', label: strings.date || 'Date' }, - { value: 'select', label: strings.dropdownSelect || 'Dropdown Select' }, - { value: 'email', label: strings.email || 'Email' }, - { value: 'number', label: strings.number || 'Number' }, - { value: 'radio', label: strings.radioButtons || 'Radio Buttons' }, - { value: 'text', label: strings.textField || 'Text Field' }, - { value: 'textarea', label: strings.textarea || 'Textarea' }, - { value: 'embed', label: strings.embedMedia || 'Embed (Media)' }, - { value: 'hidden', label: strings.hiddenField || 'Hidden Field' }, - { value: 'info', label: strings.infoBlock || 'Info Block' } + { value: 'checkbox', label: 'Checkbox' }, + { value: 'date', label: 'Date' }, + { value: 'select', label: 'Dropdown Select' }, + { value: 'email', label: 'Email' }, + { value: 'number', label: 'Number' }, + { value: 'radio', label: 'Radio Buttons' }, + { value: 'text', label: 'Text' }, + { value: 'textarea', label: 'Textarea' }, + { value: 'embed', label: 'Embed (Media)' }, + { value: 'hidden', label: 'Hidden Field' }, + { value: 'info', label: 'Info Block' } ]; } - var fieldTypes = getFieldTypes(); + function typeDescription(type) { + var map = (typeof ffc_ajax !== 'undefined' && ffc_ajax.fieldTypeDescriptions) ? ffc_ajax.fieldTypeDescriptions : {}; + return map[type] || ''; + } + + function quizOn() { + return $('#ffc_quiz_enabled').is(':checked'); + } + + /** + * Show the parts of a row that belong to its type, hide the rest. + */ + function applyType($row, type) { + var isInfo = type === 'info'; + var isEmbed = type === 'embed'; + var isChoice = CHOICE_TYPES.indexOf(type) !== -1; + + $row.find('.ffc-content-field').toggleClass('ffc-hidden', !isInfo); + $row.find('.ffc-embed-field').toggleClass('ffc-hidden', !isEmbed); + $row.find('.ffc-hidden-value-field').toggleClass('ffc-hidden', type !== 'hidden'); + $row.find('.ffc-standard-row').toggleClass('ffc-hidden', isInfo || isEmbed); + $row.find('.ffc-options-field').toggleClass('ffc-hidden', !isChoice); + $row.find('[data-ffc-types]').each(function() { + var types = String($(this).attr('data-ffc-types')).split(' '); + $(this).toggleClass('ffc-hidden', types.indexOf(type) === -1); + }); + $row.find('.ffc-type-desc').text(typeDescription(type)); + applyQuiz($row, type); + } + + /** + * Show the quiz settings a row's type and choices call for (#1730). + */ + function applyQuiz($row, type) { + type = type || String($row.find('.ffc-field-type-selector').val() || ''); + var $block = $row.find('.ffc-field-quiz'); + var scorable = String($block.attr('data-ffc-quiz-types') || '').split(' ').indexOf(type) !== -1; + var on = quizOn() && scorable; + var scored = on && $block.find('.ffc-quiz-scored').is(':checked'); + var isChoice = CHOICE_TYPES.indexOf(type) !== -1; + var mode = isChoice ? String($block.find('.ffc-quiz-mode').val()) : ''; + var textNone = TEXT_TYPES.indexOf(type) !== -1 && $block.find('.ffc-quiz-text').val() === 'none'; + + $block.toggleClass('ffc-hidden', !on); + $block.find('.ffc-field-quiz-body').toggleClass('ffc-hidden', !scored); + $row.find('.ffc-choice-quiz').each(function() { + $(this).toggleClass('ffc-hidden', !(scored && isChoice && $(this).attr('data-ffc-quiz-mode') === mode)); + }); + $block.find('.ffc-quiz-points-setting').toggleClass('ffc-hidden', (isChoice && mode === 'points') || textNone); + $block.find('[data-ffc-types]').each(function() { + $(this).toggleClass('ffc-hidden', String($(this).attr('data-ffc-types')).split(' ').indexOf(type) === -1); + }); + $block.find('[data-ffc-quiz-help="correct"]').toggleClass('ffc-hidden', !(isChoice && mode === 'correct')); + $block.find('[data-ffc-quiz-help="points"]').toggleClass('ffc-hidden', !(isChoice && mode === 'points')); + $block.find('[data-ffc-quiz-help="range"]').toggleClass('ffc-hidden', RANGE_TYPES.indexOf(type) === -1); + $block.find('[data-ffc-quiz-help="manual"]').toggleClass('ffc-hidden', !(TEXT_TYPES.indexOf(type) !== -1 && $block.find('.ffc-quiz-text').val() === 'manual')); + checkMaxSelect($row); + } + + /** + * A checkbox scored by its correct options cannot cap the selections + * below how many are correct: nobody could answer it right. + */ + function checkMaxSelect($row) { + var $max = $row.find('input[name$="[max_select]"]'); + if (!$max.length || !$max[0].setCustomValidity) { + return; + } + var type = String($row.find('.ffc-field-type-selector').val() || ''); + var limit = parseInt($max.val(), 10); + var correct = $row.find('.ffc-choice-correct-value').filter(function() { + return this.value === '1'; + }).length; + var applies = type === 'checkbox' && quizOn() && + $row.find('.ffc-quiz-scored').is(':checked') && + $row.find('.ffc-quiz-mode').val() === 'correct'; + var message = ''; + if (applies && limit > 0 && limit < correct) { + message = (strings().maxSelectBelowCorrect || 'The maximum selections is below the number of correct options (%d).').replace('%d', String(correct)); + } + $max[0].setCustomValidity(message); + } + + function refreshQuiz() { + $('#ffc-fields-container .ffc-field-row').each(function() { + applyQuiz($(this)); + }); + } + + // A number above every index already on the page, so a new row's + // `ffc_fields[N]` never collides with a saved one. + function nextIndex() { + var max = -1; + $('#ffc-fields-container .ffc-field-row').each(function() { + var n = parseInt($(this).attr('data-index'), 10); + if (!isNaN(n) && n > max) { + max = n; + } + }); + return Math.max(max + 1, fieldCounter); + } + + function addChoice($list, value) { + var $first = $list.children('.ffc-choice-row').first(); + if (!$first.length) { + return null; + } + var $row = $first.clone(); + $row.find('.ffc-choice-input').val(value || ''); + resetChoiceQuiz($row); + $list.append($row); + return $row; + } + + function resetChoiceQuiz($choice) { + $choice.find('.ffc-choice-correct-value').val('0'); + $choice.find('.ffc-choice-correct-input').prop('checked', false); + $choice.find('.ffc-choice-points-input').val(''); + } + + function makeChoicesSortable($scope) { + if ($.fn.sortable) { + $scope.find('.ffc-choice-list').sortable({ handle: '.ffc-choice-handle', axis: 'y' }); + } + } - // Initialize Form Builder function initFormBuilder() { - if ($('#ffc-fields-container').length === 0) { + var $container = $('#ffc-fields-container'); + if ($container.length === 0) { return; } - // Count existing fields - fieldCounter = $('#ffc-fields-container .ffc-field-row').length; + fieldCounter = 0; + fieldCounter = nextIndex(); - // Add Field button - Show dropdown menu - $(document).on('click', '.ffc-add-field', function(e) { + // Namespaced and replaced, so a second init() does not stack handlers. + $(document).off('click.ffcFieldBuilder'); + $(document).on('click.ffcFieldBuilder', '.ffc-add-field', function(e) { e.preventDefault(); showFieldTypeMenu($(this)); }); - // Remove Field button - $(document).on('click', '.ffc-remove-field', function(e) { + $(document).on('click.ffcFieldBuilder', '.ffc-remove-field', function(e) { e.preventDefault(); - - // Get localized string or fallback to English - var confirmMsg = (typeof ffc_ajax !== 'undefined' && ffc_ajax.strings && ffc_ajax.strings.confirmDeleteField) - ? ffc_ajax.strings.confirmDeleteField - : 'Remove this field?'; - - if (confirm(confirmMsg)) { + if (confirm(strings().confirmDeleteField || 'Remove this field?')) { $(this).closest('.ffc-field-row').fadeOut(300, function() { $(this).remove(); - updateFieldsJSON(); }); } }); - // Update JSON when fields change - $('#ffc-fields-container').on('change input', 'input, select, textarea', function() { - updateFieldsJSON(); + $container.on('change', '.ffc-field-type-selector', function() { + applyType($(this).closest('.ffc-field-row'), $(this).val()); }); - // Toggle info/embed vs standard rows when field type changes (JS-built rows) - $('#ffc-fields-container').on('change', '.ffc-field-type', function() { - var $row = $(this).closest('.ffc-field-row'); - var val = $(this).val(); - var isInfo = val === 'info'; - var isEmbed = val === 'embed'; - var isDisplayOnly = isInfo || isEmbed; - $row.find('.ffc-content-row').toggle(isInfo); - $row.find('.ffc-embed-row').toggle(isEmbed); - $row.find('.ffc-hidden-value-row').toggle(val === 'hidden'); - $row.find('.ffc-standard-row').toggle(!isDisplayOnly); - $row.find('.ffc-options-field').toggle(val === 'select' || val === 'radio' || val === 'checkbox'); + $container.on('click', '.ffc-choice-add', function(e) { + e.preventDefault(); + var $row = addChoice($(this).siblings('.ffc-choice-list'), ''); + if ($row) { + $row.find('.ffc-choice-input').trigger('focus'); + } }); - // Toggle info/embed vs standard rows when field type changes (PHP-rendered rows) - $('#ffc-fields-container').on('change', '.ffc-field-type-selector', function() { - var $row = $(this).closest('.ffc-field-row'); - var val = $(this).val(); - var isInfo = val === 'info'; - var isEmbed = val === 'embed'; - var isDisplayOnly = isInfo || isEmbed; - $row.find('.ffc-content-field').toggleClass('ffc-hidden', !isInfo); - $row.find('.ffc-embed-field').toggleClass('ffc-hidden', !isEmbed); - $row.find('.ffc-hidden-value-field').toggleClass('ffc-hidden', val !== 'hidden'); - $row.find('.ffc-standard-row').toggleClass('ffc-hidden', isDisplayOnly); - $row.find('.ffc-options-field').toggleClass('ffc-hidden', !(val === 'select' || val === 'radio' || val === 'checkbox')); + // The last row is emptied rather than removed, so there is always one + // to copy from. + $container.on('click', '.ffc-choice-remove', function(e) { + e.preventDefault(); + var $choice = $(this).closest('.ffc-choice-row'); + var $fieldRow = $choice.closest('.ffc-field-row'); + if ($choice.siblings('.ffc-choice-row').length) { + $choice.remove(); + } else { + $choice.find('.ffc-choice-input').val(''); + resetChoiceQuiz($choice); + } + checkMaxSelect($fieldRow); + }); + + // The visible box drives the aligned 0/1 the server reads. + $container.on('change', '.ffc-choice-correct-input', function() { + $(this).closest('.ffc-choice-row').find('.ffc-choice-correct-value').val(this.checked ? '1' : '0'); + checkMaxSelect($(this).closest('.ffc-field-row')); + }); + + $container.on('change', '.ffc-quiz-scored, .ffc-quiz-mode, .ffc-quiz-text', function() { + applyQuiz($(this).closest('.ffc-field-row')); + }); + + $container.on('input change', 'input[name$="[max_select]"]', function() { + checkMaxSelect($(this).closest('.ffc-field-row')); + }); + + $(document).off('change.ffcFieldBuilder'); + $(document).on('change.ffcFieldBuilder', '#ffc_quiz_enabled', refreshQuiz); + refreshQuiz(); + + // Enter in an option adds the next one instead of submitting the post. + $container.on('keydown', '.ffc-choice-input', function(e) { + if (e.key === 'Enter') { + e.preventDefault(); + var $next = addChoice($(this).closest('.ffc-choice-list'), ''); + if ($next) { + $next.insertAfter($(this).closest('.ffc-choice-row')); + $next.find('.ffc-choice-input').trigger('focus'); + } + } }); - // Make fields sortable if ($.fn.sortable) { - $('#ffc-fields-container').sortable({ + $container.sortable({ handle: '.ffc-sort-handle', - placeholder: 'ffc-field-placeholder', - update: function() { - updateFieldsJSON(); - } + placeholder: 'ffc-field-placeholder' }); } + makeChoicesSortable($container); } - // Show field type dropdown menu function showFieldTypeMenu($button) { - // Remove existing menu $('.ffc-field-type-menu').remove(); - // Create menu var $menu = $('
'); - var headerText = (typeof ffc_ajax !== 'undefined' && ffc_ajax.strings && ffc_ajax.strings.chooseFieldType) - ? ffc_ajax.strings.chooseFieldType - : 'Choose Field Type:'; - $menu.append('
' + headerText + '
'); + $menu.append($('
').text(strings().chooseFieldType || 'Choose Field Type:')); var $list = $('
    '); - fieldTypes.forEach(function(type) { - var $item = $('
  • ' + type.label + '
  • '); - $item.on('click', function() { + getFieldTypes().forEach(function(type) { + var $option = $('') + .attr('data-type', type.value) + .text(type.label); + $option.on('click', function() { addFieldToBuilder(type.value); $menu.remove(); }); - $list.append($item); + $list.append($('
  • ').append($option)); }); - $menu.append($list); - // Position menu below button var btnOffset = $button.offset(); - var btnHeight = $button.outerHeight(); - $menu.css({ position: 'absolute', - top: (btnOffset.top + btnHeight + 5) + 'px', - left: btnOffset.left + 'px', - zIndex: 99999, - background: '#fff', - border: '1px solid #ccc', - borderRadius: '4px', - boxShadow: '0 2px 8px rgba(0,0,0,0.15)', - minWidth: '200px' + top: (btnOffset.top + $button.outerHeight() + 5) + 'px', + left: btnOffset.left + 'px' }); $('body').append($menu); + $menu.find('.ffc-field-type-option').first().trigger('focus'); - // Close menu when clicking outside setTimeout(function() { $(document).one('click', function() { $menu.remove(); }); }, 100); - } - // Add field to builder + /** + * Append a row of the given type, copied from the template row. + * + * @return {jQuery|null} The new row, or null when the page has no template. + */ function addFieldToBuilder(fieldType) { - fieldCounter++; - - // Get localized strings with fallbacks - var strings = (typeof ffc_ajax !== 'undefined' && ffc_ajax.strings) ? ffc_ajax.strings : {}; - var removeText = strings.remove || 'Remove'; - var fieldTypeText = strings.fieldType || 'Field Type:'; - var labelText = strings.label || 'Label:'; - var fieldLabelPlaceholder = strings.fieldLabel || 'Field Label'; - var nameVariableText = strings.nameVariable || 'Name (variable):'; - var fieldNamePlaceholder = strings.fieldName || 'field_name'; - var requiredText = strings.required || 'Required:'; - var optionsText = strings.options || 'Options:'; - var separateWithCommasPlaceholder = strings.separateWithCommas || 'Separate with commas'; - var contentText = strings.content || 'Content:'; - var contentPlaceholder = strings.contentPlaceholder || 'Text to display. Supports , , .'; - var titleOptionalText = strings.titleOptional || 'Title (optional):'; - var embedUrlText = strings.embedUrl || 'Media URL:'; - var embedUrlPlaceholder = strings.embedUrlPlaceholder || 'https://www.youtube.com/watch?v=... or image URL'; - var captionOptionalText = strings.captionOptional || 'Caption (optional):'; - var hiddenValueText = strings.hiddenValue || 'Value submitted with every entry:'; - - var isInfo = fieldType === 'info'; - var isEmbed = fieldType === 'embed'; - var isDisplayOnly = isInfo || isEmbed; - - var fieldHtml = '
    '; - fieldHtml += '
    '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' ' + fieldType.toUpperCase() + ''; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += '
    '; - fieldHtml += '
    '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - - // Content row (info only) - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - - // Embed URL row (embed only) - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - - // Fixed value row (hidden only) - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - - // Label row (title for info, caption for embed, label for others) - fieldHtml += ' '; - var currentLabelText = isInfo ? titleOptionalText : (isEmbed ? captionOptionalText : labelText); - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - - // Name row (standard fields only) - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - - // Required row (standard fields only) — emit the same - // .ffc-toggle markup the PHP-rendered fields use so the new - // row looks native. The `.ffc-field-required` class stays on - // the inner because the field-builder serialiser at - // line ~285 below reads its state via that class selector. - var requiredId = 'ffc_field_required_' + fieldCounter; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - - // Additional options for select/radio/checkbox - if (fieldType === 'select' || fieldType === 'radio' || fieldType === 'checkbox') { - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += ' '; + var $template = $('.ffc-field-template .ffc-field-row').first(); + if (!$template.length) { + return null; } - fieldHtml += '
    '; - // Quiz points row (initially hidden, toggled by quiz checkbox) - var quizPointsText = strings.quizPoints || 'Points per option:'; - var quizPointsPlaceholder = strings.quizPointsPlaceholder || 'Ex: 0, 10, 0'; - var quizOn = typeof jQuery !== 'undefined' && jQuery('#ffc_quiz_enabled').is(':checked'); - fieldHtml += '
    '; - fieldHtml += ' '; - fieldHtml += ' '; - fieldHtml += '
    '; - fieldHtml += '
    '; - fieldHtml += '
    '; - fieldHtml += '
    '; + var index = String(nextIndex()); + fieldCounter = parseInt(index, 10) + 1; + + var $row = $template.clone(); + $row.attr('data-index', index); + $row.find('[name], [id], [for]').each(function() { + var el = this; + ['name', 'id', 'for'].forEach(function(attr) { + var v = el.getAttribute(attr); + if (v && v.indexOf('TEMPLATE') !== -1) { + el.setAttribute(attr, v.split('TEMPLATE').join(index)); + } + }); + }); - $('#ffc-fields-container').append(fieldHtml); - updateFieldsJSON(); + $('#ffc-fields-container').append($row); + $row.find('.ffc-field-type-selector').val(fieldType); + applyType($row, fieldType); + makeChoicesSortable($row); + $row.find('input[type="text"]').first().trigger('focus'); + return $row; } - // Update hidden JSON field with current fields - function updateFieldsJSON() { - var fields = []; - - $('#ffc-fields-container .ffc-field-row').each(function() { - var $row = $(this); - var field = { - type: $row.find('.ffc-field-type').val(), - label: $row.find('.ffc-field-label').val(), - name: $row.find('.ffc-field-name').val(), - required: $row.find('.ffc-field-required').is(':checked'), - options: $row.find('.ffc-field-options').val(), - content: $row.find('.ffc-field-content').val() || '', - embed_url: $row.find('.ffc-field-embed-url').val() || '', - default_value: $row.find('.ffc-field-default-value').val() || '', - points: $row.find('.ffc-field-points').val() || '' - }; - fields.push(field); - }); + /** + * Lock a row the way the server renders a required field (#1741): the + * name, the type and the required flag cannot change, and the row + * cannot be removed. Only the label stays editable. + */ + function lockRequiredRow($row, field) { + var index = String($row.attr('data-index')); + var lockId = 'ffc_field_lock_' + index; + var $select = $row.find('.ffc-field-type-selector'); + + $row.addClass('ffc-field-row-required-tag'); + $row.find('input[name$="[label]"]').first().val(field.label || field.name); + $row.find('input[name$="[name]"]').first().val(field.name).prop('readonly', true).attr('aria-describedby', lockId); + + // A disabled select posts nothing, so the type travels in a hidden input. + $select.removeAttr('name').prop('disabled', true).attr('aria-describedby', lockId); + $('').attr('name', 'ffc_fields[' + index + '][type]').val(field.type).insertBefore($select); + + $row.find('.ffc-field-required').prop('checked', true).prop('disabled', true); + $row.find('.ffc-remove-field').prop('disabled', true).attr('aria-describedby', lockId); + + var $badge = $('').attr('id', lockId); + $badge.append(' '); + $badge.append(document.createTextNode(strings().requiredField || 'Required field')); + $row.find('.ffc-field-title').after($badge); + } - // Find the JSON field (try different possible IDs/names) - var $jsonField = $('#ffc-form-fields-json'); - if (!$jsonField.length) { - $jsonField = $('input[name="ffc_form_fields"], textarea[name="ffc_form_fields"]'); + /** + * Add every required field the form lacks, locked, and drop the notice. + */ + function addRequiredFields($button) { + var fields; + try { + fields = JSON.parse(String($button.attr('data-ffc-required-fields') || '[]')); + } catch (err) { + fields = []; } - - if ($jsonField.length) { - $jsonField.val(JSON.stringify(fields)); - } else { - console.warn('[FFC] JSON field not found'); + if (!Array.isArray(fields)) { + return; } + fields.forEach(function(field) { + if (!field || !field.name) { + return; + } + var $row = addFieldToBuilder(field.type || 'text'); + if ($row) { + lockRequiredRow($row, field); + } + }); + $button.closest('.ffc-required-fields-missing').remove(); } - // ========================================================================== - // PUBLIC API - Export functions - // ========================================================================== + $(document).on('click', '.ffc-add-required-fields', function(e) { + e.preventDefault(); + addRequiredFields($(this)); + }); - // Initialize FFC.Admin namespace if not exists window.FFC = window.FFC || {}; window.FFC.Admin = window.FFC.Admin || {}; window.FFC.Admin.FieldBuilder = { init: initFormBuilder, addField: addFieldToBuilder, - updateJSON: updateFieldsJSON + applyType: applyType, + refreshQuiz: refreshQuiz, + addRequiredFields: addRequiredFields }; - // Register module - if (FFC.registerModule) { + if (FFC && FFC.registerModule) { FFC.registerModule('Admin.FieldBuilder', FFC.version); } diff --git a/assets/js/ffc-admin-field-builder.min.js b/assets/js/ffc-admin-field-builder.min.js index 7cafbb25c..aa1632314 100644 --- a/assets/js/ffc-admin-field-builder.min.js +++ b/assets/js/ffc-admin-field-builder.min.js @@ -1,2 +1,2 @@ -!function(e,f){"use strict";var l=0;var t=function(){if("undefined"!=typeof ffc_ajax&&Array.isArray(ffc_ajax.fieldTypes)&&ffc_ajax.fieldTypes.length)return ffc_ajax.fieldTypes;var e="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{};return[{value:"checkbox",label:e.checkbox||"Checkbox"},{value:"date",label:e.date||"Date"},{value:"select",label:e.dropdownSelect||"Dropdown Select"},{value:"email",label:e.email||"Email"},{value:"number",label:e.number||"Number"},{value:"radio",label:e.radioButtons||"Radio Buttons"},{value:"text",label:e.textField||"Text Field"},{value:"textarea",label:e.textarea||"Textarea"},{value:"embed",label:e.embedMedia||"Embed (Media)"},{value:"hidden",label:e.hiddenField||"Hidden Field"},{value:"info",label:e.infoBlock||"Info Block"}]}();function a(f){l++;var a="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{},d=a.remove||"Remove",n=a.fieldType||"Field Type:",o=a.label||"Label:",c=a.fieldLabel||"Field Label",s=a.nameVariable||"Name (variable):",r=a.fieldName||"field_name",u=a.required||"Required:",p=a.options||"Options:",h=a.separateWithCommas||"Separate with commas",b=a.content||"Content:",v=a.contentPlaceholder||"Text to display. Supports , ,
    .",m=a.titleOptional||"Title (optional):",x=a.embedUrl||"Media URL:",g=a.embedUrlPlaceholder||"https://www.youtube.com/watch?v=... or image URL",y=a.captionOptional||"Caption (optional):",w=a.hiddenValue||"Value submitted with every entry:",_="info"===f,F="embed"===f,j=_||F,k='
    ';k+='
    ',k+=' ',k+=' ',k+=' '+f.toUpperCase()+"",k+=" ",k+=' ",k+="
    ",k+='
    ',k+=' ',k+=" ",k+=" ",k+=' ",k+=" ",k+=' ",k+=" ",k+=' ',k+=" ",k+=' ",k+=" ",k+=' ',k+=" ",k+=' ",k+=" ",k+=' ',k+=" ",k+=" ",k+=" ",k+=' ',k+=" ",k+=' ",k+=" ",k+=' ',k+=" ";var C="ffc_field_required_"+l;if(k+=' ",k+=' ",k+=" ",k+=" ","select"===f||"radio"===f||"checkbox"===f){k+=" ",k+=" ",k+=' ",k+=" "}k+="
    ';var T=a.quizPoints||"Points per option:",q=a.quizPointsPlaceholder||"Ex: 0, 10, 0",S="undefined"!=typeof jQuery&&jQuery("#ffc_quiz_enabled").is(":checked");k+='
    ',k+=' ",k+=' ',k+="
    ",k+="
    ",k+="
    ",k+="
    ",e("#ffc-fields-container").append(k),i()}function i(){var f=[];e("#ffc-fields-container .ffc-field-row").each(function(){var l=e(this),t={type:l.find(".ffc-field-type").val(),label:l.find(".ffc-field-label").val(),name:l.find(".ffc-field-name").val(),required:l.find(".ffc-field-required").is(":checked"),options:l.find(".ffc-field-options").val(),content:l.find(".ffc-field-content").val()||"",embed_url:l.find(".ffc-field-embed-url").val()||"",default_value:l.find(".ffc-field-default-value").val()||"",points:l.find(".ffc-field-points").val()||""};f.push(t)});var l=e("#ffc-form-fields-json");l.length||(l=e('input[name="ffc_form_fields"], textarea[name="ffc_form_fields"]')),l.length?l.val(JSON.stringify(f)):console.warn("[FFC] JSON field not found")}window.FFC=window.FFC||{},window.FFC.Admin=window.FFC.Admin||{},window.FFC.Admin.FieldBuilder={init:function(){0!==e("#ffc-fields-container").length&&(l=e("#ffc-fields-container .ffc-field-row").length,e(document).on("click",".ffc-add-field",function(f){f.preventDefault(),function(f){e(".ffc-field-type-menu").remove();var l=e('
    '),i="undefined"!=typeof ffc_ajax&&ffc_ajax.strings&&ffc_ajax.strings.chooseFieldType?ffc_ajax.strings.chooseFieldType:"Choose Field Type:";l.append('
    '+i+"
    ");var d=e("
      ");t.forEach(function(f){var t=e('
    • '+f.label+"
    • ");t.on("click",function(){a(f.value),l.remove()}),d.append(t)}),l.append(d);var n=f.offset(),o=f.outerHeight();l.css({position:"absolute",top:n.top+o+5+"px",left:n.left+"px",zIndex:99999,background:"#fff",border:"1px solid #ccc",borderRadius:"4px",boxShadow:"0 2px 8px rgba(0,0,0,0.15)",minWidth:"200px"}),e("body").append(l),setTimeout(function(){e(document).one("click",function(){l.remove()})},100)}(e(this))}),e(document).on("click",".ffc-remove-field",function(f){f.preventDefault();var l="undefined"!=typeof ffc_ajax&&ffc_ajax.strings&&ffc_ajax.strings.confirmDeleteField?ffc_ajax.strings.confirmDeleteField:"Remove this field?";confirm(l)&&e(this).closest(".ffc-field-row").fadeOut(300,function(){e(this).remove(),i()})}),e("#ffc-fields-container").on("change input","input, select, textarea",function(){i()}),e("#ffc-fields-container").on("change",".ffc-field-type",function(){var f=e(this).closest(".ffc-field-row"),l=e(this).val(),t="info"===l,a="embed"===l,i=t||a;f.find(".ffc-content-row").toggle(t),f.find(".ffc-embed-row").toggle(a),f.find(".ffc-hidden-value-row").toggle("hidden"===l),f.find(".ffc-standard-row").toggle(!i),f.find(".ffc-options-field").toggle("select"===l||"radio"===l||"checkbox"===l)}),e("#ffc-fields-container").on("change",".ffc-field-type-selector",function(){var f=e(this).closest(".ffc-field-row"),l=e(this).val(),t="info"===l,a="embed"===l,i=t||a;f.find(".ffc-content-field").toggleClass("ffc-hidden",!t),f.find(".ffc-embed-field").toggleClass("ffc-hidden",!a),f.find(".ffc-hidden-value-field").toggleClass("ffc-hidden","hidden"!==l),f.find(".ffc-standard-row").toggleClass("ffc-hidden",i),f.find(".ffc-options-field").toggleClass("ffc-hidden",!("select"===l||"radio"===l||"checkbox"===l))}),e.fn.sortable&&e("#ffc-fields-container").sortable({handle:".ffc-sort-handle",placeholder:"ffc-field-placeholder",update:function(){i()}}))},addField:a,updateJSON:i},f.registerModule&&f.registerModule("Admin.FieldBuilder",f.version)}(jQuery,window.FFC); +!function(e,f){"use strict";var i=["select","radio","checkbox"],t=["text","textarea"],n=["number","date"],c=0;function d(){return"undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{}}function a(){return e("#ffc_quiz_enabled").is(":checked")}function l(f,t){var n="info"===t,c="embed"===t,d=-1!==i.indexOf(t);f.find(".ffc-content-field").toggleClass("ffc-hidden",!n),f.find(".ffc-embed-field").toggleClass("ffc-hidden",!c),f.find(".ffc-hidden-value-field").toggleClass("ffc-hidden","hidden"!==t),f.find(".ffc-standard-row").toggleClass("ffc-hidden",n||c),f.find(".ffc-options-field").toggleClass("ffc-hidden",!d),f.find("[data-ffc-types]").each(function(){var f=String(e(this).attr("data-ffc-types")).split(" ");e(this).toggleClass("ffc-hidden",-1===f.indexOf(t))}),f.find(".ffc-type-desc").text(function(e){return("undefined"!=typeof ffc_ajax&&ffc_ajax.fieldTypeDescriptions?ffc_ajax.fieldTypeDescriptions:{})[e]||""}(t)),o(f,t)}function o(f,c){c=c||String(f.find(".ffc-field-type-selector").val()||"");var d=f.find(".ffc-field-quiz"),l=-1!==String(d.attr("data-ffc-quiz-types")||"").split(" ").indexOf(c),o=a()&&l,s=o&&d.find(".ffc-quiz-scored").is(":checked"),u=-1!==i.indexOf(c),p=u?String(d.find(".ffc-quiz-mode").val()):"",h=-1!==t.indexOf(c)&&"none"===d.find(".ffc-quiz-text").val();d.toggleClass("ffc-hidden",!o),d.find(".ffc-field-quiz-body").toggleClass("ffc-hidden",!s),f.find(".ffc-choice-quiz").each(function(){e(this).toggleClass("ffc-hidden",!(s&&u&&e(this).attr("data-ffc-quiz-mode")===p))}),d.find(".ffc-quiz-points-setting").toggleClass("ffc-hidden",u&&"points"===p||h),d.find("[data-ffc-types]").each(function(){e(this).toggleClass("ffc-hidden",-1===String(e(this).attr("data-ffc-types")).split(" ").indexOf(c))}),d.find('[data-ffc-quiz-help="correct"]').toggleClass("ffc-hidden",!(u&&"correct"===p)),d.find('[data-ffc-quiz-help="points"]').toggleClass("ffc-hidden",!(u&&"points"===p)),d.find('[data-ffc-quiz-help="range"]').toggleClass("ffc-hidden",-1===n.indexOf(c)),d.find('[data-ffc-quiz-help="manual"]').toggleClass("ffc-hidden",!(-1!==t.indexOf(c)&&"manual"===d.find(".ffc-quiz-text").val())),r(f)}function r(e){var f=e.find('input[name$="[max_select]"]');if(f.length&&f[0].setCustomValidity){var i=String(e.find(".ffc-field-type-selector").val()||""),t=parseInt(f.val(),10),n=e.find(".ffc-choice-correct-value").filter(function(){return"1"===this.value}).length,c="";"checkbox"===i&&a()&&e.find(".ffc-quiz-scored").is(":checked")&&"correct"===e.find(".ffc-quiz-mode").val()&&t>0&&tf&&(f=i)}),Math.max(f+1,c)}function p(e,f){var i=e.children(".ffc-choice-row").first();if(!i.length)return null;var t=i.clone();return t.find(".ffc-choice-input").val(f||""),h(t),e.append(t),t}function h(e){e.find(".ffc-choice-correct-value").val("0"),e.find(".ffc-choice-correct-input").prop("checked",!1),e.find(".ffc-choice-points-input").val("")}function v(f){e.fn.sortable&&f.find(".ffc-choice-list").sortable({handle:".ffc-choice-handle",axis:"y"})}function g(f){var i=e(".ffc-field-template .ffc-field-row").first();if(!i.length)return null;var t=String(u());c=parseInt(t,10)+1;var n=i.clone();return n.attr("data-index",t),n.find("[name], [id], [for]").each(function(){var e=this;["name","id","for"].forEach(function(f){var i=e.getAttribute(f);i&&-1!==i.indexOf("TEMPLATE")&&e.setAttribute(f,i.split("TEMPLATE").join(t))})}),e("#ffc-fields-container").append(n),n.find(".ffc-field-type-selector").val(f),l(n,f),v(n),n.find('input[type="text"]').first().trigger("focus"),n}function m(f){var i;try{i=JSON.parse(String(f.attr("data-ffc-required-fields")||"[]"))}catch(e){i=[]}Array.isArray(i)&&(i.forEach(function(f){if(f&&f.name){var i=g(f.type||"text");i&&function(f,i){var t=String(f.attr("data-index")),n="ffc_field_lock_"+t,c=f.find(".ffc-field-type-selector");f.addClass("ffc-field-row-required-tag"),f.find('input[name$="[label]"]').first().val(i.label||i.name),f.find('input[name$="[name]"]').first().val(i.name).prop("readonly",!0).attr("aria-describedby",n),c.removeAttr("name").prop("disabled",!0).attr("aria-describedby",n),e('').attr("name","ffc_fields["+t+"][type]").val(i.type).insertBefore(c),f.find(".ffc-field-required").prop("checked",!0).prop("disabled",!0),f.find(".ffc-remove-field").prop("disabled",!0).attr("aria-describedby",n);var a=e('').attr("id",n);a.append(' '),a.append(document.createTextNode(d().requiredField||"Required field")),f.find(".ffc-field-title").after(a)}(i,f)}}),f.closest(".ffc-required-fields-missing").remove())}e(document).on("click",".ffc-add-required-fields",function(f){f.preventDefault(),m(e(this))}),window.FFC=window.FFC||{},window.FFC.Admin=window.FFC.Admin||{},window.FFC.Admin.FieldBuilder={init:function(){var f=e("#ffc-fields-container");0!==f.length&&(c=0,c=u(),e(document).off("click.ffcFieldBuilder"),e(document).on("click.ffcFieldBuilder",".ffc-add-field",function(f){f.preventDefault(),function(f){e(".ffc-field-type-menu").remove();var i=e('
      ');i.append(e('
      ').text(d().chooseFieldType||"Choose Field Type:"));var t=e("
        ");("undefined"!=typeof ffc_ajax&&Array.isArray(ffc_ajax.fieldTypes)&&ffc_ajax.fieldTypes.length?ffc_ajax.fieldTypes:[{value:"checkbox",label:"Checkbox"},{value:"date",label:"Date"},{value:"select",label:"Dropdown Select"},{value:"email",label:"Email"},{value:"number",label:"Number"},{value:"radio",label:"Radio Buttons"},{value:"text",label:"Text"},{value:"textarea",label:"Textarea"},{value:"embed",label:"Embed (Media)"},{value:"hidden",label:"Hidden Field"},{value:"info",label:"Info Block"}]).forEach(function(f){var n=e('').attr("data-type",f.value).text(f.label);n.on("click",function(){g(f.value),i.remove()}),t.append(e("
      • ").append(n))}),i.append(t);var n=f.offset();i.css({position:"absolute",top:n.top+f.outerHeight()+5+"px",left:n.left+"px"}),e("body").append(i),i.find(".ffc-field-type-option").first().trigger("focus"),setTimeout(function(){e(document).one("click",function(){i.remove()})},100)}(e(this))}),e(document).on("click.ffcFieldBuilder",".ffc-remove-field",function(f){f.preventDefault(),confirm(d().confirmDeleteField||"Remove this field?")&&e(this).closest(".ffc-field-row").fadeOut(300,function(){e(this).remove()})}),f.on("change",".ffc-field-type-selector",function(){l(e(this).closest(".ffc-field-row"),e(this).val())}),f.on("click",".ffc-choice-add",function(f){f.preventDefault();var i=p(e(this).siblings(".ffc-choice-list"),"");i&&i.find(".ffc-choice-input").trigger("focus")}),f.on("click",".ffc-choice-remove",function(f){f.preventDefault();var i=e(this).closest(".ffc-choice-row"),t=i.closest(".ffc-field-row");i.siblings(".ffc-choice-row").length?i.remove():(i.find(".ffc-choice-input").val(""),h(i)),r(t)}),f.on("change",".ffc-choice-correct-input",function(){e(this).closest(".ffc-choice-row").find(".ffc-choice-correct-value").val(this.checked?"1":"0"),r(e(this).closest(".ffc-field-row"))}),f.on("change",".ffc-quiz-scored, .ffc-quiz-mode, .ffc-quiz-text",function(){o(e(this).closest(".ffc-field-row"))}),f.on("input change",'input[name$="[max_select]"]',function(){r(e(this).closest(".ffc-field-row"))}),e(document).off("change.ffcFieldBuilder"),e(document).on("change.ffcFieldBuilder","#ffc_quiz_enabled",s),s(),f.on("keydown",".ffc-choice-input",function(f){if("Enter"===f.key){f.preventDefault();var i=p(e(this).closest(".ffc-choice-list"),"");i&&(i.insertAfter(e(this).closest(".ffc-choice-row")),i.find(".ffc-choice-input").trigger("focus"))}}),e.fn.sortable&&f.sortable({handle:".ffc-sort-handle",placeholder:"ffc-field-placeholder"}),v(f))},addField:g,applyType:l,refreshQuiz:s,addRequiredFields:m},f&&f.registerModule&&f.registerModule("Admin.FieldBuilder",f.version)}(jQuery,window.FFC); //# sourceMappingURL=ffc-admin-field-builder.min.js.map \ No newline at end of file diff --git a/assets/js/ffc-admin.js b/assets/js/ffc-admin.js index 76408be9a..84f144623 100644 --- a/assets/js/ffc-admin.js +++ b/assets/js/ffc-admin.js @@ -235,12 +235,8 @@ if (window.FFC && window.FFC.setRequiredWithin) { window.FFC.setRequiredWithin($('.ffc-quiz-setting'), on); } - $('.ffc-options-field').each(function() { - var $opts = $(this); - if (!$opts.hasClass('ffc-hidden')) { - $opts.find('.ffc-quiz-points').toggleClass('ffc-hidden', !on); - } - }); + // The per-field quiz settings belong to the field builder, + // which listens to the same toggle (#1730). } $('#ffc_quiz_enabled').on('change', function() { toggleQuizUI($(this).is(':checked')); diff --git a/assets/js/ffc-admin.min.js b/assets/js/ffc-admin.min.js index 2ac87b747..0b6ee1be1 100644 --- a/assets/js/ffc-admin.min.js +++ b/assets/js/ffc-admin.min.js @@ -1,2 +1,2 @@ -!function(e){"use strict";window.FFC=window.FFC||{},window.FFC.Admin=window.FFC.Admin||{},window.FFC.Admin.showNotification=function(n,t,i){t=t||"info",i=i||5e3,e(".ffc-admin-notification").remove();var r=("undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{}).dismiss||"Dismiss",s=e('

        '+n+'

        ");e(".wrap > h1").length?e(".wrap > h1").after(s):e("#wpbody-content").prepend(s),s.find(".notice-dismiss").on("click",function(){s.fadeOut(200,function(){e(this).remove()})}),i>0&&setTimeout(function(){s.fadeOut(200,function(){e(this).remove()})},i)},e(document).on("click","#ffc_btn_generate_codes",function(n){n.preventDefault();var t=e("#ffc_qty_codes").val();if(!t||isNaN(t)||t<1){var i="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{},r=i.enterValidNumber||"Please enter a valid number.";return e("#ffc_gen_status").text(r).css("color","red"),void e("#ffc_qty_codes").focus()}var s=e(this),o=e("#ffc_gen_status"),a=s.text(),f=(i="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{}).generating||"Generating...",c=i.generatingTickets||"Generating tickets...";s.prop("disabled",!0).text(f),o.text(c).css("color","#999");var d="undefined"!=typeof ffc_ajax?ffc_ajax.nonce:"";FFC.request("ffc_generate_codes",{qty:t},{nonce:d}).then(function(n){var i="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{},r=e("#ffc_generated_list");if(r.length){var f=r.val(),c=f?f+"\n"+n.codes:n.codes;r.val(c);var d=i.ticketsGeneratedSuccess||"tickets generated successfully!";o.text("✓ "+t+" "+d).css("color","green"),setTimeout(function(){o.text("")},5e3)}else{console.warn("[FFC] Generated codes field not found");var l=i.codesFieldNotFound||"Error: codes field not found";o.text("✗ "+l).css("color","red")}s.prop("disabled",!1).text(a)}).catch(function(e){var n="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{},t=e&&e.xhr,i="✗ ";if(e&&e.fromServer)i+=(n.error||"Error: ")+(e.message||"Unknown error");else if(t&&403===t.status)i+=n.permissionDenied||"Permission denied. Please reload the page.";else if(t&&400===t.status)i+=n.badRequest||"Bad request. Check console.";else{i+=(n.serverError||"Server error (Status: %d)").replace("%d",t?t.status:"?")}t&&console.error("[FFC] AJAX error:",t.status,t.statusText,t.responseText),o.text(i).css("color","red"),s.prop("disabled",!1).text(a)})}),e(document).on("click","#ffc-csv-export-btn",function(){var n=e(this),t="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{},i="undefined"!=typeof ffc_ajax?ffc_ajax.export_nonce:"";if(i){var r=n.data("form-ids")||[],s={status:n.data("status")||"publish"};r&&r.length&&(s.form_ids=r),window.FFCBatchedExport.run({type:"submissions",ajaxUrl:ajaxurl,nonce:i,button:n,overlay:!0,strings:{preparing:t.exportPreparing,exporting:t.exportProgress,downloading:t.exportDone,error:t.error,connectionError:t.connectionError},startData:s})}else alert(t.error||"Error: missing export nonce")}),e(document).ready(function(){e("#ffc-fields-container").length&&(window.FFC&&window.FFC.Admin&&window.FFC.Admin.FieldBuilder?window.FFC.Admin.FieldBuilder.init():console.warn("[FFC Admin] Field Builder module not loaded"))});var n=document.getElementById("ffc-filter-overlay");if(n){var t=document.getElementById("ffc-open-filter-overlay");t&&t.addEventListener("click",function(){n.style.display="flex"}),n.querySelectorAll(".ffc-filter-overlay-close, .ffc-filter-overlay-backdrop").forEach(function(e){e.addEventListener("click",function(){n.style.display="none"})}),n.addEventListener("click",function(e){e.target===n&&(n.style.display="none")})}if(e("#ffc_quiz_enabled").length){function i(n){e(".ffc-quiz-setting").toggleClass("ffc-hidden",!n),window.FFC&&window.FFC.setRequiredWithin&&window.FFC.setRequiredWithin(e(".ffc-quiz-setting"),n),e(".ffc-options-field").each(function(){var t=e(this);t.hasClass("ffc-hidden")||t.find(".ffc-quiz-points").toggleClass("ffc-hidden",!n)})}e("#ffc_quiz_enabled").on("change",function(){i(e(this).is(":checked"))}),i(e("#ffc_quiz_enabled").is(":checked"))}e(".ffc-collapsed-target").each(function(){var n=e(this),t=n.data("ffc-master"),i=n.data("ffc-master-value");if(t){var r=e("#"+t);r.length&&(r.on("change",s),r.is("select")&&r.on("input",s),s())}function s(){var e=null!=i&&""!==i?String(r.val())===String(i):r.is(":checked");n.toggleClass("ffc-collapsed",!e),n.attr("aria-hidden",e?"false":"true"),r.attr("aria-expanded",e?"true":"false"),window.FFC&&"function"==typeof window.FFC.setRequiredWithin&&window.FFC.setRequiredWithin(n,e)}})}(jQuery); +!function(e){"use strict";window.FFC=window.FFC||{},window.FFC.Admin=window.FFC.Admin||{},window.FFC.Admin.showNotification=function(n,t,i){t=t||"info",i=i||5e3,e(".ffc-admin-notification").remove();var r=("undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{}).dismiss||"Dismiss",s=e('

        '+n+'

        ");e(".wrap > h1").length?e(".wrap > h1").after(s):e("#wpbody-content").prepend(s),s.find(".notice-dismiss").on("click",function(){s.fadeOut(200,function(){e(this).remove()})}),i>0&&setTimeout(function(){s.fadeOut(200,function(){e(this).remove()})},i)},e(document).on("click","#ffc_btn_generate_codes",function(n){n.preventDefault();var t=e("#ffc_qty_codes").val();if(!t||isNaN(t)||t<1){var i="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{},r=i.enterValidNumber||"Please enter a valid number.";return e("#ffc_gen_status").text(r).css("color","red"),void e("#ffc_qty_codes").focus()}var s=e(this),o=e("#ffc_gen_status"),a=s.text(),c=(i="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{}).generating||"Generating...",f=i.generatingTickets||"Generating tickets...";s.prop("disabled",!0).text(c),o.text(f).css("color","#999");var d="undefined"!=typeof ffc_ajax?ffc_ajax.nonce:"";FFC.request("ffc_generate_codes",{qty:t},{nonce:d}).then(function(n){var i="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{},r=e("#ffc_generated_list");if(r.length){var c=r.val(),f=c?c+"\n"+n.codes:n.codes;r.val(f);var d=i.ticketsGeneratedSuccess||"tickets generated successfully!";o.text("✓ "+t+" "+d).css("color","green"),setTimeout(function(){o.text("")},5e3)}else{console.warn("[FFC] Generated codes field not found");var l=i.codesFieldNotFound||"Error: codes field not found";o.text("✗ "+l).css("color","red")}s.prop("disabled",!1).text(a)}).catch(function(e){var n="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{},t=e&&e.xhr,i="✗ ";if(e&&e.fromServer)i+=(n.error||"Error: ")+(e.message||"Unknown error");else if(t&&403===t.status)i+=n.permissionDenied||"Permission denied. Please reload the page.";else if(t&&400===t.status)i+=n.badRequest||"Bad request. Check console.";else{i+=(n.serverError||"Server error (Status: %d)").replace("%d",t?t.status:"?")}t&&console.error("[FFC] AJAX error:",t.status,t.statusText,t.responseText),o.text(i).css("color","red"),s.prop("disabled",!1).text(a)})}),e(document).on("click","#ffc-csv-export-btn",function(){var n=e(this),t="undefined"!=typeof ffc_ajax&&ffc_ajax.strings?ffc_ajax.strings:{},i="undefined"!=typeof ffc_ajax?ffc_ajax.export_nonce:"";if(i){var r=n.data("form-ids")||[],s={status:n.data("status")||"publish"};r&&r.length&&(s.form_ids=r),window.FFCBatchedExport.run({type:"submissions",ajaxUrl:ajaxurl,nonce:i,button:n,overlay:!0,strings:{preparing:t.exportPreparing,exporting:t.exportProgress,downloading:t.exportDone,error:t.error,connectionError:t.connectionError},startData:s})}else alert(t.error||"Error: missing export nonce")}),e(document).ready(function(){e("#ffc-fields-container").length&&(window.FFC&&window.FFC.Admin&&window.FFC.Admin.FieldBuilder?window.FFC.Admin.FieldBuilder.init():console.warn("[FFC Admin] Field Builder module not loaded"))});var n=document.getElementById("ffc-filter-overlay");if(n){var t=document.getElementById("ffc-open-filter-overlay");t&&t.addEventListener("click",function(){n.style.display="flex"}),n.querySelectorAll(".ffc-filter-overlay-close, .ffc-filter-overlay-backdrop").forEach(function(e){e.addEventListener("click",function(){n.style.display="none"})}),n.addEventListener("click",function(e){e.target===n&&(n.style.display="none")})}if(e("#ffc_quiz_enabled").length){function i(n){e(".ffc-quiz-setting").toggleClass("ffc-hidden",!n),window.FFC&&window.FFC.setRequiredWithin&&window.FFC.setRequiredWithin(e(".ffc-quiz-setting"),n)}e("#ffc_quiz_enabled").on("change",function(){i(e(this).is(":checked"))}),i(e("#ffc_quiz_enabled").is(":checked"))}e(".ffc-collapsed-target").each(function(){var n=e(this),t=n.data("ffc-master"),i=n.data("ffc-master-value");if(t){var r=e("#"+t);r.length&&(r.on("change",s),r.is("select")&&r.on("input",s),s())}function s(){var e=null!=i&&""!==i?String(r.val())===String(i):r.is(":checked");n.toggleClass("ffc-collapsed",!e),n.attr("aria-hidden",e?"false":"true"),r.attr("aria-expanded",e?"true":"false"),window.FFC&&"function"==typeof window.FFC.setRequiredWithin&&window.FFC.setRequiredWithin(n,e)}})}(jQuery); //# sourceMappingURL=ffc-admin.min.js.map \ No newline at end of file diff --git a/assets/js/ffc-cert-email-mode.js b/assets/js/ffc-cert-email-mode.js index 08a2401e6..3fe980d8e 100644 --- a/assets/js/ffc-cert-email-mode.js +++ b/assets/js/ffc-cert-email-mode.js @@ -1,7 +1,7 @@ /** * Per-form certificate email — Global/Custom toggle behaviour (#964). * - * The form editor's email metabox renders a `.ffc-toggle` (`#ffc_email_custom_mode`) + * The form editor's email metabox renders a `.ffc-control-toggle` (`#ffc_email_custom_mode`) * that chooses between the shared GLOBAL default text and a per-form CUSTOM copy. * The toggle is UI-only — the effective mode is re-derived server-side from the * stored subject/body on every load, so nothing here needs to be persisted: diff --git a/assets/js/ffc-certificate-settings.js b/assets/js/ffc-certificate-settings.js new file mode 100644 index 000000000..1dbcb0482 --- /dev/null +++ b/assets/js/ffc-certificate-settings.js @@ -0,0 +1,36 @@ +/** + * Settings → Certificates: the required-field table (#1741). + * + * Adds a row from the