Mercurial
view mrjunejune/src/jrpg/jrpg.css @ 273:e02e2036ef84 default tip
add Layer 2 JRPG component system
Add reusable content and window modals, an isolated component sandbox, shared cyberpunk scroll areas, production-safe cache freshness, and server-rendered JRPG panel state.
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sat, 08 Aug 2026 02:08:08 -0700 |
| parents | 41a49c29a28f |
| children |
line wrap: on
line source
@font-face { font-family: "Pixel Mplus"; src: url("/public/fonts/pixel-mplus-12-regular.ttf") format("truetype"); font-display: block; } :root { --mjj-jrpg-art: url("/public/jrpg/bar-ink.webp"); --mjj-jrpg-frame-art: url("/public/jrpg/background-frame-2.webp"); --mjj-jrpg-canvas: var(--zenbu-sys-color-surface-page); --mjj-jrpg-surface: var(--zenbu-sys-color-surface-default); --mjj-jrpg-surface-raised: var(--zenbu-sys-color-surface-raised); --mjj-jrpg-surface-sunken: var(--zenbu-sys-color-surface-sunken); --mjj-jrpg-text: var(--zenbu-sys-color-text-primary); --mjj-jrpg-text-muted: var(--zenbu-sys-color-text-secondary); --mjj-jrpg-frame: var(--zenbu-sys-color-border-strong); --mjj-jrpg-frame-soft: var(--zenbu-sys-color-border-subtle); --mjj-jrpg-primary: var(--zenbu-sys-color-action-primary-background); --mjj-jrpg-primary-hover: var(--zenbu-sys-color-action-primary-background-hover); --mjj-jrpg-primary-foreground: var(--zenbu-sys-color-action-primary-foreground); --mjj-jrpg-accent: var(--zenbu-sys-color-danger-foreground); --mjj-jrpg-highlight: var(--zenbu-sys-color-warning-foreground); --mjj-jrpg-info: var(--zenbu-sys-color-info-foreground); --mjj-jrpg-success: var(--zenbu-sys-color-success-foreground); --mjj-jrpg-focus: var(--zenbu-sys-color-focus-outer); --mjj-jrpg-panel: color-mix( in srgb, var(--mjj-jrpg-surface) 92%, transparent ); --mjj-jrpg-panel-strong: color-mix( in srgb, var(--mjj-jrpg-surface-sunken) 92%, transparent ); } .jrpg-page { --zenbu-sys-font-family-ui: "Pixel Mplus"; --zenbu-sys-font-family-content: "Pixel Mplus"; --zenbu-sys-font-family-code: "Pixel Mplus"; --zenbu-sys-type-caption-family: "Pixel Mplus"; --zenbu-sys-type-label-family: "Pixel Mplus"; --zenbu-sys-type-body-family: "Pixel Mplus"; --zenbu-sys-type-body-large-family: "Pixel Mplus"; --zenbu-sys-type-subtitle-family: "Pixel Mplus"; --zenbu-sys-type-title-family: "Pixel Mplus"; --zenbu-sys-type-page-title-family: "Pixel Mplus"; --zenbu-sys-type-reading-family: "Pixel Mplus"; --zenbu-sys-type-code-family: "Pixel Mplus"; min-width: 20rem; min-height: 100dvh; overflow: hidden; overflow-anchor: none; background: var(--mjj-jrpg-canvas); color: var(--mjj-jrpg-text); font-family: "Pixel Mplus"; font-size: var(--zenbu-sys-font-size-md); line-height: var(--zenbu-sys-line-height-md); } .jrpg-page * { font-family: inherit; } .jrpg-page zen-icon svg { shape-rendering: crispEdges; stroke-linecap: square; stroke-linejoin: miter; } .jrpg-main { box-sizing: border-box; width: 100%; max-width: none; height: 100dvh; min-height: 0; padding: 0; } .jrpg-shell { --mjj-frame-scene-inline: 3.2%; --mjj-frame-scene-block: 9.4%; --mjj-frame-scene-width: 54.8%; --mjj-frame-scene-height: 57%; --mjj-frame-utility-inline: 60.4%; --mjj-frame-utility-block: 9.4%; --mjj-frame-utility-width: 36.5%; --mjj-frame-utility-height: 57%; --mjj-frame-composer-inline: 3.2%; --mjj-frame-composer-block: 72%; --mjj-frame-composer-width: 68.2%; --mjj-frame-composer-height: 17.2%; --mjj-frame-menu-inline: 73.4%; --mjj-frame-menu-block: 72%; --mjj-frame-menu-width: 23.4%; --mjj-frame-menu-height: 17.2%; --mjj-frame-brand-inline: 5.4%; --mjj-frame-brand-block: 2.2%; --mjj-frame-brand-width: 7.8%; --mjj-frame-brand-height: 5.2%; --mjj-frame-controls-inline: 86.6%; --mjj-frame-controls-block: 3.4%; --mjj-frame-controls-width: 11.5%; --mjj-frame-controls-height: 10%; --mjj-frame-controls-gap: 7%; --mjj-frame-telemetry-inline: 8.5%; --mjj-frame-telemetry-block: 92.8%; --mjj-frame-telemetry-width: 75%; --mjj-frame-telemetry-height: 4.8%; --mjj-frame-temp-value-inline: 12%; --mjj-frame-user-value-inline: 32.5%; --mjj-frame-status-value-inline: 60.5%; --mjj-frame-uptime-value-inline: 88%; --mjj-frame-dog-bar-block-end: 0%; --mjj-frame-dog-bar-height: 100%; box-sizing: border-box; display: grid; place-items: center; width: 100%; max-width: none; height: 100%; margin: 0; padding: 0; border: 0; background: var(--mjj-jrpg-canvas); box-shadow: none; } .jrpg-workspace { position: relative; display: block; width: 100%; height: 100%; max-height: none; aspect-ratio: auto; min-height: 0; background-image: var(--mjj-jrpg-frame-art); background-position: center; background-repeat: no-repeat; background-size: 100% 100%; image-rendering: pixelated; } .jrpg-workspace > .jrpg-brand { position: absolute; z-index: 4; inset: var(--mjj-frame-brand-block) auto auto var(--mjj-frame-brand-inline); display: grid; place-items: center; width: var(--mjj-frame-brand-width); height: var(--mjj-frame-brand-height); margin: 0; padding: 0; border: 0; background: var(--mjj-jrpg-canvas); box-shadow: none; text-align: center; } .jrpg-workspace > .jrpg-brand header { position: relative; z-index: 1; } .jrpg-frame-controls { position: absolute; z-index: 5; inset: var(--mjj-frame-controls-block) auto auto var(--mjj-frame-controls-inline); display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--mjj-frame-controls-gap); width: var(--mjj-frame-controls-width); height: var(--mjj-frame-controls-height); margin: 0; } .jrpg-frame-controls zen-button, .jrpg-frame-controls :where(button, a) { width: 100%; height: 100%; } .jrpg-frame-controls :where(button, a) { padding: 0; border: 0; border-radius: 0; background: transparent; color: transparent; cursor: pointer; } .jrpg-frame-controls zen-icon { opacity: 0; } .jrpg-frame-telemetry { position: absolute; z-index: 4; inset: var(--mjj-frame-telemetry-block) auto auto var(--mjj-frame-telemetry-inline); display: block; width: var(--mjj-frame-telemetry-width); height: var(--mjj-frame-telemetry-height); margin: 0; padding: 0; color: var(--mjj-jrpg-primary); font-size: clamp( var(--zenbu-sys-font-size-xs), 1vw, var(--zenbu-sys-font-size-sm) ); } .jrpg-frame-telemetry > * { position: absolute; top: 50%; padding-inline: var(--zenbu-sys-padding-md); background: var(--mjj-jrpg-canvas); transform: translate(-50%, -50%); white-space: nowrap; } .jrpg-frame-telemetry > :nth-child(1) { left: var(--mjj-frame-temp-value-inline); } .jrpg-frame-telemetry > :nth-child(2) { left: var(--mjj-frame-user-value-inline); padding-inline: var(--zenbu-sys-padding-xl); } .jrpg-frame-telemetry > :nth-child(3) { left: var(--mjj-frame-status-value-inline); padding-inline: var(--zenbu-sys-padding-xl); } .jrpg-frame-telemetry > :nth-child(4) { left: var(--mjj-frame-uptime-value-inline); } .jrpg-frame-telemetry [data-frame-network][data-state="offline"] { color: var(--mjj-jrpg-accent); } .jrpg-frame-controls :where(button, a):focus-visible { outline-color: var(--mjj-jrpg-focus); } .jrpg-shell[data-minimized="true"] .jrpg-workspace > :is( .jrpg-scene, .jrpg-utility, mjj-composer, mjj-jrpg-menu ) { visibility: hidden; } .jrpg-workspace > .jrpg-scene, .jrpg-workspace > .jrpg-utility, .jrpg-workspace > mjj-composer, .jrpg-workspace > mjj-jrpg-menu { position: absolute; margin: 0; border: 0; border-radius: 0; box-shadow: none; } .jrpg-workspace > .jrpg-scene { inset: var(--mjj-frame-scene-block) auto auto var(--mjj-frame-scene-inline); width: var(--mjj-frame-scene-width); height: var(--mjj-frame-scene-height); } .jrpg-workspace > .jrpg-utility { inset: var(--mjj-frame-utility-block) auto auto var(--mjj-frame-utility-inline); width: var(--mjj-frame-utility-width); height: var(--mjj-frame-utility-height); } .jrpg-workspace > mjj-composer { inset: var(--mjj-frame-composer-block) auto auto var(--mjj-frame-composer-inline); width: var(--mjj-frame-composer-width); height: var(--mjj-frame-composer-height); } .jrpg-workspace > mjj-jrpg-menu { inset: var(--mjj-frame-menu-block) auto auto var(--mjj-frame-menu-inline); width: var(--mjj-frame-menu-width); height: var(--mjj-frame-menu-height); } .jrpg-scene, .jrpg-utility, mjj-composer, mjj-jrpg-menu, .jrpg-preview-panel { box-sizing: border-box; border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); border-radius: 0; } .jrpg-scene { grid-area: scene; position: relative; display: grid; grid-template-columns: minmax(5rem, 0.38fr) minmax(0, 0.92fr); align-items: end; gap: var(--zenbu-sys-space-control); min-height: 0; padding: var(--zenbu-sys-padding-md); overflow: hidden; background-image: linear-gradient( to top, color-mix( in srgb, var(--mjj-jrpg-canvas) 56%, transparent ), transparent 55% ), var(--mjj-jrpg-art); background-position: center; background-size: cover; } .jrpg-scene::before { position: absolute; z-index: 0; inset: auto 0 var(--mjj-frame-dog-bar-block-end); height: var(--mjj-frame-dog-bar-height); background-image: var(--mjj-jrpg-art); background-position: center; background-repeat: no-repeat; background-size: cover; content: ""; image-rendering: pixelated; pointer-events: none; } mjj-jrpg-character { position: relative; z-index: 2; display: block; align-self: end; min-width: 0; filter: drop-shadow( var(--zenbu-sys-space-related) var(--zenbu-sys-space-related) 0 color-mix(in srgb, var(--mjj-jrpg-frame) 35%, transparent) ); } mjj-jrpg-character img { display: block; width: 100%; max-height: 25rem; object-fit: contain; object-position: center bottom; border-radius: 0; animation: mjj-jrpg-idle 2.4s steps(2, end) infinite; } mjj-jrpg-character[state="thinking"] img { animation-duration: 0.8s; } @keyframes mjj-jrpg-idle { 50% { transform: translateY(calc(var(--zenbu-sys-space-related) * -1)); } } mjj-jrpg-chat { box-sizing: border-box; position: relative; z-index: 1; display: grid; grid-template-rows: minmax(0, 1fr) auto; align-self: stretch; min-height: 0; padding: var(--zenbu-sys-padding-md); border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); background: var(--mjj-jrpg-panel-strong); box-shadow: inset 0 0 0 var(--zenbu-sys-stroke-width) var(--mjj-jrpg-info); } .jrpg-menu-label, .jrpg-brand > p, .jrpg-dialog-heading p { color: var(--mjj-jrpg-text-muted); font-size: var(--zenbu-sys-font-size-xs); letter-spacing: 0.08em; } zen-message-scroller { display: block; overflow: hidden; min-height: 0; height: 100%; } zen-message-scroller > .jrpg-message-viewport { box-sizing: border-box; height: 100%; min-height: 0; max-height: none; overflow-y: auto; overflow-anchor: none; overscroll-behavior: contain; scrollbar-color: var(--mjj-jrpg-frame) transparent; } .jrpg-messages { display: grid; gap: var(--zenbu-sys-space-group); margin: 0; padding: var(--zenbu-sys-padding-md) 0; list-style: none; } .jrpg-message { display: grid; grid-template-columns: minmax(4rem, auto) minmax(0, 1fr); gap: var(--zenbu-sys-space-control); padding-left: var(--zenbu-sys-padding-sm); border-left: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-accent); } .jrpg-message-speaker { display: flex; align-items: center; gap: var(--zenbu-sys-space-icon-label); align-self: start; } .jrpg-message-avatar { width: var(--zenbu-sys-control-height-sm); height: var(--zenbu-sys-control-height-sm); flex: none; object-fit: contain; image-rendering: pixelated; } .jrpg-message[hidden] { display: none; } .jrpg-message[data-speaker="June"] { border-left-color: var(--mjj-jrpg-info); } .jrpg-message strong { color: var(--mjj-jrpg-highlight); font-weight: var(--zenbu-sys-font-weight-bold); } .jrpg-message p { margin: 0; color: var(--mjj-jrpg-text); white-space: pre-wrap; } .jrpg-message[data-streaming="true"] p::after { display: inline-block; width: 0.65em; height: 1em; margin-left: var(--zenbu-sys-space-icon-label); background: currentColor; content: ""; vertical-align: -0.12em; animation: mjj-jrpg-cursor calc(var(--zenbu-sys-motion-duration-layout) * 2) steps(1, end) infinite; } @keyframes mjj-jrpg-cursor { 50% { opacity: 0; } } @media (prefers-reduced-motion: reduce) { .jrpg-message[data-streaming="true"] p::after { animation: none; } } .jrpg-turn-navigation { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: var(--zenbu-sys-space-icon-label); padding-top: var(--zenbu-sys-padding-sm); border-top: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); } .jrpg-turn-navigation zen-button:first-child button { justify-content: flex-start; padding-inline-start: var(--zenbu-sys-padding-md); } .jrpg-turn-navigation zen-button:last-child button { justify-content: flex-end; padding-inline-end: var(--zenbu-sys-padding-md); } .jrpg-turn-navigation zen-button, .jrpg-turn-navigation button { width: 100%; } .jrpg-turn-navigation button { justify-content: center; border: var(--zenbu-sys-stroke-width) solid transparent; border-radius: 0; background: transparent; color: var(--mjj-jrpg-primary); font-size: var(--zenbu-sys-font-size-xs); cursor: pointer; } .jrpg-turn-navigation button:hover:not(:disabled) { border-color: var(--mjj-jrpg-primary); background: var(--mjj-jrpg-surface-raised); } .jrpg-turn-navigation button:disabled { color: var(--mjj-jrpg-text-muted); cursor: not-allowed; opacity: var(--zenbu-sys-opacity-disabled); } .jrpg-turn-navigation [data-turn-position] { justify-self: center; color: var(--mjj-jrpg-text-muted); font-size: var(--zenbu-sys-font-size-xs); letter-spacing: 0.08em; } .jrpg-utility { grid-area: utility; display: grid; grid-template-rows: minmax(0, 1fr); gap: 0; padding: var(--zenbu-sys-padding-md); background: var(--mjj-jrpg-surface); overflow: hidden; } .jrpg-utility > mjj-jrpg-preview { box-sizing: border-box; width: 100%; height: 100%; min-height: 0; min-width: 0; } .jrpg-brand { display: flex; align-items: end; justify-content: space-between; gap: var(--zenbu-sys-space-control); padding: 0 var(--zenbu-sys-padding-sm) var(--zenbu-sys-padding-sm); border-bottom: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); } body.jrpg-page .jrpg-brand header { width: auto; max-width: none; margin: 0; padding: 0; text-align: left; } body.jrpg-page .jrpg-brand header h1 { margin: 0; color: var(--mjj-jrpg-primary); font-size: var(--zenbu-sys-font-size-2xl); letter-spacing: 0; text-shadow: var(--zenbu-sys-space-icon-label) var(--zenbu-sys-space-icon-label) 0 var(--mjj-jrpg-accent); } .jrpg-brand > p { margin: 0; color: var(--mjj-jrpg-highlight); text-align: right; } mjj-jrpg-preview { display: block; min-height: 0; } .jrpg-workspace > .jrpg-brand header h1 { font-size: clamp( var(--zenbu-sys-font-size-xs), 0.95vw, var(--zenbu-sys-font-size-sm) ); line-height: 1; white-space: nowrap; } .jrpg-preview-panel { display: block; height: 100%; padding: var(--zenbu-sys-padding-lg); background: linear-gradient( 135deg, var(--mjj-jrpg-surface-raised), var(--mjj-jrpg-surface) ); box-shadow: inset 0 0 0 var(--zenbu-sys-stroke-width) var(--mjj-jrpg-accent); } .jrpg-preview-panel > :is(.jrpg-preview-content, mjj-conversation-archive) { box-sizing: border-box; width: 100%; height: 100%; min-width: 0; min-height: 0; } .jrpg-preview-content { display: grid; grid-template-rows: auto auto minmax(0, 1fr) auto; gap: var(--zenbu-sys-space-group); } .jrpg-preview-content[hidden] { display: none; } .jrpg-preview-panel h2, .jrpg-preview-panel p { margin: 0; } .jrpg-preview-panel h2 { color: var(--mjj-jrpg-primary); } .jrpg-preview-content > p { color: var(--mjj-jrpg-text); } .jrpg-work-showcase { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); align-content: start; gap: var(--zenbu-sys-space-control); min-height: 0; margin: 0; padding: 0; overflow-y: auto; list-style: none; } .jrpg-work-showcase a { display: grid; gap: var(--zenbu-sys-space-icon-label); height: 100%; padding: var(--zenbu-sys-padding-sm); border: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); background: var(--mjj-jrpg-panel); color: var(--mjj-jrpg-primary); text-decoration: none; } .jrpg-work-showcase a:hover, .jrpg-work-showcase a:focus-visible { border-color: var(--mjj-jrpg-accent); background: var(--mjj-jrpg-surface-raised); } .jrpg-work-showcase small { color: var(--mjj-jrpg-text-muted); font-size: var(--zenbu-sys-font-size-xs); } .jrpg-work-showcase a:has(> zen-icon) { grid-template-columns: auto minmax(0, 1fr); } .jrpg-work-showcase a > zen-icon { grid-row: 1 / 3; align-self: center; color: var(--mjj-jrpg-highlight); } .jrpg-preview-dialog > zen-button > button, .jrpg-preview-dialog dialog zen-button > :where(button, a) { width: 100%; border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); border-radius: 0; background: var(--mjj-jrpg-primary); color: var(--mjj-jrpg-primary-foreground); cursor: pointer; } .jrpg-preview-dialog > zen-button > button:hover, .jrpg-preview-dialog dialog zen-button > :where(button, a):hover { border-color: var(--mjj-jrpg-primary-hover); background: var(--mjj-jrpg-primary-hover); } .jrpg-preview-dialog dialog { box-sizing: border-box; width: min(82vw, 46rem); max-width: calc(100% - var(--zenbu-sys-space-content)); } .jrpg-dialog-heading { display: flex; align-items: center; justify-content: space-between; gap: var(--zenbu-sys-space-group); } .jrpg-dialog-heading p, .jrpg-preview-dialog dialog > p { margin: 0; } .jrpg-dialog-heading zen-button { width: auto; } .jrpg-dialog-heading-actions { display: flex; align-items: center; gap: var(--zenbu-sys-space-control); } .jrpg-dialog-heading zen-button > :where(button, a) { box-sizing: border-box; width: auto; min-width: var(--zenbu-control-height); height: var(--zenbu-control-height); padding: var(--zenbu-control-padding-block) var(--zenbu-control-padding-inline); border-color: var(--mjj-jrpg-accent); background: var(--mjj-jrpg-surface); color: var(--mjj-jrpg-text); } .jrpg-dialog-heading zen-button > button { width: var(--zenbu-control-height); padding: 0; } .jrpg-preview-dialog dialog.jrpg-detail-dialog { width: min(92vw, 60rem); max-height: calc(100dvh - var(--zenbu-sys-space-container)); overflow: hidden; } .jrpg-preview-dialog dialog.jrpg-detail-dialog[open] { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; gap: var(--zenbu-sys-space-group); } mjj-window-modal .jrpg-detail-content { box-sizing: border-box; height: 100%; min-height: 0; padding: var(--zenbu-sys-padding-lg); } mjj-content-modal .jrpg-detail-content { padding: var(--zenbu-sys-padding-lg); } .jrpg-preview-dialog dialog.jrpg-detail-dialog[data-detail-mode="tools"] { width: min(90vw, 56rem); height: min(78dvh, 44rem); } .jrpg-detail-dialog[data-detail-mode="tools"] > h2 { display: none; } .jrpg-detail-dialog[data-detail-mode="tools"] .jrpg-dialog-heading { padding: var(--zenbu-sys-padding-sm); } .jrpg-resume-dossier { min-height: 0; padding: 0; overflow: auto; border: 0; background: transparent; scrollbar-color: var(--mjj-jrpg-frame) transparent; } .jrpg-resume-dossier[hidden], .jrpg-blog-browser[hidden], .jrpg-tool-browser[hidden], [data-dialog-trigger-owner][hidden], [data-dialog-copy][hidden], [data-blog-status][hidden], [data-tool-status][hidden], [data-resume-status][hidden], [data-dialog-actions][hidden], [data-resume-download][hidden] { display: none; } .jrpg-resume-dossier [data-resume-status] { margin: 0; color: var(--mjj-jrpg-highlight); } .jrpg-resume-dossier [data-resume-content] { display: grid; gap: var(--zenbu-sys-space-group); color: var(--mjj-jrpg-text); } .jrpg-resume-dossier :where(p, ul) { margin-block: 0; } .jrpg-resume-dossier .info { display: grid; gap: var(--zenbu-sys-space-control); padding: 0 0 var(--zenbu-sys-padding-lg); border: 0; border-bottom: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); background: transparent; } .jrpg-resume-dossier .info > p { color: var(--mjj-jrpg-primary); font-size: var(--zenbu-sys-font-size-xl); } .jrpg-resume-dossier .header-address-style, .jrpg-resume-dossier .header-social-style { display: flex; flex-wrap: wrap; gap: var(--zenbu-sys-space-control); color: var(--mjj-jrpg-text-muted); } .jrpg-resume-dossier .sub-header { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: var(--zenbu-sys-space-control); margin-top: var(--zenbu-sys-space-content); } .jrpg-resume-dossier .sub-header h2 { margin: 0; color: var(--mjj-jrpg-highlight); font-size: var(--zenbu-sys-font-size-lg); text-transform: uppercase; } .jrpg-resume-dossier .sub-header .line { height: var(--zenbu-sys-stroke-width-emphasis); background: var(--mjj-jrpg-accent); } .jrpg-resume-dossier .flex-box { display: flex; align-items: baseline; justify-content: space-between; gap: var(--zenbu-sys-space-control); padding-top: var(--zenbu-sys-padding-sm); border-top: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); } .jrpg-resume-dossier .entry-title-style, .jrpg-resume-dossier .entry-position-style { color: var(--mjj-jrpg-primary); } .jrpg-resume-dossier .entry-location-style, .jrpg-resume-dossier .entry-date-style, .jrpg-resume-dossier .skill-type-style { color: var(--mjj-jrpg-text-muted); text-align: right; } .jrpg-resume-dossier .description-style { display: grid; gap: var(--zenbu-sys-space-control); padding-left: var(--zenbu-sys-padding-xl); } .jrpg-resume-dossier a { color: var(--mjj-jrpg-primary); text-decoration-color: var(--mjj-jrpg-accent); text-underline-offset: var(--zenbu-sys-space-icon-label); } .jrpg-resume-dossier a[href="/public/resume.pdf"] { display: none; } .jrpg-dialog-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--zenbu-sys-space-control); } :is(.jrpg-blog-browser, .jrpg-tool-browser) { display: grid; grid-template-columns: minmax(12rem, 0.35fr) minmax(0, 1fr); gap: var(--zenbu-sys-space-group); min-height: 0; overflow: hidden; } :is(.jrpg-blog-browser, .jrpg-tool-browser) > aside, :is(.jrpg-blog-browser, .jrpg-tool-browser) > article { min-height: 0; padding: var(--zenbu-sys-padding-md); overflow: auto; border: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); background: var(--mjj-jrpg-surface-sunken); scrollbar-color: var(--mjj-jrpg-frame) transparent; } .jrpg-tool-browser { display: block; height: 100%; } .jrpg-tool-browser > article { height: 100%; padding: 0; overflow: hidden; border: 0; background: transparent; } .jrpg-tool-browser [data-tool-content], .jrpg-functional-tool, .jrpg-tool-panes { height: 100%; min-height: 0; } :is(.jrpg-blog-browser, .jrpg-tool-browser) h3, .jrpg-blog-browser [data-blog-status], .jrpg-tool-browser [data-tool-status] { margin-top: 0; color: var(--mjj-jrpg-highlight); } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-list], [data-tool-list]) { display: grid; gap: var(--zenbu-sys-space-control); margin: 0; padding: 0; list-style: none; } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-list], [data-tool-list]) zen-button, :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-list], [data-tool-list]) button { width: 100%; } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-list], [data-tool-list]) button { display: grid; justify-items: start; gap: var(--zenbu-sys-space-icon-label); border: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); border-radius: 0; background: var(--mjj-jrpg-panel); color: var(--mjj-jrpg-primary); text-align: left; cursor: pointer; } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-list], [data-tool-list]) button:hover, :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-list], [data-tool-list]) button[aria-pressed="true"] { border-color: var(--mjj-jrpg-accent); background: var(--mjj-jrpg-surface-raised); } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-list], [data-tool-list]) small { color: var(--mjj-jrpg-text-muted); font-size: var(--zenbu-sys-font-size-xs); } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-content], [data-tool-content]) { color: var(--mjj-jrpg-text); line-height: var(--zenbu-sys-line-height-lg); } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-content], [data-tool-content]) :where(h1, h2, h3, h4) { color: var(--mjj-jrpg-primary); } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-content], [data-tool-content]) a { color: var(--mjj-jrpg-primary); text-decoration-color: var(--mjj-jrpg-accent); text-underline-offset: var(--zenbu-sys-space-icon-label); } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-content], [data-tool-content]) :where(img, video) { display: block; max-width: 100%; height: auto; margin-inline: auto; } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-content], [data-tool-content]) :where(pre, blockquote) { max-width: 100%; padding: var(--zenbu-sys-padding-md); overflow: auto; border-left: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-accent); background: var(--mjj-jrpg-panel); } :is(.jrpg-blog-browser, .jrpg-tool-browser) :is([data-blog-content], [data-tool-content]) code { color: var(--mjj-jrpg-success); white-space: pre-wrap; overflow-wrap: anywhere; } .jrpg-tool-readonly-note { padding: var(--zenbu-sys-padding-sm); border: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-highlight); background: var(--mjj-jrpg-panel); color: var(--mjj-jrpg-highlight); } .jrpg-functional-tool { min-height: 100%; } .jrpg-functional-tool [hidden] { display: none; } .jrpg-tool-panes { box-sizing: border-box; display: grid; grid-template-columns: minmax(0, 1fr); grid-template-rows: repeat(2, minmax(18rem, auto)); gap: var(--zenbu-sys-space-control); height: auto; min-height: 0; padding: var(--zenbu-sys-padding-sm); } .jrpg-tool-panes::before { display: none; } .jrpg-tool-window:first-of-type { grid-column: 1; grid-row: 1; } .jrpg-tool-window:last-of-type { grid-column: 1; grid-row: 2; } .jrpg-tool-pane { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; align-content: start; gap: var(--zenbu-sys-space-control); min-width: 0; min-height: 0; padding: var(--zenbu-sys-padding-md); overflow: auto; border: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); background: var(--mjj-jrpg-panel); } .jrpg-tool-window { border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-primary); box-shadow: inset 0 0 0 var(--zenbu-sys-stroke-width) var(--mjj-jrpg-info), 0 0 0 var(--zenbu-sys-stroke-width-emphasis) var(--mjj-jrpg-accent), 0 0 var(--zenbu-sys-space-control) color-mix(in srgb, var(--mjj-jrpg-info) 68%, transparent); } .jrpg-tool-pane h2, .jrpg-tool-pane-heading { margin: 0; color: var(--mjj-jrpg-primary); } .jrpg-tool-pane h2 { display: flex; align-items: center; gap: var(--zenbu-sys-space-icon-label); } .jrpg-tool-pane h2 zen-icon { color: var(--mjj-jrpg-highlight); } .jrpg-tool-pane-heading { display: flex; align-items: baseline; justify-content: space-between; gap: var(--zenbu-sys-space-control); } .jrpg-tool-pane-heading h2 { margin: 0; } .jrpg-functional-tool zen-field[appearance="plain"] { display: grid; grid-template-rows: auto minmax(0, 1fr); gap: var(--zenbu-sys-space-icon-label); min-height: 0; } .jrpg-functional-tool :where(input, textarea) { box-sizing: border-box; width: 100%; min-height: var(--zenbu-control-height); padding: var(--zenbu-control-padding-block) var(--zenbu-control-padding-inline); border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); border-radius: 0; background: var(--mjj-jrpg-surface-sunken); color: var(--mjj-jrpg-text); font: inherit; } .jrpg-functional-tool textarea { height: 100%; min-height: 22rem; resize: vertical; } .jrpg-functional-tool zen-button > :where(button, a) { width: 100%; border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); border-radius: 0; background: var(--mjj-jrpg-primary); color: var(--mjj-jrpg-primary-foreground); cursor: pointer; } .jrpg-functional-tool zen-button > :where(button, a):hover { border-color: var(--mjj-jrpg-primary-hover); background: var(--mjj-jrpg-primary-hover); } .jrpg-functional-tool button:disabled { opacity: var(--zenbu-sys-opacity-disabled); cursor: not-allowed; } .jrpg-tool-actions { display: flex; gap: var(--zenbu-sys-space-control); } .jrpg-tool-actions zen-button { flex: 1; } .jrpg-tool-status { margin-top: 0; padding: var(--zenbu-sys-padding-sm); border-left: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-info); background: var(--mjj-jrpg-panel); color: var(--mjj-jrpg-text); } .jrpg-tool-status[data-state="ready"] { border-left-color: var(--mjj-jrpg-success); color: var(--mjj-jrpg-success); } .jrpg-tool-status[data-state="working"] { border-left-color: var(--mjj-jrpg-highlight); color: var(--mjj-jrpg-highlight); } .jrpg-tool-status[data-state="error"] { border-left-color: var(--mjj-jrpg-accent); color: var(--mjj-jrpg-accent); } .jrpg-markdown-output { min-height: 22rem; padding: var(--zenbu-sys-padding-md); overflow: auto; border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); background: var(--mjj-jrpg-surface-sunken); } .jrpg-markdown-output :where(h1, h2, h3) { color: var(--mjj-jrpg-primary); } .jrpg-markdown-output code { color: var(--mjj-jrpg-success); } .jrpg-functional-tool :where(video, iframe) { width: 100%; min-height: 22rem; border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); background: var(--mjj-jrpg-canvas); } .jrpg-tool-details { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--zenbu-sys-space-control); margin: 0; } .jrpg-tool-details div { padding: var(--zenbu-sys-padding-sm); border: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); } .jrpg-tool-details dd { margin: var(--zenbu-sys-space-icon-label) 0 0; color: var(--mjj-jrpg-success); } .jrpg-functional-tool [data-converter-download] { color: var(--mjj-jrpg-primary); text-decoration-color: var(--mjj-jrpg-accent); } mjj-composer { grid-area: composer; display: block; min-height: 0; padding: var(--zenbu-sys-padding-md); background: var(--mjj-jrpg-surface); } .jrpg-composer textarea::placeholder { color: var(--mjj-jrpg-text-muted); } .jrpg-page :where(a, button, textarea):focus-visible { outline: var(--zenbu-sys-focus-width) solid var(--mjj-jrpg-focus); outline-offset: var(--zenbu-sys-focus-offset); } mjj-jrpg-menu { grid-area: menu; display: block; padding: var(--zenbu-sys-padding-md); background: var(--mjj-jrpg-surface-sunken); } mjj-jrpg-menu nav { display: grid; grid-template-columns: auto 1fr; align-items: center; gap: var(--zenbu-sys-space-group); height: 100%; } .jrpg-menu-label { margin: 0; writing-mode: vertical-rl; } mjj-jrpg-menu ul { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--zenbu-sys-space-control); margin: 0; padding: 0; list-style: none; } mjj-jrpg-menu zen-button, mjj-jrpg-menu button { width: 100%; } mjj-jrpg-menu button { justify-content: start; border: var(--zenbu-sys-stroke-width) solid transparent; border-radius: 0; background: transparent; color: var(--mjj-jrpg-text); cursor: pointer; } mjj-jrpg-menu button:hover { border-color: var(--mjj-jrpg-accent); color: var(--mjj-jrpg-primary-hover); } mjj-jrpg-menu button[aria-pressed="true"] { border-color: var(--mjj-jrpg-frame); background: var(--mjj-jrpg-surface-raised); color: var(--mjj-jrpg-primary); } mjj-jrpg-menu button zen-icon { opacity: 0; } mjj-jrpg-menu button[aria-pressed="true"] zen-icon { opacity: 1; } .jrpg-workspace > :is( .jrpg-scene, .jrpg-utility, mjj-composer, mjj-jrpg-menu ), .jrpg-scene > mjj-jrpg-chat, .jrpg-utility > mjj-jrpg-preview > .jrpg-preview-panel { border: 0; background-color: transparent; box-shadow: none; } .jrpg-workspace > .jrpg-scene { background-image: none; } .jrpg-workspace > mjj-composer, .jrpg-workspace > mjj-jrpg-menu { padding: var(--zenbu-sys-padding-sm); } .jrpg-workspace > mjj-composer textarea { min-height: 0; } .jrpg-scene .jrpg-message, .jrpg-scene .jrpg-turn-navigation, .jrpg-brand, .jrpg-work-showcase a, .jrpg-preview-content > .jrpg-preview-dialog > zen-button > button, mjj-jrpg-menu nav button { border: 0; } @media (max-width: 52rem), (max-height: 40rem), (min-aspect-ratio: 2 / 1) { .jrpg-page { overflow-y: auto; } .jrpg-main { height: auto; min-height: 100dvh; padding: 0; } .jrpg-shell { height: auto; min-height: 100dvh; } .jrpg-workspace { display: grid; grid-template: "brand" auto "scene" auto "utility" auto "menu" auto "composer" auto "telemetry" auto / minmax(0, 1fr); gap: var(--zenbu-sys-space-group); width: 100%; max-height: none; height: auto; aspect-ratio: auto; min-height: 0; background-size: cover; } .jrpg-workspace > .jrpg-scene, .jrpg-workspace > .jrpg-utility, .jrpg-workspace > mjj-composer, .jrpg-workspace > mjj-jrpg-menu, .jrpg-workspace > .jrpg-brand, .jrpg-workspace > .jrpg-frame-controls, .jrpg-workspace > .jrpg-frame-telemetry { position: relative; inset: auto; width: auto; height: auto; } .jrpg-workspace > .jrpg-brand { grid-area: brand; justify-self: start; padding: var(--zenbu-sys-padding-sm); background: transparent; box-shadow: none; } .jrpg-workspace > .jrpg-frame-controls { grid-area: brand; justify-self: end; align-self: center; display: flex; gap: var(--zenbu-sys-space-icon-label); } .jrpg-frame-controls zen-button, .jrpg-frame-controls :where(button, a) { width: var(--zenbu-control-height); height: var(--zenbu-control-height); } .jrpg-frame-controls :where(button, a) { background: var(--mjj-jrpg-surface-raised); color: var(--mjj-jrpg-text); } .jrpg-frame-controls zen-icon { opacity: 1; } .jrpg-workspace > .jrpg-frame-telemetry { grid-area: telemetry; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--zenbu-sys-space-control); padding: var(--zenbu-sys-padding-sm); background: var(--mjj-jrpg-surface-sunken); } .jrpg-frame-telemetry > * { position: static; justify-self: start; background: transparent; transform: none; } .jrpg-scene { min-height: 34rem; } .jrpg-utility { min-height: 27rem; overflow: hidden; } mjj-jrpg-menu nav { grid-template-columns: 1fr; } .jrpg-menu-label { writing-mode: initial; } mjj-jrpg-menu ul { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 34rem) { .jrpg-main { padding: 0; } .jrpg-scene { grid-template-columns: 1fr; grid-template-rows: minmax(12rem, 0.6fr) minmax(20rem, 1fr); min-height: 42rem; padding: var(--zenbu-sys-padding-md); } mjj-jrpg-character { justify-self: center; width: min(15rem, 65%); } mjj-jrpg-character img { max-height: 15rem; } .jrpg-brand { align-items: center; } .jrpg-composer { grid-template-columns: 1fr; grid-template-rows: minmax(calc(var(--zenbu-control-height) * 3), 1fr) auto auto; } .jrpg-composer-actions { grid-column: 1; grid-row: 2; flex-direction: row; } .jrpg-composer-hint { grid-row: 3; } .jrpg-composer-actions zen-button { flex: 1; } .jrpg-work-showcase, .jrpg-dialog-actions { grid-template-columns: 1fr; } .jrpg-resume-dossier .flex-box { display: grid; } .jrpg-resume-dossier .entry-location-style, .jrpg-resume-dossier .entry-date-style, .jrpg-resume-dossier .skill-type-style { text-align: left; } .jrpg-composer zen-button > button { width: 100%; } :is(.jrpg-blog-browser, .jrpg-tool-browser) { grid-template-columns: 1fr; overflow: auto; } :is(.jrpg-blog-browser, .jrpg-tool-browser) > aside { max-height: 16rem; } .jrpg-tool-panes { grid-template-columns: 1fr; grid-template-rows: minmax(24rem, auto) calc(var(--zenbu-sys-space-container) * 2) minmax(24rem, auto); overflow: auto; } .jrpg-tool-panes::before { grid-column: 1; grid-row: 2; background-image: radial-gradient( circle at var(--zenbu-sys-space-content) 50%, var(--mjj-jrpg-highlight) 0 var(--zenbu-sys-stroke-width-emphasis), var(--mjj-jrpg-frame) var(--zenbu-sys-stroke-width-emphasis) calc(var(--zenbu-sys-stroke-width-emphasis) * 2), transparent calc(var(--zenbu-sys-stroke-width-emphasis) * 2) ), radial-gradient( circle at calc(100% - var(--zenbu-sys-space-content)) 50%, var(--mjj-jrpg-highlight) 0 var(--zenbu-sys-stroke-width-emphasis), var(--mjj-jrpg-frame) var(--zenbu-sys-stroke-width-emphasis) calc(var(--zenbu-sys-stroke-width-emphasis) * 2), transparent calc(var(--zenbu-sys-stroke-width-emphasis) * 2) ), linear-gradient( var(--mjj-jrpg-surface-sunken), var(--mjj-jrpg-surface-raised) 45%, var(--mjj-jrpg-frame) 50%, var(--mjj-jrpg-surface-raised) 55%, var(--mjj-jrpg-surface-sunken) ), var(--mjj-jrpg-art); } .jrpg-tool-window:first-of-type { grid-column: 1; grid-row: 1; } .jrpg-tool-window:last-of-type { grid-column: 1; grid-row: 3; } .jrpg-tool-pane { min-height: 24rem; } mjj-jrpg-menu ul { grid-template-columns: repeat(2, minmax(0, 1fr)); } .jrpg-preview-dialog dialog { width: calc(100% - var(--zenbu-sys-space-group)); max-width: none; padding: var(--zenbu-sys-padding-lg); } } @media (prefers-reduced-motion: reduce) { mjj-jrpg-character img, .jrpg-preview-dialog dialog[open] { animation: none; } } .jrpg-page, .jrpg-page * { scrollbar-color: var(--mjj-jrpg-primary) transparent; scrollbar-width: thin; } .jrpg-page::-webkit-scrollbar, .jrpg-page *::-webkit-scrollbar { width: var(--zenbu-sys-space-related); height: var(--zenbu-sys-space-related); } .jrpg-page::-webkit-scrollbar-track, .jrpg-page *::-webkit-scrollbar-track { background: transparent; } .jrpg-page::-webkit-scrollbar-thumb, .jrpg-page *::-webkit-scrollbar-thumb { border: 0; border-radius: 0; background: var(--mjj-jrpg-primary); } .jrpg-page::-webkit-scrollbar-button, .jrpg-page *::-webkit-scrollbar-button { display: none; } /* ================================================================ Archive component — placed in utility panel (top-right) ================================================================ */ mjj-jrpg-chat { grid-column: 2; grid-row: 1; } mjj-conversation-archive { display: grid; grid-template-rows: auto auto minmax(0, 1fr) auto auto; align-self: stretch; min-height: 0; padding: 0; overflow: hidden; background: transparent; box-shadow: none; } mjj-conversation-archive[hidden] { display: none; } .jrpg-archive-heading { display: flex; align-items: baseline; justify-content: space-between; gap: var(--zenbu-sys-space-group); padding-bottom: var(--zenbu-sys-padding-sm); border-bottom: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); } .jrpg-archive-heading h2 { margin: 0; color: var(--mjj-jrpg-text); font-size: var(--zenbu-sys-font-size-lg); } .jrpg-archive-heading zen-button { flex-shrink: 0; } .jrpg-archive-heading zen-button > button { border: 0; border-radius: 0; background: transparent; color: var(--mjj-jrpg-text-muted); cursor: pointer; } .jrpg-archive-actions { display: flex; gap: var(--zenbu-sys-space-control); padding-block: var(--zenbu-sys-padding-sm); border-bottom: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); } .jrpg-archive-actions zen-button, .jrpg-archive-actions button { width: 100%; } .jrpg-archive-actions button { border: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); border-radius: 0; background: var(--mjj-jrpg-panel); color: var(--mjj-jrpg-primary); cursor: pointer; } .jrpg-archive-actions button:hover { border-color: var(--mjj-jrpg-accent); background: var(--mjj-jrpg-surface-raised); } .jrpg-archive-list { display: grid; align-content: start; gap: var(--zenbu-sys-space-icon-label); min-height: 0; margin: 0; padding: var(--zenbu-sys-padding-sm) 0; overflow-y: auto; list-style: none; scrollbar-color: var(--mjj-jrpg-frame) transparent; } .jrpg-archive-list [data-conv-item] { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: var(--zenbu-sys-space-icon-label); padding: var(--zenbu-sys-padding-sm); border: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); background: var(--mjj-jrpg-panel); } .jrpg-archive-list [data-conv-open] { display: grid; gap: 0.1em; min-width: 0; border: 0; border-radius: 0; background: transparent; color: var(--mjj-jrpg-primary); cursor: pointer; text-align: left; } .jrpg-archive-list [data-conv-open][aria-current="true"] { color: var(--mjj-jrpg-highlight); } .jrpg-archive-list [data-conv-item]:has([data-conv-open][aria-current="true"]) { border-color: var(--mjj-jrpg-accent); background: var(--mjj-jrpg-surface-raised); } .jrpg-archive-list [data-conv-item]:hover { border-color: var(--mjj-jrpg-frame); background: var(--mjj-jrpg-surface-raised); } .jrpg-archive-list [data-conv-title] { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: var(--zenbu-sys-font-size-sm); } .jrpg-archive-list [data-conv-meta] { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--mjj-jrpg-text-muted); font-size: var(--zenbu-sys-font-size-xs); } .jrpg-archive-item-actions { display: flex; gap: var(--zenbu-sys-space-icon-label); flex-shrink: 0; } .jrpg-archive-item-actions button { border: 0; border-radius: 0; background: transparent; color: var(--mjj-jrpg-text-muted); cursor: pointer; font-size: var(--zenbu-sys-font-size-xs); } .jrpg-archive-item-actions button:hover { color: var(--mjj-jrpg-accent); } [data-archive-load-more-owner] { padding-block: var(--zenbu-sys-padding-sm); } [data-archive-load-more-owner][hidden] { display: none; } [data-archive-load-more-owner] > button { width: 100%; border: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); border-radius: 0; background: var(--mjj-jrpg-panel); color: var(--mjj-jrpg-text-muted); cursor: pointer; } [data-archive-load-more-owner] > button:hover { border-color: var(--mjj-jrpg-frame); color: var(--mjj-jrpg-primary); } .jrpg-archive-status { margin: 0; padding: var(--zenbu-sys-padding-sm) 0; color: var(--mjj-jrpg-text-muted); font-size: var(--zenbu-sys-font-size-xs); } .jrpg-archive-status[hidden] { display: none; } .jrpg-archive-status[data-state="error"] { color: var(--mjj-jrpg-accent); } .jrpg-archive-status button { border: 0; border-radius: 0; background: transparent; color: var(--mjj-jrpg-info); cursor: pointer; font-size: inherit; text-decoration: underline; } /* Archive dialogs */ .jrpg-archive-dialog { box-sizing: border-box; min-width: min(22rem, calc(100vw - var(--zenbu-sys-space-content))); max-width: min(26rem, calc(100vw - var(--zenbu-sys-space-content))); } mjj-window-modal [data-archive-rename-dialog] { height: auto; } .jrpg-archive-dialog-title { margin: 0; color: var(--mjj-jrpg-primary); font-size: var(--zenbu-sys-font-size-md); } .jrpg-archive-dialog-subtitle { margin: 0; color: var(--mjj-jrpg-text-muted); font-size: var(--zenbu-sys-font-size-xs); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .jrpg-archive-dialog-actions { display: flex; justify-content: flex-end; gap: var(--zenbu-sys-space-control); } .jrpg-archive-dialog zen-button > button { border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); border-radius: 0; background: var(--mjj-jrpg-surface); color: var(--mjj-jrpg-text); cursor: pointer; } .jrpg-archive-dialog zen-button > button:hover { border-color: var(--mjj-jrpg-accent); background: var(--mjj-jrpg-surface-raised); } .jrpg-archive-dialog zen-field[appearance="plain"] { display: grid; gap: var(--zenbu-sys-space-icon-label); } .jrpg-archive-dialog input { box-sizing: border-box; width: 100%; min-height: var(--zenbu-control-height); padding: var(--zenbu-control-padding-block) var(--zenbu-control-padding-inline); border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); border-radius: 0; background: var(--mjj-jrpg-surface-sunken); color: var(--mjj-jrpg-text); font: inherit; } /* Account slot — telemetry child 2 */ [data-frame-account] a, [data-frame-account] button, [data-frame-account] span[data-account-user] { color: var(--mjj-jrpg-primary); font-size: inherit; } [data-frame-account] a { text-decoration: none; } [data-frame-account] a:hover { text-decoration: underline; text-decoration-color: var(--mjj-jrpg-accent); } [data-frame-account] button { border: 0; background: transparent; cursor: pointer; padding: 0; font: inherit; } [data-frame-account] button:hover { color: var(--mjj-jrpg-accent); } /* Quota display in composer */ .jrpg-composer-quota { grid-column: 1 / -1; margin: 0; color: var(--mjj-jrpg-text-muted); font-size: var(--zenbu-sys-font-size-xs); } .jrpg-composer-quota[data-state="warning"] { color: var(--mjj-jrpg-highlight); } .jrpg-composer-quota[data-state="exhausted"] { color: var(--mjj-jrpg-accent); } .jrpg-composer-quota[hidden] { display: none; } /* Archive + chat grid in mobile single-column layout */ @media (max-width: 34rem) { mjj-jrpg-chat, mjj-conversation-archive { grid-column: 1; grid-row: 2; } } @media (forced-colors: active) { .jrpg-workspace, .jrpg-scene, .jrpg-scene::before { background-image: none; } } /* ================================================================ Mobile hamburger button — hidden on desktop, used in portrait ================================================================ */ .jrpg-mobile-menu-btn { display: none; } .jrpg-mobile-destination-owner { display: contents; } .jrpg-page zen-button[hidden] { display: none; } /* ================================================================ Mobile portrait frame layout (≤52rem + portrait) Overrides the generic stacked grid from the 52rem breakpoint. All geometry custom properties are centralised in .jrpg-shell. ================================================================ */ @media (max-width: 52rem) and (orientation: portrait) { .jrpg-shell { /* ── Aperture geometry: (inline=left%, block=top%, width%, height%) ── */ /* Main conversation */ --mjj-mobile-scene-inline: 4.8%; --mjj-mobile-scene-block: 7.3%; --mjj-mobile-scene-width: 90.4%; --mjj-mobile-scene-height: 71.2%; /* Composer */ --mjj-mobile-composer-inline: 4.8%; --mjj-mobile-composer-block: 79.6%; --mjj-mobile-composer-width: 90.4%; --mjj-mobile-composer-height: 17.7%; /* Baked hamburger overlay */ --mjj-mobile-hamburger-inline: 87.2%; --mjj-mobile-hamburger-block: 1.3%; --mjj-mobile-hamburger-width: 9.4%; --mjj-mobile-hamburger-height: 5.3%; height: 100dvh; min-height: 0; } .jrpg-page { overflow: hidden; } .jrpg-main { height: 100dvh; min-height: 0; padding: 0; } /* Workspace: switch from stacked grid back to absolute-positioned frame */ .jrpg-workspace { display: block; position: relative; width: 100%; height: 100%; min-height: 0; overflow: hidden; background-image: url("/public/jrpg/background-frame-mobile.webp"); background-position: top left; background-size: 100% 100%; background-repeat: no-repeat; } /* Desktop window controls are irrelevant on mobile portrait */ .jrpg-workspace > .jrpg-frame-controls { display: none; } /* Restore absolute positioning for the two frame apertures */ .jrpg-workspace > .jrpg-scene, .jrpg-workspace > mjj-composer { position: absolute; width: auto; height: auto; } /* Scene aperture */ .jrpg-workspace > .jrpg-scene { inset: var(--mjj-mobile-scene-block) auto auto var(--mjj-mobile-scene-inline); width: var(--mjj-mobile-scene-width); height: var(--mjj-mobile-scene-height); min-height: 0; font-size: clamp( var(--zenbu-sys-font-size-xs), 2.8vw, var(--zenbu-sys-font-size-sm) ); } /* Composer aperture */ .jrpg-workspace > mjj-composer { inset: var(--mjj-mobile-composer-block) auto auto var(--mjj-mobile-composer-inline); width: var(--mjj-mobile-composer-width); height: var(--mjj-mobile-composer-height); font-size: clamp( var(--zenbu-sys-font-size-xs), 2.8vw, var(--zenbu-sys-font-size-sm) ); } .jrpg-workspace > :is(.jrpg-utility, mjj-jrpg-menu) { display: none; } .jrpg-workspace > .jrpg-brand { position: absolute; z-index: 4; inset: 1.3% auto auto 50%; display: grid; place-items: center; width: max-content; max-width: 68%; height: 5.3%; padding: 0; border: 0; background: transparent; box-shadow: none; text-align: center; transform: translateX(-50%); } body.jrpg-page .jrpg-brand header { width: 100%; text-align: center; } body.jrpg-page .jrpg-brand header h1 { font-size: var(--zenbu-sys-font-size-sm); text-shadow: none; } /* Hamburger button: transparent overlay over baked art */ .jrpg-mobile-destination-owner > zen-dialog > .jrpg-mobile-menu-btn { display: grid; place-items: center; position: absolute; z-index: 5; inset: var(--mjj-mobile-hamburger-block) auto auto var(--mjj-mobile-hamburger-inline); width: var(--mjj-mobile-hamburger-width); height: var(--mjj-mobile-hamburger-height); } .jrpg-mobile-menu-btn > button { width: 100%; height: 100%; padding: 0; border: 0; border-radius: 0; background: transparent; color: transparent; cursor: pointer; } .jrpg-mobile-menu-btn zen-icon { opacity: 0; } .jrpg-mobile-menu-btn > button:focus-visible { outline-color: var(--mjj-jrpg-focus); outline-style: solid; outline-width: 2px; outline-offset: 2px; color: var(--mjj-jrpg-primary); } .jrpg-mobile-menu-btn > button:focus-visible zen-icon { opacity: 0.5; } .jrpg-workspace > .jrpg-frame-telemetry { display: none; } .jrpg-mobile-destination-dialog { box-sizing: border-box; width: calc(100% - var(--zenbu-sys-space-content)); max-width: 42rem; height: min(88dvh, 48rem); max-height: calc(100dvh - var(--zenbu-sys-space-content)); margin: auto; padding: var(--zenbu-sys-padding-md); border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); border-radius: 0; background: var(--mjj-jrpg-surface); color: var(--mjj-jrpg-text); box-shadow: inset 0 0 0 var(--zenbu-sys-stroke-width) var(--mjj-jrpg-accent), var(--zenbu-sys-space-control) var(--zenbu-sys-space-control) 0 var(--mjj-jrpg-accent); } .jrpg-mobile-destination-dialog[open] { display: grid; grid-template-rows: auto minmax(0, 1fr); gap: var(--zenbu-sys-space-group); } .jrpg-mobile-destination-dialog::backdrop { background: color-mix(in srgb, var(--mjj-jrpg-canvas) 82%, transparent); } .jrpg-mobile-destination-header { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: var(--zenbu-sys-space-control); padding-bottom: var(--zenbu-sys-padding-sm); border-bottom: var(--zenbu-sys-stroke-width) solid var(--mjj-jrpg-frame-soft); } .jrpg-mobile-destination-header h2 { margin: 0; color: var(--mjj-jrpg-primary); font-size: var(--zenbu-sys-font-size-lg); text-align: center; } .jrpg-mobile-destination-header zen-button:first-child { justify-self: start; } .jrpg-mobile-destination-header zen-button:last-child { justify-self: end; } .jrpg-mobile-destination-header button { border: 0; border-radius: 0; background: transparent; color: var(--mjj-jrpg-text); cursor: pointer; } mjj-window-modal .jrpg-mobile-destination-content { min-width: 0; min-height: 0; padding: 0; overflow-x: auto; overflow-y: scroll; scrollbar-gutter: stable; } .jrpg-mobile-destination-content > :is(mjj-jrpg-menu, .jrpg-utility) { box-sizing: border-box; position: static; width: 100%; height: 100%; min-width: 0; min-height: 0; } .jrpg-mobile-destination-content > [hidden], [data-mobile-destination-back-owner][hidden] { display: none; } .jrpg-mobile-destination-content > mjj-jrpg-menu { display: block; padding: var(--zenbu-sys-padding-md); overflow-y: auto; } .jrpg-mobile-destination-content > .jrpg-utility { display: grid; padding: 0; border: 0; overflow: hidden; background: transparent; box-shadow: none; } .jrpg-mobile-destination-content .jrpg-archive-heading { display: none; } /* Compact scene internals for mobile aperture */ .jrpg-scene { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); align-items: stretch; gap: var(--zenbu-sys-space-icon-label); padding: var(--zenbu-sys-padding-sm); } .jrpg-scene > mjj-jrpg-character { display: none; } .jrpg-scene::before { display: none; } mjj-jrpg-chat { grid-column: 1; grid-row: 1; width: 100%; height: 100%; max-height: 100%; overflow: hidden; padding: var(--zenbu-sys-padding-sm); } .jrpg-preview-panel > mjj-conversation-archive { width: 100%; height: 100%; max-height: 100%; overflow: auto; } /* Composer: compact single-row within aperture */ .jrpg-workspace > mjj-composer { padding: var(--zenbu-sys-space-icon-label); } .jrpg-composer-hint { display: none; } mjj-jrpg-menu nav { height: 100%; grid-template-columns: 1fr; } mjj-jrpg-menu .jrpg-menu-label { display: none; } mjj-jrpg-menu ul { grid-template-columns: minmax(0, 1fr); gap: 0; } mjj-jrpg-menu button { min-height: var(--zenbu-control-height); padding-block: 0; padding-inline: var(--zenbu-control-padding-inline); font-size: var(--zenbu-sys-font-size-xs); } /* Preview panel compact for narrow utility aperture */ .jrpg-preview-panel { padding: var(--zenbu-sys-padding-sm); overflow-y: auto; } .jrpg-preview-content { gap: var(--zenbu-sys-space-icon-label); } .jrpg-preview-panel h2 { font-size: var(--zenbu-sys-font-size-sm); } .jrpg-preview-content > p { font-size: var(--zenbu-sys-font-size-xs); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .jrpg-work-showcase { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--zenbu-sys-space-icon-label); } .jrpg-work-showcase a { padding: var(--zenbu-sys-padding-xs, var(--zenbu-sys-padding-sm)); font-size: var(--zenbu-sys-font-size-xs); } /* Archive fits within scene aperture */ mjj-conversation-archive { padding: var(--zenbu-sys-padding-sm); } /* Scrollable message viewport fills aperture */ zen-message-scroller > .jrpg-message-viewport { scrollbar-width: thin; } } /* ================================================================ Login modal dialog ================================================================ */ .jrpg-login-dialog-owner { display: contents; } .jrpg-login-dialog { box-sizing: border-box; width: min(24rem, calc(100vw - var(--zenbu-sys-space-content))); height: auto; } .jrpg-login-dialog-header { display: flex; align-items: center; justify-content: space-between; gap: var(--zenbu-sys-space-group); } .jrpg-login-dialog-header h2 { margin: 0; color: var(--mjj-jrpg-primary); font-size: var(--zenbu-sys-font-size-lg); letter-spacing: 0.08em; } .jrpg-login-dialog-header zen-button > button { width: var(--zenbu-control-height); padding: 0; border: 0; border-radius: 0; background: transparent; color: var(--mjj-jrpg-text-muted); cursor: pointer; } .jrpg-login-dialog [data-login-error] { padding: var(--zenbu-sys-padding-sm); border-left: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-accent); background: color-mix(in srgb, var(--mjj-jrpg-accent) 10%, transparent); color: var(--mjj-jrpg-accent); font-size: var(--zenbu-sys-font-size-sm); } .jrpg-login-dialog [data-login-error][hidden] { display: none; } .jrpg-login-dialog form { display: grid; gap: var(--zenbu-sys-space-group); } .jrpg-login-dialog zen-field[appearance="plain"] { display: grid; gap: var(--zenbu-sys-space-icon-label); } .jrpg-login-dialog input { box-sizing: border-box; width: 100%; min-height: var(--zenbu-control-height); padding: var(--zenbu-control-padding-block) var(--zenbu-control-padding-inline); border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); border-radius: 0; background: var(--mjj-jrpg-surface-sunken); color: var(--mjj-jrpg-text); font: inherit; } .jrpg-login-dialog input::placeholder { color: var(--mjj-jrpg-text-muted); } .jrpg-login-dialog-actions { display: flex; justify-content: flex-end; gap: var(--zenbu-sys-space-control); } .jrpg-login-dialog zen-button > button { border: var(--zenbu-sys-stroke-width-emphasis) solid var(--mjj-jrpg-frame); border-radius: 0; background: var(--mjj-jrpg-surface); color: var(--mjj-jrpg-text); cursor: pointer; } .jrpg-login-dialog zen-button > button:hover { border-color: var(--mjj-jrpg-accent); background: var(--mjj-jrpg-surface-raised); } .jrpg-login-dialog [data-login-submit] { border-color: var(--mjj-jrpg-primary); background: var(--mjj-jrpg-primary); color: var(--mjj-jrpg-primary-foreground); } .jrpg-login-dialog [data-login-submit]:hover { border-color: var(--mjj-jrpg-primary-hover); background: var(--mjj-jrpg-primary-hover); } .jrpg-login-dialog zen-button > button:disabled { opacity: var(--zenbu-sys-opacity-disabled); cursor: not-allowed; } @media (prefers-reduced-motion: reduce) { .jrpg-login-dialog[open] { animation: none; } }