diff --git a/.gitattributes b/.gitattributes index 229b7f1..bea4959 100644 --- a/.gitattributes +++ b/.gitattributes @@ -27,3 +27,4 @@ # Consistent line endings * text=auto eol=lf *.mo binary +*.woff2 binary diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 08d1381..0261223 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -94,6 +94,12 @@ jobs: cache: npm - run: npm ci - run: npm run format:check + - name: WireLayer CSS up to date + # assets/wirelayer/ is committed – it has to match the package version and the component list + run: | + npm run build:css + git diff --exit-code assets/wirelayer + test -z "$(git status --porcelain assets/wirelayer)" plugin-check: name: Plugin Check diff --git a/.prettierignore b/.prettierignore index 783b017..26bec0d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ db-data vendor dist languages +assets/wirelayer diff --git a/.wordpress-org/screenshot-1.png b/.wordpress-org/screenshot-1.png index 9c0ddaf..dd5c52f 100644 Binary files a/.wordpress-org/screenshot-1.png and b/.wordpress-org/screenshot-1.png differ diff --git a/.wordpress-org/screenshot-2.png b/.wordpress-org/screenshot-2.png index 7c1e18f..5fbcce7 100644 Binary files a/.wordpress-org/screenshot-2.png and b/.wordpress-org/screenshot-2.png differ diff --git a/.wordpress-org/screenshot-3.png b/.wordpress-org/screenshot-3.png index e8155db..5cb631f 100644 Binary files a/.wordpress-org/screenshot-3.png and b/.wordpress-org/screenshot-3.png differ diff --git a/.wordpress-org/screenshot-4.png b/.wordpress-org/screenshot-4.png index 746ec70..6cfc34c 100644 Binary files a/.wordpress-org/screenshot-4.png and b/.wordpress-org/screenshot-4.png differ diff --git a/.wordpress-org/screenshot-5.png b/.wordpress-org/screenshot-5.png index 04a2359..8f494f9 100644 Binary files a/.wordpress-org/screenshot-5.png and b/.wordpress-org/screenshot-5.png differ diff --git a/CLAUDE.md b/CLAUDE.md index 3d1533a..dc1251b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,8 @@ WordPress plugin, published on wordpress.org (slug `wirecore-disable-rest`) and - Static classes `WireCore_DR_*` in `includes/class-wirecore-dr-*.php`, no autoloader, no namespaces. Each class has an `init()` that registers its hooks. - Prefix everything global: functions/options/hooks/nonces `wirecore_dr_`, constants `WIRECORE_DR_`, CSS classes/IDs `wirecore-dr-`, text domain `wirecore-disable-rest`, WP-CLI command `wp wirecore-dr`. -- Admin pages in plain PHP with `admin-post.php` forms, nonces, `wp_safe_redirect()` plus a notice query arg. No build step for JS/CSS. +- Admin pages in plain PHP with `admin-post.php` forms, nonces, `wp_safe_redirect()` plus a notice query arg. No build step for JS; the only CSS build is `npm run build:css` (below). +- UI in the WireLayer corporate design: the markup uses the `.wc-*` classes of `@wirecore/wirelayer-css` (class reference: `node_modules/@wirecore/wirelayer-css/llms-full.txt`). `npm run build:css` writes the used components, scoped to `#wirecore-dr`, to `assets/wirelayer/` – committed, CI checks it is up to date. Add a component to the list in `package.json` before using its classes, and run the command again after updating the package. `wirecore-dr-*` classes are hooks for `admin.js` and page layout in `assets/admin.css` (scoped to `#wirecore-dr`, colors and spacing from WireLayer variables). Icons are inline Lucide SVGs (`WireCore_DR_Admin::icon()`). - Minimum versions: WordPress 5.8, PHP 7.4 (verified with PHPCompatibility and a WP 5.8/PHP 7.4 instance) – do not use newer functions without raising them. - Formatting with Prettier (tabs, single quotes). Plugin Check must stay free of errors and warnings; justified exceptions are marked with `phpcs:ignore`/`phpcs:disable` plus a comment explaining why. @@ -42,7 +43,7 @@ Only `wirecore-disable-rest.php`, `uninstall.php`, `index.php`, `readme.txt`, `L ## Checks -CI (`.github/workflows/ci.yml`) must stay green: PHP lint 7.4–8.4, `composer phpcs` (PHPCompatibilityWP, `phpcs.xml.dist`), PHPUnit on PHP 7.4 and 8.3, `npm run format:check`, Plugin Check in strict mode on the package built from `.distignore`. +CI (`.github/workflows/ci.yml`) must stay green: PHP lint 7.4–8.4, `composer phpcs` (PHPCompatibilityWP, `phpcs.xml.dist`), PHPUnit on PHP 7.4 and 8.3, `npm run format:check`, `assets/wirelayer/` up to date with `npm run build:css`, Plugin Check in strict mode on the package built from `.distignore`. Tests live in `tests/` (`test-*.php`, base class `WireCore_DR_TestCase`). They are integration tests against the WordPress test suite: dispatch requests through `rest_get_server()->dispatch()` (the bootstrap defines `REST_REQUEST`), and register fixture routes in `tests/bootstrap.php` – the route list is cached, so routes must exist before the first REST server is created. Run them inside the Docker container (see README) against the separate database `wordpress_test`. diff --git a/README.md b/README.md index b21ed7a..0593b60 100644 --- a/README.md +++ b/README.md @@ -64,13 +64,15 @@ Rules: `inherit`, `public`, `auth`, `admin`, `blocked` (`inherit` is not allowed ## Development -Requirements: Docker, Node.js (for Prettier). +Requirements: Docker, Node.js (for Prettier and the WireLayer CSS). ```bash docker compose up -d # WordPress on http://localhost:8092, phpMyAdmin on :8093 -npm install # Prettier with the PHP plugin +npm install # Prettier with the PHP plugin, @wirecore/wirelayer-css ``` +The settings page uses the [WireLayer](https://github.com/WireCore/WireLayer) components (`.wc-*` classes). `npm run build:css` writes the components listed in `package.json`, scoped to `#wirecore-dr`, with their fonts to `assets/wirelayer/`. The output is committed, so the plugin needs no build step; run the command again after adding a component or updating `@wirecore/wirelayer-css`. + WP-CLI is available in the container: ```bash diff --git a/assets/admin.css b/assets/admin.css index 73e5373..504684c 100644 --- a/assets/admin.css +++ b/assets/admin.css @@ -1,176 +1,213 @@ -.wirecore-dr .wirecore-dr-status { - margin: 16px 0; - padding: 8px 12px; - background: #fff; - border-left: 4px solid #2271b1; -} +/* + * Layout of the settings page. The components come from WireLayer + * (assets/wirelayer/wirelayer.css, scoped to #wirecore-dr); colors and + * spacing use its variables. + */ -.wirecore-dr .wirecore-dr-default label { - margin-right: 16px; +/* WordPress styles form controls and links by element (forms.css, common.css); + inside the page the WireLayer components style them */ +#wirecore-dr :is(a, button, input, select, textarea) { + box-shadow: none; + min-height: 0; + max-width: none; } -.wirecore-dr .wirecore-dr-presets .button { - margin-right: 4px; +#wirecore-dr select { + background-image: none; } -.wirecore-dr .wirecore-dr-toolbar { +#wirecore-dr { display: flex; - flex-wrap: wrap; - gap: 8px; - margin-bottom: 12px; + flex-direction: column; + gap: 20px; + max-width: 1200px; + margin-top: 12px; + background: transparent; + font-size: 14px; } -.wirecore-dr .wirecore-dr-toolbar input[type='search'] { - min-width: 280px; -} - -.wirecore-dr .wirecore-dr-namespace { - margin-bottom: 8px; - background: #fff; - border: 1px solid #c3c4c7; +#wirecore-dr .wirecore-dr-stack { + display: flex; + flex-direction: column; + gap: 16px; } -.wirecore-dr .wirecore-dr-namespace-head { +#wirecore-dr .wirecore-dr-row { display: flex; flex-wrap: wrap; align-items: center; - gap: 12px; - padding: 6px 10px; + gap: 8px 12px; } -.wirecore-dr .wirecore-dr-toggle { - display: flex; +/* A label in front of its control: "Read [select]" */ +#wirecore-dr .wirecore-dr-labeled { + display: inline-flex; align-items: center; - gap: 4px; - padding: 0; - background: none; - border: 0; - cursor: pointer; + gap: 8px; + color: var(--wc-muted); + font-size: 13px; + font-weight: 500; } -.wirecore-dr .wirecore-dr-toggle .dashicons { - transition: transform 0.15s; +#wirecore-dr .wirecore-dr-rule { + width: 10rem; } -.wirecore-dr .wirecore-dr-toggle[aria-expanded='true'] .dashicons { - transform: rotate(90deg); +#wirecore-dr .wirecore-dr-search { + width: 280px; } -.wirecore-dr .wirecore-dr-meta { - color: #646970; +#wirecore-dr .wirecore-dr-filter { + width: 12rem; } -.wirecore-dr .wirecore-dr-selects { - margin-left: auto; +/* Form fields in a card keep a readable width */ +#wirecore-dr .wc-card > .wc-field { + max-width: 40rem; } -.wirecore-dr .wirecore-dr-routes { - border-width: 1px 0 0; +#wirecore-dr .wc-card > .wirecore-dr-narrow { + max-width: 24rem; } -.wirecore-dr .wirecore-dr-routes code { - word-break: break-all; +#wirecore-dr input[type='file']::file-selector-button { + margin-inline-end: 10px; + padding: 4px 12px; + border: 1px solid var(--wc-line-strong); + border-radius: 999px; + background: var(--wc-bg); + color: var(--wc-fg); + font-weight: 600; + cursor: pointer; } -.wirecore-dr .wirecore-dr-badge { - display: inline-block; - margin: 2px 4px 2px 0; - padding: 1px 6px; - border-radius: 3px; - font-size: 12px; - white-space: nowrap; - background: #f0f0f1; +#wirecore-dr .wirecore-dr-checkbox-title { + display: block; + color: var(--wc-fg); + font-weight: 600; } -.wirecore-dr .wirecore-dr-badge-public { - background: #edfaef; - color: #00631a; +#wirecore-dr .wirecore-dr-list { + display: flex; + flex-direction: column; + gap: 8px; + padding-inline-start: 1.25rem; + list-style: disc; + line-height: 1.6; } -.wirecore-dr .wirecore-dr-badge-auth, -.wirecore-dr .wirecore-dr-badge-admin { - background: #fcf9e8; - color: #8a6d00; +#wirecore-dr .wirecore-dr-hint { + margin-inline-end: auto; + color: var(--wc-muted); + font-size: 13px; } -.wirecore-dr .wirecore-dr-badge-blocked { - background: #fcf0f1; - color: #8a2424; +/* Routes: one card per namespace, the routes as a table below its header */ +#wirecore-dr .wirecore-dr-namespaces { + gap: 10px; } -.wirecore-dr .wirecore-dr-orphans { - margin-top: 8px; +#wirecore-dr .wirecore-dr-namespace { + gap: 0; + padding: 0; +} + +#wirecore-dr .wirecore-dr-namespace-head { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 8px 12px; + padding: 10px 16px; } -.wirecore-dr .wirecore-dr-spinner { - float: none; - margin: 0 6px 0 0; +#wirecore-dr .wirecore-dr-toggle { + display: inline-flex; + align-items: center; + gap: 6px; + border-radius: var(--radius-sm); + cursor: pointer; } -.wirecore-dr .wirecore-dr-selects label { - margin-left: 8px; +#wirecore-dr .wirecore-dr-toggle:focus-visible { + outline: 2px solid var(--wc-fg); + outline-offset: 2px; } -.wirecore-dr .wirecore-dr-badge-ip { - background: #f0f6fc; - color: #0a4b78; +#wirecore-dr .wirecore-dr-toggle-icon { + width: 16px; + height: 16px; + color: var(--wc-muted); + transition: rotate 0.15s; } -.wirecore-dr .wirecore-dr-advanced-wrap { - margin-left: 8px; +#wirecore-dr + .wirecore-dr-toggle[aria-expanded='true'] + .wirecore-dr-toggle-icon { + rotate: 90deg; } -.wirecore-dr .wirecore-dr-access-summary .wirecore-dr-badge { - margin-left: 4px; +@media (prefers-reduced-motion: reduce) { + #wirecore-dr .wirecore-dr-toggle-icon { + transition: none; + } } -.wirecore-dr .wirecore-dr-dialog { - width: min(760px, 90vw); - padding: 16px 24px; - border: 1px solid #c3c4c7; - box-shadow: 0 4px 24px rgba(0, 0, 0, 0.2); +#wirecore-dr .wirecore-dr-meta { + color: var(--wc-muted); + font-size: 13px; } -.wirecore-dr .wirecore-dr-dialog::backdrop { - background: rgba(0, 0, 0, 0.4); +#wirecore-dr .wirecore-dr-selects { + display: flex; + flex-wrap: wrap; + gap: 8px 16px; + margin-inline-start: auto; } -.wirecore-dr .wirecore-dr-dialog h2 { - margin-top: 0; +#wirecore-dr .wirecore-dr-routes { + border-top: 1px solid var(--wc-line); } -.wirecore-dr .wirecore-dr-dialog-columns { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 16px; +#wirecore-dr .wirecore-dr-advanced-wrap, +#wirecore-dr .wirecore-dr-access-summary { + display: inline-flex; + flex-wrap: wrap; + align-items: center; + gap: 4px 6px; } -.wirecore-dr .wirecore-dr-dialog fieldset { - padding: 8px 12px; - border: 1px solid #dcdcde; +#wirecore-dr .wirecore-dr-route .wirecore-dr-advanced-wrap { + margin-inline-start: 6px; } -.wirecore-dr .wirecore-dr-dialog legend { - padding: 0 4px; - font-weight: 600; +#wirecore-dr .wirecore-dr-effective .wc-badge { + margin: 2px 4px 2px 0; } -.wirecore-dr .wirecore-dr-dialog textarea, -.wirecore-dr .wirecore-dr-dialog input[type='text'] { - display: block; - width: 100%; - margin: 4px 0 12px; +/* "Advanced" dialog */ +#wirecore-dr .wirecore-dr-columns { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; + margin-top: 8px; } -.wirecore-dr .wirecore-dr-dialog-label { - margin: 0 0 4px; +#wirecore-dr .wirecore-dr-columns > .wc-fieldset { + display: flex; + flex-direction: column; + gap: 12px; } -.wirecore-dr .wirecore-dr-role { - display: block; - margin-bottom: 2px; +#wirecore-dr #wirecore-dr-advanced .wc-dialog-content { + width: min(760px, calc(100vw - 2rem)); } -.wirecore-dr .wirecore-dr-dialog-actions { - margin-bottom: 0; +@media (max-width: 782px) { + #wirecore-dr .wirecore-dr-columns { + grid-template-columns: 1fr; + } + + #wirecore-dr .wirecore-dr-selects { + margin-inline-start: 0; + } } diff --git a/assets/admin.js b/assets/admin.js index e4e152a..55afe7c 100644 --- a/assets/admin.js +++ b/assets/admin.js @@ -13,6 +13,13 @@ const dialog = document.getElementById('wirecore-dr-advanced'); const ALLOW = ['ip_allow', 'users_allow', 'roles_allow']; const DENY = ['ip_deny', 'roles_deny']; + // WireLayer badge variant per rule + const VARIANTS = { + public: 'success', + auth: 'warn', + admin: 'warn', + blocked: 'danger', + }; let search, source, filter, expand, namespaces; let current = null; @@ -67,9 +74,9 @@ return { rule: select('default', '', group).value }; } - function badge(parent, className, text) { + function badge(parent, variant, text) { const el = document.createElement('span'); - el.className = 'wirecore-dr-badge ' + className; + el.className = 'wc-badge wc-badge-' + variant; el.textContent = text; parent.appendChild(el); } @@ -95,9 +102,7 @@ : values.length; badge( box, - DENY.includes(list) - ? 'wirecore-dr-badge-blocked' - : 'wirecore-dr-badge-ip', + DENY.includes(list) ? 'danger' : 'info', i18n.summary[list] + ': ' + text ); }); @@ -116,7 +121,7 @@ open = open || result.rule === 'public'; badge( cell, - 'wirecore-dr-badge-' + result.rule, + VARIANTS[result.rule], i18n[group] + ': ' + i18n.labels[result.rule] + @@ -129,18 +134,10 @@ const allow = count(own, ALLOW) + count(ns, ALLOW); const deny = count(own, DENY) + count(ns, DENY); if (allow) { - badge( - cell, - 'wirecore-dr-badge-ip', - i18n.summary.allow + ': ' + allow - ); + badge(cell, 'info', i18n.summary.allow + ': ' + allow); } if (deny) { - badge( - cell, - 'wirecore-dr-badge-blocked', - i18n.summary.deny + ': ' + deny - ); + badge(cell, 'danger', i18n.summary.deny + ': ' + deny); } row.dataset.open = open ? '1' : ''; row.dataset.override = @@ -359,7 +356,8 @@ fetch(i18n.url, { credentials: 'same-origin', - headers: { 'X-WP-Nonce': i18n.nonce }, + // Accept: application/json, otherwise WordPress ignores _locale=user + headers: { 'X-WP-Nonce': i18n.nonce, Accept: 'application/json' }, }) .then(function (response) { return response.json().then(function (data) { @@ -375,10 +373,14 @@ }) .catch(function (error) { body.innerHTML = ''; - const notice = document.createElement('div'); - notice.className = 'notice notice-error inline'; - notice.appendChild(document.createElement('p')).textContent = - i18n.loadError + ' ' + error.message; - body.appendChild(notice); + const alert = document.createElement('div'); + alert.className = 'wc-alert wc-alert-danger'; + alert.setAttribute('role', 'alert'); + const content = alert.appendChild(document.createElement('div')); + content.className = 'wc-alert-content'; + const text = content.appendChild(document.createElement('div')); + text.className = 'wc-alert-description'; + text.textContent = i18n.loadError + ' ' + error.message; + body.appendChild(alert); }); })(); diff --git a/assets/wirelayer/fonts/OFL.txt b/assets/wirelayer/fonts/OFL.txt new file mode 100644 index 0000000..b7df1b5 --- /dev/null +++ b/assets/wirelayer/fonts/OFL.txt @@ -0,0 +1,94 @@ +Copyright 2023 The Schibsted-Grotesk Project Authors (https://github.com/schibsted/schibsted-grotesk) SchibstedGrotesk-Italic[wght].ttf: Copyright 2023 The Schibsted-Grotesk Project Authors (https://github.com/schibsted/schibsted-grotesk) +Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono) JetBrainsMono-Italic[wght].ttf: Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/wirelayer/fonts/jetbrains-mono-cyrillic-ext-wght-normal.woff2 b/assets/wirelayer/fonts/jetbrains-mono-cyrillic-ext-wght-normal.woff2 new file mode 100644 index 0000000..8d83f99 Binary files /dev/null and b/assets/wirelayer/fonts/jetbrains-mono-cyrillic-ext-wght-normal.woff2 differ diff --git a/assets/wirelayer/fonts/jetbrains-mono-cyrillic-wght-normal.woff2 b/assets/wirelayer/fonts/jetbrains-mono-cyrillic-wght-normal.woff2 new file mode 100644 index 0000000..8ee2d70 Binary files /dev/null and b/assets/wirelayer/fonts/jetbrains-mono-cyrillic-wght-normal.woff2 differ diff --git a/assets/wirelayer/fonts/jetbrains-mono-greek-wght-normal.woff2 b/assets/wirelayer/fonts/jetbrains-mono-greek-wght-normal.woff2 new file mode 100644 index 0000000..6084d39 Binary files /dev/null and b/assets/wirelayer/fonts/jetbrains-mono-greek-wght-normal.woff2 differ diff --git a/assets/wirelayer/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 b/assets/wirelayer/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 new file mode 100644 index 0000000..01769d9 Binary files /dev/null and b/assets/wirelayer/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 differ diff --git a/assets/wirelayer/fonts/jetbrains-mono-latin-wght-normal.woff2 b/assets/wirelayer/fonts/jetbrains-mono-latin-wght-normal.woff2 new file mode 100644 index 0000000..cd5102a Binary files /dev/null and b/assets/wirelayer/fonts/jetbrains-mono-latin-wght-normal.woff2 differ diff --git a/assets/wirelayer/fonts/jetbrains-mono-vietnamese-wght-normal.woff2 b/assets/wirelayer/fonts/jetbrains-mono-vietnamese-wght-normal.woff2 new file mode 100644 index 0000000..b6a3fa1 Binary files /dev/null and b/assets/wirelayer/fonts/jetbrains-mono-vietnamese-wght-normal.woff2 differ diff --git a/assets/wirelayer/fonts/schibsted-grotesk-latin-ext-wght-normal.woff2 b/assets/wirelayer/fonts/schibsted-grotesk-latin-ext-wght-normal.woff2 new file mode 100644 index 0000000..041da55 Binary files /dev/null and b/assets/wirelayer/fonts/schibsted-grotesk-latin-ext-wght-normal.woff2 differ diff --git a/assets/wirelayer/fonts/schibsted-grotesk-latin-wght-normal.woff2 b/assets/wirelayer/fonts/schibsted-grotesk-latin-wght-normal.woff2 new file mode 100644 index 0000000..ea0f36f Binary files /dev/null and b/assets/wirelayer/fonts/schibsted-grotesk-latin-wght-normal.woff2 differ diff --git a/assets/wirelayer/wirelayer.css b/assets/wirelayer/wirelayer.css new file mode 100644 index 0000000..6145fbc --- /dev/null +++ b/assets/wirelayer/wirelayer.css @@ -0,0 +1,25 @@ +/*! @wirecore/wirelayer-css – generated from @wirecore/wirelayer-recipes | MIT License */ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ +@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){:is(#wirecore-dr,#wirecore-dr *),:is(#wirecore-dr,#wirecore-dr *):before,:is(#wirecore-dr,#wirecore-dr *):after,:is(#wirecore-dr,#wirecore-dr *)::backdrop{--tw-border-style:solid;--tw-font-weight:initial;--tw-outline-style:solid;--tw-leading:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-tracking:initial;--tw-content:"";--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-duration:initial;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-space-x-reverse:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial;--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-divide-y-reverse:0;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial}}#wirecore-dr,#wirecore-dr{--font-sans:"Schibsted Grotesk Variable", "Schibsted Grotesk", ui-sans-serif, system-ui, sans-serif;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Schibsted Grotesk Variable", "Schibsted Grotesk", ui-sans-serif, system-ui, sans-serif;--default-mono-font-family:"JetBrains Mono Variable", "JetBrains Mono", ui-monospace, monospace;--color-card:var(--wc-card);--color-fg:var(--wc-fg);--color-line:var(--wc-line);--color-line-2:var(--wc-line-2);--color-success:var(--wc-success);--color-warn:var(--wc-warn);--color-danger:var(--wc-danger);--color-info:var(--wc-info);--color-primary:var(--wc-primary);--animate-status-pulse:status-pulse 1.6s ease-in-out infinite;--animate-fade-in:wc-fade-in .15s ease-out;--animate-fade-out:wc-fade-out .12s ease-in forwards;--animate-pop-in:wc-pop-in .16s cubic-bezier(.16, 1, .3, 1);--animate-pop-out:wc-pop-out .11s ease-in forwards;--animate-dialog-in:wc-dialog-in .22s cubic-bezier(.16, 1, .3, 1);--animate-dialog-out:wc-dialog-out .14s ease-in forwards;--animate-collapse-in:wc-collapse-in .2s ease-out;--animate-collapse-out:wc-collapse-out .16s ease-in forwards;--animate-slide-in:wc-slide-in .26s cubic-bezier(.16, 1, .3, 1);--animate-slide-out:wc-slide-out .18s ease-in forwards;--animate-progress-stripes:wc-progress-stripes 1s linear infinite}:is(#wirecore-dr,#wirecore-dr *),:is(#wirecore-dr,#wirecore-dr *):after,:is(#wirecore-dr,#wirecore-dr *):before,:is(#wirecore-dr,#wirecore-dr *)::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}:is(#wirecore-dr,#wirecore-dr *)::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}#wirecore-dr,#wirecore-dr{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr:is(#wirecore-dr,#wirecore-dr *){height:0;color:inherit;border-top-width:1px}abbr:where([title]):is(#wirecore-dr,#wirecore-dr *){text-decoration:underline dotted}h1:is(#wirecore-dr,#wirecore-dr *),h2:is(#wirecore-dr,#wirecore-dr *),h3:is(#wirecore-dr,#wirecore-dr *),h4:is(#wirecore-dr,#wirecore-dr *),h5:is(#wirecore-dr,#wirecore-dr *),h6:is(#wirecore-dr,#wirecore-dr *){font-size:inherit;font-weight:inherit}a:is(#wirecore-dr,#wirecore-dr *){color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b:is(#wirecore-dr,#wirecore-dr *),strong:is(#wirecore-dr,#wirecore-dr *){font-weight:bolder}code:is(#wirecore-dr,#wirecore-dr *),kbd:is(#wirecore-dr,#wirecore-dr *),samp:is(#wirecore-dr,#wirecore-dr *),pre:is(#wirecore-dr,#wirecore-dr *){font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small:is(#wirecore-dr,#wirecore-dr *){font-size:80%}sub:is(#wirecore-dr,#wirecore-dr *),sup:is(#wirecore-dr,#wirecore-dr *){vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub:is(#wirecore-dr,#wirecore-dr *){bottom:-.25em}sup:is(#wirecore-dr,#wirecore-dr *){top:-.5em}table:is(#wirecore-dr,#wirecore-dr *){text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)):is(#wirecore-dr,#wirecore-dr *){outline:auto}progress:is(#wirecore-dr,#wirecore-dr *){vertical-align:baseline}summary:is(#wirecore-dr,#wirecore-dr *){display:list-item}ol:is(#wirecore-dr,#wirecore-dr *),ul:is(#wirecore-dr,#wirecore-dr *),menu:is(#wirecore-dr,#wirecore-dr *){list-style:none}img:is(#wirecore-dr,#wirecore-dr *),svg:is(#wirecore-dr,#wirecore-dr *),video:is(#wirecore-dr,#wirecore-dr *),canvas:is(#wirecore-dr,#wirecore-dr *),audio:is(#wirecore-dr,#wirecore-dr *),iframe:is(#wirecore-dr,#wirecore-dr *),embed:is(#wirecore-dr,#wirecore-dr *),object:is(#wirecore-dr,#wirecore-dr *){vertical-align:middle;display:block}img:is(#wirecore-dr,#wirecore-dr *),video:is(#wirecore-dr,#wirecore-dr *){max-width:100%;height:auto}button:is(#wirecore-dr,#wirecore-dr *),input:is(#wirecore-dr,#wirecore-dr *),select:is(#wirecore-dr,#wirecore-dr *),optgroup:is(#wirecore-dr,#wirecore-dr *),textarea:is(#wirecore-dr,#wirecore-dr *){font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:is(#wirecore-dr,#wirecore-dr *)::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup:is(#wirecore-dr,#wirecore-dr *){font-weight:bolder}:where(select:is([multiple],[size])) optgroup option:is(#wirecore-dr,#wirecore-dr *){padding-inline-start:20px}:is(#wirecore-dr,#wirecore-dr *)::file-selector-button{margin-inline-end:4px}:is(#wirecore-dr,#wirecore-dr *)::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){:is(#wirecore-dr,#wirecore-dr *)::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){:is(#wirecore-dr,#wirecore-dr *)::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea:is(#wirecore-dr,#wirecore-dr *){resize:vertical}:is(#wirecore-dr,#wirecore-dr *)::-webkit-search-decoration{-webkit-appearance:none}:is(#wirecore-dr,#wirecore-dr *)::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit{display:inline-flex}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit-fields-wrapper{padding:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit{padding-block:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit-year-field{padding-block:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit-month-field{padding-block:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit-day-field{padding-block:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit-hour-field{padding-block:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit-minute-field{padding-block:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit-second-field{padding-block:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit-millisecond-field{padding-block:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-datetime-edit-meridiem-field{padding-block:0}:is(#wirecore-dr,#wirecore-dr *)::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid:is(#wirecore-dr,#wirecore-dr *){box-shadow:none}button:is(#wirecore-dr,#wirecore-dr *),input:where([type=button],[type=reset],[type=submit]):is(#wirecore-dr,#wirecore-dr *){appearance:button}:is(#wirecore-dr,#wirecore-dr *)::file-selector-button{appearance:button}:is(#wirecore-dr,#wirecore-dr *)::-webkit-inner-spin-button{height:auto}:is(#wirecore-dr,#wirecore-dr *)::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])):is(#wirecore-dr,#wirecore-dr *){display:none!important}#wirecore-dr{background-color:var(--wc-bg);color:var(--wc-fg);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wirecore-dr,[data-mode=light]:is(#wirecore-dr,#wirecore-dr *){color-scheme:light;--wc-bg:#fff;--wc-bg-2:#f6f6f6;--wc-card:#fff;--wc-fg:#0a0a0a;--wc-muted:#666;--wc-line:#00000014;--wc-line-2:#00000029;--wc-line-strong:#0000006e;--wc-glow:#0000000b;--wc-success:oklch(47% .13 155);--wc-warn:oklch(50.5% .14 70);--wc-danger:oklch(51.5% .19 25);--wc-info:oklch(50% .12 245);--wc-on-success:#fff;--wc-on-danger:#fff;--wc-on-info:#fff;--wc-on-warn:#fff;--wc-primary:#0a0a0a;--wc-on-primary:#fff}@media (prefers-color-scheme:dark){#wirecore-dr:where(:not([data-mode])){color-scheme:dark;--wc-bg:#050505;--wc-bg-2:#0a0a0a;--wc-card:#0c0c0c;--wc-fg:#f4f4f4;--wc-muted:#8f8f8f;--wc-line:#ffffff17;--wc-line-2:#ffffff2e;--wc-line-strong:#ffffff59;--wc-glow:#ffffff12;--wc-success:oklch(78% .14 155);--wc-warn:oklch(84% .14 80);--wc-danger:oklch(70% .18 25);--wc-info:oklch(76% .11 245);--wc-on-success:#050505;--wc-on-danger:#050505;--wc-on-info:#050505;--wc-on-warn:#050505;--wc-primary:#f4f4f4;--wc-on-primary:#050505}}[data-mode=dark]:is(#wirecore-dr,#wirecore-dr *){color-scheme:dark;--wc-bg:#050505;--wc-bg-2:#0a0a0a;--wc-card:#0c0c0c;--wc-fg:#f4f4f4;--wc-muted:#8f8f8f;--wc-line:#ffffff17;--wc-line-2:#ffffff2e;--wc-line-strong:#ffffff59;--wc-glow:#ffffff12;--wc-success:oklch(78% .14 155);--wc-warn:oklch(84% .14 80);--wc-danger:oklch(70% .18 25);--wc-info:oklch(76% .11 245);--wc-on-success:#050505;--wc-on-danger:#050505;--wc-on-info:#050505;--wc-on-warn:#050505;--wc-primary:#f4f4f4;--wc-on-primary:#050505}[data-theme=ocean]:is(#wirecore-dr,#wirecore-dr *),[data-theme=ocean] [data-mode=light]:is(#wirecore-dr,#wirecore-dr *){--wc-primary:oklch(48% .17 255);--wc-on-primary:#fff}[data-theme=ocean][data-mode=dark]:is(#wirecore-dr,#wirecore-dr *),[data-theme=ocean] [data-mode=dark]:is(#wirecore-dr,#wirecore-dr *),[data-mode=dark] [data-theme=ocean]:is(#wirecore-dr,#wirecore-dr *){--wc-primary:oklch(72% .13 250);--wc-on-primary:#050505}@media (prefers-color-scheme:dark){#wirecore-dr:not([data-mode])[data-theme=ocean],#wirecore-dr:not([data-mode]) [data-theme=ocean]:not([data-mode],[data-mode=light] *){--wc-primary:oklch(72% .13 250);--wc-on-primary:#050505}}[data-theme=violet]:is(#wirecore-dr,#wirecore-dr *),[data-theme=violet] [data-mode=light]:is(#wirecore-dr,#wirecore-dr *){--wc-primary:oklch(49% .2 295);--wc-on-primary:#fff}[data-theme=violet][data-mode=dark]:is(#wirecore-dr,#wirecore-dr *),[data-theme=violet] [data-mode=dark]:is(#wirecore-dr,#wirecore-dr *),[data-mode=dark] [data-theme=violet]:is(#wirecore-dr,#wirecore-dr *){--wc-primary:oklch(74% .15 295);--wc-on-primary:#050505}@media (prefers-color-scheme:dark){#wirecore-dr:not([data-mode])[data-theme=violet],#wirecore-dr:not([data-mode]) [data-theme=violet]:not([data-mode],[data-mode=light] *){--wc-primary:oklch(74% .15 295);--wc-on-primary:#050505}}[data-theme=teal]:is(#wirecore-dr,#wirecore-dr *),[data-theme=teal] [data-mode=light]:is(#wirecore-dr,#wirecore-dr *){--wc-primary:oklch(45% .1 190);--wc-on-primary:#fff}[data-theme=teal][data-mode=dark]:is(#wirecore-dr,#wirecore-dr *),[data-theme=teal] [data-mode=dark]:is(#wirecore-dr,#wirecore-dr *),[data-mode=dark] [data-theme=teal]:is(#wirecore-dr,#wirecore-dr *){--wc-primary:oklch(76% .11 190);--wc-on-primary:#050505}@media (prefers-color-scheme:dark){#wirecore-dr:not([data-mode])[data-theme=teal],#wirecore-dr:not([data-mode]) [data-theme=teal]:not([data-mode],[data-mode=light] *){--wc-primary:oklch(76% .11 190);--wc-on-primary:#050505}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-duration{syntax:"*";inherits:false}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-border-spacing-x{syntax:"";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"";inherits:false;initial-value:0}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes status-pulse{50%{opacity:.35}}@keyframes wc-fade-in{0%{opacity:0}}@keyframes wc-fade-out{to{opacity:0}}@keyframes wc-pop-in{0%{opacity:0;transform:translate(var(--wc-pop-x,0), var(--wc-pop-y,0)) scale(.96)}}@keyframes wc-pop-out{to{opacity:0;transform:translate(var(--wc-pop-x,0), var(--wc-pop-y,0)) scale(.96)}}@keyframes wc-dialog-in{0%{opacity:0;transform:translateY(8px)scale(.96)}}@keyframes wc-dialog-out{to{opacity:0;transform:translateY(4px)scale(.98)}}@keyframes wc-collapse-in{0%{height:0}to{height:var(--height)}}@keyframes wc-collapse-out{0%{height:var(--height)}to{height:0}}@keyframes wc-slide-in{0%{translate:var(--wc-slide-x,0) var(--wc-slide-y,0)}}@keyframes wc-slide-out{to{translate:var(--wc-slide-x,0) var(--wc-slide-y,0)}}@keyframes wc-progress-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes wc-marquee-x{to{transform:translateX(var(--marquee-translate))}}@keyframes wc-marquee-y{to{transform:translateY(var(--marquee-translate))}}@keyframes wc-toast-progress{0%{scale:1}to{scale:0 1}} +/*! Schibsted Grotesk, JetBrains Mono | SIL Open Font License 1.1 | fonts/OFL.txt */ +@font-face{font-family:Schibsted Grotesk Variable;font-style:normal;font-display:swap;font-weight:400 900;src:url(./fonts/schibsted-grotesk-latin-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Schibsted Grotesk Variable;font-style:normal;font-display:swap;font-weight:400 900;src:url(./fonts/schibsted-grotesk-latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./fonts/jetbrains-mono-cyrillic-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./fonts/jetbrains-mono-cyrillic-wght-normal.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./fonts/jetbrains-mono-greek-wght-normal.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./fonts/jetbrains-mono-vietnamese-wght-normal.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./fonts/jetbrains-mono-latin-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(./fonts/jetbrains-mono-latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD} +#wirecore-dr .wc-alert{align-items:flex-start;gap:calc(var(--spacing) * 3);border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-2);background-color:var(--wc-card);padding-block:calc(var(--spacing) * 3);grid-template-columns:auto minmax(0,1fr) auto;padding-inline-start:calc(var(--spacing) * 3.5);padding-inline-end:calc(var(--spacing) * 3);display:grid}#wirecore-dr .wc-alert-icon-box{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7);border-radius:var(--radius-lg);justify-content:center;align-items:center;display:flex}#wirecore-dr .wc-alert-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}#wirecore-dr .wc-alert-content{gap:calc(var(--spacing) * .5);flex-direction:column;padding-top:3px;display:flex}#wirecore-dr .wc-alert-title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}#wirecore-dr .wc-alert-description{--tw-leading:var(--leading-normal);font-size:13px;line-height:var(--leading-normal);color:var(--wc-muted)}#wirecore-dr .wc-alert-dismiss{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7);cursor:pointer;color:var(--wc-muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:3.40282e38px;justify-content:center;align-items:center;display:flex}@media (hover:hover){#wirecore-dr .wc-alert-dismiss:hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr .wc-alert-dismiss:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-alert-dismiss{transition-property:none}}#wirecore-dr .wc-alert-dismiss-icon{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-alert-icon-box:is(.wc-alert-neutral,.wc-alert-neutral *){background-color:var(--wc-line);color:var(--wc-fg)}#wirecore-dr .wc-alert-icon-box:is(.wc-alert-success,.wc-alert-success *){background-color:var(--wc-success)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-alert-icon-box:is(.wc-alert-success,.wc-alert-success *){background-color:color-mix(in oklab, var(--wc-success) 14%, transparent)}}#wirecore-dr .wc-alert-icon-box:is(.wc-alert-success,.wc-alert-success *){color:var(--wc-success)}#wirecore-dr .wc-alert-icon-box:not(.wc-alert-neutral,.wc-alert-neutral *,.wc-alert-success,.wc-alert-success *,.wc-alert-warn,.wc-alert-warn *,.wc-alert-danger,.wc-alert-danger *){background-color:var(--wc-info)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-alert-icon-box:not(.wc-alert-neutral,.wc-alert-neutral *,.wc-alert-success,.wc-alert-success *,.wc-alert-warn,.wc-alert-warn *,.wc-alert-danger,.wc-alert-danger *){background-color:color-mix(in oklab, var(--wc-info) 14%, transparent)}}#wirecore-dr .wc-alert-icon-box:not(.wc-alert-neutral,.wc-alert-neutral *,.wc-alert-success,.wc-alert-success *,.wc-alert-warn,.wc-alert-warn *,.wc-alert-danger,.wc-alert-danger *){color:var(--wc-info)}#wirecore-dr .wc-alert-icon-box:is(.wc-alert-warn,.wc-alert-warn *){background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-alert-icon-box:is(.wc-alert-warn,.wc-alert-warn *){background-color:color-mix(in oklab, var(--wc-warn) 14%, transparent)}}#wirecore-dr .wc-alert-icon-box:is(.wc-alert-warn,.wc-alert-warn *){color:var(--wc-warn)}#wirecore-dr .wc-alert-icon-box:is(.wc-alert-danger,.wc-alert-danger *){background-color:var(--wc-danger)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-alert-icon-box:is(.wc-alert-danger,.wc-alert-danger *){background-color:color-mix(in oklab, var(--wc-danger) 14%, transparent)}}#wirecore-dr .wc-alert-icon-box:is(.wc-alert-danger,.wc-alert-danger *){color:var(--wc-danger)}#wirecore-dr .wc-alert:is(.wc-alert-simple,.wc-alert-simple *){gap:calc(var(--spacing) * 1.5);border-style:var(--tw-border-style);background-color:#0000;border-width:0;border-radius:0;padding:0}#wirecore-dr .wc-alert-icon-box:is(.wc-alert-simple,.wc-alert-simple *){width:auto;height:auto;padding-top:calc(var(--spacing) * .5);background-color:#0000;border-radius:0}#wirecore-dr .wc-alert-content:is(.wc-alert-simple,.wc-alert-simple *){padding-top:0}#wirecore-dr .wc-alert-title:is(.wc-alert-simple,.wc-alert-simple *){--tw-font-weight:var(--font-weight-medium);font-size:13px;font-weight:var(--font-weight-medium)}#wirecore-dr .wc-alert-description:is(.wc-alert-simple,.wc-alert-simple *){font-size:13px}#wirecore-dr .wc-alert-dismiss:is(.wc-alert-simple,.wc-alert-simple *){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}#wirecore-dr .wc-alert:is(.wc-alert-sm,.wc-alert-sm *){gap:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 2);padding-inline-start:calc(var(--spacing) * 2.5);padding-inline-end:calc(var(--spacing) * 2)}#wirecore-dr .wc-alert-icon-box:is(.wc-alert-sm,.wc-alert-sm *){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);border-radius:var(--radius-md)}#wirecore-dr .wc-alert-icon:is(.wc-alert-sm,.wc-alert-sm *){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-alert-content:is(.wc-alert-sm,.wc-alert-sm *){padding-top:2px}#wirecore-dr .wc-alert-title:is(.wc-alert-sm,.wc-alert-sm *){font-size:13px}#wirecore-dr .wc-alert-description:is(.wc-alert-sm,.wc-alert-sm *){font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}#wirecore-dr .wc-alert-dismiss:is(.wc-alert-sm,.wc-alert-sm *){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}#wirecore-dr .wc-alert:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-neutral,.wc-alert-neutral *){color:var(--wc-muted)}#wirecore-dr .wc-alert-title:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-neutral,.wc-alert-neutral *){color:var(--wc-fg)}#wirecore-dr .wc-alert:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-success,.wc-alert-success *),#wirecore-dr .wc-alert-description:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-success,.wc-alert-success *){color:var(--wc-success)}#wirecore-dr .wc-alert:is(.wc-alert-simple,.wc-alert-simple *):not(.wc-alert-neutral,.wc-alert-neutral *,.wc-alert-success,.wc-alert-success *,.wc-alert-warn,.wc-alert-warn *,.wc-alert-danger,.wc-alert-danger *),#wirecore-dr .wc-alert-description:is(.wc-alert-simple,.wc-alert-simple *):not(.wc-alert-neutral,.wc-alert-neutral *,.wc-alert-success,.wc-alert-success *,.wc-alert-warn,.wc-alert-warn *,.wc-alert-danger,.wc-alert-danger *){color:var(--wc-info)}#wirecore-dr .wc-alert:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-warn,.wc-alert-warn *),#wirecore-dr .wc-alert-description:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-warn,.wc-alert-warn *){color:var(--wc-warn)}#wirecore-dr .wc-alert:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-danger,.wc-alert-danger *),#wirecore-dr .wc-alert-description:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-danger,.wc-alert-danger *){color:var(--wc-danger)}#wirecore-dr .wc-alert:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-sm,.wc-alert-sm *){padding:0}#wirecore-dr .wc-alert-title:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-sm,.wc-alert-sm *){font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}#wirecore-dr .wc-alert-description:is(.wc-alert-simple,.wc-alert-simple *):is(.wc-alert-sm,.wc-alert-sm *){font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)} +#wirecore-dr .wc-badge{align-items:center;gap:var(--spacing);height:22px;padding-inline:calc(var(--spacing) * 2);--tw-leading:1;white-space:nowrap;border-radius:3.40282e38px;flex-shrink:0;font-family:JetBrains Mono Variable,JetBrains Mono,ui-monospace,monospace;font-size:10.5px;line-height:1;display:inline-flex}@media (forced-colors:active){#wirecore-dr .wc-badge{border-style:var(--tw-border-style);border-width:1px}}#wirecore-dr .wc-badge-icon{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);flex-shrink:0}#wirecore-dr .wc-badge:is(.wc-badge-solid,.wc-badge-solid *){background-color:var(--wc-fg);color:var(--wc-bg)}#wirecore-dr .wc-badge:not(.wc-badge-solid,.wc-badge-solid *,.wc-badge-outline,.wc-badge-outline *,.wc-badge-success,.wc-badge-success *,.wc-badge-info,.wc-badge-info *,.wc-badge-warn,.wc-badge-warn *,.wc-badge-danger,.wc-badge-danger *){background-color:var(--wc-line);color:var(--wc-fg)}#wirecore-dr .wc-badge:is(.wc-badge-outline,.wc-badge-outline *){border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-2);color:var(--wc-muted)}#wirecore-dr .wc-badge:is(.wc-badge-success,.wc-badge-success *){background-color:var(--wc-success)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-badge:is(.wc-badge-success,.wc-badge-success *){background-color:color-mix(in oklab, var(--wc-success) 14%, transparent)}}#wirecore-dr .wc-badge:is(.wc-badge-success,.wc-badge-success *){color:var(--wc-success)}#wirecore-dr .wc-badge:is(.wc-badge-info,.wc-badge-info *){background-color:var(--wc-info)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-badge:is(.wc-badge-info,.wc-badge-info *){background-color:color-mix(in oklab, var(--wc-info) 14%, transparent)}}#wirecore-dr .wc-badge:is(.wc-badge-info,.wc-badge-info *){color:var(--wc-info)}#wirecore-dr .wc-badge:is(.wc-badge-warn,.wc-badge-warn *){background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-badge:is(.wc-badge-warn,.wc-badge-warn *){background-color:color-mix(in oklab, var(--wc-warn) 14%, transparent)}}#wirecore-dr .wc-badge:is(.wc-badge-warn,.wc-badge-warn *){color:var(--wc-warn)}#wirecore-dr .wc-badge:is(.wc-badge-danger,.wc-badge-danger *){background-color:var(--wc-danger)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-badge:is(.wc-badge-danger,.wc-badge-danger *){background-color:color-mix(in oklab, var(--wc-danger) 14%, transparent)}}#wirecore-dr .wc-badge:is(.wc-badge-danger,.wc-badge-danger *){color:var(--wc-danger)}#wirecore-dr .wc-badge:is(.wc-badge-circle,.wc-badge-circle *){min-width:22px;padding-inline:calc(var(--spacing) * 1.5);justify-content:center} +#wirecore-dr .wc-button{cursor:pointer;--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);white-space:nowrap;transition-property:opacity,background-color,border-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;-webkit-user-select:none;user-select:none;border-radius:3.40282e38px;flex-shrink:0;justify-content:center;align-items:center;transition-duration:.15s;display:inline-flex}#wirecore-dr .wc-button:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-button:disabled{cursor:not-allowed;opacity:.4}#wirecore-dr .wc-button[aria-busy=true]{cursor:wait}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-button{transition-property:none}}@media (forced-colors:active){#wirecore-dr .wc-button{border-style:var(--tw-border-style);border-width:1px;border-color:buttonborder}}#wirecore-dr .wc-button-icon{flex-shrink:0}#wirecore-dr .wc-button-badge{background-color:var(--wc-danger);min-width:18px;height:18px;padding-inline:var(--spacing);--tw-leading:1;color:var(--wc-on-danger);border-radius:3.40282e38px;justify-content:center;align-items:center;font-family:JetBrains Mono Variable,JetBrains Mono,ui-monospace,monospace;font-size:10px;line-height:1;display:inline-flex}@media (forced-colors:active){#wirecore-dr .wc-button-badge{border-style:var(--tw-border-style);border-width:1px}}#wirecore-dr .wc-button-dot{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2);background-color:var(--wc-danger);border-radius:3.40282e38px;flex-shrink:0}@media (forced-colors:active){#wirecore-dr .wc-button-dot{background-color:canvastext}}#wirecore-dr .wc-button-badge-label{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}#wirecore-dr .wc-button:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *){background-color:var(--wc-primary);color:var(--wc-on-primary)}@media (hover:hover){#wirecore-dr .wc-button:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *):hover{opacity:.85}}#wirecore-dr .wc-button:is(.wc-button-secondary,.wc-button-secondary *){background-color:var(--wc-line);color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-secondary,.wc-button-secondary *):hover{background-color:var(--wc-line-2)}}#wirecore-dr .wc-button:is(.wc-button-success,.wc-button-success *){background-color:var(--wc-success);color:var(--wc-on-success)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-success,.wc-button-success *):hover{opacity:.85}}#wirecore-dr .wc-button:is(.wc-button-info,.wc-button-info *){background-color:var(--wc-info);color:var(--wc-on-info)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-info,.wc-button-info *):hover{opacity:.9}}#wirecore-dr .wc-button:is(.wc-button-warn,.wc-button-warn *){background-color:var(--wc-warn);color:var(--wc-on-warn)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-warn,.wc-button-warn *):hover{opacity:.9}}#wirecore-dr .wc-button:is(.wc-button-danger,.wc-button-danger *){background-color:var(--wc-danger);color:var(--wc-on-danger)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-danger,.wc-button-danger *):hover{opacity:.85}}#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *){border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-2);color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):hover{border-color:var(--wc-fg)}}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *){color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):hover{background-color:var(--wc-line)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *){background-color:var(--wc-primary)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *){background-color:color-mix(in oklab, var(--wc-primary) 10%, transparent)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *){color:var(--wc-primary)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):hover{background-color:var(--wc-primary)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):hover{background-color:color-mix(in oklab, var(--wc-primary) 14%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-inverted,.wc-button-inverted *){background-color:var(--wc-bg);color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-inverted,.wc-button-inverted *):hover{opacity:.85}}#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *){color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *):hover{opacity:.7}}#wirecore-dr .wc-button:is(.wc-button-xs,.wc-button-xs *){height:calc(var(--spacing) * 6);gap:var(--spacing);padding-inline:calc(var(--spacing) * 2.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}#wirecore-dr .wc-button-icon:is(.wc-button-xs,.wc-button-xs *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}#wirecore-dr .wc-button:is(.wc-button-sm,.wc-button-sm *){height:calc(var(--spacing) * 8);gap:var(--spacing);padding-inline:calc(var(--spacing) * 3);font-size:13px}#wirecore-dr .wc-button-icon:is(.wc-button-sm,.wc-button-sm *){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-button:not(.wc-button-xs,.wc-button-xs *,.wc-button-sm,.wc-button-sm *,.wc-button-lg,.wc-button-lg *){height:calc(var(--spacing) * 10);gap:calc(var(--spacing) * 1.5);padding-inline:calc(var(--spacing) * 4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}#wirecore-dr .wc-button-icon:not(.wc-button-xs,.wc-button-xs *,.wc-button-sm,.wc-button-sm *,.wc-button-lg,.wc-button-lg *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}#wirecore-dr .wc-button:is(.wc-button-lg,.wc-button-lg *){height:calc(var(--spacing) * 12);gap:calc(var(--spacing) * 2);padding-inline:calc(var(--spacing) * 5.5);font-size:15px}#wirecore-dr .wc-button-icon:is(.wc-button-lg,.wc-button-lg *){width:18px;height:18px}#wirecore-dr .wc-button:is(.wc-button-rounded,.wc-button-rounded *){border-radius:var(--radius-lg)}#wirecore-dr .wc-button:is(.wc-button-square,.wc-button-square *){border-radius:0}#wirecore-dr .wc-button:is(.wc-button-block,.wc-button-block *){width:100%;display:flex}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-xs,.wc-button-xs *){padding-inline:calc(var(--spacing) * 2)}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-sm,.wc-button-sm *){padding-inline:calc(var(--spacing) * 2.5)}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):not(.wc-button-xs,.wc-button-xs *,.wc-button-sm,.wc-button-sm *,.wc-button-lg,.wc-button-lg *){padding-inline:calc(var(--spacing) * 3)}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-lg,.wc-button-lg *){padding-inline:calc(var(--spacing) * 4)}#wirecore-dr .wc-button:is(.wc-button-rounded,.wc-button-rounded *):is(.wc-button-xs,.wc-button-xs *){border-radius:var(--radius-md)}#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *){height:auto;min-height:calc(var(--spacing) * 6);gap:var(--spacing);border-bottom-style:var(--tw-border-style);padding-inline:0;border-color:currentColor;border-bottom-width:1px;border-radius:0;padding-bottom:1px}@media (forced-colors:active){#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *){border-style:var(--tw-border-style);border-width:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px}}#wirecore-dr .wc-button-icon:is(.wc-button-link,.wc-button-link *){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-primary,.wc-button-color-primary *){background-color:var(--wc-primary);color:var(--wc-on-primary)}@media (hover:hover){#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-primary,.wc-button-color-primary *):hover{background-color:var(--wc-primary);opacity:.85}}#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-primary,.wc-button-color-primary *){border-color:var(--wc-primary);color:var(--wc-primary)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-primary,.wc-button-color-primary *):hover{border-color:var(--wc-primary);background-color:var(--wc-primary)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-primary,.wc-button-color-primary *):hover{background-color:color-mix(in oklab, var(--wc-primary) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-primary,.wc-button-color-primary *){color:var(--wc-primary)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-primary,.wc-button-color-primary *):hover{background-color:var(--wc-primary)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-primary,.wc-button-color-primary *):hover{background-color:color-mix(in oklab, var(--wc-primary) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-primary,.wc-button-color-primary *){background-color:var(--wc-primary)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-primary,.wc-button-color-primary *){background-color:color-mix(in oklab, var(--wc-primary) 10%, transparent)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-primary,.wc-button-color-primary *){color:var(--wc-primary)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-primary,.wc-button-color-primary *):hover{background-color:var(--wc-primary)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-primary,.wc-button-color-primary *):hover{background-color:color-mix(in oklab, var(--wc-primary) 14%, transparent)}}}#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-secondary,.wc-button-color-secondary *){background-color:var(--wc-line);color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-secondary,.wc-button-color-secondary *):hover{background-color:var(--wc-line-2);opacity:1}}#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-secondary,.wc-button-color-secondary *){border-color:var(--wc-line-2);color:var(--wc-muted)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-secondary,.wc-button-color-secondary *):hover{border-color:var(--wc-fg);color:var(--wc-fg)}}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-secondary,.wc-button-color-secondary *){color:var(--wc-muted)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-secondary,.wc-button-color-secondary *):hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-secondary,.wc-button-color-secondary *){background-color:var(--wc-line);color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-secondary,.wc-button-color-secondary *):hover{background-color:var(--wc-line-2)}}#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-success,.wc-button-color-success *){background-color:var(--wc-success);color:var(--wc-on-success)}@media (hover:hover){#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-success,.wc-button-color-success *):hover{background-color:var(--wc-success);opacity:.85}}#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-success,.wc-button-color-success *){border-color:var(--wc-success);color:var(--wc-success)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-success,.wc-button-color-success *):hover{border-color:var(--wc-success);background-color:var(--wc-success)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-success,.wc-button-color-success *):hover{background-color:color-mix(in oklab, var(--wc-success) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-success,.wc-button-color-success *){color:var(--wc-success)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-success,.wc-button-color-success *):hover{background-color:var(--wc-success)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-success,.wc-button-color-success *):hover{background-color:color-mix(in oklab, var(--wc-success) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-success,.wc-button-color-success *){background-color:var(--wc-success)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-success,.wc-button-color-success *){background-color:color-mix(in oklab, var(--wc-success) 10%, transparent)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-success,.wc-button-color-success *){color:var(--wc-success)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-success,.wc-button-color-success *):hover{background-color:var(--wc-success)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-success,.wc-button-color-success *):hover{background-color:color-mix(in oklab, var(--wc-success) 14%, transparent)}}}#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-info,.wc-button-color-info *){background-color:var(--wc-info);color:var(--wc-on-info)}@media (hover:hover){#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-info,.wc-button-color-info *):hover{background-color:var(--wc-info);opacity:.9}}#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-info,.wc-button-color-info *){border-color:var(--wc-info);color:var(--wc-info)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-info,.wc-button-color-info *):hover{border-color:var(--wc-info);background-color:var(--wc-info)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-info,.wc-button-color-info *):hover{background-color:color-mix(in oklab, var(--wc-info) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-info,.wc-button-color-info *){color:var(--wc-info)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-info,.wc-button-color-info *):hover{background-color:var(--wc-info)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-info,.wc-button-color-info *):hover{background-color:color-mix(in oklab, var(--wc-info) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-info,.wc-button-color-info *){background-color:var(--wc-info)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-info,.wc-button-color-info *){background-color:color-mix(in oklab, var(--wc-info) 10%, transparent)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-info,.wc-button-color-info *){color:var(--wc-info)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-info,.wc-button-color-info *):hover{background-color:var(--wc-info)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-info,.wc-button-color-info *):hover{background-color:color-mix(in oklab, var(--wc-info) 14%, transparent)}}}#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-warn,.wc-button-color-warn *){background-color:var(--wc-warn);color:var(--wc-on-warn)}@media (hover:hover){#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-warn,.wc-button-color-warn *):hover{background-color:var(--wc-warn);opacity:.9}}#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-warn,.wc-button-color-warn *){border-color:var(--wc-warn);color:var(--wc-warn)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-warn,.wc-button-color-warn *):hover{border-color:var(--wc-warn);background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-warn,.wc-button-color-warn *):hover{background-color:color-mix(in oklab, var(--wc-warn) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-warn,.wc-button-color-warn *){color:var(--wc-warn)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-warn,.wc-button-color-warn *):hover{background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-warn,.wc-button-color-warn *):hover{background-color:color-mix(in oklab, var(--wc-warn) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-warn,.wc-button-color-warn *){background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-warn,.wc-button-color-warn *){background-color:color-mix(in oklab, var(--wc-warn) 10%, transparent)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-warn,.wc-button-color-warn *){color:var(--wc-warn)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-warn,.wc-button-color-warn *):hover{background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-warn,.wc-button-color-warn *):hover{background-color:color-mix(in oklab, var(--wc-warn) 14%, transparent)}}}#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-danger,.wc-button-color-danger *){background-color:var(--wc-danger);color:var(--wc-on-danger)}@media (hover:hover){#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-danger,.wc-button-color-danger *):hover{background-color:var(--wc-danger);opacity:.85}}#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-danger,.wc-button-color-danger *){border-color:var(--wc-danger);color:var(--wc-danger)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-danger,.wc-button-color-danger *):hover{border-color:var(--wc-danger);background-color:var(--wc-danger)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-danger,.wc-button-color-danger *):hover{background-color:color-mix(in oklab, var(--wc-danger) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-danger,.wc-button-color-danger *){color:var(--wc-danger)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-danger,.wc-button-color-danger *):hover{background-color:var(--wc-danger)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-danger,.wc-button-color-danger *):hover{background-color:color-mix(in oklab, var(--wc-danger) 8%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-danger,.wc-button-color-danger *){background-color:var(--wc-danger)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-danger,.wc-button-color-danger *){background-color:color-mix(in oklab, var(--wc-danger) 10%, transparent)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-danger,.wc-button-color-danger *){color:var(--wc-danger)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-danger,.wc-button-color-danger *):hover{background-color:var(--wc-danger)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-danger,.wc-button-color-danger *):hover{background-color:color-mix(in oklab, var(--wc-danger) 14%, transparent)}}}#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-contrast,.wc-button-color-contrast *){background-color:var(--wc-fg);color:var(--wc-bg)}@media (hover:hover){#wirecore-dr .wc-button:is(:not(.wc-button-secondary,.wc-button-secondary *,.wc-button-success,.wc-button-success *,.wc-button-info,.wc-button-info *,.wc-button-warn,.wc-button-warn *,.wc-button-danger,.wc-button-danger *,.wc-button-outline,.wc-button-outline *,.wc-button-text,.wc-button-text *,.wc-button-soft,.wc-button-soft *,.wc-button-inverted,.wc-button-inverted *,.wc-button-link,.wc-button-link *),:is(.wc-button-secondary,.wc-button-secondary *),:is(.wc-button-success,.wc-button-success *),:is(.wc-button-info,.wc-button-info *),:is(.wc-button-warn,.wc-button-warn *),:is(.wc-button-danger,.wc-button-danger *)):is(.wc-button-color-contrast,.wc-button-color-contrast *):hover{background-color:var(--wc-fg);opacity:.85}}#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-contrast,.wc-button-color-contrast *){border-color:var(--wc-fg);color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-outline,.wc-button-outline *):is(.wc-button-color-contrast,.wc-button-color-contrast *):hover{border-color:var(--wc-fg);background-color:var(--wc-line)}}#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-contrast,.wc-button-color-contrast *){color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-text,.wc-button-text *):is(.wc-button-color-contrast,.wc-button-color-contrast *):hover{background-color:var(--wc-line)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-contrast,.wc-button-color-contrast *){background-color:var(--wc-fg)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-contrast,.wc-button-color-contrast *){background-color:color-mix(in oklab, var(--wc-fg) 10%, transparent)}}#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-contrast,.wc-button-color-contrast *){color:var(--wc-fg)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-contrast,.wc-button-color-contrast *):hover{background-color:var(--wc-fg)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-button:is(.wc-button-soft,.wc-button-soft *):is(.wc-button-color-contrast,.wc-button-color-contrast *):hover{background-color:color-mix(in oklab, var(--wc-fg) 14%, transparent)}}}#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *):is(.wc-button-color-primary,.wc-button-color-primary *){color:var(--wc-primary)}#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *):is(.wc-button-color-secondary,.wc-button-color-secondary *){color:var(--wc-muted)}@media (hover:hover){#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *):is(.wc-button-color-secondary,.wc-button-color-secondary *):hover{color:var(--wc-fg)}}#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *):is(.wc-button-color-success,.wc-button-color-success *){color:var(--wc-success)}#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *):is(.wc-button-color-info,.wc-button-color-info *){color:var(--wc-info)}#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *):is(.wc-button-color-warn,.wc-button-color-warn *){color:var(--wc-warn)}#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *):is(.wc-button-color-danger,.wc-button-color-danger *){color:var(--wc-danger)}#wirecore-dr .wc-button:is(.wc-button-link,.wc-button-link *):is(.wc-button-color-contrast,.wc-button-color-contrast *){color:var(--wc-fg)} +#wirecore-dr .wc-card{gap:calc(var(--spacing) * 2.5);border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line);background-color:var(--wc-card);padding:calc(var(--spacing) * 6);border-radius:20px;flex-direction:column;display:flex}#wirecore-dr .wc-card:is(.wc-card-interactive,.wc-card-interactive *){cursor:pointer;background-color:var(--wc-glow);background-image:radial-gradient(90% 60% at 50% 0%, var(--wc-glow), transparent 70%);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;transition-duration:.2s}@media (hover:hover){#wirecore-dr .wc-card:is(.wc-card-interactive,.wc-card-interactive *):hover{border-color:var(--wc-line-2)}}#wirecore-dr .wc-card:is(.wc-card-interactive,.wc-card-interactive *):focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-card:is(.wc-card-interactive,.wc-card-interactive *){transition-property:none}}#wirecore-dr .wc-card:is(.wc-card-horizontal,.wc-card-horizontal *){align-items:stretch;gap:calc(var(--spacing) * 5);flex-direction:row} +#wirecore-dr .wc-card-parts-media{border-radius:var(--radius-xl);overflow:hidden}#wirecore-dr .wc-card-parts-content{gap:calc(var(--spacing) * 2.5);flex-direction:column;flex:1;min-width:0;display:flex}#wirecore-dr .wc-card-parts-header{justify-content:space-between;align-items:flex-start;gap:calc(var(--spacing) * 3);display:flex}#wirecore-dr .wc-card-parts-heading{gap:calc(var(--spacing) * .5);flex-direction:column;min-width:0;display:flex}#wirecore-dr .wc-card-parts-title{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:-.015em;letter-spacing:-.015em;color:var(--wc-fg)}#wirecore-dr .wc-card-parts-subtitle{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--wc-muted)}#wirecore-dr .wc-card-parts-footer{align-items:center;gap:calc(var(--spacing) * 2);padding-top:calc(var(--spacing) * 1.5);flex-wrap:wrap;margin-top:auto;display:flex}#wirecore-dr .wc-card-parts-media:is(.wc-card-parts-horizontal,.wc-card-parts-horizontal *){width:40%;max-width:calc(var(--spacing) * 64);flex-shrink:0;align-self:stretch} +#wirecore-dr .wc-checkbox{cursor:pointer;align-items:flex-start;gap:calc(var(--spacing) * 2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.45;color:var(--wc-muted);line-height:1.45;display:inline-flex}#wirecore-dr .wc-checkbox[data-disabled]{cursor:not-allowed;opacity:.4}#wirecore-dr .wc-checkbox-control{border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-strong);width:18px;height:18px;color:var(--wc-on-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;margin-top:1px;display:flex}#wirecore-dr .wc-checkbox-control[data-focus-visible]{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-checkbox-control[data-invalid]{border-color:var(--wc-danger)}#wirecore-dr .wc-checkbox-control[data-state=checked],#wirecore-dr .wc-checkbox-control[data-state=indeterminate]{border-color:var(--wc-primary);background-color:var(--wc-primary)}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-checkbox-control{transition-property:none}}@media (forced-colors:active){#wirecore-dr .wc-checkbox-control[data-state=checked]{color:highlighttext;forced-color-adjust:none;background-color:highlight;border-color:highlight}}#wirecore-dr .wc-checkbox-icon{stroke-width:3px;width:13px;height:13px}#wirecore-dr .wc-checkbox-label{min-width:0} +#wirecore-dr .wc-checkbox-group{gap:calc(var(--spacing) * 2.5);border-style:var(--tw-border-style);border-width:0;flex-direction:column;min-width:0;margin:0;padding:0;display:flex}#wirecore-dr .wc-checkbox-group-label{--tw-font-weight:var(--font-weight-medium);font-size:13px;font-weight:var(--font-weight-medium);color:var(--wc-fg)}#wirecore-dr .wc-checkbox-group-required-indicator{color:var(--wc-danger);margin-inline-start:calc(var(--spacing) * .5)}#wirecore-dr .wc-checkbox-group-items{column-gap:18px;row-gap:calc(var(--spacing) * 2.5);display:flex}#wirecore-dr .wc-checkbox-group-helper-text{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--wc-muted)}#wirecore-dr .wc-checkbox-group-error-text{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--wc-danger)}#wirecore-dr .wc-checkbox-group-items:not(.wc-checkbox-group-horizontal,.wc-checkbox-group-horizontal *){flex-direction:column}#wirecore-dr .wc-checkbox-group-items:is(.wc-checkbox-group-horizontal,.wc-checkbox-group-horizontal *){flex-flow:wrap}#wirecore-dr .wc-checkbox-group-items:is(.wc-checkbox-group-grid,.wc-checkbox-group-grid *){gap:calc(var(--spacing) * 3);grid-template-columns:repeat(1,minmax(0,1fr));display:grid}@media (width>=40rem){#wirecore-dr .wc-checkbox-group-items:is(.wc-checkbox-group-grid,.wc-checkbox-group-grid *){grid-template-columns:repeat(var(--wc-columns),minmax(0,1fr))}} +#wirecore-dr .wc-data-table{flex-direction:column;display:flex}#wirecore-dr .wc-data-table-scroll{overflow-x:auto}#wirecore-dr .wc-data-table-table{border-collapse:separate;--tw-border-spacing-x:0px;--tw-border-spacing-y:0px;width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);text-align:start}@media (prefers-reduced-motion:no-preference){#wirecore-dr .wc-data-table-table>tbody>tr{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}#wirecore-dr .wc-data-table-table[aria-busy=true]>tbody>tr[data-row-id]{opacity:.6}#wirecore-dr .wc-data-table-caption,#wirecore-dr .wc-data-table-sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}#wirecore-dr .wc-data-table-head{vertical-align:bottom}#wirecore-dr :is(.wc-data-table-head-row>*){border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line)}#wirecore-dr .wc-data-table-th{padding-inline:18px;padding-block:calc(var(--spacing) * 2.5);--tw-font-weight:var(--font-weight-normal);font-family:JetBrains Mono Variable,JetBrains Mono,ui-monospace,monospace;font-size:11px;font-weight:var(--font-weight-normal);--tw-tracking:.08em;letter-spacing:.08em;white-space:nowrap;color:var(--wc-muted);text-transform:uppercase;position:relative}#wirecore-dr .wc-data-table-group-th{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line);text-align:center}#wirecore-dr .wc-data-table-head-content{align-items:center;gap:var(--spacing);min-width:0;display:flex}#wirecore-dr .wc-data-table-head-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}#wirecore-dr .wc-data-table-sort-button{cursor:pointer;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-sm);--tw-tracking:.08em;letter-spacing:.08em;text-transform:uppercase;min-width:0;font-family:JetBrains Mono Variable,JetBrains Mono,ui-monospace,monospace;font-size:11px;display:inline-flex}@media (hover:hover){#wirecore-dr .wc-data-table-sort-button:hover{color:var(--wc-fg)}}#wirecore-dr .wc-data-table-sort-button:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-data-table-sort-icon{flex-shrink:0;width:13px;height:13px}#wirecore-dr .wc-data-table-sort-badge{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);background-color:var(--wc-line);--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal);color:var(--wc-fg);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);border-radius:3.40282e38px;flex-shrink:0;justify-content:center;align-items:center;font-size:10px;display:inline-flex}#wirecore-dr .wc-data-table-head-button{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);cursor:pointer;border-radius:var(--radius-md);color:var(--wc-muted);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@media (hover:hover){#wirecore-dr .wc-data-table-head-button:hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr .wc-data-table-head-button:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-data-table-head-button[aria-expanded=true]{background-color:var(--wc-line);color:var(--wc-fg)}#wirecore-dr .wc-data-table-head-button[data-active]{color:var(--wc-primary)}#wirecore-dr .wc-data-table-head-button-icon{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-data-table-row{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}#wirecore-dr :is(.wc-data-table-row>*){border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line)}@media (hover:hover){#wirecore-dr .wc-data-table-row:hover{background-color:var(--wc-bg-2)}}#wirecore-dr .wc-data-table-row[data-state=selected]{background-color:var(--wc-line)}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-data-table-row{transition-property:none}}#wirecore-dr .wc-data-table-td{padding-inline:18px;padding-block:calc(var(--spacing) * 2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--wc-fg)}#wirecore-dr .wc-data-table-select-cell{width:1px;padding-inline-end:0}#wirecore-dr .wc-data-table-utility-cell{width:1px;padding-inline:calc(var(--spacing) * 2);white-space:nowrap}#wirecore-dr .wc-data-table-row-number{font-family:JetBrains Mono Variable,JetBrains Mono,ui-monospace,monospace;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--wc-muted);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}#wirecore-dr .wc-data-table-tree-cell{align-items:center;gap:calc(var(--spacing) * 1.5);display:flex}#wirecore-dr .wc-data-table-expander{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);cursor:pointer;border-radius:var(--radius-md);color:var(--wc-muted);flex-shrink:0;justify-content:center;align-items:center;display:flex}@media (hover:hover){#wirecore-dr .wc-data-table-expander:hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr .wc-data-table-expander:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-data-table-expander-icon{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}#wirecore-dr .wc-data-table-expander-icon[data-state=open]{rotate:90deg}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-data-table-expander-icon{transition-property:none}}#wirecore-dr .wc-data-table-expander-icon:where(:dir(rtl),[dir=rtl],[dir=rtl] *):not([data-state=open]){--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}#wirecore-dr .wc-data-table-expander-spacer{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);flex-shrink:0}#wirecore-dr .wc-data-table-expansion-row{background-color:var(--wc-bg-2)}#wirecore-dr :is(.wc-data-table-expansion-row>*){border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line)}#wirecore-dr .wc-data-table-expansion-cell{padding-inline:18px;padding-block:calc(var(--spacing) * 4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--wc-fg)}#wirecore-dr .wc-data-table-radio{cursor:pointer;appearance:none;border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-strong);vertical-align:middle;background-color:#0000;border-radius:3.40282e38px;place-content:center;width:18px;height:18px;display:grid}#wirecore-dr .wc-data-table-radio:checked{border-color:var(--wc-primary);background-image:radial-gradient(var(--wc-primary) 0 4px,transparent 4.5px)}#wirecore-dr .wc-data-table-radio:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}@media (forced-colors:active){#wirecore-dr .wc-data-table-radio:checked{background-color:highlight}}#wirecore-dr .wc-data-table-drag-handle{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);cursor:grab;touch-action:none;border-radius:var(--radius-md);color:var(--wc-muted);justify-content:center;align-items:center;display:flex}@media (hover:hover){#wirecore-dr .wc-data-table-drag-handle:hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr .wc-data-table-drag-handle:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-data-table-drag-handle:active{cursor:grabbing}#wirecore-dr .wc-data-table-drag-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}#wirecore-dr .wc-data-table-message{padding-inline:18px;padding-block:calc(var(--spacing) * 10);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--wc-muted)}#wirecore-dr .wc-data-table-message-content{align-items:center;gap:calc(var(--spacing) * 2);display:inline-flex}#wirecore-dr .wc-data-table-footer{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 3);padding-inline:18px;padding-block:calc(var(--spacing) * 2.5);flex-wrap:wrap;display:flex}#wirecore-dr .wc-data-table-page-size{align-items:center;gap:calc(var(--spacing) * 2);color:var(--wc-muted);font-size:13px;display:flex}#wirecore-dr .wc-data-table-page-size-select{width:calc(var(--spacing) * 24)}#wirecore-dr .wc-data-table-toolbar{align-items:center;gap:calc(var(--spacing) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line);padding-inline:18px;padding-block:calc(var(--spacing) * 3);flex-wrap:wrap;display:flex}#wirecore-dr .wc-data-table-search{max-width:calc(var(--spacing) * 72)}#wirecore-dr .wc-data-table-toolbar-end{align-items:center;gap:calc(var(--spacing) * 2);margin-inline-start:auto;display:flex}#wirecore-dr .wc-data-table-menu-check{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);flex-shrink:0}#wirecore-dr .wc-data-table-status{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}#wirecore-dr :is(.wc-data-table-filter-row>*){border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line)}#wirecore-dr .wc-data-table-filter-cell{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);text-transform:none}#wirecore-dr .wc-data-table-filter-panel{z-index:50;width:calc(var(--spacing) * 80);gap:calc(var(--spacing) * 3);border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-2);background-color:var(--wc-card);max-width:calc(100vw - 2rem);padding:calc(var(--spacing) * 3);color:var(--wc-fg);--tw-shadow:0 14px 32px -12px var(--tw-shadow-color,#00000073);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-outline-style:none;border-radius:12px;outline-style:none;flex-direction:column;display:flex}#wirecore-dr .wc-data-table-filter-panel[data-side=bottom]{--wc-pop-y:-4px}#wirecore-dr .wc-data-table-filter-panel[data-side=left]{--wc-pop-x:4px}#wirecore-dr .wc-data-table-filter-panel[data-side=right]{--wc-pop-x:-4px}#wirecore-dr .wc-data-table-filter-panel[data-side=top]{--wc-pop-y:4px}@media (prefers-reduced-motion:no-preference){#wirecore-dr .wc-data-table-filter-panel[data-state=closed]{animation:var(--animate-pop-out)}#wirecore-dr .wc-data-table-filter-panel[data-state=open]{animation:var(--animate-pop-in)}}#wirecore-dr .wc-data-table-filter-form{display:contents}#wirecore-dr .wc-data-table-filter-rule{gap:calc(var(--spacing) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line);padding-bottom:calc(var(--spacing) * 3);flex-direction:column;display:flex}#wirecore-dr .wc-data-table-filter-mode{flex:1;min-width:0}#wirecore-dr .wc-data-table-filter-add{align-self:flex-start}#wirecore-dr .wc-data-table-filter-rule-head{align-items:center;gap:calc(var(--spacing) * 2);display:flex}#wirecore-dr .wc-data-table-filter-range{gap:calc(var(--spacing) * 2);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}#wirecore-dr .wc-data-table-filter-row-range{gap:var(--spacing);flex-direction:column;min-width:0;display:flex}#wirecore-dr .wc-data-table-filter-actions{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 2);display:flex}#wirecore-dr .wc-data-table-fixed-layout{table-layout:fixed}#wirecore-dr .wc-data-table-resizer{z-index:3;width:calc(var(--spacing) * 2);cursor:col-resize;touch-action:none;--tw-outline-style:none;-webkit-user-select:none;user-select:none;outline-style:none;position:absolute;inset-block:0;inset-inline-end:calc(var(--spacing) * -1)}#wirecore-dr .wc-data-table-resizer:after{content:var(--tw-content);content:var(--tw-content);inset-block:calc(var(--spacing) * 2);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);background-color:var(--wc-line-2);width:1px;position:absolute;left:50%}@media (hover:hover){#wirecore-dr .wc-data-table-resizer:hover:after{content:var(--tw-content);background-color:var(--wc-fg)}}#wirecore-dr .wc-data-table-resizer:focus-visible:after{content:var(--tw-content);content:var(--tw-content);width:calc(var(--spacing) * .5);content:var(--tw-content);background-color:var(--wc-fg);inset-block:0}#wirecore-dr .wc-data-table-resizer[data-resizing]:after{content:var(--tw-content);background-color:var(--wc-primary)}#wirecore-dr .wc-data-table-pinned{z-index:1;background-color:var(--wc-card);position:sticky}#wirecore-dr :where(.wc-data-table-row:hover) .wc-data-table-pinned{background-color:var(--wc-bg-2)}#wirecore-dr :where(.wc-data-table-row[data-state=selected]) .wc-data-table-pinned{background-color:var(--wc-line)}#wirecore-dr .wc-data-table-pinned-head{z-index:2;background-color:var(--wc-card);position:sticky}#wirecore-dr .wc-data-table-pinned-start-edge{--tw-shadow:inset -1px 0 0 var(--tw-shadow-color,var(--wc-line-2));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-pinned-start-edge:where(:dir(rtl),[dir=rtl],[dir=rtl] *),#wirecore-dr .wc-data-table-pinned-end-edge{--tw-shadow:inset 1px 0 0 var(--tw-shadow-color,var(--wc-line-2));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-pinned-end-edge:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-shadow:inset -1px 0 0 var(--tw-shadow-color,var(--wc-line-2));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-frozen-body{z-index:2;background-color:var(--wc-card);--tw-shadow:0 1px 0 var(--tw-shadow-color,var(--wc-line-2));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);position:sticky}#wirecore-dr .wc-data-table-group-row{background-color:var(--wc-bg-2)}#wirecore-dr :is(.wc-data-table-group-row>*){border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line)}#wirecore-dr .wc-data-table-group-cell{padding-inline:18px;padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}#wirecore-dr .wc-data-table-group-label{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--wc-fg)}#wirecore-dr .wc-data-table-group-count{color:var(--wc-muted)}#wirecore-dr .wc-data-table-group-aggregate{padding-inline:18px;padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--wc-fg);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}#wirecore-dr .wc-data-table-foot{color:var(--wc-fg)}#wirecore-dr .wc-data-table-foot-cell{background-color:var(--wc-card);padding-inline:18px;padding-block:calc(var(--spacing) * 2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--wc-fg);--tw-shadow:0 -1px 0 var(--tw-shadow-color,var(--wc-line-2));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-edit-button{margin-inline:calc(var(--spacing) * -1.5);margin-block:calc(var(--spacing) * -1);min-height:calc(var(--spacing) * 7);cursor:text;border-radius:var(--radius-md);width:calc(100% + .75rem);padding-inline:calc(var(--spacing) * 1.5);padding-block:var(--spacing);text-align:start;display:block}@media (hover:hover){#wirecore-dr .wc-data-table-edit-button:hover{background-color:var(--wc-line)}}#wirecore-dr .wc-data-table-edit-button:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-data-table-editor{gap:var(--spacing);flex-direction:column;min-width:0;display:flex}#wirecore-dr .wc-data-table-edit-error{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);color:var(--wc-danger)}#wirecore-dr .wc-data-table-edit-actions{align-items:center;gap:var(--spacing);display:flex}#wirecore-dr .wc-data-table-copy-cell{align-items:center;gap:var(--spacing);display:inline-flex}#wirecore-dr .wc-data-table-drop-target[data-dragging]{opacity:.5}#wirecore-dr .wc-data-table-drop-target[data-drop=after]{--tw-shadow:inset 0 -2px 0 var(--tw-shadow-color,var(--wc-primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-drop-target[data-drop=before]{--tw-shadow:inset 0 2px 0 var(--tw-shadow-color,var(--wc-primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-drop-target-column[data-dragging]{opacity:.5}#wirecore-dr .wc-data-table-drop-target-column[data-drop=after]{--tw-shadow:inset -2px 0 0 var(--tw-shadow-color,var(--wc-primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-drop-target-column[data-drop=before],#wirecore-dr .wc-data-table-drop-target-column:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-drop=after]{--tw-shadow:inset 2px 0 0 var(--tw-shadow-color,var(--wc-primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-drop-target-column:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-drop=before]{--tw-shadow:inset -2px 0 0 var(--tw-shadow-color,var(--wc-primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-link-row{cursor:pointer}#wirecore-dr .wc-data-table-row-link{border-radius:var(--radius-sm);color:inherit;text-decoration-line:none}@media (hover:hover){#wirecore-dr .wc-data-table-row-link:hover{text-decoration-line:underline}}#wirecore-dr .wc-data-table-row-link:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-data-table-status-bar{align-items:center;column-gap:calc(var(--spacing) * 4);row-gap:var(--spacing);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--wc-line);padding-inline:18px;padding-block:calc(var(--spacing) * 2);color:var(--wc-muted);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);flex-wrap:wrap;font-size:13px;display:flex}#wirecore-dr .wc-data-table-cell-selected{background-color:var(--wc-primary)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-data-table-cell-selected{background-color:color-mix(in oklab, var(--wc-primary) 10%, transparent)}}@media (forced-colors:active){#wirecore-dr .wc-data-table-cell-selected{color:highlighttext;background-color:highlight}}#wirecore-dr .wc-data-table-cell-changed{background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-data-table-cell-changed{background-color:color-mix(in oklab, var(--wc-warn) 10%, transparent)}}#wirecore-dr .wc-data-table-cell-changed{--tw-shadow:inset 3px 0 0 var(--tw-shadow-color,var(--wc-warn));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-cell-changed:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-shadow:inset -3px 0 0 var(--tw-shadow-color,var(--wc-warn));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (forced-colors:active){#wirecore-dr .wc-data-table-cell-changed{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px;border-inline-start-color:highlight}}#wirecore-dr .wc-data-table-batch-bar{align-items:center;gap:calc(var(--spacing) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line);background-color:var(--wc-bg-2);padding-inline:18px;padding-block:calc(var(--spacing) * 2);color:var(--wc-fg);flex-wrap:wrap;font-size:13px;display:flex}#wirecore-dr .wc-data-table-batch-count{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);margin-inline-end:auto}#wirecore-dr .wc-data-table-advanced-filter{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line);padding-inline:18px;padding-block:calc(var(--spacing) * 3)}#wirecore-dr .wc-data-table-find-bar{align-items:center;gap:calc(var(--spacing) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line);padding-inline:18px;padding-block:calc(var(--spacing) * 2);flex-wrap:wrap;display:flex}#wirecore-dr .wc-data-table-find-input{max-width:calc(var(--spacing) * 72)}#wirecore-dr .wc-data-table-find-count{min-width:calc(var(--spacing) * 24);color:var(--wc-muted);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);font-size:13px}#wirecore-dr .wc-data-table-find-match{background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-data-table-find-match{background-color:color-mix(in oklab, var(--wc-warn) 15%, transparent)}}@media (forced-colors:active){#wirecore-dr .wc-data-table-find-match{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:highlight}}#wirecore-dr .wc-data-table-find-current{background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-data-table-find-current{background-color:color-mix(in oklab, var(--wc-warn) 30%, transparent)}}#wirecore-dr .wc-data-table-find-current{outline-style:var(--tw-outline-style);outline-offset:calc(2px * -1);outline-width:2px;outline-color:var(--wc-warn)}@media (forced-colors:active){#wirecore-dr .wc-data-table-find-current{color:highlighttext;background-color:highlight;outline-color:highlight}}#wirecore-dr .wc-data-table-error-content{align-items:center;gap:calc(var(--spacing) * 3);color:var(--wc-danger);flex-direction:column;display:inline-flex}#wirecore-dr .wc-data-table-drop-inside[data-drop=inside]{background-color:var(--wc-primary)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-data-table-drop-inside[data-drop=inside]{background-color:color-mix(in oklab, var(--wc-primary) 10%, transparent)}}#wirecore-dr .wc-data-table-drop-inside[data-drop=inside]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,var(--wc-primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}#wirecore-dr .wc-data-table-column-group-item{padding-inline-start:calc(var(--spacing) * 8)}#wirecore-dr .wc-data-table-spacer{border-style:var(--tw-border-style);border-width:0}#wirecore-dr .wc-data-table-spacer-cell{padding:0}#wirecore-dr .wc-data-table-th:not(.wc-data-table-end,.wc-data-table-end *),#wirecore-dr .wc-data-table-td:not(.wc-data-table-end,.wc-data-table-end *),#wirecore-dr .wc-data-table-foot-cell:not(.wc-data-table-end,.wc-data-table-end *){text-align:start}#wirecore-dr .wc-data-table-th:is(.wc-data-table-end,.wc-data-table-end *){text-align:end}#wirecore-dr .wc-data-table-head-content:is(.wc-data-table-end,.wc-data-table-end *){justify-content:flex-end}#wirecore-dr .wc-data-table-td:is(.wc-data-table-end,.wc-data-table-end *){text-align:end;--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}#wirecore-dr .wc-data-table-edit-button:is(.wc-data-table-end,.wc-data-table-end *){text-align:end}#wirecore-dr .wc-data-table-foot-cell:is(.wc-data-table-end,.wc-data-table-end *){text-align:end;--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}#wirecore-dr .wc-data-table-group-aggregate:is(.wc-data-table-end,.wc-data-table-end *){text-align:end}#wirecore-dr .wc-data-table-th:is(.wc-data-table-sm,.wc-data-table-sm *){padding-block:calc(var(--spacing) * 1.5)}#wirecore-dr .wc-data-table-td:is(.wc-data-table-sm,.wc-data-table-sm *),#wirecore-dr .wc-data-table-group-cell:is(.wc-data-table-sm,.wc-data-table-sm *),#wirecore-dr .wc-data-table-group-aggregate:is(.wc-data-table-sm,.wc-data-table-sm *){padding-block:var(--spacing)}#wirecore-dr .wc-data-table-foot-cell:is(.wc-data-table-sm,.wc-data-table-sm *){padding-block:calc(var(--spacing) * 1.5)}#wirecore-dr .wc-data-table-th:is(.wc-data-table-lg,.wc-data-table-lg *){padding-block:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-data-table-td:is(.wc-data-table-lg,.wc-data-table-lg *){padding-block:calc(var(--spacing) * 4)}#wirecore-dr .wc-data-table-group-cell:is(.wc-data-table-lg,.wc-data-table-lg *),#wirecore-dr .wc-data-table-group-aggregate:is(.wc-data-table-lg,.wc-data-table-lg *){padding-block:calc(var(--spacing) * 3)}#wirecore-dr .wc-data-table-foot-cell:is(.wc-data-table-lg,.wc-data-table-lg *){padding-block:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-data-table-th:is(.wc-data-table-gridlines,.wc-data-table-gridlines *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-color:var(--wc-line)}#wirecore-dr .wc-data-table-th:is(.wc-data-table-gridlines,.wc-data-table-gridlines *):last-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}#wirecore-dr .wc-data-table-td:is(.wc-data-table-gridlines,.wc-data-table-gridlines *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-color:var(--wc-line)}#wirecore-dr .wc-data-table-td:is(.wc-data-table-gridlines,.wc-data-table-gridlines *):last-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}#wirecore-dr .wc-data-table-foot-cell:is(.wc-data-table-gridlines,.wc-data-table-gridlines *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-color:var(--wc-line)}#wirecore-dr .wc-data-table-foot-cell:is(.wc-data-table-gridlines,.wc-data-table-gridlines *):last-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}#wirecore-dr .wc-data-table-row:is(.wc-data-table-striped,.wc-data-table-striped *):nth-child(2n){background-color:var(--wc-bg-2)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-data-table-row:is(.wc-data-table-striped,.wc-data-table-striped *):nth-child(2n){background-color:color-mix(in oklab, var(--wc-bg-2) 60%, transparent)}}#wirecore-dr .wc-data-table-scroll:is(.wc-data-table-scrollable,.wc-data-table-scrollable *){overscroll-behavior:contain;overflow:auto}#wirecore-dr .wc-data-table-head:is(.wc-data-table-scrollable,.wc-data-table-scrollable *){z-index:3;position:sticky;top:0}#wirecore-dr .wc-data-table-foot:is(.wc-data-table-scrollable,.wc-data-table-scrollable *){z-index:3;position:sticky;bottom:0}#wirecore-dr .wc-data-table-th:is(.wc-data-table-scrollable,.wc-data-table-scrollable *),#wirecore-dr .wc-data-table-filter-cell:is(.wc-data-table-scrollable,.wc-data-table-scrollable *){background-color:var(--wc-card)}#wirecore-dr .wc-data-table-table:is(.wc-data-table-grid,.wc-data-table-grid *) :is(td,th):focus-visible{outline-style:var(--tw-outline-style);outline-offset:calc(2px * -1);outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-data-table-th:is(.wc-data-table-wrap-headers,.wc-data-table-wrap-headers *),#wirecore-dr .wc-data-table-head-label:is(.wc-data-table-wrap-headers,.wc-data-table-wrap-headers *){white-space:normal}#wirecore-dr .wc-data-table-head-label:is(.wc-data-table-vertical-headers,.wc-data-table-vertical-headers *){max-height:calc(var(--spacing) * 48);writing-mode:vertical-rl;rotate:180deg}#wirecore-dr .wc-data-table:is(.wc-data-table-fullscreen,.wc-data-table-fullscreen *){z-index:50;background-color:var(--wc-bg);position:fixed;inset:0;overflow:auto}@media not all and (width>=40rem){#wirecore-dr .wc-data-table-th:is(.wc-data-table-hide-sm,.wc-data-table-hide-sm *),#wirecore-dr .wc-data-table-td:is(.wc-data-table-hide-sm,.wc-data-table-hide-sm *),#wirecore-dr .wc-data-table-foot-cell:is(.wc-data-table-hide-sm,.wc-data-table-hide-sm *),#wirecore-dr .wc-data-table-filter-cell:is(.wc-data-table-hide-sm,.wc-data-table-hide-sm *){display:none}}@media not all and (width>=48rem){#wirecore-dr .wc-data-table-th:is(.wc-data-table-hide-md,.wc-data-table-hide-md *),#wirecore-dr .wc-data-table-td:is(.wc-data-table-hide-md,.wc-data-table-hide-md *),#wirecore-dr .wc-data-table-foot-cell:is(.wc-data-table-hide-md,.wc-data-table-hide-md *),#wirecore-dr .wc-data-table-filter-cell:is(.wc-data-table-hide-md,.wc-data-table-hide-md *){display:none}}@media not all and (width>=64rem){#wirecore-dr .wc-data-table-th:is(.wc-data-table-hide-lg,.wc-data-table-hide-lg *),#wirecore-dr .wc-data-table-td:is(.wc-data-table-hide-lg,.wc-data-table-hide-lg *),#wirecore-dr .wc-data-table-foot-cell:is(.wc-data-table-hide-lg,.wc-data-table-hide-lg *),#wirecore-dr .wc-data-table-filter-cell:is(.wc-data-table-hide-lg,.wc-data-table-hide-lg *){display:none}} +#wirecore-dr .wc-dialog-backdrop{z-index:50;background-color:#0009;position:fixed;inset:0}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-dialog-backdrop{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}@media (prefers-reduced-motion:no-preference){#wirecore-dr .wc-dialog-backdrop[data-state=closed]{animation:var(--animate-fade-out)}#wirecore-dr .wc-dialog-backdrop[data-state=open]{animation:var(--animate-fade-in)}}#wirecore-dr .wc-dialog-positioner{z-index:50;padding:calc(var(--spacing) * 4);justify-content:center;align-items:center;display:flex;position:fixed;inset:0;overflow-y:auto}#wirecore-dr .wc-dialog-content{width:100%;max-width:var(--wc-dialog-w,400px);border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-2);background-color:var(--wc-card);color:var(--wc-fg);--tw-shadow:0 24px 48px -20px var(--tw-shadow-color,#0000008c);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-outline-style:none;border-radius:14px;outline-style:none;flex-direction:column;display:flex}@media (prefers-reduced-motion:no-preference){#wirecore-dr .wc-dialog-content[data-state=closed]{animation:var(--animate-dialog-out)}#wirecore-dr .wc-dialog-content[data-state=open]{animation:var(--animate-dialog-in)}}#wirecore-dr .wc-dialog-header{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 3);padding-inline-start:18px;padding-inline-end:calc(var(--spacing) * 4);padding-top:calc(var(--spacing) * 4);display:flex}#wirecore-dr .wc-dialog-icon-box{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9);border-radius:10px;justify-content:center;align-items:center;display:flex}#wirecore-dr .wc-dialog-icon{width:18px;height:18px}#wirecore-dr .wc-dialog-close{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);cursor:pointer;color:var(--wc-muted);transition-property:opacity,background-color,border-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;-webkit-user-select:none;user-select:none;border-radius:3.40282e38px;justify-content:center;align-items:center;margin-inline-start:auto;transition-duration:.15s;display:flex}@media (hover:hover){#wirecore-dr .wc-dialog-close:hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr .wc-dialog-close:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-dialog-close:disabled{cursor:not-allowed;opacity:.4}#wirecore-dr .wc-dialog-close[aria-busy=true]{cursor:wait}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-dialog-close{transition-property:none}}@media (forced-colors:active){#wirecore-dr .wc-dialog-close{border-style:var(--tw-border-style);border-width:1px;border-color:buttonborder}}#wirecore-dr .wc-dialog-close-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}#wirecore-dr .wc-dialog-body{gap:calc(var(--spacing) * 1.5);padding-inline:18px;padding-top:calc(var(--spacing) * 3);flex-direction:column;padding-bottom:18px;display:flex}#wirecore-dr .wc-dialog-title{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:-.02em;letter-spacing:-.02em}#wirecore-dr .wc-dialog-description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.55;color:var(--wc-muted);line-height:1.55}#wirecore-dr .wc-dialog-footer{justify-content:flex-end;gap:calc(var(--spacing) * 2);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--wc-line);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);flex-wrap:wrap;display:flex}#wirecore-dr .wc-dialog-maximize{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);cursor:pointer;color:var(--wc-muted);transition-property:opacity,background-color,border-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;-webkit-user-select:none;user-select:none;border-radius:3.40282e38px;justify-content:center;align-items:center;margin-inline-start:auto;transition-duration:.15s;display:flex}@media (hover:hover){#wirecore-dr .wc-dialog-maximize:hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr .wc-dialog-maximize:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-dialog-maximize:disabled{cursor:not-allowed;opacity:.4}#wirecore-dr .wc-dialog-maximize[aria-busy=true]{cursor:wait}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-dialog-maximize{transition-property:none}}@media (forced-colors:active){#wirecore-dr .wc-dialog-maximize{border-style:var(--tw-border-style);border-width:1px;border-color:buttonborder}}#wirecore-dr .wc-dialog-maximize-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}#wirecore-dr .wc-dialog-icon-box:not(.wc-dialog-success,.wc-dialog-success *,.wc-dialog-info,.wc-dialog-info *,.wc-dialog-warn,.wc-dialog-warn *,.wc-dialog-danger,.wc-dialog-danger *){background-color:var(--wc-line);color:var(--wc-fg)}#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-success,.wc-dialog-success *){background-color:var(--wc-success)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-success,.wc-dialog-success *){background-color:color-mix(in oklab, var(--wc-success) 14%, transparent)}}#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-success,.wc-dialog-success *){color:var(--wc-success)}#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-info,.wc-dialog-info *){background-color:var(--wc-info)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-info,.wc-dialog-info *){background-color:color-mix(in oklab, var(--wc-info) 14%, transparent)}}#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-info,.wc-dialog-info *){color:var(--wc-info)}#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-warn,.wc-dialog-warn *){background-color:var(--wc-warn)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-warn,.wc-dialog-warn *){background-color:color-mix(in oklab, var(--wc-warn) 14%, transparent)}}#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-warn,.wc-dialog-warn *){color:var(--wc-warn)}#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-danger,.wc-dialog-danger *){background-color:var(--wc-danger)}@supports (color:color-mix(in lab, red, red)){#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-danger,.wc-dialog-danger *){background-color:color-mix(in oklab, var(--wc-danger) 14%, transparent)}}#wirecore-dr .wc-dialog-icon-box:is(.wc-dialog-danger,.wc-dialog-danger *){color:var(--wc-danger)}#wirecore-dr .wc-dialog-content:is(.wc-dialog-sm,.wc-dialog-sm *){--wc-dialog-w:320px}#wirecore-dr .wc-dialog-content:is(.wc-dialog-md,.wc-dialog-md *){--wc-dialog-w:400px}#wirecore-dr .wc-dialog-content:is(.wc-dialog-lg,.wc-dialog-lg *){--wc-dialog-w:560px}#wirecore-dr .wc-dialog-content:is(.wc-dialog-xl,.wc-dialog-xl *){--wc-dialog-w:800px}#wirecore-dr .wc-dialog-content:is(.wc-dialog-full,.wc-dialog-full *){max-width:none}#wirecore-dr .wc-dialog-positioner:is(.wc-dialog-center,.wc-dialog-center *){justify-content:center;align-items:center}#wirecore-dr .wc-dialog-positioner:is(.wc-dialog-top,.wc-dialog-top *){align-items:flex-start}#wirecore-dr .wc-dialog-positioner:is(.wc-dialog-bottom,.wc-dialog-bottom *){align-items:flex-end}#wirecore-dr .wc-dialog-positioner:is(.wc-dialog-start,.wc-dialog-start *){justify-content:flex-start}#wirecore-dr .wc-dialog-positioner:is(.wc-dialog-end,.wc-dialog-end *){justify-content:flex-end}#wirecore-dr .wc-dialog-body:is(.wc-dialog-outside,.wc-dialog-outside *){overflow:visible}#wirecore-dr .wc-dialog-content:is(.wc-dialog-inside,.wc-dialog-inside *){min-height:0;max-height:100%}#wirecore-dr .wc-dialog-body:is(.wc-dialog-inside,.wc-dialog-inside *){flex:1;min-height:0;overflow-y:auto}#wirecore-dr .wc-dialog-positioner:is(.wc-dialog-fullscreen,.wc-dialog-fullscreen *){padding:0}#wirecore-dr .wc-dialog-content:is(.wc-dialog-fullscreen,.wc-dialog-fullscreen *){border-style:var(--tw-border-style);border-width:0;border-radius:0;width:100%;max-width:none;height:100%;max-height:none}@media not all and (width>=40rem){#wirecore-dr .wc-dialog-content:is(.wc-dialog-responsive,.wc-dialog-responsive *){max-width:none}}#wirecore-dr .wc-dialog-header:is(.wc-dialog-draggable,.wc-dialog-draggable *){cursor:move;touch-action:none;-webkit-user-select:none;user-select:none}#wirecore-dr .wc-dialog-close:is(.wc-dialog-maximizable,.wc-dialog-maximizable *){margin-inline-start:0} +#wirecore-dr .wc-field{gap:calc(var(--spacing) * 1.5);flex-direction:column;display:flex}#wirecore-dr .wc-field-label{--tw-font-weight:var(--font-weight-medium);font-size:13px;font-weight:var(--font-weight-medium);color:var(--wc-fg)}#wirecore-dr .wc-field-label[data-disabled]{color:var(--wc-muted)}#wirecore-dr .wc-field-label-row{min-height:calc(var(--spacing) * 6);align-items:center;gap:calc(var(--spacing) * .5);display:flex}#wirecore-dr .wc-field-required-indicator{color:var(--wc-danger);margin-inline-start:calc(var(--spacing) * .5)}#wirecore-dr .wc-field-optional-indicator{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);color:var(--wc-muted);margin-inline-start:var(--spacing)}#wirecore-dr .wc-field-helper-text{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--wc-muted)}#wirecore-dr .wc-field-error-text{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--wc-danger)}#wirecore-dr .wc-field-success-text{align-items:center;gap:var(--spacing);color:var(--wc-success);display:flex}#wirecore-dr .wc-field-success-icon{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5);flex-shrink:0} +#wirecore-dr .wc-fieldset{gap:calc(var(--spacing) * 4);border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line);min-width:0;padding:calc(var(--spacing) * 5);border-radius:20px;flex-direction:column;display:flex}#wirecore-dr .wc-fieldset[data-disabled]{opacity:.6}#wirecore-dr .wc-fieldset-legend{padding-inline:calc(var(--spacing) * 1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--wc-fg);margin-inline-start:calc(var(--spacing) * -1.5)}#wirecore-dr .wc-fieldset-helper-text{margin-top:calc(var(--spacing) * -2);color:var(--wc-muted);font-size:13px}#wirecore-dr .wc-fieldset-error-text{margin-top:calc(var(--spacing) * -2);color:var(--wc-danger);font-size:13px}#wirecore-dr .wc-fieldset-trigger{margin:calc(var(--spacing) * -1);cursor:pointer;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-md);padding:var(--spacing);text-align:start;display:flex}#wirecore-dr .wc-fieldset-trigger:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-fieldset-indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:var(--wc-muted);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex-shrink:0}#wirecore-dr .wc-fieldset-indicator[data-state=open]{rotate:90deg}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-fieldset-indicator{transition-property:none}}#wirecore-dr .wc-fieldset-indicator:where(:dir(rtl),[dir=rtl],[dir=rtl] *):not([data-state=open]){--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}#wirecore-dr .wc-fieldset-content{gap:calc(var(--spacing) * 4);flex-direction:column;display:flex} +#wirecore-dr .wc-inline-code{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line);background-color:var(--wc-bg-2);padding-inline:calc(var(--spacing) * 1.5);padding-block:calc(var(--spacing) * .5);overflow-wrap:anywhere;color:var(--wc-fg);--wc-code-foreground:var(--wc-fg);--wc-code-token-comment:var(--wc-muted);--wc-code-token-constant:var(--wc-info);--wc-code-token-function:var(--wc-info);--wc-code-token-keyword:var(--wc-danger);--wc-code-token-link:var(--wc-info);--wc-code-token-parameter:var(--wc-warn);--wc-code-token-punctuation:var(--wc-muted);--wc-code-token-string-expression:var(--wc-success);--wc-code-token-string:var(--wc-success);font-family:JetBrains Mono Variable,JetBrains Mono,ui-monospace,monospace;font-size:.875em} +#wirecore-dr .wc-input{border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-strong);background-color:var(--wc-bg);width:100%;color:var(--wc-fg);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));align-items:stretch;display:flex;overflow:hidden}#wirecore-dr .wc-input:focus-within{border-color:var(--wc-primary)}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-input{transition-property:none}}#wirecore-dr .wc-input-control{--tw-outline-style:none;background-color:#0000;outline-style:none;flex:1;min-width:0}#wirecore-dr .wc-input-control::placeholder{color:var(--wc-muted)}#wirecore-dr .wc-input-control:disabled{cursor:not-allowed}#wirecore-dr .wc-input-icon{pointer-events:none;color:var(--wc-muted);flex-shrink:0;align-self:center}#wirecore-dr .wc-input-status-icon{pointer-events:none;color:var(--wc-danger);flex-shrink:0;align-self:center}#wirecore-dr .wc-input-prefix{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-color:var(--wc-line-strong);background-color:var(--wc-bg-2);padding-inline:calc(var(--spacing) * 3);font-family:JetBrains Mono Variable,JetBrains Mono,ui-monospace,monospace;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--wc-muted);flex-shrink:0;align-items:center;display:flex}#wirecore-dr .wc-input-suffix{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px;border-color:var(--wc-line-strong);background-color:var(--wc-bg-2);padding-inline:calc(var(--spacing) * 3);font-family:JetBrains Mono Variable,JetBrains Mono,ui-monospace,monospace;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--wc-muted);flex-shrink:0;align-items:center;display:flex}#wirecore-dr .wc-input-spinner{pointer-events:none;color:var(--wc-muted);flex-shrink:0;align-self:center}@media (prefers-reduced-motion:no-preference){#wirecore-dr .wc-input-spinner{animation:var(--animate-spin)}}#wirecore-dr .wc-input-clear{cursor:pointer;color:var(--wc-muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:3.40282e38px;flex-shrink:0;justify-content:center;align-self:center;align-items:center;display:flex}@media (hover:hover){#wirecore-dr .wc-input-clear:hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr .wc-input-clear:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-input-clear{transition-property:none}}#wirecore-dr .wc-input-clear-icon{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-input:is(.wc-input-sm,.wc-input-sm *){height:calc(var(--spacing) * 8);border-radius:var(--radius-md)}#wirecore-dr .wc-input-control:is(.wc-input-sm,.wc-input-sm *){padding-inline:calc(var(--spacing) * 2.5);font-size:13px}#wirecore-dr .wc-input-icon:is(.wc-input-sm,.wc-input-sm *){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5);margin-inline-start:calc(var(--spacing) * 2.5)}#wirecore-dr .wc-input-status-icon:is(.wc-input-sm,.wc-input-sm *),#wirecore-dr .wc-input-spinner:is(.wc-input-sm,.wc-input-sm *){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5);margin-inline-end:calc(var(--spacing) * 2.5)}#wirecore-dr .wc-input-clear:is(.wc-input-sm,.wc-input-sm *){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);margin-inline-end:var(--spacing)}#wirecore-dr .wc-input:not(.wc-input-sm,.wc-input-sm *,.wc-input-lg,.wc-input-lg *){height:calc(var(--spacing) * 10);border-radius:var(--radius-lg)}#wirecore-dr .wc-input-control:not(.wc-input-sm,.wc-input-sm *,.wc-input-lg,.wc-input-lg *){padding-inline:calc(var(--spacing) * 3);font-size:15px}#wirecore-dr .wc-input-icon:not(.wc-input-sm,.wc-input-sm *,.wc-input-lg,.wc-input-lg *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);margin-inline-start:calc(var(--spacing) * 3)}#wirecore-dr .wc-input-status-icon:not(.wc-input-sm,.wc-input-sm *,.wc-input-lg,.wc-input-lg *),#wirecore-dr .wc-input-spinner:not(.wc-input-sm,.wc-input-sm *,.wc-input-lg,.wc-input-lg *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);margin-inline-end:calc(var(--spacing) * 3)}#wirecore-dr .wc-input-clear:not(.wc-input-sm,.wc-input-sm *,.wc-input-lg,.wc-input-lg *){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);margin-inline-end:calc(var(--spacing) * 1.5)}#wirecore-dr .wc-input:is(.wc-input-lg,.wc-input-lg *){height:calc(var(--spacing) * 12);border-radius:10px}#wirecore-dr .wc-input-control:is(.wc-input-lg,.wc-input-lg *){padding-inline:calc(var(--spacing) * 4);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}#wirecore-dr .wc-input-icon:is(.wc-input-lg,.wc-input-lg *){width:18px;height:18px;margin-inline-start:calc(var(--spacing) * 4)}#wirecore-dr .wc-input-status-icon:is(.wc-input-lg,.wc-input-lg *),#wirecore-dr .wc-input-spinner:is(.wc-input-lg,.wc-input-lg *){width:18px;height:18px;margin-inline-end:calc(var(--spacing) * 4)}#wirecore-dr .wc-input-clear:is(.wc-input-lg,.wc-input-lg *){width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7);margin-inline-end:calc(var(--spacing) * 2.5)}#wirecore-dr .wc-input:is(.wc-input-invalid,.wc-input-invalid *),#wirecore-dr .wc-input:is(.wc-input-invalid,.wc-input-invalid *):focus-within{border-color:var(--wc-danger)}#wirecore-dr .wc-input:is(.wc-input-success,.wc-input-success *),#wirecore-dr .wc-input:is(.wc-input-success,.wc-input-success *):focus-within{border-color:var(--wc-success)}#wirecore-dr .wc-input-status-icon:is(.wc-input-success,.wc-input-success *){color:var(--wc-success)}#wirecore-dr .wc-input:is(.wc-input-disabled,.wc-input-disabled *){cursor:not-allowed;border-color:var(--wc-line);background-color:var(--wc-bg-2);color:var(--wc-muted)}#wirecore-dr .wc-input-control:is(.wc-input-has-icon,.wc-input-has-icon *){padding-inline-start:calc(var(--spacing) * 2)}#wirecore-dr .wc-input-control:is(.wc-input-has-status-icon,.wc-input-has-status-icon *){padding-inline-end:calc(var(--spacing) * 2)} +#wirecore-dr .wc-native-select{width:100%;display:flex;position:relative}#wirecore-dr .wc-native-select-select{height:calc(var(--spacing) * 10);cursor:pointer;appearance:none;border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-strong);background-color:var(--wc-bg);width:100%;color:var(--wc-fg);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-outline-style:none;outline-style:none;padding-inline-start:calc(var(--spacing) * 3);padding-inline-end:calc(var(--spacing) * 9);font-size:15px}#wirecore-dr .wc-native-select-select:focus{border-color:var(--wc-primary)}#wirecore-dr .wc-native-select-select:disabled{cursor:not-allowed;border-color:var(--wc-line);background-color:var(--wc-bg-2);color:var(--wc-muted)}#wirecore-dr .wc-native-select-select[aria-invalid=true]{border-color:var(--wc-danger)}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-native-select-select{transition-property:none}}#wirecore-dr .wc-native-select-icon{pointer-events:none;width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y);color:var(--wc-muted);inset-inline-end:calc(var(--spacing) * 3);position:absolute;top:50%}#wirecore-dr .wc-native-select-select:is(.wc-native-select-sm,.wc-native-select-sm *){height:calc(var(--spacing) * 8);border-radius:var(--radius-md);padding-inline-start:calc(var(--spacing) * 2.5);font-size:13px}#wirecore-dr .wc-native-select-select:is(.wc-native-select-lg,.wc-native-select-lg *){height:calc(var(--spacing) * 12);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));border-radius:10px;padding-inline-start:calc(var(--spacing) * 4)} +#wirecore-dr .wc-page-header{gap:calc(var(--spacing) * 3);flex-direction:column;display:flex}#wirecore-dr .wc-page-header-back{align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-sm);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--wc-muted);align-self:flex-start;text-decoration-line:none;display:inline-flex}@media (hover:hover){#wirecore-dr .wc-page-header-back:hover{color:var(--wc-fg)}}#wirecore-dr .wc-page-header-back:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-page-header-back-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);flex-shrink:0}#wirecore-dr .wc-page-header-back-icon:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}#wirecore-dr .wc-page-header-row{justify-content:space-between;align-items:flex-start;column-gap:calc(var(--spacing) * 6);row-gap:calc(var(--spacing) * 3);flex-wrap:wrap;display:flex}#wirecore-dr .wc-page-header-heading{flex:1;flex-basis:calc(var(--spacing) * 80);gap:var(--spacing);flex-direction:column;min-width:0;display:flex}#wirecore-dr .wc-page-header-title-row{align-items:center;column-gap:calc(var(--spacing) * 3);row-gap:var(--spacing);flex-wrap:wrap;display:flex}#wirecore-dr .wc-page-header-title{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-leading:var(--leading-tight);line-height:var(--leading-tight);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight);color:var(--wc-fg);margin:0}#wirecore-dr .wc-page-header-subtitle{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--wc-muted);margin:0}#wirecore-dr .wc-page-header-meta{align-items:center;column-gap:calc(var(--spacing) * 4);row-gap:var(--spacing);color:var(--wc-muted);flex-wrap:wrap;font-size:13px;display:flex}#wirecore-dr .wc-page-header-actions{align-items:center;gap:calc(var(--spacing) * 2);flex-wrap:wrap;display:flex}#wirecore-dr .wc-page-header-tabs{margin-bottom:-1px}#wirecore-dr .wc-page-header-title:is(.wc-page-header-sm,.wc-page-header-sm *){font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}#wirecore-dr .wc-page-header:is(.wc-page-header-divided,.wc-page-header-divided *){border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line);padding-bottom:calc(var(--spacing) * 4)} +#wirecore-dr .wc-spinner{flex-shrink:0;display:inline-flex}#wirecore-dr .wc-spinner-icon{flex-shrink:0;animation:.8s linear infinite spin}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-spinner-icon{animation:2s linear infinite spin}}#wirecore-dr .wc-spinner-label{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}#wirecore-dr .wc-spinner-ring{rotate:-90deg}#wirecore-dr .wc-spinner-ring-track{fill:none;stroke:currentColor;opacity:.25}#wirecore-dr .wc-spinner-ring-range{fill:none;stroke:currentColor;transition-property:stroke-dasharray;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-spinner-ring-range{transition-property:none}}#wirecore-dr .wc-spinner-icon:is(.wc-spinner-sm,.wc-spinner-sm *),#wirecore-dr .wc-spinner-ring:is(.wc-spinner-sm,.wc-spinner-sm *){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-spinner-icon:not(.wc-spinner-sm,.wc-spinner-sm *,.wc-spinner-lg,.wc-spinner-lg *),#wirecore-dr .wc-spinner-ring:not(.wc-spinner-sm,.wc-spinner-sm *,.wc-spinner-lg,.wc-spinner-lg *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}#wirecore-dr .wc-spinner-icon:is(.wc-spinner-lg,.wc-spinner-lg *),#wirecore-dr .wc-spinner-ring:is(.wc-spinner-lg,.wc-spinner-lg *){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)} +#wirecore-dr .wc-tabs{gap:calc(var(--spacing) * 3.5);flex-direction:column;display:flex}#wirecore-dr .wc-tabs[data-orientation=vertical]{gap:calc(var(--spacing) * 6);flex-direction:row}#wirecore-dr .wc-tabs-list{gap:calc(var(--spacing) * 5);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line);display:flex}#wirecore-dr .wc-tabs-list[data-orientation=vertical]{gap:var(--spacing);border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-bottom-style:var(--tw-border-style);border-bottom-width:0;flex-direction:column;flex-shrink:0}#wirecore-dr .wc-tabs-trigger{cursor:pointer;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-sm);padding-bottom:calc(var(--spacing) * 2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;color:var(--wc-muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex-shrink:0;margin-bottom:-1px;display:flex;position:relative}#wirecore-dr .wc-tabs-trigger:after{content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);height:calc(var(--spacing) * .5);inset-inline:0;position:absolute;bottom:0}@media (hover:hover){#wirecore-dr .wc-tabs-trigger:hover{color:var(--wc-fg)}}#wirecore-dr .wc-tabs-trigger:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-tabs-trigger:disabled{cursor:not-allowed;opacity:.4}#wirecore-dr .wc-tabs-trigger[data-selected]{color:var(--wc-fg)}#wirecore-dr .wc-tabs-trigger[data-selected]:after{content:var(--tw-content);background-color:var(--wc-primary)}#wirecore-dr .wc-tabs-trigger[data-orientation=vertical]{padding-block:calc(var(--spacing) * 1.5);margin-inline-end:-1px;margin-bottom:0;padding-inline-end:calc(var(--spacing) * 4)}#wirecore-dr .wc-tabs-trigger[data-orientation=vertical]:after{content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);height:auto;width:calc(var(--spacing) * .5);inset-block:0;inset-inline:auto 0}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-tabs-trigger{transition-property:none}}@media (forced-colors:active){#wirecore-dr .wc-tabs-trigger[data-selected]:after{content:var(--tw-content);content:var(--tw-content);forced-color-adjust:none;background-color:highlight}}#wirecore-dr .wc-tabs-icon{flex-shrink:0;width:15px;height:15px}#wirecore-dr .wc-tabs-content{border-radius:var(--radius-sm)}#wirecore-dr .wc-tabs-content:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-tabs-scroller{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--wc-line);align-items:stretch;min-width:0;display:flex;position:relative}#wirecore-dr .wc-tabs-scroll-list{scrollbar-width:none;border-bottom-style:var(--tw-border-style);border-bottom-width:0;flex:1;min-width:0;overflow:auto hidden}#wirecore-dr .wc-tabs-scroll-list [role=tab]{margin-bottom:0}#wirecore-dr .wc-tabs-scroll-list::-webkit-scrollbar{display:none}#wirecore-dr .wc-tabs-scroll-button{z-index:1;width:calc(var(--spacing) * 7);cursor:pointer;background-color:var(--wc-bg);color:var(--wc-muted);justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:1px}@media (hover:hover){#wirecore-dr .wc-tabs-scroll-button:hover{color:var(--wc-fg)}}#wirecore-dr .wc-tabs-scroll-button[data-side=end]{inset-inline-end:0}#wirecore-dr .wc-tabs-scroll-button[data-side=start]{inset-inline-start:0}#wirecore-dr .wc-tabs-scroll-button:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>svg{--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}#wirecore-dr .wc-tabs-scroll-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}#wirecore-dr .wc-tabs-tab{flex-shrink:0;display:flex;position:relative}#wirecore-dr .wc-tabs-close{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);cursor:pointer;border-radius:var(--radius-sm);color:var(--wc-muted);inset-inline-end:0;justify-content:center;align-items:center;display:flex;position:absolute;top:0}@media (hover:hover){#wirecore-dr .wc-tabs-close:hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr :where([data-orientation=vertical]) .wc-tabs-close{inset-inline-end:var(--spacing);top:calc(var(--spacing) * 1.5)}#wirecore-dr .wc-tabs-close-icon{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}#wirecore-dr .wc-tabs-trigger:is(.wc-tabs-closable,.wc-tabs-closable *){padding-inline-end:calc(var(--spacing) * 6)}#wirecore-dr .wc-tabs-trigger:is(.wc-tabs-closable,.wc-tabs-closable *)[data-orientation=vertical]{padding-inline-end:calc(var(--spacing) * 8)} +#wirecore-dr .wc-textarea{resize:vertical;border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--wc-line-strong);background-color:var(--wc-bg);width:100%;padding-inline:calc(var(--spacing) * 3);--tw-leading:var(--leading-normal);font-size:15px;line-height:var(--leading-normal);color:var(--wc-fg);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-outline-style:none;outline-style:none;padding-block:9px;display:block}#wirecore-dr .wc-textarea::placeholder{color:var(--wc-muted)}#wirecore-dr .wc-textarea:focus{border-color:var(--wc-primary)}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-textarea{transition-property:none}}#wirecore-dr .wc-textarea:is(.wc-textarea-sm,.wc-textarea-sm *){border-radius:var(--radius-md);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1.5);font-size:13px}#wirecore-dr .wc-textarea:is(.wc-textarea-md,.wc-textarea-md *){border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 3);padding-block:9px;font-size:15px}#wirecore-dr .wc-textarea:is(.wc-textarea-lg,.wc-textarea-lg *){padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));border-radius:10px}#wirecore-dr .wc-textarea:is(.wc-textarea-invalid,.wc-textarea-invalid *),#wirecore-dr .wc-textarea:is(.wc-textarea-invalid,.wc-textarea-invalid *):focus{border-color:var(--wc-danger)}#wirecore-dr .wc-textarea:is(.wc-textarea-success,.wc-textarea-success *),#wirecore-dr .wc-textarea:is(.wc-textarea-success,.wc-textarea-success *):focus{border-color:var(--wc-success)}#wirecore-dr .wc-textarea:is(.wc-textarea-disabled,.wc-textarea-disabled *){cursor:not-allowed;resize:none;border-color:var(--wc-line);background-color:var(--wc-bg-2);color:var(--wc-muted)}#wirecore-dr .wc-textarea:is(.wc-textarea-auto-resize,.wc-textarea-auto-resize *){resize:none;overflow:hidden}#wirecore-dr .wc-textarea:is(.wc-textarea-has-trailing,.wc-textarea-has-trailing *){padding-inline-end:calc(var(--spacing) * 10)} +#wirecore-dr .wc-textarea-parts{gap:var(--spacing);flex-direction:column;width:100%;display:flex;position:relative}#wirecore-dr .wc-textarea-parts-trailing{inset-inline-end:calc(var(--spacing) * 2);top:calc(var(--spacing) * 2);align-items:center;gap:var(--spacing);display:flex;position:absolute}#wirecore-dr .wc-textarea-parts-spinner{pointer-events:none;margin:var(--spacing);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:var(--wc-muted);flex-shrink:0;align-self:center}@media (prefers-reduced-motion:no-preference){#wirecore-dr .wc-textarea-parts-spinner{animation:var(--animate-spin)}}#wirecore-dr .wc-textarea-parts-clear{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);cursor:pointer;color:var(--wc-muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:3.40282e38px;flex-shrink:0;justify-content:center;align-self:center;align-items:center;display:flex}@media (hover:hover){#wirecore-dr .wc-textarea-parts-clear:hover{background-color:var(--wc-line);color:var(--wc-fg)}}#wirecore-dr .wc-textarea-parts-clear:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}@media (prefers-reduced-motion:reduce){#wirecore-dr .wc-textarea-parts-clear{transition-property:none}}#wirecore-dr .wc-textarea-parts-clear-icon{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}#wirecore-dr .wc-textarea-parts-status-icon{pointer-events:none;margin:var(--spacing);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:var(--wc-success);flex-shrink:0}#wirecore-dr .wc-textarea-parts-counter{color:var(--wc-muted);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);align-self:flex-end;font-family:JetBrains Mono Variable,JetBrains Mono,ui-monospace,monospace;font-size:11px}#wirecore-dr .wc-textarea-parts-status{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden} +#wirecore-dr dialog.wc-dialog{color:inherit;background:0 0;border:0;max-width:100%;margin:auto;padding:1rem;overflow:visible}#wirecore-dr dialog.wc-dialog:not([open]){display:none}#wirecore-dr dialog.wc-dialog>.wc-dialog-content{max-width:min(400px,100vw - 2rem)}#wirecore-dr dialog.wc-dialog.wc-dialog-sm>.wc-dialog-content{max-width:min(320px,100vw - 2rem)}#wirecore-dr dialog.wc-dialog.wc-dialog-lg>.wc-dialog-content{max-width:min(560px,100vw - 2rem)}#wirecore-dr dialog.wc-dialog.wc-dialog-xl>.wc-dialog-content{max-width:min(800px,100vw - 2rem)}#wirecore-dr dialog.wc-dialog.wc-dialog-full{width:100%}#wirecore-dr dialog.wc-dialog.wc-dialog-full>.wc-dialog-content,#wirecore-dr dialog.wc-dialog.wc-dialog-fullscreen>.wc-dialog-content{max-width:none}#wirecore-dr dialog.wc-dialog.wc-dialog-fullscreen{width:100%;height:100%;max-height:none;margin:0;padding:0}#wirecore-dr dialog.wc-dialog.wc-dialog-top{margin-top:0}#wirecore-dr dialog.wc-dialog.wc-dialog-bottom{margin-bottom:0}#wirecore-dr dialog.wc-dialog.wc-dialog-start{margin-inline-start:0}#wirecore-dr dialog.wc-dialog.wc-dialog-end{margin-inline-end:0}#wirecore-dr dialog.wc-dialog::backdrop{background:#0009}@media (prefers-reduced-motion:no-preference){#wirecore-dr dialog.wc-dialog[open]>.wc-dialog-content{animation:var(--animate-dialog-in)}#wirecore-dr dialog.wc-dialog[open]::backdrop{animation:var(--animate-fade-in)}}#wirecore-dr .wc-mega-menu summary.wc-mega-menu-trigger{list-style:none}#wirecore-dr .wc-mega-menu summary.wc-mega-menu-trigger::-webkit-details-marker{display:none}#wirecore-dr .wc-mega-menu details[open]>summary.wc-mega-menu-trigger{background-color:var(--color-line)}#wirecore-dr .wc-mega-menu details[open]>summary .wc-mega-menu-trigger-icon{rotate:180deg}#wirecore-dr .wc-checkbox:has(>.wc-checkbox-input){position:relative}#wirecore-dr .wc-checkbox:has(>.wc-checkbox-input:disabled){cursor:not-allowed;opacity:.4}#wirecore-dr .wc-checkbox-input{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}#wirecore-dr .wc-checkbox-input:checked+.wc-checkbox-control{border-color:var(--wc-primary);background-color:var(--wc-primary)}@media (forced-colors:active){#wirecore-dr .wc-checkbox-input:checked+.wc-checkbox-control{color:highlighttext;forced-color-adjust:none;background-color:highlight;border-color:highlight}}#wirecore-dr .wc-checkbox-input:not(:checked)+.wc-checkbox-control>.wc-checkbox-icon{display:none}#wirecore-dr .wc-checkbox-input:focus-visible+.wc-checkbox-control{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--wc-fg)}#wirecore-dr .wc-checkbox-input[aria-invalid=true]+.wc-checkbox-control{border-color:var(--wc-danger)} diff --git a/includes/class-wirecore-dr-admin.php b/includes/class-wirecore-dr-admin.php index 815dcc3..3d137db 100644 --- a/includes/class-wirecore-dr-admin.php +++ b/includes/class-wirecore-dr-admin.php @@ -62,10 +62,17 @@ public static function assets($hook) if ($hook !== 'settings_page_' . self::PAGE) { return; } + // WireLayer components, scoped to #wirecore-dr (npm run build:css) + wp_enqueue_style( + 'wirecore-dr-wirelayer', + plugins_url('assets/wirelayer/wirelayer.css', WIRECORE_DR_FILE), + [], + WIRECORE_DR_VERSION + ); wp_enqueue_style( 'wirecore-dr-admin', plugins_url('assets/admin.css', WIRECORE_DR_FILE), - [], + ['wirecore-dr-wirelayer'], WIRECORE_DR_VERSION ); wp_enqueue_script( @@ -94,8 +101,13 @@ public static function assets($hook) ], 'expand' => __('Expand all', 'wirecore-disable-rest'), 'collapse' => __('Collapse all', 'wirecore-disable-rest'), + // _locale=user: the route list in the language of the admin, not of the site 'url' => add_query_arg( - [self::ROUTES_PARAM => 1, '_fields' => self::ROUTES_PARAM], + [ + self::ROUTES_PARAM => 1, + '_fields' => self::ROUTES_PARAM, + '_locale' => 'user', + ], rest_url() ), 'field' => self::ROUTES_PARAM, @@ -357,14 +369,14 @@ public static function page() __('Settings saved.', 'wirecore-disable-rest'), ], 'invalid_ips' => [ - 'warning', + 'warn', __( 'Saved. Invalid IP entries were discarded.', 'wirecore-disable-rest' ), ], 'no_js' => [ - 'error', + 'danger', __( 'The rules could not be read. JavaScript is required to save them.', 'wirecore-disable-rest' @@ -379,7 +391,7 @@ public static function page() __('Settings imported.', 'wirecore-disable-rest'), ], 'import_failed' => [ - 'error', + 'danger', __( 'Import failed. Please choose an export file of this plugin.', 'wirecore-disable-rest' @@ -388,42 +400,165 @@ public static function page() ]; ?>
-

- - -
-

+ +
+
+
+
+
+

+
+
+
- - -
-

-
- + + + + + +
+
+ - $label): ?> - - - + /** + * Inline Lucide icon (ISC license), hidden from assistive technology. + */ + private static function icon($name, $class) + { + $paths = [ + 'check' => '', + 'chevron-down' => '', + 'chevron-right' => '', + 'loader' => '', + 'info' => + '', + 'success' => + '', + 'warn' => + '', + 'danger' => + '', + ]; + printf( + '', + esc_attr($class), + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- fixed SVG markup from the list above + $paths[$name] + ); + } + + /** + * Status message; $status is info, success, warn or danger. + */ + private static function alert($status, $text) + { + ?> +
+ +
+
+
+
+ + /** + * Title and optional description at the top of a card. + */ + private static function card_header($title, $subtitle = '') + { + ?> +
+
+

+ +

+ +
+ + from a translation, the code styled by WireLayer. + */ + private static function code_text($text) + { + echo wp_kses( + str_replace('', '', $text), + ['code' => ['class' => []]] + ); + } + private static function rule_select( $scope, $key, @@ -436,9 +571,10 @@ private static function rule_select( unset($labels['inherit']); } ?> - > - $label): ?> - - - + + + +
+ ); ?>" id="wirecore-dr-routes" class="wirecore-dr-stack"> -

-

-

- - -

+
+ +
+ + +
+
+ +
+ +
+ + + + +
+
+ +
+ +
+ + + + +
+
-

-

- - - - - -

- -

-

-
-

- 'disabled'] - ); ?> -
- -

-

-
-
- -
-
- -
+
+ -

- - - -

- @@ -722,62 +907,72 @@ private static function routes_body() } } ?> -
-

-
+ -
- - ">" aria-label="" /> +
+ + - + + + + + + + @@ -785,13 +980,13 @@ private static function routes_body() $data): $rules = $settings['namespaces'][$namespace] ?? $inherit; ?> -
- - - - - - - - - - - - - $info): - $rules = $settings['routes'][$route] ?? $inherit; ?> - + + + + + + + + + + + + + $info): + $rules = $settings['routes'][$route] ?? $inherit; ?> + - - - - - - - - - -
- - -
+ + + + + + + + + + + + + +
-

-

- - - - - - - - - - $orphan): - list($scope, $rules) = $orphan; ?> - - - - - - - -
- - -
+
+ +
+ + + + + + + + + + $orphan): + list($scope, $rules) = $orphan; ?> + + + + + + + +
+ + +
+
+
+ ); ?>" class="wirecore-dr-stack"> -

- - - - - - - - - - - - - - - - - - - -

-

- - - - - - - -

- - - - - - - - - - - -

- - $labels): ?> - - - - - - - -

- - - - - - - - - - + + + + + - +
+ +
- -
-

+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
+ +
-

-

-

- - - - - - - - - - - 10, - 'sslverify' => $sslverify, - ]); ?> - - - - - - - - - - - - -
–get_error_message()); ?>
- - -

-
- - - -
- -

-

-
- - - - -
- -

-

-

define('WIRECORE_DR_OFF', true);

- -

-
    -
  • + wirecore_dr_error – filters the WP_Error of a blocked request (parameters: error, route pattern, method). If the filter returns true, the request is allowed after all.', + 'Calls the REST API without authentication and shows what logged-out visitors see.', 'wirecore-disable-rest' - ), - ['code' => []] - ); ?>
  • -
  • wirecore_dr_client_ip – filters the client IP, e.g. behind a proxy.', - 'wirecore-disable-rest' - ), - ['code' => []] - ); ?>
  • -
  • + +
    + + + + + + + + + + 10, + 'sslverify' => $sslverify, + ]); ?> + + + + + + + + + + + + +
    –get_error_message() + ); ?>
    +
    + + + + +
    + + +
    + +
    + wirecore_dr_known_namespaces – filters the plugins under “Automatic allowances” (array key => [namespaces]). New entries appear there as a checkbox and can be enabled.', + 'Replaces all current settings with those from the file.', 'wirecore-disable-rest' - ), - ['code' => []] - ); ?>
  • -
  • + + + +
    + wp wirecore-dr (status, routes, set, default, export, import, log).', + 'If a rule locks you out of the admin area, this line in wp-config.php disables all rules:', 'wirecore-disable-rest' - ), - ['code' => []] - ); ?>
  • -
+ ) + ); ?> +

define('WIRECORE_DR_OFF', true);

+ + +
+ +
    +
  • wirecore_dr_error – filters the WP_Error of a blocked request (parameters: error, route pattern, method). If the filter returns true, the request is allowed after all.', + 'wirecore-disable-rest' + ) + ); ?>
  • +
  • wirecore_dr_client_ip – filters the client IP, e.g. behind a proxy.', + 'wirecore-disable-rest' + ) + ); ?>
  • +
  • wirecore_dr_known_namespaces – filters the plugins under “Automatic allowances” (array key => [namespaces]). New entries appear there as a checkbox and can be enabled.', + 'wirecore-disable-rest' + ) + ); ?>
  • +
  • wp wirecore-dr (status, routes, set, default, export, import, log).', + 'wirecore-disable-rest' + ) + ); ?>
  • +
+
'wirecore-disable-rest','plural-forms'=>'nplurals=2; plural=(n != 1);','language'=>'de_DE','project-id-version'=>'WireCore Disable REST 1.0.0','pot-creation-date'=>'2026-10-14T04:40:50+00:00','po-revision-date'=>'2026-10-14 00:00+0000','x-generator'=>'WP-CLI 2.12.0','messages'=>['Disables the WordPress REST API selectively – globally, per namespace or per route, including routes of other plugins.'=>'Sperrt die WordPress REST API gezielt – global, pro Namespace oder pro Route, auch für Routen anderer Plugins.','Settings'=>'Einstellungen','Read'=>'Lesen','Write'=>'Schreiben','automatic'=>'automatisch','(no namespace)'=>'(ohne Namespace)','IPs allowed'=>'IP frei','Users allowed'=>'Benutzer frei','Roles allowed'=>'Rollen frei','IPs denied'=>'IP gesperrt','Roles denied'=>'Rollen gesperrt','Allowed'=>'Freigaben','Denied'=>'Sperren','Expand all'=>'Alle aufklappen','Collapse all'=>'Alle zuklappen','The routes could not be loaded via the REST API:'=>'Die Routen konnten nicht über die REST API geladen werden:','WooCommerce Store API (cart, checkout)'=>'WooCommerce Store API (Warenkorb, Kasse)','oEmbed (embedding posts on other sites)'=>'oEmbed (Einbetten von Beiträgen auf anderen Seiten)','LiteSpeed Cache (QUIC.cloud)'=>'LiteSpeed Cache (QUIC.cloud)','Insufficient permissions.'=>'Keine Berechtigung.','Routes'=>'Routen','Log'=>'Log','Tools'=>'Werkzeuge','Settings saved.'=>'Die Einstellungen wurden gespeichert.','Saved. Invalid IP entries were discarded.'=>'Gespeichert. Ungültige IP-Angaben wurden verworfen.','The rules could not be read. JavaScript is required to save them.'=>'Die Regeln konnten nicht gelesen werden. Zum Speichern wird JavaScript benötigt.','The log has been cleared.'=>'Das Log wurde geleert.','Settings imported.'=>'Die Einstellungen wurden importiert.','Import failed. Please choose an export file of this plugin.'=>'Der Import ist fehlgeschlagen. Bitte eine Exportdatei dieses Plugins wählen.','WIRECORE_DR_OFF is set in wp-config.php: no rules are enforced.'=>'WIRECORE_DR_OFF ist in der wp-config.php gesetzt: Es werden keine Regeln durchgesetzt.','Default rule'=>'Standardregel','Applies to all routes without a custom rule. “Read” covers GET/HEAD, “Write” covers POST/PUT/PATCH/DELETE. The most specific rule wins: route before namespace before automatic allowance before default.'=>'Gilt für alle Routen ohne eigene Regel. „Lesen“ umfasst GET/HEAD, „Schreiben“ POST/PUT/PATCH/DELETE. Die spezifischste Regel gewinnt: Route vor Namespace vor automatischer Freigabe vor Standard.','Quick actions'=>'Schnellaktionen','Block everything for guests'=>'Alles für Gäste sperren','Block everything'=>'Alles sperren','User list (/wp/v2/users) for admins only'=>'Benutzerliste (/wp/v2/users) nur für Admins','Reset custom rules'=>'Eigene Regeln zurücksetzen','Changes take effect only after saving.'=>'Änderungen werden erst beim Speichern übernommen.','Use “Advanced” to additionally allow or deny IP addresses, roles and users for a namespace or route. The entries of a namespace apply to all of its routes.'=>'Über „Erweitert“ lassen sich für einen Namespace oder eine Route zusätzlich IP-Adressen, Rollen und Benutzer freigeben oder sperren. Die Einträge eines Namespace gelten für alle seine Routen.','Loading routes …'=>'Routen werden geladen …','Save rules'=>'Regeln speichern','Advanced:'=>'Erweitert:','Applies to reading and writing. Denials take precedence over allowances and also apply to administrators. Allowances grant access regardless of the rule. For a route, the entries of its namespace apply as well.'=>'Gilt für Lesen und Schreiben. Sperren gehen vor Freigaben und gelten auch für Administratoren. Freigaben öffnen den Zugriff unabhängig von der Regel. Bei einer Route gelten zusätzlich die Einträge ihres Namespace.','Allow'=>'Freigeben','IP addresses / CIDR ranges'=>'IP-Adressen / CIDR-Bereiche','User IDs'=>'Benutzer-IDs','Roles'=>'Rollen','Deny'=>'Sperren','Apply'=>'Übernehmen','Cancel'=>'Abbrechen','Changes are saved with “Save rules”.'=>'Gespeichert wird mit „Regeln speichern“.','Advanced'=>'Erweitert','%1$d routes registered in %2$d namespaces, %3$d of them reachable for logged-out visitors (without whitelists).'=>'%1$d Routen in %2$d Namespaces registriert, davon %3$d für nicht angemeldete Besucher erreichbar (ohne Whitelists).','Search route or namespace …'=>'Route oder Namespace suchen …','Source'=>'Quelle','All sources'=>'Alle Quellen','Status'=>'Status','All routes'=>'Alle Routen','With custom rule'=>'Mit eigener Regel','Reachable for guests'=>'Für Gäste erreichbar','Blocked for guests'=>'Für Gäste gesperrt','%d route'=>'%d Route' . "\0" . '%d Routen','Automatically allowed'=>'Automatisch freigegeben','Route'=>'Route','Methods'=>'Methoden','Effective'=>'Effektiv','Rules without a registered route'=>'Nicht gefundene Regeln','Rules for namespaces or routes that are currently not registered, e.g. because a plugin is deactivated. They are kept until they are set to “Inherit” and nothing is entered under “Advanced”.'=>'Regeln für Namespaces oder Routen, die gerade nicht registriert sind, z. B. weil ein Plugin deaktiviert ist. Sie bleiben erhalten, bis sie auf „Erben“ stehen und unter „Erweitert“ nichts mehr eingetragen ist.','Namespace / route'=>'Namespace / Route','Administrators'=>'Administratoren','Never block administrators (recommended – the block editor needs the REST API)'=>'Administratoren nie sperren (empfohlen – der Block-Editor benötigt die REST API)','HTTPS'=>'HTTPS','Allow the REST API over HTTPS only'=>'REST API nur über HTTPS erlauben','JSONP'=>'JSONP','Disable JSONP responses (?_jsonp=)'=>'JSONP-Antworten (?_jsonp=) deaktivieren','REST links'=>'REST-Links','Remove REST links from HTTP headers, HTML head and RSD'=>'REST-Links aus HTTP-Header, HTML-Head und RSD entfernen','Index'=>'Index','Hide blocked routes and namespaces in the index (/wp-json/)'=>'Gesperrte Routen und Namespaces im Index (/wp-json/) ausblenden','Access'=>'Zugriff','Roles for “Logged-in only”'=>'Rollen für „Nur angemeldet“','No selection = all logged-in users.'=>'Keine Auswahl = alle angemeldeten Nutzer.','Allowed user IDs'=>'Freigegebene Benutzer-IDs','These users are never blocked. One ID per line.'=>'Diese Benutzer werden nie gesperrt. Eine ID pro Zeile.','Allowed IP addresses'=>'Freigegebene IP-Adressen','Applies to all routes. One IP or CIDR range per line, e.g. 203.0.113.5 or 10.0.0.0/8. Allowances for individual routes are available in the route list under “Advanced”. Your current IP: %s'=>'Gilt für alle Routen. Eine IP oder ein CIDR-Bereich pro Zeile, z. B. 203.0.113.5 oder 10.0.0.0/8. Freigaben für einzelne Routen gibt es in der Routenliste unter „Erweitert“. Deine aktuelle IP: %s','Blocked IP addresses'=>'Gesperrte IP-Adressen','These IPs get no access to any route – not even as administrator or through an allowance. One IP or CIDR range per line.'=>'Diese IPs erhalten für alle Routen keinen Zugriff – auch nicht als Administrator oder über eine Freigabe. Eine IP oder ein CIDR-Bereich pro Zeile.','Automatic allowances'=>'Automatische Freigaben','These plugins need the REST API for visitors on the front end (forms, cart, statistics). Their namespaces are public as long as no custom rule is set for the namespace or the route in the route list. The setting has no effect for plugins that are not installed.'=>'Diese Plugins brauchen die REST API für Besucher im Frontend (Formulare, Warenkorb, Statistik). Ihre Namespaces sind öffentlich, solange in der Routenliste keine eigene Regel für den Namespace oder die Route gesetzt ist. Für nicht installierte Plugins hat die Einstellung keine Wirkung.','Error response'=>'Fehlerantwort','Error message'=>'Fehlermeldung','Access to the REST API is restricted.'=>'Der Zugriff auf die REST API ist eingeschränkt.','Status code'=>'Statuscode','401 – Unauthorized'=>'401 – Nicht authentifiziert','403 – Forbidden'=>'403 – Verboten','404 – Not found (route appears not to exist)'=>'404 – Nicht gefunden (Route wirkt nicht vorhanden)','Hardening'=>'Härtung','Logging'=>'Protokoll','Log blocked requests (last %d)'=>'Blockierte Requests protokollieren (letzte %d)','IP address in log'=>'IP-Adresse im Log','Store in full'=>'Vollständig speichern','Store shortened (e.g. 203.0.113.0)'=>'Gekürzt speichern (z. B. 203.0.113.0)','Do not store'=>'Nicht speichern','Applies to new entries. Existing entries remain unchanged until the log is cleared.'=>'Gilt für neue Einträge. Bereits gespeicherte Einträge bleiben unverändert, bis das Log geleert wird.','No HTTPS'=>'Kein HTTPS','Deny list'=>'Sperrliste','The log is disabled. It can be enabled under “Settings”.'=>'Das Log ist deaktiviert. Es lässt sich unter „Einstellungen“ einschalten.','Blocked requests in total: %d'=>'Blockierte Requests insgesamt: %d','Time'=>'Zeit','Method'=>'Methode','IP'=>'IP','User ID'=>'Benutzer-ID','Rule'=>'Regel','No entries.'=>'Keine Einträge.','Clear log'=>'Log leeren','Self-test'=>'Selbsttest','Calls the REST API without authentication and shows what logged-out visitors see.'=>'Ruft die REST API ohne Anmeldung auf und zeigt, was nicht angemeldete Besucher sehen.','Run test'=>'Test starten','URL'=>'URL','Response'=>'Antwort','Export'=>'Export','Export settings'=>'Einstellungen exportieren','Import'=>'Import','Replaces all current settings with those from the file.'=>'Ersetzt alle aktuellen Einstellungen durch die der Datei.','Import settings'=>'Einstellungen importieren','Emergency switch'=>'Notausschalter','If a rule locks you out of the admin area, this line in wp-config.php disables all rules:'=>'Sperrt eine Regel den Zugang zum Admin-Bereich aus, setzt diese Zeile in der wp-config.php alle Regeln außer Kraft:','For developers'=>'Für Entwickler','wirecore_dr_error – filters the WP_Error of a blocked request (parameters: error, route pattern, method). If the filter returns true, the request is allowed after all.'=>'wirecore_dr_error – Filter für den WP_Error einer gesperrten Anfrage (Parameter: Fehler, Routen-Muster, Methode). Gibt der Filter true zurück, wird die Anfrage doch zugelassen.','wirecore_dr_client_ip – filters the client IP, e.g. behind a proxy.'=>'wirecore_dr_client_ip – Filter für die Client-IP, z. B. hinter einem Proxy.','wirecore_dr_known_namespaces – filters the plugins under “Automatic allowances” (array key => [namespaces]). New entries appear there as a checkbox and can be enabled.'=>'wirecore_dr_known_namespaces – Filter für die Plugins unter „Automatische Freigaben“ (Array Schlüssel => [Namespaces]). Neue Einträge erscheinen dort als Checkbox und lassen sich aktivieren.','WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log).'=>'WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log).','The REST API is only available over HTTPS.'=>'Die REST API ist nur über HTTPS erreichbar.','Unknown'=>'Unbekannt','%s (plugin)'=>'%s (Plugin)','%s (must-use plugin)'=>'%s (MU-Plugin)','%s (theme)'=>'%s (Theme)','Inherit'=>'Erben','Public'=>'Öffentlich','Logged-in only'=>'Nur angemeldet','Admins only'=>'Nur Admins','Blocked'=>'Gesperrt','The file is not a valid export of this plugin.'=>'Die Datei ist kein gültiger Export dieses Plugins.','REST API'=>'REST API']]; \ No newline at end of file +return ['domain'=>'wirecore-disable-rest','plural-forms'=>'nplurals=2; plural=(n != 1);','language'=>'de_DE','project-id-version'=>'WireCore Disable REST 1.0.0','pot-creation-date'=>'2026-10-14T04:40:50+00:00','po-revision-date'=>'2026-10-14 00:00+0000','x-generator'=>'WP-CLI 2.12.0','messages'=>['Disables the WordPress REST API selectively – globally, per namespace or per route, including routes of other plugins.'=>'Sperrt die WordPress REST API gezielt – global, pro Namespace oder pro Route, auch für Routen anderer Plugins.','Settings'=>'Einstellungen','Read'=>'Lesen','Write'=>'Schreiben','automatic'=>'automatisch','(no namespace)'=>'(ohne Namespace)','IPs allowed'=>'IP frei','Users allowed'=>'Benutzer frei','Roles allowed'=>'Rollen frei','IPs denied'=>'IP gesperrt','Roles denied'=>'Rollen gesperrt','Allowed'=>'Freigaben','Denied'=>'Sperren','Expand all'=>'Alle aufklappen','Collapse all'=>'Alle zuklappen','The routes could not be loaded via the REST API:'=>'Die Routen konnten nicht über die REST API geladen werden:','WooCommerce Store API (cart, checkout)'=>'WooCommerce Store API (Warenkorb, Kasse)','oEmbed (embedding posts on other sites)'=>'oEmbed (Einbetten von Beiträgen auf anderen Seiten)','LiteSpeed Cache (QUIC.cloud)'=>'LiteSpeed Cache (QUIC.cloud)','Insufficient permissions.'=>'Keine Berechtigung.','Routes'=>'Routen','Log'=>'Log','Tools'=>'Werkzeuge','Settings saved.'=>'Die Einstellungen wurden gespeichert.','Saved. Invalid IP entries were discarded.'=>'Gespeichert. Ungültige IP-Angaben wurden verworfen.','The rules could not be read. JavaScript is required to save them.'=>'Die Regeln konnten nicht gelesen werden. Zum Speichern wird JavaScript benötigt.','The log has been cleared.'=>'Das Log wurde geleert.','Settings imported.'=>'Die Einstellungen wurden importiert.','Import failed. Please choose an export file of this plugin.'=>'Der Import ist fehlgeschlagen. Bitte eine Exportdatei dieses Plugins wählen.','WIRECORE_DR_OFF is set in wp-config.php: no rules are enforced.'=>'WIRECORE_DR_OFF ist in der wp-config.php gesetzt: Es werden keine Regeln durchgesetzt.','Default rule'=>'Standardregel','Applies to all routes without a custom rule. “Read” covers GET/HEAD, “Write” covers POST/PUT/PATCH/DELETE. The most specific rule wins: route before namespace before automatic allowance before default.'=>'Gilt für alle Routen ohne eigene Regel. „Lesen“ umfasst GET/HEAD, „Schreiben“ POST/PUT/PATCH/DELETE. Die spezifischste Regel gewinnt: Route vor Namespace vor automatischer Freigabe vor Standard.','Quick actions'=>'Schnellaktionen','Block everything for guests'=>'Alles für Gäste sperren','Block everything'=>'Alles sperren','User list (/wp/v2/users) for admins only'=>'Benutzerliste (/wp/v2/users) nur für Admins','Reset custom rules'=>'Eigene Regeln zurücksetzen','Changes take effect only after saving.'=>'Änderungen werden erst beim Speichern übernommen.','Use “Advanced” to additionally allow or deny IP addresses, roles and users for a namespace or route. The entries of a namespace apply to all of its routes.'=>'Über „Erweitert“ lassen sich für einen Namespace oder eine Route zusätzlich IP-Adressen, Rollen und Benutzer freigeben oder sperren. Die Einträge eines Namespace gelten für alle seine Routen.','Loading routes …'=>'Routen werden geladen …','Save rules'=>'Regeln speichern','Advanced:'=>'Erweitert:','Applies to reading and writing. Denials take precedence over allowances and also apply to administrators. Allowances grant access regardless of the rule. For a route, the entries of its namespace apply as well.'=>'Gilt für Lesen und Schreiben. Sperren gehen vor Freigaben und gelten auch für Administratoren. Freigaben öffnen den Zugriff unabhängig von der Regel. Bei einer Route gelten zusätzlich die Einträge ihres Namespace.','Allow'=>'Freigeben','IP addresses / CIDR ranges'=>'IP-Adressen / CIDR-Bereiche','User IDs'=>'Benutzer-IDs','Roles'=>'Rollen','Deny'=>'Sperren','Apply'=>'Übernehmen','Cancel'=>'Abbrechen','Changes are saved with “Save rules”.'=>'Gespeichert wird mit „Regeln speichern“.','Advanced'=>'Erweitert','%1$d routes registered in %2$d namespaces, %3$d of them reachable for logged-out visitors (without whitelists).'=>'%1$d Routen in %2$d Namespaces registriert, davon %3$d für nicht angemeldete Besucher erreichbar (ohne Whitelists).','Search route or namespace …'=>'Route oder Namespace suchen …','Source'=>'Quelle','All sources'=>'Alle Quellen','Status'=>'Status','All routes'=>'Alle Routen','With custom rule'=>'Mit eigener Regel','Reachable for guests'=>'Für Gäste erreichbar','Blocked for guests'=>'Für Gäste gesperrt','%d route'=>'%d Route' . "\0" . '%d Routen','Automatically allowed'=>'Automatisch freigegeben','Route'=>'Route','Methods'=>'Methoden','Effective'=>'Effektiv','Rules without a registered route'=>'Nicht gefundene Regeln','Rules for namespaces or routes that are currently not registered, e.g. because a plugin is deactivated. They are kept until they are set to “Inherit” and nothing is entered under “Advanced”.'=>'Regeln für Namespaces oder Routen, die gerade nicht registriert sind, z. B. weil ein Plugin deaktiviert ist. Sie bleiben erhalten, bis sie auf „Erben“ stehen und unter „Erweitert“ nichts mehr eingetragen ist.','Namespace / route'=>'Namespace / Route','Administrators'=>'Administratoren','Never block administrators (recommended – the block editor needs the REST API)'=>'Administratoren nie sperren (empfohlen – der Block-Editor benötigt die REST API)','HTTPS'=>'HTTPS','Allow the REST API over HTTPS only'=>'REST API nur über HTTPS erlauben','JSONP'=>'JSONP','Disable JSONP responses (?_jsonp=)'=>'JSONP-Antworten (?_jsonp=) deaktivieren','REST links'=>'REST-Links','Remove REST links from HTTP headers, HTML head and RSD'=>'REST-Links aus HTTP-Header, HTML-Head und RSD entfernen','Index'=>'Index','Hide blocked routes and namespaces in the index (/wp-json/)'=>'Gesperrte Routen und Namespaces im Index (/wp-json/) ausblenden','Access'=>'Zugriff','Roles for “Logged-in only”'=>'Rollen für „Nur angemeldet“','No selection = all logged-in users.'=>'Keine Auswahl = alle angemeldeten Nutzer.','Allowed user IDs'=>'Freigegebene Benutzer-IDs','These users are never blocked. One ID per line.'=>'Diese Benutzer werden nie gesperrt. Eine ID pro Zeile.','Allowed IP addresses'=>'Freigegebene IP-Adressen','Applies to all routes. One IP or CIDR range per line, e.g. 203.0.113.5 or 10.0.0.0/8. Allowances for individual routes are available in the route list under “Advanced”. Your current IP: %s'=>'Gilt für alle Routen. Eine IP oder ein CIDR-Bereich pro Zeile, z. B. 203.0.113.5 oder 10.0.0.0/8. Freigaben für einzelne Routen gibt es in der Routenliste unter „Erweitert“. Deine aktuelle IP: %s','Blocked IP addresses'=>'Gesperrte IP-Adressen','These IPs get no access to any route – not even as administrator or through an allowance. One IP or CIDR range per line.'=>'Diese IPs erhalten für alle Routen keinen Zugriff – auch nicht als Administrator oder über eine Freigabe. Eine IP oder ein CIDR-Bereich pro Zeile.','Automatic allowances'=>'Automatische Freigaben','These plugins need the REST API for visitors on the front end (forms, cart, statistics). Their namespaces are public as long as no custom rule is set for the namespace or the route in the route list. The setting has no effect for plugins that are not installed.'=>'Diese Plugins brauchen die REST API für Besucher im Frontend (Formulare, Warenkorb, Statistik). Ihre Namespaces sind öffentlich, solange in der Routenliste keine eigene Regel für den Namespace oder die Route gesetzt ist. Für nicht installierte Plugins hat die Einstellung keine Wirkung.','Error response'=>'Fehlerantwort','Error message'=>'Fehlermeldung','Access to the REST API is restricted.'=>'Der Zugriff auf die REST API ist eingeschränkt.','Status code'=>'Statuscode','401 – Unauthorized'=>'401 – Nicht authentifiziert','403 – Forbidden'=>'403 – Verboten','404 – Not found (route appears not to exist)'=>'404 – Nicht gefunden (Route wirkt nicht vorhanden)','Hardening'=>'Härtung','Logging'=>'Protokoll','Log blocked requests (last %d)'=>'Blockierte Requests protokollieren (letzte %d)','IP address in log'=>'IP-Adresse im Log','Store in full'=>'Vollständig speichern','Store shortened (e.g. 203.0.113.0)'=>'Gekürzt speichern (z. B. 203.0.113.0)','Do not store'=>'Nicht speichern','Applies to new entries. Existing entries remain unchanged until the log is cleared.'=>'Gilt für neue Einträge. Bereits gespeicherte Einträge bleiben unverändert, bis das Log geleert wird.','No HTTPS'=>'Kein HTTPS','Deny list'=>'Sperrliste','The log is disabled. It can be enabled under “Settings”.'=>'Das Log ist deaktiviert. Es lässt sich unter „Einstellungen“ einschalten.','Blocked requests in total: %d'=>'Blockierte Requests insgesamt: %d','Time'=>'Zeit','Method'=>'Methode','IP'=>'IP','User ID'=>'Benutzer-ID','Rule'=>'Regel','No entries.'=>'Keine Einträge.','Clear log'=>'Log leeren','Self-test'=>'Selbsttest','Calls the REST API without authentication and shows what logged-out visitors see.'=>'Ruft die REST API ohne Anmeldung auf und zeigt, was nicht angemeldete Besucher sehen.','Run test'=>'Test starten','URL'=>'URL','Response'=>'Antwort','Export'=>'Export','Export settings'=>'Einstellungen exportieren','Import'=>'Import','Replaces all current settings with those from the file.'=>'Ersetzt alle aktuellen Einstellungen durch die der Datei.','Import settings'=>'Einstellungen importieren','Emergency switch'=>'Notausschalter','If a rule locks you out of the admin area, this line in wp-config.php disables all rules:'=>'Sperrt eine Regel den Zugang zum Admin-Bereich aus, setzt diese Zeile in der wp-config.php alle Regeln außer Kraft:','For developers'=>'Für Entwickler','wirecore_dr_error – filters the WP_Error of a blocked request (parameters: error, route pattern, method). If the filter returns true, the request is allowed after all.'=>'wirecore_dr_error – Filter für den WP_Error einer gesperrten Anfrage (Parameter: Fehler, Routen-Muster, Methode). Gibt der Filter true zurück, wird die Anfrage doch zugelassen.','wirecore_dr_client_ip – filters the client IP, e.g. behind a proxy.'=>'wirecore_dr_client_ip – Filter für die Client-IP, z. B. hinter einem Proxy.','wirecore_dr_known_namespaces – filters the plugins under “Automatic allowances” (array key => [namespaces]). New entries appear there as a checkbox and can be enabled.'=>'wirecore_dr_known_namespaces – Filter für die Plugins unter „Automatische Freigaben“ (Array Schlüssel => [Namespaces]). Neue Einträge erscheinen dort als Checkbox und lassen sich aktivieren.','WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log).'=>'WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log).','The REST API is only available over HTTPS.'=>'Die REST API ist nur über HTTPS erreichbar.','Unknown'=>'Unbekannt','%s (plugin)'=>'%s (Plugin)','%s (must-use plugin)'=>'%s (MU-Plugin)','%s (theme)'=>'%s (Theme)','Inherit'=>'Erben','Public'=>'Öffentlich','Logged-in only'=>'Nur angemeldet','Admins only'=>'Nur Admins','Blocked'=>'Gesperrt','The file is not a valid export of this plugin.'=>'Die Datei ist kein gültiger Export dieses Plugins.','REST API'=>'REST API','Save settings'=>'Einstellungen speichern']]; \ No newline at end of file diff --git a/languages/wirecore-disable-rest-de_DE.mo b/languages/wirecore-disable-rest-de_DE.mo index 5d2ed6e..4855b08 100644 Binary files a/languages/wirecore-disable-rest-de_DE.mo and b/languages/wirecore-disable-rest-de_DE.mo differ diff --git a/languages/wirecore-disable-rest-de_DE.po b/languages/wirecore-disable-rest-de_DE.po index 7b39305..a7d0a4d 100644 --- a/languages/wirecore-disable-rest-de_DE.po +++ b/languages/wirecore-disable-rest-de_DE.po @@ -19,7 +19,6 @@ msgstr "" msgid "WireCore Disable REST" msgstr "" -#. Plugin URI of the plugin #. Author URI of the plugin #: wirecore-disable-rest.php msgid "https://wirecore.net" @@ -36,587 +35,592 @@ msgid "WireCore GmbH" msgstr "" #: includes/class-wirecore-dr-admin.php:54 -#: includes/class-wirecore-dr-admin.php:316 +#: includes/class-wirecore-dr-admin.php:344 msgid "Settings" msgstr "Einstellungen" -#: includes/class-wirecore-dr-admin.php:80 -#: includes/class-wirecore-dr-admin.php:413 -#: includes/class-wirecore-dr-admin.php:471 -#: includes/class-wirecore-dr-admin.php:764 -#: includes/class-wirecore-dr-admin.php:786 -#: includes/class-wirecore-dr-admin.php:842 +#: includes/class-wirecore-dr-admin.php:87 +#: includes/class-wirecore-dr-admin.php:578 +#: includes/class-wirecore-dr-admin.php:647 +#: includes/class-wirecore-dr-admin.php:1015 +#: includes/class-wirecore-dr-admin.php:1053 +#: includes/class-wirecore-dr-admin.php:1125 msgid "Read" msgstr "Lesen" -#: includes/class-wirecore-dr-admin.php:81 -#: includes/class-wirecore-dr-admin.php:413 -#: includes/class-wirecore-dr-admin.php:478 -#: includes/class-wirecore-dr-admin.php:771 -#: includes/class-wirecore-dr-admin.php:787 -#: includes/class-wirecore-dr-admin.php:843 +#: includes/class-wirecore-dr-admin.php:88 +#: includes/class-wirecore-dr-admin.php:579 +#: includes/class-wirecore-dr-admin.php:657 +#: includes/class-wirecore-dr-admin.php:1025 +#: includes/class-wirecore-dr-admin.php:1057 +#: includes/class-wirecore-dr-admin.php:1129 msgid "Write" msgstr "Schreiben" -#: includes/class-wirecore-dr-admin.php:82 +#: includes/class-wirecore-dr-admin.php:89 msgid "automatic" msgstr "automatisch" -#: includes/class-wirecore-dr-admin.php:83 -#: includes/class-wirecore-dr-admin.php:741 +#: includes/class-wirecore-dr-admin.php:90 +#: includes/class-wirecore-dr-admin.php:987 msgid "(no namespace)" msgstr "(ohne Namespace)" -#: includes/class-wirecore-dr-admin.php:87 +#: includes/class-wirecore-dr-admin.php:94 msgid "IPs allowed" msgstr "IP frei" -#: includes/class-wirecore-dr-admin.php:88 +#: includes/class-wirecore-dr-admin.php:95 msgid "Users allowed" msgstr "Benutzer frei" -#: includes/class-wirecore-dr-admin.php:89 +#: includes/class-wirecore-dr-admin.php:96 msgid "Roles allowed" msgstr "Rollen frei" -#: includes/class-wirecore-dr-admin.php:90 +#: includes/class-wirecore-dr-admin.php:97 msgid "IPs denied" msgstr "IP gesperrt" -#: includes/class-wirecore-dr-admin.php:91 +#: includes/class-wirecore-dr-admin.php:98 msgid "Roles denied" msgstr "Rollen gesperrt" -#: includes/class-wirecore-dr-admin.php:92 +#: includes/class-wirecore-dr-admin.php:99 msgid "Allowed" msgstr "Freigaben" -#: includes/class-wirecore-dr-admin.php:93 +#: includes/class-wirecore-dr-admin.php:100 msgid "Denied" msgstr "Sperren" -#: includes/class-wirecore-dr-admin.php:95 -#: includes/class-wirecore-dr-admin.php:728 +#: includes/class-wirecore-dr-admin.php:102 +#: includes/class-wirecore-dr-admin.php:970 msgid "Expand all" msgstr "Alle aufklappen" -#: includes/class-wirecore-dr-admin.php:96 +#: includes/class-wirecore-dr-admin.php:103 msgid "Collapse all" msgstr "Alle zuklappen" -#: includes/class-wirecore-dr-admin.php:103 +#: includes/class-wirecore-dr-admin.php:110 msgid "The routes could not be loaded via the REST API:" msgstr "Die Routen konnten nicht über die REST API geladen werden:" -#: includes/class-wirecore-dr-admin.php:155 +#: includes/class-wirecore-dr-admin.php:167 msgid "WooCommerce Store API (cart, checkout)" msgstr "WooCommerce Store API (Warenkorb, Kasse)" -#: includes/class-wirecore-dr-admin.php:159 +#: includes/class-wirecore-dr-admin.php:171 msgid "oEmbed (embedding posts on other sites)" msgstr "oEmbed (Einbetten von Beiträgen auf anderen Seiten)" -#: includes/class-wirecore-dr-admin.php:163 +#: includes/class-wirecore-dr-admin.php:175 msgid "LiteSpeed Cache (QUIC.cloud)" msgstr "LiteSpeed Cache (QUIC.cloud)" -#: includes/class-wirecore-dr-admin.php:269 +#: includes/class-wirecore-dr-admin.php:294 msgid "Insufficient permissions." msgstr "Keine Berechtigung." -#: includes/class-wirecore-dr-admin.php:315 -#: includes/class-wirecore-dr-admin.php:511 +#: includes/class-wirecore-dr-admin.php:343 +#: includes/class-wirecore-dr-admin.php:697 msgid "Routes" msgstr "Routen" -#: includes/class-wirecore-dr-admin.php:317 -#: includes/class-wirecore-dr-admin.php:1063 +#: includes/class-wirecore-dr-admin.php:345 +#: includes/class-wirecore-dr-admin.php:1373 +#: includes/class-wirecore-dr-admin.php:1452 msgid "Log" msgstr "Log" -#: includes/class-wirecore-dr-admin.php:318 +#: includes/class-wirecore-dr-admin.php:346 msgid "Tools" msgstr "Werkzeuge" -#: includes/class-wirecore-dr-admin.php:331 +#: includes/class-wirecore-dr-admin.php:364 msgid "Settings saved." msgstr "Die Einstellungen wurden gespeichert." -#: includes/class-wirecore-dr-admin.php:334 +#: includes/class-wirecore-dr-admin.php:368 msgid "Saved. Invalid IP entries were discarded." msgstr "Gespeichert. Ungültige IP-Angaben wurden verworfen." -#: includes/class-wirecore-dr-admin.php:338 +#: includes/class-wirecore-dr-admin.php:375 msgid "The rules could not be read. JavaScript is required to save them." msgstr "Die Regeln konnten nicht gelesen werden. Zum Speichern wird JavaScript benötigt." -#: includes/class-wirecore-dr-admin.php:345 +#: includes/class-wirecore-dr-admin.php:382 msgid "The log has been cleared." msgstr "Das Log wurde geleert." -#: includes/class-wirecore-dr-admin.php:347 +#: includes/class-wirecore-dr-admin.php:386 msgid "Settings imported." msgstr "Die Einstellungen wurden importiert." -#: includes/class-wirecore-dr-admin.php:350 +#: includes/class-wirecore-dr-admin.php:390 msgid "Import failed. Please choose an export file of this plugin." msgstr "Der Import ist fehlgeschlagen. Bitte eine Exportdatei dieses Plugins wählen." -#: includes/class-wirecore-dr-admin.php:362 +#: includes/class-wirecore-dr-admin.php:426 msgid "WIRECORE_DR_OFF is set in wp-config.php: no rules are enforced." msgstr "WIRECORE_DR_OFF ist in der wp-config.php gesetzt: Es werden keine Regeln durchgesetzt." -#: includes/class-wirecore-dr-admin.php:465 +#: includes/class-wirecore-dr-admin.php:640 msgid "Default rule" msgstr "Standardregel" -#: includes/class-wirecore-dr-admin.php:466 +#: includes/class-wirecore-dr-admin.php:641 msgid "Applies to all routes without a custom rule. “Read” covers GET/HEAD, “Write” covers POST/PUT/PATCH/DELETE. The most specific rule wins: route before namespace before automatic allowance before default." msgstr "Gilt für alle Routen ohne eigene Regel. „Lesen“ umfasst GET/HEAD, „Schreiben“ POST/PUT/PATCH/DELETE. Die spezifischste Regel gewinnt: Route vor Namespace vor automatischer Freigabe vor Standard." -#: includes/class-wirecore-dr-admin.php:487 +#: includes/class-wirecore-dr-admin.php:672 msgid "Quick actions" msgstr "Schnellaktionen" -#: includes/class-wirecore-dr-admin.php:489 +#: includes/class-wirecore-dr-admin.php:676 msgid "Block everything for guests" msgstr "Alles für Gäste sperren" -#: includes/class-wirecore-dr-admin.php:493 +#: includes/class-wirecore-dr-admin.php:680 msgid "Block everything" msgstr "Alles sperren" -#: includes/class-wirecore-dr-admin.php:497 +#: includes/class-wirecore-dr-admin.php:684 msgid "User list (/wp/v2/users) for admins only" msgstr "Benutzerliste (/wp/v2/users) nur für Admins" -#: includes/class-wirecore-dr-admin.php:501 +#: includes/class-wirecore-dr-admin.php:688 msgid "Reset custom rules" msgstr "Eigene Regeln zurücksetzen" -#: includes/class-wirecore-dr-admin.php:505 +#: includes/class-wirecore-dr-admin.php:673 msgid "Changes take effect only after saving." msgstr "Änderungen werden erst beim Speichern übernommen." -#: includes/class-wirecore-dr-admin.php:512 +#: includes/class-wirecore-dr-admin.php:698 msgid "Use “Advanced” to additionally allow or deny IP addresses, roles and users for a namespace or route. The entries of a namespace apply to all of its routes." msgstr "Über „Erweitert“ lassen sich für einen Namespace oder eine Route zusätzlich IP-Adressen, Rollen und Benutzer freigeben oder sperren. Die Einträge eines Namespace gelten für alle seine Routen." -#: includes/class-wirecore-dr-admin.php:517 +#: includes/class-wirecore-dr-admin.php:706 msgid "Loading routes …" msgstr "Routen werden geladen …" -#: includes/class-wirecore-dr-admin.php:524 +#: includes/class-wirecore-dr-admin.php:715 msgid "Save rules" msgstr "Regeln speichern" -#: includes/class-wirecore-dr-admin.php:544 +#: includes/class-wirecore-dr-admin.php:736 msgid "Advanced:" msgstr "Erweitert:" -#: includes/class-wirecore-dr-admin.php:548 +#: includes/class-wirecore-dr-admin.php:740 msgid "Applies to reading and writing. Denials take precedence over allowances and also apply to administrators. Allowances grant access regardless of the rule. For a route, the entries of its namespace apply as well." msgstr "Gilt für Lesen und Schreiben. Sperren gehen vor Freigaben und gelten auch für Administratoren. Freigaben öffnen den Zugriff unabhängig von der Regel. Bei einer Route gelten zusätzlich die Einträge ihres Namespace." -#: includes/class-wirecore-dr-admin.php:554 -#: includes/class-wirecore-dr-admin.php:989 +#: includes/class-wirecore-dr-admin.php:746 +#: includes/class-wirecore-dr-admin.php:1290 msgid "Allow" msgstr "Freigeben" -#: includes/class-wirecore-dr-admin.php:555 -#: includes/class-wirecore-dr-admin.php:574 +#: includes/class-wirecore-dr-admin.php:751 +#: includes/class-wirecore-dr-admin.php:788 msgid "IP addresses / CIDR ranges" msgstr "IP-Adressen / CIDR-Bereiche" -#: includes/class-wirecore-dr-admin.php:560 +#: includes/class-wirecore-dr-admin.php:758 msgid "User IDs" msgstr "Benutzer-IDs" -#: includes/class-wirecore-dr-admin.php:565 -#: includes/class-wirecore-dr-admin.php:579 +#: includes/class-wirecore-dr-admin.php:767 +#: includes/class-wirecore-dr-admin.php:795 msgid "Roles" msgstr "Rollen" -#: includes/class-wirecore-dr-admin.php:573 +#: includes/class-wirecore-dr-admin.php:783 msgid "Deny" msgstr "Sperren" -#: includes/class-wirecore-dr-admin.php:588 +#: includes/class-wirecore-dr-admin.php:821 msgid "Apply" msgstr "Übernehmen" -#: includes/class-wirecore-dr-admin.php:592 +#: includes/class-wirecore-dr-admin.php:817 msgid "Cancel" msgstr "Abbrechen" -#: includes/class-wirecore-dr-admin.php:596 +#: includes/class-wirecore-dr-admin.php:813 msgid "Changes are saved with “Save rules”." msgstr "Gespeichert wird mit „Regeln speichern“." -#: includes/class-wirecore-dr-admin.php:615 +#: includes/class-wirecore-dr-admin.php:841 msgid "Advanced" msgstr "Erweitert" #. translators: 1: number of routes, 2: number of namespaces, 3: routes reachable for guests -#: includes/class-wirecore-dr-admin.php:683 +#: includes/class-wirecore-dr-admin.php:909 #, php-format msgid "%1$d routes registered in %2$d namespaces, %3$d of them reachable for logged-out visitors (without whitelists)." msgstr "%1$d Routen in %2$d Namespaces registriert, davon %3$d für nicht angemeldete Besucher erreichbar (ohne Whitelists)." -#: includes/class-wirecore-dr-admin.php:695 +#: includes/class-wirecore-dr-admin.php:921 +#: includes/class-wirecore-dr-admin.php:924 msgid "Search route or namespace …" msgstr "Route oder Namespace suchen …" -#: includes/class-wirecore-dr-admin.php:699 -#: includes/class-wirecore-dr-admin.php:785 +#: includes/class-wirecore-dr-admin.php:930 +#: includes/class-wirecore-dr-admin.php:1049 msgid "Source" msgstr "Quelle" -#: includes/class-wirecore-dr-admin.php:703 +#: includes/class-wirecore-dr-admin.php:934 msgid "All sources" msgstr "Alle Quellen" -#: includes/class-wirecore-dr-admin.php:710 -#: includes/class-wirecore-dr-admin.php:1203 +#: includes/class-wirecore-dr-admin.php:947 +#: includes/class-wirecore-dr-admin.php:1562 msgid "Status" msgstr "Status" -#: includes/class-wirecore-dr-admin.php:714 +#: includes/class-wirecore-dr-admin.php:951 msgid "All routes" msgstr "Alle Routen" -#: includes/class-wirecore-dr-admin.php:715 +#: includes/class-wirecore-dr-admin.php:955 msgid "With custom rule" msgstr "Mit eigener Regel" -#: includes/class-wirecore-dr-admin.php:719 +#: includes/class-wirecore-dr-admin.php:959 msgid "Reachable for guests" msgstr "Für Gäste erreichbar" -#: includes/class-wirecore-dr-admin.php:723 +#: includes/class-wirecore-dr-admin.php:963 msgid "Blocked for guests" msgstr "Für Gäste gesperrt" #. translators: %d: number of routes -#: includes/class-wirecore-dr-admin.php:749 +#: includes/class-wirecore-dr-admin.php:995 #, php-format msgid "%d route" msgid_plural "%d routes" msgstr[0] "%d Route" msgstr[1] "%d Routen" -#: includes/class-wirecore-dr-admin.php:754 +#: includes/class-wirecore-dr-admin.php:1005 msgid "Automatically allowed" msgstr "Automatisch freigegeben" -#: includes/class-wirecore-dr-admin.php:783 -#: includes/class-wirecore-dr-admin.php:1143 +#: includes/class-wirecore-dr-admin.php:1041 +#: includes/class-wirecore-dr-admin.php:1471 msgid "Route" msgstr "Route" -#: includes/class-wirecore-dr-admin.php:784 +#: includes/class-wirecore-dr-admin.php:1045 msgid "Methods" msgstr "Methoden" -#: includes/class-wirecore-dr-admin.php:788 +#: includes/class-wirecore-dr-admin.php:1061 msgid "Effective" msgstr "Effektiv" -#: includes/class-wirecore-dr-admin.php:830 +#: includes/class-wirecore-dr-admin.php:1111 msgid "Rules without a registered route" msgstr "Nicht gefundene Regeln" -#: includes/class-wirecore-dr-admin.php:834 +#: includes/class-wirecore-dr-admin.php:1112 msgid "Rules for namespaces or routes that are currently not registered, e.g. because a plugin is deactivated. They are kept until they are set to “Inherit” and nothing is entered under “Advanced”." msgstr "Regeln für Namespaces oder Routen, die gerade nicht registriert sind, z. B. weil ein Plugin deaktiviert ist. Sie bleiben erhalten, bis sie auf „Erben“ stehen und unter „Erweitert“ nichts mehr eingetragen ist." -#: includes/class-wirecore-dr-admin.php:841 +#: includes/class-wirecore-dr-admin.php:1121 msgid "Namespace / route" msgstr "Namespace / Route" -#: includes/class-wirecore-dr-admin.php:870 +#: includes/class-wirecore-dr-admin.php:1171 msgid "Administrators" msgstr "Administratoren" -#: includes/class-wirecore-dr-admin.php:871 +#: includes/class-wirecore-dr-admin.php:1172 msgid "Never block administrators (recommended – the block editor needs the REST API)" msgstr "Administratoren nie sperren (empfohlen – der Block-Editor benötigt die REST API)" -#: includes/class-wirecore-dr-admin.php:877 +#: includes/class-wirecore-dr-admin.php:1178 msgid "HTTPS" msgstr "HTTPS" -#: includes/class-wirecore-dr-admin.php:878 +#: includes/class-wirecore-dr-admin.php:1179 msgid "Allow the REST API over HTTPS only" msgstr "REST API nur über HTTPS erlauben" -#: includes/class-wirecore-dr-admin.php:881 +#: includes/class-wirecore-dr-admin.php:1185 msgid "JSONP" msgstr "JSONP" -#: includes/class-wirecore-dr-admin.php:882 +#: includes/class-wirecore-dr-admin.php:1186 msgid "Disable JSONP responses (?_jsonp=)" msgstr "JSONP-Antworten (?_jsonp=) deaktivieren" -#: includes/class-wirecore-dr-admin.php:885 +#: includes/class-wirecore-dr-admin.php:1192 msgid "REST links" msgstr "REST-Links" -#: includes/class-wirecore-dr-admin.php:886 +#: includes/class-wirecore-dr-admin.php:1193 msgid "Remove REST links from HTTP headers, HTML head and RSD" msgstr "REST-Links aus HTTP-Header, HTML-Head und RSD entfernen" -#: includes/class-wirecore-dr-admin.php:892 +#: includes/class-wirecore-dr-admin.php:1199 msgid "Index" msgstr "Index" -#: includes/class-wirecore-dr-admin.php:893 +#: includes/class-wirecore-dr-admin.php:1200 msgid "Hide blocked routes and namespaces in the index (/wp-json/)" msgstr "Gesperrte Routen und Namespaces im Index (/wp-json/) ausblenden" -#: includes/class-wirecore-dr-admin.php:906 +#: includes/class-wirecore-dr-admin.php:1214 msgid "Access" msgstr "Zugriff" -#: includes/class-wirecore-dr-admin.php:909 +#: includes/class-wirecore-dr-admin.php:1216 msgid "Roles for “Logged-in only”" msgstr "Rollen für „Nur angemeldet“" -#: includes/class-wirecore-dr-admin.php:923 +#: includes/class-wirecore-dr-admin.php:1229 msgid "No selection = all logged-in users." msgstr "Keine Auswahl = alle angemeldeten Nutzer." -#: includes/class-wirecore-dr-admin.php:930 +#: includes/class-wirecore-dr-admin.php:1235 msgid "Allowed user IDs" msgstr "Freigegebene Benutzer-IDs" -#: includes/class-wirecore-dr-admin.php:938 +#: includes/class-wirecore-dr-admin.php:1242 msgid "These users are never blocked. One ID per line." msgstr "Diese Benutzer werden nie gesperrt. Eine ID pro Zeile." -#: includes/class-wirecore-dr-admin.php:945 +#: includes/class-wirecore-dr-admin.php:1248 msgid "Allowed IP addresses" msgstr "Freigegebene IP-Adressen" #. translators: %s: current IP address -#: includes/class-wirecore-dr-admin.php:956 +#: includes/class-wirecore-dr-admin.php:1258 #, php-format msgid "Applies to all routes. One IP or CIDR range per line, e.g. 203.0.113.5 or 10.0.0.0/8. Allowances for individual routes are available in the route list under “Advanced”. Your current IP: %s" msgstr "Gilt für alle Routen. Eine IP oder ein CIDR-Bereich pro Zeile, z. B. 203.0.113.5 oder 10.0.0.0/8. Freigaben für einzelne Routen gibt es in der Routenliste unter „Erweitert“. Deine aktuelle IP: %s" -#: includes/class-wirecore-dr-admin.php:966 +#: includes/class-wirecore-dr-admin.php:1267 msgid "Blocked IP addresses" msgstr "Gesperrte IP-Adressen" -#: includes/class-wirecore-dr-admin.php:974 +#: includes/class-wirecore-dr-admin.php:1274 msgid "These IPs get no access to any route – not even as administrator or through an allowance. One IP or CIDR range per line." msgstr "Diese IPs erhalten für alle Routen keinen Zugriff – auch nicht als Administrator oder über eine Freigabe. Eine IP oder ein CIDR-Bereich pro Zeile." -#: includes/class-wirecore-dr-admin.php:982 +#: includes/class-wirecore-dr-admin.php:1283 msgid "Automatic allowances" msgstr "Automatische Freigaben" -#: includes/class-wirecore-dr-admin.php:983 +#: includes/class-wirecore-dr-admin.php:1284 msgid "These plugins need the REST API for visitors on the front end (forms, cart, statistics). Their namespaces are public as long as no custom rule is set for the namespace or the route in the route list. The setting has no effect for plugins that are not installed." msgstr "Diese Plugins brauchen die REST API für Besucher im Frontend (Formulare, Warenkorb, Statistik). Ihre Namespaces sind öffentlich, solange in der Routenliste keine eigene Regel für den Namespace oder die Route gesetzt ist. Für nicht installierte Plugins hat die Einstellung keine Wirkung." -#: includes/class-wirecore-dr-admin.php:1008 +#: includes/class-wirecore-dr-admin.php:1309 msgid "Error response" msgstr "Fehlerantwort" -#: includes/class-wirecore-dr-admin.php:1011 +#: includes/class-wirecore-dr-admin.php:1311 msgid "Error message" msgstr "Fehlermeldung" -#: includes/class-wirecore-dr-admin.php:1017 -#: includes/class-wirecore-dr-guard.php:148 +#: includes/class-wirecore-dr-admin.php:1318 +#: includes/class-wirecore-dr-guard.php:150 msgid "Access to the REST API is restricted." msgstr "Der Zugriff auf die REST API ist eingeschränkt." -#: includes/class-wirecore-dr-admin.php:1023 +#: includes/class-wirecore-dr-admin.php:1325 msgid "Status code" msgstr "Statuscode" -#: includes/class-wirecore-dr-admin.php:1032 +#: includes/class-wirecore-dr-admin.php:1334 msgid "401 – Unauthorized" msgstr "401 – Nicht authentifiziert" -#: includes/class-wirecore-dr-admin.php:1036 +#: includes/class-wirecore-dr-admin.php:1341 msgid "403 – Forbidden" msgstr "403 – Verboten" -#: includes/class-wirecore-dr-admin.php:1040 +#: includes/class-wirecore-dr-admin.php:1348 msgid "404 – Not found (route appears not to exist)" msgstr "404 – Nicht gefunden (Route wirkt nicht vorhanden)" -#: includes/class-wirecore-dr-admin.php:1049 +#: includes/class-wirecore-dr-admin.php:1359 msgid "Hardening" msgstr "Härtung" -#: includes/class-wirecore-dr-admin.php:1066 +#: includes/class-wirecore-dr-admin.php:1382 msgid "Logging" msgstr "Protokoll" #. translators: %d: number of log entries -#: includes/class-wirecore-dr-admin.php:1072 +#: includes/class-wirecore-dr-admin.php:1379 #, php-format msgid "Log blocked requests (last %d)" msgstr "Blockierte Requests protokollieren (letzte %d)" -#: includes/class-wirecore-dr-admin.php:1078 +#: includes/class-wirecore-dr-admin.php:1385 msgid "IP address in log" msgstr "IP-Adresse im Log" -#: includes/class-wirecore-dr-admin.php:1087 +#: includes/class-wirecore-dr-admin.php:1394 msgid "Store in full" msgstr "Vollständig speichern" -#: includes/class-wirecore-dr-admin.php:1091 +#: includes/class-wirecore-dr-admin.php:1401 msgid "Store shortened (e.g. 203.0.113.0)" msgstr "Gekürzt speichern (z. B. 203.0.113.0)" -#: includes/class-wirecore-dr-admin.php:1098 +#: includes/class-wirecore-dr-admin.php:1408 msgid "Do not store" msgstr "Nicht speichern" -#: includes/class-wirecore-dr-admin.php:1100 +#: includes/class-wirecore-dr-admin.php:1415 msgid "Applies to new entries. Existing entries remain unchanged until the log is cleared." msgstr "Gilt für neue Einträge. Bereits gespeicherte Einträge bleiben unverändert, bis das Log geleert wird." -#: includes/class-wirecore-dr-admin.php:1117 +#: includes/class-wirecore-dr-admin.php:1436 msgid "No HTTPS" msgstr "Kein HTTPS" -#: includes/class-wirecore-dr-admin.php:1118 +#: includes/class-wirecore-dr-admin.php:1437 msgid "Deny list" msgstr "Sperrliste" -#: includes/class-wirecore-dr-admin.php:1123 +#: includes/class-wirecore-dr-admin.php:1443 msgid "The log is disabled. It can be enabled under “Settings”." msgstr "Das Log ist deaktiviert. Es lässt sich unter „Einstellungen“ einschalten." #. translators: %d: number of blocked requests -#: includes/class-wirecore-dr-admin.php:1133 +#: includes/class-wirecore-dr-admin.php:1455 #, php-format msgid "Blocked requests in total: %d" msgstr "Blockierte Requests insgesamt: %d" -#: includes/class-wirecore-dr-admin.php:1141 +#: includes/class-wirecore-dr-admin.php:1463 msgid "Time" msgstr "Zeit" -#: includes/class-wirecore-dr-admin.php:1142 +#: includes/class-wirecore-dr-admin.php:1467 msgid "Method" msgstr "Methode" -#: includes/class-wirecore-dr-admin.php:1144 +#: includes/class-wirecore-dr-admin.php:1475 msgid "IP" msgstr "IP" -#: includes/class-wirecore-dr-admin.php:1145 +#: includes/class-wirecore-dr-admin.php:1479 msgid "User ID" msgstr "Benutzer-ID" -#: includes/class-wirecore-dr-admin.php:1146 +#: includes/class-wirecore-dr-admin.php:1483 msgid "Rule" msgstr "Regel" -#: includes/class-wirecore-dr-admin.php:1151 +#: includes/class-wirecore-dr-admin.php:1491 msgid "No entries." msgstr "Keine Einträge." -#: includes/class-wirecore-dr-admin.php:1174 +#: includes/class-wirecore-dr-admin.php:1524 msgid "Clear log" msgstr "Log leeren" -#: includes/class-wirecore-dr-admin.php:1187 +#: includes/class-wirecore-dr-admin.php:1547 msgid "Self-test" msgstr "Selbsttest" -#: includes/class-wirecore-dr-admin.php:1188 +#: includes/class-wirecore-dr-admin.php:1548 msgid "Calls the REST API without authentication and shows what logged-out visitors see." msgstr "Ruft die REST API ohne Anmeldung auf und zeigt, was nicht angemeldete Besucher sehen." -#: includes/class-wirecore-dr-admin.php:1197 +#: includes/class-wirecore-dr-admin.php:1611 msgid "Run test" msgstr "Test starten" -#: includes/class-wirecore-dr-admin.php:1202 +#: includes/class-wirecore-dr-admin.php:1558 msgid "URL" msgstr "URL" -#: includes/class-wirecore-dr-admin.php:1204 +#: includes/class-wirecore-dr-admin.php:1566 msgid "Response" msgstr "Antwort" -#: includes/class-wirecore-dr-admin.php:1234 +#: includes/class-wirecore-dr-admin.php:1616 msgid "Export" msgstr "Export" -#: includes/class-wirecore-dr-admin.php:1241 +#: includes/class-wirecore-dr-admin.php:1622 msgid "Export settings" msgstr "Einstellungen exportieren" -#: includes/class-wirecore-dr-admin.php:1248 +#: includes/class-wirecore-dr-admin.php:1631 +#: includes/class-wirecore-dr-admin.php:1642 msgid "Import" msgstr "Import" -#: includes/class-wirecore-dr-admin.php:1249 +#: includes/class-wirecore-dr-admin.php:1632 msgid "Replaces all current settings with those from the file." msgstr "Ersetzt alle aktuellen Einstellungen durch die der Datei." -#: includes/class-wirecore-dr-admin.php:1260 +#: includes/class-wirecore-dr-admin.php:1646 msgid "Import settings" msgstr "Einstellungen importieren" -#: includes/class-wirecore-dr-admin.php:1267 +#: includes/class-wirecore-dr-admin.php:1655 msgid "Emergency switch" msgstr "Notausschalter" -#: includes/class-wirecore-dr-admin.php:1268 +#: includes/class-wirecore-dr-admin.php:1656 msgid "If a rule locks you out of the admin area, this line in wp-config.php disables all rules:" msgstr "Sperrt eine Regel den Zugang zum Admin-Bereich aus, setzt diese Zeile in der wp-config.php alle Regeln außer Kraft:" -#: includes/class-wirecore-dr-admin.php:1274 +#: includes/class-wirecore-dr-admin.php:1665 msgid "For developers" msgstr "Für Entwickler" -#: includes/class-wirecore-dr-admin.php:1277 +#: includes/class-wirecore-dr-admin.php:1668 msgid "wirecore_dr_error – filters the WP_Error of a blocked request (parameters: error, route pattern, method). If the filter returns true, the request is allowed after all." msgstr "wirecore_dr_error – Filter für den WP_Error einer gesperrten Anfrage (Parameter: Fehler, Routen-Muster, Methode). Gibt der Filter true zurück, wird die Anfrage doch zugelassen." -#: includes/class-wirecore-dr-admin.php:1284 +#: includes/class-wirecore-dr-admin.php:1674 msgid "wirecore_dr_client_ip – filters the client IP, e.g. behind a proxy." msgstr "wirecore_dr_client_ip – Filter für die Client-IP, z. B. hinter einem Proxy." -#: includes/class-wirecore-dr-admin.php:1291 +#: includes/class-wirecore-dr-admin.php:1680 msgid "wirecore_dr_known_namespaces – filters the plugins under “Automatic allowances” (array key => [namespaces]). New entries appear there as a checkbox and can be enabled." msgstr "wirecore_dr_known_namespaces – Filter für die Plugins unter „Automatische Freigaben“ (Array Schlüssel => [Namespaces]). Neue Einträge erscheinen dort als Checkbox und lassen sich aktivieren." -#: includes/class-wirecore-dr-admin.php:1298 +#: includes/class-wirecore-dr-admin.php:1686 msgid "WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log)." msgstr "WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log)." -#: includes/class-wirecore-dr-guard.php:106 +#: includes/class-wirecore-dr-guard.php:108 msgid "The REST API is only available over HTTPS." msgstr "Die REST API ist nur über HTTPS erreichbar." -#: includes/class-wirecore-dr-routes.php:46 +#: includes/class-wirecore-dr-routes.php:48 msgid "Unknown" msgstr "Unbekannt" -#: includes/class-wirecore-dr-routes.php:141 +#. translators: %s: plugin name +#: includes/class-wirecore-dr-routes.php:143 #, php-format msgid "%s (plugin)" msgstr "%s (Plugin)" #. translators: %s: file or folder name of the must-use plugin -#: includes/class-wirecore-dr-routes.php:150 +#: includes/class-wirecore-dr-routes.php:153 #, php-format msgid "%s (must-use plugin)" msgstr "%s (MU-Plugin)" -#: includes/class-wirecore-dr-routes.php:159 +#. translators: %s: theme name +#: includes/class-wirecore-dr-routes.php:164 #, php-format msgid "%s (theme)" msgstr "%s (Theme)" @@ -649,3 +653,7 @@ msgstr "Die Datei ist kein gültiger Export dieses Plugins." #: includes/class-wirecore-dr-admin.php:37 msgid "REST API" msgstr "REST API" + +#: includes/class-wirecore-dr-admin.php:1423 +msgid "Save settings" +msgstr "Einstellungen speichern" diff --git a/languages/wirecore-disable-rest-de_DE_formal.l10n.php b/languages/wirecore-disable-rest-de_DE_formal.l10n.php index f483ccc..b0b279f 100644 --- a/languages/wirecore-disable-rest-de_DE_formal.l10n.php +++ b/languages/wirecore-disable-rest-de_DE_formal.l10n.php @@ -1,2 +1,2 @@ 'wirecore-disable-rest','plural-forms'=>'nplurals=2; plural=(n != 1);','language'=>'de_DE_formal','project-id-version'=>'WireCore Disable REST 1.0.0','pot-creation-date'=>'2026-10-14T04:40:50+00:00','po-revision-date'=>'2026-10-14 00:00+0000','x-generator'=>'WP-CLI 2.12.0','messages'=>['Disables the WordPress REST API selectively – globally, per namespace or per route, including routes of other plugins.'=>'Sperrt die WordPress REST API gezielt – global, pro Namespace oder pro Route, auch für Routen anderer Plugins.','Settings'=>'Einstellungen','Read'=>'Lesen','Write'=>'Schreiben','automatic'=>'automatisch','(no namespace)'=>'(ohne Namespace)','IPs allowed'=>'IP frei','Users allowed'=>'Benutzer frei','Roles allowed'=>'Rollen frei','IPs denied'=>'IP gesperrt','Roles denied'=>'Rollen gesperrt','Allowed'=>'Freigaben','Denied'=>'Sperren','Expand all'=>'Alle aufklappen','Collapse all'=>'Alle zuklappen','The routes could not be loaded via the REST API:'=>'Die Routen konnten nicht über die REST API geladen werden:','WooCommerce Store API (cart, checkout)'=>'WooCommerce Store API (Warenkorb, Kasse)','oEmbed (embedding posts on other sites)'=>'oEmbed (Einbetten von Beiträgen auf anderen Seiten)','LiteSpeed Cache (QUIC.cloud)'=>'LiteSpeed Cache (QUIC.cloud)','Insufficient permissions.'=>'Keine Berechtigung.','Routes'=>'Routen','Log'=>'Log','Tools'=>'Werkzeuge','Settings saved.'=>'Die Einstellungen wurden gespeichert.','Saved. Invalid IP entries were discarded.'=>'Gespeichert. Ungültige IP-Angaben wurden verworfen.','The rules could not be read. JavaScript is required to save them.'=>'Die Regeln konnten nicht gelesen werden. Zum Speichern wird JavaScript benötigt.','The log has been cleared.'=>'Das Log wurde geleert.','Settings imported.'=>'Die Einstellungen wurden importiert.','Import failed. Please choose an export file of this plugin.'=>'Der Import ist fehlgeschlagen. Bitte eine Exportdatei dieses Plugins wählen.','WIRECORE_DR_OFF is set in wp-config.php: no rules are enforced.'=>'WIRECORE_DR_OFF ist in der wp-config.php gesetzt: Es werden keine Regeln durchgesetzt.','Default rule'=>'Standardregel','Applies to all routes without a custom rule. “Read” covers GET/HEAD, “Write” covers POST/PUT/PATCH/DELETE. The most specific rule wins: route before namespace before automatic allowance before default.'=>'Gilt für alle Routen ohne eigene Regel. „Lesen“ umfasst GET/HEAD, „Schreiben“ POST/PUT/PATCH/DELETE. Die spezifischste Regel gewinnt: Route vor Namespace vor automatischer Freigabe vor Standard.','Quick actions'=>'Schnellaktionen','Block everything for guests'=>'Alles für Gäste sperren','Block everything'=>'Alles sperren','User list (/wp/v2/users) for admins only'=>'Benutzerliste (/wp/v2/users) nur für Admins','Reset custom rules'=>'Eigene Regeln zurücksetzen','Changes take effect only after saving.'=>'Änderungen werden erst beim Speichern übernommen.','Use “Advanced” to additionally allow or deny IP addresses, roles and users for a namespace or route. The entries of a namespace apply to all of its routes.'=>'Über „Erweitert“ lassen sich für einen Namespace oder eine Route zusätzlich IP-Adressen, Rollen und Benutzer freigeben oder sperren. Die Einträge eines Namespace gelten für alle seine Routen.','Loading routes …'=>'Routen werden geladen …','Save rules'=>'Regeln speichern','Advanced:'=>'Erweitert:','Applies to reading and writing. Denials take precedence over allowances and also apply to administrators. Allowances grant access regardless of the rule. For a route, the entries of its namespace apply as well.'=>'Gilt für Lesen und Schreiben. Sperren gehen vor Freigaben und gelten auch für Administratoren. Freigaben öffnen den Zugriff unabhängig von der Regel. Bei einer Route gelten zusätzlich die Einträge ihres Namespace.','Allow'=>'Freigeben','IP addresses / CIDR ranges'=>'IP-Adressen / CIDR-Bereiche','User IDs'=>'Benutzer-IDs','Roles'=>'Rollen','Deny'=>'Sperren','Apply'=>'Übernehmen','Cancel'=>'Abbrechen','Changes are saved with “Save rules”.'=>'Gespeichert wird mit „Regeln speichern“.','Advanced'=>'Erweitert','%1$d routes registered in %2$d namespaces, %3$d of them reachable for logged-out visitors (without whitelists).'=>'%1$d Routen in %2$d Namespaces registriert, davon %3$d für nicht angemeldete Besucher erreichbar (ohne Whitelists).','Search route or namespace …'=>'Route oder Namespace suchen …','Source'=>'Quelle','All sources'=>'Alle Quellen','Status'=>'Status','All routes'=>'Alle Routen','With custom rule'=>'Mit eigener Regel','Reachable for guests'=>'Für Gäste erreichbar','Blocked for guests'=>'Für Gäste gesperrt','%d route'=>'%d Route' . "\0" . '%d Routen','Automatically allowed'=>'Automatisch freigegeben','Route'=>'Route','Methods'=>'Methoden','Effective'=>'Effektiv','Rules without a registered route'=>'Nicht gefundene Regeln','Rules for namespaces or routes that are currently not registered, e.g. because a plugin is deactivated. They are kept until they are set to “Inherit” and nothing is entered under “Advanced”.'=>'Regeln für Namespaces oder Routen, die gerade nicht registriert sind, z. B. weil ein Plugin deaktiviert ist. Sie bleiben erhalten, bis sie auf „Erben“ stehen und unter „Erweitert“ nichts mehr eingetragen ist.','Namespace / route'=>'Namespace / Route','Administrators'=>'Administratoren','Never block administrators (recommended – the block editor needs the REST API)'=>'Administratoren nie sperren (empfohlen – der Block-Editor benötigt die REST API)','HTTPS'=>'HTTPS','Allow the REST API over HTTPS only'=>'REST API nur über HTTPS erlauben','JSONP'=>'JSONP','Disable JSONP responses (?_jsonp=)'=>'JSONP-Antworten (?_jsonp=) deaktivieren','REST links'=>'REST-Links','Remove REST links from HTTP headers, HTML head and RSD'=>'REST-Links aus HTTP-Header, HTML-Head und RSD entfernen','Index'=>'Index','Hide blocked routes and namespaces in the index (/wp-json/)'=>'Gesperrte Routen und Namespaces im Index (/wp-json/) ausblenden','Access'=>'Zugriff','Roles for “Logged-in only”'=>'Rollen für „Nur angemeldet“','No selection = all logged-in users.'=>'Keine Auswahl = alle angemeldeten Nutzer.','Allowed user IDs'=>'Freigegebene Benutzer-IDs','These users are never blocked. One ID per line.'=>'Diese Benutzer werden nie gesperrt. Eine ID pro Zeile.','Allowed IP addresses'=>'Freigegebene IP-Adressen','Applies to all routes. One IP or CIDR range per line, e.g. 203.0.113.5 or 10.0.0.0/8. Allowances for individual routes are available in the route list under “Advanced”. Your current IP: %s'=>'Gilt für alle Routen. Eine IP oder ein CIDR-Bereich pro Zeile, z. B. 203.0.113.5 oder 10.0.0.0/8. Freigaben für einzelne Routen gibt es in der Routenliste unter „Erweitert“. Ihre aktuelle IP: %s','Blocked IP addresses'=>'Gesperrte IP-Adressen','These IPs get no access to any route – not even as administrator or through an allowance. One IP or CIDR range per line.'=>'Diese IPs erhalten für alle Routen keinen Zugriff – auch nicht als Administrator oder über eine Freigabe. Eine IP oder ein CIDR-Bereich pro Zeile.','Automatic allowances'=>'Automatische Freigaben','These plugins need the REST API for visitors on the front end (forms, cart, statistics). Their namespaces are public as long as no custom rule is set for the namespace or the route in the route list. The setting has no effect for plugins that are not installed.'=>'Diese Plugins brauchen die REST API für Besucher im Frontend (Formulare, Warenkorb, Statistik). Ihre Namespaces sind öffentlich, solange in der Routenliste keine eigene Regel für den Namespace oder die Route gesetzt ist. Für nicht installierte Plugins hat die Einstellung keine Wirkung.','Error response'=>'Fehlerantwort','Error message'=>'Fehlermeldung','Access to the REST API is restricted.'=>'Der Zugriff auf die REST API ist eingeschränkt.','Status code'=>'Statuscode','401 – Unauthorized'=>'401 – Nicht authentifiziert','403 – Forbidden'=>'403 – Verboten','404 – Not found (route appears not to exist)'=>'404 – Nicht gefunden (Route wirkt nicht vorhanden)','Hardening'=>'Härtung','Logging'=>'Protokoll','Log blocked requests (last %d)'=>'Blockierte Requests protokollieren (letzte %d)','IP address in log'=>'IP-Adresse im Log','Store in full'=>'Vollständig speichern','Store shortened (e.g. 203.0.113.0)'=>'Gekürzt speichern (z. B. 203.0.113.0)','Do not store'=>'Nicht speichern','Applies to new entries. Existing entries remain unchanged until the log is cleared.'=>'Gilt für neue Einträge. Bereits gespeicherte Einträge bleiben unverändert, bis das Log geleert wird.','No HTTPS'=>'Kein HTTPS','Deny list'=>'Sperrliste','The log is disabled. It can be enabled under “Settings”.'=>'Das Log ist deaktiviert. Es lässt sich unter „Einstellungen“ einschalten.','Blocked requests in total: %d'=>'Blockierte Requests insgesamt: %d','Time'=>'Zeit','Method'=>'Methode','IP'=>'IP','User ID'=>'Benutzer-ID','Rule'=>'Regel','No entries.'=>'Keine Einträge.','Clear log'=>'Log leeren','Self-test'=>'Selbsttest','Calls the REST API without authentication and shows what logged-out visitors see.'=>'Ruft die REST API ohne Anmeldung auf und zeigt, was nicht angemeldete Besucher sehen.','Run test'=>'Test starten','URL'=>'URL','Response'=>'Antwort','Export'=>'Export','Export settings'=>'Einstellungen exportieren','Import'=>'Import','Replaces all current settings with those from the file.'=>'Ersetzt alle aktuellen Einstellungen durch die der Datei.','Import settings'=>'Einstellungen importieren','Emergency switch'=>'Notausschalter','If a rule locks you out of the admin area, this line in wp-config.php disables all rules:'=>'Sperrt eine Regel den Zugang zum Admin-Bereich aus, setzt diese Zeile in der wp-config.php alle Regeln außer Kraft:','For developers'=>'Für Entwickler','wirecore_dr_error – filters the WP_Error of a blocked request (parameters: error, route pattern, method). If the filter returns true, the request is allowed after all.'=>'wirecore_dr_error – Filter für den WP_Error einer gesperrten Anfrage (Parameter: Fehler, Routen-Muster, Methode). Gibt der Filter true zurück, wird die Anfrage doch zugelassen.','wirecore_dr_client_ip – filters the client IP, e.g. behind a proxy.'=>'wirecore_dr_client_ip – Filter für die Client-IP, z. B. hinter einem Proxy.','wirecore_dr_known_namespaces – filters the plugins under “Automatic allowances” (array key => [namespaces]). New entries appear there as a checkbox and can be enabled.'=>'wirecore_dr_known_namespaces – Filter für die Plugins unter „Automatische Freigaben“ (Array Schlüssel => [Namespaces]). Neue Einträge erscheinen dort als Checkbox und lassen sich aktivieren.','WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log).'=>'WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log).','The REST API is only available over HTTPS.'=>'Die REST API ist nur über HTTPS erreichbar.','Unknown'=>'Unbekannt','%s (plugin)'=>'%s (Plugin)','%s (must-use plugin)'=>'%s (MU-Plugin)','%s (theme)'=>'%s (Theme)','Inherit'=>'Erben','Public'=>'Öffentlich','Logged-in only'=>'Nur angemeldet','Admins only'=>'Nur Admins','Blocked'=>'Gesperrt','The file is not a valid export of this plugin.'=>'Die Datei ist kein gültiger Export dieses Plugins.','REST API'=>'REST API']]; \ No newline at end of file +return ['domain'=>'wirecore-disable-rest','plural-forms'=>'nplurals=2; plural=(n != 1);','language'=>'de_DE_formal','project-id-version'=>'WireCore Disable REST 1.0.0','pot-creation-date'=>'2026-10-14T04:40:50+00:00','po-revision-date'=>'2026-10-14 00:00+0000','x-generator'=>'WP-CLI 2.12.0','messages'=>['Disables the WordPress REST API selectively – globally, per namespace or per route, including routes of other plugins.'=>'Sperrt die WordPress REST API gezielt – global, pro Namespace oder pro Route, auch für Routen anderer Plugins.','Settings'=>'Einstellungen','Read'=>'Lesen','Write'=>'Schreiben','automatic'=>'automatisch','(no namespace)'=>'(ohne Namespace)','IPs allowed'=>'IP frei','Users allowed'=>'Benutzer frei','Roles allowed'=>'Rollen frei','IPs denied'=>'IP gesperrt','Roles denied'=>'Rollen gesperrt','Allowed'=>'Freigaben','Denied'=>'Sperren','Expand all'=>'Alle aufklappen','Collapse all'=>'Alle zuklappen','The routes could not be loaded via the REST API:'=>'Die Routen konnten nicht über die REST API geladen werden:','WooCommerce Store API (cart, checkout)'=>'WooCommerce Store API (Warenkorb, Kasse)','oEmbed (embedding posts on other sites)'=>'oEmbed (Einbetten von Beiträgen auf anderen Seiten)','LiteSpeed Cache (QUIC.cloud)'=>'LiteSpeed Cache (QUIC.cloud)','Insufficient permissions.'=>'Keine Berechtigung.','Routes'=>'Routen','Log'=>'Log','Tools'=>'Werkzeuge','Settings saved.'=>'Die Einstellungen wurden gespeichert.','Saved. Invalid IP entries were discarded.'=>'Gespeichert. Ungültige IP-Angaben wurden verworfen.','The rules could not be read. JavaScript is required to save them.'=>'Die Regeln konnten nicht gelesen werden. Zum Speichern wird JavaScript benötigt.','The log has been cleared.'=>'Das Log wurde geleert.','Settings imported.'=>'Die Einstellungen wurden importiert.','Import failed. Please choose an export file of this plugin.'=>'Der Import ist fehlgeschlagen. Bitte eine Exportdatei dieses Plugins wählen.','WIRECORE_DR_OFF is set in wp-config.php: no rules are enforced.'=>'WIRECORE_DR_OFF ist in der wp-config.php gesetzt: Es werden keine Regeln durchgesetzt.','Default rule'=>'Standardregel','Applies to all routes without a custom rule. “Read” covers GET/HEAD, “Write” covers POST/PUT/PATCH/DELETE. The most specific rule wins: route before namespace before automatic allowance before default.'=>'Gilt für alle Routen ohne eigene Regel. „Lesen“ umfasst GET/HEAD, „Schreiben“ POST/PUT/PATCH/DELETE. Die spezifischste Regel gewinnt: Route vor Namespace vor automatischer Freigabe vor Standard.','Quick actions'=>'Schnellaktionen','Block everything for guests'=>'Alles für Gäste sperren','Block everything'=>'Alles sperren','User list (/wp/v2/users) for admins only'=>'Benutzerliste (/wp/v2/users) nur für Admins','Reset custom rules'=>'Eigene Regeln zurücksetzen','Changes take effect only after saving.'=>'Änderungen werden erst beim Speichern übernommen.','Use “Advanced” to additionally allow or deny IP addresses, roles and users for a namespace or route. The entries of a namespace apply to all of its routes.'=>'Über „Erweitert“ lassen sich für einen Namespace oder eine Route zusätzlich IP-Adressen, Rollen und Benutzer freigeben oder sperren. Die Einträge eines Namespace gelten für alle seine Routen.','Loading routes …'=>'Routen werden geladen …','Save rules'=>'Regeln speichern','Advanced:'=>'Erweitert:','Applies to reading and writing. Denials take precedence over allowances and also apply to administrators. Allowances grant access regardless of the rule. For a route, the entries of its namespace apply as well.'=>'Gilt für Lesen und Schreiben. Sperren gehen vor Freigaben und gelten auch für Administratoren. Freigaben öffnen den Zugriff unabhängig von der Regel. Bei einer Route gelten zusätzlich die Einträge ihres Namespace.','Allow'=>'Freigeben','IP addresses / CIDR ranges'=>'IP-Adressen / CIDR-Bereiche','User IDs'=>'Benutzer-IDs','Roles'=>'Rollen','Deny'=>'Sperren','Apply'=>'Übernehmen','Cancel'=>'Abbrechen','Changes are saved with “Save rules”.'=>'Gespeichert wird mit „Regeln speichern“.','Advanced'=>'Erweitert','%1$d routes registered in %2$d namespaces, %3$d of them reachable for logged-out visitors (without whitelists).'=>'%1$d Routen in %2$d Namespaces registriert, davon %3$d für nicht angemeldete Besucher erreichbar (ohne Whitelists).','Search route or namespace …'=>'Route oder Namespace suchen …','Source'=>'Quelle','All sources'=>'Alle Quellen','Status'=>'Status','All routes'=>'Alle Routen','With custom rule'=>'Mit eigener Regel','Reachable for guests'=>'Für Gäste erreichbar','Blocked for guests'=>'Für Gäste gesperrt','%d route'=>'%d Route' . "\0" . '%d Routen','Automatically allowed'=>'Automatisch freigegeben','Route'=>'Route','Methods'=>'Methoden','Effective'=>'Effektiv','Rules without a registered route'=>'Nicht gefundene Regeln','Rules for namespaces or routes that are currently not registered, e.g. because a plugin is deactivated. They are kept until they are set to “Inherit” and nothing is entered under “Advanced”.'=>'Regeln für Namespaces oder Routen, die gerade nicht registriert sind, z. B. weil ein Plugin deaktiviert ist. Sie bleiben erhalten, bis sie auf „Erben“ stehen und unter „Erweitert“ nichts mehr eingetragen ist.','Namespace / route'=>'Namespace / Route','Administrators'=>'Administratoren','Never block administrators (recommended – the block editor needs the REST API)'=>'Administratoren nie sperren (empfohlen – der Block-Editor benötigt die REST API)','HTTPS'=>'HTTPS','Allow the REST API over HTTPS only'=>'REST API nur über HTTPS erlauben','JSONP'=>'JSONP','Disable JSONP responses (?_jsonp=)'=>'JSONP-Antworten (?_jsonp=) deaktivieren','REST links'=>'REST-Links','Remove REST links from HTTP headers, HTML head and RSD'=>'REST-Links aus HTTP-Header, HTML-Head und RSD entfernen','Index'=>'Index','Hide blocked routes and namespaces in the index (/wp-json/)'=>'Gesperrte Routen und Namespaces im Index (/wp-json/) ausblenden','Access'=>'Zugriff','Roles for “Logged-in only”'=>'Rollen für „Nur angemeldet“','No selection = all logged-in users.'=>'Keine Auswahl = alle angemeldeten Nutzer.','Allowed user IDs'=>'Freigegebene Benutzer-IDs','These users are never blocked. One ID per line.'=>'Diese Benutzer werden nie gesperrt. Eine ID pro Zeile.','Allowed IP addresses'=>'Freigegebene IP-Adressen','Applies to all routes. One IP or CIDR range per line, e.g. 203.0.113.5 or 10.0.0.0/8. Allowances for individual routes are available in the route list under “Advanced”. Your current IP: %s'=>'Gilt für alle Routen. Eine IP oder ein CIDR-Bereich pro Zeile, z. B. 203.0.113.5 oder 10.0.0.0/8. Freigaben für einzelne Routen gibt es in der Routenliste unter „Erweitert“. Ihre aktuelle IP: %s','Blocked IP addresses'=>'Gesperrte IP-Adressen','These IPs get no access to any route – not even as administrator or through an allowance. One IP or CIDR range per line.'=>'Diese IPs erhalten für alle Routen keinen Zugriff – auch nicht als Administrator oder über eine Freigabe. Eine IP oder ein CIDR-Bereich pro Zeile.','Automatic allowances'=>'Automatische Freigaben','These plugins need the REST API for visitors on the front end (forms, cart, statistics). Their namespaces are public as long as no custom rule is set for the namespace or the route in the route list. The setting has no effect for plugins that are not installed.'=>'Diese Plugins brauchen die REST API für Besucher im Frontend (Formulare, Warenkorb, Statistik). Ihre Namespaces sind öffentlich, solange in der Routenliste keine eigene Regel für den Namespace oder die Route gesetzt ist. Für nicht installierte Plugins hat die Einstellung keine Wirkung.','Error response'=>'Fehlerantwort','Error message'=>'Fehlermeldung','Access to the REST API is restricted.'=>'Der Zugriff auf die REST API ist eingeschränkt.','Status code'=>'Statuscode','401 – Unauthorized'=>'401 – Nicht authentifiziert','403 – Forbidden'=>'403 – Verboten','404 – Not found (route appears not to exist)'=>'404 – Nicht gefunden (Route wirkt nicht vorhanden)','Hardening'=>'Härtung','Logging'=>'Protokoll','Log blocked requests (last %d)'=>'Blockierte Requests protokollieren (letzte %d)','IP address in log'=>'IP-Adresse im Log','Store in full'=>'Vollständig speichern','Store shortened (e.g. 203.0.113.0)'=>'Gekürzt speichern (z. B. 203.0.113.0)','Do not store'=>'Nicht speichern','Applies to new entries. Existing entries remain unchanged until the log is cleared.'=>'Gilt für neue Einträge. Bereits gespeicherte Einträge bleiben unverändert, bis das Log geleert wird.','No HTTPS'=>'Kein HTTPS','Deny list'=>'Sperrliste','The log is disabled. It can be enabled under “Settings”.'=>'Das Log ist deaktiviert. Es lässt sich unter „Einstellungen“ einschalten.','Blocked requests in total: %d'=>'Blockierte Requests insgesamt: %d','Time'=>'Zeit','Method'=>'Methode','IP'=>'IP','User ID'=>'Benutzer-ID','Rule'=>'Regel','No entries.'=>'Keine Einträge.','Clear log'=>'Log leeren','Self-test'=>'Selbsttest','Calls the REST API without authentication and shows what logged-out visitors see.'=>'Ruft die REST API ohne Anmeldung auf und zeigt, was nicht angemeldete Besucher sehen.','Run test'=>'Test starten','URL'=>'URL','Response'=>'Antwort','Export'=>'Export','Export settings'=>'Einstellungen exportieren','Import'=>'Import','Replaces all current settings with those from the file.'=>'Ersetzt alle aktuellen Einstellungen durch die der Datei.','Import settings'=>'Einstellungen importieren','Emergency switch'=>'Notausschalter','If a rule locks you out of the admin area, this line in wp-config.php disables all rules:'=>'Sperrt eine Regel den Zugang zum Admin-Bereich aus, setzt diese Zeile in der wp-config.php alle Regeln außer Kraft:','For developers'=>'Für Entwickler','wirecore_dr_error – filters the WP_Error of a blocked request (parameters: error, route pattern, method). If the filter returns true, the request is allowed after all.'=>'wirecore_dr_error – Filter für den WP_Error einer gesperrten Anfrage (Parameter: Fehler, Routen-Muster, Methode). Gibt der Filter true zurück, wird die Anfrage doch zugelassen.','wirecore_dr_client_ip – filters the client IP, e.g. behind a proxy.'=>'wirecore_dr_client_ip – Filter für die Client-IP, z. B. hinter einem Proxy.','wirecore_dr_known_namespaces – filters the plugins under “Automatic allowances” (array key => [namespaces]). New entries appear there as a checkbox and can be enabled.'=>'wirecore_dr_known_namespaces – Filter für die Plugins unter „Automatische Freigaben“ (Array Schlüssel => [Namespaces]). Neue Einträge erscheinen dort als Checkbox und lassen sich aktivieren.','WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log).'=>'WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log).','The REST API is only available over HTTPS.'=>'Die REST API ist nur über HTTPS erreichbar.','Unknown'=>'Unbekannt','%s (plugin)'=>'%s (Plugin)','%s (must-use plugin)'=>'%s (MU-Plugin)','%s (theme)'=>'%s (Theme)','Inherit'=>'Erben','Public'=>'Öffentlich','Logged-in only'=>'Nur angemeldet','Admins only'=>'Nur Admins','Blocked'=>'Gesperrt','The file is not a valid export of this plugin.'=>'Die Datei ist kein gültiger Export dieses Plugins.','REST API'=>'REST API','Save settings'=>'Einstellungen speichern']]; \ No newline at end of file diff --git a/languages/wirecore-disable-rest-de_DE_formal.mo b/languages/wirecore-disable-rest-de_DE_formal.mo index d3af256..646d50f 100644 Binary files a/languages/wirecore-disable-rest-de_DE_formal.mo and b/languages/wirecore-disable-rest-de_DE_formal.mo differ diff --git a/languages/wirecore-disable-rest-de_DE_formal.po b/languages/wirecore-disable-rest-de_DE_formal.po index ecf5390..45af05e 100644 --- a/languages/wirecore-disable-rest-de_DE_formal.po +++ b/languages/wirecore-disable-rest-de_DE_formal.po @@ -19,7 +19,6 @@ msgstr "" msgid "WireCore Disable REST" msgstr "" -#. Plugin URI of the plugin #. Author URI of the plugin #: wirecore-disable-rest.php msgid "https://wirecore.net" @@ -36,587 +35,592 @@ msgid "WireCore GmbH" msgstr "" #: includes/class-wirecore-dr-admin.php:54 -#: includes/class-wirecore-dr-admin.php:316 +#: includes/class-wirecore-dr-admin.php:344 msgid "Settings" msgstr "Einstellungen" -#: includes/class-wirecore-dr-admin.php:80 -#: includes/class-wirecore-dr-admin.php:413 -#: includes/class-wirecore-dr-admin.php:471 -#: includes/class-wirecore-dr-admin.php:764 -#: includes/class-wirecore-dr-admin.php:786 -#: includes/class-wirecore-dr-admin.php:842 +#: includes/class-wirecore-dr-admin.php:87 +#: includes/class-wirecore-dr-admin.php:578 +#: includes/class-wirecore-dr-admin.php:647 +#: includes/class-wirecore-dr-admin.php:1015 +#: includes/class-wirecore-dr-admin.php:1053 +#: includes/class-wirecore-dr-admin.php:1125 msgid "Read" msgstr "Lesen" -#: includes/class-wirecore-dr-admin.php:81 -#: includes/class-wirecore-dr-admin.php:413 -#: includes/class-wirecore-dr-admin.php:478 -#: includes/class-wirecore-dr-admin.php:771 -#: includes/class-wirecore-dr-admin.php:787 -#: includes/class-wirecore-dr-admin.php:843 +#: includes/class-wirecore-dr-admin.php:88 +#: includes/class-wirecore-dr-admin.php:579 +#: includes/class-wirecore-dr-admin.php:657 +#: includes/class-wirecore-dr-admin.php:1025 +#: includes/class-wirecore-dr-admin.php:1057 +#: includes/class-wirecore-dr-admin.php:1129 msgid "Write" msgstr "Schreiben" -#: includes/class-wirecore-dr-admin.php:82 +#: includes/class-wirecore-dr-admin.php:89 msgid "automatic" msgstr "automatisch" -#: includes/class-wirecore-dr-admin.php:83 -#: includes/class-wirecore-dr-admin.php:741 +#: includes/class-wirecore-dr-admin.php:90 +#: includes/class-wirecore-dr-admin.php:987 msgid "(no namespace)" msgstr "(ohne Namespace)" -#: includes/class-wirecore-dr-admin.php:87 +#: includes/class-wirecore-dr-admin.php:94 msgid "IPs allowed" msgstr "IP frei" -#: includes/class-wirecore-dr-admin.php:88 +#: includes/class-wirecore-dr-admin.php:95 msgid "Users allowed" msgstr "Benutzer frei" -#: includes/class-wirecore-dr-admin.php:89 +#: includes/class-wirecore-dr-admin.php:96 msgid "Roles allowed" msgstr "Rollen frei" -#: includes/class-wirecore-dr-admin.php:90 +#: includes/class-wirecore-dr-admin.php:97 msgid "IPs denied" msgstr "IP gesperrt" -#: includes/class-wirecore-dr-admin.php:91 +#: includes/class-wirecore-dr-admin.php:98 msgid "Roles denied" msgstr "Rollen gesperrt" -#: includes/class-wirecore-dr-admin.php:92 +#: includes/class-wirecore-dr-admin.php:99 msgid "Allowed" msgstr "Freigaben" -#: includes/class-wirecore-dr-admin.php:93 +#: includes/class-wirecore-dr-admin.php:100 msgid "Denied" msgstr "Sperren" -#: includes/class-wirecore-dr-admin.php:95 -#: includes/class-wirecore-dr-admin.php:728 +#: includes/class-wirecore-dr-admin.php:102 +#: includes/class-wirecore-dr-admin.php:970 msgid "Expand all" msgstr "Alle aufklappen" -#: includes/class-wirecore-dr-admin.php:96 +#: includes/class-wirecore-dr-admin.php:103 msgid "Collapse all" msgstr "Alle zuklappen" -#: includes/class-wirecore-dr-admin.php:103 +#: includes/class-wirecore-dr-admin.php:110 msgid "The routes could not be loaded via the REST API:" msgstr "Die Routen konnten nicht über die REST API geladen werden:" -#: includes/class-wirecore-dr-admin.php:155 +#: includes/class-wirecore-dr-admin.php:167 msgid "WooCommerce Store API (cart, checkout)" msgstr "WooCommerce Store API (Warenkorb, Kasse)" -#: includes/class-wirecore-dr-admin.php:159 +#: includes/class-wirecore-dr-admin.php:171 msgid "oEmbed (embedding posts on other sites)" msgstr "oEmbed (Einbetten von Beiträgen auf anderen Seiten)" -#: includes/class-wirecore-dr-admin.php:163 +#: includes/class-wirecore-dr-admin.php:175 msgid "LiteSpeed Cache (QUIC.cloud)" msgstr "LiteSpeed Cache (QUIC.cloud)" -#: includes/class-wirecore-dr-admin.php:269 +#: includes/class-wirecore-dr-admin.php:294 msgid "Insufficient permissions." msgstr "Keine Berechtigung." -#: includes/class-wirecore-dr-admin.php:315 -#: includes/class-wirecore-dr-admin.php:511 +#: includes/class-wirecore-dr-admin.php:343 +#: includes/class-wirecore-dr-admin.php:697 msgid "Routes" msgstr "Routen" -#: includes/class-wirecore-dr-admin.php:317 -#: includes/class-wirecore-dr-admin.php:1063 +#: includes/class-wirecore-dr-admin.php:345 +#: includes/class-wirecore-dr-admin.php:1373 +#: includes/class-wirecore-dr-admin.php:1452 msgid "Log" msgstr "Log" -#: includes/class-wirecore-dr-admin.php:318 +#: includes/class-wirecore-dr-admin.php:346 msgid "Tools" msgstr "Werkzeuge" -#: includes/class-wirecore-dr-admin.php:331 +#: includes/class-wirecore-dr-admin.php:364 msgid "Settings saved." msgstr "Die Einstellungen wurden gespeichert." -#: includes/class-wirecore-dr-admin.php:334 +#: includes/class-wirecore-dr-admin.php:368 msgid "Saved. Invalid IP entries were discarded." msgstr "Gespeichert. Ungültige IP-Angaben wurden verworfen." -#: includes/class-wirecore-dr-admin.php:338 +#: includes/class-wirecore-dr-admin.php:375 msgid "The rules could not be read. JavaScript is required to save them." msgstr "Die Regeln konnten nicht gelesen werden. Zum Speichern wird JavaScript benötigt." -#: includes/class-wirecore-dr-admin.php:345 +#: includes/class-wirecore-dr-admin.php:382 msgid "The log has been cleared." msgstr "Das Log wurde geleert." -#: includes/class-wirecore-dr-admin.php:347 +#: includes/class-wirecore-dr-admin.php:386 msgid "Settings imported." msgstr "Die Einstellungen wurden importiert." -#: includes/class-wirecore-dr-admin.php:350 +#: includes/class-wirecore-dr-admin.php:390 msgid "Import failed. Please choose an export file of this plugin." msgstr "Der Import ist fehlgeschlagen. Bitte eine Exportdatei dieses Plugins wählen." -#: includes/class-wirecore-dr-admin.php:362 +#: includes/class-wirecore-dr-admin.php:426 msgid "WIRECORE_DR_OFF is set in wp-config.php: no rules are enforced." msgstr "WIRECORE_DR_OFF ist in der wp-config.php gesetzt: Es werden keine Regeln durchgesetzt." -#: includes/class-wirecore-dr-admin.php:465 +#: includes/class-wirecore-dr-admin.php:640 msgid "Default rule" msgstr "Standardregel" -#: includes/class-wirecore-dr-admin.php:466 +#: includes/class-wirecore-dr-admin.php:641 msgid "Applies to all routes without a custom rule. “Read” covers GET/HEAD, “Write” covers POST/PUT/PATCH/DELETE. The most specific rule wins: route before namespace before automatic allowance before default." msgstr "Gilt für alle Routen ohne eigene Regel. „Lesen“ umfasst GET/HEAD, „Schreiben“ POST/PUT/PATCH/DELETE. Die spezifischste Regel gewinnt: Route vor Namespace vor automatischer Freigabe vor Standard." -#: includes/class-wirecore-dr-admin.php:487 +#: includes/class-wirecore-dr-admin.php:672 msgid "Quick actions" msgstr "Schnellaktionen" -#: includes/class-wirecore-dr-admin.php:489 +#: includes/class-wirecore-dr-admin.php:676 msgid "Block everything for guests" msgstr "Alles für Gäste sperren" -#: includes/class-wirecore-dr-admin.php:493 +#: includes/class-wirecore-dr-admin.php:680 msgid "Block everything" msgstr "Alles sperren" -#: includes/class-wirecore-dr-admin.php:497 +#: includes/class-wirecore-dr-admin.php:684 msgid "User list (/wp/v2/users) for admins only" msgstr "Benutzerliste (/wp/v2/users) nur für Admins" -#: includes/class-wirecore-dr-admin.php:501 +#: includes/class-wirecore-dr-admin.php:688 msgid "Reset custom rules" msgstr "Eigene Regeln zurücksetzen" -#: includes/class-wirecore-dr-admin.php:505 +#: includes/class-wirecore-dr-admin.php:673 msgid "Changes take effect only after saving." msgstr "Änderungen werden erst beim Speichern übernommen." -#: includes/class-wirecore-dr-admin.php:512 +#: includes/class-wirecore-dr-admin.php:698 msgid "Use “Advanced” to additionally allow or deny IP addresses, roles and users for a namespace or route. The entries of a namespace apply to all of its routes." msgstr "Über „Erweitert“ lassen sich für einen Namespace oder eine Route zusätzlich IP-Adressen, Rollen und Benutzer freigeben oder sperren. Die Einträge eines Namespace gelten für alle seine Routen." -#: includes/class-wirecore-dr-admin.php:517 +#: includes/class-wirecore-dr-admin.php:706 msgid "Loading routes …" msgstr "Routen werden geladen …" -#: includes/class-wirecore-dr-admin.php:524 +#: includes/class-wirecore-dr-admin.php:715 msgid "Save rules" msgstr "Regeln speichern" -#: includes/class-wirecore-dr-admin.php:544 +#: includes/class-wirecore-dr-admin.php:736 msgid "Advanced:" msgstr "Erweitert:" -#: includes/class-wirecore-dr-admin.php:548 +#: includes/class-wirecore-dr-admin.php:740 msgid "Applies to reading and writing. Denials take precedence over allowances and also apply to administrators. Allowances grant access regardless of the rule. For a route, the entries of its namespace apply as well." msgstr "Gilt für Lesen und Schreiben. Sperren gehen vor Freigaben und gelten auch für Administratoren. Freigaben öffnen den Zugriff unabhängig von der Regel. Bei einer Route gelten zusätzlich die Einträge ihres Namespace." -#: includes/class-wirecore-dr-admin.php:554 -#: includes/class-wirecore-dr-admin.php:989 +#: includes/class-wirecore-dr-admin.php:746 +#: includes/class-wirecore-dr-admin.php:1290 msgid "Allow" msgstr "Freigeben" -#: includes/class-wirecore-dr-admin.php:555 -#: includes/class-wirecore-dr-admin.php:574 +#: includes/class-wirecore-dr-admin.php:751 +#: includes/class-wirecore-dr-admin.php:788 msgid "IP addresses / CIDR ranges" msgstr "IP-Adressen / CIDR-Bereiche" -#: includes/class-wirecore-dr-admin.php:560 +#: includes/class-wirecore-dr-admin.php:758 msgid "User IDs" msgstr "Benutzer-IDs" -#: includes/class-wirecore-dr-admin.php:565 -#: includes/class-wirecore-dr-admin.php:579 +#: includes/class-wirecore-dr-admin.php:767 +#: includes/class-wirecore-dr-admin.php:795 msgid "Roles" msgstr "Rollen" -#: includes/class-wirecore-dr-admin.php:573 +#: includes/class-wirecore-dr-admin.php:783 msgid "Deny" msgstr "Sperren" -#: includes/class-wirecore-dr-admin.php:588 +#: includes/class-wirecore-dr-admin.php:821 msgid "Apply" msgstr "Übernehmen" -#: includes/class-wirecore-dr-admin.php:592 +#: includes/class-wirecore-dr-admin.php:817 msgid "Cancel" msgstr "Abbrechen" -#: includes/class-wirecore-dr-admin.php:596 +#: includes/class-wirecore-dr-admin.php:813 msgid "Changes are saved with “Save rules”." msgstr "Gespeichert wird mit „Regeln speichern“." -#: includes/class-wirecore-dr-admin.php:615 +#: includes/class-wirecore-dr-admin.php:841 msgid "Advanced" msgstr "Erweitert" #. translators: 1: number of routes, 2: number of namespaces, 3: routes reachable for guests -#: includes/class-wirecore-dr-admin.php:683 +#: includes/class-wirecore-dr-admin.php:909 #, php-format msgid "%1$d routes registered in %2$d namespaces, %3$d of them reachable for logged-out visitors (without whitelists)." msgstr "%1$d Routen in %2$d Namespaces registriert, davon %3$d für nicht angemeldete Besucher erreichbar (ohne Whitelists)." -#: includes/class-wirecore-dr-admin.php:695 +#: includes/class-wirecore-dr-admin.php:921 +#: includes/class-wirecore-dr-admin.php:924 msgid "Search route or namespace …" msgstr "Route oder Namespace suchen …" -#: includes/class-wirecore-dr-admin.php:699 -#: includes/class-wirecore-dr-admin.php:785 +#: includes/class-wirecore-dr-admin.php:930 +#: includes/class-wirecore-dr-admin.php:1049 msgid "Source" msgstr "Quelle" -#: includes/class-wirecore-dr-admin.php:703 +#: includes/class-wirecore-dr-admin.php:934 msgid "All sources" msgstr "Alle Quellen" -#: includes/class-wirecore-dr-admin.php:710 -#: includes/class-wirecore-dr-admin.php:1203 +#: includes/class-wirecore-dr-admin.php:947 +#: includes/class-wirecore-dr-admin.php:1562 msgid "Status" msgstr "Status" -#: includes/class-wirecore-dr-admin.php:714 +#: includes/class-wirecore-dr-admin.php:951 msgid "All routes" msgstr "Alle Routen" -#: includes/class-wirecore-dr-admin.php:715 +#: includes/class-wirecore-dr-admin.php:955 msgid "With custom rule" msgstr "Mit eigener Regel" -#: includes/class-wirecore-dr-admin.php:719 +#: includes/class-wirecore-dr-admin.php:959 msgid "Reachable for guests" msgstr "Für Gäste erreichbar" -#: includes/class-wirecore-dr-admin.php:723 +#: includes/class-wirecore-dr-admin.php:963 msgid "Blocked for guests" msgstr "Für Gäste gesperrt" #. translators: %d: number of routes -#: includes/class-wirecore-dr-admin.php:749 +#: includes/class-wirecore-dr-admin.php:995 #, php-format msgid "%d route" msgid_plural "%d routes" msgstr[0] "%d Route" msgstr[1] "%d Routen" -#: includes/class-wirecore-dr-admin.php:754 +#: includes/class-wirecore-dr-admin.php:1005 msgid "Automatically allowed" msgstr "Automatisch freigegeben" -#: includes/class-wirecore-dr-admin.php:783 -#: includes/class-wirecore-dr-admin.php:1143 +#: includes/class-wirecore-dr-admin.php:1041 +#: includes/class-wirecore-dr-admin.php:1471 msgid "Route" msgstr "Route" -#: includes/class-wirecore-dr-admin.php:784 +#: includes/class-wirecore-dr-admin.php:1045 msgid "Methods" msgstr "Methoden" -#: includes/class-wirecore-dr-admin.php:788 +#: includes/class-wirecore-dr-admin.php:1061 msgid "Effective" msgstr "Effektiv" -#: includes/class-wirecore-dr-admin.php:830 +#: includes/class-wirecore-dr-admin.php:1111 msgid "Rules without a registered route" msgstr "Nicht gefundene Regeln" -#: includes/class-wirecore-dr-admin.php:834 +#: includes/class-wirecore-dr-admin.php:1112 msgid "Rules for namespaces or routes that are currently not registered, e.g. because a plugin is deactivated. They are kept until they are set to “Inherit” and nothing is entered under “Advanced”." msgstr "Regeln für Namespaces oder Routen, die gerade nicht registriert sind, z. B. weil ein Plugin deaktiviert ist. Sie bleiben erhalten, bis sie auf „Erben“ stehen und unter „Erweitert“ nichts mehr eingetragen ist." -#: includes/class-wirecore-dr-admin.php:841 +#: includes/class-wirecore-dr-admin.php:1121 msgid "Namespace / route" msgstr "Namespace / Route" -#: includes/class-wirecore-dr-admin.php:870 +#: includes/class-wirecore-dr-admin.php:1171 msgid "Administrators" msgstr "Administratoren" -#: includes/class-wirecore-dr-admin.php:871 +#: includes/class-wirecore-dr-admin.php:1172 msgid "Never block administrators (recommended – the block editor needs the REST API)" msgstr "Administratoren nie sperren (empfohlen – der Block-Editor benötigt die REST API)" -#: includes/class-wirecore-dr-admin.php:877 +#: includes/class-wirecore-dr-admin.php:1178 msgid "HTTPS" msgstr "HTTPS" -#: includes/class-wirecore-dr-admin.php:878 +#: includes/class-wirecore-dr-admin.php:1179 msgid "Allow the REST API over HTTPS only" msgstr "REST API nur über HTTPS erlauben" -#: includes/class-wirecore-dr-admin.php:881 +#: includes/class-wirecore-dr-admin.php:1185 msgid "JSONP" msgstr "JSONP" -#: includes/class-wirecore-dr-admin.php:882 +#: includes/class-wirecore-dr-admin.php:1186 msgid "Disable JSONP responses (?_jsonp=)" msgstr "JSONP-Antworten (?_jsonp=) deaktivieren" -#: includes/class-wirecore-dr-admin.php:885 +#: includes/class-wirecore-dr-admin.php:1192 msgid "REST links" msgstr "REST-Links" -#: includes/class-wirecore-dr-admin.php:886 +#: includes/class-wirecore-dr-admin.php:1193 msgid "Remove REST links from HTTP headers, HTML head and RSD" msgstr "REST-Links aus HTTP-Header, HTML-Head und RSD entfernen" -#: includes/class-wirecore-dr-admin.php:892 +#: includes/class-wirecore-dr-admin.php:1199 msgid "Index" msgstr "Index" -#: includes/class-wirecore-dr-admin.php:893 +#: includes/class-wirecore-dr-admin.php:1200 msgid "Hide blocked routes and namespaces in the index (/wp-json/)" msgstr "Gesperrte Routen und Namespaces im Index (/wp-json/) ausblenden" -#: includes/class-wirecore-dr-admin.php:906 +#: includes/class-wirecore-dr-admin.php:1214 msgid "Access" msgstr "Zugriff" -#: includes/class-wirecore-dr-admin.php:909 +#: includes/class-wirecore-dr-admin.php:1216 msgid "Roles for “Logged-in only”" msgstr "Rollen für „Nur angemeldet“" -#: includes/class-wirecore-dr-admin.php:923 +#: includes/class-wirecore-dr-admin.php:1229 msgid "No selection = all logged-in users." msgstr "Keine Auswahl = alle angemeldeten Nutzer." -#: includes/class-wirecore-dr-admin.php:930 +#: includes/class-wirecore-dr-admin.php:1235 msgid "Allowed user IDs" msgstr "Freigegebene Benutzer-IDs" -#: includes/class-wirecore-dr-admin.php:938 +#: includes/class-wirecore-dr-admin.php:1242 msgid "These users are never blocked. One ID per line." msgstr "Diese Benutzer werden nie gesperrt. Eine ID pro Zeile." -#: includes/class-wirecore-dr-admin.php:945 +#: includes/class-wirecore-dr-admin.php:1248 msgid "Allowed IP addresses" msgstr "Freigegebene IP-Adressen" #. translators: %s: current IP address -#: includes/class-wirecore-dr-admin.php:956 +#: includes/class-wirecore-dr-admin.php:1258 #, php-format msgid "Applies to all routes. One IP or CIDR range per line, e.g. 203.0.113.5 or 10.0.0.0/8. Allowances for individual routes are available in the route list under “Advanced”. Your current IP: %s" msgstr "Gilt für alle Routen. Eine IP oder ein CIDR-Bereich pro Zeile, z. B. 203.0.113.5 oder 10.0.0.0/8. Freigaben für einzelne Routen gibt es in der Routenliste unter „Erweitert“. Ihre aktuelle IP: %s" -#: includes/class-wirecore-dr-admin.php:966 +#: includes/class-wirecore-dr-admin.php:1267 msgid "Blocked IP addresses" msgstr "Gesperrte IP-Adressen" -#: includes/class-wirecore-dr-admin.php:974 +#: includes/class-wirecore-dr-admin.php:1274 msgid "These IPs get no access to any route – not even as administrator or through an allowance. One IP or CIDR range per line." msgstr "Diese IPs erhalten für alle Routen keinen Zugriff – auch nicht als Administrator oder über eine Freigabe. Eine IP oder ein CIDR-Bereich pro Zeile." -#: includes/class-wirecore-dr-admin.php:982 +#: includes/class-wirecore-dr-admin.php:1283 msgid "Automatic allowances" msgstr "Automatische Freigaben" -#: includes/class-wirecore-dr-admin.php:983 +#: includes/class-wirecore-dr-admin.php:1284 msgid "These plugins need the REST API for visitors on the front end (forms, cart, statistics). Their namespaces are public as long as no custom rule is set for the namespace or the route in the route list. The setting has no effect for plugins that are not installed." msgstr "Diese Plugins brauchen die REST API für Besucher im Frontend (Formulare, Warenkorb, Statistik). Ihre Namespaces sind öffentlich, solange in der Routenliste keine eigene Regel für den Namespace oder die Route gesetzt ist. Für nicht installierte Plugins hat die Einstellung keine Wirkung." -#: includes/class-wirecore-dr-admin.php:1008 +#: includes/class-wirecore-dr-admin.php:1309 msgid "Error response" msgstr "Fehlerantwort" -#: includes/class-wirecore-dr-admin.php:1011 +#: includes/class-wirecore-dr-admin.php:1311 msgid "Error message" msgstr "Fehlermeldung" -#: includes/class-wirecore-dr-admin.php:1017 -#: includes/class-wirecore-dr-guard.php:148 +#: includes/class-wirecore-dr-admin.php:1318 +#: includes/class-wirecore-dr-guard.php:150 msgid "Access to the REST API is restricted." msgstr "Der Zugriff auf die REST API ist eingeschränkt." -#: includes/class-wirecore-dr-admin.php:1023 +#: includes/class-wirecore-dr-admin.php:1325 msgid "Status code" msgstr "Statuscode" -#: includes/class-wirecore-dr-admin.php:1032 +#: includes/class-wirecore-dr-admin.php:1334 msgid "401 – Unauthorized" msgstr "401 – Nicht authentifiziert" -#: includes/class-wirecore-dr-admin.php:1036 +#: includes/class-wirecore-dr-admin.php:1341 msgid "403 – Forbidden" msgstr "403 – Verboten" -#: includes/class-wirecore-dr-admin.php:1040 +#: includes/class-wirecore-dr-admin.php:1348 msgid "404 – Not found (route appears not to exist)" msgstr "404 – Nicht gefunden (Route wirkt nicht vorhanden)" -#: includes/class-wirecore-dr-admin.php:1049 +#: includes/class-wirecore-dr-admin.php:1359 msgid "Hardening" msgstr "Härtung" -#: includes/class-wirecore-dr-admin.php:1066 +#: includes/class-wirecore-dr-admin.php:1382 msgid "Logging" msgstr "Protokoll" #. translators: %d: number of log entries -#: includes/class-wirecore-dr-admin.php:1072 +#: includes/class-wirecore-dr-admin.php:1379 #, php-format msgid "Log blocked requests (last %d)" msgstr "Blockierte Requests protokollieren (letzte %d)" -#: includes/class-wirecore-dr-admin.php:1078 +#: includes/class-wirecore-dr-admin.php:1385 msgid "IP address in log" msgstr "IP-Adresse im Log" -#: includes/class-wirecore-dr-admin.php:1087 +#: includes/class-wirecore-dr-admin.php:1394 msgid "Store in full" msgstr "Vollständig speichern" -#: includes/class-wirecore-dr-admin.php:1091 +#: includes/class-wirecore-dr-admin.php:1401 msgid "Store shortened (e.g. 203.0.113.0)" msgstr "Gekürzt speichern (z. B. 203.0.113.0)" -#: includes/class-wirecore-dr-admin.php:1098 +#: includes/class-wirecore-dr-admin.php:1408 msgid "Do not store" msgstr "Nicht speichern" -#: includes/class-wirecore-dr-admin.php:1100 +#: includes/class-wirecore-dr-admin.php:1415 msgid "Applies to new entries. Existing entries remain unchanged until the log is cleared." msgstr "Gilt für neue Einträge. Bereits gespeicherte Einträge bleiben unverändert, bis das Log geleert wird." -#: includes/class-wirecore-dr-admin.php:1117 +#: includes/class-wirecore-dr-admin.php:1436 msgid "No HTTPS" msgstr "Kein HTTPS" -#: includes/class-wirecore-dr-admin.php:1118 +#: includes/class-wirecore-dr-admin.php:1437 msgid "Deny list" msgstr "Sperrliste" -#: includes/class-wirecore-dr-admin.php:1123 +#: includes/class-wirecore-dr-admin.php:1443 msgid "The log is disabled. It can be enabled under “Settings”." msgstr "Das Log ist deaktiviert. Es lässt sich unter „Einstellungen“ einschalten." #. translators: %d: number of blocked requests -#: includes/class-wirecore-dr-admin.php:1133 +#: includes/class-wirecore-dr-admin.php:1455 #, php-format msgid "Blocked requests in total: %d" msgstr "Blockierte Requests insgesamt: %d" -#: includes/class-wirecore-dr-admin.php:1141 +#: includes/class-wirecore-dr-admin.php:1463 msgid "Time" msgstr "Zeit" -#: includes/class-wirecore-dr-admin.php:1142 +#: includes/class-wirecore-dr-admin.php:1467 msgid "Method" msgstr "Methode" -#: includes/class-wirecore-dr-admin.php:1144 +#: includes/class-wirecore-dr-admin.php:1475 msgid "IP" msgstr "IP" -#: includes/class-wirecore-dr-admin.php:1145 +#: includes/class-wirecore-dr-admin.php:1479 msgid "User ID" msgstr "Benutzer-ID" -#: includes/class-wirecore-dr-admin.php:1146 +#: includes/class-wirecore-dr-admin.php:1483 msgid "Rule" msgstr "Regel" -#: includes/class-wirecore-dr-admin.php:1151 +#: includes/class-wirecore-dr-admin.php:1491 msgid "No entries." msgstr "Keine Einträge." -#: includes/class-wirecore-dr-admin.php:1174 +#: includes/class-wirecore-dr-admin.php:1524 msgid "Clear log" msgstr "Log leeren" -#: includes/class-wirecore-dr-admin.php:1187 +#: includes/class-wirecore-dr-admin.php:1547 msgid "Self-test" msgstr "Selbsttest" -#: includes/class-wirecore-dr-admin.php:1188 +#: includes/class-wirecore-dr-admin.php:1548 msgid "Calls the REST API without authentication and shows what logged-out visitors see." msgstr "Ruft die REST API ohne Anmeldung auf und zeigt, was nicht angemeldete Besucher sehen." -#: includes/class-wirecore-dr-admin.php:1197 +#: includes/class-wirecore-dr-admin.php:1611 msgid "Run test" msgstr "Test starten" -#: includes/class-wirecore-dr-admin.php:1202 +#: includes/class-wirecore-dr-admin.php:1558 msgid "URL" msgstr "URL" -#: includes/class-wirecore-dr-admin.php:1204 +#: includes/class-wirecore-dr-admin.php:1566 msgid "Response" msgstr "Antwort" -#: includes/class-wirecore-dr-admin.php:1234 +#: includes/class-wirecore-dr-admin.php:1616 msgid "Export" msgstr "Export" -#: includes/class-wirecore-dr-admin.php:1241 +#: includes/class-wirecore-dr-admin.php:1622 msgid "Export settings" msgstr "Einstellungen exportieren" -#: includes/class-wirecore-dr-admin.php:1248 +#: includes/class-wirecore-dr-admin.php:1631 +#: includes/class-wirecore-dr-admin.php:1642 msgid "Import" msgstr "Import" -#: includes/class-wirecore-dr-admin.php:1249 +#: includes/class-wirecore-dr-admin.php:1632 msgid "Replaces all current settings with those from the file." msgstr "Ersetzt alle aktuellen Einstellungen durch die der Datei." -#: includes/class-wirecore-dr-admin.php:1260 +#: includes/class-wirecore-dr-admin.php:1646 msgid "Import settings" msgstr "Einstellungen importieren" -#: includes/class-wirecore-dr-admin.php:1267 +#: includes/class-wirecore-dr-admin.php:1655 msgid "Emergency switch" msgstr "Notausschalter" -#: includes/class-wirecore-dr-admin.php:1268 +#: includes/class-wirecore-dr-admin.php:1656 msgid "If a rule locks you out of the admin area, this line in wp-config.php disables all rules:" msgstr "Sperrt eine Regel den Zugang zum Admin-Bereich aus, setzt diese Zeile in der wp-config.php alle Regeln außer Kraft:" -#: includes/class-wirecore-dr-admin.php:1274 +#: includes/class-wirecore-dr-admin.php:1665 msgid "For developers" msgstr "Für Entwickler" -#: includes/class-wirecore-dr-admin.php:1277 +#: includes/class-wirecore-dr-admin.php:1668 msgid "wirecore_dr_error – filters the WP_Error of a blocked request (parameters: error, route pattern, method). If the filter returns true, the request is allowed after all." msgstr "wirecore_dr_error – Filter für den WP_Error einer gesperrten Anfrage (Parameter: Fehler, Routen-Muster, Methode). Gibt der Filter true zurück, wird die Anfrage doch zugelassen." -#: includes/class-wirecore-dr-admin.php:1284 +#: includes/class-wirecore-dr-admin.php:1674 msgid "wirecore_dr_client_ip – filters the client IP, e.g. behind a proxy." msgstr "wirecore_dr_client_ip – Filter für die Client-IP, z. B. hinter einem Proxy." -#: includes/class-wirecore-dr-admin.php:1291 +#: includes/class-wirecore-dr-admin.php:1680 msgid "wirecore_dr_known_namespaces – filters the plugins under “Automatic allowances” (array key => [namespaces]). New entries appear there as a checkbox and can be enabled." msgstr "wirecore_dr_known_namespaces – Filter für die Plugins unter „Automatische Freigaben“ (Array Schlüssel => [Namespaces]). Neue Einträge erscheinen dort als Checkbox und lassen sich aktivieren." -#: includes/class-wirecore-dr-admin.php:1298 +#: includes/class-wirecore-dr-admin.php:1686 msgid "WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log)." msgstr "WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log)." -#: includes/class-wirecore-dr-guard.php:106 +#: includes/class-wirecore-dr-guard.php:108 msgid "The REST API is only available over HTTPS." msgstr "Die REST API ist nur über HTTPS erreichbar." -#: includes/class-wirecore-dr-routes.php:46 +#: includes/class-wirecore-dr-routes.php:48 msgid "Unknown" msgstr "Unbekannt" -#: includes/class-wirecore-dr-routes.php:141 +#. translators: %s: plugin name +#: includes/class-wirecore-dr-routes.php:143 #, php-format msgid "%s (plugin)" msgstr "%s (Plugin)" #. translators: %s: file or folder name of the must-use plugin -#: includes/class-wirecore-dr-routes.php:150 +#: includes/class-wirecore-dr-routes.php:153 #, php-format msgid "%s (must-use plugin)" msgstr "%s (MU-Plugin)" -#: includes/class-wirecore-dr-routes.php:159 +#. translators: %s: theme name +#: includes/class-wirecore-dr-routes.php:164 #, php-format msgid "%s (theme)" msgstr "%s (Theme)" @@ -649,3 +653,7 @@ msgstr "Die Datei ist kein gültiger Export dieses Plugins." #: includes/class-wirecore-dr-admin.php:37 msgid "REST API" msgstr "REST API" + +#: includes/class-wirecore-dr-admin.php:1423 +msgid "Save settings" +msgstr "Einstellungen speichern" diff --git a/languages/wirecore-disable-rest.pot b/languages/wirecore-disable-rest.pot index 43da1e5..50e9d9d 100644 --- a/languages/wirecore-disable-rest.pot +++ b/languages/wirecore-disable-rest.pot @@ -1,15 +1,15 @@ # Copyright (C) 2026 WireCore GmbH -# This file is distributed under the same license as the WireCore Disable REST plugin. +# This file is distributed under the GPL-2.0-or-later. msgid "" msgstr "" "Project-Id-Version: WireCore Disable REST 1.0.0\n" -"Report-Msgid-Bugs-To: https://wirecore.net\n" -"Last-Translator: WireCore GmbH\n" -"Language-Team: WireCore GmbH\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wirecore-disable-rest\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2026-10-14T09:22:19+00:00\n" +"POT-Creation-Date: 2026-10-26T04:32:48+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.12.0\n" "X-Domain: wirecore-disable-rest\n" @@ -19,12 +19,6 @@ msgstr "" msgid "WireCore Disable REST" msgstr "" -#. Plugin URI of the plugin -#. Author URI of the plugin -#: wirecore-disable-rest.php -msgid "https://wirecore.net" -msgstr "" - #. Description of the plugin #: wirecore-disable-rest.php msgid "Disables the WordPress REST API selectively – globally, per namespace or per route, including routes of other plugins." @@ -35,593 +29,607 @@ msgstr "" msgid "WireCore GmbH" msgstr "" +#. Author URI of the plugin +#: wirecore-disable-rest.php +msgid "https://wirecore.net" +msgstr "" + #: includes/class-wirecore-dr-admin.php:36 #: includes/class-wirecore-dr-admin.php:37 msgid "REST API" msgstr "" #: includes/class-wirecore-dr-admin.php:54 -#: includes/class-wirecore-dr-admin.php:316 +#: includes/class-wirecore-dr-admin.php:344 msgid "Settings" msgstr "" -#: includes/class-wirecore-dr-admin.php:80 -#: includes/class-wirecore-dr-admin.php:413 -#: includes/class-wirecore-dr-admin.php:471 -#: includes/class-wirecore-dr-admin.php:764 -#: includes/class-wirecore-dr-admin.php:786 -#: includes/class-wirecore-dr-admin.php:842 +#: includes/class-wirecore-dr-admin.php:87 +#: includes/class-wirecore-dr-admin.php:578 +#: includes/class-wirecore-dr-admin.php:647 +#: includes/class-wirecore-dr-admin.php:1015 +#: includes/class-wirecore-dr-admin.php:1053 +#: includes/class-wirecore-dr-admin.php:1125 msgid "Read" msgstr "" -#: includes/class-wirecore-dr-admin.php:81 -#: includes/class-wirecore-dr-admin.php:413 -#: includes/class-wirecore-dr-admin.php:478 -#: includes/class-wirecore-dr-admin.php:771 -#: includes/class-wirecore-dr-admin.php:787 -#: includes/class-wirecore-dr-admin.php:843 +#: includes/class-wirecore-dr-admin.php:88 +#: includes/class-wirecore-dr-admin.php:579 +#: includes/class-wirecore-dr-admin.php:657 +#: includes/class-wirecore-dr-admin.php:1025 +#: includes/class-wirecore-dr-admin.php:1057 +#: includes/class-wirecore-dr-admin.php:1129 msgid "Write" msgstr "" -#: includes/class-wirecore-dr-admin.php:82 +#: includes/class-wirecore-dr-admin.php:89 msgid "automatic" msgstr "" -#: includes/class-wirecore-dr-admin.php:83 -#: includes/class-wirecore-dr-admin.php:741 +#: includes/class-wirecore-dr-admin.php:90 +#: includes/class-wirecore-dr-admin.php:987 msgid "(no namespace)" msgstr "" -#: includes/class-wirecore-dr-admin.php:87 +#: includes/class-wirecore-dr-admin.php:94 msgid "IPs allowed" msgstr "" -#: includes/class-wirecore-dr-admin.php:88 +#: includes/class-wirecore-dr-admin.php:95 msgid "Users allowed" msgstr "" -#: includes/class-wirecore-dr-admin.php:89 +#: includes/class-wirecore-dr-admin.php:96 msgid "Roles allowed" msgstr "" -#: includes/class-wirecore-dr-admin.php:90 +#: includes/class-wirecore-dr-admin.php:97 msgid "IPs denied" msgstr "" -#: includes/class-wirecore-dr-admin.php:91 +#: includes/class-wirecore-dr-admin.php:98 msgid "Roles denied" msgstr "" -#: includes/class-wirecore-dr-admin.php:92 +#: includes/class-wirecore-dr-admin.php:99 msgid "Allowed" msgstr "" -#: includes/class-wirecore-dr-admin.php:93 +#: includes/class-wirecore-dr-admin.php:100 msgid "Denied" msgstr "" -#: includes/class-wirecore-dr-admin.php:95 -#: includes/class-wirecore-dr-admin.php:728 +#: includes/class-wirecore-dr-admin.php:102 +#: includes/class-wirecore-dr-admin.php:970 msgid "Expand all" msgstr "" -#: includes/class-wirecore-dr-admin.php:96 +#: includes/class-wirecore-dr-admin.php:103 msgid "Collapse all" msgstr "" -#: includes/class-wirecore-dr-admin.php:103 +#: includes/class-wirecore-dr-admin.php:110 msgid "The routes could not be loaded via the REST API:" msgstr "" -#: includes/class-wirecore-dr-admin.php:155 +#: includes/class-wirecore-dr-admin.php:167 msgid "WooCommerce Store API (cart, checkout)" msgstr "" -#: includes/class-wirecore-dr-admin.php:159 +#: includes/class-wirecore-dr-admin.php:171 msgid "oEmbed (embedding posts on other sites)" msgstr "" -#: includes/class-wirecore-dr-admin.php:163 +#: includes/class-wirecore-dr-admin.php:175 msgid "LiteSpeed Cache (QUIC.cloud)" msgstr "" -#: includes/class-wirecore-dr-admin.php:269 +#: includes/class-wirecore-dr-admin.php:294 msgid "Insufficient permissions." msgstr "" -#: includes/class-wirecore-dr-admin.php:315 -#: includes/class-wirecore-dr-admin.php:511 +#: includes/class-wirecore-dr-admin.php:343 +#: includes/class-wirecore-dr-admin.php:697 msgid "Routes" msgstr "" -#: includes/class-wirecore-dr-admin.php:317 -#: includes/class-wirecore-dr-admin.php:1063 +#: includes/class-wirecore-dr-admin.php:345 +#: includes/class-wirecore-dr-admin.php:1373 +#: includes/class-wirecore-dr-admin.php:1452 msgid "Log" msgstr "" -#: includes/class-wirecore-dr-admin.php:318 +#: includes/class-wirecore-dr-admin.php:346 msgid "Tools" msgstr "" -#: includes/class-wirecore-dr-admin.php:331 +#: includes/class-wirecore-dr-admin.php:364 msgid "Settings saved." msgstr "" -#: includes/class-wirecore-dr-admin.php:334 +#: includes/class-wirecore-dr-admin.php:368 msgid "Saved. Invalid IP entries were discarded." msgstr "" -#: includes/class-wirecore-dr-admin.php:338 +#: includes/class-wirecore-dr-admin.php:375 msgid "The rules could not be read. JavaScript is required to save them." msgstr "" -#: includes/class-wirecore-dr-admin.php:345 +#: includes/class-wirecore-dr-admin.php:382 msgid "The log has been cleared." msgstr "" -#: includes/class-wirecore-dr-admin.php:347 +#: includes/class-wirecore-dr-admin.php:386 msgid "Settings imported." msgstr "" -#: includes/class-wirecore-dr-admin.php:350 +#: includes/class-wirecore-dr-admin.php:390 msgid "Import failed. Please choose an export file of this plugin." msgstr "" -#: includes/class-wirecore-dr-admin.php:362 +#: includes/class-wirecore-dr-admin.php:426 msgid "WIRECORE_DR_OFF is set in wp-config.php: no rules are enforced." msgstr "" -#: includes/class-wirecore-dr-admin.php:465 +#: includes/class-wirecore-dr-admin.php:640 msgid "Default rule" msgstr "" -#: includes/class-wirecore-dr-admin.php:466 +#: includes/class-wirecore-dr-admin.php:641 msgid "Applies to all routes without a custom rule. “Read” covers GET/HEAD, “Write” covers POST/PUT/PATCH/DELETE. The most specific rule wins: route before namespace before automatic allowance before default." msgstr "" -#: includes/class-wirecore-dr-admin.php:487 +#: includes/class-wirecore-dr-admin.php:672 msgid "Quick actions" msgstr "" -#: includes/class-wirecore-dr-admin.php:489 +#: includes/class-wirecore-dr-admin.php:673 +msgid "Changes take effect only after saving." +msgstr "" + +#: includes/class-wirecore-dr-admin.php:676 msgid "Block everything for guests" msgstr "" -#: includes/class-wirecore-dr-admin.php:493 +#: includes/class-wirecore-dr-admin.php:680 msgid "Block everything" msgstr "" -#: includes/class-wirecore-dr-admin.php:497 +#: includes/class-wirecore-dr-admin.php:684 msgid "User list (/wp/v2/users) for admins only" msgstr "" -#: includes/class-wirecore-dr-admin.php:501 +#: includes/class-wirecore-dr-admin.php:688 msgid "Reset custom rules" msgstr "" -#: includes/class-wirecore-dr-admin.php:505 -msgid "Changes take effect only after saving." -msgstr "" - -#: includes/class-wirecore-dr-admin.php:512 +#: includes/class-wirecore-dr-admin.php:698 msgid "Use “Advanced” to additionally allow or deny IP addresses, roles and users for a namespace or route. The entries of a namespace apply to all of its routes." msgstr "" -#: includes/class-wirecore-dr-admin.php:517 +#: includes/class-wirecore-dr-admin.php:706 msgid "Loading routes …" msgstr "" -#: includes/class-wirecore-dr-admin.php:524 +#: includes/class-wirecore-dr-admin.php:715 msgid "Save rules" msgstr "" -#: includes/class-wirecore-dr-admin.php:544 +#: includes/class-wirecore-dr-admin.php:736 msgid "Advanced:" msgstr "" -#: includes/class-wirecore-dr-admin.php:548 +#: includes/class-wirecore-dr-admin.php:740 msgid "Applies to reading and writing. Denials take precedence over allowances and also apply to administrators. Allowances grant access regardless of the rule. For a route, the entries of its namespace apply as well." msgstr "" -#: includes/class-wirecore-dr-admin.php:554 -#: includes/class-wirecore-dr-admin.php:989 +#: includes/class-wirecore-dr-admin.php:746 +#: includes/class-wirecore-dr-admin.php:1290 msgid "Allow" msgstr "" -#: includes/class-wirecore-dr-admin.php:555 -#: includes/class-wirecore-dr-admin.php:574 +#: includes/class-wirecore-dr-admin.php:751 +#: includes/class-wirecore-dr-admin.php:788 msgid "IP addresses / CIDR ranges" msgstr "" -#: includes/class-wirecore-dr-admin.php:560 +#: includes/class-wirecore-dr-admin.php:758 msgid "User IDs" msgstr "" -#: includes/class-wirecore-dr-admin.php:565 -#: includes/class-wirecore-dr-admin.php:579 +#: includes/class-wirecore-dr-admin.php:767 +#: includes/class-wirecore-dr-admin.php:795 msgid "Roles" msgstr "" -#: includes/class-wirecore-dr-admin.php:573 +#: includes/class-wirecore-dr-admin.php:783 msgid "Deny" msgstr "" -#: includes/class-wirecore-dr-admin.php:588 -msgid "Apply" +#: includes/class-wirecore-dr-admin.php:813 +msgid "Changes are saved with “Save rules”." msgstr "" -#: includes/class-wirecore-dr-admin.php:592 +#: includes/class-wirecore-dr-admin.php:817 msgid "Cancel" msgstr "" -#: includes/class-wirecore-dr-admin.php:596 -msgid "Changes are saved with “Save rules”." +#: includes/class-wirecore-dr-admin.php:821 +msgid "Apply" msgstr "" -#: includes/class-wirecore-dr-admin.php:615 +#: includes/class-wirecore-dr-admin.php:841 msgid "Advanced" msgstr "" #. translators: 1: number of routes, 2: number of namespaces, 3: routes reachable for guests -#: includes/class-wirecore-dr-admin.php:683 +#: includes/class-wirecore-dr-admin.php:909 #, php-format msgid "%1$d routes registered in %2$d namespaces, %3$d of them reachable for logged-out visitors (without whitelists)." msgstr "" -#: includes/class-wirecore-dr-admin.php:695 +#: includes/class-wirecore-dr-admin.php:921 +#: includes/class-wirecore-dr-admin.php:924 msgid "Search route or namespace …" msgstr "" -#: includes/class-wirecore-dr-admin.php:699 -#: includes/class-wirecore-dr-admin.php:785 +#: includes/class-wirecore-dr-admin.php:930 +#: includes/class-wirecore-dr-admin.php:1049 msgid "Source" msgstr "" -#: includes/class-wirecore-dr-admin.php:703 +#: includes/class-wirecore-dr-admin.php:934 msgid "All sources" msgstr "" -#: includes/class-wirecore-dr-admin.php:710 -#: includes/class-wirecore-dr-admin.php:1203 +#: includes/class-wirecore-dr-admin.php:947 +#: includes/class-wirecore-dr-admin.php:1562 msgid "Status" msgstr "" -#: includes/class-wirecore-dr-admin.php:714 +#: includes/class-wirecore-dr-admin.php:951 msgid "All routes" msgstr "" -#: includes/class-wirecore-dr-admin.php:715 +#: includes/class-wirecore-dr-admin.php:955 msgid "With custom rule" msgstr "" -#: includes/class-wirecore-dr-admin.php:719 +#: includes/class-wirecore-dr-admin.php:959 msgid "Reachable for guests" msgstr "" -#: includes/class-wirecore-dr-admin.php:723 +#: includes/class-wirecore-dr-admin.php:963 msgid "Blocked for guests" msgstr "" #. translators: %d: number of routes -#: includes/class-wirecore-dr-admin.php:749 +#: includes/class-wirecore-dr-admin.php:995 #, php-format msgid "%d route" msgid_plural "%d routes" msgstr[0] "" msgstr[1] "" -#: includes/class-wirecore-dr-admin.php:754 +#: includes/class-wirecore-dr-admin.php:1005 msgid "Automatically allowed" msgstr "" -#: includes/class-wirecore-dr-admin.php:783 -#: includes/class-wirecore-dr-admin.php:1143 +#: includes/class-wirecore-dr-admin.php:1041 +#: includes/class-wirecore-dr-admin.php:1471 msgid "Route" msgstr "" -#: includes/class-wirecore-dr-admin.php:784 +#: includes/class-wirecore-dr-admin.php:1045 msgid "Methods" msgstr "" -#: includes/class-wirecore-dr-admin.php:788 +#: includes/class-wirecore-dr-admin.php:1061 msgid "Effective" msgstr "" -#: includes/class-wirecore-dr-admin.php:830 +#: includes/class-wirecore-dr-admin.php:1111 msgid "Rules without a registered route" msgstr "" -#: includes/class-wirecore-dr-admin.php:834 +#: includes/class-wirecore-dr-admin.php:1112 msgid "Rules for namespaces or routes that are currently not registered, e.g. because a plugin is deactivated. They are kept until they are set to “Inherit” and nothing is entered under “Advanced”." msgstr "" -#: includes/class-wirecore-dr-admin.php:841 +#: includes/class-wirecore-dr-admin.php:1121 msgid "Namespace / route" msgstr "" -#: includes/class-wirecore-dr-admin.php:870 +#: includes/class-wirecore-dr-admin.php:1171 msgid "Administrators" msgstr "" -#: includes/class-wirecore-dr-admin.php:871 +#: includes/class-wirecore-dr-admin.php:1172 msgid "Never block administrators (recommended – the block editor needs the REST API)" msgstr "" -#: includes/class-wirecore-dr-admin.php:877 +#: includes/class-wirecore-dr-admin.php:1178 msgid "HTTPS" msgstr "" -#: includes/class-wirecore-dr-admin.php:878 +#: includes/class-wirecore-dr-admin.php:1179 msgid "Allow the REST API over HTTPS only" msgstr "" -#: includes/class-wirecore-dr-admin.php:881 +#: includes/class-wirecore-dr-admin.php:1185 msgid "JSONP" msgstr "" -#: includes/class-wirecore-dr-admin.php:882 +#: includes/class-wirecore-dr-admin.php:1186 msgid "Disable JSONP responses (?_jsonp=)" msgstr "" -#: includes/class-wirecore-dr-admin.php:885 +#: includes/class-wirecore-dr-admin.php:1192 msgid "REST links" msgstr "" -#: includes/class-wirecore-dr-admin.php:886 +#: includes/class-wirecore-dr-admin.php:1193 msgid "Remove REST links from HTTP headers, HTML head and RSD" msgstr "" -#: includes/class-wirecore-dr-admin.php:892 +#: includes/class-wirecore-dr-admin.php:1199 msgid "Index" msgstr "" -#: includes/class-wirecore-dr-admin.php:893 +#: includes/class-wirecore-dr-admin.php:1200 msgid "Hide blocked routes and namespaces in the index (/wp-json/)" msgstr "" -#: includes/class-wirecore-dr-admin.php:906 +#: includes/class-wirecore-dr-admin.php:1214 msgid "Access" msgstr "" -#: includes/class-wirecore-dr-admin.php:909 +#: includes/class-wirecore-dr-admin.php:1216 msgid "Roles for “Logged-in only”" msgstr "" -#: includes/class-wirecore-dr-admin.php:923 +#: includes/class-wirecore-dr-admin.php:1229 msgid "No selection = all logged-in users." msgstr "" -#: includes/class-wirecore-dr-admin.php:930 +#: includes/class-wirecore-dr-admin.php:1235 msgid "Allowed user IDs" msgstr "" -#: includes/class-wirecore-dr-admin.php:938 +#: includes/class-wirecore-dr-admin.php:1242 msgid "These users are never blocked. One ID per line." msgstr "" -#: includes/class-wirecore-dr-admin.php:945 +#: includes/class-wirecore-dr-admin.php:1248 msgid "Allowed IP addresses" msgstr "" #. translators: %s: current IP address -#: includes/class-wirecore-dr-admin.php:956 +#: includes/class-wirecore-dr-admin.php:1258 #, php-format msgid "Applies to all routes. One IP or CIDR range per line, e.g. 203.0.113.5 or 10.0.0.0/8. Allowances for individual routes are available in the route list under “Advanced”. Your current IP: %s" msgstr "" -#: includes/class-wirecore-dr-admin.php:966 +#: includes/class-wirecore-dr-admin.php:1267 msgid "Blocked IP addresses" msgstr "" -#: includes/class-wirecore-dr-admin.php:974 +#: includes/class-wirecore-dr-admin.php:1274 msgid "These IPs get no access to any route – not even as administrator or through an allowance. One IP or CIDR range per line." msgstr "" -#: includes/class-wirecore-dr-admin.php:982 +#: includes/class-wirecore-dr-admin.php:1283 msgid "Automatic allowances" msgstr "" -#: includes/class-wirecore-dr-admin.php:983 +#: includes/class-wirecore-dr-admin.php:1284 msgid "These plugins need the REST API for visitors on the front end (forms, cart, statistics). Their namespaces are public as long as no custom rule is set for the namespace or the route in the route list. The setting has no effect for plugins that are not installed." msgstr "" -#: includes/class-wirecore-dr-admin.php:1008 +#: includes/class-wirecore-dr-admin.php:1309 msgid "Error response" msgstr "" -#: includes/class-wirecore-dr-admin.php:1011 +#: includes/class-wirecore-dr-admin.php:1311 msgid "Error message" msgstr "" -#: includes/class-wirecore-dr-admin.php:1017 -#: includes/class-wirecore-dr-guard.php:148 +#: includes/class-wirecore-dr-admin.php:1318 +#: includes/class-wirecore-dr-guard.php:150 msgid "Access to the REST API is restricted." msgstr "" -#: includes/class-wirecore-dr-admin.php:1023 +#: includes/class-wirecore-dr-admin.php:1325 msgid "Status code" msgstr "" -#: includes/class-wirecore-dr-admin.php:1032 +#: includes/class-wirecore-dr-admin.php:1334 msgid "401 – Unauthorized" msgstr "" -#: includes/class-wirecore-dr-admin.php:1036 +#: includes/class-wirecore-dr-admin.php:1341 msgid "403 – Forbidden" msgstr "" -#: includes/class-wirecore-dr-admin.php:1040 +#: includes/class-wirecore-dr-admin.php:1348 msgid "404 – Not found (route appears not to exist)" msgstr "" -#: includes/class-wirecore-dr-admin.php:1049 +#: includes/class-wirecore-dr-admin.php:1359 msgid "Hardening" msgstr "" -#: includes/class-wirecore-dr-admin.php:1066 -msgid "Logging" -msgstr "" - #. translators: %d: number of log entries -#: includes/class-wirecore-dr-admin.php:1072 +#: includes/class-wirecore-dr-admin.php:1379 #, php-format msgid "Log blocked requests (last %d)" msgstr "" -#: includes/class-wirecore-dr-admin.php:1078 +#: includes/class-wirecore-dr-admin.php:1382 +msgid "Logging" +msgstr "" + +#: includes/class-wirecore-dr-admin.php:1385 msgid "IP address in log" msgstr "" -#: includes/class-wirecore-dr-admin.php:1087 +#: includes/class-wirecore-dr-admin.php:1394 msgid "Store in full" msgstr "" -#: includes/class-wirecore-dr-admin.php:1091 +#: includes/class-wirecore-dr-admin.php:1401 msgid "Store shortened (e.g. 203.0.113.0)" msgstr "" -#: includes/class-wirecore-dr-admin.php:1098 +#: includes/class-wirecore-dr-admin.php:1408 msgid "Do not store" msgstr "" -#: includes/class-wirecore-dr-admin.php:1100 +#: includes/class-wirecore-dr-admin.php:1415 msgid "Applies to new entries. Existing entries remain unchanged until the log is cleared." msgstr "" -#: includes/class-wirecore-dr-admin.php:1117 +#: includes/class-wirecore-dr-admin.php:1423 +msgid "Save settings" +msgstr "" + +#: includes/class-wirecore-dr-admin.php:1436 msgid "No HTTPS" msgstr "" -#: includes/class-wirecore-dr-admin.php:1118 +#: includes/class-wirecore-dr-admin.php:1437 msgid "Deny list" msgstr "" -#: includes/class-wirecore-dr-admin.php:1123 +#: includes/class-wirecore-dr-admin.php:1443 msgid "The log is disabled. It can be enabled under “Settings”." msgstr "" #. translators: %d: number of blocked requests -#: includes/class-wirecore-dr-admin.php:1133 +#: includes/class-wirecore-dr-admin.php:1455 #, php-format msgid "Blocked requests in total: %d" msgstr "" -#: includes/class-wirecore-dr-admin.php:1141 +#: includes/class-wirecore-dr-admin.php:1463 msgid "Time" msgstr "" -#: includes/class-wirecore-dr-admin.php:1142 +#: includes/class-wirecore-dr-admin.php:1467 msgid "Method" msgstr "" -#: includes/class-wirecore-dr-admin.php:1144 +#: includes/class-wirecore-dr-admin.php:1475 msgid "IP" msgstr "" -#: includes/class-wirecore-dr-admin.php:1145 +#: includes/class-wirecore-dr-admin.php:1479 msgid "User ID" msgstr "" -#: includes/class-wirecore-dr-admin.php:1146 +#: includes/class-wirecore-dr-admin.php:1483 msgid "Rule" msgstr "" -#: includes/class-wirecore-dr-admin.php:1151 +#: includes/class-wirecore-dr-admin.php:1491 msgid "No entries." msgstr "" -#: includes/class-wirecore-dr-admin.php:1174 +#: includes/class-wirecore-dr-admin.php:1524 msgid "Clear log" msgstr "" -#: includes/class-wirecore-dr-admin.php:1187 +#: includes/class-wirecore-dr-admin.php:1547 msgid "Self-test" msgstr "" -#: includes/class-wirecore-dr-admin.php:1188 +#: includes/class-wirecore-dr-admin.php:1548 msgid "Calls the REST API without authentication and shows what logged-out visitors see." msgstr "" -#: includes/class-wirecore-dr-admin.php:1197 -msgid "Run test" -msgstr "" - -#: includes/class-wirecore-dr-admin.php:1202 +#: includes/class-wirecore-dr-admin.php:1558 msgid "URL" msgstr "" -#: includes/class-wirecore-dr-admin.php:1204 +#: includes/class-wirecore-dr-admin.php:1566 msgid "Response" msgstr "" -#: includes/class-wirecore-dr-admin.php:1234 +#: includes/class-wirecore-dr-admin.php:1611 +msgid "Run test" +msgstr "" + +#: includes/class-wirecore-dr-admin.php:1616 msgid "Export" msgstr "" -#: includes/class-wirecore-dr-admin.php:1241 +#: includes/class-wirecore-dr-admin.php:1622 msgid "Export settings" msgstr "" -#: includes/class-wirecore-dr-admin.php:1248 +#: includes/class-wirecore-dr-admin.php:1631 +#: includes/class-wirecore-dr-admin.php:1642 msgid "Import" msgstr "" -#: includes/class-wirecore-dr-admin.php:1249 +#: includes/class-wirecore-dr-admin.php:1632 msgid "Replaces all current settings with those from the file." msgstr "" -#: includes/class-wirecore-dr-admin.php:1260 +#: includes/class-wirecore-dr-admin.php:1646 msgid "Import settings" msgstr "" -#: includes/class-wirecore-dr-admin.php:1267 +#: includes/class-wirecore-dr-admin.php:1655 msgid "Emergency switch" msgstr "" -#: includes/class-wirecore-dr-admin.php:1268 +#: includes/class-wirecore-dr-admin.php:1656 msgid "If a rule locks you out of the admin area, this line in wp-config.php disables all rules:" msgstr "" -#: includes/class-wirecore-dr-admin.php:1274 +#: includes/class-wirecore-dr-admin.php:1665 msgid "For developers" msgstr "" -#: includes/class-wirecore-dr-admin.php:1277 +#: includes/class-wirecore-dr-admin.php:1668 msgid "wirecore_dr_error – filters the WP_Error of a blocked request (parameters: error, route pattern, method). If the filter returns true, the request is allowed after all." msgstr "" -#: includes/class-wirecore-dr-admin.php:1284 +#: includes/class-wirecore-dr-admin.php:1674 msgid "wirecore_dr_client_ip – filters the client IP, e.g. behind a proxy." msgstr "" -#: includes/class-wirecore-dr-admin.php:1291 +#: includes/class-wirecore-dr-admin.php:1680 msgid "wirecore_dr_known_namespaces – filters the plugins under “Automatic allowances” (array key => [namespaces]). New entries appear there as a checkbox and can be enabled." msgstr "" -#: includes/class-wirecore-dr-admin.php:1298 +#: includes/class-wirecore-dr-admin.php:1686 msgid "WP-CLI: wp wirecore-dr (status, routes, set, default, export, import, log)." msgstr "" -#: includes/class-wirecore-dr-guard.php:106 +#: includes/class-wirecore-dr-guard.php:108 msgid "The REST API is only available over HTTPS." msgstr "" -#: includes/class-wirecore-dr-routes.php:46 +#: includes/class-wirecore-dr-routes.php:48 msgid "Unknown" msgstr "" -#: includes/class-wirecore-dr-routes.php:141 +#. translators: %s: plugin name +#: includes/class-wirecore-dr-routes.php:143 #, php-format msgid "%s (plugin)" msgstr "" #. translators: %s: file or folder name of the must-use plugin -#: includes/class-wirecore-dr-routes.php:150 +#: includes/class-wirecore-dr-routes.php:153 #, php-format msgid "%s (must-use plugin)" msgstr "" -#: includes/class-wirecore-dr-routes.php:159 +#. translators: %s: theme name +#: includes/class-wirecore-dr-routes.php:164 #, php-format msgid "%s (theme)" msgstr "" diff --git a/package-lock.json b/package-lock.json index 2ec6cf8..78ed1c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,8 +7,10 @@ "": { "name": "wirecore-disable-rest", "version": "1.0.0", + "license": "GPL-2.0-or-later", "devDependencies": { "@prettier/plugin-php": "^0.22.4", + "@wirecore/wirelayer-css": "0.6.0", "prettier": "^3.1.1" } }, @@ -26,6 +28,16 @@ "prettier": "^3.0.0" } }, + "node_modules/@wirecore/wirelayer-css": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wirecore/wirelayer-css/-/wirelayer-css-0.6.0.tgz", + "integrity": "sha512-EWerwhfBxPSW+jQU7EqpF3jmHACghbNtI2Uo52eU7imCAg++kSfUmIiEaAatqfLwlnBLlmJ3Fk70rhtvGG+DIg==", + "dev": true, + "license": "MIT", + "bin": { + "wirelayer-css": "bin/wirelayer-css.js" + } + }, "node_modules/linguist-languages": { "version": "7.31.2", "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.31.2.tgz", diff --git a/package.json b/package.json index ec49b7b..51aac3a 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,13 @@ "private": true, "license": "GPL-2.0-or-later", "scripts": { + "build:css": "wirelayer-css embed --scope \"#wirecore-dr\" --components button,badge,card,alert,field,fieldset,input,textarea,native-select,checkbox,checkbox-group,tabs,data-table,dialog,spinner,page-header,inline-code --out assets/wirelayer", "format": "prettier --no-error-on-unmatched-pattern --write \"*.{php,md,json,yml}\" \"includes/**\" \"assets/**\" \"tests/**\" \".github/**\"", "format:check": "prettier --no-error-on-unmatched-pattern --check \"*.{php,md,json,yml}\" \"includes/**\" \"assets/**\" \"tests/**\" \".github/**\"" }, "devDependencies": { "@prettier/plugin-php": "^0.22.4", + "@wirecore/wirelayer-css": "0.6.0", "prettier": "^3.1.1" } } diff --git a/readme.txt b/readme.txt index 82432c3..8ad93ec 100644 --- a/readme.txt +++ b/readme.txt @@ -77,6 +77,14 @@ Settings are stored per site, because every site has its own routes and plugins. The plugin does not send any data to external services and does not set cookies. If you enable the log, it stores the method, route, IP address (in full, shortened or not at all – configurable), user ID and the reason of blocked requests in the database of your site. The self-test sends requests from your server to its own REST API. += Source code and third-party resources = + +The settings page uses the [WireLayer](https://github.com/WireCore/WireLayer) component library (MIT). `assets/wirelayer/wirelayer.css` is generated from the npm package `@wirecore/wirelayer-css` with `npm run build:css`; the source code of the plugin, including `package.json`, is available at [github.com/WireCore/WireCore-Disable-REST](https://github.com/WireCore/WireCore-Disable-REST). Bundled with it: + +* Tailwind CSS (MIT) – preflight and utilities compiled into `wirelayer.css` +* Schibsted Grotesk and JetBrains Mono fonts (SIL Open Font License 1.1, `assets/wirelayer/fonts/OFL.txt`), served from the plugin – no external font service +* Lucide icons (ISC) + == Installation == 1. Install the plugin via *Plugins → Add New* or upload the plugin folder to `/wp-content/plugins/`.