@hypersocial/decks-cli 0.2.0 → 0.2.2

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.
@@ -0,0 +1,57 @@
1
+ <!--
2
+ layout: product
3
+ summary: A product screenshot in a browser frame (or .frame.phone for a phone shot), the point in the column beside it.
4
+ use: a demo moment. Fill .shot with `hyperdecks screenshot <url>` output; a callout chip names what to look at.
5
+ slot: bottom-right
6
+ presenter: stage
7
+ cues: [look: #__ID__-frame] when the narration turns to the product; [reveal: #__ID__-callout] for the detail.
8
+ script: This is the product. [look: #__ID__-frame] Look at this part. [reveal: #__ID__-callout]
9
+ -->
10
+ <style>
11
+ .l-product { display: grid; grid-template-columns: 960px 1fr; grid-template-areas: "frame text"; column-gap: 56px; align-items: center; }
12
+ .l-product .text { grid-area: text; align-self: start; display: flex; flex-direction: column; gap: 20px; }
13
+ .l-product .tt { font-size: var(--t-sub); line-height: 1.02; }
14
+ .l-product .lead { font-size: var(--t-body); }
15
+ .l-product .frame { grid-area: frame; position: relative; border-radius: 18px; overflow: hidden; background: var(--card); box-shadow: 0 0 0 1px color-mix(in srgb, var(--ink) 14%, transparent), 0 30px 70px color-mix(in srgb, var(--ink) 18%, transparent); }
16
+ .l-product .bar { display: flex; align-items: center; gap: 8px; height: 44px; padding: 0 18px; background: color-mix(in srgb, var(--ink) 6%, var(--card)); }
17
+ .l-product .bar i { width: 12px; height: 12px; border-radius: 50%; background: color-mix(in srgb, var(--ink) 22%, transparent); }
18
+ .l-product .bar span { margin-left: 14px; flex: 1; max-width: 420px; padding: 5px 14px; border-radius: 999px; background: var(--card); font: 14px var(--mono); opacity: .7; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
19
+ /* Swap the div for an <img class="shot"> of your file (a 16:10 screenshot). */
20
+ /* The shot keeps its own aspect ratio: cover-cropping a screenshot cuts its edges. */
21
+ .l-product img.shot { display: block; width: 100%; height: auto; }
22
+ .l-product div.shot { display: block; width: 100%; aspect-ratio: 16 / 10; }
23
+ .l-product div.shot { background:
24
+ linear-gradient(var(--accent) 0 0) 248px 40px / 320px 26px no-repeat,
25
+ linear-gradient(color-mix(in srgb, var(--ink) 12%, transparent) 0 0) 248px 92px / 640px 14px no-repeat,
26
+ linear-gradient(color-mix(in srgb, var(--ink) 12%, transparent) 0 0) 248px 120px / 520px 14px no-repeat,
27
+ linear-gradient(var(--accent-2) 0 0) 248px 176px / 300px 300px no-repeat,
28
+ linear-gradient(color-mix(in srgb, var(--ink) 8%, transparent) 0 0) 580px 176px / 308px 300px no-repeat,
29
+ linear-gradient(color-mix(in srgb, var(--ink) 6%, transparent) 0 0) 0 0 / 210px 100% no-repeat; }
30
+ .l-product .frame.phone { width: 300px; justify-self: center; border-radius: 40px; padding: 12px; background: var(--ink); }
31
+ .l-product .frame.phone .bar { display: none; }
32
+ .l-product .frame.phone .shot { aspect-ratio: 9 / 19.5; border-radius: 28px; }
33
+ .l-product .callout { position: absolute; left: 28px; bottom: 28px; padding: 12px 20px; border-radius: 999px; background: var(--ink); color: var(--paper); font-weight: 700; font-size: 22px; }
34
+ @media (max-width: 650px) {
35
+ .l-product { display: flex; flex-direction: column; align-items: stretch; }
36
+ .l-product .text { gap: 10px; }
37
+ .l-product .frame { border-radius: 12px; }
38
+ .l-product .bar { height: 26px; padding: 0 10px; gap: 5px; }
39
+ .l-product .bar i { width: 7px; height: 7px; }
40
+ .l-product .bar span { font-size: 9px; padding: 2px 8px; margin-left: 6px; }
41
+ .l-product div.shot { background-size: 30% 6%, 60% 2%, 50% 2%, 28% 40%, 28% 40%, 20% 100%; background-position: 26% 8%, 40% 18%, 36% 23%, 26% 70%, 62% 70%, 0 0; }
42
+ .l-product .callout { left: 10px; bottom: 10px; padding: 6px 12px; font-size: 12px; }
43
+ }
44
+ </style>
45
+ <section class="slide l-product" id="__ID__" data-chapter="The product" data-note="Screenshot: name the page and the date it was captured.">
46
+ <div class="text">
47
+ <div class="kicker">The product</div>
48
+ <h2 class="tt" data-title-mobile="Here it is.">Here it is, doing the job.</h2>
49
+ <p class="lead">One line on what the screenshot shows.</p>
50
+ </div>
51
+ <div class="frame" id="__ID__-frame">
52
+ <div class="bar"><i></i><i></i><i></i><span>app.example.com</span></div>
53
+ <div class="shot" role="img" aria-label="Product screenshot placeholder"></div>
54
+ <div class="callout reveal" id="__ID__-callout">The part to look at</div>
55
+ </div>
56
+ <div class="narration-slot"></div>
57
+ </section>
@@ -0,0 +1,31 @@
1
+ <!--
2
+ layout: quote
3
+ summary: One quote, large, with who said it. The quote is the title.
4
+ use: a customer or user in their own words. Quote them exactly and name the source in data-note.
5
+ slot: bottom-left
6
+ presenter: stage
7
+ cues: [look: #__ID__-quote] as the narration reads it.
8
+ script: In their words. [look: #__ID__-quote] Here is what they told us.
9
+ -->
10
+ <style>
11
+ .l-quote .content { flex: 1; display: flex; flex-direction: column; justify-content: center; gap: 36px; padding-left: 500px; }
12
+ .l-quote .quote { font-size: 76px; line-height: 1.02; letter-spacing: -.035em; text-indent: -.42em; }
13
+ .l-quote figcaption { display: flex; align-items: center; gap: 18px; }
14
+ /* Swap the span for an <img class="avatar"> of your file with their permission. */
15
+ .l-quote .avatar { display: grid; place-items: center; width: 72px; height: 72px; border-radius: 50%; object-fit: cover; background: var(--ink); color: var(--accent); font: 700 26px var(--font); }
16
+ .l-quote figcaption b { display: block; font-size: var(--t-body); }
17
+ .l-quote figcaption small { font: var(--t-label) var(--mono); letter-spacing: .08em; text-transform: uppercase; opacity: .7; }
18
+ @media (max-width: 650px) {
19
+ .l-quote .content { padding-left: 0; justify-content: flex-start; gap: 18px; }
20
+ .l-quote .quote { font-size: 32px; }
21
+ .l-quote .avatar { width: 44px; height: 44px; font-size: 16px; }
22
+ }
23
+ </style>
24
+ <section class="slide on-accent l-quote slot-left" id="__ID__" data-chapter="In their words" data-note="Quote: name who said it, where (email, call, review) and when.">
25
+ <figure class="content">
26
+ <div class="kicker">In their words</div>
27
+ <h2 class="tt quote" id="__ID__-quote" data-title-mobile="“It explained itself.”">“The deck explained itself before I got on the call.”</h2>
28
+ <figcaption><span class="avatar">AD</span><span><b>Their name</b><small>Role, company</small></span></figcaption>
29
+ </figure>
30
+ <div class="narration-slot"></div>
31
+ </section>
@@ -0,0 +1,37 @@
1
+ <!--
2
+ layout: team
3
+ summary: Up to four people, a face, a name and a role each; the presenter flies under each as it names them.
4
+ use: who is behind it, who to talk to. Use real photos only with permission; initials otherwise.
5
+ slot: bottom-right
6
+ presenter: stage
7
+ cues: [go: #__ID__-p1] … [go: #__ID__-p4] at each name, then [go: slot].
8
+ script: Meet the team. [go: #__ID__-p1] Ana builds it. [go: #__ID__-p2] Sam sells it. [go: #__ID__-p3] Lee runs it. [go: #__ID__-p4] Kai designs it. [go: slot]
9
+ -->
10
+ <style>
11
+ .l-team .people { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; margin-top: 20px; }
12
+ .l-team .person { list-style: none; display: flex; flex-direction: column; align-items: flex-start; gap: 6px; padding: 24px 26px; border-radius: 28px; background: var(--card); box-shadow: 0 0 0 1px color-mix(in srgb, var(--ink) 10%, transparent); }
13
+ /* Swap the span for an <img class="face"> of your file with their permission. */
14
+ .l-team .face { display: grid; place-items: center; width: 96px; height: 96px; margin-bottom: 8px; border-radius: 50%; object-fit: cover; background: var(--accent); font: 700 34px var(--font); }
15
+ .l-team .person:nth-child(2) .face { background: var(--accent-2); }
16
+ .l-team .person:nth-child(3) .face { background: var(--ink); color: var(--paper); }
17
+ .l-team b { font-size: 30px; letter-spacing: -.02em; }
18
+ .l-team small { font: var(--t-label) var(--mono); letter-spacing: .08em; text-transform: uppercase; opacity: .7; }
19
+ @media (max-width: 650px) {
20
+ .l-team .people { grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 4px; }
21
+ .l-team .person { padding: 12px; border-radius: 16px; gap: 2px; }
22
+ .l-team .face { width: 48px; height: 48px; font-size: 17px; margin-bottom: 4px; }
23
+ .l-team b { font-size: 16px; }
24
+ .l-team small { font-size: 10px; }
25
+ }
26
+ </style>
27
+ <section class="slide l-team" id="__ID__" data-chapter="The team" data-note="People: names and roles as they gave them; photos only with their permission.">
28
+ <div class="kicker">The team</div>
29
+ <h2 class="tt" data-title-mobile="The team.">Who is behind it.</h2>
30
+ <ul class="people">
31
+ <li class="person" id="__ID__-p1"><span class="face">AN</span><b>Ana</b><small>Builds it</small></li>
32
+ <li class="person" id="__ID__-p2"><span class="face">SA</span><b>Sam</b><small>Sells it</small></li>
33
+ <li class="person" id="__ID__-p3"><span class="face">LE</span><b>Lee</b><small>Runs it</small></li>
34
+ <li class="person" id="__ID__-p4"><span class="face">KA</span><b>Kai</b><small>Designs it</small></li>
35
+ </ul>
36
+ <div class="narration-slot"></div>
37
+ </section>
@@ -0,0 +1,39 @@
1
+ <!--
2
+ layout: timeline
3
+ summary: Four milestones on a line, left to right, the presenter flying under each in turn.
4
+ use: history, a roadmap, a process over time. Label future steps "Proposed" if not agreed.
5
+ slot: bottom-right
6
+ presenter: stage
7
+ cues: [go: #__ID__-m1] … [go: #__ID__-m4] at the word that starts each milestone, then [go: slot].
8
+ script: It started [go: #__ID__-m1] with a sketch. Then [go: #__ID__-m2] a first user. Then [go: #__ID__-m3] a launch. Next, [go: #__ID__-m4] the plan. [go: slot]
9
+ -->
10
+ <style>
11
+ .l-timeline .line { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; margin-top: 28px; position: relative; }
12
+ .l-timeline .line::before { content: ""; position: absolute; left: 0; right: 0; top: 13px; height: 4px; border-radius: 2px; background: color-mix(in srgb, var(--ink) 16%, transparent); }
13
+ .l-timeline li { list-style: none; position: relative; padding: 48px 26px 26px; border-radius: 24px; }
14
+ .l-timeline li::before { content: ""; position: absolute; left: 26px; top: 3px; width: 24px; height: 24px; border-radius: 50%; background: var(--ink); box-shadow: 0 0 0 6px var(--paper); }
15
+ .l-timeline li.is-next::before { background: var(--paper); box-shadow: inset 0 0 0 4px var(--ink), 0 0 0 6px var(--paper); }
16
+ .l-timeline time { display: block; font: 700 var(--t-label) var(--mono); letter-spacing: .12em; text-transform: uppercase; margin-bottom: 10px; }
17
+ .l-timeline b { display: block; font-size: 32px; letter-spacing: -.02em; line-height: 1.05; margin-bottom: 8px; }
18
+ .l-timeline p { font-size: 20px; line-height: 1.3; opacity: .7; }
19
+ @media (max-width: 650px) {
20
+ .l-timeline .line { grid-template-columns: 1fr; gap: 4px; margin-top: 4px; padding-left: 26px; }
21
+ .l-timeline .line::before { left: 7px; right: auto; top: 6px; bottom: 6px; width: 3px; height: auto; }
22
+ .l-timeline li { padding: 4px 0 8px 8px; border-radius: 0; }
23
+ .l-timeline li::before { left: -26px; top: 6px; width: 15px; height: 15px; box-shadow: 0 0 0 4px var(--paper); }
24
+ .l-timeline time { margin-bottom: 2px; }
25
+ .l-timeline b { font-size: 18px; margin-bottom: 2px; }
26
+ .l-timeline p { font-size: 13px; }
27
+ }
28
+ </style>
29
+ <section class="slide l-timeline" id="__ID__" data-chapter="How we got here" data-note="Source: name where each date comes from.">
30
+ <div class="kicker">How we got here</div>
31
+ <h2 class="tt" data-title-mobile="How we got here.">Four steps, so far.</h2>
32
+ <ol class="line">
33
+ <li id="__ID__-m1"><time>Jan</time><b>A sketch</b><p>The first version, on paper.</p></li>
34
+ <li id="__ID__-m2"><time>Apr</time><b>A first user</b><p>Someone used it for real.</p></li>
35
+ <li id="__ID__-m3"><time>Sep</time><b>Launch</b><p>Open to everyone.</p></li>
36
+ <li id="__ID__-m4" class="is-next"><time>Next</time><b>Proposed</b><p>Not agreed yet.</p></li>
37
+ </ol>
38
+ <div class="narration-slot"></div>
39
+ </section>
@@ -4,29 +4,71 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>__TITLE__</title>
7
+ <!-- Loading state (keep verbatim; `hyperdecks check` requires it). Until the
8
+ player marks body[data-hd-ready] the page shows only the slide card, at its
9
+ final size, in the deck's --hd-ground (its first slide's colour) on the
10
+ page's brand colour, with a quiet loader in --hd-ground-ink; then the
11
+ slides fade in. If the player never arrives, the slides show after 10 s
12
+ rather than never. Put data-layout="overlay" on <html> for the overlay. -->
13
+ <link rel="modulepreload" href="https://decks.hypersocial.ai/player/v1/player.js">
14
+ <link rel="preload" as="style" href="https://decks.hypersocial.ai/player/v1/player.css">
15
+ <script>if (self !== top || /[?&]thumb\b/.test(location.search)) document.documentElement.dataset.hdFrame = "";</script>
16
+ <style data-hd-loading>
17
+ body:not([data-hd-ready]) { overflow: hidden; background: var(--hd-frame, var(--hd-ground, var(--hd-accent, #ffda1b))); animation: hd-fail-open 0s 10s forwards; }
18
+ body:not([data-hd-ready]) > * { visibility: hidden; animation: hd-fail-open 0s 10s forwards; }
19
+ body[data-hd-ready] > * { animation: hd-in .2s ease-out; }
20
+ body::before, body::after { content: ""; position: fixed; z-index: -1; pointer-events: none; transition: opacity .2s ease-out; }
21
+ /* The card as the player draws it (player.css, framed): 16:9, scaled to fit
22
+ between the 64px masthead and the 56px dock, 24px in from the sides. */
23
+ body::before { inset: 64px 24px 56px; margin: auto; width: min(100vw - 48px, (100dvh - 120px) * 16 / 9); height: min(100dvh - 120px, (100vw - 48px) * 9 / 16); border-radius: calc(min(100vw - 48px, (100dvh - 120px) * 16 / 9) * .01125); background: var(--hd-ground, #fff); box-shadow: 0 0 0 1px color-mix(in srgb, var(--hd-ground-ink, #0b0b0f) 16%, transparent); }
24
+ body::after { left: 50%; top: 50%; width: 12px; height: 12px; margin: -6px 0 0 -6px; border-radius: 50%; color: var(--hd-ground-ink, #0b0b0f); background: currentColor; box-shadow: -24px 0 currentColor, 24px 0 currentColor; opacity: 0; animation: hd-dots .7s ease-in-out .6s infinite alternate; }
25
+ body[data-hd-ready]::before, body[data-hd-ready]::after { opacity: 0; animation: none; }
26
+ /* The overlay (embedded, ?thumb, or data-layout="overlay"): the stage fills the window. */
27
+ :is([data-hd-frame], [data-layout="overlay"]) body::before { inset: 0; width: min(100vw, 100dvh * 16 / 9); height: min(100dvh, 100vw * 9 / 16); border-radius: calc(min(100vw, 100dvh * 16 / 9) * .01125); box-shadow: none; }
28
+ [data-layout="overlay"] body:not([data-hd-ready]) { background: var(--hd-backdrop, #16161c); }
29
+ [data-hd-frame] body:not([data-hd-ready]) { background: transparent; }
30
+ [data-hd-frame] body::before { border-radius: 0; }
31
+ /* Phones: the card fills the space between a 52px masthead and the dock, 8px in. */
32
+ @media (max-width: 650px) {
33
+ body::before { inset: 52px 8px calc(56px + env(safe-area-inset-bottom)); width: auto; height: auto; border-radius: 14px; }
34
+ :is([data-hd-frame], [data-layout="overlay"]) body::before { inset: 0; width: auto; height: auto; border-radius: 0; }
35
+ }
36
+ @media (prefers-reduced-motion: reduce) {
37
+ body::before, body::after { transition: none; }
38
+ body:not([data-hd-ready])::after { animation: none; opacity: .4; }
39
+ body[data-hd-ready] > * { animation: none; }
40
+ }
41
+ @keyframes hd-in { from { opacity: 0; } }
42
+ @keyframes hd-dots { from { opacity: .15; } to { opacity: .6; } }
43
+ @keyframes hd-fail-open { to { visibility: visible; overflow: auto; } }
44
+ </style>
7
45
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
46
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
47
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;700&family=Space+Mono:wght@400;700&display=swap">
10
48
  <style>
11
49
  /* A narrated deck: slides only. The hosted player (player/v1) scales the
12
50
  stage, draws the chrome and the presenter, and plays the narration. */
13
- :root { --ink: #0b0b0f; --paper: #fafaf7; --accent: #ffda1b; --font: "Space Grotesk", system-ui, sans-serif; --mono: "Space Mono", ui-monospace, monospace; }
51
+ :root { --ink: #0b0b0f; --paper: #fafaf7; --accent: #ffda1b; --font: "Space Grotesk", system-ui, sans-serif; --mono: "Space Mono", ui-monospace, monospace;
52
+ --hd-ground: var(--accent); --hd-ground-ink: var(--ink); /* the loading state: the first slide's colours */ }
14
53
  body { color: var(--ink); font-family: var(--font); --hd-font: var(--font); --hd-mono: var(--mono); }
15
54
  .slide { display: flex; flex-direction: column; gap: 28px; padding: 64px 72px 56px; background: var(--paper); }
16
55
  .slide.accent { background: var(--accent); }
17
56
  .kicker { font: 18px var(--mono); letter-spacing: .16em; text-transform: uppercase; }
18
57
  .tt { font-size: 104px; line-height: .95; letter-spacing: -.045em; margin: 0; text-wrap: balance; }
19
58
  .lead { font-size: 32px; line-height: 1.3; max-width: 30em; margin: 0; }
20
- .content { flex: 1; display: flex; flex-direction: column; justify-content: center; gap: 28px; padding-right: 320px; }
21
- /* The presenter (face + caption bubble) moves into each slide's slot. */
59
+ .content { flex: 1; display: flex; flex-direction: column; justify-content: center; gap: 28px; padding-right: 500px; }
60
+ /* The presenter glides to each slide's slot; slots alternate sides so the
61
+ move shows. A .slot-left slide keeps its text clear of the left side. */
22
62
  .narration-slot { position: absolute; right: 56px; bottom: 72px; }
63
+ .slot-left .narration-slot { right: auto; left: 56px; }
64
+ .slot-left .content { padding-right: 0; padding-left: 500px; }
23
65
  .reveal { opacity: 0; transition: opacity .4s; }
24
66
  .reveal.is-revealed { opacity: 1; }
25
67
  @media (max-width: 650px) {
26
68
  .slide { padding: 40px 20px 150px; }
27
69
  .tt { font-size: 40px; }
28
70
  .lead { font-size: 18px; }
29
- .content { padding-right: 0; justify-content: flex-start; }
71
+ .content, .slot-left .content { padding: 0; justify-content: flex-start; }
30
72
  .narration-slot { right: 12px; left: 12px; bottom: 72px; }
31
73
  }
32
74
  </style>
@@ -39,7 +81,9 @@
39
81
  `hyperdecks check` fails a slide without one.
40
82
  data-intro: the bubble's text before the narration plays.
41
83
  data-title-mobile: shorter text below 650px; check requires it on any title
42
- over 28 characters. Every slide here carries one. -->
84
+ over 28 characters. Every slide here carries one.
85
+ data-presenter-style: this slide's presenter (stage, bubble, glass, corner),
86
+ overriding the deck's on the player tag below. -->
43
87
  <section class="slide accent" id="hello" data-chapter="Hello" data-intro="Hi! Press play." data-note="Title slide: no facts.">
44
88
  <div class="content">
45
89
  <div class="kicker">__SLUG__</div>
@@ -48,7 +92,7 @@
48
92
  <div class="narration-slot"></div>
49
93
  </section>
50
94
 
51
- <section class="slide" id="problem" data-chapter="Problem" data-note="Source: name the document, email or thread the problem comes from.">
95
+ <section class="slide slot-left" id="problem" data-chapter="Problem" data-note="Source: name the document, email or thread the problem comes from.">
52
96
  <div class="content">
53
97
  <div class="kicker">The problem</div>
54
98
  <h2 class="tt" data-title-mobile="The problem.">The problem, in one line.</h2>
@@ -66,7 +110,7 @@
66
110
  <div class="narration-slot"></div>
67
111
  </section>
68
112
 
69
- <section class="slide" id="idea" data-chapter="The idea" data-note="Source: name the doc or conversation the idea is drawn from.">
113
+ <section class="slide slot-left" id="idea" data-chapter="The idea" data-note="Source: name the doc or conversation the idea is drawn from.">
70
114
  <div class="content">
71
115
  <div class="kicker">The idea</div>
72
116
  <h2 class="tt" data-title-mobile="The idea.">One idea per slide.</h2>
@@ -84,7 +128,7 @@
84
128
  <div class="narration-slot"></div>
85
129
  </section>
86
130
 
87
- <section class="slide" id="proof" data-chapter="Proof" data-note="Source: name the metric's dashboard, report or email, with its date.">
131
+ <section class="slide slot-left" id="proof" data-chapter="Proof" data-note="Source: name the metric's dashboard, report or email, with its date.">
88
132
  <div class="content">
89
133
  <div class="kicker">Proof</div>
90
134
  <h2 class="tt" data-title-mobile="The proof.">The evidence so far.</h2>
@@ -102,7 +146,7 @@
102
146
  <div class="narration-slot"></div>
103
147
  </section>
104
148
 
105
- <section class="slide" id="bye" data-chapter="Bye" data-note="Closing slide: no facts.">
149
+ <section class="slide slot-left" id="bye" data-chapter="Bye" data-note="Closing slide: no facts.">
106
150
  <div class="content">
107
151
  <h2 class="tt" data-title-mobile="Thanks.">Thanks for watching.</h2>
108
152
  </div>
@@ -111,9 +155,11 @@
111
155
 
112
156
  <!-- `hyperdecks narrate decks/__SLUG__` fills data-manifest with the manifest
113
157
  URL it writes. data-presenter: head (live Minimoji, needs
114
- data-avatar), static (data-presenter-image) or none (captions only). -->
158
+ data-avatar), static (data-presenter-image) or none (captions only).
159
+ data-presenter-style: stage (large head, lower-third captions), bubble,
160
+ glass (frosted panel) or corner (small head, subtitles). -->
115
161
  <script type="module" src="https://decks.hypersocial.ai/player/v1/player.js"
116
- data-manifest="" data-stage="1600x900" data-presenter="none"></script>
162
+ data-manifest="" data-stage="1600x900" data-presenter="none" data-presenter-style="__PRESENTER_STYLE__"></script>
117
163
  <!-- Slide controllers for anything the built-in cues don't cover:
118
164
  <script type="module">
119
165
  window.hyperdecks.register("point", {
@@ -9,7 +9,10 @@ One `## <slide-id>` block per slide, in slide order; the id is the slide's
9
9
  phrase (4 to 85 characters, two lines in the bubble). Aim for 150 to 180 s in
10
10
  all. Holds: 1.1 s by default, `hold: 2` on interactive slides. Stage tags become
11
11
  cues at the word before them: [wave], [mood: excited], [reveal: #detail],
12
- [custom: confetti]. With no `voice:` above, your first ready voice narrates.
12
+ [go: #detail] (the presenter flies beside it; [go: slot] brings it home),
13
+ [look: h2] (the head looks at it), [custom: confetti]. `presenterStyle: stage`
14
+ above sets the deck's presenter; `presenter-style: corner` under a heading sets
15
+ one slide's. With no `voice:` above, your first ready voice narrates.
13
16
 
14
17
  hyperdecks narrate decks/__SLUG__ --dry-run
15
18
  hyperdecks narrate decks/__SLUG__
@@ -25,7 +28,7 @@ Here is the problem. It costs people real time.
25
28
  Why now? Something just changed.
26
29
 
27
30
  ## idea
28
- Every slide makes one point. Here is the detail. [reveal: #detail]
31
+ Every slide makes one point. Here is the detail. [reveal: #detail] [go: #detail]
29
32
 
30
33
  ## how
31
34
  It works in three steps. Each one is simple.