hono-decks 1.0.4 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/advanced.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Hono } from "hono";
2
2
  import { raw } from "hono/html";
3
- import { jsx } from "hono/jsx/jsx-runtime";
3
+ import { Fragment, jsx } from "hono/jsx/jsx-runtime";
4
4
  import { HtmlEscapedCallbackPhase, resolveCallback } from "hono/utils/html";
5
5
  //#region src/source/manifest-source.ts
6
6
  function manifestDeckSource(manifest) {
@@ -440,6 +440,18 @@ function renderRegisteredComponent(name, definition, props, children, assets = [
440
440
  children: element
441
441
  });
442
442
  }
443
+ function renderJsxValueSync(value) {
444
+ const resolved = value;
445
+ if (typeof resolved === "string") return resolved;
446
+ if (resolved === null || resolved === void 0 || typeof resolved === "boolean") return "";
447
+ if (typeof resolved === "number") return String(resolved);
448
+ const html = jsx(Fragment, { children: resolved }).toString();
449
+ if (html instanceof Promise) {
450
+ html.catch(() => void 0);
451
+ throw new Error("Async Hono JSX callbacks are not supported in sync rendering.");
452
+ }
453
+ return html;
454
+ }
443
455
  async function renderJsxValue(value) {
444
456
  const resolved = value instanceof Promise ? await value : value;
445
457
  if (typeof resolved === "string") return resolved;
@@ -654,6 +666,108 @@ function controlIconPaths(name) {
654
666
  }
655
667
  }
656
668
  //#endregion
669
+ //#region src/renderer/presentation-style.ts
670
+ const PRESENTATION_DESIGN_WIDTH = 1920;
671
+ const PRESENTATION_DESIGN_HEIGHT = 1080;
672
+ function presentationDesignCssVariables() {
673
+ return `--hono-decks-width:${PRESENTATION_DESIGN_WIDTH}px;--hono-decks-height:${PRESENTATION_DESIGN_HEIGHT}px`;
674
+ }
675
+ function basePresentationStyle() {
676
+ return `
677
+ :root{color-scheme:light;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;font-size:32px;${presentationDesignCssVariables()};--hono-decks-transition-duration:.24s;--hono-decks-transition-easing:ease;--hono-decks-background:#fff;--hono-decks-color:#172033;--hono-decks-muted-color:#475569;--hono-decks-accent-color:#0369a1;--hono-decks-border-color:#cbd5e1;--hono-decks-inline-code-background:#f1f5f9;--hono-decks-code-background:#f1f5f9;--hono-decks-card-background:#f1f5f9;--hono-decks-card-image-background:#e2e8f0;--hono-decks-warning-background:#fef3c7;--hono-decks-warning-color:#854d0e;background:var(--hono-decks-background);color:var(--hono-decks-color)}
678
+ html,body{margin:0;width:100%;height:100%;overflow:hidden}
679
+ .hono-decks-stage{width:100vw;height:100vh;overflow:hidden;position:relative;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);place-items:center}
680
+ .hono-decks-deck{display:grid;gap:1rem;width:var(--hono-decks-width);height:var(--hono-decks-height);box-sizing:border-box;transform-origin:center}
681
+ .slide{box-sizing:border-box;aspect-ratio:16/9;background:var(--hono-decks-background);color:var(--hono-decks-color);padding:1.8rem;overflow:hidden}
682
+ .hono-decks-slide-content{width:100%;height:100%}
683
+ .slide.layout-cover,.slide.layout-statement{display:flex;flex-direction:column;justify-content:center}
684
+ .slide.layout-cover>.hono-decks-slide-content,.slide.layout-statement>.hono-decks-slide-content{display:flex;flex-direction:column;justify-content:center}
685
+ .slide code{font-family:"SFMono-Regular","Cascadia Code","Liberation Mono",Menlo,Consolas,monospace;font-size:.9em;line-height:1.45}
686
+ .slide :not(pre)>code{border-radius:6px;background:var(--hono-decks-inline-code-background);padding:.12em .34em}
687
+ .slide pre{max-width:100%;overflow:auto;box-sizing:border-box;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-code-background);padding:1rem;tab-size:2;white-space:pre}
688
+ .slide pre code{display:block;min-width:max-content;background:transparent;padding:0}
689
+ .slide table{width:100%;margin:1rem 0;border-collapse:collapse}
690
+ .slide th,.slide td{border:1px solid var(--hono-decks-border-color);padding:.4em .75em;text-align:left}
691
+ .slide th{background:var(--hono-decks-card-background);font-weight:700}
692
+ .slide del{color:var(--hono-decks-muted-color)}
693
+ .slide li.task-list-item{list-style:none;margin-left:-1.4em}
694
+ .slide li.task-list-item input[type=checkbox]{margin-right:.5em;vertical-align:middle}
695
+ .hono-decks-code-block{margin:1rem 0;max-width:100%}
696
+ .hono-decks-code-caption{display:inline-flex;margin:0 0 .4rem;border:1px solid var(--hono-decks-border-color);border-radius:6px;padding:.2rem .5rem;background:var(--hono-decks-inline-code-background);color:var(--hono-decks-muted-color);font-size:.82rem}
697
+ .hono-decks-embed-frame{margin:1rem 0;max-width:100%}
698
+ .hono-decks-embed-viewport{width:min(100%,72rem);overflow:hidden}
699
+ .hono-decks-embed-viewport iframe{display:block;width:100%;height:100%;border:0}
700
+ .hono-decks-embed-print-fallback{display:none}
701
+ .hono-decks-embed-print-poster{display:block;width:100%;height:100%;object-fit:cover}
702
+ .hono-decks-embed-fallback{margin:.45rem 0 0;color:var(--hono-decks-muted-color);font-size:.84rem}
703
+ .hono-decks-embed-fallback a{color:inherit}
704
+ .hono-decks-social-embed{margin:1rem 0;max-width:min(100%,42rem)}
705
+ .hono-decks-social-card{margin:0;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-card-background);padding:1rem}
706
+ .hono-decks-social-card p{margin:0 0 .75rem;line-height:1.55}
707
+ .hono-decks-social-card footer{display:flex;flex-wrap:wrap;gap:.65rem;align-items:center;color:var(--hono-decks-muted-color);font-size:.9rem}
708
+ .hono-decks-social-card a{color:inherit}
709
+ .hono-decks-tweet-embed{margin:1rem 0;max-width:min(100%,42rem)}
710
+ .hono-decks-tweet-embed .twitter-tweet{margin:0;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-card-background);padding:1rem}
711
+ .hono-decks-tweet-embed .twitter-tweet a{color:inherit}
712
+ .hono-decks-tweet-print-fallback{display:none}
713
+ .hono-decks-link-card{margin:1rem 0;max-width:min(100%,42rem)}
714
+ .hono-decks-link-card-anchor{display:grid;grid-template-columns:minmax(9rem,32%) minmax(0,1fr);gap:.75rem;align-items:stretch;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-card-background);padding:1rem;color:inherit;text-decoration:none}
715
+ .hono-decks-link-card-body{display:grid;gap:.35rem;min-width:0}
716
+ .hono-decks-link-card-image{width:100%;height:100%;max-height:10rem;aspect-ratio:16/9;object-fit:cover;border-radius:6px;background:var(--hono-decks-card-image-background)}
717
+ .hono-decks-link-card-site{color:var(--hono-decks-accent-color);font-size:.8rem;text-transform:uppercase}
718
+ .hono-decks-link-card-title{font-weight:700}
719
+ .hono-decks-link-card-description{color:var(--hono-decks-muted-color);line-height:1.45}
720
+ .hono-decks-link-card-label{color:var(--hono-decks-accent-color);font-size:.88rem}
721
+ .mdx-hero{height:100%;display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,42%);gap:1.8rem;align-items:center}
722
+ .mdx-hero:not(.has-image){grid-template-columns:1fr}
723
+ .mdx-hero-copy{min-width:0}
724
+ .mdx-hero-eyebrow{margin:0 0 .75rem;color:var(--hono-decks-accent-color);text-transform:uppercase;font-size:.85rem;letter-spacing:0}
725
+ .mdx-hero h1{margin:0;font-size:3rem;line-height:1.02}
726
+ .mdx-hero-subtitle{margin:1rem 0 0;font-size:1.125rem;line-height:1.45;color:var(--hono-decks-muted-color)}
727
+ .mdx-hero-image{width:100%;height:auto;max-height:756px;object-fit:contain;border-radius:8px}
728
+ [data-hono-decks-fire]{--fire-duration:.18s;--fire-easing:ease;--fire-opacity:0;--fire-transform:translateY(.35rem);--fire-filter:none;visibility:visible;opacity:1;transform:none;filter:none;transition:visibility 0s linear 0s,opacity var(--fire-duration) var(--fire-easing),transform var(--fire-duration) var(--fire-easing),filter var(--fire-duration) var(--fire-easing)}
729
+ [data-hono-decks-fire][data-fire-hidden]{visibility:hidden;opacity:var(--fire-opacity);transform:var(--fire-transform);filter:var(--fire-filter);transition-delay:var(--fire-duration),0s,0s,0s}
730
+ [data-fire-effect=none]{--fire-duration:0s;--fire-transform:none}
731
+ [data-fire-effect=fade]{--fire-transform:none}
732
+ [data-fire-effect=fade-up]{--fire-transform:translateY(.85rem)}
733
+ [data-fire-effect=scale]{--fire-transform:scale(.96)}
734
+ body:not([data-overview-mode]) .hono-decks-deck{position:relative}
735
+ body:not([data-overview-mode]) .slide{position:absolute;inset:0;width:100%;height:100%}
736
+ .slide[data-active-transition]{transition:opacity var(--hono-decks-active-transition-duration,var(--hono-decks-slide-transition-duration,var(--hono-decks-transition-duration))) var(--hono-decks-active-transition-easing,var(--hono-decks-slide-transition-easing,var(--hono-decks-transition-easing))),transform var(--hono-decks-active-transition-duration,var(--hono-decks-slide-transition-duration,var(--hono-decks-transition-duration))) var(--hono-decks-active-transition-easing,var(--hono-decks-slide-transition-easing,var(--hono-decks-transition-easing)));will-change:opacity,transform}
737
+ .slide[data-slide-state="inactive"]{visibility:hidden;pointer-events:none}
738
+ .slide[data-slide-state="active"]{visibility:visible;opacity:1;transform:translate3d(0,0,0) scale(1)}
739
+ .slide[data-active-transition="fade"][data-slide-state="entering"],.slide[data-active-transition="fade"][data-slide-state="leaving"],.slide[data-active-transition="view-transition"][data-slide-state="entering"],.slide[data-active-transition="view-transition"][data-slide-state="leaving"]{opacity:0}
740
+ .slide[data-active-transition="fade-out"][data-slide-state="entering"]{opacity:1}
741
+ .slide[data-active-transition="fade-out"][data-slide-state="leaving"]{opacity:0}
742
+ .slide[data-active-transition="slide-left"][data-slide-direction="forward"][data-slide-state="entering"],.slide[data-active-transition="slide-right"][data-slide-direction="backward"][data-slide-state="leaving"]{transform:translate3d(100%,0,0)}
743
+ .slide[data-active-transition="slide-left"][data-slide-direction="forward"][data-slide-state="leaving"],.slide[data-active-transition="slide-right"][data-slide-direction="backward"][data-slide-state="entering"]{transform:translate3d(-100%,0,0)}
744
+ .slide[data-active-transition="slide-left"][data-slide-direction="backward"][data-slide-state="entering"],.slide[data-active-transition="slide-right"][data-slide-direction="forward"][data-slide-state="leaving"]{transform:translate3d(-100%,0,0)}
745
+ .slide[data-active-transition="slide-left"][data-slide-direction="backward"][data-slide-state="leaving"],.slide[data-active-transition="slide-right"][data-slide-direction="forward"][data-slide-state="entering"]{transform:translate3d(100%,0,0)}
746
+ .slide[data-active-transition="slide-up"][data-slide-direction="forward"][data-slide-state="entering"],.slide[data-active-transition="slide-down"][data-slide-direction="backward"][data-slide-state="leaving"]{transform:translate3d(0,100%,0)}
747
+ .slide[data-active-transition="slide-up"][data-slide-direction="forward"][data-slide-state="leaving"],.slide[data-active-transition="slide-down"][data-slide-direction="backward"][data-slide-state="entering"]{transform:translate3d(0,-100%,0)}
748
+ .slide[data-active-transition="slide-up"][data-slide-direction="backward"][data-slide-state="entering"],.slide[data-active-transition="slide-down"][data-slide-direction="forward"][data-slide-state="leaving"]{transform:translate3d(0,-100%,0)}
749
+ .slide[data-active-transition="slide-up"][data-slide-direction="backward"][data-slide-state="leaving"],.slide[data-active-transition="slide-down"][data-slide-direction="forward"][data-slide-state="entering"]{transform:translate3d(0,100%,0)}
750
+ body:not([data-overview-mode]) .slide[hidden]{display:none}
751
+ body[data-overview-mode] .hono-decks-deck{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
752
+ body[data-overview-mode] .slide{cursor:pointer}
753
+ body[data-presenter-mode] .speaker-notes{display:block;margin-top:1rem;padding:.75rem;border-radius:8px;background:var(--hono-decks-card-image-background)}
754
+ .hono-decks-warnings{margin:1rem;padding:.75rem;border-radius:14px;background:var(--hono-decks-warning-background);color:var(--hono-decks-warning-color)}
755
+ @media screen{html[data-hono-decks-print-preview]{width:auto;height:auto;min-height:100%;overflow:visible}
756
+ body[data-hono-decks-print-preview]{min-height:100vh;overflow:auto;color-scheme:light;color:#000;--hono-decks-print-gap:6mm;--hono-decks-print-slot-height:80mm;--hono-decks-print-scale:.28}
757
+ body[data-hono-decks-print-preview] .hono-decks-stage{display:block;width:auto;height:auto;min-height:100vh;overflow:visible;padding:12mm 0;box-sizing:border-box}
758
+ body[data-hono-decks-print-preview] .hono-decks-deck{display:grid;grid-template-columns:1fr;grid-auto-rows:var(--hono-decks-print-slot-height);gap:var(--hono-decks-print-gap);width:calc(var(--hono-decks-print-slot-height) * 16 / 9);max-width:calc(100vw - 24px);height:auto;margin:0 auto;transform:none!important}
759
+ body[data-hono-decks-print-preview] .slide{position:static;width:100%;max-width:100%;height:var(--hono-decks-print-slot-height);aspect-ratio:16/9;justify-self:center;align-self:center;padding:0;box-shadow:0 2px 10px rgba(15,23,42,.16);transition:none!important;transform:none!important}
760
+ body[data-hono-decks-print-preview] .slide.layout-cover,body[data-hono-decks-print-preview] .slide.layout-statement{display:block}
761
+ body[data-hono-decks-print-preview] .hono-decks-slide-content{width:var(--hono-decks-width);height:var(--hono-decks-height);box-sizing:border-box;padding:1.8rem;transform:scale(var(--hono-decks-print-scale));transform-origin:left top;overflow:hidden}
762
+ body[data-hono-decks-print-preview]:not([data-overview-mode]) .slide[hidden]{display:block!important}
763
+ body[data-hono-decks-print-preview] .slide[data-slide-state]{visibility:visible!important;opacity:1!important;transform:none!important}
764
+ body[data-hono-decks-print-preview] [data-hono-decks-fire]{visibility:visible!important;opacity:1!important;transform:none!important;filter:none!important}}
765
+ @page{size:A4 portrait;margin:12mm}
766
+ @media print{:root{color-scheme:light;color:#000;--hono-decks-print-gap:6mm;--hono-decks-print-slot-height:80mm;--hono-decks-print-scale:.28}html,body{width:auto;height:auto;overflow:visible}.hono-decks-stage{display:block;width:auto;height:auto;overflow:visible}.hono-decks-deck{display:grid;grid-template-columns:1fr;grid-auto-rows:var(--hono-decks-print-slot-height);gap:var(--hono-decks-print-gap);width:calc(var(--hono-decks-print-slot-height) * 16 / 9);height:auto;margin:0 auto;transform:none!important}body:not([data-overview-mode]) .slide{position:relative}.slide{position:relative;width:100%;max-width:100%;height:var(--hono-decks-print-slot-height);aspect-ratio:16/9;justify-self:center;align-self:center;padding:0;page-break-after:auto;break-after:auto;break-inside:avoid;box-shadow:none;transition:none!important;transform:none!important}.slide.layout-cover,.slide.layout-statement{display:block}.hono-decks-slide-content{position:absolute;inset:0 auto auto 0;width:var(--hono-decks-width);height:var(--hono-decks-height);box-sizing:border-box;padding:1.8rem;zoom:var(--hono-decks-print-scale);overflow:hidden}.slide:nth-of-type(3n):not(:last-child){page-break-after:always;break-after:page}body:not([data-overview-mode]) .slide[hidden]{display:block!important}.slide[data-slide-state]{visibility:visible!important;opacity:1!important;transform:none!important}[data-hono-decks-fire]{visibility:visible!important;opacity:1!important;transform:none!important;filter:none!important}}
767
+ @media print{.hono-decks-embed-viewport iframe,.hono-decks-tweet-embed iframe,.hono-decks-tweet-embed .twitter-tweet{display:none!important}.hono-decks-embed-print-fallback{display:grid;width:100%;height:100%;place-items:center;overflow:hidden;background:var(--hono-decks-card-background);color:var(--hono-decks-accent-color);text-decoration:none}.hono-decks-embed-print-fallback:has(.hono-decks-embed-print-poster){display:block}.hono-decks-embed-print-poster+span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}.hono-decks-tweet-print-fallback{display:flex;min-height:12rem;align-items:center;justify-content:center;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-card-background);color:var(--hono-decks-accent-color);text-decoration:none}}
768
+ @media (prefers-reduced-motion: reduce){*,*::before,*::after{scroll-behavior:auto!important;animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;transition-delay:0s!important}.slide[data-active-transition]{transform:none!important}}`;
769
+ }
770
+ //#endregion
657
771
  //#region src/server/document.ts
658
772
  async function resolveDeckDocument(input, options, overrides) {
659
773
  const page = {
@@ -705,8 +819,8 @@ function renderPresentationScript(nonce) {
705
819
  const slides = Array.from(document.querySelectorAll(".slide"));
706
820
  const stage = document.querySelector("[data-hono-decks-stage]");
707
821
  const deck = document.querySelector("[data-hono-decks-deck]");
708
- const DESIGN_WIDTH = 1920;
709
- const DESIGN_HEIGHT = 1080;
822
+ const DESIGN_WIDTH = ${PRESENTATION_DESIGN_WIDTH};
823
+ const DESIGN_HEIGHT = ${PRESENTATION_DESIGN_HEIGHT};
710
824
  let index = 0;
711
825
  let previousIndex = 0;
712
826
  let stepIndex = 0;
@@ -1091,6 +1205,10 @@ function renderPresentationScript(nonce) {
1091
1205
  });
1092
1206
 
1093
1207
  document.addEventListener("keydown", (event) => {
1208
+ if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.altKey) return;
1209
+ const target = event.target;
1210
+ if (target instanceof HTMLElement && (target.isContentEditable || target.closest("input,textarea,select,button,a[href],[role=textbox],[role=button],[role=slider]"))) return;
1211
+ if (["ArrowRight", "ArrowLeft", " "].includes(event.key)) event.preventDefault();
1094
1212
  if (event.key === "ArrowRight" || event.key === " ") handleCommand("next");
1095
1213
  if (event.key === "ArrowLeft") handleCommand("previous");
1096
1214
  if (event.key === "f") handleCommand("fullscreen");
@@ -1110,6 +1228,9 @@ function renderPresentationScript(nonce) {
1110
1228
  window.__honoDecksPresentationRuntime = { command: handleCommand };
1111
1229
 
1112
1230
  window.addEventListener("resize", fitDeck);
1231
+ if (typeof ResizeObserver !== "undefined" && stage instanceof HTMLElement) {
1232
+ new ResizeObserver(fitDeck).observe(stage);
1233
+ }
1113
1234
  fitDeck();
1114
1235
  const initialState = readInitialState();
1115
1236
  show(initialState.index, initialState.stepIndex);
@@ -1120,109 +1241,6 @@ function escapeHtml$6(value) {
1120
1241
  return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&#39;");
1121
1242
  }
1122
1243
  //#endregion
1123
- //#region src/renderer/presentation-style.ts
1124
- const PRESENTATION_DESIGN_WIDTH = 1920;
1125
- const PRESENTATION_DESIGN_HEIGHT = 1080;
1126
- function presentationDesignCssVariables() {
1127
- return `--hono-decks-width:${PRESENTATION_DESIGN_WIDTH}px;--hono-decks-height:${PRESENTATION_DESIGN_HEIGHT}px`;
1128
- }
1129
- function basePresentationStyle() {
1130
- return `
1131
- :root{color-scheme:dark;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;font-size:32px;${presentationDesignCssVariables()};--hono-decks-transition-duration:.24s;--hono-decks-transition-easing:ease;--hono-decks-color:#eef2ff;--hono-decks-muted-color:#cbd5e1;--hono-decks-accent-color:#8bd3ff;--hono-decks-border-color:rgba(148,163,184,.24);--hono-decks-inline-code-background:rgba(15,23,42,.72);--hono-decks-code-background:rgba(15,23,42,.78);--hono-decks-card-background:rgba(15,23,42,.78);--hono-decks-card-image-background:rgba(255,255,255,.08);--hono-decks-warning-background:rgba(255,193,7,.12);--hono-decks-warning-color:#ffe59b;color:var(--hono-decks-color)}
1132
- html,body{margin:0;width:100%;height:100%;overflow:hidden}
1133
- .hono-decks-stage{width:100vw;height:100vh;overflow:hidden;position:relative;display:grid;place-items:center}
1134
- .hono-decks-deck{display:grid;gap:1rem;width:var(--hono-decks-width);height:var(--hono-decks-height);box-sizing:border-box;transform-origin:left top}
1135
- .slide{box-sizing:border-box;aspect-ratio:16/9;padding:clamp(1.2rem,3vw,3rem);overflow:hidden}
1136
- .hono-decks-slide-content{width:100%;height:100%}
1137
- .slide.layout-cover,.slide.layout-statement{display:flex;flex-direction:column;justify-content:center}
1138
- .slide.layout-cover>.hono-decks-slide-content,.slide.layout-statement>.hono-decks-slide-content{display:flex;flex-direction:column;justify-content:center}
1139
- .slide code{font-family:"SFMono-Regular","Cascadia Code","Liberation Mono",Menlo,Consolas,monospace;font-size:.9em;line-height:1.45}
1140
- .slide :not(pre)>code{border-radius:6px;background:var(--hono-decks-inline-code-background);padding:.12em .34em}
1141
- .slide pre{max-width:100%;overflow:auto;box-sizing:border-box;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-code-background);padding:1rem;tab-size:2;white-space:pre}
1142
- .slide pre code{display:block;min-width:max-content;background:transparent;padding:0}
1143
- .slide table{width:100%;margin:1rem 0;border-collapse:collapse}
1144
- .slide th,.slide td{border:1px solid var(--hono-decks-border-color);padding:.4em .75em;text-align:left}
1145
- .slide th{background:var(--hono-decks-card-background);font-weight:700}
1146
- .slide del{color:var(--hono-decks-muted-color)}
1147
- .slide li.task-list-item{list-style:none;margin-left:-1.4em}
1148
- .slide li.task-list-item input[type=checkbox]{margin-right:.5em;vertical-align:middle}
1149
- .hono-decks-code-block{margin:1rem 0;max-width:100%}
1150
- .hono-decks-code-caption{display:inline-flex;margin:0 0 .4rem;border:1px solid var(--hono-decks-border-color);border-radius:6px;padding:.2rem .5rem;background:var(--hono-decks-inline-code-background);color:var(--hono-decks-muted-color);font-size:.82rem}
1151
- .hono-decks-embed-frame{margin:1rem 0;max-width:100%}
1152
- .hono-decks-embed-viewport{width:min(100%,72rem);overflow:hidden}
1153
- .hono-decks-embed-viewport iframe{display:block;width:100%;height:100%;border:0}
1154
- .hono-decks-embed-print-fallback{display:none}
1155
- .hono-decks-embed-print-poster{display:block;width:100%;height:100%;object-fit:cover}
1156
- .hono-decks-embed-fallback{margin:.45rem 0 0;color:var(--hono-decks-muted-color);font-size:.84rem}
1157
- .hono-decks-embed-fallback a{color:inherit}
1158
- .hono-decks-social-embed{margin:1rem 0;max-width:min(100%,42rem)}
1159
- .hono-decks-social-card{margin:0;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-card-background);padding:1rem}
1160
- .hono-decks-social-card p{margin:0 0 .75rem;line-height:1.55}
1161
- .hono-decks-social-card footer{display:flex;flex-wrap:wrap;gap:.65rem;align-items:center;color:var(--hono-decks-muted-color);font-size:.9rem}
1162
- .hono-decks-social-card a{color:inherit}
1163
- .hono-decks-tweet-embed{margin:1rem 0;max-width:min(100%,42rem)}
1164
- .hono-decks-tweet-embed .twitter-tweet{margin:0;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-card-background);padding:1rem}
1165
- .hono-decks-tweet-embed .twitter-tweet a{color:inherit}
1166
- .hono-decks-tweet-print-fallback{display:none}
1167
- .hono-decks-link-card{margin:1rem 0;max-width:min(100%,42rem)}
1168
- .hono-decks-link-card-anchor{display:grid;grid-template-columns:minmax(9rem,32%) minmax(0,1fr);gap:.75rem;align-items:stretch;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-card-background);padding:1rem;color:inherit;text-decoration:none}
1169
- .hono-decks-link-card-body{display:grid;gap:.35rem;min-width:0}
1170
- .hono-decks-link-card-image{width:100%;height:100%;max-height:10rem;aspect-ratio:16/9;object-fit:cover;border-radius:6px;background:var(--hono-decks-card-image-background)}
1171
- .hono-decks-link-card-site{color:var(--hono-decks-accent-color);font-size:.8rem;text-transform:uppercase}
1172
- .hono-decks-link-card-title{font-weight:700}
1173
- .hono-decks-link-card-description{color:var(--hono-decks-muted-color);line-height:1.45}
1174
- .hono-decks-link-card-label{color:var(--hono-decks-accent-color);font-size:.88rem}
1175
- @media (max-width: 640px){.hono-decks-link-card-anchor{grid-template-columns:1fr}.hono-decks-link-card-image{height:auto;max-height:12rem}}
1176
- .mdx-hero{height:100%;display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,42%);gap:clamp(1rem,3vw,3rem);align-items:center}
1177
- .mdx-hero:not(.has-image){grid-template-columns:1fr}
1178
- .mdx-hero-copy{min-width:0}
1179
- .mdx-hero-eyebrow{margin:0 0 .75rem;color:var(--hono-decks-accent-color);text-transform:uppercase;font-size:.85rem;letter-spacing:0}
1180
- .mdx-hero h1{margin:0;font-size:clamp(2.2rem,5vw,5rem);line-height:1.02}
1181
- .mdx-hero-subtitle{margin:1rem 0 0;font-size:clamp(1rem,1.8vw,1.5rem);line-height:1.45;color:var(--hono-decks-muted-color)}
1182
- .mdx-hero-image{width:100%;height:auto;max-height:70vh;object-fit:contain;border-radius:8px}
1183
- [data-hono-decks-fire]{--fire-duration:.18s;--fire-easing:ease;--fire-opacity:0;--fire-transform:translateY(.35rem);--fire-filter:none;visibility:visible;opacity:1;transform:none;filter:none;transition:visibility 0s linear 0s,opacity var(--fire-duration) var(--fire-easing),transform var(--fire-duration) var(--fire-easing),filter var(--fire-duration) var(--fire-easing)}
1184
- [data-hono-decks-fire][data-fire-hidden]{visibility:hidden;opacity:var(--fire-opacity);transform:var(--fire-transform);filter:var(--fire-filter);transition-delay:var(--fire-duration),0s,0s,0s}
1185
- [data-fire-effect=none]{--fire-duration:0s;--fire-transform:none}
1186
- [data-fire-effect=fade]{--fire-transform:none}
1187
- [data-fire-effect=fade-up]{--fire-transform:translateY(.85rem)}
1188
- [data-fire-effect=scale]{--fire-transform:scale(.96)}
1189
- body:not([data-overview-mode]) .hono-decks-deck{position:relative}
1190
- body:not([data-overview-mode]) .slide{position:absolute;inset:0;width:100%;height:100%}
1191
- .slide[data-active-transition]{transition:opacity var(--hono-decks-active-transition-duration,var(--hono-decks-slide-transition-duration,var(--hono-decks-transition-duration))) var(--hono-decks-active-transition-easing,var(--hono-decks-slide-transition-easing,var(--hono-decks-transition-easing))),transform var(--hono-decks-active-transition-duration,var(--hono-decks-slide-transition-duration,var(--hono-decks-transition-duration))) var(--hono-decks-active-transition-easing,var(--hono-decks-slide-transition-easing,var(--hono-decks-transition-easing)));will-change:opacity,transform}
1192
- .slide[data-slide-state="inactive"]{visibility:hidden;pointer-events:none}
1193
- .slide[data-slide-state="active"]{visibility:visible;opacity:1;transform:translate3d(0,0,0) scale(1)}
1194
- .slide[data-active-transition="fade"][data-slide-state="entering"],.slide[data-active-transition="fade"][data-slide-state="leaving"],.slide[data-active-transition="view-transition"][data-slide-state="entering"],.slide[data-active-transition="view-transition"][data-slide-state="leaving"]{opacity:0}
1195
- .slide[data-active-transition="fade-out"][data-slide-state="entering"]{opacity:1}
1196
- .slide[data-active-transition="fade-out"][data-slide-state="leaving"]{opacity:0}
1197
- .slide[data-active-transition="slide-left"][data-slide-direction="forward"][data-slide-state="entering"],.slide[data-active-transition="slide-right"][data-slide-direction="backward"][data-slide-state="leaving"]{transform:translate3d(100%,0,0)}
1198
- .slide[data-active-transition="slide-left"][data-slide-direction="forward"][data-slide-state="leaving"],.slide[data-active-transition="slide-right"][data-slide-direction="backward"][data-slide-state="entering"]{transform:translate3d(-100%,0,0)}
1199
- .slide[data-active-transition="slide-left"][data-slide-direction="backward"][data-slide-state="entering"],.slide[data-active-transition="slide-right"][data-slide-direction="forward"][data-slide-state="leaving"]{transform:translate3d(-100%,0,0)}
1200
- .slide[data-active-transition="slide-left"][data-slide-direction="backward"][data-slide-state="leaving"],.slide[data-active-transition="slide-right"][data-slide-direction="forward"][data-slide-state="entering"]{transform:translate3d(100%,0,0)}
1201
- .slide[data-active-transition="slide-up"][data-slide-direction="forward"][data-slide-state="entering"],.slide[data-active-transition="slide-down"][data-slide-direction="backward"][data-slide-state="leaving"]{transform:translate3d(0,100%,0)}
1202
- .slide[data-active-transition="slide-up"][data-slide-direction="forward"][data-slide-state="leaving"],.slide[data-active-transition="slide-down"][data-slide-direction="backward"][data-slide-state="entering"]{transform:translate3d(0,-100%,0)}
1203
- .slide[data-active-transition="slide-up"][data-slide-direction="backward"][data-slide-state="entering"],.slide[data-active-transition="slide-down"][data-slide-direction="forward"][data-slide-state="leaving"]{transform:translate3d(0,-100%,0)}
1204
- .slide[data-active-transition="slide-up"][data-slide-direction="backward"][data-slide-state="leaving"],.slide[data-active-transition="slide-down"][data-slide-direction="forward"][data-slide-state="entering"]{transform:translate3d(0,100%,0)}
1205
- body:not([data-overview-mode]) .slide[hidden]{display:none}
1206
- body[data-overview-mode] .hono-decks-deck{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
1207
- body[data-overview-mode] .slide{cursor:pointer}
1208
- body[data-presenter-mode] .speaker-notes{display:block;margin-top:1rem;padding:.75rem;border-radius:8px;background:var(--hono-decks-card-image-background)}
1209
- .hono-decks-warnings{margin:1rem;padding:.75rem;border-radius:14px;background:var(--hono-decks-warning-background);color:var(--hono-decks-warning-color)}
1210
- @media screen{html[data-hono-decks-print-preview]{width:auto;height:auto;min-height:100%;overflow:visible}
1211
- body[data-hono-decks-print-preview]{min-height:100vh;overflow:auto;color-scheme:light;color:#000;--hono-decks-print-gap:6mm;--hono-decks-print-slot-height:80mm;--hono-decks-print-scale:.28}
1212
- body[data-hono-decks-print-preview] .hono-decks-stage{display:block;width:auto;height:auto;min-height:100vh;overflow:visible;padding:12mm 0;box-sizing:border-box}
1213
- body[data-hono-decks-print-preview] .hono-decks-deck{display:grid;grid-template-columns:1fr;grid-auto-rows:var(--hono-decks-print-slot-height);gap:var(--hono-decks-print-gap);width:calc(var(--hono-decks-print-slot-height) * 16 / 9);max-width:calc(100vw - 24px);height:auto;margin:0 auto;transform:none!important}
1214
- body[data-hono-decks-print-preview] .slide{position:static;width:100%;max-width:100%;height:var(--hono-decks-print-slot-height);aspect-ratio:16/9;justify-self:center;align-self:center;padding:0;box-shadow:0 2px 10px rgba(15,23,42,.16);transition:none!important;transform:none!important}
1215
- body[data-hono-decks-print-preview] .slide.layout-cover,body[data-hono-decks-print-preview] .slide.layout-statement{display:block}
1216
- body[data-hono-decks-print-preview] .hono-decks-slide-content{width:var(--hono-decks-width);height:var(--hono-decks-height);box-sizing:border-box;padding:clamp(1.2rem,3vw,3rem);transform:scale(var(--hono-decks-print-scale));transform-origin:left top;overflow:hidden}
1217
- body[data-hono-decks-print-preview]:not([data-overview-mode]) .slide[hidden]{display:block!important}
1218
- body[data-hono-decks-print-preview] .slide[data-slide-state]{visibility:visible!important;opacity:1!important;transform:none!important}
1219
- body[data-hono-decks-print-preview] [data-hono-decks-fire]{visibility:visible!important;opacity:1!important;transform:none!important;filter:none!important}}
1220
- @page{size:A4 portrait;margin:12mm}
1221
- @media print{:root{color-scheme:light;color:#000;--hono-decks-print-gap:6mm;--hono-decks-print-slot-height:80mm;--hono-decks-print-scale:.28}html,body{width:auto;height:auto;overflow:visible}.hono-decks-stage{display:block;width:auto;height:auto;overflow:visible}.hono-decks-deck{display:grid;grid-template-columns:1fr;grid-auto-rows:var(--hono-decks-print-slot-height);gap:var(--hono-decks-print-gap);width:calc(var(--hono-decks-print-slot-height) * 16 / 9);height:auto;margin:0 auto;transform:none!important}body:not([data-overview-mode]) .slide{position:relative}.slide{position:relative;width:100%;max-width:100%;height:var(--hono-decks-print-slot-height);aspect-ratio:16/9;justify-self:center;align-self:center;padding:0;page-break-after:auto;break-after:auto;break-inside:avoid;box-shadow:none;transition:none!important;transform:none!important}.slide.layout-cover,.slide.layout-statement{display:block}.hono-decks-slide-content{position:absolute;inset:0 auto auto 0;width:var(--hono-decks-width);height:var(--hono-decks-height);box-sizing:border-box;padding:clamp(1.2rem,3vw,3rem);zoom:var(--hono-decks-print-scale);overflow:hidden}.slide:nth-of-type(3n):not(:last-child){page-break-after:always;break-after:page}body:not([data-overview-mode]) .slide[hidden]{display:block!important}.slide[data-slide-state]{visibility:visible!important;opacity:1!important;transform:none!important}[data-hono-decks-fire]{visibility:visible!important;opacity:1!important;transform:none!important;filter:none!important}}
1222
- @media print{.hono-decks-embed-viewport iframe,.hono-decks-tweet-embed iframe,.hono-decks-tweet-embed .twitter-tweet{display:none!important}.hono-decks-embed-print-fallback{display:grid;width:100%;height:100%;place-items:center;overflow:hidden;background:var(--hono-decks-card-background);color:var(--hono-decks-accent-color);text-decoration:none}.hono-decks-embed-print-fallback:has(.hono-decks-embed-print-poster){display:block}.hono-decks-embed-print-poster+span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}.hono-decks-tweet-print-fallback{display:flex;min-height:12rem;align-items:center;justify-content:center;border:1px solid var(--hono-decks-border-color);border-radius:8px;background:var(--hono-decks-card-background);color:var(--hono-decks-accent-color);text-decoration:none}}
1223
- @media (prefers-reduced-motion: reduce){*,*::before,*::after{scroll-behavior:auto!important;animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;transition-delay:0s!important}.slide[data-active-transition]{transform:none!important}}`;
1224
- }
1225
- //#endregion
1226
1244
  //#region src/renderer/presentation-page.ts
1227
1245
  function presentationPageTitle(deck) {
1228
1246
  return deck.meta.title ?? deck.slug;
@@ -1540,10 +1558,10 @@ function renderCompiledSlide(slide, assets = [], input = {}) {
1540
1558
  ].filter(Boolean).join(" ");
1541
1559
  const notes = slide.notes ?? slide.meta.notes;
1542
1560
  const notesHtml = input.speakerNotes === false || !notes ? "" : `<aside class="speaker-notes" hidden>${escapeHtml$4(notes)}</aside>`;
1543
- const html = slide.nodes?.length ? renderSlideNodes(slide.nodes, {
1544
- components,
1545
- assets
1546
- }) : rewriteLocalAssetUrls(slide.html, assets);
1561
+ const html = renderSlideBodySync(slide, assets, {
1562
+ ...input,
1563
+ components
1564
+ });
1547
1565
  const style = slideStyleAttribute(slide, assets);
1548
1566
  const transition = slide.meta.transition ? ` data-transition="${escapeHtml$4(safeClass(slide.meta.transition))}"` : "";
1549
1567
  return `<section class="${classes}" data-slide-index="${slide.index}" data-slide-state="${slideState}"${slide.meta.title ? ` aria-label="${escapeHtml$4(slide.meta.title)}"` : ""}${transition}${style}><div class="hono-decks-slide-content">${html}</div>${notesHtml}</section>`;
@@ -1573,12 +1591,36 @@ function slideStyleAttribute(slide, assets) {
1573
1591
  if (slide.meta.transitionEasing) declarations.push(`--hono-decks-slide-transition-easing:${slide.meta.transitionEasing}`);
1574
1592
  return declarations.length ? ` style="${escapeHtml$4(declarations.join(";"))}"` : "";
1575
1593
  }
1594
+ function renderSlideBodySync(slide, assets, input) {
1595
+ try {
1596
+ if (slide.render) {
1597
+ const value = slide.render({ components: createMdxComponents(input.components ?? builtInSlideComponents, { assets }) });
1598
+ if (value && typeof value === "object" && "then" in value && typeof value.then === "function") {
1599
+ Promise.resolve(value).catch(() => void 0);
1600
+ throw new RenderError("Async slide rendering requires renderCompiledSlideAsync() or renderCompiledDeckAsync().", "async-slide-render");
1601
+ }
1602
+ return renderJsxValueSync(value);
1603
+ }
1604
+ if (slide.nodes?.length) return renderSlideNodes(slide.nodes, {
1605
+ components: input.components,
1606
+ assets
1607
+ });
1608
+ return rewriteLocalAssetUrls(requireSlideHtml(slide), assets);
1609
+ } catch (error) {
1610
+ if (error instanceof RenderError) throw error;
1611
+ throw new RenderError(`Render failed in ${input.deck?.sourcePath ?? "unknown deck"} slide ${slide.index + 1}: ${formatErrorMessage$1(error)}. Use the async rendering API for async JSX.`, "slide-render-error", error);
1612
+ }
1613
+ }
1614
+ function requireSlideHtml(slide) {
1615
+ if (typeof slide.html !== "string") throw new RenderError("Slide has no renderable body. Import createDecks() from the generated module; compileDecks() returns build information only.", "slide-body-missing");
1616
+ return slide.html;
1617
+ }
1576
1618
  async function renderSlideBodyAsync(slide, assets, input) {
1577
1619
  try {
1578
1620
  return slide.render ? await renderJsxValue(slide.render({ components: createMdxComponents(input.components ?? builtInSlideComponents, { assets }) })) : slide.nodes?.length ? await renderSlideNodesAsync(slide.nodes, {
1579
1621
  components: input.components,
1580
1622
  assets
1581
- }) : rewriteLocalAssetUrls(slide.html, assets);
1623
+ }) : rewriteLocalAssetUrls(requireSlideHtml(slide), assets);
1582
1624
  } catch (error) {
1583
1625
  if (error instanceof RenderError) throw error;
1584
1626
  throw new RenderError(`Render failed in ${input.deck?.sourcePath ?? "unknown deck"} slide ${slide.index + 1}: ${formatErrorMessage$1(error)}`, "slide-render-error", error);
@@ -1605,7 +1647,7 @@ function formatErrorMessage$1(error) {
1605
1647
  function serveDecksClientEntry(clientEntry, options = {}) {
1606
1648
  return (c) => {
1607
1649
  const headers = { "content-type": options.contentType ?? "text/javascript; charset=utf-8" };
1608
- const cacheControl = options.cacheControl ?? "public, max-age=300";
1650
+ const cacheControl = options.cacheControl ?? "no-cache";
1609
1651
  if (cacheControl !== false) headers["cache-control"] = cacheControl;
1610
1652
  return c.body(clientEntry, 200, headers);
1611
1653
  };
@@ -1905,6 +1947,7 @@ function renderViewerScript(nonce) {
1905
1947
  }
1906
1948
 
1907
1949
  function handleKeydown(event) {
1950
+ if (event.defaultPrevented) return;
1908
1951
  if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "p" && printPath) {
1909
1952
  event.preventDefault();
1910
1953
  const printUrl = new URL(printPath, window.location.href);
@@ -1912,6 +1955,10 @@ function renderViewerScript(nonce) {
1912
1955
  window.location.assign(printUrl);
1913
1956
  return;
1914
1957
  }
1958
+ if (event.metaKey || event.ctrlKey || event.altKey) return;
1959
+ const target = event.target;
1960
+ if (target instanceof HTMLElement && (target.isContentEditable || target.closest("input,textarea,select,button,a[href],[role=textbox],[role=button],[role=slider]"))) return;
1961
+ if (["ArrowRight", "ArrowLeft", " "].includes(event.key)) event.preventDefault();
1915
1962
  if (event.key === "ArrowRight" || event.key === " ") sendCommand("next");
1916
1963
  if (event.key === "ArrowLeft") sendCommand("previous");
1917
1964
  if (event.key === "f") void toggleViewerFullscreen();
@@ -1975,7 +2022,7 @@ function baseViewerStyle() {
1975
2022
  html,body{margin:0;width:100%;height:100%;min-height:100vh}
1976
2023
  @supports (height:100dvh){html,body{height:100dvh;min-height:100dvh}}
1977
2024
  body{overflow:hidden}
1978
- *:focus-visible{outline:none}
2025
+ *:focus-visible{outline:2px solid currentColor;outline-offset:2px}
1979
2026
  [data-hono-decks-viewer]{width:100%;height:100vh;min-height:0;display:grid;place-items:center;box-sizing:border-box;overflow:hidden}
1980
2027
  @supports (height:100dvh){[data-hono-decks-viewer]{height:100dvh}}
1981
2028
  .hono-decks-viewer-header{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
@@ -1993,7 +2040,7 @@ ${viewerViewportRule()}
1993
2040
  .hono-decks-mobile-navigation:focus-visible{outline:2px solid currentColor;outline-offset:-4px}
1994
2041
  .hono-decks-mobile-navigation:active{background:rgba(15,23,42,.28);color:#eef2ff;opacity:1}
1995
2042
  .hono-decks-mobile-navigation .hono-decks-control-icon{width:22px;height:22px}
1996
- .hono-decks-viewport>[data-hono-decks-position]{position:absolute;left:50%;bottom:max(8px,env(safe-area-inset-bottom,0));z-index:3;transform:translateX(-50%);border:0;background:transparent;color:inherit;padding:0;font:inherit;font-size:12px;line-height:1;opacity:.38;pointer-events:none;white-space:nowrap}
2043
+ .hono-decks-viewport>[data-hono-decks-position]{position:absolute;left:50%;bottom:max(8px,env(safe-area-inset-bottom,0));z-index:3;transform:translateX(-50%);border:0;border-radius:4px;background:rgba(15,23,42,.9);color:#eef2ff;padding:4px 6px;font:inherit;font-size:12px;line-height:1;opacity:1;pointer-events:none;white-space:nowrap}
1997
2044
  .hono-decks-viewer-controls{position:absolute;left:50%;bottom:max(.25rem,env(safe-area-inset-bottom,0));display:flex;gap:8px;align-items:center;justify-content:center;max-width:calc(100% - 1rem);min-width:0;z-index:4;transform:translateX(-50%)}
1998
2045
  .hono-decks-viewer-controls [data-hono-decks-navigation-control="previous"],.hono-decks-viewer-controls [data-hono-decks-navigation-control="next"],.hono-decks-viewer-controls [data-hono-decks-position]{position:absolute;visibility:hidden;pointer-events:none}
1999
2046
  .hono-decks-viewer-controls button,.hono-decks-viewer-controls a,.hono-decks-viewer-controls span{border:1px solid rgba(148,163,184,.32);border-radius:8px;background:rgba(15,23,42,.78);color:inherit;padding:8px 10px;font:inherit;font-size:14px}
@@ -2010,7 +2057,7 @@ ${viewerViewportRule()}
2010
2057
  function embeddedViewerStyle() {
2011
2058
  const root = "[data-hono-decks-viewer][data-hono-decks-embed]";
2012
2059
  return `${root}{color-scheme:dark;background:#050816;color:#eef2ff;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;display:grid;gap:12px;width:100%;min-width:0;box-sizing:border-box}
2013
- ${root} *:focus-visible{outline:none}
2060
+ ${root} *:focus-visible{outline:2px solid currentColor;outline-offset:2px}
2014
2061
  ${root} .hono-decks-viewer-shell{position:relative;display:grid;grid-template-rows:minmax(0,1fr);place-items:center;width:100%;min-width:0;min-height:0;box-sizing:border-box}
2015
2062
  ${root} .hono-decks-viewer-stage{display:grid;place-items:center;width:100%;min-width:0;min-height:0;container-type:inline-size}
2016
2063
  ${root} .hono-decks-viewport{width:100%;aspect-ratio:${VIEWER_ASPECT_RATIO};position:relative;overflow:hidden;touch-action:pan-y}
@@ -2023,7 +2070,7 @@ ${root} .hono-decks-mobile-navigation-next{right:.25rem}
2023
2070
  ${root} .hono-decks-mobile-navigation:focus-visible{outline:2px solid currentColor;outline-offset:-4px}
2024
2071
  ${root} .hono-decks-mobile-navigation:active{background:rgba(15,23,42,.28);color:#eef2ff;opacity:1}
2025
2072
  ${root} .hono-decks-mobile-navigation .hono-decks-control-icon{width:22px;height:22px}
2026
- ${root} .hono-decks-viewport>[data-hono-decks-position]{position:absolute;left:50%;bottom:8px;z-index:3;transform:translateX(-50%);border:0;background:transparent;color:inherit;padding:0;font:inherit;font-size:12px;line-height:1;opacity:.5;pointer-events:none;white-space:nowrap}
2073
+ ${root} .hono-decks-viewport>[data-hono-decks-position]{position:absolute;left:50%;bottom:8px;z-index:3;transform:translateX(-50%);border:0;border-radius:4px;background:rgba(15,23,42,.9);color:#eef2ff;padding:4px 6px;font:inherit;font-size:12px;line-height:1;opacity:1;pointer-events:none;white-space:nowrap}
2027
2074
  ${root} .hono-decks-viewer-controls{position:absolute;left:50%;bottom:max(.25rem,env(safe-area-inset-bottom,0));display:flex;gap:8px;align-items:center;justify-content:center;max-width:calc(100% - 1rem);min-width:0;z-index:4;transform:translateX(-50%)}
2028
2075
  ${root} .hono-decks-viewer-controls [data-hono-decks-navigation-control="previous"],${root} .hono-decks-viewer-controls [data-hono-decks-navigation-control="next"],${root} .hono-decks-viewer-controls [data-hono-decks-position]{position:absolute;visibility:hidden;pointer-events:none}
2029
2076
  ${root} .hono-decks-viewer-controls button,${root} .hono-decks-viewer-controls a,${root} .hono-decks-viewer-controls span{border:1px solid rgba(148,163,184,.32);border-radius:8px;background:rgba(15,23,42,.78);color:inherit;padding:8px 10px;font:inherit;font-size:14px}
@@ -2664,7 +2711,7 @@ function decksRouter(options) {
2664
2711
  slug,
2665
2712
  surface: "render"
2666
2713
  }, 404);
2667
- const clientEntry = options.clientEntry ?? resolveGeneratedClientEntryUrl(options, mountPath);
2714
+ const clientEntry = options.clientEntry ?? (deck.clientEntryRequired === false ? void 0 : resolveGeneratedClientEntryUrl(options, mountPath));
2668
2715
  try {
2669
2716
  const document = await resolveRouterDocument(c, options, "render", mountPath, deck);
2670
2717
  return c.html(await renderCompiledDeckPageAsync({
@@ -2769,7 +2816,7 @@ function decksRouter(options) {
2769
2816
  slug,
2770
2817
  surface: "presentation"
2771
2818
  }, 404);
2772
- const clientEntry = options.clientEntry ?? resolveGeneratedClientEntryUrl(options, mountPath);
2819
+ const clientEntry = options.clientEntry ?? (deck.clientEntryRequired === false ? void 0 : resolveGeneratedClientEntryUrl(options, mountPath));
2773
2820
  try {
2774
2821
  const document = await resolveRouterDocument(c, options, "presentation", mountPath, deck);
2775
2822
  return c.html(await renderCompiledDeckPageAsync({