/* * Error Debug Page * * Self-contained: inlined by ErrorRenderer so it works even when the app's * stylesheet fails to load. Uses the project's token names with hardcoded * fallbacks so the page looks native but remains independent. * * Excluded from TypographyTokenContractTest (self-contained error page). */ /* ── Fallback tokens (only apply when the app's CSS is NOT loaded) ────── */ :root { /* typography — mirrors typography.tokens.css */ --text-2xs: 0.6875rem; --text-xs: 0.75rem; --text-sm: 0.8125rem; --text-base: 0.875rem; --text-lg: 1rem; --text-xl: 1.125rem; --text-3xl: clamp(1.375rem, 1.2rem + 0.75vw, 1.75rem); --text-5xl: clamp(2rem, 1.7rem + 1.5vw, 2.75rem); --leading-none: 1; --leading-tight: 1.2; --leading-normal: 1.5; --font-medium: 500; --font-semibold: 600; --font-bold: 700; --tracking-wider: 0.05em; /* layout — mirrors variables.base.css */ --app-font-family: system-ui, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, Helvetica, Arial, sans-serif; --app-font-family-monospace: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; --app-border-radius: 0.5rem; --app-spacing: 1rem; --app-transition: 0.2s ease-in-out; /* light theme fallbacks — mirrors [data-theme="light"] */ --app-background-color: #fff; --app-color: #373c44; --app-muted-color: #646b79; --app-muted-border-color: rgb(231, 234, 239.5); --app-card-background-color: #fff; --app-card-border-color: rgb(231, 234, 239.5); --app-card-sectioning-background-color: rgb(251, 251.5, 252.25); --app-form-element-background-color: rgb(251, 251.5, 252.25); --app-form-element-border-color: #cfd5e2; --app-border: var(--app-form-element-border-color); --app-primary: hsl(180.75 37.38% 58.04%); --badge-danger-bg: #fdecec; --badge-danger-color: #8f2c2c; } /* dark mode fallback (prefers-color-scheme or data-theme) */ @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --app-background-color: #1f1f1e; --app-color: #c8c8c6; --app-muted-color: #6e6e6c; --app-muted-border-color: #2f2f2d; --app-card-background-color: #242422; --app-card-border-color: #242422; --app-card-sectioning-background-color: #2a2a28; --app-form-element-background-color: #2a2a28; --app-form-element-border-color: #383835; --app-border: var(--app-form-element-border-color); --badge-danger-bg: #3a1b1b; --badge-danger-color: #f2a3a3; } } /* ── Reset (scoped to error debug page) ──────────────────────────────── */ body.app-error-debug { margin: 0; font-family: var(--app-font-family); font-size: var(--text-base); line-height: var(--leading-normal); color: var(--app-color); background: var(--app-background-color); min-height: 100dvh; } .app-error-debug *, .app-error-debug *::before, .app-error-debug *::after { box-sizing: border-box; } /* ── Container ───────────────────────────────────────────────────────── */ .app-error-debug-container { max-width: 72rem; margin: 0 auto; padding: 0 var(--app-spacing); } /* ── Header ──────────────────────────────────────────────────────────── */ .app-error-debug-header { background: var(--app-card-background-color); border-bottom: 1px solid var(--app-border); padding: calc(var(--app-spacing) * 1.25) 0; } .app-error-debug-header__inner { display: flex; align-items: center; justify-content: space-between; gap: var(--app-spacing); flex-wrap: wrap; } .app-error-debug-header__status { display: flex; align-items: center; gap: calc(var(--app-spacing) * 0.75); } .app-error-debug-header__code { font-size: var(--text-3xl); font-weight: var(--font-bold); line-height: var(--leading-none); color: var(--badge-danger-color); } .app-error-debug-header__label { font-size: var(--text-sm); color: var(--app-muted-color); } .app-error-debug-request-id { display: flex; align-items: center; gap: calc(var(--app-spacing) * 0.5); font-family: var(--app-font-family-monospace); font-size: var(--text-xs); color: var(--app-muted-color); background: var(--app-form-element-background-color); padding: calc(var(--app-spacing) * 0.375) calc(var(--app-spacing) * 0.75); border-radius: var(--app-border-radius); border: 1px solid var(--app-border); } .app-error-debug-copy-button { background: none; border: none; color: var(--app-muted-color); cursor: pointer; padding: 2px; display: flex; align-items: center; transition: color var(--app-transition); } .app-error-debug-copy-button:hover { color: var(--app-color); } .app-error-debug-copy-button.copied { color: var(--app-primary); } .app-error-debug-copy-button:focus-visible { outline: 2px solid var(--app-primary); outline-offset: 2px; } /* ── Exception Summary ───────────────────────────────────────────────── */ .app-error-debug-summary { padding: calc(var(--app-spacing) * 1.5) 0; } .app-error-debug-summary__class { font-family: var(--app-font-family-monospace); font-size: var(--text-sm); color: var(--app-primary); margin-bottom: calc(var(--app-spacing) * 0.375); } .app-error-debug-summary__message { font-size: var(--text-xl); font-weight: var(--font-semibold); color: var(--app-color); word-break: break-word; margin-bottom: calc(var(--app-spacing) * 0.5); } .app-error-debug-summary__location { font-family: var(--app-font-family-monospace); font-size: var(--text-sm); color: var(--app-muted-color); } /* ── Tabs ─────────────────────────────────────────────────────────────── */ .app-error-debug-tabs { display: flex; gap: 0; border-bottom: 1px solid var(--app-border); margin-bottom: calc(var(--app-spacing) * 1.5); } .app-error-debug-tab { padding: calc(var(--app-spacing) * 0.625) var(--app-spacing); font-size: var(--text-sm); font-weight: var(--font-medium); color: var(--app-muted-color); background: none; border: none; border-bottom: 2px solid transparent; cursor: pointer; transition: color var(--app-transition), border-color var(--app-transition); } .app-error-debug-tab:hover { color: var(--app-color); } .app-error-debug-tab:focus-visible { outline: 2px solid var(--app-primary); outline-offset: 2px; } .app-error-debug-tab.active { color: var(--app-primary); border-bottom-color: var(--app-primary); } .app-error-debug-tab__count { display: inline-block; min-width: 1.25rem; height: 1.25rem; line-height: var(--leading-tight); text-align: center; font-size: var(--text-2xs); font-weight: var(--font-semibold); background: var(--app-muted-border-color); color: var(--app-muted-color); border-radius: 9999px; margin-left: calc(var(--app-spacing) * 0.375); padding: 0 calc(var(--app-spacing) * 0.375); } .app-error-debug-panel { display: none; padding-bottom: calc(var(--app-spacing) * 2); } .app-error-debug-panel.active { display: block; } /* ── Stack Trace ──────────────────────────────────────────────────────── */ .app-error-debug-trace { list-style: none; padding: 0; margin: 0; } .app-error-debug-frame { border: 1px solid var(--app-border); border-radius: var(--app-border-radius); margin-bottom: calc(var(--app-spacing) * 0.5); overflow: hidden; } .app-error-debug-frame__header { display: flex; align-items: baseline; gap: calc(var(--app-spacing) * 0.5); padding: calc(var(--app-spacing) * 0.625) calc(var(--app-spacing) * 0.875); font-family: var(--app-font-family-monospace); font-size: var(--text-sm); cursor: pointer; background: var(--app-card-background-color); transition: background var(--app-transition); width: 100%; border: 0; text-align: left; } .app-error-debug-frame__header:hover { background: var(--app-card-sectioning-background-color); } .app-error-debug-frame__header:focus-visible { outline: 2px solid var(--app-primary); outline-offset: -2px; } .app-error-debug-frame__index { color: var(--app-muted-color); font-size: var(--text-xs); min-width: 2rem; } .app-error-debug-frame__file { color: var(--app-color); } .app-error-debug-frame__line { color: var(--badge-danger-color); } .app-error-debug-frame__function { color: var(--app-muted-color); font-size: var(--text-xs); margin-left: auto; } .app-error-debug-frame__code { display: none; overflow-x: auto; } .app-error-debug-frame.open .app-error-debug-frame__code { display: block; } /* ── Code Table ───────────────────────────────────────────────────────── */ .app-error-debug-code-table { width: 100%; border-collapse: collapse; font-family: var(--app-font-family-monospace); font-size: var(--text-sm); line-height: var(--leading-normal); } .app-error-debug-code-table td { padding: 0 calc(var(--app-spacing) * 0.875); white-space: pre; vertical-align: top; } .app-error-debug-code-table__line-no { width: 3.5rem; text-align: right; color: var(--app-muted-color); user-select: none; padding-right: var(--app-spacing); border-right: 1px solid var(--app-border); } .app-error-debug-code-table__code { padding-left: var(--app-spacing); } .app-error-debug-code-table tr.highlight { background: var(--badge-danger-bg); } .app-error-debug-code-table tr.highlight .app-error-debug-code-table__line-no { color: var(--badge-danger-color); font-weight: var(--font-bold); } /* ── Info Tables ──────────────────────────────────────────────────────── */ .app-error-debug-section { margin-bottom: calc(var(--app-spacing) * 1.5); } .app-error-debug-section__title { font-size: var(--text-xs); font-weight: var(--font-semibold); text-transform: uppercase; letter-spacing: var(--tracking-wider); color: var(--app-muted-color); margin-bottom: calc(var(--app-spacing) * 0.625); } .app-error-debug-info-table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); background: var(--app-card-background-color); border-radius: var(--app-border-radius); overflow: hidden; border: 1px solid var(--app-border); } .app-error-debug-info-table tr + tr { border-top: 1px solid var(--app-border); } .app-error-debug-info-table th { text-align: left; padding: calc(var(--app-spacing) * 0.5) calc(var(--app-spacing) * 0.875); font-weight: var(--font-medium); color: var(--app-muted-color); width: 12rem; vertical-align: top; font-family: var(--app-font-family-monospace); font-size: var(--text-xs); background: var(--app-card-sectioning-background-color); } .app-error-debug-info-table td { padding: calc(var(--app-spacing) * 0.5) calc(var(--app-spacing) * 0.875); font-family: var(--app-font-family-monospace); font-size: var(--text-xs); color: var(--app-color); word-break: break-all; } .app-error-debug-redacted { color: var(--app-muted-color); font-style: italic; } /* ── Query Timeline ───────────────────────────────────────────────────── */ .app-error-debug-query { background: var(--app-card-background-color); border: 1px solid var(--app-border); border-radius: var(--app-border-radius); margin-bottom: calc(var(--app-spacing) * 0.5); overflow: hidden; } .app-error-debug-query__header { display: flex; align-items: center; justify-content: space-between; padding: calc(var(--app-spacing) * 0.5) calc(var(--app-spacing) * 0.875); cursor: pointer; font-family: var(--app-font-family-monospace); font-size: var(--text-xs); width: 100%; border: 0; text-align: left; background: transparent; } .app-error-debug-query__header:hover { background: var(--app-card-sectioning-background-color); } .app-error-debug-query__header:focus-visible { outline: 2px solid var(--app-primary); outline-offset: -2px; } .app-error-debug-query__duration { color: var(--app-muted-color); white-space: nowrap; } .app-error-debug-query__sql { display: none; padding: calc(var(--app-spacing) * 0.75) calc(var(--app-spacing) * 0.875); background: var(--app-card-sectioning-background-color); font-family: var(--app-font-family-monospace); font-size: var(--text-xs); white-space: pre-wrap; word-break: break-all; border-top: 1px solid var(--app-border); } .app-error-debug-query.open .app-error-debug-query__sql { display: block; } /* ── Empty State ──────────────────────────────────────────────────────── */ .app-error-debug-empty { text-align: center; padding: calc(var(--app-spacing) * 2); color: var(--app-muted-color); font-size: var(--text-sm); } /* ── Previous Exception Chain ─────────────────────────────────────────── */ .app-error-debug-chain { margin-top: calc(var(--app-spacing) * 1.5); padding-top: calc(var(--app-spacing) * 1.5); border-top: 1px dashed var(--app-border); } .app-error-debug-chain__label { font-size: var(--text-xs); font-weight: var(--font-semibold); text-transform: uppercase; letter-spacing: var(--tracking-wider); color: var(--app-muted-color); margin-bottom: calc(var(--app-spacing) * 0.5); }