diff mrjunejune/src/public/mjj-modal.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
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrjunejune/src/public/mjj-modal.css	Sat Aug 08 02:08:08 2026 -0700
@@ -0,0 +1,360 @@
+:where(mjj-content-modal, mjj-window-modal) {
+  display: contents;
+}
+
+:where(mjj-content-modal, mjj-window-modal) dialog {
+  --mjj-modal-border: var(--zenbu-sys-color-border-strong);
+  --mjj-modal-shadow:
+    inset 0 0 0 var(--zenbu-sys-stroke-width)
+      var(--zenbu-sys-color-action-primary-border),
+    var(--zenbu-sys-space-control)
+      var(--zenbu-sys-space-control)
+      0
+      var(--zenbu-sys-color-danger-border),
+    var(--zenbu-sys-shadow-dialog);
+  box-sizing: border-box;
+  width: min(
+    calc(100vw - var(--zenbu-sys-space-container)),
+    var(--mjj-modal-width)
+  );
+  max-width: none;
+  max-height: calc(100dvh - var(--zenbu-sys-space-container));
+  margin: auto;
+  padding: 0;
+  overflow: hidden;
+  border: var(--zenbu-sys-stroke-width) solid var(--mjj-modal-border);
+  border-radius: 0;
+  background: var(--zenbu-sys-color-surface-raised);
+  color: var(--zenbu-sys-color-text-primary);
+  box-shadow: var(--mjj-modal-shadow);
+}
+
+:where(mjj-content-modal, mjj-window-modal) dialog::backdrop {
+  background: var(--zenbu-sys-color-scrim);
+  backdrop-filter: blur(var(--zenbu-sys-stroke-width-emphasis));
+}
+
+:where(mjj-content-modal, mjj-window-modal) dialog[open] {
+  display: grid;
+  grid-template-rows: auto minmax(0, 1fr) auto;
+  animation:
+    mjj-modal-enter
+    var(--zenbu-sys-motion-duration-layout)
+    var(--zenbu-sys-motion-ease-enter);
+}
+
+:where(mjj-content-modal, mjj-window-modal) [data-modal-header] {
+  display: grid;
+  grid-template-columns: minmax(0, 1fr) auto;
+  align-items: center;
+  gap: var(--zenbu-sys-space-group);
+}
+
+:where(mjj-content-modal, mjj-window-modal) [data-modal-heading] {
+  display: grid;
+  gap: var(--zenbu-sys-space-icon-label);
+  min-width: 0;
+}
+
+:where(mjj-content-modal, mjj-window-modal) [data-modal-kicker] {
+  margin: 0;
+  color: var(--zenbu-sys-color-warning-foreground);
+  font-size: var(--zenbu-sys-font-size-xs);
+  font-weight: var(--zenbu-sys-font-weight-strong);
+  letter-spacing: 0.08em;
+  text-transform: uppercase;
+}
+
+:where(mjj-content-modal, mjj-window-modal) [data-modal-title] {
+  margin: 0;
+  color: var(--zenbu-sys-color-action-primary-background);
+  font-family: var(--zenbu-sys-type-title-family);
+  font-size: var(--zenbu-sys-type-title-size);
+  font-weight: var(--zenbu-sys-type-title-weight);
+  line-height: var(--zenbu-sys-type-title-line-height);
+}
+
+:where(mjj-content-modal, mjj-window-modal) [data-modal-header-actions],
+:where(mjj-content-modal, mjj-window-modal) [data-modal-footer-actions] {
+  display: flex;
+  align-items: center;
+  gap: var(--zenbu-sys-space-control);
+}
+
+:where(mjj-content-modal, mjj-window-modal) [data-modal-header-actions] {
+  justify-content: flex-end;
+}
+
+:where(mjj-content-modal, mjj-window-modal) [data-modal-footer] {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: var(--zenbu-sys-space-group);
+}
+
+:where(mjj-content-modal, mjj-window-modal) [data-modal-footer] > p {
+  margin: 0;
+  color: var(--zenbu-sys-color-text-secondary);
+  font-size: var(--zenbu-sys-font-size-sm);
+}
+
+:where(mjj-content-modal, mjj-window-modal) zen-scroll-area[data-cyber-scroll] {
+  box-sizing: border-box;
+  display: block;
+  width: 100%;
+  height: 100%;
+  max-height: none;
+  min-width: 0;
+  min-height: 0;
+  overflow-x: auto;
+  overflow-y: scroll;
+  border: 0;
+  border-radius: 0;
+  background: var(--zenbu-sys-color-surface-default);
+  scrollbar-color:
+    var(--zenbu-sys-color-action-primary-background)
+    var(--zenbu-sys-color-surface-sunken);
+  scrollbar-width: thin;
+  scrollbar-gutter: stable;
+}
+
+:where(mjj-content-modal, mjj-window-modal)
+  zen-scroll-area[data-cyber-scroll]::-webkit-scrollbar {
+  width: var(--zenbu-sys-space-control);
+  height: var(--zenbu-sys-space-control);
+}
+
+:where(mjj-content-modal, mjj-window-modal)
+  zen-scroll-area[data-cyber-scroll]::-webkit-scrollbar-track {
+  border-inline-start: var(--zenbu-sys-stroke-width) solid
+    var(--zenbu-sys-color-info-border);
+  background: var(--zenbu-sys-color-surface-sunken);
+}
+
+:where(mjj-content-modal, mjj-window-modal)
+  zen-scroll-area[data-cyber-scroll]::-webkit-scrollbar-thumb {
+  border: var(--zenbu-sys-stroke-width) solid
+    var(--zenbu-sys-color-surface-sunken);
+  border-radius: 0;
+  background: var(--zenbu-sys-color-action-primary-background);
+}
+
+:where(mjj-content-modal, mjj-window-modal)
+  zen-scroll-area[data-cyber-scroll]::-webkit-scrollbar-thumb:hover {
+  background: var(--zenbu-sys-color-danger-foreground);
+}
+
+mjj-content-modal {
+  --mjj-modal-width: 54rem;
+}
+
+mjj-content-modal dialog {
+  --mjj-modal-border: var(--zenbu-sys-color-action-primary-border);
+}
+
+mjj-content-modal [data-modal-header] {
+  padding:
+    var(--zenbu-sys-padding-xl)
+    var(--zenbu-sys-padding-xl)
+    var(--zenbu-sys-padding-lg);
+  border-bottom: var(--zenbu-sys-stroke-width) solid
+    var(--zenbu-sys-color-danger-border);
+  background: var(--zenbu-sys-color-surface-raised);
+}
+
+mjj-content-modal [data-modal-body] {
+  min-height: 0;
+  padding: 0;
+  overflow: auto;
+  background: var(--zenbu-sys-color-surface-default);
+  color: var(--zenbu-sys-color-text-primary);
+  font-family: var(--zenbu-sys-type-reading-family);
+  font-size: var(--zenbu-sys-type-reading-size);
+  line-height: var(--zenbu-sys-type-reading-line-height);
+}
+
+mjj-content-modal [data-modal-article] {
+  display: grid;
+  gap: var(--zenbu-sys-space-content);
+  padding:
+    var(--zenbu-sys-padding-xl)
+    max(
+      var(--zenbu-sys-padding-xl),
+      calc((100% - 42rem) / 2)
+    );
+}
+
+mjj-content-modal [data-modal-article] > :where(
+  h2,
+  h3,
+  p,
+  blockquote,
+  pre,
+  ul,
+  ol
+) {
+  margin-block: 0;
+}
+
+mjj-content-modal [data-modal-body] :where(h2, h3) {
+  color: var(--zenbu-sys-color-action-primary-background);
+  font-family: var(--zenbu-sys-font-family-ui);
+}
+
+mjj-content-modal [data-modal-body] [data-modal-description] {
+  color: var(--zenbu-sys-color-text-secondary);
+  font-size: var(--zenbu-sys-type-body-large-size);
+  line-height: var(--zenbu-sys-type-body-large-line-height);
+}
+
+mjj-content-modal [data-modal-body] blockquote {
+  padding:
+    var(--zenbu-sys-padding-md)
+    var(--zenbu-sys-padding-lg);
+  border-inline-start: var(--zenbu-sys-stroke-width-emphasis) solid
+    var(--zenbu-sys-color-danger-border);
+  background: var(--zenbu-sys-color-surface-sunken);
+  color: var(--zenbu-sys-color-text-secondary);
+}
+
+mjj-content-modal [data-modal-body] pre {
+  padding: var(--zenbu-sys-padding-lg);
+  overflow: auto;
+  border: var(--zenbu-sys-stroke-width) solid
+    var(--zenbu-sys-color-info-border);
+  border-radius: 0;
+  background: var(--zenbu-sys-color-surface-sunken);
+  font-family: var(--zenbu-sys-type-code-family);
+  font-size: var(--zenbu-sys-type-code-size);
+  line-height: var(--zenbu-sys-type-code-line-height);
+}
+
+mjj-content-modal [data-modal-footer] {
+  padding:
+    var(--zenbu-sys-padding-md)
+    var(--zenbu-sys-padding-xl);
+  border-top: var(--zenbu-sys-stroke-width) solid
+    var(--zenbu-sys-color-danger-border);
+  background: var(--zenbu-sys-color-surface-raised);
+}
+
+mjj-window-modal {
+  --mjj-modal-width: 72rem;
+}
+
+mjj-window-modal dialog {
+  --mjj-modal-border: var(--zenbu-sys-color-info-border);
+  height: min(82dvh, 48rem);
+  border-radius: 0;
+}
+
+mjj-window-modal [data-modal-header] {
+  padding:
+    var(--zenbu-sys-padding-md)
+    var(--zenbu-sys-padding-lg);
+  border-bottom: var(--zenbu-sys-stroke-width) solid
+    var(--zenbu-sys-color-action-primary-border);
+  background: var(--zenbu-sys-color-surface-sunken);
+  box-shadow: var(--zenbu-sys-shadow-subtle);
+}
+
+mjj-window-modal [data-modal-body] {
+  min-width: 0;
+  min-height: 0;
+  padding: var(--zenbu-sys-padding-lg);
+  overflow: auto;
+  background: var(--zenbu-sys-color-surface-default);
+}
+
+mjj-window-modal [data-modal-body][data-modal-layout="split"] {
+  display: grid;
+  grid-template-columns: minmax(12rem, 0.32fr) minmax(0, 1fr);
+  gap: var(--zenbu-sys-space-group);
+}
+
+mjj-window-modal [data-modal-pane] {
+  min-width: 0;
+  min-height: 0;
+  padding: var(--zenbu-sys-padding-lg);
+  overflow: auto;
+  border: var(--zenbu-sys-stroke-width) solid
+    var(--zenbu-sys-color-info-border);
+  border-radius: 0;
+  background: var(--zenbu-sys-color-surface-sunken);
+}
+
+mjj-window-modal [data-modal-pane="primary"] {
+  border-color: var(--zenbu-sys-color-action-primary-border);
+  background: var(--zenbu-sys-color-surface-raised);
+  box-shadow:
+    var(--zenbu-sys-space-icon-label)
+    var(--zenbu-sys-space-icon-label)
+    0
+    var(--zenbu-sys-color-danger-border);
+}
+
+mjj-window-modal [data-modal-footer] {
+  padding:
+    var(--zenbu-sys-padding-sm)
+    var(--zenbu-sys-padding-lg);
+  border-top: var(--zenbu-sys-stroke-width) solid
+    var(--zenbu-sys-color-action-primary-border);
+  background: var(--zenbu-sys-color-surface-sunken);
+}
+
+@keyframes mjj-modal-enter {
+  0% {
+    clip-path: inset(49% 45%);
+    opacity: 0.72;
+    transform: scaleX(0.12);
+  }
+  45% {
+    clip-path: inset(49% 0);
+    opacity: 1;
+    transform: scaleX(1);
+  }
+  100% {
+    clip-path: inset(0);
+    opacity: 1;
+    transform: scaleX(1);
+  }
+}
+
+@media (max-width: 42rem) {
+  :where(mjj-content-modal, mjj-window-modal) dialog {
+    width: calc(100vw - var(--zenbu-sys-space-group));
+    max-height: calc(100dvh - var(--zenbu-sys-space-group));
+  }
+
+  mjj-content-modal [data-modal-header],
+  mjj-content-modal [data-modal-footer] {
+    padding-inline: var(--zenbu-sys-padding-lg);
+  }
+
+  mjj-content-modal [data-modal-body] {
+    padding: 0;
+  }
+
+  mjj-content-modal [data-modal-article] {
+    padding: var(--zenbu-sys-padding-lg);
+  }
+
+  mjj-window-modal dialog {
+    height: calc(100dvh - var(--zenbu-sys-space-group));
+  }
+
+  mjj-window-modal [data-modal-body][data-modal-layout="split"] {
+    grid-template-columns: minmax(0, 1fr);
+  }
+
+  :where(mjj-content-modal, mjj-window-modal) [data-modal-footer] {
+    align-items: stretch;
+    flex-direction: column;
+  }
+}
+
+@media (prefers-reduced-motion: reduce) {
+  :where(mjj-content-modal, mjj-window-modal) dialog[open] {
+    animation: none;
+  }
+}