From 4707f5805bd242204cbfe8e3e531b7be7623b781 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Fri, 6 Nov 2026 11:35:07 -0300 Subject: [PATCH 1/2] feat(log): render `var_export()` values and PSR-3 context as typed dump trees; rename the `PrintR*` tree model and renderer to `Dump*`. --- CHANGELOG.md | 1 + resources/assets/dist/css/debug.min.css | 2 +- resources/src/styles/main.css | 13 +- src/Helper/PhpHighlighter.php | 6 - src/Helper/Text.php | 12 - .../Log/{PrintREntry.php => DumpEntry.php} | 10 +- src/Panel/Log/DumpKind.php | 63 +++ src/Panel/Log/DumpNode.php | 143 +++++++ src/Panel/Log/DumpTreeRenderer.php | 236 +++++++++++ src/Panel/Log/LogCellRenderer.php | 78 ++-- src/Panel/Log/LogMessage.php | 10 + src/Panel/Log/PhpExportDetector.php | 173 +------- src/Panel/Log/PhpExportParser.php | 310 ++++++++++++++ src/Panel/Log/PhpExportTokenizer.php | 129 ++++++ src/Panel/Log/PrintRKind.php | 36 -- src/Panel/Log/PrintRNode.php | 74 ---- src/Panel/Log/PrintRParser.php | 105 ++--- src/Panel/Log/PrintRTreeRenderer.php | 202 --------- tests/Panel/Log/DumpNodeTest.php | 30 ++ tests/Panel/Log/DumpTreeRendererTest.php | 52 +++ tests/Panel/Log/LogCellRendererTest.php | 30 +- tests/Panel/Log/PhpExportParserTest.php | 151 +++++++ tests/Panel/Log/PrintRParserTest.php | 16 +- tests/Panel/Log/PrintRTreeRendererTest.php | 31 -- tests/Provider/DumpNodeProvider.php | 92 +++++ tests/Provider/DumpTreeRendererProvider.php | 389 ++++++++++++++++++ tests/Provider/LogCellRendererProvider.php | 106 ++++- tests/Provider/LogMessageProvider.php | 8 + tests/Provider/PhpExportParserProvider.php | 352 ++++++++++++++++ tests/Provider/PrintRParserProvider.php | 274 ++++++------ tests/Provider/PrintRTreeRendererProvider.php | 187 --------- tools/quality/asset-size-budget.json | 2 +- 32 files changed, 2326 insertions(+), 997 deletions(-) rename src/Panel/Log/{PrintREntry.php => DumpEntry.php} (54%) create mode 100644 src/Panel/Log/DumpKind.php create mode 100644 src/Panel/Log/DumpNode.php create mode 100644 src/Panel/Log/DumpTreeRenderer.php create mode 100644 src/Panel/Log/PhpExportParser.php create mode 100644 src/Panel/Log/PhpExportTokenizer.php delete mode 100644 src/Panel/Log/PrintRKind.php delete mode 100644 src/Panel/Log/PrintRNode.php delete mode 100644 src/Panel/Log/PrintRTreeRenderer.php create mode 100644 tests/Panel/Log/DumpNodeTest.php create mode 100644 tests/Panel/Log/DumpTreeRendererTest.php create mode 100644 tests/Panel/Log/PhpExportParserTest.php delete mode 100644 tests/Panel/Log/PrintRTreeRendererTest.php create mode 100644 tests/Provider/DumpNodeProvider.php create mode 100644 tests/Provider/DumpTreeRendererProvider.php create mode 100644 tests/Provider/PhpExportParserProvider.php delete mode 100644 tests/Provider/PrintRTreeRendererProvider.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 76498a8..8e69c4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## 0.1.2 Under development - feat(log): render multi-line log messages with preserved whitespace, `print_r()` dumps as a tree, and `var_export()` values highlighted. +- feat(log): render `var_export()` values and PSR-3 context as typed dump trees; rename the `PrintR*` tree model and renderer to `Dump*`. ## 0.1.1 October 28, 2026 diff --git a/resources/assets/dist/css/debug.min.css b/resources/assets/dist/css/debug.min.css index 8def219..696da51 100644 --- a/resources/assets/dist/css/debug.min.css +++ b/resources/assets/dist/css/debug.min.css @@ -1 +1 @@ -:root,:host{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--yii-debug-font-sans:"IBM Plex Sans", ui-sans-serif, system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, helvetica, arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";--yii-debug-font-mono:"JetBrains Mono", ui-monospace, sfmono-regular, menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace;--yii-debug-font-display:var(--yii-debug-font-mono);--yii-debug-space-1:4px;--yii-debug-space-2:8px;--yii-debug-space-3:12px;--yii-debug-space-4:16px;--yii-debug-space-5:24px;--yii-debug-space-6:32px;--yii-debug-radius-sm:6px;--yii-debug-radius-md:10px;--yii-debug-radius-lg:14px;--yii-debug-radius-pill:999px;--yii-debug-fs-xs:.75rem;--yii-debug-fs-sm:.8125rem;--yii-debug-fs-base:.9375rem;--yii-debug-fs-lg:1.0625rem;--yii-debug-fs-xl:1.25rem;--yii-debug-fs-2xl:1.5rem;--yii-debug-control-min-size:36px;--yii-debug-panel-padding:var(--yii-debug-space-5);--yii-debug-row-padding-block:10px;--yii-debug-duration-fast:.12s;--yii-debug-duration-normal:.18s;--yii-debug-panel-bg:var(--lightningcss-light,#f2f5f1)var(--lightningcss-dark,#0c120e);--yii-debug-panel-bg-accent:var(--lightningcss-light,#0e7a551a)var(--lightningcss-dark,#2fd08c14);--yii-debug-panel-surface:var(--lightningcss-light,#fffffff0)var(--lightningcss-dark,#121a15eb);--yii-debug-panel-surface-muted:var(--lightningcss-light,#f6f8f5)var(--lightningcss-dark,#101812);--yii-debug-panel-surface-hover:var(--lightningcss-light,#e9f2ec)var(--lightningcss-dark,#1a241d);--yii-debug-panel-border:var(--lightningcss-light,#5d7a6942)var(--lightningcss-dark,#8fa39633);--yii-debug-panel-border-strong:var(--lightningcss-light,#4660515c)var(--lightningcss-dark,#8fa39652);--yii-debug-panel-text:var(--lightningcss-light,#16211a)var(--lightningcss-dark,#e4ede6);--yii-debug-panel-muted:var(--lightningcss-light,#5c6b60)var(--lightningcss-dark,#8fa396);--yii-debug-panel-link:var(--lightningcss-light,#0b6b4a)var(--lightningcss-dark,#4fd39a);--yii-debug-panel-link-hover:var(--lightningcss-light,#0d855b)var(--lightningcss-dark,#7fe4b8);--yii-debug-panel-primary:var(--lightningcss-light,#0e7a55)var(--lightningcss-dark,#2fd08c);--yii-debug-primary-bg:linear-gradient(135deg, var(--yii-debug-panel-primary-strong), var(--yii-debug-panel-primary));--yii-debug-on-primary:var(--lightningcss-light,#fff)var(--lightningcss-dark,#06281b);--yii-debug-panel-primary-strong:var(--lightningcss-light,#0a5c40)var(--lightningcss-dark,#17a673);--yii-debug-focus-ring:var(--lightningcss-light,#075c40)var(--lightningcss-dark,#7fe4b8);--yii-debug-success:var(--lightningcss-light,#0d7d47)var(--lightningcss-dark,#34c97e);--yii-debug-warning:var(--lightningcss-light,#8f5000)var(--lightningcss-dark,#e8a33d);--yii-debug-danger:var(--lightningcss-light,#c93838)var(--lightningcss-dark,#f16a6a);--yii-debug-on-success:var(--lightningcss-light,#fff)var(--lightningcss-dark,#0c120e);--yii-debug-on-warning:var(--lightningcss-light,#fff)var(--lightningcss-dark,#1c1917);--yii-debug-on-danger:var(--lightningcss-light,#fff)var(--lightningcss-dark,#1c1917);--yii-debug-info:var(--lightningcss-light,#205f9d)var(--lightningcss-dark,#5fa8e8);--yii-debug-on-info:var(--yii-debug-panel-bg);--yii-debug-panel-code-bg:var(--lightningcss-light,#ecf1ec)var(--lightningcss-dark,#17211a);--yii-debug-panel-pill:var(--lightningcss-light,#16211a0f)var(--lightningcss-dark,#8fa3962e);--yii-debug-panel-shadow:var(--lightningcss-light,0 22px 60px #16211a14)var(--lightningcss-dark,0 22px 60px #0006);--yii-debug-border:1px solid var(--yii-debug-panel-border);--yii-debug-border-strong:1px solid var(--yii-debug-panel-border-strong);--yii-debug-shadow-sm:0 1px 2px #0f172a0f;--yii-debug-shadow-md:0 10px 24px #0f172a14;--yii-debug-verb-get:var(--lightningcss-light,#0b7285)var(--lightningcss-dark,#4dc4d9);--yii-debug-verb-post:var(--lightningcss-light,#6941c6)var(--lightningcss-dark,#a78bfa);--yii-debug-verb-put:var(--lightningcss-light,#b26a00)var(--lightningcss-dark,#e8a33d);--yii-debug-verb-delete:var(--lightningcss-light,#c93838)var(--lightningcss-dark,#f16a6a);--yii-debug-verb-other:var(--yii-debug-panel-muted);--yii-debug-status-2xx:var(--yii-debug-success);--yii-debug-status-3xx:var(--yii-debug-warning);--yii-debug-status-4xx:var(--lightningcss-light,#c2410c)var(--lightningcss-dark,#fb923c);--yii-debug-status-5xx:var(--yii-debug-danger);--yii-debug-level-error:var(--yii-debug-danger);--yii-debug-level-warning:var(--yii-debug-warning);--yii-debug-level-info:var(--yii-debug-info);--yii-debug-level-trace:var(--yii-debug-panel-muted);--yii-debug-level-profile:var(--lightningcss-light,#9333ea)var(--lightningcss-dark,#b16be8);--yii-debug-level-other:var(--yii-debug-panel-muted);--yii-debug-gauge-fill:var(--yii-debug-panel-primary);--yii-debug-gauge-track:var(--lightningcss-light,#0e7a5529)var(--lightningcss-dark,#2fd08c24);--yii-debug-sql-kw:var(--lightningcss-light,#0a5c40)var(--lightningcss-dark,#4fd39a);--yii-debug-sql-str:var(--lightningcss-light,#8f4e00)var(--lightningcss-dark,#e8a33d);--yii-debug-sql-num:var(--yii-debug-info);--yii-debug-sql-comment:var(--yii-debug-panel-muted);--yii-debug-sql-param:var(--lightningcss-light,#6941c6)var(--lightningcss-dark,#a78bfa);--yii-debug-cat-app:var(--lightningcss-light,#0a6b47)var(--lightningcss-dark,#14b06e);--yii-debug-cat-db:var(--lightningcss-light,#0994b8)var(--lightningcss-dark,#0999be);--yii-debug-cat-view:var(--lightningcss-light,#6941c6)var(--lightningcss-dark,#8f6ce8);--yii-debug-cat-cache:var(--lightningcss-light,#b26a00)var(--lightningcss-dark,#c28300);--yii-debug-cat-mail:var(--lightningcss-light,#b23a67)var(--lightningcss-dark,#d95f8f);--yii-debug-cat-queue:var(--lightningcss-light,#3f4dbd)var(--lightningcss-dark,#6d7ce6);--yii-debug-cat-other:var(--yii-debug-panel-muted)}@media (prefers-color-scheme:dark){:root,:host{--lightningcss-light: ;--lightningcss-dark:initial}}:root[data-yii-debug-theme=light],:host([data-theme=light]){--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-yii-debug-theme=dark],:host([data-theme=dark]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(../fonts/jetbrains-mono-latin-400-normal.woff2)format("woff2");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;font-style:normal;font-display:swap;font-weight:500;src:url(../fonts/jetbrains-mono-latin-500-normal.woff2)format("woff2");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;font-style:normal;font-display:swap;font-weight:700;src:url(../fonts/jetbrains-mono-latin-700-normal.woff2)format("woff2");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:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(../fonts/ibm-plex-sans-latin-400-normal.woff2)format("woff2");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:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(../fonts/ibm-plex-sans-latin-500-normal.woff2)format("woff2");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:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(../fonts/ibm-plex-sans-latin-600-normal.woff2)format("woff2");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:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:700;src:url(../fonts/ibm-plex-sans-latin-700-normal.woff2)format("woff2");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}.yii-debug .yii-debug-event-controls{margin-block:var(--yii-debug-space-4);font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-event-groups{align-items:center;gap:var(--yii-debug-space-2);margin-block:var(--yii-debug-space-4);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-event-group{align-items:center;gap:var(--yii-debug-space-2);min-height:var(--yii-debug-control-min-size);padding:var(--yii-debug-space-1) var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);overflow-wrap:anywhere;display:inline-flex}.yii-debug .yii-debug-event-item>summary{cursor:pointer;list-style:none}.yii-debug .yii-debug-event-item>summary:focus-visible{outline:2px solid var(--yii-debug-panel-primary);outline-offset:4px;border-radius:var(--yii-debug-radius-sm)}.yii-debug :is(.yii-debug-event-clock,.yii-debug-event-identity){gap:var(--yii-debug-space-1);display:grid}.yii-debug .yii-debug-event-clock{min-width:105px}.yii-debug .yii-debug-event-time{white-space:nowrap;color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-event-identity{overflow-wrap:anywhere;min-width:0}.yii-debug .yii-debug-event-name:before{content:"+ ";color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-event-item[open] .yii-debug-event-name:before{content:"− "}.yii-debug .yii-debug-event-timing{font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-event-detail-row{display:none}.yii-debug .yii-debug-table tr:has(.yii-debug-event-item[open])+.yii-debug-event-detail-row{display:table-row}.yii-debug .yii-debug-table .yii-debug-event-detail-row>td{padding:0}.yii-debug .yii-debug-event-detail{gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-4);background:var(--yii-debug-panel-surface-muted);white-space:normal;grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.yii-debug .yii-debug-event-detail>div{min-width:0}.yii-debug .yii-debug-event-detail-footer{gap:var(--yii-debug-space-2) var(--yii-debug-space-4);flex-wrap:wrap;grid-column:1/-1;display:flex}.yii-debug .yii-debug-event-metadata{gap:var(--yii-debug-space-2) var(--yii-debug-space-3);grid-template-columns:minmax(75px,.4fr) minmax(0,1fr);display:grid}.yii-debug .yii-debug-event-metadata dt{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-event-metadata dd{margin:0}.yii-debug .yii-debug-event-trace pre{white-space:pre-wrap;overflow-wrap:anywhere}.yii-debug :is(.yii-debug-event-context,.yii-debug-event-trace)>:last-child{margin-bottom:0}@media not (min-width:768px){.yii-debug .yii-debug-event-detail{grid-template-columns:minmax(0,1fr)}}.yii-debug .yii-debug-event-coverage>summary{min-height:var(--yii-debug-control-min-size);padding-block:var(--yii-debug-space-2);cursor:pointer}.yii-debug .yii-debug-request-hero{margin-bottom:var(--yii-debug-space-4);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);box-shadow:var(--yii-debug-shadow-sm)}.yii-debug .yii-debug-request-overview{margin-bottom:var(--yii-debug-space-4);border:var(--yii-debug-border);border-inline-start:4px solid color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 76%, var(--yii-debug-panel-text));border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);overflow:hidden}.yii-debug .yii-debug-request-overview-header{gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-4);grid-template-columns:minmax(0,1fr) auto;align-items:center;display:grid}.yii-debug .yii-debug-request-overview-identity{min-width:0}.yii-debug .yii-debug-request-hero-line{align-items:center;gap:var(--yii-debug-space-2);min-width:0;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-base);display:flex}.yii-debug .yii-debug-request-hero-method{border-radius:var(--yii-debug-radius-pill);letter-spacing:.04em;flex:none;padding:2px 10px;font-weight:700}.yii-debug .yii-debug-request-hero-url{min-width:0;color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;flex:auto;overflow:hidden}.yii-debug .yii-debug-request-hero-meta{align-items:center;gap:6px var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);flex-wrap:wrap;margin-top:6px;display:flex}.yii-debug .yii-debug-request-hero-meta:empty{display:none}.yii-debug .yii-debug-request-hero-meta-item{align-items:baseline;gap:var(--yii-debug-space-1);display:inline-flex}.yii-debug .yii-debug-request-hero-meta-label{font-family:var(--yii-debug-font-sans);letter-spacing:.07em;text-transform:uppercase;font-size:.625rem;font-weight:700}.yii-debug .yii-debug-request-hero-meta-value{color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-request-overview-status{text-align:right;min-width:72px}.yii-debug .yii-debug-request-overview-metrics{border-block:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);grid-template-columns:minmax(0,1fr) minmax(0,2fr) auto;margin:0;display:grid}.yii-debug .yii-debug-request-overview-metric{min-width:0;padding:var(--yii-debug-space-3) var(--yii-debug-space-4)}.yii-debug .yii-debug-request-overview-metric+:is(.yii-debug .yii-debug-request-overview-metric){border-inline-start:var(--yii-debug-border)}.yii-debug .yii-debug-request-overview-metric dt{color:var(--yii-debug-panel-muted);letter-spacing:.07em;text-transform:uppercase;margin-bottom:2px;font-size:.6875rem;font-weight:700}.yii-debug .yii-debug-request-overview-metric dd{align-items:center;gap:var(--yii-debug-space-2);min-width:0;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);overflow-wrap:anywhere;flex-wrap:wrap;margin:0;font-weight:600;display:flex}.yii-debug .yii-debug-request-overview-meta{align-items:center;gap:var(--yii-debug-space-2) var(--yii-debug-space-5);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-request-overview-config{align-items:center;gap:var(--yii-debug-space-2);flex-wrap:wrap;margin-inline-start:auto;display:inline-flex}.yii-debug .yii-debug-request-overview-meta-item{flex-direction:column;align-items:flex-start;min-width:0;display:inline-flex}.yii-debug .yii-debug-request-overview-meta-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);letter-spacing:.07em;text-transform:uppercase;margin-bottom:2px;font-size:.6875rem;font-weight:700}.yii-debug .yii-debug-request-overview-tag{max-width:34ch;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.yii-debug .yii-debug-request-routing-error{border-width:1px 0 0 4px;border-radius:0;margin:0}.yii-debug .yii-debug-request-routing-error p{margin:0}.yii-debug .yii-debug-request-tabs{min-width:0}.yii-debug .yii-debug-request-tabs>.yii-debug-tabs{scrollbar-width:thin;flex-wrap:nowrap;overflow-x:auto}.yii-debug .yii-debug-request-tabs .yii-debug-tab{flex:none}.yii-debug .yii-debug-request-tabs .yii-debug-empty-state{padding:var(--yii-debug-space-4)}.yii-debug .yii-debug-request-tabs .yii-debug-empty-state h2{font-size:var(--yii-debug-fs-base);margin:0}.yii-debug .yii-debug-diagnostic-shell{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);overflow:hidden}.yii-debug .yii-debug-diagnostic-header{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);display:flex}.yii-debug .yii-debug-diagnostic-heading-copy{align-items:baseline;gap:var(--yii-debug-space-2) var(--yii-debug-space-3);flex-wrap:wrap;min-width:0;display:flex}.yii-debug .yii-debug-diagnostic-heading-copy h2{margin:0}.yii-debug .yii-debug-diagnostic-counts{align-items:center;gap:var(--yii-debug-space-2);display:inline-flex}.yii-debug .yii-debug-diagnostic-count,.yii-debug .yii-debug-diagnostic-total,.yii-debug .yii-debug-header-lane-count,.yii-debug .yii-debug-server-group-count{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums}.yii-debug .yii-debug-diagnostic-count{align-items:baseline;gap:var(--yii-debug-space-1);display:inline-flex}.yii-debug .yii-debug-diagnostic-count+.yii-debug-diagnostic-count:before{width:1px;height:12px;background:var(--yii-debug-panel-border-strong);content:"";margin-inline-end:var(--yii-debug-space-1)}.yii-debug .yii-debug-diagnostic-count-value{color:var(--yii-debug-panel-text);font-weight:700}.yii-debug .yii-debug-diagnostic-filter{background:var(--yii-debug-panel-surface);width:min(280px,42%);max-width:none}.yii-debug .yii-debug-header-lanes{grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.yii-debug .yii-debug-header-lane{min-width:0;position:relative}.yii-debug .yii-debug-header-lane+.yii-debug-header-lane{border-inline-start:2px solid color-mix(in srgb, var(--yii-debug-panel-primary) 36%, var(--yii-debug-panel-border))}.yii-debug .yii-debug-header-lane+.yii-debug-header-lane:before{z-index:1;top:25px;border:2px solid var(--yii-debug-panel-surface);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-primary);content:"";width:8px;height:8px;position:absolute;inset-inline-start:-5px}.yii-debug .yii-debug-header-lane-header{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);min-height:58px;padding:10px var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);display:flex}.yii-debug .yii-debug-header-lane-header h3{font-size:var(--yii-debug-fs-base);margin:1px 0 0}.yii-debug .yii-debug-header-direction{color:var(--yii-debug-panel-primary-strong);font-family:var(--yii-debug-font-mono);letter-spacing:.04em;font-size:.6875rem;font-weight:700;display:block}.yii-debug .yii-debug-diagnostic-ledger{margin:0}.yii-debug .yii-debug-diagnostic-row{border-top:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 58%, transparent);grid-template-columns:minmax(132px,.72fr) minmax(0,1.28fr);align-items:start;display:grid}.yii-debug .yii-debug-diagnostic-row:first-child{border-top:0}.yii-debug .yii-debug-diagnostic-row:hover{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-diagnostic-row dt,.yii-debug .yii-debug-diagnostic-row dd{min-width:0;padding:10px var(--yii-debug-space-4);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);line-height:1.5}.yii-debug .yii-debug-diagnostic-row dt{color:var(--yii-debug-panel-muted);overflow-wrap:anywhere;font-weight:600;overflow:hidden}.yii-debug .yii-debug-diagnostic-row dd{border-inline-start:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 45%, transparent);color:var(--yii-debug-panel-text);overflow-wrap:anywhere;white-space:pre-wrap;margin:0}.yii-debug .yii-debug-header-ledger .yii-debug-diagnostic-row:nth-child(2n),.yii-debug .yii-debug-server-ledger .yii-debug-diagnostic-row:nth-child(2n){background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 72%)}:is(.yii-debug .yii-debug-header-ledger .yii-debug-diagnostic-row:nth-child(2n),.yii-debug .yii-debug-server-ledger .yii-debug-diagnostic-row:nth-child(2n)):hover{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-diagnostic-values{gap:6px;display:grid}.yii-debug .yii-debug-diagnostic-value-count{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);font-size:.6875rem}.yii-debug .yii-debug-diagnostic-value-list{gap:var(--yii-debug-space-1);margin:0;padding:0;list-style:none;display:grid}.yii-debug .yii-debug-diagnostic-value-list li+li{padding-top:var(--yii-debug-space-1);border-top:1px dashed var(--yii-debug-panel-border)}.yii-debug .yii-debug-diagnostic-empty-value,.yii-debug .yii-debug-diagnostic-lane-empty,.yii-debug .yii-debug-diagnostic-empty-state,.yii-debug .yii-debug-diagnostic-filter-empty{color:var(--yii-debug-panel-muted);font-style:italic}.yii-debug .yii-debug-diagnostic-lane-empty,.yii-debug .yii-debug-diagnostic-empty-state,.yii-debug .yii-debug-diagnostic-filter-empty{padding:var(--yii-debug-space-4);margin:0}.yii-debug .yii-debug-diagnostic-filter-empty{border-top:var(--yii-debug-border);text-align:center}.yii-debug .yii-debug-server-group-body>.yii-debug-mini-toolbar{padding:var(--yii-debug-space-2) var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);margin:0}.yii-debug .yii-debug-server-group-body>.yii-debug-mini-toolbar .yii-debug-filter-input{max-width:100%}.yii-debug .yii-debug-server-additional+.yii-debug-server-group,.yii-debug .yii-debug-server-group+.yii-debug-server-group{border-top:var(--yii-debug-border)}.yii-debug .yii-debug-server-group-summary{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);min-height:44px;padding:9px var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);display:flex}.yii-debug .yii-debug-server-group-summary .yii-debug-server-group-title{font-size:var(--yii-debug-fs-sm);margin:0;font-weight:700}.yii-debug .yii-debug-server-group-summary{cursor:pointer;list-style:none}.yii-debug .yii-debug-server-group-summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-server-group-summary:hover,.yii-debug .yii-debug-server-group-summary:focus-visible{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-server-group-identity{align-items:baseline;gap:var(--yii-debug-space-2);display:inline-flex}.yii-debug .yii-debug-server-group:not([open])>.yii-debug-server-group-summary{border-bottom:0}.yii-debug .yii-debug-server-group-summary .yii-debug-disclosure-hint{margin-inline-start:auto}.yii-debug .yii-debug-diagnostic-row[hidden],.yii-debug .yii-debug-header-lane[hidden],.yii-debug .yii-debug-server-group[hidden],.yii-debug .yii-debug-diagnostic-filter-empty[hidden]{display:none}@container yii-debug-main (width<=900px){.yii-debug .yii-debug-header-lanes{grid-template-columns:minmax(0,1fr)}.yii-debug .yii-debug-header-lane+.yii-debug-header-lane{border-top:2px solid color-mix(in srgb, var(--yii-debug-panel-primary) 36%, var(--yii-debug-panel-border));border-inline-start:0}.yii-debug .yii-debug-header-lane+.yii-debug-header-lane:before{top:-5px;inset-inline-start:var(--yii-debug-space-4)}}@container yii-debug-main (width<=560px){.yii-debug .yii-debug-diagnostic-header{flex-direction:column;align-items:stretch}.yii-debug .yii-debug-diagnostic-filter{width:100%}.yii-debug .yii-debug-diagnostic-row{grid-template-columns:minmax(0,1fr)}.yii-debug .yii-debug-diagnostic-row dt{padding-bottom:var(--yii-debug-space-1)}.yii-debug .yii-debug-diagnostic-row dd{border-inline-start:0;padding-top:0}}.yii-debug .yii-debug-route-resolution{margin:var(--yii-debug-space-3) var(--yii-debug-space-4) var(--yii-debug-space-4)}.yii-debug .yii-debug-route-resolution-message{margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm)}.yii-debug .yii-debug-route-trace{min-width:560px}.yii-debug .yii-debug-table.yii-debug-route-trace thead th,.yii-debug .yii-debug-table.yii-debug-route-trace tbody td{text-align:center}.yii-debug .yii-debug-table.yii-debug-route-trace thead th:nth-child(2),.yii-debug .yii-debug-table.yii-debug-route-trace tbody td:nth-child(2){text-align:start}.yii-debug .yii-debug-table.yii-debug-route-trace thead th:first-child,.yii-debug .yii-debug-table.yii-debug-route-trace tbody td:first-child{width:56px}.yii-debug .yii-debug-table.yii-debug-route-trace thead th:last-child,.yii-debug .yii-debug-table.yii-debug-route-trace tbody td:last-child{width:160px}.yii-debug{background:radial-gradient(circle at top left, var(--yii-debug-panel-bg-accent), transparent 36rem), var(--yii-debug-panel-bg);min-height:100vh;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-base);margin:0;padding:0;line-height:1.5}.yii-debug *,.yii-debug :before,.yii-debug :after{box-sizing:border-box}.yii-debug h1,.yii-debug h2,.yii-debug h3,.yii-debug h4,.yii-debug h5,.yii-debug h6{margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-text);letter-spacing:-.01em;font-weight:700;line-height:1.25}.yii-debug h1{font-size:var(--yii-debug-fs-2xl)}.yii-debug h2{font-size:var(--yii-debug-fs-xl)}.yii-debug h3{font-size:var(--yii-debug-fs-lg)}.yii-debug h4,.yii-debug h5,.yii-debug h6{font-size:var(--yii-debug-fs-base)}.yii-debug p,.yii-debug ul,.yii-debug ol,.yii-debug dl,.yii-debug figure{margin:0 0 var(--yii-debug-space-3)}.yii-debug ul,.yii-debug ol{padding-left:var(--yii-debug-space-5)}.yii-debug strong,.yii-debug b{font-weight:600}.yii-debug a{color:var(--yii-debug-panel-link);text-decoration:none;transition:color .12s}.yii-debug a:hover,.yii-debug a:focus{color:var(--yii-debug-panel-link-hover);text-decoration:underline}.yii-debug code,.yii-debug kbd,.yii-debug samp{border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-code-bg);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-variant-ligatures:none;padding:.1em .35em;font-size:.875em}.yii-debug pre{margin:0 0 var(--yii-debug-space-3);padding:var(--yii-debug-space-3);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-code-bg);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);font-variant-ligatures:none;line-height:1.4;overflow-x:auto}.yii-debug pre code{font-size:inherit;background:0 0;padding:0}.yii-debug :focus-visible{outline:3px solid var(--yii-debug-focus-ring);outline-offset:3px}.yii-debug .yii-debug-page{max-width:1680px;padding:var(--yii-debug-space-4);margin:0 auto}.yii-debug .yii-debug-layout{gap:var(--yii-debug-space-4);grid-template-columns:240px 1fr;align-items:start;display:grid}@media (max-width:959px){.yii-debug .yii-debug-layout{grid-template-columns:1fr}}@media (min-width:960px){.yii-debug .yii-debug-sidebar{top:var(--yii-debug-space-4);max-height:calc(100vh - var(--yii-debug-space-5));position:sticky;overflow-y:auto}}.yii-debug .yii-debug-main{min-width:0;container:yii-debug-main/inline-size}.yii-debug .yii-debug-main>*+:is(h2,.yii-debug-disclosure),.yii-debug .yii-debug-tab-panel>.yii-debug-table-wrap+.yii-debug-disclosure{margin-top:var(--yii-debug-space-5)}.yii-debug .yii-debug-main>.yii-debug-sr-only:first-child+:is(h2,.yii-debug-disclosure){margin-top:0}.yii-debug .yii-debug-mini-toolbar{justify-content:flex-end;align-items:center;gap:var(--yii-debug-space-2);margin-bottom:var(--yii-debug-space-4);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-side-section{gap:var(--yii-debug-space-2);margin:0 0 var(--yii-debug-space-3);padding:var(--yii-debug-space-3);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);flex-direction:column;display:flex}.yii-debug .yii-debug-side-section-title{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;font-weight:700}.yii-debug .yii-debug-request-nav-row{width:100%;margin-top:var(--yii-debug-space-2);grid-template-columns:repeat(4,1fr);gap:6px;display:grid}.yii-debug .yii-debug-btn-icon{justify-content:center;align-items:center;padding:4px 0;font-size:16px;line-height:1;display:inline-flex}.yii-debug .yii-debug-btn-icon svg{width:1em;height:1em}.yii-debug .yii-debug-request-nav .yii-debug-btn{justify-content:center;width:100%}.yii-debug .yii-debug-brand-bar{align-items:center;gap:var(--yii-debug-space-2);margin-bottom:var(--yii-debug-space-3);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:linear-gradient(180deg, color-mix(in srgb, var(--yii-debug-panel-surface) 96%, transparent), color-mix(in srgb, var(--yii-debug-panel-surface-muted) 88%, transparent));box-shadow:var(--yii-debug-shadow-sm);flex-wrap:wrap;padding:8px 12px;display:flex}.yii-debug .yii-debug-brand-chip{border:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 70%, transparent);border-radius:var(--yii-debug-radius-pill);background:color-mix(in srgb, var(--yii-debug-panel-surface), transparent 30%);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);min-height:var(--yii-debug-control-min-size);align-items:center;gap:8px;padding:6px 12px;text-decoration:none;transition:border-color .14s,transform .14s,box-shadow .14s;display:inline-flex}.yii-debug a.yii-debug-brand-chip:hover,.yii-debug a.yii-debug-brand-chip:focus{border-color:var(--yii-debug-panel-primary);box-shadow:var(--yii-debug-shadow-sm);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-brand-icon{flex:none;justify-content:center;align-items:center;width:22px;height:22px;display:inline-flex}.yii-debug .yii-debug-brand-icon svg{width:100%;height:100%}.yii-debug .yii-debug-brand-chip-php .yii-debug-brand-icon{width:32px}.yii-debug .yii-debug-brand-chip-php .yii-debug-brand-icon svg{fill:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-brand-label{color:var(--yii-debug-panel-muted);letter-spacing:.06em;text-transform:uppercase;font-weight:600}.yii-debug .yii-debug-brand-value{color:var(--yii-debug-panel-text);font-weight:700}.yii-debug .yii-debug-brand-chip-mem{margin-left:auto}.yii-debug .yii-debug-brand-chip-config{border:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);text-decoration:none;transition:transform .14s,border-color .14s,color .14s,background-color .14s}.yii-debug .yii-debug-brand-chip-config .yii-debug-brand-icon{justify-content:center;align-items:center;width:14px;height:14px;transition:transform .24s;display:inline-flex}.yii-debug .yii-debug-brand-chip-config .yii-debug-brand-icon svg{width:100%;height:100%}.yii-debug .yii-debug-brand-chip-config:hover,.yii-debug .yii-debug-brand-chip-config:focus-visible{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 50%);color:var(--yii-debug-panel-primary-strong);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-brand-chip-config:hover .yii-debug-brand-icon,.yii-debug .yii-debug-brand-chip-config:focus-visible .yii-debug-brand-icon{transform:rotate(45deg)}.yii-debug .yii-debug-brand-chip-config.is-disabled{opacity:.5;cursor:default;pointer-events:none}.yii-debug .yii-debug-brand-chip-config{margin-left:auto}.yii-debug .yii-debug-brand-bar:has(.yii-debug-brand-chip-mem) .yii-debug-brand-chip-config{margin-left:0}.yii-debug .yii-debug-brand-chip-theme{border:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);cursor:pointer;padding:6px 10px;transition:transform .14s,border-color .14s,color .14s,background-color .14s}.yii-debug .yii-debug-brand-chip-theme:hover,.yii-debug .yii-debug-brand-chip-theme:focus-visible{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 50%);color:var(--yii-debug-panel-primary-strong);transform:translateY(-1px)}.yii-debug .yii-debug-brand-chip-theme .yii-debug-brand-icon{justify-content:center;align-items:center;width:16px;height:16px;transition:transform .24s;display:inline-flex}.yii-debug .yii-debug-brand-chip-theme .yii-debug-brand-icon svg{width:100%;height:100%}.yii-debug .yii-debug-brand-chip-theme:hover .yii-debug-brand-icon{transform:rotate(20deg)}.yii-debug .yii-debug-snapshot-line{min-width:0;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);align-items:baseline;gap:6px;display:flex}.yii-debug .yii-debug-snapshot-method{color:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-primary-strong)) 80%, var(--yii-debug-panel-text));flex:none;font-weight:700}.yii-debug .yii-debug-snapshot-url{min-width:0;color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;overflow:hidden}.yii-debug .yii-debug-snapshot-meta{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);align-items:center;gap:6px;display:flex}.yii-debug .yii-debug-snapshot-status{border-radius:var(--yii-debug-radius-pill);padding:1px 6px;font-weight:700;display:inline-block}.yii-debug .yii-debug-snapshot-tag{border:1px solid var(--yii-debug-panel-border);border-radius:var(--yii-debug-radius-pill);padding:0 6px}.yii-debug .yii-debug-request-overview-status-value{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-lg);letter-spacing:-.03em;padding:3px 9px;line-height:1.2}.yii-debug .yii-debug-panel-heading-eyebrow{color:var(--yii-debug-panel-muted);letter-spacing:.09em;text-transform:uppercase;margin-bottom:5px;font-size:.6875rem;font-weight:700;line-height:1.2;display:block}.yii-debug .yii-debug-request-overview-flag,.yii-debug .yii-debug-panel-heading-kind{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-pill);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);letter-spacing:.07em;text-transform:uppercase;padding:2px 8px;font-size:.625rem;font-weight:700;line-height:1.4}.yii-debug .yii-debug-panel-heading{justify-content:space-between;align-items:flex-end;gap:var(--yii-debug-space-3);margin:var(--yii-debug-space-5) 0 var(--yii-debug-space-3);padding-bottom:var(--yii-debug-space-2);border-bottom:var(--yii-debug-border);display:flex}.yii-debug .yii-debug-panel-heading-copy{min-width:0}.yii-debug .yii-debug-panel-heading-copy h2{margin:0}.yii-debug .yii-debug-panel-heading-kind{flex:none;margin-bottom:2px}.yii-debug pre.yii-debug-panel-payload{min-height:180px;padding:var(--yii-debug-space-4);border:var(--yii-debug-border);background:linear-gradient(90deg, color-mix(in srgb, var(--yii-debug-panel-primary), transparent 88%), transparent 42%), var(--yii-debug-panel-code-bg);margin-bottom:0;line-height:1.55}@media (max-width:640px){.yii-debug .yii-debug-request-overview-header{gap:var(--yii-debug-space-3);grid-template-columns:minmax(0,1fr)}.yii-debug .yii-debug-request-overview-status{align-items:center;gap:var(--yii-debug-space-2);text-align:left;display:flex}.yii-debug .yii-debug-request-overview-metrics{grid-template-columns:1fr}.yii-debug .yii-debug-request-overview-metric+.yii-debug-request-overview-metric{border-block-start:var(--yii-debug-border);border-inline-start:0}.yii-debug .yii-debug-request-overview-meta-item{max-width:100%}.yii-debug .yii-debug-panel-heading{align-items:flex-start}}.yii-debug .yii-debug-section-header{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);margin:var(--yii-debug-space-4) 0 var(--yii-debug-space-2);display:flex}.yii-debug .yii-debug-section-header h2,.yii-debug .yii-debug-section-header h3{margin:0}.yii-debug .yii-debug-filter-input{width:240px;max-width:50%;padding:4px var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font:inherit;flex:none}.yii-debug .yii-debug-filter-input::placeholder{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-filter-input:focus{border-color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-stack>*+*{margin-top:var(--yii-debug-space-4)}.yii-debug .yii-debug-card{padding:var(--yii-debug-panel-padding);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-md)}.yii-debug .yii-debug-nav{padding:var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);margin:0}.yii-debug .yii-debug-nav ul{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-nav-group{margin-top:var(--yii-debug-space-3)}.yii-debug .yii-debug-nav-group>.yii-debug-nav{box-shadow:none;background:0 0;border:0;border-radius:0;padding:0}.yii-debug .yii-debug-nav-link{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-2);border-radius:var(--yii-debug-radius-md);color:var(--yii-debug-panel-text);padding:8px 12px;font-weight:600;text-decoration:none;transition:background .12s,color .12s;display:flex}.yii-debug .yii-debug-nav-link:after{content:"›";color:var(--yii-debug-panel-muted);font-size:1.1em;line-height:1}.yii-debug .yii-debug-nav-link:hover,.yii-debug .yii-debug-nav-link:focus{background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-text);text-decoration:none}.yii-debug .yii-debug-nav-link.is-active,.yii-debug .yii-debug-nav-link[aria-current=page]{background:var(--yii-debug-primary-bg);color:var(--yii-debug-on-primary)}:is(.yii-debug .yii-debug-nav-link.is-active,.yii-debug .yii-debug-nav-link[aria-current=page]):after{color:inherit}.yii-debug .yii-debug-btn{justify-content:center;align-items:center;gap:var(--yii-debug-space-1);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);min-height:32px;color:var(--yii-debug-panel-text);font-family:inherit;font-size:var(--yii-debug-fs-sm);letter-spacing:0;text-transform:none;cursor:pointer;padding:6px 14px;font-weight:600;line-height:1;text-decoration:none;transition:border-color .12s,background .12s,color .12s,transform .12s,box-shadow .12s;display:inline-flex}.yii-debug .yii-debug-btn:hover,.yii-debug .yii-debug-btn:focus{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 30%);background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-link-hover);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-btn:active{transform:translateY(0)}.yii-debug .yii-debug-btn[disabled],.yii-debug .yii-debug-btn.is-disabled{opacity:.55;pointer-events:none;transform:none}.yii-debug .yii-debug-btn-primary{background:var(--yii-debug-primary-bg);color:var(--yii-debug-on-primary);border-color:#0000}.yii-debug .yii-debug-btn-primary:is(:hover,:focus){background:var(--yii-debug-panel-primary-strong);color:var(--yii-debug-on-primary)}.yii-debug .yii-debug-btn-ghost{border-color:var(--yii-debug-panel-border);background:0 0}.yii-debug .yii-debug-btn-sm{min-height:28px;font-size:var(--yii-debug-fs-xs);padding:4px 10px}.yii-debug .yii-debug-badge{border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-xs);letter-spacing:.01em;align-items:center;padding:2px 10px;font-weight:600;line-height:1.4;display:inline-flex}.yii-debug .yii-debug-badge-success{background:var(--yii-debug-success);color:var(--yii-debug-on-success)}.yii-debug .yii-debug-badge-info{background:var(--yii-debug-info);color:var(--yii-debug-on-info)}.yii-debug .yii-debug-badge-warning{background:var(--yii-debug-warning);color:var(--yii-debug-on-warning)}.yii-debug .yii-debug-badge-danger{background:var(--yii-debug-danger);color:var(--yii-debug-on-danger)}.yii-debug .yii-debug-badge-muted{background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-verb-get{--yii-debug-hue:var(--yii-debug-verb-get)}.yii-debug .yii-debug-verb-post{--yii-debug-hue:var(--yii-debug-verb-post)}.yii-debug .yii-debug-verb-put{--yii-debug-hue:var(--yii-debug-verb-put)}.yii-debug .yii-debug-verb-delete{--yii-debug-hue:var(--yii-debug-verb-delete)}.yii-debug .yii-debug-verb-other{--yii-debug-hue:var(--yii-debug-verb-other)}.yii-debug .yii-debug-status-2xx{--yii-debug-hue:var(--yii-debug-status-2xx)}.yii-debug .yii-debug-status-3xx{--yii-debug-hue:var(--yii-debug-status-3xx)}.yii-debug .yii-debug-status-4xx{--yii-debug-hue:var(--yii-debug-status-4xx)}.yii-debug .yii-debug-status-5xx{--yii-debug-hue:var(--yii-debug-status-5xx)}.yii-debug .yii-debug-status-none{--yii-debug-hue:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-level-error{--yii-debug-hue:var(--yii-debug-level-error)}.yii-debug .yii-debug-level-warning{--yii-debug-hue:var(--yii-debug-level-warning)}.yii-debug .yii-debug-level-info{--yii-debug-hue:var(--yii-debug-level-info)}.yii-debug .yii-debug-level-trace{--yii-debug-hue:var(--yii-debug-level-trace)}.yii-debug .yii-debug-level-profile{--yii-debug-hue:var(--yii-debug-level-profile)}.yii-debug .yii-debug-level-other{--yii-debug-hue:var(--yii-debug-level-other)}.yii-debug .yii-debug-request-hero-method,.yii-debug .yii-debug-snapshot-status,.yii-debug .yii-debug-hero-status>.yii-debug-badge,.yii-debug .yii-debug-level-chip,.yii-debug .yii-debug-db-type,.yii-debug .yii-debug-dump-type,.yii-debug .yii-debug-badge:is(.yii-debug-status-2xx,.yii-debug-status-3xx,.yii-debug-status-4xx,.yii-debug-status-5xx,.yii-debug-status-none){border:1px solid color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)), transparent 65%);background:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)), transparent 90%);color:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 80%, var(--yii-debug-panel-text))}.yii-debug .yii-debug-method{color:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 80%, var(--yii-debug-panel-text));font-family:var(--yii-debug-font-mono);letter-spacing:.02em;font-weight:700}.yii-debug .yii-debug-level-chip{border-radius:var(--yii-debug-radius-pill);font-family:var(--yii-debug-font-mono);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;padding:1px 8px;font-size:.7rem;font-weight:700;display:inline-block}.yii-debug .yii-debug-callout{align-items:flex-start;gap:var(--yii-debug-space-2);margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-left:4px solid var(--yii-debug-panel-border-strong);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-text);display:flex}.yii-debug .yii-debug-callout-info{border-left-color:var(--yii-debug-info)}.yii-debug .yii-debug-callout-success{border-left-color:var(--yii-debug-success)}.yii-debug .yii-debug-callout-warning{border-left-color:var(--yii-debug-warning)}.yii-debug .yii-debug-callout-danger{border-left-color:var(--yii-debug-danger)}.yii-debug .yii-debug-table-wrap{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);overflow-x:auto}.yii-debug .yii-debug-table{border-collapse:separate;border-spacing:0;width:100%;min-width:640px;color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);background:0 0;margin:0}.yii-debug .yii-debug-table thead th,.yii-debug .yii-debug-table thead td{border-bottom:var(--yii-debug-border);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 20%);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);letter-spacing:.03em;text-align:left;text-transform:uppercase;vertical-align:middle;padding:10px 12px;font-weight:700}.yii-debug .yii-debug-table thead th a{color:var(--yii-debug-panel-link);font-weight:700;text-decoration:none}.yii-debug .yii-debug-table thead th a:hover,.yii-debug .yii-debug-table thead th a:focus{color:var(--yii-debug-panel-link-hover);text-decoration:none}.yii-debug .yii-debug-table tbody td,.yii-debug .yii-debug-table tbody th{padding:var(--yii-debug-row-padding-block) 12px;border-top:1px solid var(--yii-debug-panel-border);vertical-align:top;overflow-wrap:anywhere}.yii-debug .yii-debug-table tbody th{white-space:nowrap}.yii-debug .yii-debug-table tbody tr:first-child td,.yii-debug .yii-debug-table tbody tr:first-child th{border-top:0}.yii-debug .yii-debug-table tbody tr:nth-child(2n) td,.yii-debug .yii-debug-table tbody tr:nth-child(2n) th{background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 50%)}.yii-debug .yii-debug-table tbody tr:hover td,.yii-debug .yii-debug-table tbody tr:hover th{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-table tfoot td{border-top:var(--yii-debug-border);color:var(--yii-debug-panel-muted);padding:10px 12px}.yii-debug .yii-debug-row-success td,.yii-debug .yii-debug-row-success th{background:color-mix(in srgb, var(--yii-debug-success), var(--yii-debug-panel-surface) 86%)!important}.yii-debug .yii-debug-row-info td,.yii-debug .yii-debug-row-info th{background:color-mix(in srgb, var(--yii-debug-info), var(--yii-debug-panel-surface) 86%)!important}.yii-debug .yii-debug-row-warning td,.yii-debug .yii-debug-row-warning th{background:color-mix(in srgb, var(--yii-debug-warning), var(--yii-debug-panel-surface) 86%)!important}.yii-debug .yii-debug-row-danger td,.yii-debug .yii-debug-row-danger th{background:color-mix(in srgb, var(--yii-debug-danger), var(--yii-debug-panel-surface) 86%)!important}.yii-debug .yii-debug-grid{margin-bottom:var(--yii-debug-space-4)}.yii-debug .yii-debug-grid>.summary{margin:0 0 var(--yii-debug-space-2);padding:0 var(--yii-debug-space-1);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm)}.yii-debug .yii-debug-grid>.summary b{color:var(--yii-debug-panel-text);font-weight:700}.yii-debug .yii-debug-grid>.empty{padding:var(--yii-debug-space-5);color:var(--yii-debug-panel-muted);text-align:center;font-style:italic}.yii-debug .yii-debug-grid td.yii-debug-cell-nowrap,.yii-debug .yii-debug-grid td.yii-debug-cell-numeric,.yii-debug .yii-debug-grid td.yii-debug-cell-pill,.yii-debug .yii-debug-table td.yii-debug-cell-nowrap,.yii-debug .yii-debug-table td.yii-debug-cell-numeric,.yii-debug .yii-debug-table td.yii-debug-cell-pill{white-space:nowrap}.yii-debug .yii-debug-grid td.yii-debug-cell-fqcn{overflow-wrap:normal}.yii-debug .yii-debug-disclosure{margin-bottom:var(--yii-debug-space-5);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);overflow:hidden}.yii-debug .yii-debug-disclosure[open]>.yii-debug-disclosure-summary{border-bottom:var(--yii-debug-border)}.yii-debug .yii-debug-disclosure-summary{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);padding:10px var(--yii-debug-space-4);cursor:pointer;list-style:none;transition:background-color .12s;display:flex}.yii-debug .yii-debug-disclosure-summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-disclosure-summary:hover,.yii-debug .yii-debug-disclosure-summary:focus-visible{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-disclosure-title,.yii-debug .yii-debug-request-section-title,.yii-debug .yii-debug-diagnostic-heading-copy h2{color:var(--yii-debug-panel-primary-strong);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.12em;text-transform:uppercase;font-weight:700}.yii-debug .yii-debug-disclosure-hint{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;transition:color .12s}.yii-debug .yii-debug-disclosure-hint [data-yii-debug-hint=expanded]{display:none}.yii-debug .yii-debug-disclosure-summary:hover .yii-debug-disclosure-hint,.yii-debug .yii-debug-disclosure-summary:focus-visible .yii-debug-disclosure-hint{color:var(--yii-debug-panel-link)}.yii-debug details[open]>summary .yii-debug-disclosure-hint [data-yii-debug-hint=collapsed]{display:none}.yii-debug details[open]>summary .yii-debug-disclosure-hint [data-yii-debug-hint=expanded]{display:inline}.yii-debug .yii-debug-disclosure-body{padding:var(--yii-debug-space-4)}.yii-debug .yii-debug-disclosure-body>pre{overflow-wrap:anywhere;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);white-space:pre-wrap;margin:0;line-height:1.6}.yii-debug .yii-debug-cell-more-body{max-height:156px;position:relative;overflow:hidden}.yii-debug .yii-debug-cell-more-body:has(.yii-debug-table){max-height:420px}.yii-debug .yii-debug-cell-more-body:after{content:"";background:linear-gradient(to bottom, transparent, var(--yii-debug-panel-surface));pointer-events:none;height:32px;position:absolute;inset:auto 0 0}.yii-debug .yii-debug-cell-more.is-open .yii-debug-cell-more-body{max-height:none}.yii-debug .yii-debug-cell-more.is-open .yii-debug-cell-more-body:after{content:none}.yii-debug .yii-debug-cell-more-toggle{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);color:var(--yii-debug-panel-link);font-family:inherit;font-size:var(--yii-debug-fs-xs);cursor:pointer;background:0 0;align-items:center;margin-top:6px;padding:2px 10px;font-weight:600;display:inline-flex}.yii-debug .yii-debug-cell-more-toggle:before{content:"";width:1.25em;height:1.25em;margin-right:var(--yii-debug-space-1);background:linear-gradient(currentcolor, currentcolor) center / 8px 2px no-repeat, linear-gradient(currentcolor, currentcolor) center / 2px 8px no-repeat, var(--yii-debug-panel-bg-accent);border-radius:50%;display:inline-block}.yii-debug .yii-debug-cell-more.is-open .yii-debug-cell-more-toggle:before{background:linear-gradient(currentcolor, currentcolor) center / 8px 2px no-repeat, var(--yii-debug-panel-bg-accent)}.yii-debug .yii-debug-cell-more-toggle:hover,.yii-debug .yii-debug-cell-more-toggle:focus{background:var(--yii-debug-panel-bg-accent);border-color:var(--yii-debug-panel-primary);text-decoration:none}.yii-debug .yii-debug-grid td.yii-debug-cell-mono{font-family:var(--yii-debug-font-mono)}.yii-debug td.yii-debug-cell-payload{overflow-wrap:anywhere;width:100%}.yii-debug .yii-debug-grid td.yii-debug-cell-numeric{font-variant-numeric:tabular-nums;text-align:right}.yii-debug a.asc:after,.yii-debug a.desc:after{content:"↑";opacity:.78;margin-left:4px;font-size:.85em}.yii-debug a.desc:after{content:"↓"}.yii-debug .yii-debug-pager{gap:var(--yii-debug-space-1);margin:var(--yii-debug-space-3) 0 0;flex-wrap:wrap;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-pager-item{display:inline-flex}.yii-debug .yii-debug-pager-link,.yii-debug .yii-debug-pager>li>:is(a,span){border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);min-width:40px;min-height:40px;color:var(--yii-debug-panel-link);font-size:var(--yii-debug-fs-sm);justify-content:center;align-items:center;padding:0 10px;font-weight:600;text-decoration:none;transition:border-color .12s,background .12s,color .12s;display:inline-flex}:is(.yii-debug .yii-debug-pager-link,.yii-debug .yii-debug-pager>li>:is(a,span)):hover,:is(.yii-debug .yii-debug-pager-link,.yii-debug .yii-debug-pager>li>:is(a,span)):focus{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 30%);background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-link-hover);text-decoration:none}.yii-debug .yii-debug-pager-item.is-active .yii-debug-pager-link{background:var(--yii-debug-primary-bg);color:var(--yii-debug-on-primary);cursor:default;border-color:#0000}.yii-debug .yii-debug-pager-item.is-disabled .yii-debug-pager-link{background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);cursor:not-allowed;pointer-events:none}.yii-debug .yii-debug-field{margin-bottom:var(--yii-debug-space-3);flex-direction:column;gap:4px;display:flex}.yii-debug .yii-debug-label{color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);font-weight:600}.yii-debug .yii-debug-input,.yii-debug .yii-debug-select{border:1px solid var(--yii-debug-panel-border-strong);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);width:100%;min-height:32px;color:var(--yii-debug-panel-text);font-family:inherit;font-size:var(--yii-debug-fs-sm);padding:6px 10px;transition:border-color .12s,box-shadow .12s}:is(.yii-debug .yii-debug-input,.yii-debug .yii-debug-select):hover{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), var(--yii-debug-panel-border-strong) 60%)}:is(.yii-debug .yii-debug-input,.yii-debug .yii-debug-select):focus{border-color:var(--yii-debug-panel-primary);box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 82%)}:is(.yii-debug .yii-debug-input,.yii-debug .yii-debug-select)::placeholder{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-grid .filters td{border-bottom:var(--yii-debug-border);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 30%);padding:6px 12px}.yii-debug .yii-debug-grid .filters input,.yii-debug .yii-debug-grid .filters select,.yii-debug .yii-debug-grid .filters textarea{border:1px solid var(--yii-debug-panel-border-strong);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface);width:100%;min-width:0;min-height:28px;color:var(--yii-debug-panel-text);font:inherit;font-size:var(--yii-debug-fs-xs);padding:4px 8px}:is(.yii-debug .yii-debug-grid .filters input,.yii-debug .yii-debug-grid .filters select,.yii-debug .yii-debug-grid .filters textarea):focus{border-color:var(--yii-debug-panel-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 84%)}.yii-debug .yii-debug-tabs{gap:var(--yii-debug-space-1);margin:0 0 var(--yii-debug-space-3);border-bottom:var(--yii-debug-border);flex-wrap:wrap;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-tab{display:inline-flex}.yii-debug .yii-debug-tab-link{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm);border-bottom:2px solid #0000;align-items:center;padding:8px 14px;font-weight:600;text-decoration:none;transition:color .12s,border-color .12s;display:inline-flex}.yii-debug .yii-debug-tab-link:hover,.yii-debug .yii-debug-tab-link:focus{color:var(--yii-debug-panel-text);text-decoration:none}.yii-debug .yii-debug-tab.is-active .yii-debug-tab-link,.yii-debug .yii-debug-tab-link.is-active{border-bottom-color:var(--yii-debug-panel-primary);color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-tab-panel{padding:var(--yii-debug-space-3) 0 0;display:none}.yii-debug .yii-debug-tab-panel.is-active{display:block}.yii-debug .yii-debug-since-previous{white-space:nowrap;align-items:center;gap:4px;display:inline-flex}.yii-debug .yii-debug-since-previous .yii-debug-since-previous-btn{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface);min-width:24px;height:24px;color:var(--yii-debug-panel-link);font-size:var(--yii-debug-fs-xs);justify-content:center;align-items:center;padding:0 6px;font-weight:700;text-decoration:none;display:inline-flex}.yii-debug .yii-debug-table-mono{min-width:0}.yii-debug .yii-debug-table-mono thead th{z-index:1;background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 10%);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.12em;padding:8px 16px;position:sticky;top:0}.yii-debug .yii-debug-table-mono tbody tr{transition:background-color .14s}.yii-debug .yii-debug-table-mono tbody tr:hover td,.yii-debug .yii-debug-table-mono tbody tr:hover th{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-table-mono tbody tr:hover th{box-shadow:inset 3px 0 0 var(--yii-debug-panel-primary);color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-table-mono tbody th,.yii-debug .yii-debug-table-mono tbody td{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);padding:12px 16px;line-height:1.55}.yii-debug .yii-debug-table-mono tbody th{width:1%;min-width:120px;max-width:220px;color:var(--yii-debug-panel-muted);letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;font-weight:500;transition:color .14s,box-shadow .14s;overflow:hidden}.yii-debug .yii-debug-table-mono tbody td{color:var(--yii-debug-panel-text);word-break:normal;overflow-wrap:anywhere}.yii-debug .yii-debug-table-mono tbody tr+tr td,.yii-debug .yii-debug-table-mono tbody tr+tr th{border-top:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 55%, transparent)}.yii-debug .yii-debug-table-mono tbody tr:nth-child(2n) td,.yii-debug .yii-debug-table-mono tbody tr:nth-child(2n) th{background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 70%)}.yii-debug .yii-debug-table-overview tbody th{width:200px;min-width:160px;max-width:200px}.yii-debug .yii-debug-panel-group+.yii-debug-panel-group{margin-top:var(--yii-debug-space-6)}.yii-debug .yii-debug-table-wrap:has(>.yii-debug-table-mono){border-radius:var(--yii-debug-radius-md);box-shadow:var(--yii-debug-shadow-sm), inset 0 0 0 1px color-mix(in srgb, var(--yii-debug-panel-border) 60%, transparent);overflow:clip}.yii-debug .yii-debug-table-mono{min-width:0}.yii-debug .yii-debug-table-mono tbody th{overflow-wrap:anywhere;white-space:normal}.yii-debug .yii-debug-table-userswitch{width:auto;min-width:100%}.yii-debug .yii-debug-table-userswitch thead th,.yii-debug .yii-debug-table-userswitch tbody td,.yii-debug .yii-debug-table-userswitch tbody th{overflow-wrap:normal;white-space:nowrap}.yii-debug .yii-debug-table-userswitch tbody tr.filters td input{width:100%;min-width:0}.yii-debug .yii-debug-col-userswitch-id{font-variant-numeric:tabular-nums;min-width:10ch}.yii-debug .yii-debug-col-userswitch-username{min-width:14ch}.yii-debug .yii-debug-col-userswitch-email{min-width:24ch}.yii-debug .yii-debug-col-userswitch-status{text-align:center;min-width:8ch}.yii-debug .yii-debug-col-userswitch-timestamp{font-variant-numeric:tabular-nums;min-width:18ch}.yii-debug .yii-debug-table-pointer tbody tr{cursor:pointer;transition:background-color .12s}.yii-debug .yii-debug-table-pointer tbody tr:hover{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 86%)}.yii-debug .yii-debug-sr-only{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.yii-debug .yii-debug-table-empty{padding:var(--yii-debug-space-4);border:1px dashed color-mix(in srgb, var(--yii-debug-panel-border) 70%, transparent);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 40%);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;justify-content:center;align-items:center;gap:10px;margin:0;display:flex}.yii-debug .yii-debug-table-empty:before{content:"";opacity:.5;border:1.5px solid;border-radius:50%;width:8px;height:8px}.yii-debug .yii-debug-grid-summary{align-items:center;gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);letter-spacing:.06em;text-transform:uppercase;flex-wrap:wrap;display:flex}.yii-debug .yii-debug-grid-summary strong{color:var(--yii-debug-panel-primary-strong);letter-spacing:0;text-transform:none;margin-right:.35em;font-weight:700}.yii-debug .yii-debug-grid-summary-sep{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-grid-summary-stat-warn{--yii-debug-hue:var(--yii-debug-level-warning)}.yii-debug .yii-debug-grid-summary-stat-danger{--yii-debug-hue:var(--yii-debug-level-error)}.yii-debug .yii-debug-grid-summary-stat-info{--yii-debug-hue:var(--yii-debug-level-info)}.yii-debug .yii-debug-grid-summary-stat-trace{--yii-debug-hue:var(--yii-debug-level-trace)}.yii-debug .yii-debug-grid-summary-stat-warn strong{color:var(--yii-debug-warning)}.yii-debug .yii-debug-grid-summary-stat-danger strong{color:var(--yii-debug-danger)}.yii-debug .yii-debug-grid-summary-stat-2xx{--yii-debug-hue:var(--yii-debug-status-2xx)}.yii-debug .yii-debug-grid-summary-stat-3xx{--yii-debug-hue:var(--yii-debug-status-3xx)}.yii-debug .yii-debug-grid-summary-stat-4xx{--yii-debug-hue:var(--yii-debug-status-4xx)}.yii-debug .yii-debug-grid-summary-stat-5xx{--yii-debug-hue:var(--yii-debug-status-5xx)}.yii-debug a:is(.yii-debug-grid-summary-stat-danger,.yii-debug-grid-summary-stat-warn,.yii-debug-grid-summary-stat-info,.yii-debug-grid-summary-stat-trace,.yii-debug-grid-summary-stat-2xx,.yii-debug-grid-summary-stat-3xx,.yii-debug-grid-summary-stat-4xx,.yii-debug-grid-summary-stat-5xx){border:1px solid color-mix(in srgb, var(--yii-debug-hue), transparent 65%);border-radius:var(--yii-debug-radius-pill);background:color-mix(in srgb, var(--yii-debug-hue), transparent 90%);color:color-mix(in srgb, var(--yii-debug-hue) 80%, var(--yii-debug-panel-text));align-items:center;gap:6px;padding:2px 10px;text-decoration:none;transition:transform .14s,background-color .14s;display:inline-flex}.yii-debug a:is(.yii-debug-grid-summary-stat-danger,.yii-debug-grid-summary-stat-warn,.yii-debug-grid-summary-stat-info,.yii-debug-grid-summary-stat-trace,.yii-debug-grid-summary-stat-2xx,.yii-debug-grid-summary-stat-3xx,.yii-debug-grid-summary-stat-4xx,.yii-debug-grid-summary-stat-5xx) strong{color:inherit;margin-right:0}.yii-debug a:is(.yii-debug-grid-summary-stat-danger,.yii-debug-grid-summary-stat-warn,.yii-debug-grid-summary-stat-info,.yii-debug-grid-summary-stat-trace,.yii-debug-grid-summary-stat-2xx,.yii-debug-grid-summary-stat-3xx,.yii-debug-grid-summary-stat-4xx,.yii-debug-grid-summary-stat-5xx):hover,.yii-debug a:is(.yii-debug-grid-summary-stat-danger,.yii-debug-grid-summary-stat-warn,.yii-debug-grid-summary-stat-info,.yii-debug-grid-summary-stat-trace,.yii-debug-grid-summary-stat-2xx,.yii-debug-grid-summary-stat-3xx,.yii-debug-grid-summary-stat-4xx,.yii-debug-grid-summary-stat-5xx):focus-visible{background:color-mix(in srgb, var(--yii-debug-hue), transparent 80%);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-grid-footer{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);margin-top:var(--yii-debug-space-2);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-grid-count{margin:0}.yii-debug .yii-debug-grid-pagesize{align-items:center;gap:6px;margin-left:auto;display:inline-flex}.yii-debug .yii-debug-grid-pagesize-label{color:var(--yii-debug-panel-muted);letter-spacing:.06em;text-transform:uppercase;font-weight:600}.yii-debug .yii-debug-grid-pagesize-select{padding:3px var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-sm);letter-spacing:0;text-transform:none;cursor:pointer}.yii-debug .yii-debug-grid-pagesize-select:focus{border-color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-db-type{border-radius:var(--yii-debug-radius-pill);min-width:5em;font-family:var(--yii-debug-font-mono);letter-spacing:.04em;text-align:center;text-transform:uppercase;white-space:nowrap;padding:2px 8px;font-size:.7rem;font-weight:700;display:inline-block}.yii-debug .yii-debug-db-sql{font-family:var(--yii-debug-font-mono);overflow-wrap:anywhere}.yii-debug .yii-debug-grid-db .yii-debug-table th:not(:last-child),.yii-debug .yii-debug-grid-db .yii-debug-table td:not(:last-child){white-space:nowrap}.yii-debug .yii-debug-grid-db .yii-debug-table th:last-child,.yii-debug .yii-debug-grid-db .yii-debug-table td:last-child{width:100%}.yii-debug .yii-debug-grid-db .filters select{min-width:max-content}.yii-debug .yii-debug-grid-db .filters select:focus{box-shadow:none}.yii-debug .yii-debug-grid-db .filters select:focus-visible{outline-offset:1px;outline-width:2px}.yii-debug .yii-debug-sql-kw{color:var(--yii-debug-sql-kw);font-weight:700}.yii-debug .yii-debug-sql-str{color:var(--yii-debug-sql-str)}.yii-debug .yii-debug-sql-num{color:var(--yii-debug-sql-num)}.yii-debug .yii-debug-sql-comment{color:var(--yii-debug-sql-comment);font-style:italic}.yii-debug .yii-debug-sql-param{color:var(--yii-debug-sql-param);font-weight:600}.yii-debug .yii-debug-db-explain,.yii-debug .yii-debug-db-trace{margin-top:var(--yii-debug-space-2)}.yii-debug .yii-debug-db-explain-toggle,.yii-debug .yii-debug-db-trace-toggle{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);color:var(--yii-debug-panel-link);font-size:var(--yii-debug-fs-xs);cursor:pointer;background:0 0;align-items:center;gap:6px;padding:2px 10px 2px 6px;font-weight:600;text-decoration:none;transition:background-color .12s,border-color .12s;display:inline-flex}.yii-debug .yii-debug-db-explain-toggle:hover,.yii-debug .yii-debug-db-explain-toggle:focus,.yii-debug .yii-debug-db-trace-toggle:hover,.yii-debug .yii-debug-db-trace-toggle:focus-visible{background:var(--yii-debug-panel-bg-accent);border-color:var(--yii-debug-panel-primary);text-decoration:none}.yii-debug .yii-debug-db-trace-toggle{list-style:none}.yii-debug .yii-debug-db-trace-toggle::-webkit-details-marker{display:none}.yii-debug .yii-debug-db-explain-chevron,.yii-debug .yii-debug-db-trace-chevron{width:10px;font-size:14px;line-height:1;transition:transform .16s;display:inline-block}.yii-debug .yii-debug-db-explain.is-open .yii-debug-db-explain-chevron,.yii-debug .yii-debug-db-trace[open]>.yii-debug-db-trace-toggle .yii-debug-db-trace-chevron{transform:rotate(90deg)}.yii-debug .yii-debug-db-explain.is-loading .yii-debug-db-explain-toggle{opacity:.55;pointer-events:none}.yii-debug .yii-debug-db-explain-text{margin-top:var(--yii-debug-space-2);display:none}.yii-debug .yii-debug-db-explain.is-open .yii-debug-db-explain-text{display:block}.yii-debug .yii-debug-db-explain-text.is-error{padding:var(--yii-debug-space-2) var(--yii-debug-space-3);border-left:3px solid var(--yii-debug-danger);border-radius:var(--yii-debug-radius-sm);background:color-mix(in srgb, var(--yii-debug-danger), transparent 92%);color:var(--yii-debug-danger);font-size:var(--yii-debug-fs-sm);font-weight:600;display:block}.yii-debug .yii-debug-db-explain-all{margin-top:var(--yii-debug-space-3);justify-content:flex-end;display:flex}.yii-debug .yii-debug-db-explain-all-toggle{white-space:nowrap;justify-content:center;min-width:104px}.yii-debug .yii-debug-explain{margin-top:var(--yii-debug-space-3)}.yii-debug .yii-debug-explain-title{margin-bottom:var(--yii-debug-space-2);font-size:var(--yii-debug-fs-lg);font-weight:700}.yii-debug .yii-debug-explain-query{margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3);background:var(--yii-debug-panel-code-bg);border-radius:var(--yii-debug-radius-md);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);white-space:pre-wrap;overflow-wrap:break-word}.yii-debug .yii-debug-explain-empty{color:var(--yii-debug-panel-muted);font-style:italic}.yii-debug .yii-debug-empty-state{margin:var(--yii-debug-space-4) 0 0;padding:var(--yii-debug-space-5) var(--yii-debug-space-5);border:1px dashed color-mix(in srgb, var(--yii-debug-panel-border) 80%, transparent);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 30%)}.yii-debug .yii-debug-empty-state h2{margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-lg);font-weight:700}.yii-debug .yii-debug-empty-state p{margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);line-height:1.5}.yii-debug .yii-debug-empty-state p:last-child{margin-bottom:0}.yii-debug .yii-debug-empty-state code{border-radius:var(--yii-debug-radius-sm,4px);background:var(--yii-debug-panel-code-bg);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);padding:.1em .4em}.yii-debug .yii-debug-empty-state-code{margin:0 0 var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-code-bg);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);white-space:pre-wrap;overflow-wrap:break-word;line-height:1.5}.yii-debug .yii-debug-queue-job-page{gap:var(--yii-debug-space-3);flex-direction:column;display:flex}.yii-debug .yii-debug-queue-job-head{align-items:center;gap:var(--yii-debug-space-2);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-queue-card{gap:var(--yii-debug-space-2);padding:var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);flex-direction:column;display:flex}.yii-debug .yii-debug-queue-card-head{gap:var(--yii-debug-space-3);grid-template-columns:auto 1fr auto;align-items:flex-start;display:grid}.yii-debug .yii-debug-queue-avatar{--queue-hue:210;border-radius:var(--yii-debug-radius-md);background:linear-gradient(135deg, hsl(var(--queue-hue) 72% 52%), hsl(calc(var(--queue-hue) + 28) 65% 40%));width:40px;height:40px;box-shadow:0 2px 10px hsl(var(--queue-hue) 60% 40% / 32%), inset 0 1px 0 #ffffff38;color:#fff;font-family:var(--yii-debug-font-mono);letter-spacing:-.01em;flex:none;justify-content:center;align-items:center;font-size:16px;font-weight:800;display:inline-flex}.yii-debug .yii-debug-queue-headline{flex-direction:column;gap:2px;min-width:0;display:flex}.yii-debug .yii-debug-queue-class{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-lg);letter-spacing:-.01em;word-break:break-all;margin:0;font-weight:700;line-height:1.25}.yii-debug .yii-debug-queue-namespace{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.02em}.yii-debug .yii-debug-queue-meta-pills{flex-direction:column;flex:none;align-items:flex-end;gap:6px;display:flex}.yii-debug .yii-debug-queue-status{border-radius:var(--yii-debug-radius-pill);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;align-items:center;padding:3px 10px;font-weight:600;line-height:1;display:inline-flex}.yii-debug .yii-debug-queue-status-queued{color:var(--yii-debug-info);background:color-mix(in srgb, var(--yii-debug-info), transparent 86%)}.yii-debug .yii-debug-queue-status-done{color:var(--yii-debug-success);background:color-mix(in srgb, var(--yii-debug-success), transparent 86%)}.yii-debug .yii-debug-queue-status-failed{color:var(--yii-debug-danger);background:color-mix(in srgb, var(--yii-debug-danger), transparent 86%)}.yii-debug .yii-debug-queue-driver{border-radius:var(--yii-debug-radius-pill);border:var(--yii-debug-border);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.05em;text-transform:uppercase;cursor:help;align-items:center;padding:3px 10px;font-weight:600;line-height:1;display:inline-flex}.yii-debug .yii-debug-queue-driver-is-sync{color:var(--yii-debug-success);background:color-mix(in srgb, var(--yii-debug-success), transparent 92%);border-color:color-mix(in srgb, var(--yii-debug-success), transparent 70%)}.yii-debug .yii-debug-queue-driver-is-async{color:var(--yii-debug-warning);background:color-mix(in srgb, var(--yii-debug-warning), transparent 92%);border-color:color-mix(in srgb, var(--yii-debug-warning), transparent 70%)}.yii-debug .yii-debug-queue-hint{margin:var(--yii-debug-space-3) 0;padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border-radius:var(--yii-debug-radius-md);border-left:3px solid var(--yii-debug-warning);background:color-mix(in srgb, var(--yii-debug-warning), transparent 94%);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);line-height:1.5}.yii-debug .yii-debug-queue-tree{padding:var(--yii-debug-space-3);border-radius:var(--yii-debug-radius-sm);background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 96%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);flex-direction:column;gap:4px;line-height:1.6;display:flex}.yii-debug .yii-debug-queue-tree-row{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}.yii-debug .yii-debug-queue-tree-key{color:var(--yii-debug-panel-text);font-weight:700}.yii-debug .yii-debug-queue-tree-key:after{content:":";color:var(--yii-debug-panel-muted);margin-left:1px;font-weight:400}.yii-debug .yii-debug-queue-tree-type{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);text-transform:uppercase;letter-spacing:.05em;background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 92%);border-radius:3px;padding:1px 6px}.yii-debug .yii-debug-queue-tree-class{color:var(--yii-debug-info);cursor:help;font-weight:600}.yii-debug .yii-debug-queue-tree-meta{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-queue-tree-truncated{color:var(--yii-debug-warning);font-size:var(--yii-debug-fs-xs);text-transform:uppercase;letter-spacing:.05em;background:color-mix(in srgb, var(--yii-debug-warning), transparent 86%);border-radius:3px;padding:1px 6px}.yii-debug .yii-debug-queue-tree-value{word-break:break-all}.yii-debug .yii-debug-queue-tree-value-string{color:var(--yii-debug-success)}.yii-debug .yii-debug-queue-tree-value-number{color:var(--yii-debug-info)}.yii-debug .yii-debug-queue-tree-value-bool{color:var(--yii-debug-warning);font-weight:600}.yii-debug .yii-debug-queue-tree-value-null{color:var(--yii-debug-panel-muted);font-style:italic}.yii-debug .yii-debug-queue-tree-collapse{flex-direction:column;gap:4px;display:flex}.yii-debug .yii-debug-queue-tree-summary{cursor:pointer;list-style:revert;flex-wrap:wrap;align-items:baseline;gap:8px;padding:2px 0;display:inline-flex}.yii-debug .yii-debug-queue-tree-summary::-webkit-details-marker{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-queue-tree-children{margin-left:var(--yii-debug-space-4);padding-left:var(--yii-debug-space-3);border-left:1px dashed color-mix(in srgb, var(--yii-debug-panel-text), transparent 80%);flex-direction:column;gap:4px;display:flex}.yii-debug .yii-debug-queue-time{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.02em}.yii-debug .yii-debug-queue-payload{margin:0}.yii-debug .yii-debug-queue-error{padding:var(--yii-debug-space-3);border-radius:var(--yii-debug-radius-sm);border-left:3px solid var(--yii-debug-danger);background:color-mix(in srgb, var(--yii-debug-danger), transparent 92%);color:var(--yii-debug-danger);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);line-height:1.5}.yii-debug .yii-debug-queue-meta{gap:var(--yii-debug-space-2);padding-top:var(--yii-debug-space-2);border-top:var(--yii-debug-border);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-queue-meta-item{border-radius:var(--yii-debug-radius-pill);background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 94%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);align-items:center;gap:6px;padding:2px 10px;line-height:1.4;display:inline-flex}.yii-debug .yii-debug-queue-meta-label{color:var(--yii-debug-panel-muted);text-transform:uppercase;letter-spacing:.05em;font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-queue-meta-value{color:var(--yii-debug-panel-text);font-weight:600}.yii-debug .yii-debug-dump{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);overflow:hidden}.yii-debug .yii-debug-dump-card-head{align-items:center;gap:var(--yii-debug-space-2);padding:6px var(--yii-debug-space-3);border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);color:var(--yii-debug-panel-muted);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-dump-index{color:var(--yii-debug-panel-primary-strong);font-weight:700}.yii-debug .yii-debug-dump-type{border-radius:var(--yii-debug-radius-pill);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;--yii-debug-hue:var(--yii-debug-panel-primary);padding:1px 8px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-dump-type[data-type=array]{--yii-debug-hue:var(--yii-debug-info)}.yii-debug .yii-debug-dump-type[data-type=string]{--yii-debug-hue:var(--yii-debug-success)}.yii-debug .yii-debug-dump-type[data-type=number]{--yii-debug-hue:var(--yii-debug-warning)}.yii-debug .yii-debug-dump-type[data-type=bool],.yii-debug .yii-debug-dump-type[data-type=null]{--yii-debug-hue:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-dump-meta{align-items:center;gap:var(--yii-debug-space-2);margin-left:auto;display:inline-flex}.yii-debug .yii-debug-dump-time{color:var(--yii-debug-panel-muted);font-variant-numeric:tabular-nums}.yii-debug .yii-debug-dump-trace{color:var(--yii-debug-panel-link)}.yii-debug .yii-debug-php-dump{text-align:start;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);line-height:1.5;overflow-x:auto}.yii-debug .yii-debug-php-dump pre{background:0 0;margin:0}.yii-debug .yii-debug-php-dump code{white-space:pre;background:0 0;padding:0;display:block}.yii-debug .yii-debug-dump-body{padding:var(--yii-debug-space-3);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);line-height:1.5;overflow-x:auto}.yii-debug .yii-debug-dump-body code{white-space:pre;background:0 0;padding:0;display:block}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #DD0000"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#DD0000"]{color:#e5c07b!important}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #0000BB"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#0000BB"]{color:#93c5fd!important}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #007700"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#007700"]{color:#86efac!important}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #FF8000"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#FF8000"]{color:#fdba74!important}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #000000"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#000000"]{color:var(--yii-debug-panel-text)!important}.yii-debug .yii-debug-history-card{gap:var(--yii-debug-space-2);padding:var(--yii-debug-space-3);border:1px dashed color-mix(in srgb, var(--yii-debug-panel-border) 70%, transparent);border-radius:var(--yii-debug-radius-md);background:radial-gradient(circle at top right, color-mix(in srgb, var(--yii-debug-panel-primary), transparent 86%), transparent 60%), color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 40%);flex-direction:column;display:flex;position:relative}.yii-debug .yii-debug-nav-iconed .yii-debug-nav-link{align-items:center}.yii-debug .yii-debug-nav-iconed .yii-debug-nav-link .yii-debug-nav-link-label{margin-right:auto}.yii-debug .yii-debug-nav-link-icon{width:16px;height:16px;color:var(--yii-debug-panel-primary);flex:none;justify-content:center;align-items:center;margin-right:10px;transition:color .14s,transform .14s;display:inline-flex}.yii-debug .yii-debug-nav-link-icon svg{width:100%;height:100%}.yii-debug .yii-debug-nav-link.is-active .yii-debug-nav-link-icon{color:currentColor}.yii-debug .yii-debug-nav-link-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-sm);letter-spacing:.005em;flex:1;font-weight:600;overflow:hidden}.yii-debug .yii-debug-nav-link:not(.is-active){color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-nav-link:not(.is-active) .yii-debug-nav-link-icon{color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 35%)}.yii-debug .yii-debug-nav-link:not(.is-active):after{color:color-mix(in srgb, var(--yii-debug-panel-muted), transparent 40%)}.yii-debug .yii-debug-nav-link:not(.is-active):hover,.yii-debug .yii-debug-nav-link:not(.is-active):focus-visible{color:var(--yii-debug-panel-text);background:var(--yii-debug-panel-surface-hover)}:is(.yii-debug .yii-debug-nav-link:not(.is-active):hover,.yii-debug .yii-debug-nav-link:not(.is-active):focus-visible) .yii-debug-nav-link-icon{color:var(--yii-debug-panel-primary);transform:translate(1px)}:is(.yii-debug .yii-debug-nav-link:not(.is-active):hover,.yii-debug .yii-debug-nav-link:not(.is-active):focus-visible):after{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-tag-link{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);letter-spacing:-.01em;color:var(--yii-debug-panel-primary-strong);white-space:nowrap;border-bottom:1px dotted color-mix(in srgb, var(--yii-debug-panel-primary), transparent 60%);font-weight:700;text-decoration:none;display:inline-block}.yii-debug .yii-debug-tag-link:hover,.yii-debug .yii-debug-tag-link:focus-visible{color:var(--yii-debug-panel-primary);border-bottom-color:var(--yii-debug-panel-primary);text-decoration:none}.yii-debug .yii-debug-url-cell{text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;max-width:clamp(180px,26vw,460px);display:inline-block;overflow:hidden}.yii-debug .yii-debug-table tbody tr.is-cursor{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 86%);box-shadow:inset 3px 0 0 var(--yii-debug-panel-primary)}.yii-debug .yii-debug-table tbody tr.is-cursor:hover{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 78%)}.yii-debug .yii-debug-active-filters{margin-bottom:var(--yii-debug-space-3);padding:8px var(--yii-debug-space-3);border:1px solid color-mix(in srgb, var(--yii-debug-info), transparent 60%);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-info), transparent 92%);flex-wrap:wrap;align-items:center;gap:8px;display:flex}.yii-debug .yii-debug-active-filters-label{color:var(--yii-debug-info);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;font-weight:700}.yii-debug .yii-debug-active-filters-list{flex-wrap:wrap;gap:4px;display:inline-flex}.yii-debug .yii-debug-active-filter-pill{border:1px solid color-mix(in srgb, var(--yii-debug-info), transparent 50%);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);align-items:center;gap:4px;padding:2px 6px 2px 8px;text-decoration:none;transition:background-color .12s,border-color .12s;display:inline-flex}.yii-debug .yii-debug-active-filter-pill:hover,.yii-debug .yii-debug-active-filter-pill:focus-visible{border-color:var(--yii-debug-danger);background:color-mix(in srgb, var(--yii-debug-danger), transparent 88%);color:var(--yii-debug-danger);text-decoration:none}.yii-debug .yii-debug-active-filter-attr{color:var(--yii-debug-panel-muted);text-transform:lowercase}.yii-debug .yii-debug-active-filter-sep{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-active-filter-value{color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;max-width:220px;font-weight:700;overflow:hidden}.yii-debug .yii-debug-active-filter-x{color:var(--yii-debug-panel-muted);margin-left:2px;font-weight:700;line-height:1}.yii-debug .yii-debug-active-filter-pill:hover .yii-debug-active-filter-x,.yii-debug .yii-debug-active-filter-pill:focus-visible .yii-debug-active-filter-x{color:var(--yii-debug-danger)}.yii-debug .yii-debug-active-filters-clear{border:1px solid color-mix(in srgb, var(--yii-debug-danger), transparent 60%);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-danger);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;margin-left:auto;padding:3px 10px;font-weight:700;text-decoration:none;transition:background-color .12s,border-color .12s,transform .12s}.yii-debug .yii-debug-active-filters-clear:hover,.yii-debug .yii-debug-active-filters-clear:focus-visible{border-color:var(--yii-debug-danger);background:color-mix(in srgb, var(--yii-debug-danger), transparent 86%);color:var(--yii-debug-danger);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-col-id{white-space:nowrap;min-width:120px}.yii-debug .yii-debug-grid .filters input.yii-debug-col-id-input{box-sizing:border-box;width:104px}.yii-debug .yii-debug-grid-history .yii-debug-table{--yii-debug-history-query-width:0px;--yii-debug-history-mail-width:0px;--yii-debug-history-fixed-width:calc(988px + var(--yii-debug-history-query-width) + var(--yii-debug-history-mail-width));min-width:calc(var(--yii-debug-history-fixed-width) + 180px);table-layout:fixed}.yii-debug .yii-debug-grid-history .yii-debug-table:has(thead th.yii-debug-col-num:not(:first-child,.yii-debug-col-mail)){--yii-debug-history-query-width:66px}.yii-debug .yii-debug-grid-history .yii-debug-table:has(thead th.yii-debug-col-mail){--yii-debug-history-mail-width:56px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:first-child{width:36px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-child(2){width:276px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-child(3){width:80px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-child(4),.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-child(5){width:100px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th.yii-debug-col-ip{width:112px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th.yii-debug-col-num:not(:first-child,.yii-debug-col-mail){width:66px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th.yii-debug-col-mail{width:56px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-last-child(4){width:128px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th.yii-debug-col-status{width:72px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-last-child(2){width:84px}.yii-debug .yii-debug-grid-history .yii-debug-table tbody td,.yii-debug .yii-debug-grid-history .yii-debug-table tbody th{white-space:nowrap;padding:8px 10px}.yii-debug .yii-debug-grid-history .yii-debug-table tbody td.yii-debug-col-ip{white-space:normal;overflow-wrap:anywhere}.yii-debug .yii-debug-grid-history .yii-debug-table tbody:has(>tr:only-child>td[colspan]){caption-side:bottom;display:table-caption}.yii-debug .yii-debug-grid-history .yii-debug-table tbody:has(>tr:only-child>td[colspan]) td{display:block}.yii-debug .yii-debug-grid-history .yii-debug-table .yii-debug-tag-link,.yii-debug .yii-debug-grid-history .yii-debug-table .yii-debug-url-cell{text-overflow:ellipsis;max-width:100%;overflow:hidden}.yii-debug .yii-debug-grid-history .yii-debug-table .yii-debug-tag-link{vertical-align:middle;display:inline-block}@media (max-width:1600px){.yii-debug .yii-debug-grid-history .yii-debug-table{--yii-debug-history-fixed-width:calc(876px + var(--yii-debug-history-query-width))}.yii-debug .yii-debug-grid-history .yii-debug-col-ip,.yii-debug .yii-debug-grid-history .yii-debug-col-mail{display:none}}@media (max-width:767px){.yii-debug .yii-debug-grid-event .yii-debug-table thead th,.yii-debug .yii-debug-grid-event .yii-debug-table thead td,.yii-debug .yii-debug-grid-event .yii-debug-table tbody tr:not(.yii-debug-event-detail-row) td,.yii-debug .yii-debug-grid-event .yii-debug-table tbody th,.yii-debug .yii-debug-grid-event .yii-debug-table tfoot td{padding:8px 10px}.yii-debug .yii-debug-grid-event .yii-debug-table .filters td{padding:6px 10px}}.yii-debug th.yii-debug-col-num,.yii-debug td.yii-debug-col-num{text-align:center;white-space:nowrap;width:1%}.yii-debug td.yii-debug-col-num{font-variant-numeric:tabular-nums}.yii-debug td.yii-debug-col-num input,.yii-debug td.yii-debug-col-num select{text-align:center;width:100%;min-width:0}.yii-debug .yii-debug-explain-scroll{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);overflow-x:auto}.yii-debug .yii-debug-explain-table{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);white-space:nowrap;margin:0}.yii-debug .yii-debug-explain-table th,.yii-debug .yii-debug-explain-table td{padding:var(--yii-debug-space-2) var(--yii-debug-space-3)}.yii-debug ul.yii-debug-trace{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);white-space:normal;margin:2px 0 0;padding:0;list-style:none}.yii-debug .yii-debug-disclosure:has(>.yii-debug-disclosure-body>.yii-debug-log-context){margin:var(--yii-debug-space-2) 0 0;border-radius:var(--yii-debug-radius-md)}.yii-debug .yii-debug-disclosure:has(>.yii-debug-disclosure-body>.yii-debug-log-context)>.yii-debug-disclosure-summary{gap:0 var(--yii-debug-space-3);padding:var(--yii-debug-space-1) var(--yii-debug-space-3);flex-wrap:wrap}.yii-debug .yii-debug-disclosure:has(>.yii-debug-disclosure-body>.yii-debug-log-context)>.yii-debug-disclosure-body{padding:var(--yii-debug-space-2) var(--yii-debug-space-3)}.yii-debug .yii-debug-log-context{gap:var(--yii-debug-space-1) var(--yii-debug-space-3);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);grid-template-columns:minmax(75px,max-content) minmax(0,1fr);margin:0;display:grid}.yii-debug .yii-debug-log-context dt{color:var(--yii-debug-panel-muted);overflow-wrap:anywhere}.yii-debug .yii-debug-log-context dd{min-width:0;margin:0}.yii-debug .yii-debug-log-context code,.yii-debug .yii-debug-log-context pre{font-size:inherit;white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.yii-debug .yii-debug-log-context pre{padding:var(--yii-debug-space-2);overflow:visible}@media not (min-width:768px){.yii-debug .yii-debug-log-context{grid-template-columns:minmax(0,1fr);row-gap:0}.yii-debug .yii-debug-log-context dd+dt{margin-top:var(--yii-debug-space-2)}}.yii-debug .yii-debug-log-text{color:inherit;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-ligatures:none;white-space:pre-wrap;overflow-wrap:anywhere;background:0 0;margin:0;padding:0;line-height:1.6}.yii-debug .yii-debug-log-dump,.yii-debug .yii-debug-log-export pre{padding:var(--yii-debug-space-2) var(--yii-debug-space-3);border-radius:var(--yii-debug-radius-sm);background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 96%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-ligatures:none;line-height:1.6}.yii-debug .yii-debug-log-dump-summary,.yii-debug .yii-debug-log-dump-row{align-items:baseline;gap:2px var(--yii-debug-space-2);padding-left:calc(1ch + var(--yii-debug-space-2));flex-wrap:wrap;display:flex}.yii-debug .yii-debug-log-dump-summary{cursor:pointer;list-style:none;position:relative}.yii-debug .yii-debug-log-dump-summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-log-dump-summary:before{content:"▸";color:var(--yii-debug-panel-muted);position:absolute;left:0}.yii-debug :is(.yii-debug-log-dump,.yii-debug-log-dump-node)[open]>.yii-debug-log-dump-summary:before{transform:rotate(90deg)}.yii-debug .yii-debug-log-dump-entries{padding-left:calc(.5ch + var(--yii-debug-space-2));border-left:1px dashed color-mix(in srgb, var(--yii-debug-panel-text), transparent 80%);margin-left:.5ch}.yii-debug .yii-debug-log-dump-key{white-space:pre-wrap;overflow-wrap:anywhere;font-weight:700}.yii-debug .yii-debug-log-dump-key:after{content:":";color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-log-dump-value{white-space:pre-wrap;overflow-wrap:anywhere;flex:16ch;min-width:0}.yii-debug .yii-debug-log-dump-kind,.yii-debug .yii-debug-log-dump-visibility,.yii-debug .yii-debug-log-dump-recursion{background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 92%);letter-spacing:.05em;border-radius:3px;padding:0 6px}.yii-debug .yii-debug-log-dump-kind,.yii-debug .yii-debug-log-dump-recursion{text-transform:uppercase}.yii-debug .yii-debug-log-dump-kind,.yii-debug .yii-debug-log-dump-visibility,.yii-debug .yii-debug-log-dump-count,.yii-debug .yii-debug-log-dump-prefix,.yii-debug .yii-debug-log-dump-empty{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-log-dump-visibility,.yii-debug .yii-debug-log-dump-empty{cursor:help;font-style:italic}.yii-debug .yii-debug-log-dump-recursion{background:color-mix(in srgb, var(--yii-debug-warning), transparent 86%);color:var(--yii-debug-warning);cursor:help}.yii-debug .yii-debug-muted{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-nowrap{white-space:nowrap}.yii-debug .yii-debug-not-set{color:var(--yii-debug-danger);font-style:italic}.yii-debug .yii-debug-gauge{vertical-align:middle;font-variant-numeric:tabular-nums;flex-direction:column;gap:3px;min-width:76px;display:inline-flex}.yii-debug .yii-debug-gauge-value{text-align:right}.yii-debug .yii-debug-gauge-bar{border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-gauge-track);height:3px;display:block;overflow:hidden}.yii-debug .yii-debug-gauge-bar:after{content:"";width:var(--yii-debug-gauge,0%);border-radius:inherit;background:var(--yii-debug-gauge-fill);height:100%;display:block}.yii-debug .yii-debug-indent{color:var(--yii-debug-panel-muted);margin-inline-end:var(--yii-debug-space-1)}.yii-debug .yii-debug-section{margin-bottom:var(--yii-debug-space-6)}.yii-debug .yii-debug-section:last-child{margin-bottom:0}.yii-debug .yii-debug-section-title{align-items:center;gap:var(--yii-debug-space-2);margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);letter-spacing:.22em;text-transform:uppercase;font-size:.6875rem;font-weight:500;line-height:1;display:flex}.yii-debug .yii-debug-section-mark{color:var(--yii-debug-panel-primary);font-weight:700}.yii-debug .yii-debug-section-count{border-radius:var(--yii-debug-radius-pill);background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 85%);color:var(--yii-debug-panel-primary);align-items:center;margin-left:auto;padding:2px 8px;font-weight:700;display:inline-flex}.yii-debug h1.yii-debug-hero-title{margin:0 0 var(--yii-debug-space-5);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-display);letter-spacing:-.015em;text-transform:lowercase;font-size:2rem;font-weight:400;line-height:1}.yii-debug h1.yii-debug-hero-title:before{content:"// ";color:var(--yii-debug-panel-primary);font-family:var(--yii-debug-font-mono);letter-spacing:0;vertical-align:2px;margin-right:.2em;font-size:.75em;font-weight:700}.yii-debug .yii-debug-readout-card{gap:var(--yii-debug-space-2);min-height:132px;padding:var(--yii-debug-space-5) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:radial-gradient(circle at 1px 1px, color-mix(in srgb, var(--yii-debug-panel-border), transparent 30%) 1px, transparent 0) 0 0 / 14px 14px, linear-gradient(150deg, color-mix(in srgb, var(--yii-debug-panel-primary), transparent 92%), transparent 55%), var(--yii-debug-panel-surface);flex-direction:column;transition:border-color .15s,transform .15s,box-shadow .15s;animation:.45s cubic-bezier(.2,.7,.3,1) both yii-debug-readout-in;display:flex;position:relative;overflow:hidden}.yii-debug .yii-debug-readout-card:hover{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 45%);box-shadow:var(--yii-debug-shadow-md);transform:translateY(-2px)}.yii-debug .yii-debug-readout-card:first-child{animation-delay:40ms}.yii-debug .yii-debug-readout-card:nth-child(2){animation-delay:80ms}.yii-debug .yii-debug-readout-card:nth-child(3){animation-delay:.12s}.yii-debug .yii-debug-readout-card:nth-child(4){animation-delay:.16s}.yii-debug .yii-debug-readout-card:nth-child(5){animation-delay:.2s}.yii-debug .yii-debug-readout-card:nth-child(6){animation-delay:.24s}.yii-debug .yii-debug-readout-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);letter-spacing:.15em;text-transform:uppercase;margin:0;font-size:.6875rem;font-weight:500;line-height:1;display:block;position:relative}.yii-debug .yii-debug-readout-label:before{content:":: ";color:var(--yii-debug-panel-primary);opacity:.85;font-weight:700}.yii-debug .yii-debug-readout-value{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);letter-spacing:-.015em;overflow-wrap:break-word;margin:0;font-size:1.375rem;font-weight:700;line-height:1.15;display:block}.yii-debug .yii-debug-readout-meta{align-items:center;gap:var(--yii-debug-space-2);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);letter-spacing:.05em;text-transform:lowercase;margin-top:auto;font-size:.6875rem;line-height:1;display:inline-flex}.yii-debug .yii-debug-readout-grid{gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-6);grid-template-columns:repeat(auto-fit,minmax(210px,1fr));display:grid}.yii-debug .yii-debug-section .yii-debug-table-wrap{border-radius:var(--yii-debug-radius-md)}.yii-debug .yii-debug-section .yii-debug-table-overview th,.yii-debug .yii-debug-section .yii-debug-table-overview td{padding:9px var(--yii-debug-space-4);border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border), transparent 45%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);text-align:left;vertical-align:baseline}.yii-debug .yii-debug-section .yii-debug-table-overview th{width:34%;color:var(--yii-debug-panel-muted);letter-spacing:.12em;text-transform:uppercase;font-weight:500}.yii-debug .yii-debug-section .yii-debug-table-overview td{color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-section .yii-debug-table-overview tr:last-child th,.yii-debug .yii-debug-section .yii-debug-table-overview tr:last-child td{border-bottom:0}.yii-debug .yii-debug-fact-strip{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-border);grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:1px;margin:0;display:grid;overflow:hidden}.yii-debug .yii-debug-fact{min-width:0;padding:var(--yii-debug-space-3) var(--yii-debug-space-4);background:var(--yii-debug-panel-surface-muted)}.yii-debug .yii-debug-fact-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);letter-spacing:.07em;text-transform:uppercase;margin-bottom:2px;font-size:.6875rem;font-weight:700}.yii-debug .yii-debug-fact-value{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);text-overflow:ellipsis;white-space:nowrap;margin:0;font-weight:600;overflow:hidden}.yii-debug .yii-debug-hero{margin-bottom:var(--yii-debug-space-5);border:var(--yii-debug-border);border-inline-start:4px solid color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 76%, var(--yii-debug-panel-text));border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);overflow:hidden}.yii-debug .yii-debug-hero-danger{--yii-debug-hue:var(--yii-debug-danger)}.yii-debug .yii-debug-hero-info{--yii-debug-hue:var(--yii-debug-info)}.yii-debug .yii-debug-hero-success{--yii-debug-hue:var(--yii-debug-success)}.yii-debug .yii-debug-hero-warning{--yii-debug-hue:var(--yii-debug-warning)}.yii-debug .yii-debug-hero-header{gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-4);grid-template-columns:minmax(0,1fr) auto;align-items:center;display:grid}.yii-debug .yii-debug-hero-identity{align-items:center;gap:var(--yii-debug-space-3);min-width:0;display:flex}.yii-debug .yii-debug-hero-mark{border:1px solid color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)), transparent 65%);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)), transparent 88%);width:40px;height:40px;color:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 80%, var(--yii-debug-panel-text));font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);letter-spacing:.04em;text-transform:uppercase;flex:none;justify-content:center;align-items:center;font-weight:700;display:inline-flex}.yii-debug .yii-debug-hero-text{flex-direction:column;gap:2px;min-width:0;display:flex}.yii-debug .yii-debug-hero-title,.yii-debug .yii-debug-hero-subtitle{font-family:var(--yii-debug-font-mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.yii-debug .yii-debug-hero-title{color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-base);font-weight:600}.yii-debug .yii-debug-hero-subtitle{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-hero-status>.yii-debug-badge{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);letter-spacing:.02em;padding:3px 12px;font-weight:700}.yii-debug .yii-debug-hero-metrics{border-top:var(--yii-debug-border);background:var(--yii-debug-panel-border);grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:1px;margin:0;display:grid}.yii-debug .yii-debug-hero-metric{min-width:0;padding:var(--yii-debug-space-3) var(--yii-debug-space-4);background:var(--yii-debug-panel-surface-muted)}.yii-debug .yii-debug-hero-metric dt{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);letter-spacing:.07em;text-transform:uppercase;margin-bottom:2px;font-size:.6875rem;font-weight:700}.yii-debug .yii-debug-hero-metric dd{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);text-overflow:ellipsis;white-space:nowrap;margin:0;font-weight:600;overflow:hidden}.yii-debug .yii-debug-stat-strip{gap:var(--yii-debug-space-3);margin:0 0 var(--yii-debug-space-4);grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.yii-debug .yii-debug-stat{padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);align-items:center;gap:10px;display:flex}.yii-debug .yii-debug-stat-icon{width:26px;height:26px;color:var(--yii-debug-panel-primary);flex:none;justify-content:center;align-items:center;display:inline-flex}.yii-debug .yii-debug-stat-icon svg{width:100%;height:100%}.yii-debug .yii-debug-stat-value{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xl);font-weight:800;line-height:1}.yii-debug .yii-debug-stat-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;margin-left:auto}.yii-debug .yii-debug-stat-danger .yii-debug-stat-icon{color:var(--yii-debug-danger)}.yii-debug .yii-debug-stat-info .yii-debug-stat-icon{color:var(--yii-debug-info)}.yii-debug .yii-debug-stat-muted .yii-debug-stat-icon{color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-stat-success .yii-debug-stat-icon{color:var(--yii-debug-success)}.yii-debug .yii-debug-stat-warning .yii-debug-stat-icon{color:var(--yii-debug-warning)}.yii-debug .yii-debug-entity{gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);scroll-margin-top:var(--yii-debug-space-4);flex-direction:column;transition:transform .16s,border-color .16s,box-shadow .16s;display:flex;position:relative}.yii-debug .yii-debug-entity:hover{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 60%);box-shadow:var(--yii-debug-shadow-sm), 0 12px 32px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 88%);transform:translateY(-1px)}.yii-debug .yii-debug-entity:target{border-color:var(--yii-debug-panel-primary);box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 78%), var(--yii-debug-shadow-sm)}.yii-debug .yii-debug-card-grid{gap:var(--yii-debug-space-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,32rem),1fr));display:grid}.yii-debug .yii-debug-entity-head{gap:var(--yii-debug-space-3);grid-template-columns:auto 1fr auto;align-items:center;display:grid}.yii-debug .yii-debug-entity-icon{border-radius:var(--yii-debug-radius-md);background:linear-gradient(135deg, color-mix(in srgb, var(--yii-debug-panel-primary), transparent 78%), color-mix(in srgb, var(--yii-debug-info), transparent 78%));width:38px;height:38px;color:var(--yii-debug-panel-primary-strong);flex:none;justify-content:center;align-items:center;display:inline-flex}.yii-debug .yii-debug-entity-icon svg{width:22px;height:22px}.yii-debug .yii-debug-entity-title{flex-direction:column;gap:2px;min-width:0;display:flex}.yii-debug .yii-debug-entity-name{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-lg);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;margin:0;font-weight:700;line-height:1.2;overflow:hidden}.yii-debug .yii-debug-entity-subtitle{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.01em;text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.yii-debug .yii-debug-entity-meta{flex-wrap:nowrap;flex:none;justify-content:flex-end;align-items:center;gap:5px;display:inline-flex}.yii-debug .yii-debug-entity-meta .yii-debug-badge{border:1px solid var(--yii-debug-panel-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;align-items:center;gap:4px;padding:2px 8px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-entity-meta .yii-debug-badge-danger{border-color:color-mix(in srgb, var(--yii-debug-danger), transparent 60%);background:color-mix(in srgb, var(--yii-debug-danger), transparent 90%);color:var(--yii-debug-danger)}.yii-debug .yii-debug-entity-meta .yii-debug-badge-info{border-color:color-mix(in srgb, var(--yii-debug-info), transparent 60%);background:color-mix(in srgb, var(--yii-debug-info), transparent 90%);color:var(--yii-debug-info)}.yii-debug .yii-debug-entity-meta .yii-debug-badge-muted{border-color:color-mix(in srgb, var(--yii-debug-panel-muted), transparent 60%);background:color-mix(in srgb, var(--yii-debug-panel-muted), transparent 90%);color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-entity-meta .yii-debug-badge-success{border-color:color-mix(in srgb, var(--yii-debug-success), transparent 60%);background:color-mix(in srgb, var(--yii-debug-success), transparent 90%);color:var(--yii-debug-success)}.yii-debug .yii-debug-entity-meta .yii-debug-badge-warning{border-color:color-mix(in srgb, var(--yii-debug-warning), transparent 60%);background:color-mix(in srgb, var(--yii-debug-warning), transparent 90%);color:var(--yii-debug-warning)}.yii-debug .yii-debug-entity-body{gap:var(--yii-debug-space-4);grid-template-columns:minmax(180px,2fr) minmax(0,3fr);display:grid}.yii-debug .yii-debug-entity-body[data-cols="1"]{grid-template-columns:1fr}.yii-debug .yii-debug-entity-column{gap:var(--yii-debug-space-3);flex-direction:column;min-width:0;display:flex}.yii-debug .yii-debug-entity-column-title{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.14em;text-transform:uppercase;margin:0;font-weight:700}.yii-debug .yii-debug-file-list{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-file-list+.yii-debug-file-list{margin-top:4px}.yii-debug .yii-debug-file{border:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 60%, transparent);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);grid-template-columns:auto 1fr;align-items:center;gap:6px;min-width:0;padding:4px 8px;display:grid}.yii-debug .yii-debug-file-type{border-radius:var(--yii-debug-radius-pill);min-width:30px;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.02em;justify-content:center;align-items:center;padding:0 5px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-file-type-danger{background:color-mix(in srgb, var(--yii-debug-danger), transparent 84%);color:var(--yii-debug-danger)}.yii-debug .yii-debug-file-type-info{background:color-mix(in srgb, var(--yii-debug-info), transparent 84%);color:var(--yii-debug-info)}.yii-debug .yii-debug-file-type-muted{background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-file-type-success{background:color-mix(in srgb, var(--yii-debug-success), transparent 84%);color:var(--yii-debug-success)}.yii-debug .yii-debug-file-type-warning{background:color-mix(in srgb, var(--yii-debug-warning), transparent 84%);color:var(--yii-debug-warning)}.yii-debug .yii-debug-file-name{color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.yii-debug .yii-debug-entity-column .yii-debug-fact-strip{background:0 0;border:0;border-radius:0;flex-direction:column;gap:4px;margin:0;display:flex;overflow:visible}.yii-debug .yii-debug-entity-column .yii-debug-fact{border:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 60%, transparent);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);grid-template-columns:56px 1fr;align-items:baseline;gap:8px;padding:6px 10px;display:grid}.yii-debug .yii-debug-entity-column .yii-debug-fact-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.12em;text-transform:uppercase;margin:0;font-weight:700}.yii-debug .yii-debug-entity-column .yii-debug-fact-value{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);text-overflow:clip;white-space:normal;word-break:break-all;margin:0;font-weight:400;overflow:visible}.yii-debug .yii-debug-link-strip{padding:10px var(--yii-debug-space-3);border:1px dashed color-mix(in srgb, var(--yii-debug-success), transparent 50%);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-success), transparent 92%);flex-direction:column;gap:8px;display:flex}.yii-debug .yii-debug-link-strip-label{color:var(--yii-debug-success);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.14em;text-transform:uppercase;font-weight:700}.yii-debug .yii-debug-link-strip-list{flex-wrap:wrap;gap:6px;display:flex}.yii-debug .yii-debug-link-pill{border:1px solid color-mix(in srgb, var(--yii-debug-success), transparent 50%);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-success);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);white-space:nowrap;align-items:center;gap:5px;padding:3px 10px 3px 8px;font-weight:600;text-decoration:none;transition:background-color .14s,color .14s,transform .14s,border-color .14s;display:inline-flex}.yii-debug .yii-debug-link-pill:before{content:"↳";opacity:.85;font-size:12px}.yii-debug .yii-debug-link-pill:hover,.yii-debug .yii-debug-link-pill:focus-visible{border-color:var(--yii-debug-success);background:color-mix(in srgb, var(--yii-debug-success), transparent 86%);color:var(--yii-debug-success);text-decoration:none;transform:translateY(-1px)}@media (max-width:720px){.yii-debug .yii-debug-stat-strip{grid-template-columns:repeat(2,minmax(0,1fr))}.yii-debug .yii-debug-entity-body{grid-template-columns:1fr}.yii-debug .yii-debug-entity-head{grid-template-columns:auto 1fr}.yii-debug .yii-debug-entity-meta{grid-column:1/-1;justify-content:flex-start;max-width:100%}}.yii-debug .yii-debug-manifest{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);flex-direction:column;display:flex;overflow:hidden}.yii-debug .yii-debug-manifest-head{align-items:center;gap:var(--yii-debug-space-2);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);color:var(--yii-debug-panel-primary);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.08em;font-weight:700;display:flex}.yii-debug .yii-debug-manifest-count{color:var(--yii-debug-panel-muted);letter-spacing:.12em;text-transform:uppercase;margin-left:auto;font-weight:500}.yii-debug .yii-debug-manifest-grid{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));display:grid}.yii-debug .yii-debug-manifest-item{justify-content:space-between;align-items:baseline;gap:var(--yii-debug-space-3);min-width:0;padding:7px var(--yii-debug-space-4);border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border), transparent 45%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);display:flex}.yii-debug .yii-debug-manifest-name{color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.yii-debug .yii-debug-manifest-version{color:var(--yii-debug-panel-primary);flex:none}.yii-debug .yii-debug-ext-strip{gap:var(--yii-debug-space-2);padding:var(--yii-debug-space-3);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:linear-gradient(0deg, color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 30%), var(--yii-debug-panel-surface));flex-wrap:wrap;display:flex}.yii-debug .yii-debug-ext-pill{align-items:center;gap:var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);letter-spacing:.1em;text-transform:uppercase;padding:6px 12px 6px 9px;font-size:.6875rem;font-weight:500;line-height:1;transition:border-color .15s,background .15s;display:inline-flex}.yii-debug .yii-debug-ext-pill-dot{background:color-mix(in srgb, var(--yii-debug-panel-muted), transparent 60%);border-radius:999px;width:7px;height:7px;display:inline-block}.yii-debug .yii-debug-ext-pill-label{color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-ext-pill-state{margin-left:var(--yii-debug-space-1);color:var(--yii-debug-panel-muted);letter-spacing:.12em;opacity:.7;font-size:.625rem;font-weight:700}.yii-debug .yii-debug-ext-pill.is-on{border-color:color-mix(in srgb, var(--yii-debug-success), transparent 55%);background:color-mix(in srgb, var(--yii-debug-success), var(--yii-debug-panel-surface) 90%)}.yii-debug .yii-debug-ext-pill.is-on .yii-debug-ext-pill-dot{background:var(--yii-debug-success);box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-success), transparent 75%);animation:2.4s ease-in-out infinite yii-debug-led-pulse}.yii-debug .yii-debug-ext-pill.is-on .yii-debug-ext-pill-state{color:var(--yii-debug-success);opacity:1}.yii-debug .yii-debug-ext-pill.is-off{opacity:.55}.yii-debug .yii-debug-phpinfo-shell{gap:var(--yii-debug-space-4);grid-template-columns:220px minmax(0,1fr);align-items:start;display:grid}.yii-debug .yii-debug-phpinfo-toc{top:var(--yii-debug-space-3);max-height:calc(100vh - 80px);padding:var(--yii-debug-space-3);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);scrollbar-width:thin;align-self:start;position:sticky;overflow-y:auto}.yii-debug .yii-debug-phpinfo-toc-title{margin:0 0 var(--yii-debug-space-2);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);align-items:baseline;gap:6px;display:flex}.yii-debug .yii-debug-phpinfo-toc-title span:first-child{color:var(--yii-debug-panel-text);font-variant-numeric:tabular-nums;font-weight:700}.yii-debug .yii-debug-phpinfo-toc-title-note{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);margin-left:auto}.yii-debug .yii-debug-phpinfo-toc-overview,.yii-debug .yii-debug-phpinfo-toc-group-list{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-phpinfo-toc-overview{margin-bottom:var(--yii-debug-space-2);padding-bottom:var(--yii-debug-space-2);border-bottom:var(--yii-debug-border)}.yii-debug .yii-debug-phpinfo-toc-groups{flex-direction:column;gap:2px;display:flex}.yii-debug .yii-debug-phpinfo-toc-group{margin:0}.yii-debug .yii-debug-phpinfo-toc-group-summary{border-radius:var(--yii-debug-radius-sm);color:var(--yii-debug-panel-muted);cursor:pointer;font-size:var(--yii-debug-fs-xs);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:7px;padding:7px 8px;font-weight:600;list-style:none;transition:background-color .12s,color .12s;display:grid}.yii-debug .yii-debug-phpinfo-toc-group-summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-phpinfo-toc-group-summary:before{content:"›";color:var(--yii-debug-panel-muted);font-size:1.1em;line-height:1;transition:transform .12s}.yii-debug .yii-debug-phpinfo-toc-group-summary:hover,.yii-debug .yii-debug-phpinfo-toc-group-summary:focus-visible{background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-phpinfo-toc-group[open]>.yii-debug-phpinfo-toc-group-summary{color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-phpinfo-toc-group[open]>.yii-debug-phpinfo-toc-group-summary:before{transform:rotate(90deg)}.yii-debug .yii-debug-phpinfo-toc-group-count{border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);min-width:22px;color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;text-align:center;padding:1px 6px}.yii-debug .yii-debug-phpinfo-toc-group-list{margin:2px 0 var(--yii-debug-space-2);padding-left:14px}.yii-debug .yii-debug-phpinfo-toc-link{border-radius:0 var(--yii-debug-radius-sm) var(--yii-debug-radius-sm) 0;color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm);border-left:2px solid #0000;padding:7px 10px 7px 12px;text-decoration:none;transition:background-color .12s,color .12s,border-color .12s;display:block}.yii-debug .yii-debug-phpinfo-toc-link:hover,.yii-debug .yii-debug-phpinfo-toc-link:focus-visible{background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-text);text-decoration:none}.yii-debug .yii-debug-phpinfo-toc-link.is-active{border-left-color:var(--yii-debug-panel-primary);background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 90%);color:var(--yii-debug-panel-primary-strong);font-weight:700}.yii-debug .yii-debug-phpinfo-main{min-width:0}.yii-debug .yii-debug-phpinfo-search{margin-bottom:var(--yii-debug-space-3);flex-direction:column;gap:6px;display:flex}.yii-debug .yii-debug-phpinfo-search-control{align-items:center;display:flex;position:relative}.yii-debug .yii-debug-phpinfo-search-icon{width:16px;height:16px;color:var(--yii-debug-panel-muted);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;left:12px}.yii-debug .yii-debug-phpinfo-search-icon svg{width:100%;height:100%}.yii-debug .yii-debug-phpinfo-search-input{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);flex:1;padding:9px 12px 9px 36px;transition:border-color .12s,box-shadow .12s}.yii-debug .yii-debug-phpinfo-search-input::placeholder{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-phpinfo-search-input:focus{border-color:var(--yii-debug-panel-primary);box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 80%)}.yii-debug .yii-debug-phpinfo-search-clear{border-radius:var(--yii-debug-radius-sm);color:var(--yii-debug-panel-link);cursor:pointer;font:inherit;font-size:var(--yii-debug-fs-xs);background:0 0;border:0;padding:4px 8px;font-weight:600;position:absolute;right:8px}.yii-debug .yii-debug-phpinfo-search-clear:hover,.yii-debug .yii-debug-phpinfo-search-clear:focus-visible{background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-link-hover)}.yii-debug .yii-debug-phpinfo-search-control:has(.yii-debug-phpinfo-search-clear:not([hidden])) .yii-debug-phpinfo-search-input{padding-right:58px}.yii-debug .yii-debug-phpinfo-search-feedback{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-2);min-height:18px;padding-inline:2px;display:flex}.yii-debug .yii-debug-phpinfo-search-feedback:has(.yii-debug-phpinfo-search-status:empty):has(.yii-debug-phpinfo-search-empty[hidden]){display:none}.yii-debug .yii-debug-phpinfo-search-status,.yii-debug .yii-debug-phpinfo-search-empty{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-phpinfo-search-empty{color:var(--yii-debug-danger)}.yii-debug .yii-debug-phpinfo-section{scroll-margin-top:var(--yii-debug-space-3)}.yii-debug .yii-debug-phpinfo-section+:is(.yii-debug .yii-debug-phpinfo-section){margin-top:var(--yii-debug-space-4)}.yii-debug .yii-debug-phpinfo-section .yii-debug-disclosure{margin-bottom:0}.yii-debug .yii-debug-phpinfo-toc-link[hidden],.yii-debug .yii-debug-phpinfo-toc-group[hidden],.yii-debug .yii-debug-phpinfo-section[hidden],.yii-debug .yii-debug-phpinfo-search-clear[hidden],.yii-debug .yii-debug-phpinfo-search-empty[hidden],.yii-debug .yii-debug-phpinfo-overview-hero-section[hidden],.yii-debug .yii-debug-disclosure[hidden],.yii-debug .yii-debug-phpinfo-extension-group[hidden],.yii-debug .yii-debug-ext-pill[hidden],.yii-debug .yii-debug-table-wrap[hidden],.yii-debug .yii-debug-phpinfo-module tr[hidden]{display:none}@media (max-width:900px){.yii-debug .yii-debug-phpinfo-shell{grid-template-columns:1fr}.yii-debug .yii-debug-phpinfo-toc{max-height:none;position:static;overflow:hidden}.yii-debug .yii-debug-phpinfo-toc-groups{gap:4px var(--yii-debug-space-2);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.yii-debug .yii-debug-phpinfo-toc-group[open]{grid-column:1/-1}.yii-debug .yii-debug-phpinfo-toc-group-list{grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:4px;padding-left:0;display:grid}.yii-debug .yii-debug-phpinfo-toc-link{border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);border-left:0;padding:4px 10px}.yii-debug .yii-debug-phpinfo-toc-link.is-active{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 80%);border-left:0}}@media (max-width:560px){.yii-debug .yii-debug-phpinfo-toc-groups{grid-template-columns:1fr}}.yii-debug .yii-debug-phpinfo-overview-hero{gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-3);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}@media (max-width:720px){.yii-debug .yii-debug-phpinfo-overview-hero{grid-template-columns:1fr}}.yii-debug .yii-debug-phpinfo-overview-hero-headline{align-items:center;gap:var(--yii-debug-space-3);grid-template-columns:1fr auto;display:grid}.yii-debug .yii-debug-phpinfo-overview-hero-version{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-display,var(--yii-debug-font-mono));letter-spacing:-.02em;font-size:clamp(1.6rem,2.4vw + 1rem,2.4rem);font-weight:800;line-height:1}.yii-debug .yii-debug-phpinfo-overview-hero-mark{border-radius:var(--yii-debug-radius-pill);border:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);min-width:64px;color:var(--yii-debug-panel-primary-strong);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-lg);letter-spacing:.08em;text-transform:lowercase;justify-content:center;align-items:center;padding:6px 14px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-phpinfo-overview-hero-metrics{gap:var(--yii-debug-space-2) var(--yii-debug-space-4);grid-template-columns:repeat(auto-fit,minmax(150px,1fr));margin:0;display:grid}.yii-debug .yii-debug-phpinfo-overview-hero-section{gap:var(--yii-debug-space-3);min-width:0;padding:var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);flex-direction:column;display:flex}.yii-debug .yii-debug-phpinfo-overview-hero-section:first-child{grid-column:1/-1}.yii-debug .yii-debug-phpinfo-extensions{grid-column:1/-1}.yii-debug .yii-debug-phpinfo-extensions>.yii-debug-phpinfo-extension-groups{padding:var(--yii-debug-space-4)}.yii-debug .yii-debug-phpinfo-extension-group-count{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;padding:1px 7px}.yii-debug .yii-debug-phpinfo-extension-groups{gap:var(--yii-debug-space-3);flex-direction:column;display:flex}.yii-debug .yii-debug-phpinfo-extension-group{gap:var(--yii-debug-space-2);flex-direction:column;display:flex}.yii-debug .yii-debug-phpinfo-extension-group-head{align-items:center;gap:var(--yii-debug-space-2);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);font-weight:600;display:flex}.yii-debug .yii-debug-phpinfo-extension-group-head .yii-debug-phpinfo-extension-group-count{margin-left:auto}.yii-debug .yii-debug-phpinfo-extension-group .yii-debug-ext-pill{scroll-margin-top:var(--yii-debug-space-4)}.yii-debug .yii-debug-phpinfo-extension-group .yii-debug-ext-pill:target,.yii-debug .yii-debug-phpinfo-extension-group .yii-debug-ext-pill.is-search-match{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 45%);background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 90%)}.yii-debug .yii-debug-phpinfo-overview-block-head{border-bottom:var(--yii-debug-border);align-items:center;gap:10px;padding-bottom:8px;display:flex}.yii-debug .yii-debug-phpinfo-overview-block-eyebrow{color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);font-weight:600}.yii-debug .yii-debug-phpinfo-overview-hero-metric{flex-direction:column;gap:3px;padding-block:2px;display:flex}.yii-debug .yii-debug-phpinfo-overview-hero-metric dt{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);margin:0;font-weight:600;line-height:1.2}.yii-debug .yii-debug-phpinfo-overview-hero-metric dd{overflow-wrap:break-word;min-width:0;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);margin:0;line-height:1.4}.yii-debug .yii-debug-phpinfo-overview-hero-metric dd code{color:inherit;background:0 0;padding:0}.yii-debug .yii-debug-phpinfo-overview-hero-metric.is-wide{grid-column:1/-1}.yii-debug .yii-debug-phpinfo-overview-pill{border-radius:var(--yii-debug-radius-pill);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;border:1px solid #0000;align-items:center;gap:6px;padding:1px 10px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-phpinfo-overview-pill[data-variant=success]{color:var(--yii-debug-success);background:color-mix(in srgb, var(--yii-debug-success), transparent 86%);border-color:color-mix(in srgb, var(--yii-debug-success), transparent 65%)}.yii-debug .yii-debug-phpinfo-overview-pill[data-variant=muted]{color:var(--yii-debug-panel-muted);background:var(--yii-debug-panel-surface-muted);border-color:var(--yii-debug-panel-border)}.yii-debug .yii-debug-phpinfo-overview-token{border:1px solid var(--yii-debug-panel-border);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);padding:1px 8px}.yii-debug .yii-debug-phpinfo-overview-files{flex-wrap:wrap;gap:4px;display:flex}.yii-debug .yii-debug-phpinfo-overview-files .yii-debug-phpinfo-overview-token{cursor:help;transition:border-color .12s,background-color .12s}.yii-debug .yii-debug-phpinfo-overview-files .yii-debug-phpinfo-overview-token:hover{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 40%);background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 88%)}.yii-debug .yii-debug-phpinfo-module{gap:var(--yii-debug-space-3);flex-direction:column;margin-top:0;display:flex}.yii-debug .yii-debug-phpinfo-module-head{align-items:center;gap:10px;margin:0;padding:2px 2px 0;display:flex}.yii-debug .yii-debug-phpinfo-module-head h2{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xl);text-align:left;background:0 0;margin:0;padding:0;font-weight:600}.yii-debug .yii-debug-phpinfo-table-section{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);overflow:hidden}.yii-debug .yii-debug-phpinfo-table-section-head{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-2);padding:9px var(--yii-debug-space-3);border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-sm);font-weight:600;display:flex}.yii-debug .yii-debug-phpinfo-variable-group>summary{cursor:pointer;list-style:none;transition:background-color .12s}.yii-debug .yii-debug-phpinfo-variable-group>summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-phpinfo-variable-group>summary:hover,.yii-debug .yii-debug-phpinfo-variable-group>summary:focus-visible{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-phpinfo-variable-group>summary>span:first-child{align-items:center;gap:8px;display:inline-flex}.yii-debug .yii-debug-phpinfo-variable-group>summary>span:first-child:before{content:"›";color:var(--yii-debug-panel-muted);font-size:1.1em;line-height:1;transition:transform .12s}.yii-debug .yii-debug-phpinfo-variable-group[open]>summary>span:first-child:before{transform:rotate(90deg)}.yii-debug .yii-debug-phpinfo-table-section-count{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;flex:none;padding:1px 7px;font-weight:500}.yii-debug .yii-debug-phpinfo-table-scroll{min-width:0;overflow-x:auto}.yii-debug .yii-debug-phpinfo-module .yii-debug-table{table-layout:fixed;min-width:560px}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr>:first-child{width:40%}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr>:nth-child(2):last-child{width:60%}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr>:nth-child(2):not(:last-child),.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr>:nth-child(3){width:30%}.yii-debug .yii-debug-phpinfo-module .yii-debug-table th,.yii-debug .yii-debug-phpinfo-module .yii-debug-table td{text-align:left}.yii-debug .yii-debug-phpinfo-module .yii-debug-table th[scope=row]{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);white-space:normal;font-weight:500}.yii-debug .yii-debug-phpinfo-module .yii-debug-table td{font-family:var(--yii-debug-font-mono)}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr.h>*{z-index:1;background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.03em;text-transform:uppercase;font-weight:700;position:sticky;top:0}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr.is-search-match>*{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 88%)!important}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr.has-local-override>td:nth-child(2){box-shadow:inset 2px 0 0 color-mix(in srgb, var(--yii-debug-warning), transparent 25%);color:color-mix(in srgb, var(--yii-debug-warning) 72%, var(--yii-debug-panel-text))}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-phpinfo-table-scroll{overflow:visible}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts{table-layout:auto;min-width:0;display:block}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tbody{grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact{border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border), transparent 25%);grid-template-columns:minmax(130px,.85fr) minmax(0,1.15fr);min-width:0;display:grid}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact:nth-child(odd){border-right:1px solid color-mix(in srgb, var(--yii-debug-panel-border), transparent 25%)}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact.yii-debug-phpinfo-fact-wide{border-right:0;grid-column:1/-1}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact>*{overflow-wrap:anywhere;background:0 0;border:0;width:auto;padding:9px 12px}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact>th{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);font-weight:600}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact>td{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact-subheading{grid-column:1/-1;display:block}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact-subheading>th{border-block:var(--yii-debug-border);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 15%);width:auto;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.02em;text-align:left;padding:8px 12px;font-weight:600;display:block}.yii-debug .yii-debug-phpinfo-status-pill,.yii-debug .yii-debug-phpinfo-redacted{border-radius:var(--yii-debug-radius-pill);width:-moz-fit-content;width:fit-content;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.03em;border:1px solid #0000;align-items:center;padding:1px 8px;font-weight:600;display:inline-flex}.yii-debug .yii-debug-phpinfo-status-pill[data-variant=success]{border-color:color-mix(in srgb, var(--yii-debug-success), transparent 65%);background:color-mix(in srgb, var(--yii-debug-success), transparent 88%);color:var(--yii-debug-success)}.yii-debug .yii-debug-phpinfo-status-pill[data-variant=muted]{border-color:var(--yii-debug-panel-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-phpinfo-redacted{border-color:color-mix(in srgb, var(--yii-debug-warning), transparent 65%);background:color-mix(in srgb, var(--yii-debug-warning), transparent 90%);color:color-mix(in srgb, var(--yii-debug-warning) 72%, var(--yii-debug-panel-text));text-transform:uppercase}.yii-debug .yii-debug-phpinfo-table-section.is-note .yii-debug-table.is-note{table-layout:auto;min-width:0}.yii-debug .yii-debug-phpinfo-table-section.is-note .yii-debug-table.is-note td,.yii-debug .yii-debug-phpinfo-table-section.is-note .yii-debug-table.is-note th{width:auto;padding:var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);text-align:left;line-height:1.6}@media (max-width:720px){.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tbody{grid-template-columns:1fr}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact{border-right:0}}@media (max-width:959px){.yii-debug .yii-debug-sidebar{min-width:0}.yii-debug .yii-debug-nav{overscroll-behavior-x:contain;scrollbar-width:thin;overflow-x:auto}.yii-debug .yii-debug-nav ul{gap:var(--yii-debug-space-1);flex-direction:row;width:max-content;min-width:100%}.yii-debug .yii-debug-nav-link{white-space:nowrap;min-height:40px}.yii-debug .yii-debug-nav-link:after{display:none}.yii-debug .yii-debug-nav-link-icon{margin-right:var(--yii-debug-space-1)}}@media (max-width:767px){.yii-debug .yii-debug-page{padding:var(--yii-debug-space-2)}.yii-debug .yii-debug-card{padding:var(--yii-debug-space-3)}}@media (prefers-reduced-motion:reduce){.yii-debug *,.yii-debug :before,.yii-debug :after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@keyframes yii-debug-readout-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes yii-debug-led-pulse{0%,to{box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-success), transparent 75%)}50%{box-shadow:0 0 0 6px color-mix(in srgb, var(--yii-debug-success), transparent 90%)}}.yii-debug-tl-filter{align-items:end;gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);flex-wrap:wrap;display:flex}.yii-debug-tl-field{flex-direction:column;gap:4px;min-width:160px;display:flex}.yii-debug-tl-field label{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;font-weight:600}.yii-debug-tl-field input{padding:6px var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font:inherit;font-family:var(--yii-debug-font-mono)}.yii-debug-tl-field input::placeholder{color:var(--yii-debug-panel-muted)}.yii-debug-tl-field input:focus{border-color:var(--yii-debug-panel-primary)}.yii-debug-tl-field-grow{flex:240px}.yii-debug-tl-hint{margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:1px dashed color-mix(in srgb, var(--yii-debug-panel-border) 70%, transparent);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 40%)}.yii-debug-tl-hint-title{color:var(--yii-debug-panel-text);margin:0 0 6px;font-weight:600}.yii-debug-tl-hint-body{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm);margin:0;line-height:1.55}.yii-debug-tl-hint-body em{color:var(--yii-debug-panel-text);font-style:normal;font-weight:600}.yii-debug-tl{--yii-debug-tl-label-col:22%;grid-template-columns:minmax(180px, var(--yii-debug-tl-label-col)) 1fr;border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);grid-template-rows:auto 1fr auto;gap:0;display:grid;overflow:hidden}@media (max-width:1440px){.yii-debug-tl{--yii-debug-tl-label-col:32%}}.yii-debug-tl-axis{border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);grid-column:2/3;height:32px;padding:8px 0;position:relative}.yii-debug-tl-tick{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;white-space:nowrap;pointer-events:none;position:absolute;top:8px;transform:translate(-50%)}.yii-debug-tl-tick:after{content:"";background:var(--yii-debug-panel-border);width:1px;height:8px;position:absolute;top:18px;left:50%}.yii-debug-tl-rows{grid-column:1/3;grid-template-columns:minmax(180px, var(--yii-debug-tl-label-col)) 1fr;background:linear-gradient(to right, transparent calc(var(--yii-debug-tl-label-col) - 1px), var(--yii-debug-panel-border) calc(var(--yii-debug-tl-label-col) - 1px), var(--yii-debug-panel-border) var(--yii-debug-tl-label-col), transparent var(--yii-debug-tl-label-col));display:grid}.yii-debug-tl-row{display:contents}.yii-debug-tl-row:hover .yii-debug-tl-label,.yii-debug-tl-row:hover .yii-debug-tl-track{background:var(--yii-debug-panel-surface-hover)}.yii-debug-tl-row:hover .yii-debug-tl-name{color:var(--yii-debug-panel-text)}.yii-debug-tl-label{min-width:0;padding:8px var(--yii-debug-space-3) 8px calc(var(--yii-debug-space-3) + (var(--depth,0) * 14px));border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 50%, transparent);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;transition:background-color .12s;display:grid}.yii-debug-tl-dot{background:var(--yii-debug-cat-db);opacity:.85;border-radius:50%;flex:none;width:6px;height:6px}.yii-debug-tl-name{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);color:var(--yii-debug-panel-muted);text-overflow:ellipsis;white-space:nowrap;transition:color .12s;overflow:hidden}.yii-debug-tl-track{border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 50%, transparent);transition:background-color .12s;position:relative}.yii-debug-tl-bar{background:var(--yii-debug-cat-db);border-radius:4px;min-width:2px;height:18px;position:absolute;top:50%;transform:translateY(-50%);box-shadow:inset 0 1px #ffffff1f,0 1px 2px #0000002e}.yii-debug-tl-bar-duration{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;white-space:nowrap;justify-self:end;font-weight:500}.yii-debug-tl-memory{grid-template-columns:minmax(180px, var(--yii-debug-tl-label-col)) 1fr auto;padding:var(--yii-debug-space-2) var(--yii-debug-space-3);border-top:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);grid-column:1/3;align-items:center;display:grid}.yii-debug-tl-memory-label{text-transform:uppercase;letter-spacing:.06em}.yii-debug-tl-memory-track{border-radius:var(--yii-debug-radius-sm);background:color-mix(in srgb, var(--yii-debug-panel-surface), transparent 50%);width:100%;color:var(--yii-debug-panel-primary);position:relative;overflow:hidden}.yii-debug-tl-memory-track svg{width:100%;height:100%;display:block}.yii-debug-tl-memory-peak{margin-left:var(--yii-debug-space-2);color:var(--yii-debug-panel-text);font-weight:700}@media (max-width:640px){.yii-debug-tl,.yii-debug-tl-rows{--yii-debug-tl-label-col:52%;grid-template-columns:minmax(140px, var(--yii-debug-tl-label-col)) minmax(0, 1fr)}.yii-debug-tl-label{padding:7px var(--yii-debug-space-2);gap:6px}.yii-debug-tl-memory{grid-template-columns:minmax(140px, var(--yii-debug-tl-label-col)) minmax(0, 1fr)}.yii-debug-tl-memory-peak{text-align:right;grid-column:2;margin:4px 0 0}}.yii-debug .yii-debug-skip-link{top:var(--yii-debug-space-2);left:var(--yii-debug-space-2);z-index:1000;padding:var(--yii-debug-space-2) var(--yii-debug-space-3);border:2px solid var(--yii-debug-focus-ring);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-md);color:var(--yii-debug-panel-text);transform:translateY(calc(-100% - var(--yii-debug-space-4)));font-weight:700;position:fixed}.yii-debug .yii-debug-skip-link:focus-visible{text-decoration:none;transform:translateY(0)}.yii-debug .yii-debug-brand-chip-control{border:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);cursor:pointer;justify-content:center}.yii-debug .yii-debug-brand-chip-control:hover,.yii-debug .yii-debug-brand-chip-control:focus-visible{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 50%);color:var(--yii-debug-panel-primary-strong);transform:translateY(-1px)}.yii-debug :is(h2,h3).yii-debug-has-permalink{align-items:center;gap:var(--yii-debug-space-1);scroll-margin-block-start:var(--yii-debug-space-5);display:flex}.yii-debug .yii-debug-heading-permalink{border-radius:var(--yii-debug-radius-sm);min-width:32px;min-height:32px;color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);opacity:0;transition:color var(--yii-debug-duration-fast) ease, opacity var(--yii-debug-duration-fast) ease, background var(--yii-debug-duration-fast) ease;flex:none;justify-content:center;align-items:center;line-height:1;text-decoration:none;display:inline-flex}.yii-debug .yii-debug-heading-permalink:hover,.yii-debug .yii-debug-heading-permalink:focus-visible{background:var(--yii-debug-panel-bg-accent);color:var(--yii-debug-panel-primary-strong);opacity:1;text-decoration:none}.yii-debug :is(h2,h3).yii-debug-has-permalink:hover>.yii-debug-heading-permalink,.yii-debug :is(h2,h3).yii-debug-has-permalink:focus-within>.yii-debug-heading-permalink,.yii-debug :is(h2,h3).yii-debug-deep-link-target>.yii-debug-heading-permalink{opacity:1}.yii-debug .yii-debug-deep-link-target{outline:2px solid var(--yii-debug-focus-ring);outline-offset:4px}.yii-debug .yii-debug-db-n1-summary{gap:var(--yii-debug-space-2);margin-bottom:var(--yii-debug-space-4);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:1px solid color-mix(in srgb, var(--yii-debug-warning), transparent 55%);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-warning), transparent 92%);display:grid}.yii-debug .yii-debug-db-n1-heading{justify-content:space-between;align-items:baseline;gap:var(--yii-debug-space-2);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-db-n1-list{gap:var(--yii-debug-space-2);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-db-n1-link,.yii-debug .yii-debug-db-n1-row-link{align-items:center;gap:var(--yii-debug-space-2);min-height:var(--yii-debug-control-min-size);padding:var(--yii-debug-space-1) var(--yii-debug-space-2);border:1px solid color-mix(in srgb, var(--yii-debug-warning), transparent 60%);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:color-mix(in srgb, var(--yii-debug-warning) 72%, var(--yii-debug-panel-text));font-size:var(--yii-debug-fs-xs);font-weight:700;text-decoration:none;display:inline-flex}:is(.yii-debug .yii-debug-db-n1-link,.yii-debug .yii-debug-db-n1-row-link):hover,:is(.yii-debug .yii-debug-db-n1-link,.yii-debug .yii-debug-db-n1-row-link):focus-visible,:is(.yii-debug .yii-debug-db-n1-link,.yii-debug .yii-debug-db-n1-row-link)[aria-current=true]{background:color-mix(in srgb, var(--yii-debug-warning), transparent 84%);color:var(--yii-debug-panel-text);text-decoration:none}.yii-debug .yii-debug-db-n1-fingerprint{max-width:min(56ch,65vw);font-family:var(--yii-debug-font-mono);text-overflow:ellipsis;white-space:nowrap;font-weight:500;display:inline-block;overflow:hidden}.yii-debug .yii-debug-db-n1-row-link{margin-top:var(--yii-debug-space-3)}.yii-debug .yii-debug-grid-db .yii-debug-trace{gap:0;display:grid}.yii-debug .yii-debug-grid-db .yii-debug-trace a{align-items:center;min-height:24px;display:inline-flex}.yii-debug .yii-debug-db-n1-clear[hidden]{display:none}.yii-debug .yii-debug-compare-form{gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-4);grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));align-items:end;display:grid}.yii-debug .yii-debug-compare-overview{gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-4);grid-template-columns:repeat(auto-fit,minmax(min(100%,12rem),1fr));display:grid}.yii-debug .yii-debug-compare-grid{min-width:42rem}.yii-debug :is(.yii-debug-delta-up,.yii-debug-delta-down,.yii-debug-delta-neutral){padding:2px var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;align-items:center;font-weight:700;display:inline-flex}.yii-debug .yii-debug-delta-up{border-color:color-mix(in srgb, var(--yii-debug-danger), transparent 60%);background:color-mix(in srgb, var(--yii-debug-danger), transparent 90%);color:var(--yii-debug-danger)}.yii-debug .yii-debug-delta-down{border-color:color-mix(in srgb, var(--yii-debug-success), transparent 60%);background:color-mix(in srgb, var(--yii-debug-success), transparent 90%);color:var(--yii-debug-success)}.yii-debug .yii-debug-delta-neutral{background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted)}@container yii-debug-main (width<=560px){.yii-debug .yii-debug-section-header,.yii-debug .yii-debug-panel-heading{flex-direction:column;align-items:stretch}.yii-debug .yii-debug-filter-input{width:100%;max-width:none}}@media (max-width:767px){.yii-debug .yii-debug-brand-chip-copy .yii-debug-brand-label{text-overflow:ellipsis;white-space:nowrap;max-width:5.5rem;overflow:hidden}}@media (pointer:coarse){.yii-debug .yii-debug-grid-db .yii-debug-trace a{min-width:44px;min-height:44px}.yii-debug :is(.yii-debug-btn,.yii-debug-brand-chip,.yii-debug-cell-more-toggle,.yii-debug-filter-input,.yii-debug-heading-permalink,.yii-debug-server-group-summary,.yii-debug-tab-link){min-height:44px}}@media (forced-colors:active){.yii-debug .yii-debug-card,.yii-debug .yii-debug-brand-bar,.yii-debug .yii-debug-brand-chip,.yii-debug .yii-debug-nav,.yii-debug .yii-debug-table-wrap{box-shadow:none;border-color:canvastext}.yii-debug .yii-debug-nav-link.is-active,.yii-debug .yii-debug-tab-link.is-active{color:highlighttext;background:highlight;border-color:highlight}.yii-debug :focus-visible{outline-color:highlight}} +:root,:host{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--yii-debug-font-sans:"IBM Plex Sans", ui-sans-serif, system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, helvetica, arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";--yii-debug-font-mono:"JetBrains Mono", ui-monospace, sfmono-regular, menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace;--yii-debug-font-display:var(--yii-debug-font-mono);--yii-debug-space-1:4px;--yii-debug-space-2:8px;--yii-debug-space-3:12px;--yii-debug-space-4:16px;--yii-debug-space-5:24px;--yii-debug-space-6:32px;--yii-debug-radius-sm:6px;--yii-debug-radius-md:10px;--yii-debug-radius-lg:14px;--yii-debug-radius-pill:999px;--yii-debug-fs-xs:.75rem;--yii-debug-fs-sm:.8125rem;--yii-debug-fs-base:.9375rem;--yii-debug-fs-lg:1.0625rem;--yii-debug-fs-xl:1.25rem;--yii-debug-fs-2xl:1.5rem;--yii-debug-control-min-size:36px;--yii-debug-panel-padding:var(--yii-debug-space-5);--yii-debug-row-padding-block:10px;--yii-debug-duration-fast:.12s;--yii-debug-duration-normal:.18s;--yii-debug-panel-bg:var(--lightningcss-light,#f2f5f1)var(--lightningcss-dark,#0c120e);--yii-debug-panel-bg-accent:var(--lightningcss-light,#0e7a551a)var(--lightningcss-dark,#2fd08c14);--yii-debug-panel-surface:var(--lightningcss-light,#fffffff0)var(--lightningcss-dark,#121a15eb);--yii-debug-panel-surface-muted:var(--lightningcss-light,#f6f8f5)var(--lightningcss-dark,#101812);--yii-debug-panel-surface-hover:var(--lightningcss-light,#e9f2ec)var(--lightningcss-dark,#1a241d);--yii-debug-panel-border:var(--lightningcss-light,#5d7a6942)var(--lightningcss-dark,#8fa39633);--yii-debug-panel-border-strong:var(--lightningcss-light,#4660515c)var(--lightningcss-dark,#8fa39652);--yii-debug-panel-text:var(--lightningcss-light,#16211a)var(--lightningcss-dark,#e4ede6);--yii-debug-panel-muted:var(--lightningcss-light,#5c6b60)var(--lightningcss-dark,#8fa396);--yii-debug-panel-link:var(--lightningcss-light,#0b6b4a)var(--lightningcss-dark,#4fd39a);--yii-debug-panel-link-hover:var(--lightningcss-light,#0d855b)var(--lightningcss-dark,#7fe4b8);--yii-debug-panel-primary:var(--lightningcss-light,#0e7a55)var(--lightningcss-dark,#2fd08c);--yii-debug-primary-bg:linear-gradient(135deg, var(--yii-debug-panel-primary-strong), var(--yii-debug-panel-primary));--yii-debug-on-primary:var(--lightningcss-light,#fff)var(--lightningcss-dark,#06281b);--yii-debug-panel-primary-strong:var(--lightningcss-light,#0a5c40)var(--lightningcss-dark,#17a673);--yii-debug-focus-ring:var(--lightningcss-light,#075c40)var(--lightningcss-dark,#7fe4b8);--yii-debug-success:var(--lightningcss-light,#0d7d47)var(--lightningcss-dark,#34c97e);--yii-debug-warning:var(--lightningcss-light,#8f5000)var(--lightningcss-dark,#e8a33d);--yii-debug-danger:var(--lightningcss-light,#c93838)var(--lightningcss-dark,#f16a6a);--yii-debug-on-success:var(--lightningcss-light,#fff)var(--lightningcss-dark,#0c120e);--yii-debug-on-warning:var(--lightningcss-light,#fff)var(--lightningcss-dark,#1c1917);--yii-debug-on-danger:var(--lightningcss-light,#fff)var(--lightningcss-dark,#1c1917);--yii-debug-info:var(--lightningcss-light,#205f9d)var(--lightningcss-dark,#5fa8e8);--yii-debug-on-info:var(--yii-debug-panel-bg);--yii-debug-panel-code-bg:var(--lightningcss-light,#ecf1ec)var(--lightningcss-dark,#17211a);--yii-debug-panel-pill:var(--lightningcss-light,#16211a0f)var(--lightningcss-dark,#8fa3962e);--yii-debug-panel-shadow:var(--lightningcss-light,0 22px 60px #16211a14)var(--lightningcss-dark,0 22px 60px #0006);--yii-debug-border:1px solid var(--yii-debug-panel-border);--yii-debug-border-strong:1px solid var(--yii-debug-panel-border-strong);--yii-debug-shadow-sm:0 1px 2px #0f172a0f;--yii-debug-shadow-md:0 10px 24px #0f172a14;--yii-debug-verb-get:var(--lightningcss-light,#0b7285)var(--lightningcss-dark,#4dc4d9);--yii-debug-verb-post:var(--lightningcss-light,#6941c6)var(--lightningcss-dark,#a78bfa);--yii-debug-verb-put:var(--lightningcss-light,#b26a00)var(--lightningcss-dark,#e8a33d);--yii-debug-verb-delete:var(--lightningcss-light,#c93838)var(--lightningcss-dark,#f16a6a);--yii-debug-verb-other:var(--yii-debug-panel-muted);--yii-debug-status-2xx:var(--yii-debug-success);--yii-debug-status-3xx:var(--yii-debug-warning);--yii-debug-status-4xx:var(--lightningcss-light,#c2410c)var(--lightningcss-dark,#fb923c);--yii-debug-status-5xx:var(--yii-debug-danger);--yii-debug-level-error:var(--yii-debug-danger);--yii-debug-level-warning:var(--yii-debug-warning);--yii-debug-level-info:var(--yii-debug-info);--yii-debug-level-trace:var(--yii-debug-panel-muted);--yii-debug-level-profile:var(--lightningcss-light,#9333ea)var(--lightningcss-dark,#b16be8);--yii-debug-level-other:var(--yii-debug-panel-muted);--yii-debug-gauge-fill:var(--yii-debug-panel-primary);--yii-debug-gauge-track:var(--lightningcss-light,#0e7a5529)var(--lightningcss-dark,#2fd08c24);--yii-debug-sql-kw:var(--lightningcss-light,#0a5c40)var(--lightningcss-dark,#4fd39a);--yii-debug-sql-str:var(--lightningcss-light,#8f4e00)var(--lightningcss-dark,#e8a33d);--yii-debug-sql-num:var(--yii-debug-info);--yii-debug-sql-comment:var(--yii-debug-panel-muted);--yii-debug-sql-param:var(--lightningcss-light,#6941c6)var(--lightningcss-dark,#a78bfa);--yii-debug-cat-app:var(--lightningcss-light,#0a6b47)var(--lightningcss-dark,#14b06e);--yii-debug-cat-db:var(--lightningcss-light,#0994b8)var(--lightningcss-dark,#0999be);--yii-debug-cat-view:var(--lightningcss-light,#6941c6)var(--lightningcss-dark,#8f6ce8);--yii-debug-cat-cache:var(--lightningcss-light,#b26a00)var(--lightningcss-dark,#c28300);--yii-debug-cat-mail:var(--lightningcss-light,#b23a67)var(--lightningcss-dark,#d95f8f);--yii-debug-cat-queue:var(--lightningcss-light,#3f4dbd)var(--lightningcss-dark,#6d7ce6);--yii-debug-cat-other:var(--yii-debug-panel-muted)}@media (prefers-color-scheme:dark){:root,:host{--lightningcss-light: ;--lightningcss-dark:initial}}:root[data-yii-debug-theme=light],:host([data-theme=light]){--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-yii-debug-theme=dark],:host([data-theme=dark]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(../fonts/jetbrains-mono-latin-400-normal.woff2)format("woff2");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;font-style:normal;font-display:swap;font-weight:500;src:url(../fonts/jetbrains-mono-latin-500-normal.woff2)format("woff2");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;font-style:normal;font-display:swap;font-weight:700;src:url(../fonts/jetbrains-mono-latin-700-normal.woff2)format("woff2");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:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(../fonts/ibm-plex-sans-latin-400-normal.woff2)format("woff2");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:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(../fonts/ibm-plex-sans-latin-500-normal.woff2)format("woff2");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:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(../fonts/ibm-plex-sans-latin-600-normal.woff2)format("woff2");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:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:700;src:url(../fonts/ibm-plex-sans-latin-700-normal.woff2)format("woff2");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}.yii-debug .yii-debug-event-controls{margin-block:var(--yii-debug-space-4);font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-event-groups{align-items:center;gap:var(--yii-debug-space-2);margin-block:var(--yii-debug-space-4);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-event-group{align-items:center;gap:var(--yii-debug-space-2);min-height:var(--yii-debug-control-min-size);padding:var(--yii-debug-space-1) var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);overflow-wrap:anywhere;display:inline-flex}.yii-debug .yii-debug-event-item>summary{cursor:pointer;list-style:none}.yii-debug .yii-debug-event-item>summary:focus-visible{outline:2px solid var(--yii-debug-panel-primary);outline-offset:4px;border-radius:var(--yii-debug-radius-sm)}.yii-debug :is(.yii-debug-event-clock,.yii-debug-event-identity){gap:var(--yii-debug-space-1);display:grid}.yii-debug .yii-debug-event-clock{min-width:105px}.yii-debug .yii-debug-event-time{white-space:nowrap;color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-event-identity{overflow-wrap:anywhere;min-width:0}.yii-debug .yii-debug-event-name:before{content:"+ ";color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-event-item[open] .yii-debug-event-name:before{content:"− "}.yii-debug .yii-debug-event-timing{font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-event-detail-row{display:none}.yii-debug .yii-debug-table tr:has(.yii-debug-event-item[open])+.yii-debug-event-detail-row{display:table-row}.yii-debug .yii-debug-table .yii-debug-event-detail-row>td{padding:0}.yii-debug .yii-debug-event-detail{gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-4);background:var(--yii-debug-panel-surface-muted);white-space:normal;grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.yii-debug .yii-debug-event-detail>div{min-width:0}.yii-debug .yii-debug-event-detail-footer{gap:var(--yii-debug-space-2) var(--yii-debug-space-4);flex-wrap:wrap;grid-column:1/-1;display:flex}.yii-debug .yii-debug-event-metadata{gap:var(--yii-debug-space-2) var(--yii-debug-space-3);grid-template-columns:minmax(75px,.4fr) minmax(0,1fr);display:grid}.yii-debug .yii-debug-event-metadata dt{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-event-metadata dd{margin:0}.yii-debug .yii-debug-event-trace pre{white-space:pre-wrap;overflow-wrap:anywhere}.yii-debug :is(.yii-debug-event-context,.yii-debug-event-trace)>:last-child{margin-bottom:0}@media not (min-width:768px){.yii-debug .yii-debug-event-detail{grid-template-columns:minmax(0,1fr)}}.yii-debug .yii-debug-event-coverage>summary{min-height:var(--yii-debug-control-min-size);padding-block:var(--yii-debug-space-2);cursor:pointer}.yii-debug .yii-debug-request-hero{margin-bottom:var(--yii-debug-space-4);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);box-shadow:var(--yii-debug-shadow-sm)}.yii-debug .yii-debug-request-overview{margin-bottom:var(--yii-debug-space-4);border:var(--yii-debug-border);border-inline-start:4px solid color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 76%, var(--yii-debug-panel-text));border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);overflow:hidden}.yii-debug .yii-debug-request-overview-header{gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-4);grid-template-columns:minmax(0,1fr) auto;align-items:center;display:grid}.yii-debug .yii-debug-request-overview-identity{min-width:0}.yii-debug .yii-debug-request-hero-line{align-items:center;gap:var(--yii-debug-space-2);min-width:0;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-base);display:flex}.yii-debug .yii-debug-request-hero-method{border-radius:var(--yii-debug-radius-pill);letter-spacing:.04em;flex:none;padding:2px 10px;font-weight:700}.yii-debug .yii-debug-request-hero-url{min-width:0;color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;flex:auto;overflow:hidden}.yii-debug .yii-debug-request-hero-meta{align-items:center;gap:6px var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);flex-wrap:wrap;margin-top:6px;display:flex}.yii-debug .yii-debug-request-hero-meta:empty{display:none}.yii-debug .yii-debug-request-hero-meta-item{align-items:baseline;gap:var(--yii-debug-space-1);display:inline-flex}.yii-debug .yii-debug-request-hero-meta-label{font-family:var(--yii-debug-font-sans);letter-spacing:.07em;text-transform:uppercase;font-size:.625rem;font-weight:700}.yii-debug .yii-debug-request-hero-meta-value{color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-request-overview-status{text-align:right;min-width:72px}.yii-debug .yii-debug-request-overview-metrics{border-block:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);grid-template-columns:minmax(0,1fr) minmax(0,2fr) auto;margin:0;display:grid}.yii-debug .yii-debug-request-overview-metric{min-width:0;padding:var(--yii-debug-space-3) var(--yii-debug-space-4)}.yii-debug .yii-debug-request-overview-metric+:is(.yii-debug .yii-debug-request-overview-metric){border-inline-start:var(--yii-debug-border)}.yii-debug .yii-debug-request-overview-metric dt{color:var(--yii-debug-panel-muted);letter-spacing:.07em;text-transform:uppercase;margin-bottom:2px;font-size:.6875rem;font-weight:700}.yii-debug .yii-debug-request-overview-metric dd{align-items:center;gap:var(--yii-debug-space-2);min-width:0;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);overflow-wrap:anywhere;flex-wrap:wrap;margin:0;font-weight:600;display:flex}.yii-debug .yii-debug-request-overview-meta{align-items:center;gap:var(--yii-debug-space-2) var(--yii-debug-space-5);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-request-overview-config{align-items:center;gap:var(--yii-debug-space-2);flex-wrap:wrap;margin-inline-start:auto;display:inline-flex}.yii-debug .yii-debug-request-overview-meta-item{flex-direction:column;align-items:flex-start;min-width:0;display:inline-flex}.yii-debug .yii-debug-request-overview-meta-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);letter-spacing:.07em;text-transform:uppercase;margin-bottom:2px;font-size:.6875rem;font-weight:700}.yii-debug .yii-debug-request-overview-tag{max-width:34ch;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.yii-debug .yii-debug-request-routing-error{border-width:1px 0 0 4px;border-radius:0;margin:0}.yii-debug .yii-debug-request-routing-error p{margin:0}.yii-debug .yii-debug-request-tabs{min-width:0}.yii-debug .yii-debug-request-tabs>.yii-debug-tabs{scrollbar-width:thin;flex-wrap:nowrap;overflow-x:auto}.yii-debug .yii-debug-request-tabs .yii-debug-tab{flex:none}.yii-debug .yii-debug-request-tabs .yii-debug-empty-state{padding:var(--yii-debug-space-4)}.yii-debug .yii-debug-request-tabs .yii-debug-empty-state h2{font-size:var(--yii-debug-fs-base);margin:0}.yii-debug .yii-debug-diagnostic-shell{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);overflow:hidden}.yii-debug .yii-debug-diagnostic-header{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);display:flex}.yii-debug .yii-debug-diagnostic-heading-copy{align-items:baseline;gap:var(--yii-debug-space-2) var(--yii-debug-space-3);flex-wrap:wrap;min-width:0;display:flex}.yii-debug .yii-debug-diagnostic-heading-copy h2{margin:0}.yii-debug .yii-debug-diagnostic-counts{align-items:center;gap:var(--yii-debug-space-2);display:inline-flex}.yii-debug .yii-debug-diagnostic-count,.yii-debug .yii-debug-diagnostic-total,.yii-debug .yii-debug-header-lane-count,.yii-debug .yii-debug-server-group-count{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums}.yii-debug .yii-debug-diagnostic-count{align-items:baseline;gap:var(--yii-debug-space-1);display:inline-flex}.yii-debug .yii-debug-diagnostic-count+.yii-debug-diagnostic-count:before{width:1px;height:12px;background:var(--yii-debug-panel-border-strong);content:"";margin-inline-end:var(--yii-debug-space-1)}.yii-debug .yii-debug-diagnostic-count-value{color:var(--yii-debug-panel-text);font-weight:700}.yii-debug .yii-debug-diagnostic-filter{background:var(--yii-debug-panel-surface);width:min(280px,42%);max-width:none}.yii-debug .yii-debug-header-lanes{grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.yii-debug .yii-debug-header-lane{min-width:0;position:relative}.yii-debug .yii-debug-header-lane+.yii-debug-header-lane{border-inline-start:2px solid color-mix(in srgb, var(--yii-debug-panel-primary) 36%, var(--yii-debug-panel-border))}.yii-debug .yii-debug-header-lane+.yii-debug-header-lane:before{z-index:1;top:25px;border:2px solid var(--yii-debug-panel-surface);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-primary);content:"";width:8px;height:8px;position:absolute;inset-inline-start:-5px}.yii-debug .yii-debug-header-lane-header{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);min-height:58px;padding:10px var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);display:flex}.yii-debug .yii-debug-header-lane-header h3{font-size:var(--yii-debug-fs-base);margin:1px 0 0}.yii-debug .yii-debug-header-direction{color:var(--yii-debug-panel-primary-strong);font-family:var(--yii-debug-font-mono);letter-spacing:.04em;font-size:.6875rem;font-weight:700;display:block}.yii-debug .yii-debug-diagnostic-ledger{margin:0}.yii-debug .yii-debug-diagnostic-row{border-top:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 58%, transparent);grid-template-columns:minmax(132px,.72fr) minmax(0,1.28fr);align-items:start;display:grid}.yii-debug .yii-debug-diagnostic-row:first-child{border-top:0}.yii-debug .yii-debug-diagnostic-row:hover{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-diagnostic-row dt,.yii-debug .yii-debug-diagnostic-row dd{min-width:0;padding:10px var(--yii-debug-space-4);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);line-height:1.5}.yii-debug .yii-debug-diagnostic-row dt{color:var(--yii-debug-panel-muted);overflow-wrap:anywhere;font-weight:600;overflow:hidden}.yii-debug .yii-debug-diagnostic-row dd{border-inline-start:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 45%, transparent);color:var(--yii-debug-panel-text);overflow-wrap:anywhere;white-space:pre-wrap;margin:0}.yii-debug .yii-debug-header-ledger .yii-debug-diagnostic-row:nth-child(2n),.yii-debug .yii-debug-server-ledger .yii-debug-diagnostic-row:nth-child(2n){background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 72%)}:is(.yii-debug .yii-debug-header-ledger .yii-debug-diagnostic-row:nth-child(2n),.yii-debug .yii-debug-server-ledger .yii-debug-diagnostic-row:nth-child(2n)):hover{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-diagnostic-values{gap:6px;display:grid}.yii-debug .yii-debug-diagnostic-value-count{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);font-size:.6875rem}.yii-debug .yii-debug-diagnostic-value-list{gap:var(--yii-debug-space-1);margin:0;padding:0;list-style:none;display:grid}.yii-debug .yii-debug-diagnostic-value-list li+li{padding-top:var(--yii-debug-space-1);border-top:1px dashed var(--yii-debug-panel-border)}.yii-debug .yii-debug-diagnostic-empty-value,.yii-debug .yii-debug-diagnostic-lane-empty,.yii-debug .yii-debug-diagnostic-empty-state,.yii-debug .yii-debug-diagnostic-filter-empty{color:var(--yii-debug-panel-muted);font-style:italic}.yii-debug .yii-debug-diagnostic-lane-empty,.yii-debug .yii-debug-diagnostic-empty-state,.yii-debug .yii-debug-diagnostic-filter-empty{padding:var(--yii-debug-space-4);margin:0}.yii-debug .yii-debug-diagnostic-filter-empty{border-top:var(--yii-debug-border);text-align:center}.yii-debug .yii-debug-server-group-body>.yii-debug-mini-toolbar{padding:var(--yii-debug-space-2) var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);margin:0}.yii-debug .yii-debug-server-group-body>.yii-debug-mini-toolbar .yii-debug-filter-input{max-width:100%}.yii-debug .yii-debug-server-additional+.yii-debug-server-group,.yii-debug .yii-debug-server-group+.yii-debug-server-group{border-top:var(--yii-debug-border)}.yii-debug .yii-debug-server-group-summary{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);min-height:44px;padding:9px var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);display:flex}.yii-debug .yii-debug-server-group-summary .yii-debug-server-group-title{font-size:var(--yii-debug-fs-sm);margin:0;font-weight:700}.yii-debug .yii-debug-server-group-summary{cursor:pointer;list-style:none}.yii-debug .yii-debug-server-group-summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-server-group-summary:hover,.yii-debug .yii-debug-server-group-summary:focus-visible{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-server-group-identity{align-items:baseline;gap:var(--yii-debug-space-2);display:inline-flex}.yii-debug .yii-debug-server-group:not([open])>.yii-debug-server-group-summary{border-bottom:0}.yii-debug .yii-debug-server-group-summary .yii-debug-disclosure-hint{margin-inline-start:auto}.yii-debug .yii-debug-diagnostic-row[hidden],.yii-debug .yii-debug-header-lane[hidden],.yii-debug .yii-debug-server-group[hidden],.yii-debug .yii-debug-diagnostic-filter-empty[hidden]{display:none}@container yii-debug-main (width<=900px){.yii-debug .yii-debug-header-lanes{grid-template-columns:minmax(0,1fr)}.yii-debug .yii-debug-header-lane+.yii-debug-header-lane{border-top:2px solid color-mix(in srgb, var(--yii-debug-panel-primary) 36%, var(--yii-debug-panel-border));border-inline-start:0}.yii-debug .yii-debug-header-lane+.yii-debug-header-lane:before{top:-5px;inset-inline-start:var(--yii-debug-space-4)}}@container yii-debug-main (width<=560px){.yii-debug .yii-debug-diagnostic-header{flex-direction:column;align-items:stretch}.yii-debug .yii-debug-diagnostic-filter{width:100%}.yii-debug .yii-debug-diagnostic-row{grid-template-columns:minmax(0,1fr)}.yii-debug .yii-debug-diagnostic-row dt{padding-bottom:var(--yii-debug-space-1)}.yii-debug .yii-debug-diagnostic-row dd{border-inline-start:0;padding-top:0}}.yii-debug .yii-debug-route-resolution{margin:var(--yii-debug-space-3) var(--yii-debug-space-4) var(--yii-debug-space-4)}.yii-debug .yii-debug-route-resolution-message{margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm)}.yii-debug .yii-debug-route-trace{min-width:560px}.yii-debug .yii-debug-table.yii-debug-route-trace thead th,.yii-debug .yii-debug-table.yii-debug-route-trace tbody td{text-align:center}.yii-debug .yii-debug-table.yii-debug-route-trace thead th:nth-child(2),.yii-debug .yii-debug-table.yii-debug-route-trace tbody td:nth-child(2){text-align:start}.yii-debug .yii-debug-table.yii-debug-route-trace thead th:first-child,.yii-debug .yii-debug-table.yii-debug-route-trace tbody td:first-child{width:56px}.yii-debug .yii-debug-table.yii-debug-route-trace thead th:last-child,.yii-debug .yii-debug-table.yii-debug-route-trace tbody td:last-child{width:160px}.yii-debug{background:radial-gradient(circle at top left, var(--yii-debug-panel-bg-accent), transparent 36rem), var(--yii-debug-panel-bg);min-height:100vh;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-base);margin:0;padding:0;line-height:1.5}.yii-debug *,.yii-debug :before,.yii-debug :after{box-sizing:border-box}.yii-debug h1,.yii-debug h2,.yii-debug h3,.yii-debug h4,.yii-debug h5,.yii-debug h6{margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-text);letter-spacing:-.01em;font-weight:700;line-height:1.25}.yii-debug h1{font-size:var(--yii-debug-fs-2xl)}.yii-debug h2{font-size:var(--yii-debug-fs-xl)}.yii-debug h3{font-size:var(--yii-debug-fs-lg)}.yii-debug h4,.yii-debug h5,.yii-debug h6{font-size:var(--yii-debug-fs-base)}.yii-debug p,.yii-debug ul,.yii-debug ol,.yii-debug dl,.yii-debug figure{margin:0 0 var(--yii-debug-space-3)}.yii-debug ul,.yii-debug ol{padding-left:var(--yii-debug-space-5)}.yii-debug strong,.yii-debug b{font-weight:600}.yii-debug a{color:var(--yii-debug-panel-link);text-decoration:none;transition:color .12s}.yii-debug a:hover,.yii-debug a:focus{color:var(--yii-debug-panel-link-hover);text-decoration:underline}.yii-debug code,.yii-debug kbd,.yii-debug samp{border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-code-bg);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-variant-ligatures:none;padding:.1em .35em;font-size:.875em}.yii-debug pre{margin:0 0 var(--yii-debug-space-3);padding:var(--yii-debug-space-3);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-code-bg);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);font-variant-ligatures:none;line-height:1.4;overflow-x:auto}.yii-debug pre code{font-size:inherit;background:0 0;padding:0}.yii-debug :focus-visible{outline:3px solid var(--yii-debug-focus-ring);outline-offset:3px}.yii-debug .yii-debug-page{max-width:1680px;padding:var(--yii-debug-space-4);margin:0 auto}.yii-debug .yii-debug-layout{gap:var(--yii-debug-space-4);grid-template-columns:240px 1fr;align-items:start;display:grid}@media (max-width:959px){.yii-debug .yii-debug-layout{grid-template-columns:1fr}}@media (min-width:960px){.yii-debug .yii-debug-sidebar{top:var(--yii-debug-space-4);max-height:calc(100vh - var(--yii-debug-space-5));position:sticky;overflow-y:auto}}.yii-debug .yii-debug-main{min-width:0;container:yii-debug-main/inline-size}.yii-debug .yii-debug-main>*+:is(h2,.yii-debug-disclosure),.yii-debug .yii-debug-tab-panel>.yii-debug-table-wrap+.yii-debug-disclosure{margin-top:var(--yii-debug-space-5)}.yii-debug .yii-debug-main>.yii-debug-sr-only:first-child+:is(h2,.yii-debug-disclosure){margin-top:0}.yii-debug .yii-debug-mini-toolbar{justify-content:flex-end;align-items:center;gap:var(--yii-debug-space-2);margin-bottom:var(--yii-debug-space-4);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-side-section{gap:var(--yii-debug-space-2);margin:0 0 var(--yii-debug-space-3);padding:var(--yii-debug-space-3);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);flex-direction:column;display:flex}.yii-debug .yii-debug-side-section-title{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;font-weight:700}.yii-debug .yii-debug-request-nav-row{width:100%;margin-top:var(--yii-debug-space-2);grid-template-columns:repeat(4,1fr);gap:6px;display:grid}.yii-debug .yii-debug-btn-icon{justify-content:center;align-items:center;padding:4px 0;font-size:16px;line-height:1;display:inline-flex}.yii-debug .yii-debug-btn-icon svg{width:1em;height:1em}.yii-debug .yii-debug-request-nav .yii-debug-btn{justify-content:center;width:100%}.yii-debug .yii-debug-brand-bar{align-items:center;gap:var(--yii-debug-space-2);margin-bottom:var(--yii-debug-space-3);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:linear-gradient(180deg, color-mix(in srgb, var(--yii-debug-panel-surface) 96%, transparent), color-mix(in srgb, var(--yii-debug-panel-surface-muted) 88%, transparent));box-shadow:var(--yii-debug-shadow-sm);flex-wrap:wrap;padding:8px 12px;display:flex}.yii-debug .yii-debug-brand-chip{border:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 70%, transparent);border-radius:var(--yii-debug-radius-pill);background:color-mix(in srgb, var(--yii-debug-panel-surface), transparent 30%);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);min-height:var(--yii-debug-control-min-size);align-items:center;gap:8px;padding:6px 12px;text-decoration:none;transition:border-color .14s,transform .14s,box-shadow .14s;display:inline-flex}.yii-debug a.yii-debug-brand-chip:hover,.yii-debug a.yii-debug-brand-chip:focus{border-color:var(--yii-debug-panel-primary);box-shadow:var(--yii-debug-shadow-sm);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-brand-icon{flex:none;justify-content:center;align-items:center;width:22px;height:22px;display:inline-flex}.yii-debug .yii-debug-brand-icon svg{width:100%;height:100%}.yii-debug .yii-debug-brand-chip-php .yii-debug-brand-icon{width:32px}.yii-debug .yii-debug-brand-chip-php .yii-debug-brand-icon svg{fill:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-brand-label{color:var(--yii-debug-panel-muted);letter-spacing:.06em;text-transform:uppercase;font-weight:600}.yii-debug .yii-debug-brand-value{color:var(--yii-debug-panel-text);font-weight:700}.yii-debug .yii-debug-brand-chip-mem{margin-left:auto}.yii-debug .yii-debug-brand-chip-config{border:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);text-decoration:none;transition:transform .14s,border-color .14s,color .14s,background-color .14s}.yii-debug .yii-debug-brand-chip-config .yii-debug-brand-icon{justify-content:center;align-items:center;width:14px;height:14px;transition:transform .24s;display:inline-flex}.yii-debug .yii-debug-brand-chip-config .yii-debug-brand-icon svg{width:100%;height:100%}.yii-debug .yii-debug-brand-chip-config:hover,.yii-debug .yii-debug-brand-chip-config:focus-visible{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 50%);color:var(--yii-debug-panel-primary-strong);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-brand-chip-config:hover .yii-debug-brand-icon,.yii-debug .yii-debug-brand-chip-config:focus-visible .yii-debug-brand-icon{transform:rotate(45deg)}.yii-debug .yii-debug-brand-chip-config.is-disabled{opacity:.5;cursor:default;pointer-events:none}.yii-debug .yii-debug-brand-chip-config{margin-left:auto}.yii-debug .yii-debug-brand-bar:has(.yii-debug-brand-chip-mem) .yii-debug-brand-chip-config{margin-left:0}.yii-debug .yii-debug-brand-chip-theme{border:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);cursor:pointer;padding:6px 10px;transition:transform .14s,border-color .14s,color .14s,background-color .14s}.yii-debug .yii-debug-brand-chip-theme:hover,.yii-debug .yii-debug-brand-chip-theme:focus-visible{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 50%);color:var(--yii-debug-panel-primary-strong);transform:translateY(-1px)}.yii-debug .yii-debug-brand-chip-theme .yii-debug-brand-icon{justify-content:center;align-items:center;width:16px;height:16px;transition:transform .24s;display:inline-flex}.yii-debug .yii-debug-brand-chip-theme .yii-debug-brand-icon svg{width:100%;height:100%}.yii-debug .yii-debug-brand-chip-theme:hover .yii-debug-brand-icon{transform:rotate(20deg)}.yii-debug .yii-debug-snapshot-line{min-width:0;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);align-items:baseline;gap:6px;display:flex}.yii-debug .yii-debug-snapshot-method{color:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-primary-strong)) 80%, var(--yii-debug-panel-text));flex:none;font-weight:700}.yii-debug .yii-debug-snapshot-url{min-width:0;color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;overflow:hidden}.yii-debug .yii-debug-snapshot-meta{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);align-items:center;gap:6px;display:flex}.yii-debug .yii-debug-snapshot-status{border-radius:var(--yii-debug-radius-pill);padding:1px 6px;font-weight:700;display:inline-block}.yii-debug .yii-debug-snapshot-tag{border:1px solid var(--yii-debug-panel-border);border-radius:var(--yii-debug-radius-pill);padding:0 6px}.yii-debug .yii-debug-request-overview-status-value{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-lg);letter-spacing:-.03em;padding:3px 9px;line-height:1.2}.yii-debug .yii-debug-panel-heading-eyebrow{color:var(--yii-debug-panel-muted);letter-spacing:.09em;text-transform:uppercase;margin-bottom:5px;font-size:.6875rem;font-weight:700;line-height:1.2;display:block}.yii-debug .yii-debug-request-overview-flag,.yii-debug .yii-debug-panel-heading-kind{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-pill);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);letter-spacing:.07em;text-transform:uppercase;padding:2px 8px;font-size:.625rem;font-weight:700;line-height:1.4}.yii-debug .yii-debug-panel-heading{justify-content:space-between;align-items:flex-end;gap:var(--yii-debug-space-3);margin:var(--yii-debug-space-5) 0 var(--yii-debug-space-3);padding-bottom:var(--yii-debug-space-2);border-bottom:var(--yii-debug-border);display:flex}.yii-debug .yii-debug-panel-heading-copy{min-width:0}.yii-debug .yii-debug-panel-heading-copy h2{margin:0}.yii-debug .yii-debug-panel-heading-kind{flex:none;margin-bottom:2px}.yii-debug pre.yii-debug-panel-payload{min-height:180px;padding:var(--yii-debug-space-4);border:var(--yii-debug-border);background:linear-gradient(90deg, color-mix(in srgb, var(--yii-debug-panel-primary), transparent 88%), transparent 42%), var(--yii-debug-panel-code-bg);margin-bottom:0;line-height:1.55}@media (max-width:640px){.yii-debug .yii-debug-request-overview-header{gap:var(--yii-debug-space-3);grid-template-columns:minmax(0,1fr)}.yii-debug .yii-debug-request-overview-status{align-items:center;gap:var(--yii-debug-space-2);text-align:left;display:flex}.yii-debug .yii-debug-request-overview-metrics{grid-template-columns:1fr}.yii-debug .yii-debug-request-overview-metric+.yii-debug-request-overview-metric{border-block-start:var(--yii-debug-border);border-inline-start:0}.yii-debug .yii-debug-request-overview-meta-item{max-width:100%}.yii-debug .yii-debug-panel-heading{align-items:flex-start}}.yii-debug .yii-debug-section-header{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);margin:var(--yii-debug-space-4) 0 var(--yii-debug-space-2);display:flex}.yii-debug .yii-debug-section-header h2,.yii-debug .yii-debug-section-header h3{margin:0}.yii-debug .yii-debug-filter-input{width:240px;max-width:50%;padding:4px var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font:inherit;flex:none}.yii-debug .yii-debug-filter-input::placeholder{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-filter-input:focus{border-color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-stack>*+*{margin-top:var(--yii-debug-space-4)}.yii-debug .yii-debug-card{padding:var(--yii-debug-panel-padding);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-md)}.yii-debug .yii-debug-nav{padding:var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);margin:0}.yii-debug .yii-debug-nav ul{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-nav-group{margin-top:var(--yii-debug-space-3)}.yii-debug .yii-debug-nav-group>.yii-debug-nav{box-shadow:none;background:0 0;border:0;border-radius:0;padding:0}.yii-debug .yii-debug-nav-link{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-2);border-radius:var(--yii-debug-radius-md);color:var(--yii-debug-panel-text);padding:8px 12px;font-weight:600;text-decoration:none;transition:background .12s,color .12s;display:flex}.yii-debug .yii-debug-nav-link:after{content:"›";color:var(--yii-debug-panel-muted);font-size:1.1em;line-height:1}.yii-debug .yii-debug-nav-link:hover,.yii-debug .yii-debug-nav-link:focus{background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-text);text-decoration:none}.yii-debug .yii-debug-nav-link.is-active,.yii-debug .yii-debug-nav-link[aria-current=page]{background:var(--yii-debug-primary-bg);color:var(--yii-debug-on-primary)}:is(.yii-debug .yii-debug-nav-link.is-active,.yii-debug .yii-debug-nav-link[aria-current=page]):after{color:inherit}.yii-debug .yii-debug-btn{justify-content:center;align-items:center;gap:var(--yii-debug-space-1);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);min-height:32px;color:var(--yii-debug-panel-text);font-family:inherit;font-size:var(--yii-debug-fs-sm);letter-spacing:0;text-transform:none;cursor:pointer;padding:6px 14px;font-weight:600;line-height:1;text-decoration:none;transition:border-color .12s,background .12s,color .12s,transform .12s,box-shadow .12s;display:inline-flex}.yii-debug .yii-debug-btn:hover,.yii-debug .yii-debug-btn:focus{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 30%);background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-link-hover);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-btn:active{transform:translateY(0)}.yii-debug .yii-debug-btn[disabled],.yii-debug .yii-debug-btn.is-disabled{opacity:.55;pointer-events:none;transform:none}.yii-debug .yii-debug-btn-primary{background:var(--yii-debug-primary-bg);color:var(--yii-debug-on-primary);border-color:#0000}.yii-debug .yii-debug-btn-primary:is(:hover,:focus){background:var(--yii-debug-panel-primary-strong);color:var(--yii-debug-on-primary)}.yii-debug .yii-debug-btn-ghost{border-color:var(--yii-debug-panel-border);background:0 0}.yii-debug .yii-debug-btn-sm{min-height:28px;font-size:var(--yii-debug-fs-xs);padding:4px 10px}.yii-debug .yii-debug-badge{border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-xs);letter-spacing:.01em;align-items:center;padding:2px 10px;font-weight:600;line-height:1.4;display:inline-flex}.yii-debug .yii-debug-badge-success{background:var(--yii-debug-success);color:var(--yii-debug-on-success)}.yii-debug .yii-debug-badge-info{background:var(--yii-debug-info);color:var(--yii-debug-on-info)}.yii-debug .yii-debug-badge-warning{background:var(--yii-debug-warning);color:var(--yii-debug-on-warning)}.yii-debug .yii-debug-badge-danger{background:var(--yii-debug-danger);color:var(--yii-debug-on-danger)}.yii-debug .yii-debug-badge-muted{background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-verb-get{--yii-debug-hue:var(--yii-debug-verb-get)}.yii-debug .yii-debug-verb-post{--yii-debug-hue:var(--yii-debug-verb-post)}.yii-debug .yii-debug-verb-put{--yii-debug-hue:var(--yii-debug-verb-put)}.yii-debug .yii-debug-verb-delete{--yii-debug-hue:var(--yii-debug-verb-delete)}.yii-debug .yii-debug-verb-other{--yii-debug-hue:var(--yii-debug-verb-other)}.yii-debug .yii-debug-status-2xx{--yii-debug-hue:var(--yii-debug-status-2xx)}.yii-debug .yii-debug-status-3xx{--yii-debug-hue:var(--yii-debug-status-3xx)}.yii-debug .yii-debug-status-4xx{--yii-debug-hue:var(--yii-debug-status-4xx)}.yii-debug .yii-debug-status-5xx{--yii-debug-hue:var(--yii-debug-status-5xx)}.yii-debug .yii-debug-status-none{--yii-debug-hue:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-level-error{--yii-debug-hue:var(--yii-debug-level-error)}.yii-debug .yii-debug-level-warning{--yii-debug-hue:var(--yii-debug-level-warning)}.yii-debug .yii-debug-level-info{--yii-debug-hue:var(--yii-debug-level-info)}.yii-debug .yii-debug-level-trace{--yii-debug-hue:var(--yii-debug-level-trace)}.yii-debug .yii-debug-level-profile{--yii-debug-hue:var(--yii-debug-level-profile)}.yii-debug .yii-debug-level-other{--yii-debug-hue:var(--yii-debug-level-other)}.yii-debug .yii-debug-request-hero-method,.yii-debug .yii-debug-snapshot-status,.yii-debug .yii-debug-hero-status>.yii-debug-badge,.yii-debug .yii-debug-level-chip,.yii-debug .yii-debug-db-type,.yii-debug .yii-debug-dump-type,.yii-debug .yii-debug-badge:is(.yii-debug-status-2xx,.yii-debug-status-3xx,.yii-debug-status-4xx,.yii-debug-status-5xx,.yii-debug-status-none){border:1px solid color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)), transparent 65%);background:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)), transparent 90%);color:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 80%, var(--yii-debug-panel-text))}.yii-debug .yii-debug-method{color:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 80%, var(--yii-debug-panel-text));font-family:var(--yii-debug-font-mono);letter-spacing:.02em;font-weight:700}.yii-debug .yii-debug-level-chip{border-radius:var(--yii-debug-radius-pill);font-family:var(--yii-debug-font-mono);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;padding:1px 8px;font-size:.7rem;font-weight:700;display:inline-block}.yii-debug .yii-debug-callout{align-items:flex-start;gap:var(--yii-debug-space-2);margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-left:4px solid var(--yii-debug-panel-border-strong);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-text);display:flex}.yii-debug .yii-debug-callout-info{border-left-color:var(--yii-debug-info)}.yii-debug .yii-debug-callout-success{border-left-color:var(--yii-debug-success)}.yii-debug .yii-debug-callout-warning{border-left-color:var(--yii-debug-warning)}.yii-debug .yii-debug-callout-danger{border-left-color:var(--yii-debug-danger)}.yii-debug .yii-debug-table-wrap{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);overflow-x:auto}.yii-debug .yii-debug-table{border-collapse:separate;border-spacing:0;width:100%;min-width:640px;color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);background:0 0;margin:0}.yii-debug .yii-debug-table thead th,.yii-debug .yii-debug-table thead td{border-bottom:var(--yii-debug-border);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 20%);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);letter-spacing:.03em;text-align:left;text-transform:uppercase;vertical-align:middle;padding:10px 12px;font-weight:700}.yii-debug .yii-debug-table thead th a{color:var(--yii-debug-panel-link);font-weight:700;text-decoration:none}.yii-debug .yii-debug-table thead th a:hover,.yii-debug .yii-debug-table thead th a:focus{color:var(--yii-debug-panel-link-hover);text-decoration:none}.yii-debug .yii-debug-table tbody td,.yii-debug .yii-debug-table tbody th{padding:var(--yii-debug-row-padding-block) 12px;border-top:1px solid var(--yii-debug-panel-border);vertical-align:top;overflow-wrap:anywhere}.yii-debug .yii-debug-table tbody th{white-space:nowrap}.yii-debug .yii-debug-table tbody tr:first-child td,.yii-debug .yii-debug-table tbody tr:first-child th{border-top:0}.yii-debug .yii-debug-table tbody tr:nth-child(2n) td,.yii-debug .yii-debug-table tbody tr:nth-child(2n) th{background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 50%)}.yii-debug .yii-debug-table tbody tr:hover td,.yii-debug .yii-debug-table tbody tr:hover th{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-table tfoot td{border-top:var(--yii-debug-border);color:var(--yii-debug-panel-muted);padding:10px 12px}.yii-debug .yii-debug-row-success td,.yii-debug .yii-debug-row-success th{background:color-mix(in srgb, var(--yii-debug-success), var(--yii-debug-panel-surface) 86%)!important}.yii-debug .yii-debug-row-info td,.yii-debug .yii-debug-row-info th{background:color-mix(in srgb, var(--yii-debug-info), var(--yii-debug-panel-surface) 86%)!important}.yii-debug .yii-debug-row-warning td,.yii-debug .yii-debug-row-warning th{background:color-mix(in srgb, var(--yii-debug-warning), var(--yii-debug-panel-surface) 86%)!important}.yii-debug .yii-debug-row-danger td,.yii-debug .yii-debug-row-danger th{background:color-mix(in srgb, var(--yii-debug-danger), var(--yii-debug-panel-surface) 86%)!important}.yii-debug .yii-debug-grid{margin-bottom:var(--yii-debug-space-4)}.yii-debug .yii-debug-grid>.summary{margin:0 0 var(--yii-debug-space-2);padding:0 var(--yii-debug-space-1);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm)}.yii-debug .yii-debug-grid>.summary b{color:var(--yii-debug-panel-text);font-weight:700}.yii-debug .yii-debug-grid>.empty{padding:var(--yii-debug-space-5);color:var(--yii-debug-panel-muted);text-align:center;font-style:italic}.yii-debug .yii-debug-grid td.yii-debug-cell-nowrap,.yii-debug .yii-debug-grid td.yii-debug-cell-numeric,.yii-debug .yii-debug-grid td.yii-debug-cell-pill,.yii-debug .yii-debug-table td.yii-debug-cell-nowrap,.yii-debug .yii-debug-table td.yii-debug-cell-numeric,.yii-debug .yii-debug-table td.yii-debug-cell-pill{white-space:nowrap}.yii-debug .yii-debug-grid td.yii-debug-cell-fqcn{overflow-wrap:normal}.yii-debug .yii-debug-disclosure{margin-bottom:var(--yii-debug-space-5);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);overflow:hidden}.yii-debug .yii-debug-disclosure[open]>.yii-debug-disclosure-summary{border-bottom:var(--yii-debug-border)}.yii-debug .yii-debug-disclosure-summary{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);padding:10px var(--yii-debug-space-4);cursor:pointer;list-style:none;transition:background-color .12s;display:flex}.yii-debug .yii-debug-disclosure-summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-disclosure-summary:hover,.yii-debug .yii-debug-disclosure-summary:focus-visible{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-disclosure-title,.yii-debug .yii-debug-request-section-title,.yii-debug .yii-debug-diagnostic-heading-copy h2{color:var(--yii-debug-panel-primary-strong);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.12em;text-transform:uppercase;font-weight:700}.yii-debug .yii-debug-disclosure-hint{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;transition:color .12s}.yii-debug .yii-debug-disclosure-hint [data-yii-debug-hint=expanded]{display:none}.yii-debug .yii-debug-disclosure-summary:hover .yii-debug-disclosure-hint,.yii-debug .yii-debug-disclosure-summary:focus-visible .yii-debug-disclosure-hint{color:var(--yii-debug-panel-link)}.yii-debug details[open]>summary .yii-debug-disclosure-hint [data-yii-debug-hint=collapsed]{display:none}.yii-debug details[open]>summary .yii-debug-disclosure-hint [data-yii-debug-hint=expanded]{display:inline}.yii-debug .yii-debug-disclosure-body{padding:var(--yii-debug-space-4)}.yii-debug .yii-debug-disclosure-body>pre{overflow-wrap:anywhere;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);white-space:pre-wrap;margin:0;line-height:1.6}.yii-debug .yii-debug-cell-more-body{max-height:156px;position:relative;overflow:hidden}.yii-debug .yii-debug-cell-more-body:has(.yii-debug-table){max-height:420px}.yii-debug .yii-debug-cell-more-body:after{content:"";background:linear-gradient(to bottom, transparent, var(--yii-debug-panel-surface));pointer-events:none;height:32px;position:absolute;inset:auto 0 0}.yii-debug .yii-debug-cell-more.is-open .yii-debug-cell-more-body{max-height:none}.yii-debug .yii-debug-cell-more.is-open .yii-debug-cell-more-body:after{content:none}.yii-debug .yii-debug-cell-more-toggle{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);color:var(--yii-debug-panel-link);font-family:inherit;font-size:var(--yii-debug-fs-xs);cursor:pointer;background:0 0;align-items:center;margin-top:6px;padding:2px 10px;font-weight:600;display:inline-flex}.yii-debug .yii-debug-cell-more-toggle:before{content:"";width:1.25em;height:1.25em;margin-right:var(--yii-debug-space-1);background:linear-gradient(currentcolor, currentcolor) center / 8px 2px no-repeat, linear-gradient(currentcolor, currentcolor) center / 2px 8px no-repeat, var(--yii-debug-panel-bg-accent);border-radius:50%;display:inline-block}.yii-debug .yii-debug-cell-more.is-open .yii-debug-cell-more-toggle:before{background:linear-gradient(currentcolor, currentcolor) center / 8px 2px no-repeat, var(--yii-debug-panel-bg-accent)}.yii-debug .yii-debug-cell-more-toggle:hover,.yii-debug .yii-debug-cell-more-toggle:focus{background:var(--yii-debug-panel-bg-accent);border-color:var(--yii-debug-panel-primary);text-decoration:none}.yii-debug .yii-debug-grid td.yii-debug-cell-mono{font-family:var(--yii-debug-font-mono)}.yii-debug td.yii-debug-cell-payload{overflow-wrap:anywhere;width:100%}.yii-debug .yii-debug-grid td.yii-debug-cell-numeric{font-variant-numeric:tabular-nums;text-align:right}.yii-debug a.asc:after,.yii-debug a.desc:after{content:"↑";opacity:.78;margin-left:4px;font-size:.85em}.yii-debug a.desc:after{content:"↓"}.yii-debug .yii-debug-pager{gap:var(--yii-debug-space-1);margin:var(--yii-debug-space-3) 0 0;flex-wrap:wrap;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-pager-item{display:inline-flex}.yii-debug .yii-debug-pager-link,.yii-debug .yii-debug-pager>li>:is(a,span){border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);min-width:40px;min-height:40px;color:var(--yii-debug-panel-link);font-size:var(--yii-debug-fs-sm);justify-content:center;align-items:center;padding:0 10px;font-weight:600;text-decoration:none;transition:border-color .12s,background .12s,color .12s;display:inline-flex}:is(.yii-debug .yii-debug-pager-link,.yii-debug .yii-debug-pager>li>:is(a,span)):hover,:is(.yii-debug .yii-debug-pager-link,.yii-debug .yii-debug-pager>li>:is(a,span)):focus{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 30%);background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-link-hover);text-decoration:none}.yii-debug .yii-debug-pager-item.is-active .yii-debug-pager-link{background:var(--yii-debug-primary-bg);color:var(--yii-debug-on-primary);cursor:default;border-color:#0000}.yii-debug .yii-debug-pager-item.is-disabled .yii-debug-pager-link{background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);cursor:not-allowed;pointer-events:none}.yii-debug .yii-debug-field{margin-bottom:var(--yii-debug-space-3);flex-direction:column;gap:4px;display:flex}.yii-debug .yii-debug-label{color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);font-weight:600}.yii-debug .yii-debug-input,.yii-debug .yii-debug-select{border:1px solid var(--yii-debug-panel-border-strong);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);width:100%;min-height:32px;color:var(--yii-debug-panel-text);font-family:inherit;font-size:var(--yii-debug-fs-sm);padding:6px 10px;transition:border-color .12s,box-shadow .12s}:is(.yii-debug .yii-debug-input,.yii-debug .yii-debug-select):hover{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), var(--yii-debug-panel-border-strong) 60%)}:is(.yii-debug .yii-debug-input,.yii-debug .yii-debug-select):focus{border-color:var(--yii-debug-panel-primary);box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 82%)}:is(.yii-debug .yii-debug-input,.yii-debug .yii-debug-select)::placeholder{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-grid .filters td{border-bottom:var(--yii-debug-border);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 30%);padding:6px 12px}.yii-debug .yii-debug-grid .filters input,.yii-debug .yii-debug-grid .filters select,.yii-debug .yii-debug-grid .filters textarea{border:1px solid var(--yii-debug-panel-border-strong);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface);width:100%;min-width:0;min-height:28px;color:var(--yii-debug-panel-text);font:inherit;font-size:var(--yii-debug-fs-xs);padding:4px 8px}:is(.yii-debug .yii-debug-grid .filters input,.yii-debug .yii-debug-grid .filters select,.yii-debug .yii-debug-grid .filters textarea):focus{border-color:var(--yii-debug-panel-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 84%)}.yii-debug .yii-debug-tabs{gap:var(--yii-debug-space-1);margin:0 0 var(--yii-debug-space-3);border-bottom:var(--yii-debug-border);flex-wrap:wrap;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-tab{display:inline-flex}.yii-debug .yii-debug-tab-link{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm);border-bottom:2px solid #0000;align-items:center;padding:8px 14px;font-weight:600;text-decoration:none;transition:color .12s,border-color .12s;display:inline-flex}.yii-debug .yii-debug-tab-link:hover,.yii-debug .yii-debug-tab-link:focus{color:var(--yii-debug-panel-text);text-decoration:none}.yii-debug .yii-debug-tab.is-active .yii-debug-tab-link,.yii-debug .yii-debug-tab-link.is-active{border-bottom-color:var(--yii-debug-panel-primary);color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-tab-panel{padding:var(--yii-debug-space-3) 0 0;display:none}.yii-debug .yii-debug-tab-panel.is-active{display:block}.yii-debug .yii-debug-since-previous{white-space:nowrap;align-items:center;gap:4px;display:inline-flex}.yii-debug .yii-debug-since-previous .yii-debug-since-previous-btn{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface);min-width:24px;height:24px;color:var(--yii-debug-panel-link);font-size:var(--yii-debug-fs-xs);justify-content:center;align-items:center;padding:0 6px;font-weight:700;text-decoration:none;display:inline-flex}.yii-debug .yii-debug-table-mono{min-width:0}.yii-debug .yii-debug-table-mono thead th{z-index:1;background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 10%);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.12em;padding:8px 16px;position:sticky;top:0}.yii-debug .yii-debug-table-mono tbody tr{transition:background-color .14s}.yii-debug .yii-debug-table-mono tbody tr:hover td,.yii-debug .yii-debug-table-mono tbody tr:hover th{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-table-mono tbody tr:hover th{box-shadow:inset 3px 0 0 var(--yii-debug-panel-primary);color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-table-mono tbody th,.yii-debug .yii-debug-table-mono tbody td{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);padding:12px 16px;line-height:1.55}.yii-debug .yii-debug-table-mono tbody th{width:1%;min-width:120px;max-width:220px;color:var(--yii-debug-panel-muted);letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;font-weight:500;transition:color .14s,box-shadow .14s;overflow:hidden}.yii-debug .yii-debug-table-mono tbody td{color:var(--yii-debug-panel-text);word-break:normal;overflow-wrap:anywhere}.yii-debug .yii-debug-table-mono tbody tr+tr td,.yii-debug .yii-debug-table-mono tbody tr+tr th{border-top:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 55%, transparent)}.yii-debug .yii-debug-table-mono tbody tr:nth-child(2n) td,.yii-debug .yii-debug-table-mono tbody tr:nth-child(2n) th{background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 70%)}.yii-debug .yii-debug-table-overview tbody th{width:200px;min-width:160px;max-width:200px}.yii-debug .yii-debug-panel-group+.yii-debug-panel-group{margin-top:var(--yii-debug-space-6)}.yii-debug .yii-debug-table-wrap:has(>.yii-debug-table-mono){border-radius:var(--yii-debug-radius-md);box-shadow:var(--yii-debug-shadow-sm), inset 0 0 0 1px color-mix(in srgb, var(--yii-debug-panel-border) 60%, transparent);overflow:clip}.yii-debug .yii-debug-table-mono{min-width:0}.yii-debug .yii-debug-table-mono tbody th{overflow-wrap:anywhere;white-space:normal}.yii-debug .yii-debug-table-userswitch{width:auto;min-width:100%}.yii-debug .yii-debug-table-userswitch thead th,.yii-debug .yii-debug-table-userswitch tbody td,.yii-debug .yii-debug-table-userswitch tbody th{overflow-wrap:normal;white-space:nowrap}.yii-debug .yii-debug-table-userswitch tbody tr.filters td input{width:100%;min-width:0}.yii-debug .yii-debug-col-userswitch-id{font-variant-numeric:tabular-nums;min-width:10ch}.yii-debug .yii-debug-col-userswitch-username{min-width:14ch}.yii-debug .yii-debug-col-userswitch-email{min-width:24ch}.yii-debug .yii-debug-col-userswitch-status{text-align:center;min-width:8ch}.yii-debug .yii-debug-col-userswitch-timestamp{font-variant-numeric:tabular-nums;min-width:18ch}.yii-debug .yii-debug-table-pointer tbody tr{cursor:pointer;transition:background-color .12s}.yii-debug .yii-debug-table-pointer tbody tr:hover{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 86%)}.yii-debug .yii-debug-sr-only{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.yii-debug .yii-debug-table-empty{padding:var(--yii-debug-space-4);border:1px dashed color-mix(in srgb, var(--yii-debug-panel-border) 70%, transparent);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 40%);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;justify-content:center;align-items:center;gap:10px;margin:0;display:flex}.yii-debug .yii-debug-table-empty:before{content:"";opacity:.5;border:1.5px solid;border-radius:50%;width:8px;height:8px}.yii-debug .yii-debug-grid-summary{align-items:center;gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);letter-spacing:.06em;text-transform:uppercase;flex-wrap:wrap;display:flex}.yii-debug .yii-debug-grid-summary strong{color:var(--yii-debug-panel-primary-strong);letter-spacing:0;text-transform:none;margin-right:.35em;font-weight:700}.yii-debug .yii-debug-grid-summary-sep{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-grid-summary-stat-warn{--yii-debug-hue:var(--yii-debug-level-warning)}.yii-debug .yii-debug-grid-summary-stat-danger{--yii-debug-hue:var(--yii-debug-level-error)}.yii-debug .yii-debug-grid-summary-stat-info{--yii-debug-hue:var(--yii-debug-level-info)}.yii-debug .yii-debug-grid-summary-stat-trace{--yii-debug-hue:var(--yii-debug-level-trace)}.yii-debug .yii-debug-grid-summary-stat-warn strong{color:var(--yii-debug-warning)}.yii-debug .yii-debug-grid-summary-stat-danger strong{color:var(--yii-debug-danger)}.yii-debug .yii-debug-grid-summary-stat-2xx{--yii-debug-hue:var(--yii-debug-status-2xx)}.yii-debug .yii-debug-grid-summary-stat-3xx{--yii-debug-hue:var(--yii-debug-status-3xx)}.yii-debug .yii-debug-grid-summary-stat-4xx{--yii-debug-hue:var(--yii-debug-status-4xx)}.yii-debug .yii-debug-grid-summary-stat-5xx{--yii-debug-hue:var(--yii-debug-status-5xx)}.yii-debug a:is(.yii-debug-grid-summary-stat-danger,.yii-debug-grid-summary-stat-warn,.yii-debug-grid-summary-stat-info,.yii-debug-grid-summary-stat-trace,.yii-debug-grid-summary-stat-2xx,.yii-debug-grid-summary-stat-3xx,.yii-debug-grid-summary-stat-4xx,.yii-debug-grid-summary-stat-5xx){border:1px solid color-mix(in srgb, var(--yii-debug-hue), transparent 65%);border-radius:var(--yii-debug-radius-pill);background:color-mix(in srgb, var(--yii-debug-hue), transparent 90%);color:color-mix(in srgb, var(--yii-debug-hue) 80%, var(--yii-debug-panel-text));align-items:center;gap:6px;padding:2px 10px;text-decoration:none;transition:transform .14s,background-color .14s;display:inline-flex}.yii-debug a:is(.yii-debug-grid-summary-stat-danger,.yii-debug-grid-summary-stat-warn,.yii-debug-grid-summary-stat-info,.yii-debug-grid-summary-stat-trace,.yii-debug-grid-summary-stat-2xx,.yii-debug-grid-summary-stat-3xx,.yii-debug-grid-summary-stat-4xx,.yii-debug-grid-summary-stat-5xx) strong{color:inherit;margin-right:0}.yii-debug a:is(.yii-debug-grid-summary-stat-danger,.yii-debug-grid-summary-stat-warn,.yii-debug-grid-summary-stat-info,.yii-debug-grid-summary-stat-trace,.yii-debug-grid-summary-stat-2xx,.yii-debug-grid-summary-stat-3xx,.yii-debug-grid-summary-stat-4xx,.yii-debug-grid-summary-stat-5xx):hover,.yii-debug a:is(.yii-debug-grid-summary-stat-danger,.yii-debug-grid-summary-stat-warn,.yii-debug-grid-summary-stat-info,.yii-debug-grid-summary-stat-trace,.yii-debug-grid-summary-stat-2xx,.yii-debug-grid-summary-stat-3xx,.yii-debug-grid-summary-stat-4xx,.yii-debug-grid-summary-stat-5xx):focus-visible{background:color-mix(in srgb, var(--yii-debug-hue), transparent 80%);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-grid-footer{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-3);margin-top:var(--yii-debug-space-2);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-grid-count{margin:0}.yii-debug .yii-debug-grid-pagesize{align-items:center;gap:6px;margin-left:auto;display:inline-flex}.yii-debug .yii-debug-grid-pagesize-label{color:var(--yii-debug-panel-muted);letter-spacing:.06em;text-transform:uppercase;font-weight:600}.yii-debug .yii-debug-grid-pagesize-select{padding:3px var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-sm);letter-spacing:0;text-transform:none;cursor:pointer}.yii-debug .yii-debug-grid-pagesize-select:focus{border-color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-db-type{border-radius:var(--yii-debug-radius-pill);min-width:5em;font-family:var(--yii-debug-font-mono);letter-spacing:.04em;text-align:center;text-transform:uppercase;white-space:nowrap;padding:2px 8px;font-size:.7rem;font-weight:700;display:inline-block}.yii-debug .yii-debug-db-sql{font-family:var(--yii-debug-font-mono);overflow-wrap:anywhere}.yii-debug .yii-debug-grid-db .yii-debug-table th:not(:last-child),.yii-debug .yii-debug-grid-db .yii-debug-table td:not(:last-child){white-space:nowrap}.yii-debug .yii-debug-grid-db .yii-debug-table th:last-child,.yii-debug .yii-debug-grid-db .yii-debug-table td:last-child{width:100%}.yii-debug .yii-debug-grid-db .filters select{min-width:max-content}.yii-debug .yii-debug-grid-db .filters select:focus{box-shadow:none}.yii-debug .yii-debug-grid-db .filters select:focus-visible{outline-offset:1px;outline-width:2px}.yii-debug .yii-debug-sql-kw{color:var(--yii-debug-sql-kw);font-weight:700}.yii-debug .yii-debug-sql-str{color:var(--yii-debug-sql-str)}.yii-debug .yii-debug-sql-num{color:var(--yii-debug-sql-num)}.yii-debug .yii-debug-sql-comment{color:var(--yii-debug-sql-comment);font-style:italic}.yii-debug .yii-debug-sql-param{color:var(--yii-debug-sql-param);font-weight:600}.yii-debug .yii-debug-db-explain,.yii-debug .yii-debug-db-trace{margin-top:var(--yii-debug-space-2)}.yii-debug .yii-debug-db-explain-toggle,.yii-debug .yii-debug-db-trace-toggle{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);color:var(--yii-debug-panel-link);font-size:var(--yii-debug-fs-xs);cursor:pointer;background:0 0;align-items:center;gap:6px;padding:2px 10px 2px 6px;font-weight:600;text-decoration:none;transition:background-color .12s,border-color .12s;display:inline-flex}.yii-debug .yii-debug-db-explain-toggle:hover,.yii-debug .yii-debug-db-explain-toggle:focus,.yii-debug .yii-debug-db-trace-toggle:hover,.yii-debug .yii-debug-db-trace-toggle:focus-visible{background:var(--yii-debug-panel-bg-accent);border-color:var(--yii-debug-panel-primary);text-decoration:none}.yii-debug .yii-debug-db-trace-toggle{list-style:none}.yii-debug .yii-debug-db-trace-toggle::-webkit-details-marker{display:none}.yii-debug .yii-debug-db-explain-chevron,.yii-debug .yii-debug-db-trace-chevron{width:10px;font-size:14px;line-height:1;transition:transform .16s;display:inline-block}.yii-debug .yii-debug-db-explain.is-open .yii-debug-db-explain-chevron,.yii-debug .yii-debug-db-trace[open]>.yii-debug-db-trace-toggle .yii-debug-db-trace-chevron{transform:rotate(90deg)}.yii-debug .yii-debug-db-explain.is-loading .yii-debug-db-explain-toggle{opacity:.55;pointer-events:none}.yii-debug .yii-debug-db-explain-text{margin-top:var(--yii-debug-space-2);display:none}.yii-debug .yii-debug-db-explain.is-open .yii-debug-db-explain-text{display:block}.yii-debug .yii-debug-db-explain-text.is-error{padding:var(--yii-debug-space-2) var(--yii-debug-space-3);border-left:3px solid var(--yii-debug-danger);border-radius:var(--yii-debug-radius-sm);background:color-mix(in srgb, var(--yii-debug-danger), transparent 92%);color:var(--yii-debug-danger);font-size:var(--yii-debug-fs-sm);font-weight:600;display:block}.yii-debug .yii-debug-db-explain-all{margin-top:var(--yii-debug-space-3);justify-content:flex-end;display:flex}.yii-debug .yii-debug-db-explain-all-toggle{white-space:nowrap;justify-content:center;min-width:104px}.yii-debug .yii-debug-explain{margin-top:var(--yii-debug-space-3)}.yii-debug .yii-debug-explain-title{margin-bottom:var(--yii-debug-space-2);font-size:var(--yii-debug-fs-lg);font-weight:700}.yii-debug .yii-debug-explain-query{margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3);background:var(--yii-debug-panel-code-bg);border-radius:var(--yii-debug-radius-md);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);white-space:pre-wrap;overflow-wrap:break-word}.yii-debug .yii-debug-explain-empty{color:var(--yii-debug-panel-muted);font-style:italic}.yii-debug .yii-debug-empty-state{margin:var(--yii-debug-space-4) 0 0;padding:var(--yii-debug-space-5) var(--yii-debug-space-5);border:1px dashed color-mix(in srgb, var(--yii-debug-panel-border) 80%, transparent);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 30%)}.yii-debug .yii-debug-empty-state h2{margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-lg);font-weight:700}.yii-debug .yii-debug-empty-state p{margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);line-height:1.5}.yii-debug .yii-debug-empty-state p:last-child{margin-bottom:0}.yii-debug .yii-debug-empty-state code{border-radius:var(--yii-debug-radius-sm,4px);background:var(--yii-debug-panel-code-bg);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);padding:.1em .4em}.yii-debug .yii-debug-empty-state-code{margin:0 0 var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-code-bg);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);white-space:pre-wrap;overflow-wrap:break-word;line-height:1.5}.yii-debug .yii-debug-queue-job-page{gap:var(--yii-debug-space-3);flex-direction:column;display:flex}.yii-debug .yii-debug-queue-job-head{align-items:center;gap:var(--yii-debug-space-2);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-queue-card{gap:var(--yii-debug-space-2);padding:var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);flex-direction:column;display:flex}.yii-debug .yii-debug-queue-card-head{gap:var(--yii-debug-space-3);grid-template-columns:auto 1fr auto;align-items:flex-start;display:grid}.yii-debug .yii-debug-queue-avatar{--queue-hue:210;border-radius:var(--yii-debug-radius-md);background:linear-gradient(135deg, hsl(var(--queue-hue) 72% 52%), hsl(calc(var(--queue-hue) + 28) 65% 40%));width:40px;height:40px;box-shadow:0 2px 10px hsl(var(--queue-hue) 60% 40% / 32%), inset 0 1px 0 #ffffff38;color:#fff;font-family:var(--yii-debug-font-mono);letter-spacing:-.01em;flex:none;justify-content:center;align-items:center;font-size:16px;font-weight:800;display:inline-flex}.yii-debug .yii-debug-queue-headline{flex-direction:column;gap:2px;min-width:0;display:flex}.yii-debug .yii-debug-queue-class{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-lg);letter-spacing:-.01em;word-break:break-all;margin:0;font-weight:700;line-height:1.25}.yii-debug .yii-debug-queue-namespace{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.02em}.yii-debug .yii-debug-queue-meta-pills{flex-direction:column;flex:none;align-items:flex-end;gap:6px;display:flex}.yii-debug .yii-debug-queue-status{border-radius:var(--yii-debug-radius-pill);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;align-items:center;padding:3px 10px;font-weight:600;line-height:1;display:inline-flex}.yii-debug .yii-debug-queue-status-queued{color:var(--yii-debug-info);background:color-mix(in srgb, var(--yii-debug-info), transparent 86%)}.yii-debug .yii-debug-queue-status-done{color:var(--yii-debug-success);background:color-mix(in srgb, var(--yii-debug-success), transparent 86%)}.yii-debug .yii-debug-queue-status-failed{color:var(--yii-debug-danger);background:color-mix(in srgb, var(--yii-debug-danger), transparent 86%)}.yii-debug .yii-debug-queue-driver{border-radius:var(--yii-debug-radius-pill);border:var(--yii-debug-border);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.05em;text-transform:uppercase;cursor:help;align-items:center;padding:3px 10px;font-weight:600;line-height:1;display:inline-flex}.yii-debug .yii-debug-queue-driver-is-sync{color:var(--yii-debug-success);background:color-mix(in srgb, var(--yii-debug-success), transparent 92%);border-color:color-mix(in srgb, var(--yii-debug-success), transparent 70%)}.yii-debug .yii-debug-queue-driver-is-async{color:var(--yii-debug-warning);background:color-mix(in srgb, var(--yii-debug-warning), transparent 92%);border-color:color-mix(in srgb, var(--yii-debug-warning), transparent 70%)}.yii-debug .yii-debug-queue-hint{margin:var(--yii-debug-space-3) 0;padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border-radius:var(--yii-debug-radius-md);border-left:3px solid var(--yii-debug-warning);background:color-mix(in srgb, var(--yii-debug-warning), transparent 94%);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);line-height:1.5}.yii-debug .yii-debug-queue-tree{padding:var(--yii-debug-space-3);border-radius:var(--yii-debug-radius-sm);background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 96%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);flex-direction:column;gap:4px;line-height:1.6;display:flex}.yii-debug .yii-debug-queue-tree-row{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}.yii-debug .yii-debug-queue-tree-key{color:var(--yii-debug-panel-text);font-weight:700}.yii-debug .yii-debug-queue-tree-key:after{content:":";color:var(--yii-debug-panel-muted);margin-left:1px;font-weight:400}.yii-debug .yii-debug-queue-tree-type{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);text-transform:uppercase;letter-spacing:.05em;background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 92%);border-radius:3px;padding:1px 6px}.yii-debug .yii-debug-queue-tree-class{color:var(--yii-debug-info);cursor:help;font-weight:600}.yii-debug .yii-debug-queue-tree-meta{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-queue-tree-truncated{color:var(--yii-debug-warning);font-size:var(--yii-debug-fs-xs);text-transform:uppercase;letter-spacing:.05em;background:color-mix(in srgb, var(--yii-debug-warning), transparent 86%);border-radius:3px;padding:1px 6px}.yii-debug .yii-debug-queue-tree-value{word-break:break-all}.yii-debug .yii-debug-queue-tree-value-string,.yii-debug .yii-debug-log-dump-value-string{color:var(--yii-debug-success)}.yii-debug .yii-debug-queue-tree-value-number,.yii-debug .yii-debug-log-dump-value-number{color:var(--yii-debug-info)}.yii-debug .yii-debug-queue-tree-value-bool,.yii-debug .yii-debug-log-dump-value-bool{color:var(--yii-debug-warning);font-weight:600}.yii-debug .yii-debug-queue-tree-value-null,.yii-debug .yii-debug-log-dump-value-null{color:var(--yii-debug-panel-muted);font-style:italic}.yii-debug .yii-debug-queue-tree-collapse{flex-direction:column;gap:4px;display:flex}.yii-debug .yii-debug-queue-tree-summary{cursor:pointer;list-style:revert;flex-wrap:wrap;align-items:baseline;gap:8px;padding:2px 0;display:inline-flex}.yii-debug .yii-debug-queue-tree-summary::-webkit-details-marker{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-queue-tree-children{margin-left:var(--yii-debug-space-4);padding-left:var(--yii-debug-space-3);border-left:1px dashed color-mix(in srgb, var(--yii-debug-panel-text), transparent 80%);flex-direction:column;gap:4px;display:flex}.yii-debug .yii-debug-queue-time{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.02em}.yii-debug .yii-debug-queue-payload{margin:0}.yii-debug .yii-debug-queue-error{padding:var(--yii-debug-space-3);border-radius:var(--yii-debug-radius-sm);border-left:3px solid var(--yii-debug-danger);background:color-mix(in srgb, var(--yii-debug-danger), transparent 92%);color:var(--yii-debug-danger);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);line-height:1.5}.yii-debug .yii-debug-queue-meta{gap:var(--yii-debug-space-2);padding-top:var(--yii-debug-space-2);border-top:var(--yii-debug-border);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-queue-meta-item{border-radius:var(--yii-debug-radius-pill);background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 94%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);align-items:center;gap:6px;padding:2px 10px;line-height:1.4;display:inline-flex}.yii-debug .yii-debug-queue-meta-label{color:var(--yii-debug-panel-muted);text-transform:uppercase;letter-spacing:.05em;font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-queue-meta-value{color:var(--yii-debug-panel-text);font-weight:600}.yii-debug .yii-debug-dump{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);overflow:hidden}.yii-debug .yii-debug-dump-card-head{align-items:center;gap:var(--yii-debug-space-2);padding:6px var(--yii-debug-space-3);border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);color:var(--yii-debug-panel-muted);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-dump-index{color:var(--yii-debug-panel-primary-strong);font-weight:700}.yii-debug .yii-debug-dump-type{border-radius:var(--yii-debug-radius-pill);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;--yii-debug-hue:var(--yii-debug-panel-primary);padding:1px 8px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-dump-type[data-type=array]{--yii-debug-hue:var(--yii-debug-info)}.yii-debug .yii-debug-dump-type[data-type=string]{--yii-debug-hue:var(--yii-debug-success)}.yii-debug .yii-debug-dump-type[data-type=number]{--yii-debug-hue:var(--yii-debug-warning)}.yii-debug .yii-debug-dump-type[data-type=bool],.yii-debug .yii-debug-dump-type[data-type=null]{--yii-debug-hue:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-dump-meta{align-items:center;gap:var(--yii-debug-space-2);margin-left:auto;display:inline-flex}.yii-debug .yii-debug-dump-time{color:var(--yii-debug-panel-muted);font-variant-numeric:tabular-nums}.yii-debug .yii-debug-dump-trace{color:var(--yii-debug-panel-link)}.yii-debug .yii-debug-php-dump{text-align:start;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);line-height:1.5;overflow-x:auto}.yii-debug .yii-debug-php-dump pre{background:0 0;margin:0}.yii-debug .yii-debug-php-dump code{white-space:pre;background:0 0;padding:0;display:block}.yii-debug .yii-debug-dump-body{padding:var(--yii-debug-space-3);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);line-height:1.5;overflow-x:auto}.yii-debug .yii-debug-dump-body code{white-space:pre;background:0 0;padding:0;display:block}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #DD0000"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#DD0000"]{color:#e5c07b!important}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #0000BB"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#0000BB"]{color:#93c5fd!important}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #007700"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#007700"]{color:#86efac!important}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #FF8000"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#FF8000"]{color:#fdba74!important}[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color: #000000"],[data-yii-debug-theme=dark] .yii-debug :is(.yii-debug-dump-body,.yii-debug-php-dump) span[style*="color:#000000"]{color:var(--yii-debug-panel-text)!important}.yii-debug .yii-debug-history-card{gap:var(--yii-debug-space-2);padding:var(--yii-debug-space-3);border:1px dashed color-mix(in srgb, var(--yii-debug-panel-border) 70%, transparent);border-radius:var(--yii-debug-radius-md);background:radial-gradient(circle at top right, color-mix(in srgb, var(--yii-debug-panel-primary), transparent 86%), transparent 60%), color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 40%);flex-direction:column;display:flex;position:relative}.yii-debug .yii-debug-nav-iconed .yii-debug-nav-link{align-items:center}.yii-debug .yii-debug-nav-iconed .yii-debug-nav-link .yii-debug-nav-link-label{margin-right:auto}.yii-debug .yii-debug-nav-link-icon{width:16px;height:16px;color:var(--yii-debug-panel-primary);flex:none;justify-content:center;align-items:center;margin-right:10px;transition:color .14s,transform .14s;display:inline-flex}.yii-debug .yii-debug-nav-link-icon svg{width:100%;height:100%}.yii-debug .yii-debug-nav-link.is-active .yii-debug-nav-link-icon{color:currentColor}.yii-debug .yii-debug-nav-link-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-sm);letter-spacing:.005em;flex:1;font-weight:600;overflow:hidden}.yii-debug .yii-debug-nav-link:not(.is-active){color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-nav-link:not(.is-active) .yii-debug-nav-link-icon{color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 35%)}.yii-debug .yii-debug-nav-link:not(.is-active):after{color:color-mix(in srgb, var(--yii-debug-panel-muted), transparent 40%)}.yii-debug .yii-debug-nav-link:not(.is-active):hover,.yii-debug .yii-debug-nav-link:not(.is-active):focus-visible{color:var(--yii-debug-panel-text);background:var(--yii-debug-panel-surface-hover)}:is(.yii-debug .yii-debug-nav-link:not(.is-active):hover,.yii-debug .yii-debug-nav-link:not(.is-active):focus-visible) .yii-debug-nav-link-icon{color:var(--yii-debug-panel-primary);transform:translate(1px)}:is(.yii-debug .yii-debug-nav-link:not(.is-active):hover,.yii-debug .yii-debug-nav-link:not(.is-active):focus-visible):after{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-tag-link{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);letter-spacing:-.01em;color:var(--yii-debug-panel-primary-strong);white-space:nowrap;border-bottom:1px dotted color-mix(in srgb, var(--yii-debug-panel-primary), transparent 60%);font-weight:700;text-decoration:none;display:inline-block}.yii-debug .yii-debug-tag-link:hover,.yii-debug .yii-debug-tag-link:focus-visible{color:var(--yii-debug-panel-primary);border-bottom-color:var(--yii-debug-panel-primary);text-decoration:none}.yii-debug .yii-debug-url-cell{text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;max-width:clamp(180px,26vw,460px);display:inline-block;overflow:hidden}.yii-debug .yii-debug-table tbody tr.is-cursor{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 86%);box-shadow:inset 3px 0 0 var(--yii-debug-panel-primary)}.yii-debug .yii-debug-table tbody tr.is-cursor:hover{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 78%)}.yii-debug .yii-debug-active-filters{margin-bottom:var(--yii-debug-space-3);padding:8px var(--yii-debug-space-3);border:1px solid color-mix(in srgb, var(--yii-debug-info), transparent 60%);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-info), transparent 92%);flex-wrap:wrap;align-items:center;gap:8px;display:flex}.yii-debug .yii-debug-active-filters-label{color:var(--yii-debug-info);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;font-weight:700}.yii-debug .yii-debug-active-filters-list{flex-wrap:wrap;gap:4px;display:inline-flex}.yii-debug .yii-debug-active-filter-pill{border:1px solid color-mix(in srgb, var(--yii-debug-info), transparent 50%);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);align-items:center;gap:4px;padding:2px 6px 2px 8px;text-decoration:none;transition:background-color .12s,border-color .12s;display:inline-flex}.yii-debug .yii-debug-active-filter-pill:hover,.yii-debug .yii-debug-active-filter-pill:focus-visible{border-color:var(--yii-debug-danger);background:color-mix(in srgb, var(--yii-debug-danger), transparent 88%);color:var(--yii-debug-danger);text-decoration:none}.yii-debug .yii-debug-active-filter-attr{color:var(--yii-debug-panel-muted);text-transform:lowercase}.yii-debug .yii-debug-active-filter-sep{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-active-filter-value{color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;max-width:220px;font-weight:700;overflow:hidden}.yii-debug .yii-debug-active-filter-x{color:var(--yii-debug-panel-muted);margin-left:2px;font-weight:700;line-height:1}.yii-debug .yii-debug-active-filter-pill:hover .yii-debug-active-filter-x,.yii-debug .yii-debug-active-filter-pill:focus-visible .yii-debug-active-filter-x{color:var(--yii-debug-danger)}.yii-debug .yii-debug-active-filters-clear{border:1px solid color-mix(in srgb, var(--yii-debug-danger), transparent 60%);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-danger);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;margin-left:auto;padding:3px 10px;font-weight:700;text-decoration:none;transition:background-color .12s,border-color .12s,transform .12s}.yii-debug .yii-debug-active-filters-clear:hover,.yii-debug .yii-debug-active-filters-clear:focus-visible{border-color:var(--yii-debug-danger);background:color-mix(in srgb, var(--yii-debug-danger), transparent 86%);color:var(--yii-debug-danger);text-decoration:none;transform:translateY(-1px)}.yii-debug .yii-debug-col-id{white-space:nowrap;min-width:120px}.yii-debug .yii-debug-grid .filters input.yii-debug-col-id-input{box-sizing:border-box;width:104px}.yii-debug .yii-debug-grid-history .yii-debug-table{--yii-debug-history-query-width:0px;--yii-debug-history-mail-width:0px;--yii-debug-history-fixed-width:calc(988px + var(--yii-debug-history-query-width) + var(--yii-debug-history-mail-width));min-width:calc(var(--yii-debug-history-fixed-width) + 180px);table-layout:fixed}.yii-debug .yii-debug-grid-history .yii-debug-table:has(thead th.yii-debug-col-num:not(:first-child,.yii-debug-col-mail)){--yii-debug-history-query-width:66px}.yii-debug .yii-debug-grid-history .yii-debug-table:has(thead th.yii-debug-col-mail){--yii-debug-history-mail-width:56px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:first-child{width:36px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-child(2){width:276px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-child(3){width:80px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-child(4),.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-child(5){width:100px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th.yii-debug-col-ip{width:112px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th.yii-debug-col-num:not(:first-child,.yii-debug-col-mail){width:66px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th.yii-debug-col-mail{width:56px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-last-child(4){width:128px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th.yii-debug-col-status{width:72px}.yii-debug .yii-debug-grid-history .yii-debug-table thead tr:first-child>th:nth-last-child(2){width:84px}.yii-debug .yii-debug-grid-history .yii-debug-table tbody td,.yii-debug .yii-debug-grid-history .yii-debug-table tbody th{white-space:nowrap;padding:8px 10px}.yii-debug .yii-debug-grid-history .yii-debug-table tbody td.yii-debug-col-ip{white-space:normal;overflow-wrap:anywhere}.yii-debug .yii-debug-grid-history .yii-debug-table tbody:has(>tr:only-child>td[colspan]){caption-side:bottom;display:table-caption}.yii-debug .yii-debug-grid-history .yii-debug-table tbody:has(>tr:only-child>td[colspan]) td{display:block}.yii-debug .yii-debug-grid-history .yii-debug-table .yii-debug-tag-link,.yii-debug .yii-debug-grid-history .yii-debug-table .yii-debug-url-cell{text-overflow:ellipsis;max-width:100%;overflow:hidden}.yii-debug .yii-debug-grid-history .yii-debug-table .yii-debug-tag-link{vertical-align:middle;display:inline-block}@media (max-width:1600px){.yii-debug .yii-debug-grid-history .yii-debug-table{--yii-debug-history-fixed-width:calc(876px + var(--yii-debug-history-query-width))}.yii-debug .yii-debug-grid-history .yii-debug-col-ip,.yii-debug .yii-debug-grid-history .yii-debug-col-mail{display:none}}@media (max-width:767px){.yii-debug .yii-debug-grid-event .yii-debug-table thead th,.yii-debug .yii-debug-grid-event .yii-debug-table thead td,.yii-debug .yii-debug-grid-event .yii-debug-table tbody tr:not(.yii-debug-event-detail-row) td,.yii-debug .yii-debug-grid-event .yii-debug-table tbody th,.yii-debug .yii-debug-grid-event .yii-debug-table tfoot td{padding:8px 10px}.yii-debug .yii-debug-grid-event .yii-debug-table .filters td{padding:6px 10px}}.yii-debug th.yii-debug-col-num,.yii-debug td.yii-debug-col-num{text-align:center;white-space:nowrap;width:1%}.yii-debug td.yii-debug-col-num{font-variant-numeric:tabular-nums}.yii-debug td.yii-debug-col-num input,.yii-debug td.yii-debug-col-num select{text-align:center;width:100%;min-width:0}.yii-debug .yii-debug-explain-scroll{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);overflow-x:auto}.yii-debug .yii-debug-explain-table{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);white-space:nowrap;margin:0}.yii-debug .yii-debug-explain-table th,.yii-debug .yii-debug-explain-table td{padding:var(--yii-debug-space-2) var(--yii-debug-space-3)}.yii-debug ul.yii-debug-trace{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);white-space:normal;margin:2px 0 0;padding:0;list-style:none}.yii-debug .yii-debug-disclosure:has(>.yii-debug-disclosure-body>.yii-debug-log-context){margin:var(--yii-debug-space-2) 0 0;border-radius:var(--yii-debug-radius-md)}.yii-debug .yii-debug-disclosure:has(>.yii-debug-disclosure-body>.yii-debug-log-context)>.yii-debug-disclosure-summary{gap:0 var(--yii-debug-space-3);padding:var(--yii-debug-space-1) var(--yii-debug-space-3);flex-wrap:wrap}.yii-debug .yii-debug-disclosure:has(>.yii-debug-disclosure-body>.yii-debug-log-context)>.yii-debug-disclosure-body{padding:var(--yii-debug-space-2) var(--yii-debug-space-3)}.yii-debug .yii-debug-log-context{gap:var(--yii-debug-space-1) var(--yii-debug-space-3);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);grid-template-columns:minmax(75px,max-content) minmax(0,1fr);margin:0;display:grid}.yii-debug .yii-debug-log-context dt{color:var(--yii-debug-panel-muted);overflow-wrap:anywhere}.yii-debug .yii-debug-log-context dd{min-width:0;margin:0}.yii-debug .yii-debug-log-context code,.yii-debug .yii-debug-log-context pre{font-size:inherit;white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.yii-debug .yii-debug-log-context pre{padding:var(--yii-debug-space-2);overflow:visible}@media not (min-width:768px){.yii-debug .yii-debug-log-context{grid-template-columns:minmax(0,1fr);row-gap:0}.yii-debug .yii-debug-log-context dd+dt{margin-top:var(--yii-debug-space-2)}}.yii-debug .yii-debug-log-text{color:inherit;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-ligatures:none;white-space:pre-wrap;overflow-wrap:anywhere;background:0 0;margin:0;padding:0;line-height:1.6}.yii-debug .yii-debug-log-dump,.yii-debug .yii-debug-log-export pre{padding:var(--yii-debug-space-2) var(--yii-debug-space-3);border-radius:var(--yii-debug-radius-sm);background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 96%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-ligatures:none;line-height:1.6}.yii-debug .yii-debug-log-dump-summary,.yii-debug .yii-debug-log-dump-row{align-items:baseline;gap:2px var(--yii-debug-space-2);padding-left:calc(1ch + var(--yii-debug-space-2));flex-wrap:wrap;display:flex}.yii-debug .yii-debug-log-dump-summary{cursor:pointer;list-style:none;position:relative}.yii-debug .yii-debug-log-dump-summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-log-dump-summary:before{content:"▸";color:var(--yii-debug-panel-muted);position:absolute;left:0}.yii-debug :is(.yii-debug-log-dump,.yii-debug-log-dump-node)[open]>.yii-debug-log-dump-summary:before{transform:rotate(90deg)}.yii-debug .yii-debug-log-dump-entries{padding-left:calc(.5ch + var(--yii-debug-space-2));border-left:1px dashed color-mix(in srgb, var(--yii-debug-panel-text), transparent 80%);margin-left:.5ch}.yii-debug .yii-debug-log-dump-key{white-space:pre-wrap;overflow-wrap:anywhere;font-weight:700}.yii-debug .yii-debug-log-dump-key:after{content:":";color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-log-dump-value{white-space:pre-wrap;overflow-wrap:anywhere;flex:16ch;min-width:0}.yii-debug .yii-debug-log-dump-kind,.yii-debug .yii-debug-log-dump-visibility,.yii-debug .yii-debug-log-dump-recursion{background:color-mix(in srgb, var(--yii-debug-panel-text), transparent 92%);letter-spacing:.05em;border-radius:3px;padding:0 6px}.yii-debug .yii-debug-log-dump-kind,.yii-debug .yii-debug-log-dump-recursion{text-transform:uppercase}.yii-debug .yii-debug-log-dump-kind,.yii-debug .yii-debug-log-dump-visibility,.yii-debug .yii-debug-log-dump-count,.yii-debug .yii-debug-log-dump-prefix,.yii-debug .yii-debug-log-dump-empty{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-log-dump-visibility,.yii-debug .yii-debug-log-dump-empty{cursor:help;font-style:italic}.yii-debug .yii-debug-log-dump-recursion{background:color-mix(in srgb, var(--yii-debug-warning), transparent 86%);color:var(--yii-debug-warning);cursor:help}.yii-debug .yii-debug-muted{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-nowrap{white-space:nowrap}.yii-debug .yii-debug-not-set{color:var(--yii-debug-danger);font-style:italic}.yii-debug .yii-debug-gauge{vertical-align:middle;font-variant-numeric:tabular-nums;flex-direction:column;gap:3px;min-width:76px;display:inline-flex}.yii-debug .yii-debug-gauge-value{text-align:right}.yii-debug .yii-debug-gauge-bar{border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-gauge-track);height:3px;display:block;overflow:hidden}.yii-debug .yii-debug-gauge-bar:after{content:"";width:var(--yii-debug-gauge,0%);border-radius:inherit;background:var(--yii-debug-gauge-fill);height:100%;display:block}.yii-debug .yii-debug-indent{color:var(--yii-debug-panel-muted);margin-inline-end:var(--yii-debug-space-1)}.yii-debug .yii-debug-section{margin-bottom:var(--yii-debug-space-6)}.yii-debug .yii-debug-section:last-child{margin-bottom:0}.yii-debug .yii-debug-section-title{align-items:center;gap:var(--yii-debug-space-2);margin:0 0 var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);letter-spacing:.22em;text-transform:uppercase;font-size:.6875rem;font-weight:500;line-height:1;display:flex}.yii-debug .yii-debug-section-mark{color:var(--yii-debug-panel-primary);font-weight:700}.yii-debug .yii-debug-section-count{border-radius:var(--yii-debug-radius-pill);background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 85%);color:var(--yii-debug-panel-primary);align-items:center;margin-left:auto;padding:2px 8px;font-weight:700;display:inline-flex}.yii-debug h1.yii-debug-hero-title{margin:0 0 var(--yii-debug-space-5);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-display);letter-spacing:-.015em;text-transform:lowercase;font-size:2rem;font-weight:400;line-height:1}.yii-debug h1.yii-debug-hero-title:before{content:"// ";color:var(--yii-debug-panel-primary);font-family:var(--yii-debug-font-mono);letter-spacing:0;vertical-align:2px;margin-right:.2em;font-size:.75em;font-weight:700}.yii-debug .yii-debug-readout-card{gap:var(--yii-debug-space-2);min-height:132px;padding:var(--yii-debug-space-5) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:radial-gradient(circle at 1px 1px, color-mix(in srgb, var(--yii-debug-panel-border), transparent 30%) 1px, transparent 0) 0 0 / 14px 14px, linear-gradient(150deg, color-mix(in srgb, var(--yii-debug-panel-primary), transparent 92%), transparent 55%), var(--yii-debug-panel-surface);flex-direction:column;transition:border-color .15s,transform .15s,box-shadow .15s;animation:.45s cubic-bezier(.2,.7,.3,1) both yii-debug-readout-in;display:flex;position:relative;overflow:hidden}.yii-debug .yii-debug-readout-card:hover{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 45%);box-shadow:var(--yii-debug-shadow-md);transform:translateY(-2px)}.yii-debug .yii-debug-readout-card:first-child{animation-delay:40ms}.yii-debug .yii-debug-readout-card:nth-child(2){animation-delay:80ms}.yii-debug .yii-debug-readout-card:nth-child(3){animation-delay:.12s}.yii-debug .yii-debug-readout-card:nth-child(4){animation-delay:.16s}.yii-debug .yii-debug-readout-card:nth-child(5){animation-delay:.2s}.yii-debug .yii-debug-readout-card:nth-child(6){animation-delay:.24s}.yii-debug .yii-debug-readout-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);letter-spacing:.15em;text-transform:uppercase;margin:0;font-size:.6875rem;font-weight:500;line-height:1;display:block;position:relative}.yii-debug .yii-debug-readout-label:before{content:":: ";color:var(--yii-debug-panel-primary);opacity:.85;font-weight:700}.yii-debug .yii-debug-readout-value{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);letter-spacing:-.015em;overflow-wrap:break-word;margin:0;font-size:1.375rem;font-weight:700;line-height:1.15;display:block}.yii-debug .yii-debug-readout-meta{align-items:center;gap:var(--yii-debug-space-2);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);letter-spacing:.05em;text-transform:lowercase;margin-top:auto;font-size:.6875rem;line-height:1;display:inline-flex}.yii-debug .yii-debug-readout-grid{gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-6);grid-template-columns:repeat(auto-fit,minmax(210px,1fr));display:grid}.yii-debug .yii-debug-section .yii-debug-table-wrap{border-radius:var(--yii-debug-radius-md)}.yii-debug .yii-debug-section .yii-debug-table-overview th,.yii-debug .yii-debug-section .yii-debug-table-overview td{padding:9px var(--yii-debug-space-4);border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border), transparent 45%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);text-align:left;vertical-align:baseline}.yii-debug .yii-debug-section .yii-debug-table-overview th{width:34%;color:var(--yii-debug-panel-muted);letter-spacing:.12em;text-transform:uppercase;font-weight:500}.yii-debug .yii-debug-section .yii-debug-table-overview td{color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-section .yii-debug-table-overview tr:last-child th,.yii-debug .yii-debug-section .yii-debug-table-overview tr:last-child td{border-bottom:0}.yii-debug .yii-debug-fact-strip{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-border);grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:1px;margin:0;display:grid;overflow:hidden}.yii-debug .yii-debug-fact{min-width:0;padding:var(--yii-debug-space-3) var(--yii-debug-space-4);background:var(--yii-debug-panel-surface-muted)}.yii-debug .yii-debug-fact-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);letter-spacing:.07em;text-transform:uppercase;margin-bottom:2px;font-size:.6875rem;font-weight:700}.yii-debug .yii-debug-fact-value{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);text-overflow:ellipsis;white-space:nowrap;margin:0;font-weight:600;overflow:hidden}.yii-debug .yii-debug-hero{margin-bottom:var(--yii-debug-space-5);border:var(--yii-debug-border);border-inline-start:4px solid color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 76%, var(--yii-debug-panel-text));border-radius:var(--yii-debug-radius-lg);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);overflow:hidden}.yii-debug .yii-debug-hero-danger{--yii-debug-hue:var(--yii-debug-danger)}.yii-debug .yii-debug-hero-info{--yii-debug-hue:var(--yii-debug-info)}.yii-debug .yii-debug-hero-success{--yii-debug-hue:var(--yii-debug-success)}.yii-debug .yii-debug-hero-warning{--yii-debug-hue:var(--yii-debug-warning)}.yii-debug .yii-debug-hero-header{gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-4);grid-template-columns:minmax(0,1fr) auto;align-items:center;display:grid}.yii-debug .yii-debug-hero-identity{align-items:center;gap:var(--yii-debug-space-3);min-width:0;display:flex}.yii-debug .yii-debug-hero-mark{border:1px solid color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)), transparent 65%);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)), transparent 88%);width:40px;height:40px;color:color-mix(in srgb, var(--yii-debug-hue,var(--yii-debug-panel-muted)) 80%, var(--yii-debug-panel-text));font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);letter-spacing:.04em;text-transform:uppercase;flex:none;justify-content:center;align-items:center;font-weight:700;display:inline-flex}.yii-debug .yii-debug-hero-text{flex-direction:column;gap:2px;min-width:0;display:flex}.yii-debug .yii-debug-hero-title,.yii-debug .yii-debug-hero-subtitle{font-family:var(--yii-debug-font-mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.yii-debug .yii-debug-hero-title{color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-base);font-weight:600}.yii-debug .yii-debug-hero-subtitle{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-hero-status>.yii-debug-badge{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);letter-spacing:.02em;padding:3px 12px;font-weight:700}.yii-debug .yii-debug-hero-metrics{border-top:var(--yii-debug-border);background:var(--yii-debug-panel-border);grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:1px;margin:0;display:grid}.yii-debug .yii-debug-hero-metric{min-width:0;padding:var(--yii-debug-space-3) var(--yii-debug-space-4);background:var(--yii-debug-panel-surface-muted)}.yii-debug .yii-debug-hero-metric dt{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);letter-spacing:.07em;text-transform:uppercase;margin-bottom:2px;font-size:.6875rem;font-weight:700}.yii-debug .yii-debug-hero-metric dd{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);text-overflow:ellipsis;white-space:nowrap;margin:0;font-weight:600;overflow:hidden}.yii-debug .yii-debug-stat-strip{gap:var(--yii-debug-space-3);margin:0 0 var(--yii-debug-space-4);grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.yii-debug .yii-debug-stat{padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);align-items:center;gap:10px;display:flex}.yii-debug .yii-debug-stat-icon{width:26px;height:26px;color:var(--yii-debug-panel-primary);flex:none;justify-content:center;align-items:center;display:inline-flex}.yii-debug .yii-debug-stat-icon svg{width:100%;height:100%}.yii-debug .yii-debug-stat-value{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xl);font-weight:800;line-height:1}.yii-debug .yii-debug-stat-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;margin-left:auto}.yii-debug .yii-debug-stat-danger .yii-debug-stat-icon{color:var(--yii-debug-danger)}.yii-debug .yii-debug-stat-info .yii-debug-stat-icon{color:var(--yii-debug-info)}.yii-debug .yii-debug-stat-muted .yii-debug-stat-icon{color:var(--yii-debug-panel-primary)}.yii-debug .yii-debug-stat-success .yii-debug-stat-icon{color:var(--yii-debug-success)}.yii-debug .yii-debug-stat-warning .yii-debug-stat-icon{color:var(--yii-debug-warning)}.yii-debug .yii-debug-entity{gap:var(--yii-debug-space-4);padding:var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);scroll-margin-top:var(--yii-debug-space-4);flex-direction:column;transition:transform .16s,border-color .16s,box-shadow .16s;display:flex;position:relative}.yii-debug .yii-debug-entity:hover{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 60%);box-shadow:var(--yii-debug-shadow-sm), 0 12px 32px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 88%);transform:translateY(-1px)}.yii-debug .yii-debug-entity:target{border-color:var(--yii-debug-panel-primary);box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 78%), var(--yii-debug-shadow-sm)}.yii-debug .yii-debug-card-grid{gap:var(--yii-debug-space-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,32rem),1fr));display:grid}.yii-debug .yii-debug-entity-head{gap:var(--yii-debug-space-3);grid-template-columns:auto 1fr auto;align-items:center;display:grid}.yii-debug .yii-debug-entity-icon{border-radius:var(--yii-debug-radius-md);background:linear-gradient(135deg, color-mix(in srgb, var(--yii-debug-panel-primary), transparent 78%), color-mix(in srgb, var(--yii-debug-info), transparent 78%));width:38px;height:38px;color:var(--yii-debug-panel-primary-strong);flex:none;justify-content:center;align-items:center;display:inline-flex}.yii-debug .yii-debug-entity-icon svg{width:22px;height:22px}.yii-debug .yii-debug-entity-title{flex-direction:column;gap:2px;min-width:0;display:flex}.yii-debug .yii-debug-entity-name{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-lg);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;margin:0;font-weight:700;line-height:1.2;overflow:hidden}.yii-debug .yii-debug-entity-subtitle{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.01em;text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.yii-debug .yii-debug-entity-meta{flex-wrap:nowrap;flex:none;justify-content:flex-end;align-items:center;gap:5px;display:inline-flex}.yii-debug .yii-debug-entity-meta .yii-debug-badge{border:1px solid var(--yii-debug-panel-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;align-items:center;gap:4px;padding:2px 8px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-entity-meta .yii-debug-badge-danger{border-color:color-mix(in srgb, var(--yii-debug-danger), transparent 60%);background:color-mix(in srgb, var(--yii-debug-danger), transparent 90%);color:var(--yii-debug-danger)}.yii-debug .yii-debug-entity-meta .yii-debug-badge-info{border-color:color-mix(in srgb, var(--yii-debug-info), transparent 60%);background:color-mix(in srgb, var(--yii-debug-info), transparent 90%);color:var(--yii-debug-info)}.yii-debug .yii-debug-entity-meta .yii-debug-badge-muted{border-color:color-mix(in srgb, var(--yii-debug-panel-muted), transparent 60%);background:color-mix(in srgb, var(--yii-debug-panel-muted), transparent 90%);color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-entity-meta .yii-debug-badge-success{border-color:color-mix(in srgb, var(--yii-debug-success), transparent 60%);background:color-mix(in srgb, var(--yii-debug-success), transparent 90%);color:var(--yii-debug-success)}.yii-debug .yii-debug-entity-meta .yii-debug-badge-warning{border-color:color-mix(in srgb, var(--yii-debug-warning), transparent 60%);background:color-mix(in srgb, var(--yii-debug-warning), transparent 90%);color:var(--yii-debug-warning)}.yii-debug .yii-debug-entity-body{gap:var(--yii-debug-space-4);grid-template-columns:minmax(180px,2fr) minmax(0,3fr);display:grid}.yii-debug .yii-debug-entity-body[data-cols="1"]{grid-template-columns:1fr}.yii-debug .yii-debug-entity-column{gap:var(--yii-debug-space-3);flex-direction:column;min-width:0;display:flex}.yii-debug .yii-debug-entity-column-title{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.14em;text-transform:uppercase;margin:0;font-weight:700}.yii-debug .yii-debug-file-list{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-file-list+.yii-debug-file-list{margin-top:4px}.yii-debug .yii-debug-file{border:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 60%, transparent);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);grid-template-columns:auto 1fr;align-items:center;gap:6px;min-width:0;padding:4px 8px;display:grid}.yii-debug .yii-debug-file-type{border-radius:var(--yii-debug-radius-pill);min-width:30px;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.02em;justify-content:center;align-items:center;padding:0 5px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-file-type-danger{background:color-mix(in srgb, var(--yii-debug-danger), transparent 84%);color:var(--yii-debug-danger)}.yii-debug .yii-debug-file-type-info{background:color-mix(in srgb, var(--yii-debug-info), transparent 84%);color:var(--yii-debug-info)}.yii-debug .yii-debug-file-type-muted{background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-file-type-success{background:color-mix(in srgb, var(--yii-debug-success), transparent 84%);color:var(--yii-debug-success)}.yii-debug .yii-debug-file-type-warning{background:color-mix(in srgb, var(--yii-debug-warning), transparent 84%);color:var(--yii-debug-warning)}.yii-debug .yii-debug-file-name{color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.yii-debug .yii-debug-entity-column .yii-debug-fact-strip{background:0 0;border:0;border-radius:0;flex-direction:column;gap:4px;margin:0;display:flex;overflow:visible}.yii-debug .yii-debug-entity-column .yii-debug-fact{border:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 60%, transparent);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);grid-template-columns:56px 1fr;align-items:baseline;gap:8px;padding:6px 10px;display:grid}.yii-debug .yii-debug-entity-column .yii-debug-fact-label{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.12em;text-transform:uppercase;margin:0;font-weight:700}.yii-debug .yii-debug-entity-column .yii-debug-fact-value{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);text-overflow:clip;white-space:normal;word-break:break-all;margin:0;font-weight:400;overflow:visible}.yii-debug .yii-debug-link-strip{padding:10px var(--yii-debug-space-3);border:1px dashed color-mix(in srgb, var(--yii-debug-success), transparent 50%);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-success), transparent 92%);flex-direction:column;gap:8px;display:flex}.yii-debug .yii-debug-link-strip-label{color:var(--yii-debug-success);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.14em;text-transform:uppercase;font-weight:700}.yii-debug .yii-debug-link-strip-list{flex-wrap:wrap;gap:6px;display:flex}.yii-debug .yii-debug-link-pill{border:1px solid color-mix(in srgb, var(--yii-debug-success), transparent 50%);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-success);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);white-space:nowrap;align-items:center;gap:5px;padding:3px 10px 3px 8px;font-weight:600;text-decoration:none;transition:background-color .14s,color .14s,transform .14s,border-color .14s;display:inline-flex}.yii-debug .yii-debug-link-pill:before{content:"↳";opacity:.85;font-size:12px}.yii-debug .yii-debug-link-pill:hover,.yii-debug .yii-debug-link-pill:focus-visible{border-color:var(--yii-debug-success);background:color-mix(in srgb, var(--yii-debug-success), transparent 86%);color:var(--yii-debug-success);text-decoration:none;transform:translateY(-1px)}@media (max-width:720px){.yii-debug .yii-debug-stat-strip{grid-template-columns:repeat(2,minmax(0,1fr))}.yii-debug .yii-debug-entity-body{grid-template-columns:1fr}.yii-debug .yii-debug-entity-head{grid-template-columns:auto 1fr}.yii-debug .yii-debug-entity-meta{grid-column:1/-1;justify-content:flex-start;max-width:100%}}.yii-debug .yii-debug-manifest{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);flex-direction:column;display:flex;overflow:hidden}.yii-debug .yii-debug-manifest-head{align-items:center;gap:var(--yii-debug-space-2);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border-bottom:var(--yii-debug-border);color:var(--yii-debug-panel-primary);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.08em;font-weight:700;display:flex}.yii-debug .yii-debug-manifest-count{color:var(--yii-debug-panel-muted);letter-spacing:.12em;text-transform:uppercase;margin-left:auto;font-weight:500}.yii-debug .yii-debug-manifest-grid{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));display:grid}.yii-debug .yii-debug-manifest-item{justify-content:space-between;align-items:baseline;gap:var(--yii-debug-space-3);min-width:0;padding:7px var(--yii-debug-space-4);border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border), transparent 45%);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);display:flex}.yii-debug .yii-debug-manifest-name{color:var(--yii-debug-panel-text);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.yii-debug .yii-debug-manifest-version{color:var(--yii-debug-panel-primary);flex:none}.yii-debug .yii-debug-ext-strip{gap:var(--yii-debug-space-2);padding:var(--yii-debug-space-3);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:linear-gradient(0deg, color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 30%), var(--yii-debug-panel-surface));flex-wrap:wrap;display:flex}.yii-debug .yii-debug-ext-pill{align-items:center;gap:var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);letter-spacing:.1em;text-transform:uppercase;padding:6px 12px 6px 9px;font-size:.6875rem;font-weight:500;line-height:1;transition:border-color .15s,background .15s;display:inline-flex}.yii-debug .yii-debug-ext-pill-dot{background:color-mix(in srgb, var(--yii-debug-panel-muted), transparent 60%);border-radius:999px;width:7px;height:7px;display:inline-block}.yii-debug .yii-debug-ext-pill-label{color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-ext-pill-state{margin-left:var(--yii-debug-space-1);color:var(--yii-debug-panel-muted);letter-spacing:.12em;opacity:.7;font-size:.625rem;font-weight:700}.yii-debug .yii-debug-ext-pill.is-on{border-color:color-mix(in srgb, var(--yii-debug-success), transparent 55%);background:color-mix(in srgb, var(--yii-debug-success), var(--yii-debug-panel-surface) 90%)}.yii-debug .yii-debug-ext-pill.is-on .yii-debug-ext-pill-dot{background:var(--yii-debug-success);box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-success), transparent 75%);animation:2.4s ease-in-out infinite yii-debug-led-pulse}.yii-debug .yii-debug-ext-pill.is-on .yii-debug-ext-pill-state{color:var(--yii-debug-success);opacity:1}.yii-debug .yii-debug-ext-pill.is-off{opacity:.55}.yii-debug .yii-debug-phpinfo-shell{gap:var(--yii-debug-space-4);grid-template-columns:220px minmax(0,1fr);align-items:start;display:grid}.yii-debug .yii-debug-phpinfo-toc{top:var(--yii-debug-space-3);max-height:calc(100vh - 80px);padding:var(--yii-debug-space-3);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);scrollbar-width:thin;align-self:start;position:sticky;overflow-y:auto}.yii-debug .yii-debug-phpinfo-toc-title{margin:0 0 var(--yii-debug-space-2);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);align-items:baseline;gap:6px;display:flex}.yii-debug .yii-debug-phpinfo-toc-title span:first-child{color:var(--yii-debug-panel-text);font-variant-numeric:tabular-nums;font-weight:700}.yii-debug .yii-debug-phpinfo-toc-title-note{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);margin-left:auto}.yii-debug .yii-debug-phpinfo-toc-overview,.yii-debug .yii-debug-phpinfo-toc-group-list{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-phpinfo-toc-overview{margin-bottom:var(--yii-debug-space-2);padding-bottom:var(--yii-debug-space-2);border-bottom:var(--yii-debug-border)}.yii-debug .yii-debug-phpinfo-toc-groups{flex-direction:column;gap:2px;display:flex}.yii-debug .yii-debug-phpinfo-toc-group{margin:0}.yii-debug .yii-debug-phpinfo-toc-group-summary{border-radius:var(--yii-debug-radius-sm);color:var(--yii-debug-panel-muted);cursor:pointer;font-size:var(--yii-debug-fs-xs);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:7px;padding:7px 8px;font-weight:600;list-style:none;transition:background-color .12s,color .12s;display:grid}.yii-debug .yii-debug-phpinfo-toc-group-summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-phpinfo-toc-group-summary:before{content:"›";color:var(--yii-debug-panel-muted);font-size:1.1em;line-height:1;transition:transform .12s}.yii-debug .yii-debug-phpinfo-toc-group-summary:hover,.yii-debug .yii-debug-phpinfo-toc-group-summary:focus-visible{background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-phpinfo-toc-group[open]>.yii-debug-phpinfo-toc-group-summary{color:var(--yii-debug-panel-text)}.yii-debug .yii-debug-phpinfo-toc-group[open]>.yii-debug-phpinfo-toc-group-summary:before{transform:rotate(90deg)}.yii-debug .yii-debug-phpinfo-toc-group-count{border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);min-width:22px;color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;text-align:center;padding:1px 6px}.yii-debug .yii-debug-phpinfo-toc-group-list{margin:2px 0 var(--yii-debug-space-2);padding-left:14px}.yii-debug .yii-debug-phpinfo-toc-link{border-radius:0 var(--yii-debug-radius-sm) var(--yii-debug-radius-sm) 0;color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm);border-left:2px solid #0000;padding:7px 10px 7px 12px;text-decoration:none;transition:background-color .12s,color .12s,border-color .12s;display:block}.yii-debug .yii-debug-phpinfo-toc-link:hover,.yii-debug .yii-debug-phpinfo-toc-link:focus-visible{background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-text);text-decoration:none}.yii-debug .yii-debug-phpinfo-toc-link.is-active{border-left-color:var(--yii-debug-panel-primary);background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 90%);color:var(--yii-debug-panel-primary-strong);font-weight:700}.yii-debug .yii-debug-phpinfo-main{min-width:0}.yii-debug .yii-debug-phpinfo-search{margin-bottom:var(--yii-debug-space-3);flex-direction:column;gap:6px;display:flex}.yii-debug .yii-debug-phpinfo-search-control{align-items:center;display:flex;position:relative}.yii-debug .yii-debug-phpinfo-search-icon{width:16px;height:16px;color:var(--yii-debug-panel-muted);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;left:12px}.yii-debug .yii-debug-phpinfo-search-icon svg{width:100%;height:100%}.yii-debug .yii-debug-phpinfo-search-input{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);flex:1;padding:9px 12px 9px 36px;transition:border-color .12s,box-shadow .12s}.yii-debug .yii-debug-phpinfo-search-input::placeholder{color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-phpinfo-search-input:focus{border-color:var(--yii-debug-panel-primary);box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-panel-primary), transparent 80%)}.yii-debug .yii-debug-phpinfo-search-clear{border-radius:var(--yii-debug-radius-sm);color:var(--yii-debug-panel-link);cursor:pointer;font:inherit;font-size:var(--yii-debug-fs-xs);background:0 0;border:0;padding:4px 8px;font-weight:600;position:absolute;right:8px}.yii-debug .yii-debug-phpinfo-search-clear:hover,.yii-debug .yii-debug-phpinfo-search-clear:focus-visible{background:var(--yii-debug-panel-surface-hover);color:var(--yii-debug-panel-link-hover)}.yii-debug .yii-debug-phpinfo-search-control:has(.yii-debug-phpinfo-search-clear:not([hidden])) .yii-debug-phpinfo-search-input{padding-right:58px}.yii-debug .yii-debug-phpinfo-search-feedback{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-2);min-height:18px;padding-inline:2px;display:flex}.yii-debug .yii-debug-phpinfo-search-feedback:has(.yii-debug-phpinfo-search-status:empty):has(.yii-debug-phpinfo-search-empty[hidden]){display:none}.yii-debug .yii-debug-phpinfo-search-status,.yii-debug .yii-debug-phpinfo-search-empty{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-phpinfo-search-empty{color:var(--yii-debug-danger)}.yii-debug .yii-debug-phpinfo-section{scroll-margin-top:var(--yii-debug-space-3)}.yii-debug .yii-debug-phpinfo-section+:is(.yii-debug .yii-debug-phpinfo-section){margin-top:var(--yii-debug-space-4)}.yii-debug .yii-debug-phpinfo-section .yii-debug-disclosure{margin-bottom:0}.yii-debug .yii-debug-phpinfo-toc-link[hidden],.yii-debug .yii-debug-phpinfo-toc-group[hidden],.yii-debug .yii-debug-phpinfo-section[hidden],.yii-debug .yii-debug-phpinfo-search-clear[hidden],.yii-debug .yii-debug-phpinfo-search-empty[hidden],.yii-debug .yii-debug-phpinfo-overview-hero-section[hidden],.yii-debug .yii-debug-disclosure[hidden],.yii-debug .yii-debug-phpinfo-extension-group[hidden],.yii-debug .yii-debug-ext-pill[hidden],.yii-debug .yii-debug-table-wrap[hidden],.yii-debug .yii-debug-phpinfo-module tr[hidden]{display:none}@media (max-width:900px){.yii-debug .yii-debug-phpinfo-shell{grid-template-columns:1fr}.yii-debug .yii-debug-phpinfo-toc{max-height:none;position:static;overflow:hidden}.yii-debug .yii-debug-phpinfo-toc-groups{gap:4px var(--yii-debug-space-2);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.yii-debug .yii-debug-phpinfo-toc-group[open]{grid-column:1/-1}.yii-debug .yii-debug-phpinfo-toc-group-list{grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:4px;padding-left:0;display:grid}.yii-debug .yii-debug-phpinfo-toc-link{border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);border-left:0;padding:4px 10px}.yii-debug .yii-debug-phpinfo-toc-link.is-active{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 80%);border-left:0}}@media (max-width:560px){.yii-debug .yii-debug-phpinfo-toc-groups{grid-template-columns:1fr}}.yii-debug .yii-debug-phpinfo-overview-hero{gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-3);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}@media (max-width:720px){.yii-debug .yii-debug-phpinfo-overview-hero{grid-template-columns:1fr}}.yii-debug .yii-debug-phpinfo-overview-hero-headline{align-items:center;gap:var(--yii-debug-space-3);grid-template-columns:1fr auto;display:grid}.yii-debug .yii-debug-phpinfo-overview-hero-version{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-display,var(--yii-debug-font-mono));letter-spacing:-.02em;font-size:clamp(1.6rem,2.4vw + 1rem,2.4rem);font-weight:800;line-height:1}.yii-debug .yii-debug-phpinfo-overview-hero-mark{border-radius:var(--yii-debug-radius-pill);border:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);min-width:64px;color:var(--yii-debug-panel-primary-strong);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-lg);letter-spacing:.08em;text-transform:lowercase;justify-content:center;align-items:center;padding:6px 14px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-phpinfo-overview-hero-metrics{gap:var(--yii-debug-space-2) var(--yii-debug-space-4);grid-template-columns:repeat(auto-fit,minmax(150px,1fr));margin:0;display:grid}.yii-debug .yii-debug-phpinfo-overview-hero-section{gap:var(--yii-debug-space-3);min-width:0;padding:var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);flex-direction:column;display:flex}.yii-debug .yii-debug-phpinfo-overview-hero-section:first-child{grid-column:1/-1}.yii-debug .yii-debug-phpinfo-extensions{grid-column:1/-1}.yii-debug .yii-debug-phpinfo-extensions>.yii-debug-phpinfo-extension-groups{padding:var(--yii-debug-space-4)}.yii-debug .yii-debug-phpinfo-extension-group-count{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;padding:1px 7px}.yii-debug .yii-debug-phpinfo-extension-groups{gap:var(--yii-debug-space-3);flex-direction:column;display:flex}.yii-debug .yii-debug-phpinfo-extension-group{gap:var(--yii-debug-space-2);flex-direction:column;display:flex}.yii-debug .yii-debug-phpinfo-extension-group-head{align-items:center;gap:var(--yii-debug-space-2);color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);font-weight:600;display:flex}.yii-debug .yii-debug-phpinfo-extension-group-head .yii-debug-phpinfo-extension-group-count{margin-left:auto}.yii-debug .yii-debug-phpinfo-extension-group .yii-debug-ext-pill{scroll-margin-top:var(--yii-debug-space-4)}.yii-debug .yii-debug-phpinfo-extension-group .yii-debug-ext-pill:target,.yii-debug .yii-debug-phpinfo-extension-group .yii-debug-ext-pill.is-search-match{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 45%);background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 90%)}.yii-debug .yii-debug-phpinfo-overview-block-head{border-bottom:var(--yii-debug-border);align-items:center;gap:10px;padding-bottom:8px;display:flex}.yii-debug .yii-debug-phpinfo-overview-block-eyebrow{color:var(--yii-debug-panel-text);font-size:var(--yii-debug-fs-sm);font-weight:600}.yii-debug .yii-debug-phpinfo-overview-hero-metric{flex-direction:column;gap:3px;padding-block:2px;display:flex}.yii-debug .yii-debug-phpinfo-overview-hero-metric dt{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);margin:0;font-weight:600;line-height:1.2}.yii-debug .yii-debug-phpinfo-overview-hero-metric dd{overflow-wrap:break-word;min-width:0;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);margin:0;line-height:1.4}.yii-debug .yii-debug-phpinfo-overview-hero-metric dd code{color:inherit;background:0 0;padding:0}.yii-debug .yii-debug-phpinfo-overview-hero-metric.is-wide{grid-column:1/-1}.yii-debug .yii-debug-phpinfo-overview-pill{border-radius:var(--yii-debug-radius-pill);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;text-transform:uppercase;border:1px solid #0000;align-items:center;gap:6px;padding:1px 10px;font-weight:700;display:inline-flex}.yii-debug .yii-debug-phpinfo-overview-pill[data-variant=success]{color:var(--yii-debug-success);background:color-mix(in srgb, var(--yii-debug-success), transparent 86%);border-color:color-mix(in srgb, var(--yii-debug-success), transparent 65%)}.yii-debug .yii-debug-phpinfo-overview-pill[data-variant=muted]{color:var(--yii-debug-panel-muted);background:var(--yii-debug-panel-surface-muted);border-color:var(--yii-debug-panel-border)}.yii-debug .yii-debug-phpinfo-overview-token{border:1px solid var(--yii-debug-panel-border);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);padding:1px 8px}.yii-debug .yii-debug-phpinfo-overview-files{flex-wrap:wrap;gap:4px;display:flex}.yii-debug .yii-debug-phpinfo-overview-files .yii-debug-phpinfo-overview-token{cursor:help;transition:border-color .12s,background-color .12s}.yii-debug .yii-debug-phpinfo-overview-files .yii-debug-phpinfo-overview-token:hover{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 40%);background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 88%)}.yii-debug .yii-debug-phpinfo-module{gap:var(--yii-debug-space-3);flex-direction:column;margin-top:0;display:flex}.yii-debug .yii-debug-phpinfo-module-head{align-items:center;gap:10px;margin:0;padding:2px 2px 0;display:flex}.yii-debug .yii-debug-phpinfo-module-head h2{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xl);text-align:left;background:0 0;margin:0;padding:0;font-weight:600}.yii-debug .yii-debug-phpinfo-table-section{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-sm);overflow:hidden}.yii-debug .yii-debug-phpinfo-table-section-head{justify-content:space-between;align-items:center;gap:var(--yii-debug-space-2);padding:9px var(--yii-debug-space-3);border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-sm);font-weight:600;display:flex}.yii-debug .yii-debug-phpinfo-variable-group>summary{cursor:pointer;list-style:none;transition:background-color .12s}.yii-debug .yii-debug-phpinfo-variable-group>summary::-webkit-details-marker{display:none}.yii-debug .yii-debug-phpinfo-variable-group>summary:hover,.yii-debug .yii-debug-phpinfo-variable-group>summary:focus-visible{background:var(--yii-debug-panel-surface-hover)}.yii-debug .yii-debug-phpinfo-variable-group>summary>span:first-child{align-items:center;gap:8px;display:inline-flex}.yii-debug .yii-debug-phpinfo-variable-group>summary>span:first-child:before{content:"›";color:var(--yii-debug-panel-muted);font-size:1.1em;line-height:1;transition:transform .12s}.yii-debug .yii-debug-phpinfo-variable-group[open]>summary>span:first-child:before{transform:rotate(90deg)}.yii-debug .yii-debug-phpinfo-table-section-count{border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;flex:none;padding:1px 7px;font-weight:500}.yii-debug .yii-debug-phpinfo-table-scroll{min-width:0;overflow-x:auto}.yii-debug .yii-debug-phpinfo-module .yii-debug-table{table-layout:fixed;min-width:560px}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr>:first-child{width:40%}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr>:nth-child(2):last-child{width:60%}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr>:nth-child(2):not(:last-child),.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr>:nth-child(3){width:30%}.yii-debug .yii-debug-phpinfo-module .yii-debug-table th,.yii-debug .yii-debug-phpinfo-module .yii-debug-table td{text-align:left}.yii-debug .yii-debug-phpinfo-module .yii-debug-table th[scope=row]{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);white-space:normal;font-weight:500}.yii-debug .yii-debug-phpinfo-module .yii-debug-table td{font-family:var(--yii-debug-font-mono)}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr.h>*{z-index:1;background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.03em;text-transform:uppercase;font-weight:700;position:sticky;top:0}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr.is-search-match>*{background:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 88%)!important}.yii-debug .yii-debug-phpinfo-module .yii-debug-table tr.has-local-override>td:nth-child(2){box-shadow:inset 2px 0 0 color-mix(in srgb, var(--yii-debug-warning), transparent 25%);color:color-mix(in srgb, var(--yii-debug-warning) 72%, var(--yii-debug-panel-text))}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-phpinfo-table-scroll{overflow:visible}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts{table-layout:auto;min-width:0;display:block}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tbody{grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact{border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border), transparent 25%);grid-template-columns:minmax(130px,.85fr) minmax(0,1.15fr);min-width:0;display:grid}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact:nth-child(odd){border-right:1px solid color-mix(in srgb, var(--yii-debug-panel-border), transparent 25%)}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact.yii-debug-phpinfo-fact-wide{border-right:0;grid-column:1/-1}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact>*{overflow-wrap:anywhere;background:0 0;border:0;width:auto;padding:9px 12px}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact>th{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);font-weight:600}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact>td{color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs)}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact-subheading{grid-column:1/-1;display:block}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact-subheading>th{border-block:var(--yii-debug-border);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 15%);width:auto;color:var(--yii-debug-panel-text);font-family:var(--yii-debug-font-sans);font-size:var(--yii-debug-fs-xs);letter-spacing:.02em;text-align:left;padding:8px 12px;font-weight:600;display:block}.yii-debug .yii-debug-phpinfo-status-pill,.yii-debug .yii-debug-phpinfo-redacted{border-radius:var(--yii-debug-radius-pill);width:-moz-fit-content;width:fit-content;font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.03em;border:1px solid #0000;align-items:center;padding:1px 8px;font-weight:600;display:inline-flex}.yii-debug .yii-debug-phpinfo-status-pill[data-variant=success]{border-color:color-mix(in srgb, var(--yii-debug-success), transparent 65%);background:color-mix(in srgb, var(--yii-debug-success), transparent 88%);color:var(--yii-debug-success)}.yii-debug .yii-debug-phpinfo-status-pill[data-variant=muted]{border-color:var(--yii-debug-panel-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted)}.yii-debug .yii-debug-phpinfo-redacted{border-color:color-mix(in srgb, var(--yii-debug-warning), transparent 65%);background:color-mix(in srgb, var(--yii-debug-warning), transparent 90%);color:color-mix(in srgb, var(--yii-debug-warning) 72%, var(--yii-debug-panel-text));text-transform:uppercase}.yii-debug .yii-debug-phpinfo-table-section.is-note .yii-debug-table.is-note{table-layout:auto;min-width:0}.yii-debug .yii-debug-phpinfo-table-section.is-note .yii-debug-table.is-note td,.yii-debug .yii-debug-phpinfo-table-section.is-note .yii-debug-table.is-note th{width:auto;padding:var(--yii-debug-space-3);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-sans);text-align:left;line-height:1.6}@media (max-width:720px){.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tbody{grid-template-columns:1fr}.yii-debug .yii-debug-phpinfo-table-section.is-facts .yii-debug-table.is-facts tr.yii-debug-phpinfo-fact{border-right:0}}@media (max-width:959px){.yii-debug .yii-debug-sidebar{min-width:0}.yii-debug .yii-debug-nav{overscroll-behavior-x:contain;scrollbar-width:thin;overflow-x:auto}.yii-debug .yii-debug-nav ul{gap:var(--yii-debug-space-1);flex-direction:row;width:max-content;min-width:100%}.yii-debug .yii-debug-nav-link{white-space:nowrap;min-height:40px}.yii-debug .yii-debug-nav-link:after{display:none}.yii-debug .yii-debug-nav-link-icon{margin-right:var(--yii-debug-space-1)}}@media (max-width:767px){.yii-debug .yii-debug-page{padding:var(--yii-debug-space-2)}.yii-debug .yii-debug-card{padding:var(--yii-debug-space-3)}}@media (prefers-reduced-motion:reduce){.yii-debug *,.yii-debug :before,.yii-debug :after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@keyframes yii-debug-readout-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes yii-debug-led-pulse{0%,to{box-shadow:0 0 0 3px color-mix(in srgb, var(--yii-debug-success), transparent 75%)}50%{box-shadow:0 0 0 6px color-mix(in srgb, var(--yii-debug-success), transparent 90%)}}.yii-debug-tl-filter{align-items:end;gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface-muted);flex-wrap:wrap;display:flex}.yii-debug-tl-field{flex-direction:column;gap:4px;min-width:160px;display:flex}.yii-debug-tl-field label{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-xs);letter-spacing:.06em;text-transform:uppercase;font-weight:600}.yii-debug-tl-field input{padding:6px var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-sm);background:var(--yii-debug-panel-surface);color:var(--yii-debug-panel-text);font:inherit;font-family:var(--yii-debug-font-mono)}.yii-debug-tl-field input::placeholder{color:var(--yii-debug-panel-muted)}.yii-debug-tl-field input:focus{border-color:var(--yii-debug-panel-primary)}.yii-debug-tl-field-grow{flex:240px}.yii-debug-tl-hint{margin-bottom:var(--yii-debug-space-3);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:1px dashed color-mix(in srgb, var(--yii-debug-panel-border) 70%, transparent);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-panel-surface-muted), transparent 40%)}.yii-debug-tl-hint-title{color:var(--yii-debug-panel-text);margin:0 0 6px;font-weight:600}.yii-debug-tl-hint-body{color:var(--yii-debug-panel-muted);font-size:var(--yii-debug-fs-sm);margin:0;line-height:1.55}.yii-debug-tl-hint-body em{color:var(--yii-debug-panel-text);font-style:normal;font-weight:600}.yii-debug-tl{--yii-debug-tl-label-col:22%;grid-template-columns:minmax(180px, var(--yii-debug-tl-label-col)) 1fr;border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);grid-template-rows:auto 1fr auto;gap:0;display:grid;overflow:hidden}@media (max-width:1440px){.yii-debug-tl{--yii-debug-tl-label-col:32%}}.yii-debug-tl-axis{border-bottom:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);grid-column:2/3;height:32px;padding:8px 0;position:relative}.yii-debug-tl-tick{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);letter-spacing:.04em;white-space:nowrap;pointer-events:none;position:absolute;top:8px;transform:translate(-50%)}.yii-debug-tl-tick:after{content:"";background:var(--yii-debug-panel-border);width:1px;height:8px;position:absolute;top:18px;left:50%}.yii-debug-tl-rows{grid-column:1/3;grid-template-columns:minmax(180px, var(--yii-debug-tl-label-col)) 1fr;background:linear-gradient(to right, transparent calc(var(--yii-debug-tl-label-col) - 1px), var(--yii-debug-panel-border) calc(var(--yii-debug-tl-label-col) - 1px), var(--yii-debug-panel-border) var(--yii-debug-tl-label-col), transparent var(--yii-debug-tl-label-col));display:grid}.yii-debug-tl-row{display:contents}.yii-debug-tl-row:hover .yii-debug-tl-label,.yii-debug-tl-row:hover .yii-debug-tl-track{background:var(--yii-debug-panel-surface-hover)}.yii-debug-tl-row:hover .yii-debug-tl-name{color:var(--yii-debug-panel-text)}.yii-debug-tl-label{min-width:0;padding:8px var(--yii-debug-space-3) 8px calc(var(--yii-debug-space-3) + (var(--depth,0) * 14px));border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 50%, transparent);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;transition:background-color .12s;display:grid}.yii-debug-tl-dot{background:var(--yii-debug-cat-db);opacity:.85;border-radius:50%;flex:none;width:6px;height:6px}.yii-debug-tl-name{font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);color:var(--yii-debug-panel-muted);text-overflow:ellipsis;white-space:nowrap;transition:color .12s;overflow:hidden}.yii-debug-tl-track{border-bottom:1px solid color-mix(in srgb, var(--yii-debug-panel-border) 50%, transparent);transition:background-color .12s;position:relative}.yii-debug-tl-bar{background:var(--yii-debug-cat-db);border-radius:4px;min-width:2px;height:18px;position:absolute;top:50%;transform:translateY(-50%);box-shadow:inset 0 1px #ffffff1f,0 1px 2px #0000002e}.yii-debug-tl-bar-duration{color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;white-space:nowrap;justify-self:end;font-weight:500}.yii-debug-tl-memory{grid-template-columns:minmax(180px, var(--yii-debug-tl-label-col)) 1fr auto;padding:var(--yii-debug-space-2) var(--yii-debug-space-3);border-top:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);grid-column:1/3;align-items:center;display:grid}.yii-debug-tl-memory-label{text-transform:uppercase;letter-spacing:.06em}.yii-debug-tl-memory-track{border-radius:var(--yii-debug-radius-sm);background:color-mix(in srgb, var(--yii-debug-panel-surface), transparent 50%);width:100%;color:var(--yii-debug-panel-primary);position:relative;overflow:hidden}.yii-debug-tl-memory-track svg{width:100%;height:100%;display:block}.yii-debug-tl-memory-peak{margin-left:var(--yii-debug-space-2);color:var(--yii-debug-panel-text);font-weight:700}@media (max-width:640px){.yii-debug-tl,.yii-debug-tl-rows{--yii-debug-tl-label-col:52%;grid-template-columns:minmax(140px, var(--yii-debug-tl-label-col)) minmax(0, 1fr)}.yii-debug-tl-label{padding:7px var(--yii-debug-space-2);gap:6px}.yii-debug-tl-memory{grid-template-columns:minmax(140px, var(--yii-debug-tl-label-col)) minmax(0, 1fr)}.yii-debug-tl-memory-peak{text-align:right;grid-column:2;margin:4px 0 0}}.yii-debug .yii-debug-skip-link{top:var(--yii-debug-space-2);left:var(--yii-debug-space-2);z-index:1000;padding:var(--yii-debug-space-2) var(--yii-debug-space-3);border:2px solid var(--yii-debug-focus-ring);border-radius:var(--yii-debug-radius-md);background:var(--yii-debug-panel-surface);box-shadow:var(--yii-debug-shadow-md);color:var(--yii-debug-panel-text);transform:translateY(calc(-100% - var(--yii-debug-space-4)));font-weight:700;position:fixed}.yii-debug .yii-debug-skip-link:focus-visible{text-decoration:none;transform:translateY(0)}.yii-debug .yii-debug-brand-chip-control{border:var(--yii-debug-border);background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted);cursor:pointer;justify-content:center}.yii-debug .yii-debug-brand-chip-control:hover,.yii-debug .yii-debug-brand-chip-control:focus-visible{border-color:color-mix(in srgb, var(--yii-debug-panel-primary), transparent 50%);color:var(--yii-debug-panel-primary-strong);transform:translateY(-1px)}.yii-debug :is(h2,h3).yii-debug-has-permalink{align-items:center;gap:var(--yii-debug-space-1);scroll-margin-block-start:var(--yii-debug-space-5);display:flex}.yii-debug .yii-debug-heading-permalink{border-radius:var(--yii-debug-radius-sm);min-width:32px;min-height:32px;color:var(--yii-debug-panel-muted);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-sm);opacity:0;transition:color var(--yii-debug-duration-fast) ease, opacity var(--yii-debug-duration-fast) ease, background var(--yii-debug-duration-fast) ease;flex:none;justify-content:center;align-items:center;line-height:1;text-decoration:none;display:inline-flex}.yii-debug .yii-debug-heading-permalink:hover,.yii-debug .yii-debug-heading-permalink:focus-visible{background:var(--yii-debug-panel-bg-accent);color:var(--yii-debug-panel-primary-strong);opacity:1;text-decoration:none}.yii-debug :is(h2,h3).yii-debug-has-permalink:hover>.yii-debug-heading-permalink,.yii-debug :is(h2,h3).yii-debug-has-permalink:focus-within>.yii-debug-heading-permalink,.yii-debug :is(h2,h3).yii-debug-deep-link-target>.yii-debug-heading-permalink{opacity:1}.yii-debug .yii-debug-deep-link-target{outline:2px solid var(--yii-debug-focus-ring);outline-offset:4px}.yii-debug .yii-debug-db-n1-summary{gap:var(--yii-debug-space-2);margin-bottom:var(--yii-debug-space-4);padding:var(--yii-debug-space-3) var(--yii-debug-space-4);border:1px solid color-mix(in srgb, var(--yii-debug-warning), transparent 55%);border-radius:var(--yii-debug-radius-md);background:color-mix(in srgb, var(--yii-debug-warning), transparent 92%);display:grid}.yii-debug .yii-debug-db-n1-heading{justify-content:space-between;align-items:baseline;gap:var(--yii-debug-space-2);flex-wrap:wrap;display:flex}.yii-debug .yii-debug-db-n1-list{gap:var(--yii-debug-space-2);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.yii-debug .yii-debug-db-n1-link,.yii-debug .yii-debug-db-n1-row-link{align-items:center;gap:var(--yii-debug-space-2);min-height:var(--yii-debug-control-min-size);padding:var(--yii-debug-space-1) var(--yii-debug-space-2);border:1px solid color-mix(in srgb, var(--yii-debug-warning), transparent 60%);border-radius:var(--yii-debug-radius-pill);background:var(--yii-debug-panel-surface);color:color-mix(in srgb, var(--yii-debug-warning) 72%, var(--yii-debug-panel-text));font-size:var(--yii-debug-fs-xs);font-weight:700;text-decoration:none;display:inline-flex}:is(.yii-debug .yii-debug-db-n1-link,.yii-debug .yii-debug-db-n1-row-link):hover,:is(.yii-debug .yii-debug-db-n1-link,.yii-debug .yii-debug-db-n1-row-link):focus-visible,:is(.yii-debug .yii-debug-db-n1-link,.yii-debug .yii-debug-db-n1-row-link)[aria-current=true]{background:color-mix(in srgb, var(--yii-debug-warning), transparent 84%);color:var(--yii-debug-panel-text);text-decoration:none}.yii-debug .yii-debug-db-n1-fingerprint{max-width:min(56ch,65vw);font-family:var(--yii-debug-font-mono);text-overflow:ellipsis;white-space:nowrap;font-weight:500;display:inline-block;overflow:hidden}.yii-debug .yii-debug-db-n1-row-link{margin-top:var(--yii-debug-space-3)}.yii-debug .yii-debug-grid-db .yii-debug-trace{gap:0;display:grid}.yii-debug .yii-debug-grid-db .yii-debug-trace a{align-items:center;min-height:24px;display:inline-flex}.yii-debug .yii-debug-db-n1-clear[hidden]{display:none}.yii-debug .yii-debug-compare-form{gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-4);grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));align-items:end;display:grid}.yii-debug .yii-debug-compare-overview{gap:var(--yii-debug-space-3);margin-bottom:var(--yii-debug-space-4);grid-template-columns:repeat(auto-fit,minmax(min(100%,12rem),1fr));display:grid}.yii-debug .yii-debug-compare-grid{min-width:42rem}.yii-debug :is(.yii-debug-delta-up,.yii-debug-delta-down,.yii-debug-delta-neutral){padding:2px var(--yii-debug-space-2);border:var(--yii-debug-border);border-radius:var(--yii-debug-radius-pill);font-family:var(--yii-debug-font-mono);font-size:var(--yii-debug-fs-xs);font-variant-numeric:tabular-nums;align-items:center;font-weight:700;display:inline-flex}.yii-debug .yii-debug-delta-up{border-color:color-mix(in srgb, var(--yii-debug-danger), transparent 60%);background:color-mix(in srgb, var(--yii-debug-danger), transparent 90%);color:var(--yii-debug-danger)}.yii-debug .yii-debug-delta-down{border-color:color-mix(in srgb, var(--yii-debug-success), transparent 60%);background:color-mix(in srgb, var(--yii-debug-success), transparent 90%);color:var(--yii-debug-success)}.yii-debug .yii-debug-delta-neutral{background:var(--yii-debug-panel-surface-muted);color:var(--yii-debug-panel-muted)}@container yii-debug-main (width<=560px){.yii-debug .yii-debug-section-header,.yii-debug .yii-debug-panel-heading{flex-direction:column;align-items:stretch}.yii-debug .yii-debug-filter-input{width:100%;max-width:none}}@media (max-width:767px){.yii-debug .yii-debug-brand-chip-copy .yii-debug-brand-label{text-overflow:ellipsis;white-space:nowrap;max-width:5.5rem;overflow:hidden}}@media (pointer:coarse){.yii-debug .yii-debug-grid-db .yii-debug-trace a{min-width:44px;min-height:44px}.yii-debug :is(.yii-debug-btn,.yii-debug-brand-chip,.yii-debug-cell-more-toggle,.yii-debug-filter-input,.yii-debug-heading-permalink,.yii-debug-server-group-summary,.yii-debug-tab-link){min-height:44px}}@media (forced-colors:active){.yii-debug .yii-debug-card,.yii-debug .yii-debug-brand-bar,.yii-debug .yii-debug-brand-chip,.yii-debug .yii-debug-nav,.yii-debug .yii-debug-table-wrap{box-shadow:none;border-color:canvastext}.yii-debug .yii-debug-nav-link.is-active,.yii-debug .yii-debug-tab-link.is-active{color:highlighttext;background:highlight;border-color:highlight}.yii-debug :focus-visible{outline-color:highlight}} diff --git a/resources/src/styles/main.css b/resources/src/styles/main.css index 671a3cc..b8b8cd2 100644 --- a/resources/src/styles/main.css +++ b/resources/src/styles/main.css @@ -2626,20 +2626,25 @@ word-break: break-all; } - .yii-debug-queue-tree-value-string { + /* Typed values of the queue payload tree and the log dump tree. */ + .yii-debug-queue-tree-value-string, + .yii-debug-log-dump-value-string { color: var(--yii-debug-success); } - .yii-debug-queue-tree-value-number { + .yii-debug-queue-tree-value-number, + .yii-debug-log-dump-value-number { color: var(--yii-debug-info); } - .yii-debug-queue-tree-value-bool { + .yii-debug-queue-tree-value-bool, + .yii-debug-log-dump-value-bool { color: var(--yii-debug-warning); font-weight: 600; } - .yii-debug-queue-tree-value-null { + .yii-debug-queue-tree-value-null, + .yii-debug-log-dump-value-null { color: var(--yii-debug-panel-muted); font-style: italic; } diff --git a/src/Helper/PhpHighlighter.php b/src/Helper/PhpHighlighter.php index ebb40e3..2e67760 100644 --- a/src/Helper/PhpHighlighter.php +++ b/src/Helper/PhpHighlighter.php @@ -36,12 +36,6 @@ public static function highlight(mixed $value): string * * The `
` wrapper scrolls horizontally, so it carries `tabindex="0"` to stay reachable by keyboard.
      *
-     * Usage example:
-     * ```php
-     * $html = PhpHighlighter::highlightCode("array (\n  'id' => 7,\n)");
-     * // '
array (' . "\n" . '  ...'
-     * ```
-     *
      * @param string $code PHP source of an expression, without the opening tag.
      *
      * @return string Highlighted markup in a focusable `
`, without the opening tag PHP needs to recognize the
diff --git a/src/Helper/Text.php b/src/Helper/Text.php
index f622ffa..cbfc79f 100644
--- a/src/Helper/Text.php
+++ b/src/Helper/Text.php
@@ -44,12 +44,6 @@ public static function camel2id(string $name): string
      * {@see PhpHighlighter::highlightCode()} output; {@see self::preserveLineBreaks()} escapes raw text first. `\r\n`
      * and a lone `\r` become one line break, as the HTML parser reads them.
      *
-     * Usage example:
-     * ```php
-     * $html = Text::preserveHtmlLineBreaks("'a\r\nb'");
-     * // "'a
b'"
-     * ```
-     *
      * @param string $html Escaped HTML markup.
      *
      * @return string Markup without raw line breaks.
@@ -67,12 +61,6 @@ public static function preserveHtmlLineBreaks(string $html): string
      * normalization and still renders as a line break under `white-space: pre-wrap`. `\r\n` and a lone `\r` become one
      * line break, as the HTML parser reads them.
      *
-     * Usage example:
-     * ```php
-     * $html = Pre::tag()->html(Text::preserveLineBreaks("a\n\n"))->render();
-     * // "
\na

<b>\n
" - * ``` - * * @param string $text Raw text to render. * * @return string Escaped HTML content without raw line breaks. diff --git a/src/Panel/Log/PrintREntry.php b/src/Panel/Log/DumpEntry.php similarity index 54% rename from src/Panel/Log/PrintREntry.php rename to src/Panel/Log/DumpEntry.php index 212358b..d2f3e26 100644 --- a/src/Panel/Log/PrintREntry.php +++ b/src/Panel/Log/DumpEntry.php @@ -5,22 +5,20 @@ namespace PHPForge\Debug\Panel\Log; /** - * Represents one `[key] => value` line of a parsed `print_r()` block. + * Represents one key and its value inside an array, object, or enum block of a dump tree. * - * Inside object and enum blocks the key is split into the property name, its visibility, and the class that declares - * a private property; array keys and the dynamic property names of a `stdClass` object stay verbatim. + * Only the property keys of a `print_r()` object or enum dump, `stdClass` excluded, carry a visibility. */ -final readonly class PrintREntry +final readonly class DumpEntry { /** * @param string $key Array key or property name. - * @param PrintRNode $value Value of the entry. * @param string $visibility `protected`, `private`, or `''` for a public property or an array key. * @param string $declaringClass Class declaring a private property; `''` otherwise. */ public function __construct( public string $key, - public PrintRNode $value, + public DumpNode $value, public string $visibility = '', public string $declaringClass = '', ) {} diff --git a/src/Panel/Log/DumpKind.php b/src/Panel/Log/DumpKind.php new file mode 100644 index 0000000..096c344 --- /dev/null +++ b/src/Panel/Log/DumpKind.php @@ -0,0 +1,63 @@ + $entries Block entries. + */ + private function __construct( + public DumpKind $kind, + public string $label, + public string $text, + public array $entries, + ) {} + + /** + * Creates an array, object, or enum block. + * + * @param string $label Class name of an object or enum; `''` for an array. + * @param list $entries Entries in dump order. + * @param string $prefix Free text preceding a root block header, such as `Request:`. + */ + public static function block(DumpKind $kind, string $label, array $entries, string $prefix = ''): self + { + return new self($kind, $label, $prefix, $entries); + } + + /** + * Creates a boolean from its printed text. + */ + public static function boolean(string $text): self + { + return new self(DumpKind::BOOLEAN, '', $text, []); + } + + /** + * Creates the enum case reference that `var_export()` prints as `\Class::Case`. + * + * @param string $class Enum class name, without the leading backslash. + */ + public static function enumCase(string $class, string $case): self + { + return new self(DumpKind::ENUM, $class, $case, []); + } + + /** + * Creates a float from its printed text. + */ + public static function float(string $text): self + { + return new self(DumpKind::FLOAT, '', $text, []); + } + + /** + * Creates the tree of a context value normalized by {@see LogContext::normalize()}. + * + * A value that is neither an array, a scalar, nor `null` becomes an untyped scalar. + */ + public static function fromValue(mixed $value): self + { + if (is_array($value)) { + $entries = []; + + foreach ($value as $key => $item) { + $entries[] = new DumpEntry((string) $key, self::fromValue($item)); + } + + return self::block(DumpKind::ARRAY, '', $entries); + } + + return match (true) { + is_string($value) => self::string($value), + is_int($value) => self::integer(var_export($value, true)), + is_float($value) => self::float(var_export($value, true)), + is_bool($value) => self::boolean(var_export($value, true)), + $value === null => self::null('NULL'), + default => self::scalar(Dump::asString($value)), + }; + } + + /** + * Creates an integer from its printed text. + */ + public static function integer(string $text): self + { + return new self(DumpKind::INTEGER, '', $text, []); + } + + /** + * Creates a `null` from its printed text. + */ + public static function null(string $text): self + { + return new self(DumpKind::NULL, '', $text, []); + } + + /** + * Creates the marker `print_r()` prints instead of an array or object it is already printing. + * + * @param string $label Class name of a recursive object; `''` for a recursive array. + */ + public static function recursion(string $label): self + { + return new self(DumpKind::RECURSION, $label, '', []); + } + + /** + * Creates an untyped `print_r()` scalar. + * + * @param string $text Text as printed, continuation lines included. + */ + public static function scalar(string $text): self + { + return new self(DumpKind::SCALAR, '', $text, []); + } + + /** + * Creates a string from its decoded value. + */ + public static function string(string $value): self + { + return new self(DumpKind::STRING, '', $value, []); + } +} diff --git a/src/Panel/Log/DumpTreeRenderer.php b/src/Panel/Log/DumpTreeRenderer.php new file mode 100644 index 0000000..297b550 --- /dev/null +++ b/src/Panel/Log/DumpTreeRenderer.php @@ -0,0 +1,236 @@ +` markup for the Log debug panel. + * + * The root block starts open unless the tree holds more than {@see self::MAX_OPEN_NODES} values; all text is escaped + * once. + */ +final class DumpTreeRenderer +{ + /** + * Maximum number of values of a tree whose root block starts open. + */ + private const int MAX_OPEN_NODES = 200; + + /** + * Renders a dump tree, or only the value markup of a scalar or enum case root. + */ + public static function render(DumpNode $root): string + { + $head = self::head($root); + + if ($root->entries === [] && $root->kind !== DumpKind::ARRAY && $root->kind !== DumpKind::OBJECT) { + return implode('', $head); + } + + if ($root->text !== '') { + $head = [self::span('yii-debug-log-dump-prefix', $root->text), ...$head]; + } + + return Details::tag() + ->class('yii-debug-log-dump') + ->html(self::summary($head), self::entries($root)) + ->open(self::nodes($root) <= self::MAX_OPEN_NODES) + ->render(); + } + + /** + * Renders the entry list of a block. + */ + private static function entries(DumpNode $block): Div + { + return Div::tag() + ->class('yii-debug-log-dump-entries') + ->html(...array_map(self::entry(...), $block->entries)); + } + + /** + * Renders one entry as a flat row, or as a collapsed `
` for a block with entries. + */ + private static function entry(DumpEntry $entry): Details|Div + { + $head = [ + self::span('yii-debug-log-dump-key', $entry->key), + ...self::visibility($entry), + ...self::head($entry->value), + ]; + + if ($entry->value->entries === []) { + return self::row($head); + } + + return Details::tag() + ->class('yii-debug-log-dump-node') + ->html(self::summary($head), self::entries($entry->value)); + } + + /** + * Renders the description of a value: its scalar markup, or its class label, kind chip, and count or marker. + * + * @return list Parts in display order. + */ + private static function head(DumpNode $node): array + { + $scalar = self::scalar($node); + + if ($scalar !== null) { + return [$scalar]; + } + + $head = $node->label === '' ? [] : [Fqcn::renderLabel($node->label)]; + + $head[] = self::span( + 'yii-debug-log-dump-kind', + $node->kind === DumpKind::ENUM + ? LogMessage::DUMP_KIND_ENUM->value + : ($node->label === '' ? LogMessage::DUMP_KIND_ARRAY->value : LogMessage::DUMP_KIND_OBJECT->value), + ); + + $count = count($node->entries); + + $head[] = match (true) { + $node->kind === DumpKind::RECURSION => self::span( + 'yii-debug-log-dump-recursion', + LogMessage::DUMP_RECURSION->value, + LogMessage::DUMP_RECURSION_TITLE->value, + ), + $node->kind === DumpKind::ENUM && $count === 0 => self::span( + 'yii-debug-log-dump-value', + $node->text, + ), + default => self::span( + 'yii-debug-log-dump-count', + $count === 1 ? LogMessage::DUMP_ENTRY->value : sprintf(LogMessage::DUMP_ENTRIES->value, $count), + ), + }; + + return $head; + } + + /** + * Counts the values of a tree, the root included. + */ + private static function nodes(DumpNode $node): int + { + $count = 1; + + foreach ($node->entries as $entry) { + $count += self::nodes($entry->value); + } + + return $count; + } + + /** + * Renders a flat entry row. + * + * @param list $parts Parts in display order. + */ + private static function row(array $parts): Div + { + return Div::tag() + ->class('yii-debug-log-dump-row') + ->html(...$parts); + } + + /** + * Renders a scalar value, or returns `null` for a block, an enum case reference, or a recursion marker. + */ + private static function scalar(DumpNode $node): Span|null + { + return match ($node->kind) { + DumpKind::SCALAR => $node->text === '' + ? self::span('yii-debug-log-dump-empty', LogMessage::DUMP_EMPTY->value, LogMessage::DUMP_EMPTY_TITLE->value) + : self::value('yii-debug-log-dump-value', $node->text), + DumpKind::STRING => self::value('yii-debug-log-dump-value yii-debug-log-dump-value-string', "\"{$node->text}\"") + ->title( + strlen($node->text) === 1 + ? LogMessage::DUMP_STRING_BYTE->value + : sprintf(LogMessage::DUMP_STRING_BYTES->value, strlen($node->text)), + ), + DumpKind::FLOAT, DumpKind::INTEGER => self::value( + 'yii-debug-log-dump-value yii-debug-log-dump-value-number', + $node->text, + ), + DumpKind::BOOLEAN => self::value('yii-debug-log-dump-value yii-debug-log-dump-value-bool', $node->text), + DumpKind::NULL => self::value('yii-debug-log-dump-value yii-debug-log-dump-value-null', $node->text), + default => null, + }; + } + + /** + * Renders a `` with escaped content and a tooltip unless `$title` is `''`. + */ + private static function span(string $class, string $content, string $title = ''): Span + { + $span = Span::tag() + ->class($class) + ->content($content); + + return $title === '' ? $span : $span->title($title); + } + + /** + * Renders the `` of a block. + * + * @param list $parts Parts in display order. + */ + private static function summary(array $parts): Summary + { + return Summary::tag() + ->class('yii-debug-log-dump-summary') + ->html(...$parts); + } + + /** + * Renders a scalar value `` whose line breaks are written as ` `. + */ + private static function value(string $class, string $text): Span + { + return Span::tag() + ->class($class) + ->html(Text::preserveLineBreaks($text)); + } + + /** + * Renders the visibility chip of a protected or private property. + * + * @return list Chip, or `[]` for a public property or an array key. + */ + private static function visibility(DumpEntry $entry): array + { + return match ($entry->visibility) { + 'private' => [ + self::span( + 'yii-debug-log-dump-visibility', + LogMessage::DUMP_PRIVATE->value, + sprintf(LogMessage::DUMP_PRIVATE_TITLE->value, $entry->declaringClass), + ), + ], + 'protected' => [ + self::span( + 'yii-debug-log-dump-visibility', + LogMessage::DUMP_PROTECTED->value, + LogMessage::DUMP_PROTECTED_TITLE->value, + ), + ], + default => [], + }; + } +} diff --git a/src/Panel/Log/LogCellRenderer.php b/src/Panel/Log/LogCellRenderer.php index 79d8f62..64a9d38 100644 --- a/src/Panel/Log/LogCellRenderer.php +++ b/src/Panel/Log/LogCellRenderer.php @@ -5,20 +5,19 @@ namespace PHPForge\Debug\Panel\Log; use Closure; -use PHPForge\Debug\Helper\{CellMore, Disclosure, Dump, Format, Fqcn, LogLevel, PhpHighlighter, Text, Vocabulary}; +use PHPForge\Debug\Helper\{CellMore, Disclosure, Format, Fqcn, LogLevel, PhpHighlighter, Text, Vocabulary}; use PHPForge\Debug\Panel\Db\SqlHighlighter; use PHPForge\Debug\Theme\Css; use UIAwesome\Html\Flow\{Div, Pre}; use UIAwesome\Html\Helper\Encode; use UIAwesome\Html\List\{Dd, Dl, Dt, Li, Ul}; use UIAwesome\Html\Palpable\A; -use UIAwesome\Html\Phrasing\{Code, Span}; +use UIAwesome\Html\Phrasing\Span; use function array_map; use function count; use function implode; use function intdiv; -use function is_array; use function sprintf; use function str_starts_with; use function strpbrk; @@ -37,7 +36,7 @@ final class LogCellRenderer */ private const string EXPORT_CLASS = 'yii-debug-php-dump yii-debug-log-export'; /** - * @var array Maps the four severity levels surfaced in the grid to the row variant CSS modifier. + * @var array Maps the severity levels highlighted in the grid to the row variant CSS modifier. */ private const array LEVEL_VARIANTS = [ LogLevel::ERROR => 'danger', @@ -45,8 +44,7 @@ final class LogCellRenderer LogLevel::INFO => 'info', ]; /** - * Category prefix of the DB command log entries whose message is a raw SQL statement - * (the DB collector category defaults). + * Category prefix of the DB command log entries whose message is a raw SQL statement. */ private const string SQL_CATEGORY_PREFIX = 'yii\db\Command::'; /** @@ -75,8 +73,7 @@ public static function buildRowOptions(LogRow $row): array } /** - * Renders the category as the shared {@see Fqcn::renderLabel()} two-tone label: muted namespace prefix plus a - * bold `Class::method` pair, with the full category preserved in the `title` attribute. + * Renders the category as the shared {@see Fqcn::renderLabel()} two-tone label. */ public static function renderCategoryCell(LogRow $row): string { @@ -97,18 +94,9 @@ public static function renderLevelCell(LogRow $row): string /** * Renders the message cell, followed by the optional context disclosure and the optional trace list. * - * The row holds the message as a display string (already exported when the source was non-string), so the renderer - * escapes it once — except for DB command entries and for any message {@see SqlHighlighter::isStatement()} reads - * as raw SQL, which render through {@see SqlHighlighter::highlight()} with the same token spans as the db panel - * queries grid. A message {@see PrintRParser::parse()} reads as a `print_r()` dump renders as the collapsible - * {@see PrintRTreeRenderer} tree; a multi-line message {@see PhpExportDetector::detect()} reads as a `var_export()` - * value renders through {@see PhpHighlighter::highlightCode()} like the Request panel dumps; any other multi-line - * message renders in a `
` that preserves its line breaks and indentation, and a
-     * single-line message as escaped text. Long SQL, export, and text messages collapse behind the {@see CellMore}
-     * clamp; the tree collapses on its own. A non-empty context renders as a collapsed {@see Disclosure} holding a
-     * `
`: scalar values inline in ``, arrays as a `
` block.
+     * SQL renders highlighted, a `print_r()` or `var_export()` dump as a {@see DumpTreeRenderer} tree, and any other
+     * message as escaped text; the message is escaped once.
      *
-     * @param LogRow $row Typed log record.
      * @param Closure(array): string $traceLine Renders one backtrace frame as a link line.
      */
     public static function renderMessageCell(LogRow $row, Closure $traceLine): string
@@ -116,11 +104,11 @@ public static function renderMessageCell(LogRow $row, Closure $traceLine): strin
         $isSql = str_starts_with($row->category, self::SQL_CATEGORY_PREFIX)
             || SqlHighlighter::isStatement($row->message);
 
-        $tree = $isSql ? null : PrintRParser::parse($row->message);
+        $tree = $isSql ? null : self::parseTree($row->message);
 
         $body = $tree === null
             ? CellMore::clamp(self::renderMessageText($row->message, $isSql), $row->message)
-            : PrintRTreeRenderer::render($tree);
+            : DumpTreeRenderer::render($tree);
 
         if ($row->context !== []) {
             $body .= self::renderContext($row->context);
@@ -150,8 +138,6 @@ public static function renderTimeCell(LogRow $row): string
 
     /**
      * Renders the time-since-previous cell with the prev/next anchor navigation buttons.
-     *
-     * Disabled buttons replace the anchors when the row is the first or the last of the request.
      */
     public static function renderTimeSincePreviousCell(LogRow $row): string
     {
@@ -192,11 +178,27 @@ public static function renderTimeSincePreviousCell(LogRow $row): string
     }
 
     /**
-     * Renders the context disclosure: a summary counting the entries over a `
` of key/value pairs. + * Parses a multi-line message as a `print_r()` dump, then as a PHP value export, or returns `null`. + */ + private static function parseTree(string $message): DumpNode|null + { + if (strpbrk($message, "\r\n") === false) { + return null; + } + + $tree = PrintRParser::parse($message); + + if ($tree !== null) { + return $tree; + } + + return PhpExportParser::parse($message); + } + + /** + * Renders the context disclosure: a `
` of keys and their {@see DumpTreeRenderer} values. * * @param non-empty-array $context Normalized context of the row. - * - * @return string Collapsed disclosure markup. */ private static function renderContext(array $context): string { @@ -204,11 +206,7 @@ private static function renderContext(array $context): string foreach ($context as $key => $value) { $items[] = Dt::tag()->content((string) $key); - $items[] = Dd::tag()->html( - is_array($value) - ? Pre::tag()->content(Dump::asString($value)) - : Code::tag()->content(Dump::asString($value)), - ); + $items[] = Dd::tag()->html(DumpTreeRenderer::render(DumpNode::fromValue($value))); } return Disclosure::render( @@ -221,19 +219,8 @@ private static function renderContext(array $context): string } /** - * Renders the message body: highlighted SQL, a highlighted PHP value export, a `
` block preserving the layout of
-     * a multi-line message through {@see Text::preserveLineBreaks()}, or the escaped single-line text.
-     *
-     * A message is multi-line when it holds a line feed or a carriage return. The export renders in the short array
-     * syntax {@see PhpExportDetector::detect()} returns, inside the Request panel dump wrapper. Its line breaks, `\r\n`
-     * and a lone `\r` included, are written as `
` through {@see Text::preserveHtmlLineBreaks()} for the same reason
-     * as the text block: the enclosing block builders would otherwise collapse the blank lines of a multi-line string
-     * value.
-     *
-     * @param string $message Log message.
-     * @param bool $isSql Whether the message is a SQL statement.
-     *
-     * @return string Unclamped message markup.
+     * Renders the unclamped message body when no dump tree applies: highlighted SQL or PHP export, a `
` block, or
+     * escaped text.
      */
     private static function renderMessageText(string $message, bool $isSql): string
     {
@@ -264,8 +251,7 @@ private static function renderMessageText(string $message, bool $isSql): string
     }
 
     /**
-     * Renders one nav arrow as either a disabled `` when `$targetId` is `null`, or an `` linking to
-     * `#log-{targetId}` otherwise.
+     * Renders one nav arrow as an `` to `#log-{targetId}`, or a disabled `` when `$targetId` is `null`.
      */
     private static function renderNavButton(string $glyph, int|null $targetId): A|Span
     {
diff --git a/src/Panel/Log/LogMessage.php b/src/Panel/Log/LogMessage.php
index f0c0769..4fde609 100644
--- a/src/Panel/Log/LogMessage.php
+++ b/src/Panel/Log/LogMessage.php
@@ -101,6 +101,16 @@ enum LogMessage: string
      */
     case DUMP_RECURSION_TITLE = 'print_r() stopped here because the value contains itself';
 
+    /**
+     * Tooltip of a one-byte string in a dump tree.
+     */
+    case DUMP_STRING_BYTE = '1 byte';
+
+    /**
+     * `sprintf()` template of the tooltip of a string in a dump tree, naming its length in bytes.
+     */
+    case DUMP_STRING_BYTES = '%d bytes';
+
     /**
      * Explanation of the empty state, naming the target that feeds the panel.
      */
diff --git a/src/Panel/Log/PhpExportDetector.php b/src/Panel/Log/PhpExportDetector.php
index f055e65..407389c 100644
--- a/src/Panel/Log/PhpExportDetector.php
+++ b/src/Panel/Log/PhpExportDetector.php
@@ -4,149 +4,51 @@
 
 namespace PHPForge\Debug\Panel\Log;
 
-use ParseError;
 use PhpToken;
 
 use function array_pop;
-use function array_slice;
 use function count;
 use function end;
-use function preg_match;
-use function restore_error_handler;
-use function set_error_handler;
 use function str_repeat;
 use function strlen;
 use function strpbrk;
-use function trim;
 
 use const T_ARRAY;
-use const T_CONSTANT_ENCAPSED_STRING;
-use const T_DNUMBER;
 use const T_DOUBLE_ARROW;
-use const T_DOUBLE_COLON;
-use const T_LNUMBER;
-use const T_NAME_FULLY_QUALIFIED;
-use const T_OBJECT_CAST;
 use const T_RETURN;
-use const T_STRING;
 use const T_WHITESPACE;
-use const TOKEN_PARSE;
 
 /**
  * Detects a log message that is the `var_export()` or `VarDumper::export()` output of an array or object and returns it
  * in short array syntax.
  *
- * A message qualifies when, trimmed, it starts like an export (`array (`, `[`, `(object) array(`, or
- * `\::__set_state(`) and is exactly one syntactically valid PHP expression, within {@see PrintRParser::MAX_BYTES}
- * bytes, made only of the token kinds these exports print: arrays, casts to `object`, quoted strings without
- * interpolation, numbers, names, `::`, `=>`, `-`, `.`, `,`, and whitespace. Variables, interpolated strings, heredocs,
- * comments, closures, statements, and inline output are rejected. The check tokenizes the message with the PHP parser
- * and never evaluates it. Parser diagnostics are muted while it runs: a no-op error handler keeps a deprecation (such as
- * a `(boolean)` cast) away from the application's error handler, and the `@` operator keeps a compile warning (such as
- * an `"\400"` octal overflow), which no user handler can catch, out of the response.
- *
- * The returned source writes every `array(...)` as `[...]`, moves a value that `var_export()` prints on the line after
- * its `=>` up to the key, indents each line by four spaces per open bracket, and writes an empty array as `[]`. Tokens
- * keep their text, so string contents never change; a short-syntax export such as `VarDumper::export()` output keeps its
- * layout. More than {@see PrintRParser::MAX_DEPTH} nested arrays, or a result longer than {@see self::MAX_OUTPUT}
- * bytes, yields `null`.
- *
- * Usage example:
- * ```php
- * $code = PhpExportDetector::detect(var_export(['user' => ['id' => 7]], true));
- * // "[\n    'user' => [\n        'id' => 7,\n    ],\n]"
- * ```
+ * Never evaluates the message and never changes string contents; only the array syntax and indentation are rewritten.
  */
 final class PhpExportDetector
 {
-    /**
-     * Token id of `]`; a single-character token has the byte value of its character as id.
-     */
-    private const int CLOSE_BRACKET = 93;
-    /**
-     * Token id of `)`.
-     */
-    private const int CLOSE_PARENTHESIS = 41;
     /**
      * Indentation of one bracket level.
      */
     private const string INDENT = '    ';
     /**
-     * Maximum size of the returned source, in bytes: re-indentation may enlarge a deeply nested export.
+     * Maximum size of the returned source, in bytes.
      */
     private const int MAX_OUTPUT = 4 * PrintRParser::MAX_BYTES;
-    /**
-     * Token id of `[`.
-     */
-    private const int OPEN_BRACKET = 91;
-    /**
-     * Token id of `(`.
-     */
-    private const int OPEN_PARENTHESIS = 40;
-    /**
-     * Leading text of a PHP value export: an `array (` or short `[` array, a `stdClass` cast, or a `__set_state()` call.
-     */
-    private const string OPENER = '/^(?:array \(|\[|\(object\) array\(|\\\\[\w\\\\\x80-\xff]+::__set_state\()/';
-    /**
-     * Ids of the tokens a `var_export()` or `VarDumper::export()` value is made of: the four brackets, `,` (44), `-`
-     * (45), and `.` (46), which joins the parts of a binary string.
-     */
-    private const array TOKENS = [
-        self::CLOSE_BRACKET,
-        self::CLOSE_PARENTHESIS,
-        self::OPEN_BRACKET,
-        self::OPEN_PARENTHESIS,
-        44,
-        45,
-        46,
-        T_ARRAY,
-        T_CONSTANT_ENCAPSED_STRING,
-        T_DNUMBER,
-        T_DOUBLE_ARROW,
-        T_DOUBLE_COLON,
-        T_LNUMBER,
-        T_NAME_FULLY_QUALIFIED,
-        T_OBJECT_CAST,
-        T_STRING,
-        T_WHITESPACE,
-    ];
 
     /**
      * Returns a PHP value export in short array syntax.
      *
-     * @param string $message Log message to inspect.
-     *
-     * @return string|null Export source in short array syntax, or `null` when the message is not a single export
-     * expression within the size, depth, and output bounds.
+     * @return string|null Export source, or `null` when the message is not one export expression within the bounds.
      */
     public static function detect(string $message): string|null
     {
-        if (strlen($message) > PrintRParser::MAX_BYTES) {
-            return null;
-        }
-
-        $code = trim($message);
-
-        if (preg_match(self::OPENER, $code) !== 1) {
-            return null;
-        }
-
-        $tokens = self::tokenize($code);
+        $tokens = PhpExportTokenizer::tokenize($message);
 
         return $tokens === null ? null : self::shortArrays($tokens);
     }
 
     /**
-     * Lays out the whitespace between two tokens.
-     *
-     * Whitespace without a line break stays as is. A line break (`\n`, `\r\n`, or `\r`) after `=>` becomes one space, a
-     * line break inside an empty array disappears, and any other line break starts a line indented to the bracket
-     * depth, one level less before a closing bracket.
-     *
-     * @param string $space Whitespace text, or `''` when the tokens are adjacent.
-     * @param int $previous Id of the token before the whitespace; `[` for the `(` of an `array(`.
-     * @param bool $closes Whether the token after the whitespace closes an array.
-     * @param int $depth Number of arrays open before the token after the whitespace.
+     * Lays out the whitespace between two tokens, re-indenting line breaks to the bracket depth.
      */
     private static function layout(string $space, int $previous, bool $closes, int $depth): string
     {
@@ -159,23 +61,16 @@ private static function layout(string $space, int $previous, bool $closes, int $
         }
 
         if ($closes) {
-            return $previous === self::OPEN_BRACKET ? '' : "\n" . str_repeat(self::INDENT, $depth - 1);
+            return $previous === PhpExportTokenizer::OPEN_BRACKET ? '' : "\n" . str_repeat(self::INDENT, $depth - 1);
         }
 
         return "\n" . str_repeat(self::INDENT, $depth);
     }
 
     /**
-     * Rebuilds the expression from its tokens with `array(...)` written as `[...]`.
-     *
-     * Structure is read from token ids, never from token text. A stack holds one entry per open array, counting the
-     * other parentheses open inside it, so the `)` closing an `array(` is told from the one closing a call such as
-     * `__set_state(`; the depth is the size of that stack and never drops below zero.
+     * Rebuilds the expression with `array(...)` written as `[...]`, or returns `null` past a depth or size bound.
      *
-     * @param array $tokens Tokens of the expression, in source order.
-     *
-     * @return string|null Expression source in short array syntax, or `null` when it nests more than
-     * {@see PrintRParser::MAX_DEPTH} arrays or grows beyond {@see self::MAX_OUTPUT} bytes.
+     * @param array $tokens Expression tokens in source order.
      */
     private static function shortArrays(array $tokens): string|null
     {
@@ -192,24 +87,29 @@ private static function shortArrays(array $tokens): string|null
                 continue;
             }
 
-            $id = $keyword ? self::OPEN_BRACKET : $token->id;
+            $id = $keyword ? PhpExportTokenizer::OPEN_BRACKET : $token->id;
+
             $keyword = $id === T_ARRAY;
+
             $inner = end($arrays);
+
             $closes = $inner !== false
-                && ($id === self::CLOSE_BRACKET || ($id === self::CLOSE_PARENTHESIS && $inner === 0));
+                && ($id === PhpExportTokenizer::CLOSE_BRACKET || ($id === PhpExportTokenizer::CLOSE_PARENTHESIS && $inner === 0));
+
             $code .= self::layout($space, $previous, $closes, count($arrays));
+
             $previous = $id;
             $space = '';
 
             if ($closes) {
                 array_pop($arrays);
-            } elseif ($id === self::OPEN_BRACKET) {
+            } elseif ($id === PhpExportTokenizer::OPEN_BRACKET) {
                 $arrays[] = 0;
-            } elseif ($inner !== false && $id === self::OPEN_PARENTHESIS) {
+            } elseif ($inner !== false && $id === PhpExportTokenizer::OPEN_PARENTHESIS) {
                 array_pop($arrays);
 
                 $arrays[] = $inner + 1;
-            } elseif ($inner !== false && $id === self::CLOSE_PARENTHESIS) {
+            } elseif ($inner !== false && $id === PhpExportTokenizer::CLOSE_PARENTHESIS) {
                 array_pop($arrays);
 
                 $arrays[] = $inner - 1;
@@ -218,7 +118,7 @@ private static function shortArrays(array $tokens): string|null
             $code .= match (true) {
                 $keyword => '',
                 $closes => ']',
-                $id === self::OPEN_BRACKET => '[',
+                $id === PhpExportTokenizer::OPEN_BRACKET => '[',
                 default => $token->text,
             };
 
@@ -229,39 +129,4 @@ private static function shortArrays(array $tokens): string|null
 
         return $code;
     }
-
-    /**
-     * Tokenizes the source as the operand of a `return` statement.
-     *
-     * Every token between `return` and the appended `;` must be one {@see self::TOKENS} lists. The statement must end
-     * for the parse to succeed, and that list leaves out `;`, closing tags, and comments, so the appended `;` is the
-     * last token and the only terminator: a `;` or closing tag of the text, or a trailing comment swallowing the
-     * appended `;`, yields `null`. The text cannot smuggle further statements or inline output after the expression.
-     * The error handler is restored on every path.
-     *
-     * @return array|null Tokens of the expression alone, or `null` when the source is not exactly one export
-     * expression.
-     */
-    private static function tokenize(string $code): array|null
-    {
-        set_error_handler(static fn(): bool => true);
-
-        try {
-            $tokens = @PhpToken::tokenize("is(self::TOKENS) === false) {
-                return null;
-            }
-        }
-
-        return $tokens;
-    }
 }
diff --git a/src/Panel/Log/PhpExportParser.php b/src/Panel/Log/PhpExportParser.php
new file mode 100644
index 0000000..cf7148c
--- /dev/null
+++ b/src/Panel/Log/PhpExportParser.php
@@ -0,0 +1,310 @@
+ $tokens Export tokens, whitespace removed.
+     */
+    private function __construct(private readonly array $tokens)
+    {
+        $this->end = new PhpToken(T_WHITESPACE, '');
+    }
+
+    /**
+     * Parses a `var_export()` or `VarDumper::export()` value.
+     *
+     * @return DumpNode|null Root array or object block, or `null` for an unsupported message.
+     */
+    public static function parse(string $message): DumpNode|null
+    {
+        $tokens = PhpExportTokenizer::tokenize($message);
+
+        if ($tokens === null) {
+            return null;
+        }
+
+        $parser = new self(
+            array_values(array_filter($tokens, static fn(PhpToken $token): bool => $token->id !== T_WHITESPACE)),
+        );
+
+        $root = $parser->value(1);
+
+        return $parser->cursor === count($parser->tokens) ? $root : null;
+    }
+
+    /**
+     * Consumes the current token when it has the given id.
+     */
+    private function accept(int $id): bool
+    {
+        if ($this->token()->id !== $id) {
+            return false;
+        }
+
+        $this->cursor++;
+
+        return true;
+    }
+
+    /**
+     * Reads an `array(...)` or `[...]` array starting at the current token.
+     *
+     * @return list|null Entries in export order, or `null` when rejected.
+     */
+    private function block(int $depth): array|null
+    {
+        if ($depth > PrintRParser::MAX_DEPTH) {
+            return null;
+        }
+
+        if ($this->accept(T_ARRAY)) {
+            $this->cursor++;
+
+            $close = PhpExportTokenizer::CLOSE_PARENTHESIS;
+        } elseif ($this->accept(PhpExportTokenizer::OPEN_BRACKET)) {
+            $close = PhpExportTokenizer::CLOSE_BRACKET;
+        } else {
+            return null;
+        }
+
+        $entries = [];
+        $keyless = 0;
+
+        while ($this->token()->id !== $close) {
+            $key = $this->key();
+            $value = $this->value($depth + 1);
+
+            if ($value === null) {
+                return null;
+            }
+
+            $entries[] = new DumpEntry($key ?? (string) $keyless++, $value);
+
+            if ($this->accept(PhpExportTokenizer::COMMA) === false) {
+                break;
+            }
+        }
+
+        if ($this->accept($close) === false || ($keyless !== 0 && $keyless !== count($entries))) {
+            return null;
+        }
+
+        return $entries;
+    }
+
+    /**
+     * Decodes a single-quoted string or the `"\0"` literal, or returns `null` for any other token.
+     */
+    private static function decode(PhpToken $token): string|null
+    {
+        if ($token->text === self::NUL) {
+            return "\0";
+        }
+
+        return str_starts_with($token->text, "'")
+            ? strtr(substr($token->text, 1, -1), ['\\\\' => '\\', "\\'" => "'"])
+            : null;
+    }
+
+    /**
+     * Reads a string or integer key and its `=>`, or returns `null` for a keyless entry.
+     */
+    private function key(): string|null
+    {
+        $start = $this->cursor;
+        $key = $this->scalar();
+
+        if (
+            in_array($key?->kind, [DumpKind::STRING, DumpKind::INTEGER], true)
+            && $this->accept(T_DOUBLE_ARROW)
+        ) {
+            return $key->text;
+        }
+
+        $this->cursor = $start;
+
+        return null;
+    }
+
+    /**
+     * Returns the current token and moves past it.
+     */
+    private function next(): PhpToken
+    {
+        $token = $this->token();
+
+        $this->cursor++;
+
+        return $token;
+    }
+
+    /**
+     * Builds an array or object block from the entries {@see self::block()} read.
+     *
+     * @param list|null $entries Entries, or `null` when rejected.
+     */
+    private static function node(DumpKind $kind, string $label, array|null $entries): DumpNode|null
+    {
+        return $entries === null ? null : DumpNode::block($kind, $label, $entries);
+    }
+
+    /**
+     * Reads a `__set_state()` object or an enum case reference starting at its class name.
+     */
+    private function object(int $depth): DumpNode|null
+    {
+        $class = substr($this->next()->text, 1);
+
+        if ($this->accept(T_DOUBLE_COLON) === false) {
+            return null;
+        }
+
+        $name = $this->next()->text;
+
+        if ($this->accept(PhpExportTokenizer::OPEN_PARENTHESIS) === false) {
+            return DumpNode::enumCase($class, $name);
+        }
+
+        if ($name !== '__set_state') {
+            return null;
+        }
+
+        $entries = $this->block($depth);
+
+        return self::node(
+            DumpKind::OBJECT,
+            $class,
+            $this->accept(PhpExportTokenizer::CLOSE_PARENTHESIS) ? $entries : null,
+        );
+    }
+
+    /**
+     * Reads a string, a number, a boolean, or `null` starting at the current token.
+     */
+    private function scalar(): DumpNode|null
+    {
+        if ($this->token()->id === T_CONSTANT_ENCAPSED_STRING) {
+            return $this->string();
+        }
+
+        $negative = $this->accept(PhpExportTokenizer::MINUS);
+        $token = $this->next();
+        $text = $negative ? "-{$token->text}" : $token->text;
+
+        if ($token->id === T_LNUMBER) {
+            if ($negative && $this->token()->id === PhpExportTokenizer::MINUS && $this->token(1)->text === '1') {
+                $this->cursor += 2;
+                $text .= '-1';
+            }
+
+            return DumpNode::integer($text);
+        }
+
+        if ($token->id === T_DNUMBER || $token->text === 'INF' || ($negative === false && $token->text === 'NAN')) {
+            return DumpNode::float($text);
+        }
+
+        return match ($negative ? '' : strtolower($text)) {
+            'false', 'true' => DumpNode::boolean($text),
+            'null' => DumpNode::null($text),
+            default => null,
+        };
+    }
+
+    /**
+     * Reads a string literal and the literals joined to it by `.`, decoding their values.
+     */
+    private function string(): DumpNode|null
+    {
+        $value = '';
+
+        do {
+            $part = self::decode($this->next());
+
+            if ($part === null) {
+                return null;
+            }
+
+            $value .= $part;
+        } while ($this->accept(PhpExportTokenizer::DOT));
+
+        return DumpNode::string($value);
+    }
+
+    /**
+     * Returns the token at the given offset from the cursor, or {@see self::$end} past the last one.
+     */
+    private function token(int $offset = 0): PhpToken
+    {
+        return $this->tokens[$this->cursor + $offset] ?? $this->end;
+    }
+
+    /**
+     * Reads one value, counting it against {@see PrintRParser::MAX_NODES}.
+     */
+    private function value(int $depth): DumpNode|null
+    {
+        if (++$this->nodes > PrintRParser::MAX_NODES) {
+            return null;
+        }
+
+        if ($this->accept(T_OBJECT_CAST)) {
+            return self::node(DumpKind::OBJECT, 'stdClass', $this->block($depth));
+        }
+
+        return match ($this->token()->id) {
+            T_ARRAY, PhpExportTokenizer::OPEN_BRACKET => self::node(DumpKind::ARRAY, '', $this->block($depth)),
+            T_NAME_FULLY_QUALIFIED => $this->object($depth),
+            default => $this->scalar(),
+        };
+    }
+}
diff --git a/src/Panel/Log/PhpExportTokenizer.php b/src/Panel/Log/PhpExportTokenizer.php
new file mode 100644
index 0000000..54d074d
--- /dev/null
+++ b/src/Panel/Log/PhpExportTokenizer.php
@@ -0,0 +1,129 @@
+|null Expression tokens with whitespace, or `null` unless the message is one export
+     * expression within {@see PrintRParser::MAX_BYTES} bytes.
+     */
+    public static function tokenize(string $message): array|null
+    {
+        if (strlen($message) > PrintRParser::MAX_BYTES) {
+            return null;
+        }
+
+        $code = trim($message);
+
+        if (preg_match(self::OPENER, $code) !== 1) {
+            return null;
+        }
+
+        set_error_handler(static fn(): bool => true);
+
+        try {
+            $tokens = @PhpToken::tokenize("is(self::TOKENS) === false) {
+                return null;
+            }
+        }
+
+        return $tokens;
+    }
+}
diff --git a/src/Panel/Log/PrintRKind.php b/src/Panel/Log/PrintRKind.php
deleted file mode 100644
index f15d425..0000000
--- a/src/Panel/Log/PrintRKind.php
+++ /dev/null
@@ -1,36 +0,0 @@
- Enum` header, optionally suffixed with its backing type.
-     */
-    case ENUM;
-
-    /**
-     * Object block opened by a ` Object` header.
-     */
-    case OBJECT;
-
-    /**
-     * Array or object header followed by the `*RECURSION*` marker instead of a block.
-     */
-    case RECURSION;
-
-    /**
-     * Scalar text: a string, a number, a resource label, or the empty output of `''`, `null`, and `false`.
-     */
-    case SCALAR;
-}
diff --git a/src/Panel/Log/PrintRNode.php b/src/Panel/Log/PrintRNode.php
deleted file mode 100644
index d080865..0000000
--- a/src/Panel/Log/PrintRNode.php
+++ /dev/null
@@ -1,74 +0,0 @@
- $entries Entries of an array, object, or enum block.
-     */
-    private function __construct(
-        public PrintRKind $kind,
-        public string $label,
-        public string $text,
-        public array $entries,
-    ) {}
-
-    /**
-     * Creates an array, object, or enum block.
-     *
-     * @param PrintRKind $kind Block kind: {@see PrintRKind::ARRAY}, {@see PrintRKind::ENUM}, or
-     * {@see PrintRKind::OBJECT}.
-     * @param string $label Class name of an object or enum; `''` for an array.
-     * @param list $entries Entries in dump order.
-     * @param string $prefix Free text preceding the header of a root block, such as `Request:`.
-     *
-     * @return self Block node.
-     */
-    public static function block(PrintRKind $kind, string $label, array $entries, string $prefix = ''): self
-    {
-        return new self($kind, $label, $prefix, $entries);
-    }
-
-    /**
-     * Creates the marker `print_r()` prints instead of an array or object it is already printing.
-     *
-     * @param string $label Class name of a recursive object; `''` for a recursive array.
-     *
-     * @return self Recursion node.
-     */
-    public static function recursion(string $label): self
-    {
-        return new self(PrintRKind::RECURSION, $label, '', []);
-    }
-
-    /**
-     * Creates a scalar value.
-     *
-     * @param string $text Scalar text as printed, continuation lines of a multi-line string included.
-     *
-     * @return self Scalar node.
-     */
-    public static function scalar(string $text): self
-    {
-        return new self(PrintRKind::SCALAR, '', $text, []);
-    }
-}
diff --git a/src/Panel/Log/PrintRParser.php b/src/Panel/Log/PrintRParser.php
index 8b94392..f9edd9d 100644
--- a/src/Panel/Log/PrintRParser.php
+++ b/src/Panel/Log/PrintRParser.php
@@ -19,53 +19,39 @@
 use const PREG_UNMATCHED_AS_NULL;
 
 /**
- * Parses the output of `print_r($value, true)` for an array, object, or enum into a {@see PrintRNode} tree.
+ * Parses the output of `print_r($value, true)` for an array, object, or enum into a {@see DumpNode} tree.
  *
- * The parser follows the layout `print_r()` emits: a header line (`Array`, ` Object`, ` Enum`, or
- * ` Enum:`), a `(` line whose indentation plus four spaces is the indentation of the `[key] => value`
- * entries, and a `)` line at the indentation of `(`. Nested blocks are followed by one blank line, recursive values by a
- * ` *RECURSION*` line, and the lines of a multi-line string continue until the next entry or the closing `)` of the
- * block. Only the root header may carry free text before it, such as `Request: Array`; only trailing whitespace may
- * follow the root block.
- *
- * Any other text, a structural mismatch, or a dump beyond {@see self::MAX_BYTES} bytes, {@see self::MAX_DEPTH} nested
- * blocks, or {@see self::MAX_NODES} values yields `null`; the parser never throws.
- *
- * Usage example:
- * ```php
- * $node = PrintRParser::parse("Request: Array\n(\n    [id] => 7\n)\n");
- * // $node->kind === PrintRKind::ARRAY, $node->text === 'Request:', $node->entries[0]->key === 'id'
- * ```
+ * Only the root header may carry free text before it, such as `Request: Array`. Any other deviation from the
+ * `print_r()` layout, or an exceeded bound, yields `null`; the parser never throws.
  */
 final class PrintRParser
 {
     /**
-     * Maximum size of a parsed message, in bytes; {@see PhpExportDetector} applies the same bound.
+     * Maximum size of a parsed message, in bytes, shared with {@see PhpExportTokenizer}.
      */
     public const int MAX_BYTES = 262144;
     /**
-     * Maximum nesting level of blocks, the root block included; {@see PhpExportDetector} applies the same bound to
-     * nested arrays.
+     * Maximum nesting level of blocks, the root block included, shared with the PHP value export classes.
      */
     public const int MAX_DEPTH = 32;
+    /**
+     * Maximum number of values, the root block included, shared with {@see PhpExportParser}.
+     */
+    public const int MAX_NODES = 5000;
     /**
      * Separator between the key and the value of an entry line.
      */
     private const string ARROW = '] => ';
     /**
-     * Header of an array or object block, with the optional free text that may precede the root header.
+     * Block header, with the free text that may precede the root header.
      */
     private const string HEADER = '/^(.*\s)?(?:Array|(\S+) (Object|Enum)(?::int|:string)?)$/';
-    /**
-     * Maximum number of values, the root block included.
-     */
-    private const int MAX_NODES = 5000;
     /**
      * Line `print_r()` prints after the header of an array or object it is already printing.
      */
     private const string RECURSION = ' *RECURSION*';
     /**
-     * Property key of an object or enum block: name and either `protected` or the declaring class of a private property.
+     * Property key carrying `protected` or the declaring class of a private property.
      */
     private const string VISIBILITY = '/^([^:]*):(?:(protected)|(.+):private)$/';
 
@@ -79,19 +65,17 @@ final class PrintRParser
     private int $nodes = 1;
 
     /**
-     * @param list $lines Lines of the dump, trailing whitespace removed.
+     * @param list $lines Dump lines, trailing whitespace removed.
      */
     private function __construct(private readonly array $lines) {}
 
     /**
      * Parses a `print_r()` dump of an array, object, or enum.
      *
-     * @param string $message Log message to parse.
-     *
-     * @return PrintRNode|null Root block, with the free text preceding its header as {@see PrintRNode::$text}, or
-     * `null` when the message is not a complete dump within the bounds.
+     * @return DumpNode|null Root block, with the free text preceding its header as {@see DumpNode::$text}, or `null`
+     * for an unsupported message.
      */
-    public static function parse(string $message): PrintRNode|null
+    public static function parse(string $message): DumpNode|null
     {
         if (strlen($message) > self::MAX_BYTES) {
             return null;
@@ -111,17 +95,13 @@ public static function parse(string $message): PrintRNode|null
 
         return $entries === null || $parser->cursor !== count($lines)
             ? null
-            : PrintRNode::block($kind, $label, $entries, $prefix);
+            : DumpNode::block($kind, $label, $entries, $prefix);
     }
 
     /**
      * Reads the entries of the block whose `(` line is the current line, up to and including its `)` line.
      *
-     * @param int $indent Indentation of the `(` and `)` lines.
-     * @param bool $visibility Whether the keys are property names that may carry a visibility.
-     * @param int $depth Nesting level of the block, the root block being `1`.
-     *
-     * @return list|null Entries in dump order, or `null` on a structural mismatch or an exceeded bound.
+     * @return list|null Entries in dump order, or `null` on a mismatch or an exceeded bound.
      */
     private function block(int $indent, bool $visibility, int $depth): array|null
     {
@@ -162,33 +142,29 @@ private function block(int $indent, bool $visibility, int $depth): array|null
     /**
      * Builds an entry, splitting the visibility out of a property key when the block's keys may carry one.
      */
-    private static function entry(string $key, PrintRNode $value, bool $visibility): PrintREntry
+    private static function entry(string $key, DumpNode $value, bool $visibility): DumpEntry
     {
         if ($visibility && preg_match(self::VISIBILITY, $key, $matches, PREG_UNMATCHED_AS_NULL) === 1) {
             return $matches[2] === null
-                ? new PrintREntry($matches[1], $value, 'private', (string) $matches[3])
-                : new PrintREntry($matches[1], $value, 'protected');
+                ? new DumpEntry($matches[1], $value, 'private', (string) $matches[3])
+                : new DumpEntry($matches[1], $value, 'protected');
         }
 
-        return new PrintREntry($key, $value);
+        return new DumpEntry($key, $value);
     }
 
     /**
-     * Whether the keys of a block are property names to which `print_r()` appends a visibility.
-     *
-     * Array keys never carry one. A `stdClass` object declares no property, so every key is a dynamic property name
-     * kept verbatim, even one such as `status:protected`.
+     * Whether the keys of a block may carry a visibility; array and `stdClass` keys never do.
      */
-    private static function hasVisibility(PrintRKind $kind, string $label): bool
+    private static function hasVisibility(DumpKind $kind, string $label): bool
     {
-        return $kind !== PrintRKind::ARRAY && $label !== stdClass::class;
+        return $kind !== DumpKind::ARRAY && $label !== stdClass::class;
     }
 
     /**
      * Reads a block header.
      *
-     * @return array{string, PrintRKind, string}|null Free text preceding the header (right-trimmed), block kind, and
-     * class name, or `null` when the text is not a header.
+     * @return array{string, DumpKind, string}|null Prefix, kind, and class name, or `null` for a non-header text.
      */
     private static function header(string $text): array|null
     {
@@ -197,9 +173,9 @@ private static function header(string $text): array|null
         }
 
         $kind = match ($matches[3]) {
-            null => PrintRKind::ARRAY,
-            'Enum' => PrintRKind::ENUM,
-            default => PrintRKind::OBJECT,
+            null => DumpKind::ARRAY,
+            'Enum' => DumpKind::ENUM,
+            default => DumpKind::OBJECT,
         };
 
         return [rtrim((string) $matches[1]), $kind, (string) $matches[2]];
@@ -214,9 +190,9 @@ private function opens(int $indent): bool
     }
 
     /**
-     * Splits an entry line at the given indentation into its key and the first line of its value.
+     * Splits an entry line into its key and the first line of its value.
      *
-     * @return array{string, string}|null Key and value text, or `null` when the line is not an entry line.
+     * @return array{string, string}|null Key and value text, or `null` for a non-entry line.
      */
     private static function split(string $line, string $start): array|null
     {
@@ -232,20 +208,9 @@ private static function split(string $line, string $start): array|null
     }
 
     /**
-     * Reads the value of an entry whose line has just been consumed.
-     *
-     * A header followed by the recursion marker or by a `(` line at the child indentation opens a nested value; any
-     * other text is a scalar that absorbs the following lines up to the next entry or the closing line of the block.
-     *
-     * @param string $text Value text on the entry line.
-     * @param int $indent Indentation of a nested block's `(` line.
-     * @param string $close Closing line of the enclosing block.
-     * @param string $start Leading text of an entry line of the enclosing block.
-     * @param int $depth Nesting level of the enclosing block.
-     *
-     * @return PrintRNode|null Value node, or `null` when a nested block is malformed or exceeds a bound.
+     * Reads the nested block, recursion marker, or multi-line scalar of the entry whose line was just consumed.
      */
-    private function value(string $text, int $indent, string $close, string $start, int $depth): PrintRNode|null
+    private function value(string $text, int $indent, string $close, string $start, int $depth): DumpNode|null
     {
         $header = self::header($text);
 
@@ -253,7 +218,7 @@ private function value(string $text, int $indent, string $close, string $start,
             if (($this->lines[$this->cursor] ?? '') === self::RECURSION) {
                 $this->cursor++;
 
-                return PrintRNode::recursion($header[2]);
+                return DumpNode::recursion($header[2]);
             }
 
             if ($this->opens($indent)) {
@@ -265,7 +230,7 @@ private function value(string $text, int $indent, string $close, string $start,
 
                 $this->cursor++;
 
-                return PrintRNode::block($header[1], $header[2], $entries);
+                return DumpNode::block($header[1], $header[2], $entries);
             }
         }
 
@@ -274,6 +239,6 @@ private function value(string $text, int $indent, string $close, string $start,
             $this->cursor++;
         }
 
-        return PrintRNode::scalar($text);
+        return DumpNode::scalar($text);
     }
 }
diff --git a/src/Panel/Log/PrintRTreeRenderer.php b/src/Panel/Log/PrintRTreeRenderer.php
deleted file mode 100644
index 040c708..0000000
--- a/src/Panel/Log/PrintRTreeRenderer.php
+++ /dev/null
@@ -1,202 +0,0 @@
-`; nested non-empty blocks render as collapsed `
`, and - * scalars, recursion markers, and empty blocks as flat rows. Every key, value, class name, and text is escaped once. - * - * Usage example: - * ```php - * $node = PrintRParser::parse($row->message); - * - * $html = $node === null ? Encode::content($row->message) : PrintRTreeRenderer::render($node); - * ``` - */ -final class PrintRTreeRenderer -{ - /** - * Renders the root block of a dump, preceded by the free text found before its header. - * - * @param PrintRNode $root Root block returned by {@see PrintRParser::parse()}. - * - * @return string Open `
` markup of the tree. - */ - public static function render(PrintRNode $root): string - { - $head = self::head($root); - - if ($root->text !== '') { - $head = [self::span('yii-debug-log-dump-prefix', $root->text), ...$head]; - } - - return Details::tag() - ->class('yii-debug-log-dump') - ->html(self::summary($head), self::entries($root)) - ->open(true) - ->render(); - } - - /** - * Renders the entry list of a block. - */ - private static function entries(PrintRNode $block): Div - { - return Div::tag() - ->class('yii-debug-log-dump-entries') - ->html(...array_map(self::entry(...), $block->entries)); - } - - /** - * Renders one entry: a flat row for a scalar, a recursion marker, or an empty block, and a collapsed `
` - * for a block with entries. - */ - private static function entry(PrintREntry $entry): Details|Div - { - $key = [self::span('yii-debug-log-dump-key', $entry->key), ...self::visibility($entry)]; - $value = $entry->value; - - if ($value->kind === PrintRKind::SCALAR) { - return self::row([...$key, self::scalar($value->text)]); - } - - $head = [...$key, ...self::head($value)]; - - if ($value->entries === []) { - return self::row($head); - } - - return Details::tag() - ->class('yii-debug-log-dump-node') - ->html(self::summary($head), self::entries($value)); - } - - /** - * Renders the description of a block or recursion marker: class label, kind chip, and either the entry count or - * the recursion marker. - * - * @return list Rendered parts in display order. - */ - private static function head(PrintRNode $node): array - { - $head = $node->label === '' ? [] : [Fqcn::renderLabel($node->label)]; - - $head[] = self::span( - 'yii-debug-log-dump-kind', - $node->kind === PrintRKind::ENUM - ? LogMessage::DUMP_KIND_ENUM->value - : ($node->label === '' ? LogMessage::DUMP_KIND_ARRAY->value : LogMessage::DUMP_KIND_OBJECT->value), - ); - - if ($node->kind === PrintRKind::RECURSION) { - $head[] = self::span( - 'yii-debug-log-dump-recursion', - LogMessage::DUMP_RECURSION->value, - LogMessage::DUMP_RECURSION_TITLE->value, - ); - - return $head; - } - - $count = count($node->entries); - - $head[] = self::span( - 'yii-debug-log-dump-count', - $count === 1 ? LogMessage::DUMP_ENTRY->value : sprintf(LogMessage::DUMP_ENTRIES->value, $count), - ); - - return $head; - } - - /** - * Renders a flat entry row. - * - * @param list $parts Rendered parts in display order. - */ - private static function row(array $parts): Div - { - return Div::tag() - ->class('yii-debug-log-dump-row') - ->html(...$parts); - } - - /** - * Renders a scalar value with its line breaks kept through {@see Text::preserveLineBreaks()}, or the empty marker - * when `print_r()` printed nothing. - */ - private static function scalar(string $text): Span - { - return $text === '' - ? self::span('yii-debug-log-dump-empty', LogMessage::DUMP_EMPTY->value, LogMessage::DUMP_EMPTY_TITLE->value) - : Span::tag() - ->class('yii-debug-log-dump-value') - ->html(Text::preserveLineBreaks($text)); - } - - /** - * Renders a `` of the tree vocabulary with escaped content and an optional tooltip. - * - * @param string $class Class of the `yii-debug-log-dump-*` vocabulary. - * @param string $content Text content. - * @param string $title Tooltip, or `''` to omit the attribute. - */ - private static function span(string $class, string $content, string $title = ''): Span - { - $span = Span::tag() - ->class($class) - ->content($content); - - return $title === '' ? $span : $span->title($title); - } - - /** - * Renders the `` of a block. - * - * @param list $parts Rendered parts in display order. - */ - private static function summary(array $parts): Summary - { - return Summary::tag() - ->class('yii-debug-log-dump-summary') - ->html(...$parts); - } - - /** - * Renders the visibility chip of a protected or private property, naming the declaring class of the latter. - * - * @return list Chip, or an empty list for a public property or an array key. - */ - private static function visibility(PrintREntry $entry): array - { - return match ($entry->visibility) { - 'private' => [ - self::span( - 'yii-debug-log-dump-visibility', - LogMessage::DUMP_PRIVATE->value, - sprintf(LogMessage::DUMP_PRIVATE_TITLE->value, $entry->declaringClass), - ), - ], - 'protected' => [ - self::span( - 'yii-debug-log-dump-visibility', - LogMessage::DUMP_PROTECTED->value, - LogMessage::DUMP_PROTECTED_TITLE->value, - ), - ], - default => [], - }; - } -} diff --git a/tests/Panel/Log/DumpNodeTest.php b/tests/Panel/Log/DumpNodeTest.php new file mode 100644 index 0000000..ace9a8d --- /dev/null +++ b/tests/Panel/Log/DumpNodeTest.php @@ -0,0 +1,30 @@ + user
- 7 + 7
@@ -339,24 +340,29 @@ public function testRenderMessageCellRendersContextDisclosureBetweenMessageAndTr
test
- 1 + 1
<k>
- 'a\'<b>&' + "a'<b>&"
none
- null + NULL
roles
-
-            [
-                0 => 'admin'
-                1 => '<editor>'
-            ]
-            
+
+ + array2 entries +
+
+ 0"admin" +
+ 1"<editor>" +
+
+
@@ -367,7 +373,7 @@ public function testRenderMessageCellRendersContextDisclosureBetweenMessageAndTr HTML, $html, - 'Context must render once-escaped between the message and the trace list.', + 'Context must render as typed values and trees, once-escaped, between the message and the trace list.', ); } diff --git a/tests/Panel/Log/PhpExportParserTest.php b/tests/Panel/Log/PhpExportParserTest.php new file mode 100644 index 0000000..0d94522 --- /dev/null +++ b/tests/Panel/Log/PhpExportParserTest.php @@ -0,0 +1,151 @@ + ", 31) . '(object) array()' . str_repeat('))', 31), + ), + 'Thirty-two nested objects must parse.', + ); + } + + public function testParseAcceptsValueCountAtNodeLimit(): void + { + $entries = PhpExportParser::parse(var_export(range(1, 4999), true))->entries ?? []; + + self::assertCount( + 4999, + $entries, + 'Root block plus 4999 entries must parse.', + ); + self::assertEquals( + new DumpEntry('4998', DumpNode::integer('4999')), + $entries[4998] ?? null, + 'Last entry must keep its key and value.', + ); + } + + #[DataProviderExternal(PhpExportParserProvider::class, 'exports')] + public function testParseBuildsTypedTreeFromExport(string $message, DumpNode $expected): void + { + self::assertEquals( + $expected, + PhpExportParser::parse($message), + 'Tree must mirror every block, key, type, and value of the export.', + ); + } + + public function testParseReturnsNullForMessageOverByteLimit(): void + { + $message = "[\n '" . str_repeat('a', 262134) . "',\n]"; + + self::assertSame( + 262145, + strlen($message), + 'Fixture must be one byte over the limit.', + ); + self::assertNull( + PhpExportParser::parse($message), + 'Message over the byte limit must not parse.', + ); + } + + #[DataProviderExternal(PhpExportParserProvider::class, 'rejected')] + public function testParseReturnsNullForMessageThatIsNotOneSupportedExport(string $message): void + { + self::assertNull( + PhpExportParser::parse($message), + 'Unsupported export must fall back to `null`.', + ); + } + + public function testParseReturnsNullForNestingOverDepthLimit(): void + { + self::assertNull( + PhpExportParser::parse(str_repeat('[', 33) . str_repeat(']', 33)), + 'Thirty-three nested arrays must not parse.', + ); + } + + public function testParseReturnsNullForObjectNestingOverDepthLimit(): void + { + self::assertNull( + PhpExportParser::parse( + str_repeat("\\App\\Node::__set_state(array('n' => ", 32) . '(object) array()' . str_repeat('))', 32), + ), + 'Thirty-three nested objects must not parse.', + ); + } + + public function testParseReturnsNullForValueCountOverNodeLimit(): void + { + self::assertNull( + PhpExportParser::parse(var_export(range(1, 5000), true)), + 'Root block plus 5000 entries must not parse.', + ); + } +} diff --git a/tests/Panel/Log/PrintRParserTest.php b/tests/Panel/Log/PrintRParserTest.php index 57097ae..6018643 100644 --- a/tests/Panel/Log/PrintRParserTest.php +++ b/tests/Panel/Log/PrintRParserTest.php @@ -4,7 +4,7 @@ namespace PHPForge\Debug\Tests\Panel\Log; -use PHPForge\Debug\Panel\Log\{PrintREntry, PrintRKind, PrintRNode, PrintRParser}; +use PHPForge\Debug\Panel\Log\{DumpEntry, DumpKind, DumpNode, PrintRParser}; use PHPForge\Debug\Tests\Provider\PrintRParserProvider; use PHPForge\Debug\Tests\Support\PrintR\PrintRFixture; use PHPUnit\Framework\Attributes\{DataProviderExternal, Group}; @@ -33,10 +33,10 @@ public function testParseAcceptsMessageAtByteLimit(): void 'Fixture must be exactly at the byte limit.', ); self::assertEquals( - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', - [new PrintREntry('k', PrintRNode::scalar(str_repeat('a', 262144 - 22)))], + [new DumpEntry('k', DumpNode::scalar(str_repeat('a', 262144 - 22)))], ), PrintRParser::parse($message), 'Message at the byte limit must parse.', @@ -45,10 +45,10 @@ public function testParseAcceptsMessageAtByteLimit(): void public function testParseAcceptsNestingAtDepthLimit(): void { - $expected = PrintRNode::block(PrintRKind::ARRAY, '', []); + $expected = DumpNode::block(DumpKind::ARRAY, '', []); for ($level = 1; $level < 32; $level++) { - $expected = PrintRNode::block(PrintRKind::ARRAY, '', [new PrintREntry('n', $expected)]); + $expected = DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('n', $expected)]); } self::assertEquals( @@ -68,14 +68,14 @@ public function testParseAcceptsValueCountAtNodeLimit(): void 'Root block plus 4999 entries must parse.', ); self::assertEquals( - new PrintREntry('4998', PrintRNode::scalar('4999')), + new DumpEntry('4998', DumpNode::scalar('4999')), $entries[4998] ?? null, 'Last entry must keep its key and value.', ); } #[DataProviderExternal(PrintRParserProvider::class, 'dumps')] - public function testParseBuildsTreeFromDump(string $message, PrintRNode $expected): void + public function testParseBuildsTreeFromDump(string $message, DumpNode $expected): void { self::assertEquals( $expected, diff --git a/tests/Panel/Log/PrintRTreeRendererTest.php b/tests/Panel/Log/PrintRTreeRendererTest.php deleted file mode 100644 index 866610e..0000000 --- a/tests/Panel/Log/PrintRTreeRendererTest.php +++ /dev/null @@ -1,31 +0,0 @@ - + */ + public static function values(): iterable + { + yield 'string' => [ + "a'\n", + DumpNode::string("a'\n"), + ]; + yield 'empty string' => [ + '', + DumpNode::string(''), + ]; + yield 'integer' => [ + 42, + DumpNode::integer('42'), + ]; + yield 'integer minimum' => [ + PHP_INT_MIN, + DumpNode::integer('-9223372036854775807-1'), + ]; + yield 'float with zero fraction' => [ + 1.0, + DumpNode::float('1.0'), + ]; + yield 'float' => [ + -0.5, + DumpNode::float('-0.5'), + ]; + yield 'true' => [ + true, + DumpNode::boolean('true'), + ]; + yield 'false' => [ + false, + DumpNode::boolean('false'), + ]; + yield 'null' => [ + null, + DumpNode::null('NULL'), + ]; + yield 'empty array' => [ + [], + DumpNode::block(DumpKind::ARRAY, '', []), + ]; + yield 'nested arrays' => [ + ['user' => ['id' => 7, 'roles' => ['admin']], 3 => null], + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry( + 'user', + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('id', DumpNode::integer('7')), + new DumpEntry( + 'roles', + DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('0', DumpNode::string('admin'))]), + ), + ], + ), + ), + new DumpEntry('3', DumpNode::null('NULL')), + ], + ), + ]; + yield 'value outside the normalized types' => [ + new stdClass(), + DumpNode::scalar('{stdClass}'), + ]; + } +} diff --git a/tests/Provider/DumpTreeRendererProvider.php b/tests/Provider/DumpTreeRendererProvider.php new file mode 100644 index 0000000..a4dc9c6 --- /dev/null +++ b/tests/Provider/DumpTreeRendererProvider.php @@ -0,0 +1,389 @@ + + */ + public static function expansion(): iterable + { + $row = <<<'HTML' +
+ k1 +
+ HTML; + $rows = str_repeat($row, 199); + + yield 'root open at 200 values' => [ + DumpNode::block(DumpKind::ARRAY, '', array_fill(0, 199, new DumpEntry('k', DumpNode::integer('1')))), + << + + array199 entries +
+ {$rows} +
+
+ HTML, + ]; + yield 'root collapsed at 201 values' => [ + DumpNode::block(DumpKind::ARRAY, '', array_fill(0, 200, new DumpEntry('k', DumpNode::integer('1')))), + << + + array200 entries +
+ {$rows}{$row} +
+ + HTML, + ]; + yield 'root collapsed at 201 values counting nested ones' => [ + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry( + 'n', + DumpNode::block(DumpKind::ARRAY, '', array_fill(0, 199, new DumpEntry('k', DumpNode::integer('1')))), + ), + ], + ), + << + + array1 entry +
+
+ + narray199 entries +
+ {$rows} +
+
+
+ + HTML, + ]; + } + + /** + * @return iterable + */ + public static function roots(): iterable + { + yield 'string' => [ + DumpNode::string("a\"\n"), + <<<'HTML' + "a"<b> " + HTML, + ]; + yield 'integer' => [ + DumpNode::integer('7'), + <<<'HTML' + 7 + HTML, + ]; + yield 'float' => [ + DumpNode::float('-INF'), + <<<'HTML' + -INF + HTML, + ]; + yield 'boolean' => [ + DumpNode::boolean('false'), + <<<'HTML' + false + HTML, + ]; + yield 'null' => [ + DumpNode::null('NULL'), + <<<'HTML' + NULL + HTML, + ]; + yield 'untyped scalar' => [ + DumpNode::scalar('<7>'), + <<<'HTML' + <7> + HTML, + ]; + yield 'empty untyped scalar' => [ + DumpNode::scalar(''), + <<<'HTML' + empty + HTML, + ]; + yield 'enum case' => [ + DumpNode::enumCase('App\Suit', 'Hearts'), + <<<'HTML' + App\SuitenumHearts + HTML, + ]; + yield 'recursion marker' => [ + DumpNode::recursion(''), + <<<'HTML' + arrayrecursion + HTML, + ]; + } + + /** + * @return iterable + */ + public static function trees(): iterable + { + yield 'array with one entry' => [ + DumpNode::block( + DumpKind::ARRAY, + '', + [new DumpEntry('id', DumpNode::scalar('7'))], + ), + <<<'HTML' +
+ + array1 entry +
+
+ id7 +
+
+
+ HTML, + ]; + yield 'empty root array' => [ + DumpNode::block( + DumpKind::ARRAY, + '', + [], + ), + <<<'HTML' +
+ + array0 entries +
+
+
+ HTML, + ]; + yield 'escaped texts' => [ + DumpNode::block( + DumpKind::OBJECT, + 'App\', + [new DumpEntry('', DumpNode::scalar("',\n)", 'app', <<<'HTML' -
-
[
    'x' => '</pre><script>alert(1)</script>',
]
+
+ + array1 entry +
+
+ x"</pre><script>alert(1)</script>" +
+
HTML, ]; yield 'var_export string with a blank line' => [ var_export(['t' => "a\n\nb"], true), 'app', <<<'HTML' -
-
[
    't' => 'a

b',
]
+
+ + array1 entry +
+
+ t"a b" +
+
HTML, ]; yield 'var_export string with Windows line breaks' => [ var_export(['t' => "a\r\nb"], true), 'app', <<<'HTML' -
-
[
    't' => 'a
b',
]
+
+ + array1 entry +
+
+ t"a b"
+
+
HTML, ]; yield 'export with carriage return line breaks' => [ "array (\r 'id' => 7,\r)", 'app', <<<'HTML' +
+ + array1 entry +
+
+ id7 +
+
+
+ HTML, + ]; + yield 'VarDumper::export() keyless list' => [ + "[\n 'list' => [\n 1,\n null,\n ],\n]", + 'app', + <<<'HTML' +
+ + array1 entry +
+
+ + listarray2 entries +
+
+ 01 +
+ 1null +
+
+
+
+
+ HTML, + ]; + yield 'export with a double-quoted string' => [ + "[\n \"a\",\n]", + 'app', + <<<'HTML' +
+
[
    "a",
]
+
+ HTML, + ]; + yield 'VarDumper::export() object' => [ + "[\n 'o' => unserialize('O:8:\"stdClass\":0:{}'),\n]", + 'app', + <<<'HTML'
-
[
    'id' => 7,
]
+
[
    'o' => unserialize('O:8:"stdClass":0:{}'),
]
HTML, ]; @@ -167,10 +238,25 @@ public static function messageBodies(): iterable var_export(['k' => $longValue], true), 'app', << + + array1 entry +
+
+ k"{$longValue}" +
+
+ + HTML, + ]; + yield 'highlighted export over the clamp threshold' => [ + "[\n \"{$longValue}\",\n]", + 'app', + <<
-
[
    'k' => '{$longValue}',
]
+
[
    "{$longValue}",
]
diff --git a/tests/Provider/LogMessageProvider.php b/tests/Provider/LogMessageProvider.php index cef307e..037d811 100644 --- a/tests/Provider/LogMessageProvider.php +++ b/tests/Provider/LogMessageProvider.php @@ -89,6 +89,14 @@ public static function messages(): iterable LogMessage::DUMP_RECURSION_TITLE, 'print_r() stopped here because the value contains itself', ]; + yield 'dump_string_byte' => [ + LogMessage::DUMP_STRING_BYTE, + '1 byte', + ]; + yield 'dump_string_bytes' => [ + LogMessage::DUMP_STRING_BYTES, + '%d bytes', + ]; yield 'empty_explanation' => [ LogMessage::EMPTY_EXPLANATION, 'This request did not emit log messages through the debug log target.', diff --git a/tests/Provider/PhpExportParserProvider.php b/tests/Provider/PhpExportParserProvider.php new file mode 100644 index 0000000..60012fe --- /dev/null +++ b/tests/Provider/PhpExportParserProvider.php @@ -0,0 +1,352 @@ + + */ + public static function exports(): iterable + { + $suit = DumpNode::enumCase(PrintRSuit::class, 'HEARTS'); + $roles = DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('0', DumpNode::string('admin')), + new DumpEntry('1', DumpNode::string('editor')), + ], + ); + + yield 'nested arrays' => [ + var_export(['user' => ['id' => 42, 'roles' => ['admin', 'editor']], 'empty' => []], true), + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry( + 'user', + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('id', DumpNode::integer('42')), + new DumpEntry('roles', $roles), + ], + ), + ), + new DumpEntry('empty', DumpNode::block(DumpKind::ARRAY, '', [])), + ], + ), + ]; + yield 'empty root array' => [ + var_export([], true), + DumpNode::block(DumpKind::ARRAY, '', []), + ]; + yield 'object with nested array and enum case' => [ + var_export(new ExportedPoint(), true), + DumpNode::block( + DumpKind::OBJECT, + ExportedPoint::class, + [ + new DumpEntry('empty', DumpNode::block(DumpKind::ARRAY, '', [])), + new DumpEntry('suit', $suit), + new DumpEntry('tags', DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('roles', $roles)])), + new DumpEntry('x', DumpNode::integer('1')), + ], + ), + ]; + yield 'object with protected, private, and inherited properties' => [ + var_export(new PrintRChild(), true), + DumpNode::block( + DumpKind::OBJECT, + PrintRChild::class, + [ + new DumpEntry('role', DumpNode::string('admin')), + new DumpEntry('secret', DumpNode::string('parent')), + new DumpEntry('empty', DumpNode::string('')), + new DumpEntry('flag', DumpNode::boolean('false')), + new DumpEntry('name', DumpNode::string('Ada')), + new DumpEntry('self', DumpNode::null('NULL')), + new DumpEntry('suit', $suit), + new DumpEntry( + 'tags', + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('0', DumpNode::string('a')), + new DumpEntry('1', DumpNode::string('b')), + ], + ), + ), + new DumpEntry('parent', DumpNode::null('NULL')), + new DumpEntry('secret', DumpNode::string('child')), + ], + ), + ]; + yield 'object nested in an array' => [ + var_export(['point' => new ExportedPoint()], true), + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry( + 'point', + DumpNode::block( + DumpKind::OBJECT, + ExportedPoint::class, + [ + new DumpEntry('empty', DumpNode::block(DumpKind::ARRAY, '', [])), + new DumpEntry('suit', $suit), + new DumpEntry( + 'tags', + DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('roles', $roles)]), + ), + new DumpEntry('x', DumpNode::integer('1')), + ], + ), + ), + ], + ), + ]; + yield 'stdClass' => [ + var_export((object) ['k' => 'v', 'inner' => (object) [], 'list' => [1]], true), + DumpNode::block( + DumpKind::OBJECT, + 'stdClass', + [ + new DumpEntry('k', DumpNode::string('v')), + new DumpEntry('inner', DumpNode::block(DumpKind::OBJECT, 'stdClass', [])), + new DumpEntry('list', DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('0', DumpNode::integer('1'))])), + ], + ), + ]; + yield 'pure and backed enum cases' => [ + var_export([PrintRToggle::ON, PrintRSuit::HEARTS, PrintRPriority::HIGH], true), + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('0', DumpNode::enumCase(PrintRToggle::class, 'ON')), + new DumpEntry('1', $suit), + new DumpEntry('2', DumpNode::enumCase(PrintRPriority::class, 'HIGH')), + ], + ), + ]; + yield 'strings' => [ + var_export( + [ + 'quote' => "it's", + 'backslash' => 'a\\b', + 'trailing backslash' => '\\', + 'escape-like' => '\\n', + 'NUL' => "a\0b\0", + 'line breaks' => "a\r\nb\n\nc", + 'empty' => '', + 'markup' => '&', + "key\0with NUL" => 1, + ], + true, + ), + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('quote', DumpNode::string("it's")), + new DumpEntry('backslash', DumpNode::string('a\\b')), + new DumpEntry('trailing backslash', DumpNode::string('\\')), + new DumpEntry('escape-like', DumpNode::string('\\n')), + new DumpEntry('NUL', DumpNode::string("a\0b\0")), + new DumpEntry('line breaks', DumpNode::string("a\r\nb\n\nc")), + new DumpEntry('empty', DumpNode::string('')), + new DumpEntry('markup', DumpNode::string('&')), + new DumpEntry("key\0with NUL", DumpNode::integer('1')), + ], + ), + ]; + yield 'numbers' => [ + var_export( + [-5 => PHP_INT_MIN, 'int' => -1, 'zero' => 0, 'f' => 1.0, 'e' => 1.0E+25, 'neg' => -1.5, 'nz' => -0.0], + true, + ), + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('-5', DumpNode::integer('-9223372036854775807-1')), + new DumpEntry('int', DumpNode::integer('-1')), + new DumpEntry('zero', DumpNode::integer('0')), + new DumpEntry('f', DumpNode::float('1.0')), + new DumpEntry('e', DumpNode::float('1.0E+25')), + new DumpEntry('neg', DumpNode::float('-1.5')), + new DumpEntry('nz', DumpNode::float('-0.0')), + ], + ), + ]; + yield 'special floats' => [ + var_export([NAN, INF, -INF], true), + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('0', DumpNode::float('NAN')), + new DumpEntry('1', DumpNode::float('INF')), + new DumpEntry('2', DumpNode::float('-INF')), + ], + ), + ]; + yield 'booleans and null' => [ + var_export(['t' => true, 'f' => false, 'n' => null], true), + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('t', DumpNode::boolean('true')), + new DumpEntry('f', DumpNode::boolean('false')), + new DumpEntry('n', DumpNode::null('NULL')), + ], + ), + ]; + yield 'constants in any letter case' => [ + "[\n TRUE,\n False,\n Null,\n]", + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('0', DumpNode::boolean('TRUE')), + new DumpEntry('1', DumpNode::boolean('False')), + new DumpEntry('2', DumpNode::null('Null')), + ], + ), + ]; + yield 'VarDumper::export() keyless lists and lowercase null' => [ + <<<'PHP' + [ + 'list' => [ + 1, + 'two', + null, + false, + [], + ], + 'map' => [ + 'k' => 1.5, + 'n' => 'a' . "\0" . '', + ], + ] + PHP, + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry( + 'list', + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('0', DumpNode::integer('1')), + new DumpEntry('1', DumpNode::string('two')), + new DumpEntry('2', DumpNode::null('null')), + new DumpEntry('3', DumpNode::boolean('false')), + new DumpEntry('4', DumpNode::block(DumpKind::ARRAY, '', [])), + ], + ), + ), + new DumpEntry( + 'map', + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('k', DumpNode::float('1.5')), + new DumpEntry('n', DumpNode::string("a\0")), + ], + ), + ), + ], + ), + ]; + yield 'last entry without a trailing comma' => [ + "[\n 1,\n 2\n]", + DumpNode::block( + DumpKind::ARRAY, + '', + [ + new DumpEntry('0', DumpNode::integer('1')), + new DumpEntry('1', DumpNode::integer('2')), + ], + ), + ]; + yield 'array without space before the parenthesis' => [ + "[\n 0 => array(\n 'a' => 1,\n ),\n]", + DumpNode::block( + DumpKind::ARRAY, + '', + [new DumpEntry('0', DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('a', DumpNode::integer('1'))]))], + ), + ]; + yield 'surrounding whitespace and Windows line breaks' => [ + "\r\n array (\r\n 0 => \r\n array (\r\n ),\r\n)\r\n", + DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('0', DumpNode::block(DumpKind::ARRAY, '', []))]), + ]; + } + + /** + * @return iterable + */ + public static function rejected(): iterable + { + yield 'plain text' => ["line one\nline two"]; + yield 'root array without space before the parenthesis' => ["array(\n 0 => 1,\n)"]; + yield 'free text before the export' => ["Loaded: array (\n 0 => 1,\n)"]; + yield 'invalid PHP' => ["array (\n 'a' => ,\n)"]; + yield 'text after the export' => ["[\n 1,\n] . 'x'"]; + yield 'second export after the export' => ["[\n 1,\n] + [\n 2,\n]"]; + yield 'closure' => ["[\n function () {\n return 1;\n },\n]"]; + yield 'anonymous class' => ["[\n new class {},\n]"]; + yield 'unserialize call' => ["[\n 'o' => unserialize('O:8:\"stdClass\":0:{}'),\n]"]; + yield 'function call' => ["[\n strlen('a'),\n]"]; + yield 'constant' => ["[\n PHP_EOL,\n]"]; + yield 'class constant without call' => ["[\n \\App\\Config,\n]"]; + yield 'static call other than __set_state' => ["[\n \\App\\Config::load(array(\n )),\n]"]; + yield '__set_state without an array' => ['\\App\\Point::__set_state(1)']; + yield '__set_state with a second argument' => ["\\App\\Point::__set_state(array(\n), 1)"]; + yield 'cast to object of a scalar' => ["[\n (object) 1,\n]"]; + yield 'double-quoted string' => ["[\n \"a\",\n]"]; + yield 'double-quoted escape other than NUL' => ["[\n 'a' . \"\\n\",\n]"]; + yield 'binary string prefix' => ["[\n b'a',\n]"]; + yield 'concatenation with a number' => ["[\n 'a' . 1,\n]"]; + yield 'negative NAN' => ["[\n -NAN,\n]"]; + yield 'negative boolean' => ["[\n -true,\n]"]; + yield 'negative string' => ["[\n -'a',\n]"]; + yield 'negative array' => ["[\n -[],\n]"]; + yield 'subtraction' => ["[\n 5-1,\n]"]; + yield 'subtraction after a negative integer' => ["[\n -5-2,\n]"]; + yield 'float key' => ["[\n 1.5 => 1,\n]"]; + yield 'boolean key' => ["[\n true => 1,\n]"]; + yield 'enum case key' => ["[\n \\App\\Suit::A => 1,\n]"]; + yield 'keyed entry after keyless entries' => ["[\n 1,\n 'k' => 2,\n]"]; + yield 'keyless entry after keyed entries' => ["[\n 'k' => 1,\n 2,\n]"]; + yield 'nested mixed entries' => ["[\n 'a' => [\n 0 => 1,\n 2,\n ],\n]"]; + yield 'parenthesized value' => ["[\n (1),\n]"]; + } +} diff --git a/tests/Provider/PrintRParserProvider.php b/tests/Provider/PrintRParserProvider.php index ab0df69..a332098 100644 --- a/tests/Provider/PrintRParserProvider.php +++ b/tests/Provider/PrintRParserProvider.php @@ -4,7 +4,7 @@ namespace PHPForge\Debug\Tests\Provider; -use PHPForge\Debug\Panel\Log\{PrintREntry, PrintRKind, PrintRNode}; +use PHPForge\Debug\Panel\Log\{DumpEntry, DumpKind, DumpNode}; use PHPForge\Debug\Tests\Panel\Log\PrintRParserTest; use PHPForge\Debug\Tests\Support\PrintR\{PrintRChild, PrintRFixture, PrintRParent, PrintRPriority, PrintRSuit, PrintRToggle}; use stdClass; @@ -17,30 +17,30 @@ final class PrintRParserProvider { /** - * @return iterable + * @return iterable */ public static function dumps(): iterable { - $suit = PrintRNode::block( - PrintRKind::ENUM, + $suit = DumpNode::block( + DumpKind::ENUM, PrintRSuit::class, [ - new PrintREntry('name', PrintRNode::scalar('HEARTS')), - new PrintREntry('value', PrintRNode::scalar('H')), + new DumpEntry('name', DumpNode::scalar('HEARTS')), + new DumpEntry('value', DumpNode::scalar('H')), ], ); yield 'array keys stay verbatim' => [ print_r(['a:b' => 'x', 'k:protected' => 'y', 'p:C:private' => 'z', '' => 'blank', 'a]b' => 'bracket'], true), - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry('a:b', PrintRNode::scalar('x')), - new PrintREntry('k:protected', PrintRNode::scalar('y')), - new PrintREntry('p:C:private', PrintRNode::scalar('z')), - new PrintREntry('', PrintRNode::scalar('blank')), - new PrintREntry('a]b', PrintRNode::scalar('bracket')), + new DumpEntry('a:b', DumpNode::scalar('x')), + new DumpEntry('k:protected', DumpNode::scalar('y')), + new DumpEntry('p:C:private', DumpNode::scalar('z')), + new DumpEntry('', DumpNode::scalar('blank')), + new DumpEntry('a]b', DumpNode::scalar('bracket')), ], ), ]; @@ -51,54 +51,54 @@ public static function dumps(): iterable return print_r($value, true); })(), - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry('0', PrintRNode::scalar('1')), - new PrintREntry('1', PrintRNode::recursion('')), + new DumpEntry('0', DumpNode::scalar('1')), + new DumpEntry('1', DumpNode::recursion('')), ], ), ]; yield 'empty root array' => [ print_r([], true), - PrintRNode::block(PrintRKind::ARRAY, '', []), + DumpNode::block(DumpKind::ARRAY, '', []), ]; yield 'empty values' => [ print_r(['string' => '', 'null' => null, 'false' => false, 'true' => true, 'zero' => 0], true), - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry('string', PrintRNode::scalar('')), - new PrintREntry('null', PrintRNode::scalar('')), - new PrintREntry('false', PrintRNode::scalar('')), - new PrintREntry('true', PrintRNode::scalar('1')), - new PrintREntry('zero', PrintRNode::scalar('0')), + new DumpEntry('string', DumpNode::scalar('')), + new DumpEntry('null', DumpNode::scalar('')), + new DumpEntry('false', DumpNode::scalar('')), + new DumpEntry('true', DumpNode::scalar('1')), + new DumpEntry('zero', DumpNode::scalar('0')), ], ), ]; yield 'header text as scalar value' => [ print_r(['cast' => 'Array', 'object' => 'App\User Object', 'enum' => 'App\Suit Enum:string', 'n' => 1], true), - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry('cast', PrintRNode::scalar('Array')), - new PrintREntry('object', PrintRNode::scalar('App\User Object')), - new PrintREntry('enum', PrintRNode::scalar('App\Suit Enum:string')), - new PrintREntry('n', PrintRNode::scalar('1')), + new DumpEntry('cast', DumpNode::scalar('Array')), + new DumpEntry('object', DumpNode::scalar('App\User Object')), + new DumpEntry('enum', DumpNode::scalar('App\Suit Enum:string')), + new DumpEntry('n', DumpNode::scalar('1')), ], ), ]; yield 'int-backed enum' => [ print_r(PrintRPriority::HIGH, true), - PrintRNode::block( - PrintRKind::ENUM, + DumpNode::block( + DumpKind::ENUM, PrintRPriority::class, [ - new PrintREntry('name', PrintRNode::scalar('HIGH')), - new PrintREntry('value', PrintRNode::scalar('1')), + new DumpEntry('name', DumpNode::scalar('HIGH')), + new DumpEntry('value', DumpNode::scalar('1')), ], ), ]; @@ -111,33 +111,33 @@ public static function dumps(): iterable ], true, ), - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry('note', PrintRNode::scalar("line one\n [nested] => not an entry\n\nline four\n")), - new PrintREntry( + new DumpEntry('note', DumpNode::scalar("line one\n [nested] => not an entry\n\nline four\n")), + new DumpEntry( 'list', - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry('first', PrintRNode::scalar("a\nb")), - new PrintREntry('last', PrintRNode::scalar("c\n)")), + new DumpEntry('first', DumpNode::scalar("a\nb")), + new DumpEntry('last', DumpNode::scalar("c\n)")), ], ), ), - new PrintREntry('next', PrintRNode::scalar('x')), + new DumpEntry('next', DumpNode::scalar('x')), ], ), ]; yield 'nested header with free text stays scalar' => [ "Array\n(\n [k] => note Array\n (\n )\n\n)\n", - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry('k', PrintRNode::scalar("note Array\n (\n )\n")), + new DumpEntry('k', DumpNode::scalar("note Array\n (\n )\n")), ], ), ]; @@ -151,14 +151,14 @@ public static function dumps(): iterable return print_r($object, true); })(), - PrintRNode::block( - PrintRKind::OBJECT, + DumpNode::block( + DumpKind::OBJECT, 'stdClass', [ - new PrintREntry('a:b', PrintRNode::scalar('x')), - new PrintREntry('x:private', PrintRNode::scalar('y')), - new PrintREntry('a:b:protected', PrintRNode::scalar('z')), - new PrintREntry('x:protectedish', PrintRNode::scalar('w')), + new DumpEntry('a:b', DumpNode::scalar('x')), + new DumpEntry('x:private', DumpNode::scalar('y')), + new DumpEntry('a:b:protected', DumpNode::scalar('z')), + new DumpEntry('x:protectedish', DumpNode::scalar('w')), ], ), ]; @@ -172,17 +172,17 @@ public static function dumps(): iterable return print_r($object, true); })(), - PrintRNode::block( - PrintRKind::OBJECT, + DumpNode::block( + DumpKind::OBJECT, 'stdClass', [ - new PrintREntry('status:protected', PrintRNode::scalar('on')), - new PrintREntry( + new DumpEntry('status:protected', DumpNode::scalar('on')), + new DumpEntry( 'inner', - PrintRNode::block( - PrintRKind::OBJECT, + DumpNode::block( + DumpKind::OBJECT, 'stdClass', - [new PrintREntry('id:App\User:private', PrintRNode::scalar('7'))], + [new DumpEntry('id:App\User:private', DumpNode::scalar('7'))], ), ), ], @@ -190,49 +190,49 @@ public static function dumps(): iterable ]; yield 'object with visibility, inheritance, enum, and recursion' => [ PrintRFixture::child(), - PrintRNode::block( - PrintRKind::OBJECT, + DumpNode::block( + DumpKind::OBJECT, PrintRChild::class, [ - new PrintREntry('role', PrintRNode::scalar('admin'), 'protected'), - new PrintREntry('secret', PrintRNode::scalar('parent'), 'private', PrintRParent::class), - new PrintREntry('empty', PrintRNode::scalar('')), - new PrintREntry('flag', PrintRNode::scalar('')), - new PrintREntry('name', PrintRNode::scalar('Ada')), - new PrintREntry('self', PrintRNode::recursion(PrintRChild::class)), - new PrintREntry('suit', $suit), - new PrintREntry( + new DumpEntry('role', DumpNode::scalar('admin'), 'protected'), + new DumpEntry('secret', DumpNode::scalar('parent'), 'private', PrintRParent::class), + new DumpEntry('empty', DumpNode::scalar('')), + new DumpEntry('flag', DumpNode::scalar('')), + new DumpEntry('name', DumpNode::scalar('Ada')), + new DumpEntry('self', DumpNode::recursion(PrintRChild::class)), + new DumpEntry('suit', $suit), + new DumpEntry( 'tags', - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry('0', PrintRNode::scalar('a')), - new PrintREntry('1', PrintRNode::scalar('b')), + new DumpEntry('0', DumpNode::scalar('a')), + new DumpEntry('1', DumpNode::scalar('b')), ], ), ), - new PrintREntry('parent', PrintRNode::scalar(''), 'protected'), - new PrintREntry('secret', PrintRNode::scalar('child'), 'private', PrintRChild::class), + new DumpEntry('parent', DumpNode::scalar(''), 'protected'), + new DumpEntry('secret', DumpNode::scalar('child'), 'private', PrintRChild::class), ], ), ]; yield 'prefix before the root header' => [ 'Request: ' . print_r(['id' => 7], true), - PrintRNode::block(PrintRKind::ARRAY, '', [new PrintREntry('id', PrintRNode::scalar('7'))], 'Request:'), + DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('id', DumpNode::scalar('7'))], 'Request:'), ]; yield 'prefix before an object header' => [ 'Loaded user App\User Object' . "\n(\n [id] => 7\n)\n", - PrintRNode::block( - PrintRKind::OBJECT, + DumpNode::block( + DumpKind::OBJECT, 'App\User', - [new PrintREntry('id', PrintRNode::scalar('7'))], + [new DumpEntry('id', DumpNode::scalar('7'))], 'Loaded user', ), ]; yield 'pure enum' => [ print_r(PrintRToggle::ON, true), - PrintRNode::block(PrintRKind::ENUM, PrintRToggle::class, [new PrintREntry('name', PrintRNode::scalar('ON'))]), + DumpNode::block(DumpKind::ENUM, PrintRToggle::class, [new DumpEntry('name', DumpNode::scalar('ON'))]), ]; yield 'server request' => [ PrintRFixture::serverRequest(), @@ -244,7 +244,7 @@ public static function dumps(): iterable ]; yield 'trailing whitespace' => [ print_r(['id' => 7], true) . " \t\n\n", - PrintRNode::block(PrintRKind::ARRAY, '', [new PrintREntry('id', PrintRNode::scalar('7'))]), + DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('id', DumpNode::scalar('7'))]), ]; } @@ -278,119 +278,119 @@ public static function invalid(): iterable /** * Returns the tree of the server request dump fixture. */ - private static function serverRequest(): PrintRNode + private static function serverRequest(): DumpNode { $request = 'HttpSoft\Message\ServerRequest'; $uri = 'HttpSoft\Message\Uri'; $stream = 'HttpSoft\Message\Stream'; - return PrintRNode::block( - PrintRKind::OBJECT, + return DumpNode::block( + DumpKind::OBJECT, $request, [ - new PrintREntry( + new DumpEntry( 'attributes', - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', - [new PrintREntry('applicationStartTime', PrintRNode::scalar('1793938706.0155'))], + [new DumpEntry('applicationStartTime', DumpNode::scalar('1793938706.0155'))], ), 'private', $request, ), - new PrintREntry( + new DumpEntry( 'cookieParams', - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', - [new PrintREntry('yii-debug-toolbar-theme', PrintRNode::scalar('dark'))], + [new DumpEntry('yii-debug-toolbar-theme', DumpNode::scalar('dark'))], ), 'private', $request, ), - new PrintREntry('parsedBody', PrintRNode::scalar(''), 'private', $request), - new PrintREntry('queryParams', PrintRNode::block(PrintRKind::ARRAY, '', []), 'private', $request), - new PrintREntry( + new DumpEntry('parsedBody', DumpNode::scalar(''), 'private', $request), + new DumpEntry('queryParams', DumpNode::block(DumpKind::ARRAY, '', []), 'private', $request), + new DumpEntry( 'serverParams', - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry('USER', PrintRNode::scalar('www-data')), - new PrintREntry('HTTP_PRIORITY', PrintRNode::scalar('u=0, i')), - new PrintREntry( + new DumpEntry('USER', DumpNode::scalar('www-data')), + new DumpEntry('HTTP_PRIORITY', DumpNode::scalar('u=0, i')), + new DumpEntry( 'HTTP_ACCEPT', - PrintRNode::scalar('text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), + DumpNode::scalar('text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), ), - new PrintREntry( + new DumpEntry( 'HTTP_USER_AGENT', - PrintRNode::scalar( + DumpNode::scalar( 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:159.0) Gecko/20100101 Firefox/159.0', ), ), - new PrintREntry('REQUEST_METHOD', PrintRNode::scalar('GET')), - new PrintREntry('CONTENT_LENGTH', PrintRNode::scalar('')), - new PrintREntry('REQUEST_TIME_FLOAT', PrintRNode::scalar('1793938706.0138')), + new DumpEntry('REQUEST_METHOD', DumpNode::scalar('GET')), + new DumpEntry('CONTENT_LENGTH', DumpNode::scalar('')), + new DumpEntry('REQUEST_TIME_FLOAT', DumpNode::scalar('1793938706.0138')), ], ), 'private', $request, ), - new PrintREntry('uploadedFiles', PrintRNode::block(PrintRKind::ARRAY, '', []), 'private', $request), - new PrintREntry('method', PrintRNode::scalar('GET'), 'private', $request), - new PrintREntry('requestTarget', PrintRNode::scalar(''), 'private', $request), - new PrintREntry( + new DumpEntry('uploadedFiles', DumpNode::block(DumpKind::ARRAY, '', []), 'private', $request), + new DumpEntry('method', DumpNode::scalar('GET'), 'private', $request), + new DumpEntry('requestTarget', DumpNode::scalar(''), 'private', $request), + new DumpEntry( 'uri', - PrintRNode::block( - PrintRKind::OBJECT, + DumpNode::block( + DumpKind::OBJECT, $uri, [ - new PrintREntry('scheme', PrintRNode::scalar('http'), 'private', $uri), - new PrintREntry('userInfo', PrintRNode::scalar(''), 'private', $uri), - new PrintREntry('host', PrintRNode::scalar('ets-api.test'), 'private', $uri), - new PrintREntry('port', PrintRNode::scalar('80'), 'private', $uri), - new PrintREntry('path', PrintRNode::scalar('/'), 'private', $uri), - new PrintREntry('query', PrintRNode::scalar(''), 'private', $uri), - new PrintREntry('fragment', PrintRNode::scalar(''), 'private', $uri), - new PrintREntry('cache', PrintRNode::scalar(''), 'private', $uri), + new DumpEntry('scheme', DumpNode::scalar('http'), 'private', $uri), + new DumpEntry('userInfo', DumpNode::scalar(''), 'private', $uri), + new DumpEntry('host', DumpNode::scalar('ets-api.test'), 'private', $uri), + new DumpEntry('port', DumpNode::scalar('80'), 'private', $uri), + new DumpEntry('path', DumpNode::scalar('/'), 'private', $uri), + new DumpEntry('query', DumpNode::scalar(''), 'private', $uri), + new DumpEntry('fragment', DumpNode::scalar(''), 'private', $uri), + new DumpEntry('cache', DumpNode::scalar(''), 'private', $uri), ], ), 'private', $request, ), - new PrintREntry( + new DumpEntry( 'headers', - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', [ - new PrintREntry( + new DumpEntry( 'Host', - PrintRNode::block( - PrintRKind::ARRAY, + DumpNode::block( + DumpKind::ARRAY, '', - [new PrintREntry('0', PrintRNode::scalar('ets-api.test'))], + [new DumpEntry('0', DumpNode::scalar('ets-api.test'))], ), ), - new PrintREntry( + new DumpEntry( 'Content-Length', - PrintRNode::block(PrintRKind::ARRAY, '', [new PrintREntry('0', PrintRNode::scalar(''))]), + DumpNode::block(DumpKind::ARRAY, '', [new DumpEntry('0', DumpNode::scalar(''))]), ), ], ), 'private', $request, ), - new PrintREntry('protocol', PrintRNode::scalar('1.1'), 'private', $request), - new PrintREntry( + new DumpEntry('protocol', DumpNode::scalar('1.1'), 'private', $request), + new DumpEntry( 'stream', - PrintRNode::block( - PrintRKind::OBJECT, + DumpNode::block( + DumpKind::OBJECT, $stream, [ - new PrintREntry('resource', PrintRNode::scalar('Resource id #6'), 'private', $stream), - new PrintREntry('size', PrintRNode::scalar(''), 'private', $stream), - new PrintREntry('seekable', PrintRNode::scalar('1'), 'private', $stream), + new DumpEntry('resource', DumpNode::scalar('Resource id #6'), 'private', $stream), + new DumpEntry('size', DumpNode::scalar(''), 'private', $stream), + new DumpEntry('seekable', DumpNode::scalar('1'), 'private', $stream), ], ), 'private', diff --git a/tests/Provider/PrintRTreeRendererProvider.php b/tests/Provider/PrintRTreeRendererProvider.php deleted file mode 100644 index 0cce0e0..0000000 --- a/tests/Provider/PrintRTreeRendererProvider.php +++ /dev/null @@ -1,187 +0,0 @@ - - */ - public static function trees(): iterable - { - yield 'array with one entry' => [ - PrintRNode::block( - PrintRKind::ARRAY, - '', - [new PrintREntry('id', PrintRNode::scalar('7'))], - ), - <<<'HTML' -
- - array1 entry -
-
- id7 -
-
-
- HTML, - ]; - yield 'empty root array' => [ - PrintRNode::block( - PrintRKind::ARRAY, - '', - [], - ), - <<<'HTML' -
- - array0 entries -
-
-
- HTML, - ]; - yield 'escaped texts' => [ - PrintRNode::block( - PrintRKind::OBJECT, - 'App\', - [new PrintREntry('', PrintRNode::scalar("