rikiki-deck 0.1.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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +183 -0
  3. package/dist/deck-badge.d.ts +13 -0
  4. package/dist/deck-badge.d.ts.map +1 -0
  5. package/dist/deck-badge.js +1 -0
  6. package/dist/deck-callout.d.ts +13 -0
  7. package/dist/deck-callout.d.ts.map +1 -0
  8. package/dist/deck-callout.js +1 -0
  9. package/dist/deck-card.d.ts +15 -0
  10. package/dist/deck-card.d.ts.map +1 -0
  11. package/dist/deck-card.js +1 -0
  12. package/dist/deck-code.d.ts +22 -0
  13. package/dist/deck-code.d.ts.map +1 -0
  14. package/dist/deck-code.js +2 -0
  15. package/dist/deck-cover.d.ts +23 -0
  16. package/dist/deck-cover.d.ts.map +1 -0
  17. package/dist/deck-cover.js +10 -0
  18. package/dist/deck-feature-cards.d.ts +12 -0
  19. package/dist/deck-feature-cards.d.ts.map +1 -0
  20. package/dist/deck-feature-cards.js +9 -0
  21. package/dist/deck-feature.d.ts +12 -0
  22. package/dist/deck-feature.d.ts.map +1 -0
  23. package/dist/deck-feature.js +5 -0
  24. package/dist/deck-grid.d.ts +18 -0
  25. package/dist/deck-grid.d.ts.map +1 -0
  26. package/dist/deck-grid.js +1 -0
  27. package/dist/deck-help.d.ts +3 -0
  28. package/dist/deck-help.d.ts.map +1 -0
  29. package/dist/deck-help.js +82 -0
  30. package/dist/deck-kicker.d.ts +6 -0
  31. package/dist/deck-kicker.d.ts.map +1 -0
  32. package/dist/deck-kicker.js +1 -0
  33. package/dist/deck-md.d.ts +14 -0
  34. package/dist/deck-md.d.ts.map +1 -0
  35. package/dist/deck-md.js +3 -0
  36. package/dist/deck-mermaid.d.ts +28 -0
  37. package/dist/deck-mermaid.d.ts.map +1 -0
  38. package/dist/deck-mermaid.js +3 -0
  39. package/dist/deck-metric.d.ts +20 -0
  40. package/dist/deck-metric.d.ts.map +1 -0
  41. package/dist/deck-metric.js +1 -0
  42. package/dist/deck-notes.d.ts +13 -0
  43. package/dist/deck-notes.d.ts.map +1 -0
  44. package/dist/deck-notes.js +1 -0
  45. package/dist/deck-overview.d.ts +16 -0
  46. package/dist/deck-overview.d.ts.map +1 -0
  47. package/dist/deck-overview.js +202 -0
  48. package/dist/deck-photo.d.ts +17 -0
  49. package/dist/deck-photo.d.ts.map +1 -0
  50. package/dist/deck-photo.js +1 -0
  51. package/dist/deck-presenter.d.ts +3 -0
  52. package/dist/deck-presenter.d.ts.map +1 -0
  53. package/dist/deck-presenter.js +148 -0
  54. package/dist/deck-punch.d.ts +18 -0
  55. package/dist/deck-punch.d.ts.map +1 -0
  56. package/dist/deck-punch.js +1 -0
  57. package/dist/deck-root.d.ts +76 -0
  58. package/dist/deck-root.d.ts.map +1 -0
  59. package/dist/deck-root.js +11 -0
  60. package/dist/deck-section.d.ts +12 -0
  61. package/dist/deck-section.d.ts.map +1 -0
  62. package/dist/deck-section.js +3 -0
  63. package/dist/deck-shortcut.d.ts +30 -0
  64. package/dist/deck-shortcut.d.ts.map +1 -0
  65. package/dist/deck-shortcut.js +7 -0
  66. package/dist/deck-split.d.ts +19 -0
  67. package/dist/deck-split.d.ts.map +1 -0
  68. package/dist/deck-split.js +7 -0
  69. package/dist/deck-stack.d.ts +19 -0
  70. package/dist/deck-stack.d.ts.map +1 -0
  71. package/dist/deck-stack.js +1 -0
  72. package/dist/deck-stat.d.ts +15 -0
  73. package/dist/deck-stat.d.ts.map +1 -0
  74. package/dist/deck-stat.js +4 -0
  75. package/dist/deck-step-list.d.ts +18 -0
  76. package/dist/deck-step-list.d.ts.map +1 -0
  77. package/dist/deck-step-list.js +2 -0
  78. package/dist/deck-takeaway.d.ts +12 -0
  79. package/dist/deck-takeaway.d.ts.map +1 -0
  80. package/dist/deck-takeaway.js +4 -0
  81. package/dist/deck-tier-list.d.ts +26 -0
  82. package/dist/deck-tier-list.d.ts.map +1 -0
  83. package/dist/deck-tier-list.js +1 -0
  84. package/dist/deck-transition.d.ts +3 -0
  85. package/dist/deck-transition.d.ts.map +1 -0
  86. package/dist/deck-transition.js +51 -0
  87. package/dist/index.d.ts +25 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +58 -0
  90. package/dist/livereload.d.ts +2 -0
  91. package/dist/livereload.d.ts.map +1 -0
  92. package/dist/livereload.js +1 -0
  93. package/dist/shared-styles.d.ts +5 -0
  94. package/dist/shared-styles.d.ts.map +1 -0
  95. package/dist/shared-styles.js +1 -0
  96. package/dist/shiki-plugin.d.ts +11 -0
  97. package/dist/shiki-plugin.d.ts.map +1 -0
  98. package/dist/shiki-plugin.js +1 -0
  99. package/dist/standalone.js +539 -0
  100. package/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 +0 -0
  101. package/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 +0 -0
  102. package/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 +0 -0
  103. package/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2 +0 -0
  104. package/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2 +0 -0
  105. package/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2 +0 -0
  106. package/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 +0 -0
  107. package/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 +0 -0
  108. package/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 +0 -0
  109. package/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwlxdu.woff2 +0 -0
  110. package/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmBduz8A.woff2 +0 -0
  111. package/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3iu4nwmRduz8A.woff2 +0 -0
  112. package/fonts/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx7cwhsk.woff2 +0 -0
  113. package/fonts/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxDcwg.woff2 +0 -0
  114. package/fonts/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx_cwhsk.woff2 +0 -0
  115. package/package.json +61 -0
  116. package/themes/rikiki.css +430 -0
  117. package/themes/siliceum-fonts.css +126 -0
  118. package/themes/siliceum.css +380 -0
  119. package/tokens.css +10 -0
@@ -0,0 +1,28 @@
1
+ import { LitElement } from 'lit';
2
+ interface MermaidLib {
3
+ initialize(opts: Record<string, unknown>): void;
4
+ render(id: string, source: string): Promise<{
5
+ svg: string;
6
+ }>;
7
+ }
8
+ declare global {
9
+ interface Window {
10
+ mermaid?: MermaidLib;
11
+ }
12
+ }
13
+ export declare class DeckMermaid extends LitElement {
14
+ static styles: import("lit").CSSResult;
15
+ rendered: boolean;
16
+ private _svg;
17
+ private _source;
18
+ connectedCallback(): void;
19
+ private _render;
20
+ render(): import("lit-html").TemplateResult<1>;
21
+ }
22
+ declare global {
23
+ interface HTMLElementTagNameMap {
24
+ 'deck-mermaid': DeckMermaid;
25
+ }
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=deck-mermaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-mermaid.d.ts","sourceRoot":"","sources":["../src/deck-mermaid.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,UAAU,UAAU;IAClB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AACD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QAAG,OAAO,CAAC,EAAE,UAAU,CAAC;KAAE;CAC3C;AAkCD,qBACa,WAAY,SAAQ,UAAU;IAKzC,OAAgB,MAAM,0BAgBpB;IAE0C,QAAQ,UAAS;IACpD,OAAO,CAAC,IAAI,CAAM;IAC3B,OAAO,CAAC,OAAO,CAAM;IAEZ,iBAAiB;YAcZ,OAAO;IAeZ,MAAM;CAGhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,WAAW,CAAC;KAC7B;CACF"}
@@ -0,0 +1,3 @@
1
+ var c=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var o=(n,t,i,r)=>{for(var e=r>1?void 0:r?l(t,i):t,d=n.length-1,s;d>=0;d--)(s=n[d])&&(e=(r?s(t,i,e):s(e))||e);return r&&e&&c(t,i,e),e};import{LitElement as h,html as v,css as g}from"https://cdn.jsdelivr.net/npm/lit@3/+esm";import{customElement as p,property as u,state as f}from"https://cdn.jsdelivr.net/npm/lit@3/decorators.js/+esm";var m=!1;async function w(){m||(window.mermaid||await new Promise((n,t)=>{let i=document.createElement("script");i.src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js",i.onload=()=>n(),i.onerror=()=>t(new Error("mermaid failed to load")),document.head.appendChild(i)}),window.mermaid.initialize({startOnLoad:!1,theme:"dark",themeVariables:{background:"#0f0f10",mainBkg:"#2a2a2a",nodeBorder:"#555",lineColor:"#777",textColor:"#e5e5e5",fontSize:"13px",edgeLabelBackground:"#111"},flowchart:{curve:"basis",htmlLabels:!0,padding:12},securityLevel:"loose"}),m=!0)}var b=0,a=class extends h{constructor(){super(...arguments);this.rendered=!1;this._svg="";this._source=""}connectedCallback(){super.connectedCallback(),this._source=(this.textContent??"").trim();let i=this._source.split(`
2
+ `),r=i.filter(e=>e.trim()).reduce((e,d)=>Math.min(e,d.match(/^ */)?.[0].length??0),1/0);r<1/0&&(this._source=i.map(e=>e.slice(r)).join(`
3
+ `)),this._render()}async _render(){if(!this._source)return;await w();let i=`mmd-${++b}`;try{let{svg:r}=await window.mermaid.render(i,this._source);this._svg=r,this.rendered=!0}catch(r){console.error("Mermaid render error",r);let e=r instanceof Error?r.message:String(r);this._svg=`<pre style="color:#f87171">${e}</pre>`}}render(){return v`<div class="canvas" .innerHTML="${this._svg}"></div>`}};a.styles=g`:host{display:flex;align-items:center;justify-content:center;background:var(--deck-mermaid-bg,var(--rik-code__bg));border:1px solid var(--deck-mermaid-border,var(--rik-code__border));border-radius:var(--deck-mermaid-radius,var(--rik-radius-md));padding:var(--deck-mermaid-padding,var(--rik-space-4));box-shadow:var(--rik-elevation-2);overflow:hidden;min-width:0}:host([compact]){padding:var(--rik-space-2)}.canvas{width:100%;max-width:100%;text-align:center;overflow:hidden}.canvas svg{width:100% !important;height:auto !important;max-width:100% !important;max-height:60vh}:host([compact]) .canvas{max-width:60%}:host([compact]) .canvas svg{max-height:22vh}`,o([u({type:Boolean,reflect:!0})],a.prototype,"rendered",2),o([f()],a.prototype,"_svg",2),a=o([p("deck-mermaid")],a);export{a as DeckMermaid};
@@ -0,0 +1,20 @@
1
+ import { LitElement } from 'lit';
2
+ export type DeckMetricSeverity = 'bad' | 'warn' | 'ok' | 'info';
3
+ export declare class DeckMetricList extends LitElement {
4
+ static styles: import("lit").CSSResult;
5
+ render(): import("lit-html").TemplateResult<1>;
6
+ }
7
+ export declare class DeckMetric extends LitElement {
8
+ static styles: import("lit").CSSResult;
9
+ value?: string;
10
+ severity?: DeckMetricSeverity;
11
+ mono: boolean;
12
+ render(): import("lit-html").TemplateResult<1>;
13
+ }
14
+ declare global {
15
+ interface HTMLElementTagNameMap {
16
+ 'deck-metric-list': DeckMetricList;
17
+ 'deck-metric': DeckMetric;
18
+ }
19
+ }
20
+ //# sourceMappingURL=deck-metric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-metric.d.ts","sourceRoot":"","sources":["../src/deck-metric.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;AAEhE,qBACa,cAAe,SAAQ,UAAU;IAC5C,OAAgB,MAAM,0BAEpB;IACO,MAAM;CAChB;AAED,qBACa,UAAW,SAAQ,UAAU;IAMxC,OAAgB,MAAM,0BAuBpB;IAE0B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC7B,IAAI,UAAS;IAEjC,MAAM;CAMhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,cAAc,CAAC;QACnC,aAAa,EAAE,UAAU,CAAC;KAC3B;CACF"}
@@ -0,0 +1 @@
1
+ var k=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var a=(o,t,l,s)=>{for(var r=s>1?void 0:s?p(t,l):t,d=o.length-1,n;d>=0;d--)(n=o[d])&&(r=(s?n(t,l,r):n(r))||r);return s&&r&&k(t,l,r),r};import{LitElement as c,html as m,css as u}from"https://cdn.jsdelivr.net/npm/lit@3/+esm";import{customElement as f,property as v}from"https://cdn.jsdelivr.net/npm/lit@3/decorators.js/+esm";var i=class extends c{render(){return m`<slot></slot>`}};i.styles=u`:host{display:flex;flex-direction:column;gap:var(--rik-space-2)}`,i=a([f("deck-metric-list")],i);var e=class extends c{constructor(){super(...arguments);this.mono=!1}render(){return m`<span class="label ${this.mono?"mono":""}"><slot></slot></span> <span class="value" data-severity="${this.severity??""}">${this.value}</span>`}};e.styles=u`:host{display:flex;justify-content:space-between;align-items:center;background:var(--deck-metric-bg,var(--rik-surface-raised--strong));border:1px solid var(--deck-metric-border,var(--rik-border-default));border-radius:var(--deck-metric-radius,var(--rik-radius-md));padding:var(--deck-metric-padding-y,var(--rik-space-2)) var(--deck-metric-padding-x,var(--rik-space-4));font-family:var(--rik-font-sans);font-size:var(--rik-font-size-body);color:var(--deck-metric-text,var(--rik-text-default--muted));box-shadow:var(--deck-metric-shadow,var(--rik-elevation-2))}.label{font-family:inherit}.label.mono{font-family:var(--rik-font-mono);font-size:var(--rik-font-size-sm);color:var(--deck-metric-label-color,var(--rik-text-default--faint))}.value{font-weight:700}.value[data-severity="bad"]{color:var(--deck-metric-value-bad,var(--rik-status-danger))}.value[data-severity="warn"]{color:var(--deck-metric-value-warn,var(--rik-status-warn))}.value[data-severity="ok"]{color:var(--deck-metric-value-ok,var(--rik-status-success))}.value[data-severity="info"]{color:var(--deck-metric-value-info,var(--rik-status-info__text))}`,a([v({type:String})],e.prototype,"value",2),a([v({type:String})],e.prototype,"severity",2),a([v({type:Boolean})],e.prototype,"mono",2),e=a([f("deck-metric")],e);export{e as DeckMetric,i as DeckMetricList};
@@ -0,0 +1,13 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class DeckNotes extends LitElement {
3
+ static styles: import("lit").CSSResult;
4
+ /** Read by the presenter plugin · pre-formatted text content. */
5
+ get notes(): string;
6
+ render(): unknown;
7
+ }
8
+ declare global {
9
+ interface HTMLElementTagNameMap {
10
+ 'deck-notes': DeckNotes;
11
+ }
12
+ }
13
+ //# sourceMappingURL=deck-notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-notes.d.ts","sourceRoot":"","sources":["../src/deck-notes.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,qBACa,SAAU,SAAQ,UAAU;IACvC,OAAgB,MAAM,0BAEpB;IAEF,iEAAiE;IACjE,IAAI,KAAK,IAAI,MAAM,CAElB;IAEQ,MAAM,IAAI,OAAO;CAG3B;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,SAAS,CAAC;KACzB;CACF"}
@@ -0,0 +1 @@
1
+ var a=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var m=(o,n,s,r)=>{for(var t=r>1?void 0:r?d(n,s):n,l=o.length-1,i;l>=0;l--)(i=o[l])&&(t=(r?i(n,s,t):i(t))||t);return r&&t&&a(n,s,t),t};import{LitElement as c,css as p,html as g}from"https://cdn.jsdelivr.net/npm/lit@3/+esm";import{customElement as u}from"https://cdn.jsdelivr.net/npm/lit@3/decorators.js/+esm";var e=class extends c{get notes(){return(this.textContent??"").trim()}render(){return g`<slot></slot>`}};e.styles=p`:host{display:none}`,e=m([u("deck-notes")],e);export{e as DeckNotes};
@@ -0,0 +1,16 @@
1
+ type Slide = HTMLElement;
2
+ type Chapter = {
3
+ startIdx: number;
4
+ slides: Slide[];
5
+ };
6
+ export interface OverviewOptions {
7
+ slides: Slide[];
8
+ chapters: Chapter[];
9
+ currentIdx: number;
10
+ /** Called when the user clicks a thumbnail. The host should close the
11
+ * overview and navigate to the chosen slide. */
12
+ onPick: (idx: number) => void;
13
+ }
14
+ export declare function mountOverview(host: HTMLElement, opts: OverviewOptions): () => void;
15
+ export {};
16
+ //# sourceMappingURL=deck-overview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-overview.d.ts","sourceRoot":"","sources":["../src/deck-overview.ts"],"names":[],"mappings":"AAcA,KAAK,KAAK,GAAG,WAAW,CAAC;AACzB,KAAK,OAAO,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB;qDACiD;IACjD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAiPD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,IAAI,CAsPlF"}
@@ -0,0 +1,202 @@
1
+ var H="data-deck-overview",O="data-overview-tokens",A=`
2
+ :host([overview]) ::slotted(*) { display: none !important; }
3
+ :host([overview]) #overview-grid {
4
+ position: fixed; inset: 0;
5
+ background: var(--rik-surface-page);
6
+ overflow: hidden;
7
+ z-index: 80;
8
+ display: grid;
9
+ grid-template-rows: auto 1fr;
10
+ }
11
+
12
+ /* \u2500\u2500 Top bar \xB7 search, slide count, close hint \u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
13
+ :host([overview]) .ov-bar {
14
+ display: flex; align-items: center; gap: 16px;
15
+ padding: 14px 28px;
16
+ background: var(--rik-surface-raised);
17
+ border-bottom: 1px solid var(--rik-border-default);
18
+ font: 700 0.78rem/1 var(--rik-font-mono);
19
+ letter-spacing: 0.10em;
20
+ color: var(--rik-text-default--faint);
21
+ }
22
+ :host([overview]) .ov-bar .ov-search {
23
+ flex: 1;
24
+ appearance: none;
25
+ background: var(--rik-surface-raised--strong);
26
+ border: 1px solid var(--rik-border-default);
27
+ border-radius: var(--rik-radius-sm);
28
+ padding: 8px 14px;
29
+ font: inherit;
30
+ color: var(--rik-text-default);
31
+ letter-spacing: 0;
32
+ max-width: 480px;
33
+ }
34
+ :host([overview]) .ov-bar .ov-search:focus {
35
+ outline: none;
36
+ border-color: var(--rik-accent);
37
+ box-shadow: 0 0 0 3px var(--rik-accent--soft);
38
+ }
39
+ :host([overview]) .ov-bar .ov-count { color: var(--rik-accent); }
40
+ :host([overview]) .ov-bar .ov-hint { letter-spacing: 0.16em; text-transform: uppercase; }
41
+
42
+ /* \u2500\u2500 Sidebar layout (many slides) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
43
+ :host([overview]) .ov-body {
44
+ display: grid;
45
+ grid-template-columns: 240px 1fr;
46
+ min-height: 0;
47
+ }
48
+ :host([overview]) .ov-body.compact { grid-template-columns: 1fr; }
49
+ :host([overview]) .ov-aside {
50
+ border-right: 1px solid var(--rik-border-default);
51
+ background: var(--rik-surface-raised);
52
+ overflow-y: auto;
53
+ padding: 16px 0;
54
+ }
55
+ :host([overview]) .ov-aside-item {
56
+ display: grid;
57
+ grid-template-columns: 36px 1fr;
58
+ gap: 10px;
59
+ align-items: baseline;
60
+ padding: 10px 16px;
61
+ cursor: pointer;
62
+ border-left: 3px solid transparent;
63
+ color: var(--rik-text-default--muted);
64
+ transition: background 0.12s, color 0.12s, border-color 0.12s;
65
+ }
66
+ :host([overview]) .ov-aside-item:hover {
67
+ background: var(--rik-surface-tint);
68
+ color: var(--rik-text-default);
69
+ }
70
+ :host([overview]) .ov-aside-item[data-active] {
71
+ background: var(--rik-accent--faint);
72
+ border-left-color: var(--rik-accent);
73
+ color: var(--rik-text-default);
74
+ }
75
+ :host([overview]) .ov-aside-num {
76
+ font: 800 0.85rem/1 var(--rik-font-mono);
77
+ color: var(--rik-accent);
78
+ }
79
+ :host([overview]) .ov-aside-text {
80
+ font: 700 0.92rem/1.3 var(--rik-font-display, var(--rik-font-sans));
81
+ letter-spacing: -0.005em;
82
+ }
83
+ :host([overview]) .ov-aside-count {
84
+ font: 600 0.70rem/1 var(--rik-font-mono);
85
+ color: var(--rik-text-default--faint);
86
+ margin-top: 4px;
87
+ }
88
+
89
+ /* \u2500\u2500 Main scroll area \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
90
+ :host([overview]) .ov-main {
91
+ overflow-y: auto;
92
+ padding: 24px 32px 48px;
93
+ display: flex; flex-direction: column;
94
+ gap: 32px;
95
+ min-width: 0;
96
+ }
97
+ :host([overview]) .ov-chapter {
98
+ display: flex; flex-direction: column;
99
+ gap: 12px;
100
+ scroll-margin-top: 24px;
101
+ }
102
+ :host([overview]) .ov-chapter-head {
103
+ display: flex; align-items: baseline; gap: 12px;
104
+ padding-bottom: 6px;
105
+ border-bottom: 2px solid var(--rik-accent);
106
+ }
107
+ :host([overview]) .ov-chapter-num {
108
+ font: 800 0.85rem/1 var(--rik-font-mono);
109
+ color: var(--rik-accent);
110
+ letter-spacing: 0.12em;
111
+ }
112
+ :host([overview]) .ov-chapter-title {
113
+ font: 800 1.2rem/1.2 var(--rik-font-display, var(--rik-font-sans));
114
+ color: var(--rik-text-default);
115
+ letter-spacing: -0.012em;
116
+ flex: 1;
117
+ min-width: 0;
118
+ }
119
+ :host([overview]) .ov-chapter-count {
120
+ font: 700 0.72rem/1 var(--rik-font-mono);
121
+ color: var(--rik-text-default--faint);
122
+ letter-spacing: 0.1em;
123
+ text-transform: uppercase;
124
+ }
125
+ :host([overview]) .ov-row {
126
+ display: grid;
127
+ grid-template-columns: repeat(auto-fill, minmax(var(--ov-cell-min, 180px), 1fr));
128
+ gap: 12px;
129
+ }
130
+
131
+ /* \u2500\u2500 Path layout (\u2264 60 slides) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
132
+ :host([overview]) .ov-path .ov-row {
133
+ display: flex; gap: 14px; align-items: center; flex-wrap: wrap;
134
+ }
135
+ :host([overview]) .ov-path .ov-connector {
136
+ flex: 0 0 auto;
137
+ width: 16px; height: 2px;
138
+ background: var(--rik-border-default);
139
+ }
140
+ :host([overview]) .ov-path .ov-cell { flex: 0 0 auto; width: clamp(160px, 14vw, 260px); }
141
+
142
+ /* \u2500\u2500 Thumbnail cell \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
143
+ :host([overview]) .ov-cell {
144
+ position: relative;
145
+ aspect-ratio: 16 / 9;
146
+ background:
147
+ linear-gradient(180deg, var(--rik-surface-raised) 0%, var(--rik-surface-sunken) 100%);
148
+ border: 1px solid var(--rik-border-default);
149
+ border-radius: var(--rik-radius-md);
150
+ overflow: hidden;
151
+ cursor: pointer;
152
+ transition: border-color 0.12s ease, transform 0.12s ease, box-shadow 0.12s ease, opacity 0.15s;
153
+ box-shadow: var(--rik-elevation-1);
154
+ }
155
+ :host([overview]) .ov-cell:hover {
156
+ transform: translateY(-2px) scale(1.015);
157
+ border-color: var(--rik-accent--soft);
158
+ box-shadow: var(--rik-elevation-3);
159
+ z-index: 1;
160
+ }
161
+ :host([overview]) .ov-cell[data-current] {
162
+ border-color: var(--rik-accent);
163
+ box-shadow: 0 0 0 3px var(--rik-accent--soft), var(--rik-elevation-2);
164
+ }
165
+ :host([overview]) .ov-cell[data-filtered-out] { opacity: 0.10; pointer-events: none; transform: scale(0.96); }
166
+ :host([overview]) .ov-cell:not([data-loaded]) .ov-thumb { display: none; }
167
+ :host([overview]) .ov-cell:not([data-loaded])::before {
168
+ content: '';
169
+ position: absolute; inset: 0;
170
+ background:
171
+ linear-gradient(110deg,
172
+ transparent 0%,
173
+ transparent 38%,
174
+ rgba(42, 37, 32, 0.04) 50%,
175
+ transparent 62%,
176
+ transparent 100%);
177
+ background-size: 200% 100%;
178
+ animation: ov-shimmer 1.4s linear infinite;
179
+ }
180
+ @keyframes ov-shimmer {
181
+ from { background-position: 100% 0; }
182
+ to { background-position: -100% 0; }
183
+ }
184
+ :host([overview]) .ov-thumb {
185
+ position: absolute; top: 0; left: 0;
186
+ width: var(--ov-thumb-w, 1920px); height: var(--ov-thumb-h, 1080px);
187
+ transform: scale(var(--overview-scale, 0.2));
188
+ transform-origin: top left;
189
+ pointer-events: none;
190
+ }
191
+ :host([overview]) .ov-thumb > * { display: flex !important; }
192
+ :host([overview]) .ov-cell-label {
193
+ position: absolute; bottom: 6px; right: 8px;
194
+ font: 700 0.70rem/1 var(--rik-font-mono);
195
+ color: var(--rik-text-default);
196
+ background: rgba(255, 255, 255, 0.92);
197
+ padding: 3px 7px; border-radius: 4px;
198
+ z-index: 2;
199
+ pointer-events: none;
200
+ }
201
+ :host(:not([overview])) #overview-grid { display: none; }
202
+ `;function P(s){if(s.querySelector(`style[${H}]`))return;let i=document.createElement("style");i.setAttribute(H,"1"),i.textContent=A,s.appendChild(i)}function R(s,i){if(s.querySelector(`link[${O}]`))return;let l=document.createElement("link");l.rel="stylesheet",l.setAttribute(O,"1"),l.href=new URL("../tokens.css",i).href,s.appendChild(l)}function $(s){let l=s.slides[0]?.querySelector("h1");return l?Array.from(l.childNodes).map(r=>r.nodeName==="BR"?" ":r.textContent??"").join("").replace(/\s+/g," ").trim()||`Slide ${s.startIdx+1}`:`Slide ${s.startIdx+1}`}function z(s){return(s.textContent||"").replace(/\s+/g," ").trim().slice(0,400).toLowerCase()}function W(s,i){let l=s.shadowRoot;if(!l)return()=>{};P(l),R(l,import.meta.url);let r=l.querySelector("#overview-grid");r||(r=document.createElement("div"),r.id="overview-grid",l.appendChild(r)),r.innerHTML="";let u=i.slides.length,f=u>60,S=u>300?140:u>150?160:u>60?180:220;r.style.setProperty("--ov-cell-min",S+"px");let L=window.innerWidth,q=window.innerHeight;r.style.setProperty("--ov-thumb-w",`${L}px`),r.style.setProperty("--ov-thumb-h",`${q}px`),requestAnimationFrame(()=>{let e=r.querySelector(".ov-cell")?.clientWidth??S;r.style.setProperty("--overview-scale",String(e/L))});let x=document.createElement("div");x.className="ov-bar";let p=document.createElement("input");p.className="ov-search",p.type="search",p.placeholder=`Search ${u} slides \xB7 type to filter`,p.spellcheck=!1,x.appendChild(p);let w=document.createElement("span");w.className="ov-count",w.textContent=`${u} slides \xB7 ${i.chapters.length} chapters`,x.appendChild(w);let k=document.createElement("span");k.className="ov-hint",k.textContent="O \xB7 Esc \xB7 close",x.appendChild(k),r.appendChild(x);let b=document.createElement("div");b.className="ov-body"+(f?"":" compact"),r.appendChild(b);let h=f?document.createElement("aside"):null;h&&(h.className="ov-aside",b.appendChild(h));let g=document.createElement("div");g.className="ov-main"+(f?"":" ov-path"),b.appendChild(g);let y=[],N=[],T=new WeakMap,E=new IntersectionObserver(e=>{for(let a of e){if(!a.isIntersecting)continue;let o=a.target;if(o.dataset.loaded)continue;let d=T.get(o);if(!d)continue;let t=document.createElement("div");t.className="ov-thumb";let v=d.cloneNode(!0);v.setAttribute("active",""),t.appendChild(v),o.insertBefore(t,o.firstChild),o.dataset.loaded="1",E.unobserve(o)}},{root:null,rootMargin:"300px 0px",threshold:0});i.chapters.forEach((e,a)=>{let o=document.createElement("section");if(o.className="ov-chapter",o.id=`ov-chapter-${a}`,f){let t=document.createElement("header");t.className="ov-chapter-head";let v=document.createElement("span");v.className="ov-chapter-num",v.textContent=String(a+1).padStart(2,"0"),t.appendChild(v);let c=document.createElement("span");c.className="ov-chapter-title",c.textContent=$(e),t.appendChild(c);let n=document.createElement("span");n.className="ov-chapter-count",n.textContent=`${e.slides.length} slide${e.slides.length>1?"s":""}`,t.appendChild(n),o.appendChild(t)}let d=document.createElement("div");if(d.className="ov-row",e.slides.forEach((t,v)=>{if(!f&&v>0){let I=document.createElement("div");I.className="ov-connector",d.appendChild(I)}let c=e.startIdx+v,n=document.createElement("div");n.className="ov-cell",n.dataset.idx=String(c),n.dataset.search=z(t),c===i.currentIdx&&(n.dataset.current="1"),T.set(n,t),E.observe(n);let m=document.createElement("span");m.className="ov-cell-label",m.textContent=String(c+1),n.appendChild(m),n.addEventListener("click",()=>i.onPick(c)),d.appendChild(n)}),o.appendChild(d),g.appendChild(o),y.push(o),h){let t=document.createElement("button");t.type="button",t.className="ov-aside-item",i.currentIdx>=e.startIdx&&i.currentIdx<e.startIdx+e.slides.length&&(t.dataset.active="1");let c=document.createElement("span");c.className="ov-aside-num",c.textContent=String(a+1).padStart(2,"0"),t.appendChild(c);let n=document.createElement("span");n.className="ov-aside-text",n.textContent=$(e);let m=document.createElement("div");m.className="ov-aside-count",m.textContent=`${e.slides.length} slide${e.slides.length>1?"s":""}`,n.appendChild(m),t.appendChild(n),t.addEventListener("click",()=>{o.scrollIntoView({behavior:"smooth",block:"start"})}),h.appendChild(t),N.push(t)}});let C=null;h&&(C=new IntersectionObserver(e=>{let a=e.filter(o=>o.isIntersecting).sort((o,d)=>o.boundingClientRect.top-d.boundingClientRect.top);if(a.length>0){let o=y.indexOf(a[0].target);o>=0&&N.forEach((d,t)=>{t===o?d.dataset.active="1":delete d.dataset.active})}},{root:g,rootMargin:"0px 0px -70% 0px",threshold:0}),y.forEach(e=>C.observe(e)));let M=r.querySelectorAll(".ov-cell");return p.addEventListener("input",()=>{let e=p.value.trim().toLowerCase();if(!e){M.forEach(a=>delete a.dataset.filteredOut);return}M.forEach(a=>{(a.dataset.search||"").includes(e)?delete a.dataset.filteredOut:a.dataset.filteredOut="1"})}),requestAnimationFrame(()=>{let e=r.querySelector(".ov-cell[data-current]");e&&e.scrollIntoView({block:"center"})}),()=>{C?.disconnect(),E.disconnect(),r&&(r.innerHTML="")}}export{W as mountOverview};
@@ -0,0 +1,17 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class DeckPhoto extends LitElement {
3
+ static styles: import("lit").CSSResult[];
4
+ src?: string;
5
+ position?: string;
6
+ darken?: number;
7
+ align?: 'top' | 'center' | 'bottom';
8
+ textAlign?: 'left' | 'center' | 'right';
9
+ updated(): void;
10
+ render(): unknown;
11
+ }
12
+ declare global {
13
+ interface HTMLElementTagNameMap {
14
+ 'deck-photo': DeckPhoto;
15
+ }
16
+ }
17
+ //# sourceMappingURL=deck-photo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-photo.d.ts","sourceRoot":"","sources":["../src/deck-photo.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C,qBACa,SAAU,SAAQ,UAAU;IAOvC,OAAgB,MAAM,4BAoEnB;IAEyB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAEpF,OAAO,IAAI,IAAI;IAYf,MAAM,IAAI,OAAO;CAQ3B;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,SAAS,CAAC;KACzB;CACF"}
@@ -0,0 +1 @@
1
+ var g=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var i=(s,e,o,n)=>{for(var r=n>1?void 0:n?v(e,o):e,l=s.length-1,d;l>=0;l--)(d=s[l])&&(r=(n?d(e,o,r):d(r))||r);return n&&r&&g(e,o,r),r};import{LitElement as f,html as x,css as k}from"https://cdn.jsdelivr.net/npm/lit@3/+esm";import{customElement as m,property as a}from"https://cdn.jsdelivr.net/npm/lit@3/decorators.js/+esm";import{css as c}from"https://cdn.jsdelivr.net/npm/lit@3/+esm";var p=c`:host{display:none;position:absolute;inset:0;padding:var(--rik-slide-padding-y) var(--rik-slide-padding-x);flex-direction:column;overflow:hidden;background:var(--rik-surface-page);font-family:var(--rik-font-sans);color:var(--rik-text-default)}:host([active]){display:flex}`,u=c`h1{font-size:var(--rik-font-size-h1);font-weight:700;color:var(--rik-text-default);letter-spacing:-0.022em;line-height:1.15;margin-bottom:var(--rik-space-4);padding-bottom:var(--rik-space-2);border-bottom:3px solid var(--rik-accent);display:inline-block;align-self:flex-start;flex:0 0 auto}h1 .accent{color:var(--rik-accent)}::slotted(p),p{font-size:var(--rik-font-size-body);line-height:1.65;color:var(--rik-text-default--muted);margin:0}::slotted(strong),strong{color:var(--rik-text-default);font-weight:700}::slotted(code),code{font-family:var(--rik-font-mono);font-size:var(--rik-font-size-mono-sm);background:rgba(0,0,0,0.06);padding:2px 6px;border-radius:var(--rik-radius-sm);color:var(--rik-text-default)}`,y=c`.lbl{display:inline-block;padding:var(--deck-eyebrow-padding-y,4px) var(--deck-eyebrow-padding-x,12px);background:var(--deck-eyebrow-bg,var(--rik-accent));color:var(--deck-eyebrow-color,var(--rik-accent__on,var(--rik-surface-inverse)));border-radius:var(--deck-eyebrow-radius,var(--rik-radius-pill));font-size:var(--rik-font-size-xs);font-weight:700;letter-spacing:0.1em;text-transform:uppercase;margin-bottom:var(--rik-space-1);align-self:flex-start}.lead{font-size:var(--rik-font-size-lead);color:var(--rik-text-default--faint);line-height:1.5;margin-bottom:var(--rik-space-4);max-width:75ch;flex:0 0 auto}.kicker{font-size:var(--rik-font-size-xs);font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:var(--rik-text-default--faint);margin-bottom:var(--rik-space-3);display:block}.kicker.on-dark{color:rgba(255,255,255,0.35)}.caption{font-size:var(--rik-font-size-sm);color:var(--rik-text-default--faint);line-height:1.55}.caption.on-dark{color:rgba(255,255,255,0.5)}.col-label{font-size:var(--rik-font-size-xs);font-weight:700;letter-spacing:0.08em;text-transform:uppercase;color:var(--rik-text-default--faint);margin-bottom:var(--rik-space-2)}`;var t=class extends f{updated(){this.position&&this.style.setProperty("--_pos",this.position),typeof this.darken=="number"&&this.style.setProperty("--_dim",String(this.darken));let e=this.align==="top"?"flex-start":this.align==="bottom"?"flex-end":"center";if(this.style.setProperty("--_align",e),this.textAlign){this.style.setProperty("--_text-align",this.textAlign);let o=this.textAlign==="center"?"center":this.textAlign==="right"?"flex-end":"flex-start";this.style.setProperty("--_text-align-items",o)}}render(){let e=this.src?`background-image: url("${this.src.replace(/"/g,"%22")}")`:"";return x`<div class="bg" part="bg" style=${e}></div> <div class="overlay" part="overlay"></div> <div class="content" part="content"><slot></slot></div>`}};t.styles=[p,k`:host{padding:0;color:var(--deck-photo-text-color,var(--rik-text-inverse));overflow:hidden}.bg{position:absolute;inset:0;background-size:cover;background-position:var(--_pos,center);background-repeat:no-repeat}.overlay{position:absolute;inset:0;background:var(--deck-photo-overlay-color,rgba(0,0,0,var(--_dim,0.35)))}.content{position:relative;z-index:1;display:flex;flex-direction:column;gap:var(--rik-space-3);padding:var(--deck-photo-padding-y,var(--rik-slide-padding-y)) var(--deck-photo-padding-x,var(--rik-slide-padding-x));width:100%;height:100%;max-width:100%;box-sizing:border-box;justify-content:var(--_align,center);text-align:var(--_text-align,left);align-items:var(--_text-align-items,flex-start)}.content > *{max-width:var(--deck-photo-content-max-width,36ch)}::slotted(h1){font-family:var(--rik-font-display,var(--rik-font-sans));font-size:clamp(2.5rem,6vw,5.5rem);font-weight:900;letter-spacing:-0.035em;line-height:1.02;color:var(--deck-photo-text-color,var(--rik-text-inverse));margin:0;text-shadow:0 2px 16px rgba(0,0,0,0.35)}::slotted(h2){font-family:var(--rik-font-display,var(--rik-font-sans));font-size:clamp(1.6rem,3vw,2.6rem);font-weight:800;letter-spacing:-0.025em;line-height:1.1;color:var(--deck-photo-text-color,var(--rik-text-inverse));margin:0;text-shadow:0 2px 12px rgba(0,0,0,0.35)}::slotted(p),::slotted(.sub){font-size:var(--rik-font-size-lead);color:var(--deck-photo-text-muted,var(--rik-text-inverse--muted));line-height:1.5;margin:0;text-shadow:0 1px 8px rgba(0,0,0,0.35)}::slotted(.kicker){font:700 var(--rik-font-size-xs)/1 var(--rik-font-mono);letter-spacing:0.18em;text-transform:uppercase;color:var(--deck-photo-text-muted,var(--rik-text-inverse--muted));margin:0}`],i([a({type:String})],t.prototype,"src",2),i([a({type:String})],t.prototype,"position",2),i([a({type:Number})],t.prototype,"darken",2),i([a({type:String})],t.prototype,"align",2),i([a({type:String,attribute:"text-align"})],t.prototype,"textAlign",2),t=i([m("deck-photo")],t);export{t as DeckPhoto};
@@ -0,0 +1,3 @@
1
+ import type { DeckRoot } from './deck-root.js';
2
+ export declare function installPresenter(host: DeckRoot): void;
3
+ //# sourceMappingURL=deck-presenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-presenter.d.ts","sourceRoot":"","sources":["../src/deck-presenter.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAuM/C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAkDrD"}
@@ -0,0 +1,148 @@
1
+ var c="rik-presenter",t=null,i=null,o=null;function m(e){let r=Array.from(e.children).filter(l=>l.tagName.toLowerCase().startsWith("deck-")),s=r.findIndex(l=>l.hasAttribute("active")),a=r[s]??null,n=r[s+1]??null,p=(a?.querySelector("deck-notes")?.textContent??"").trim(),u=document.querySelector('link[rel="stylesheet"][href*="rikiki"], link[rel="stylesheet"][href*="tokens"], link[rel="stylesheet"][href*="theme"]')?.href??"";return{current:s+1,total:r.length,slideHtml:a?.outerHTML??"",nextHtml:n?.outerHTML??null,notes:p,themeHref:u}}function d(e){i&&i.postMessage({type:"state",state:m(e)})}var h=e=>`<!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Rikiki \xB7 presenter</title>
6
+ ${e.themeHref?`<link rel="stylesheet" href="${e.themeHref}">`:""}
7
+ <style>
8
+ html, body { margin: 0; padding: 0; height: 100%; background: #0f1422; color: #fafafa; font-family: var(--rik-font-sans, system-ui); }
9
+ .grid {
10
+ display: grid;
11
+ grid-template-columns: 2fr 1fr;
12
+ grid-template-rows: 1fr auto;
13
+ gap: 16px;
14
+ padding: 16px;
15
+ height: 100vh;
16
+ box-sizing: border-box;
17
+ }
18
+ .panel {
19
+ background: #1e2840;
20
+ border-radius: 12px;
21
+ overflow: hidden;
22
+ position: relative;
23
+ display: flex;
24
+ flex-direction: column;
25
+ }
26
+ .panel header {
27
+ font: 700 11px/1 var(--rik-font-mono, monospace);
28
+ text-transform: uppercase;
29
+ letter-spacing: 0.18em;
30
+ padding: 10px 14px;
31
+ color: rgba(232,228,240,0.45);
32
+ background: #161c2e;
33
+ }
34
+ .panel .body { flex: 1; min-height: 0; padding: 16px; overflow: hidden; }
35
+ .panel iframe { width: 100%; height: 100%; border: 0; background: white; border-radius: 8px; }
36
+ #notes { font-size: 17px; line-height: 1.6; white-space: pre-wrap; padding: 20px; overflow: auto; color: #e8e4f0; }
37
+ #notes:empty::before { content: 'No notes for this slide.'; color: rgba(232,228,240,0.4); font-style: italic; }
38
+ #footer {
39
+ grid-column: 1 / -1;
40
+ display: flex; align-items: center; justify-content: space-between;
41
+ background: #1e2840;
42
+ border-radius: 12px;
43
+ padding: 14px 20px;
44
+ font: 700 16px/1 var(--rik-font-mono, monospace);
45
+ }
46
+ #timer { font-size: 28px; font-variant-numeric: tabular-nums; letter-spacing: -0.01em; }
47
+ #counter { color: rgba(232,228,240,0.6); }
48
+ button {
49
+ background: transparent;
50
+ border: 1px solid rgba(232,228,240,0.2);
51
+ color: inherit;
52
+ font: inherit;
53
+ padding: 8px 14px;
54
+ border-radius: 6px;
55
+ cursor: pointer;
56
+ }
57
+ button:hover { background: rgba(255,255,255,0.06); }
58
+ .ghost { color: rgba(232,228,240,0.4); }
59
+ </style>
60
+ </head>
61
+ <body>
62
+ <div class="grid">
63
+ <section class="panel" id="current">
64
+ <header>Current</header>
65
+ <div class="body"><iframe id="current-frame" srcdoc=""></iframe></div>
66
+ </section>
67
+ <section class="panel" id="next">
68
+ <header>Next</header>
69
+ <div class="body"><iframe id="next-frame" srcdoc=""></iframe></div>
70
+ </section>
71
+ <section class="panel" id="notes-panel" style="grid-column: 1 / -1;">
72
+ <header>Speaker notes</header>
73
+ <div id="notes" class="body"></div>
74
+ </section>
75
+ <div id="footer">
76
+ <div><span id="timer">00:00</span> <button id="timer-toggle">Pause</button> <button id="timer-reset">Reset</button></div>
77
+ <div id="counter">${e.current} / ${e.total}</div>
78
+ <div><span class="ghost">P to close</span></div>
79
+ </div>
80
+ </div>
81
+ <script>
82
+ const channel = new BroadcastChannel('${c}');
83
+ const current = document.getElementById('current-frame');
84
+ const next = document.getElementById('next-frame');
85
+ const notes = document.getElementById('notes');
86
+ const counter = document.getElementById('counter');
87
+ const timerEl = document.getElementById('timer');
88
+ const toggleBtn = document.getElementById('timer-toggle');
89
+ const resetBtn = document.getElementById('timer-reset');
90
+
91
+ let running = true;
92
+ let startedAt = Date.now();
93
+ let elapsed = 0;
94
+ function fmt(ms) {
95
+ const s = Math.floor(ms / 1000);
96
+ const m = Math.floor(s / 60);
97
+ const h = Math.floor(m / 60);
98
+ const pad = (n) => String(n).padStart(2, '0');
99
+ return h > 0 ? (h + ':' + pad(m % 60) + ':' + pad(s % 60)) : (pad(m) + ':' + pad(s % 60));
100
+ }
101
+ function tick() {
102
+ if (running) timerEl.textContent = fmt(elapsed + (Date.now() - startedAt));
103
+ requestAnimationFrame(tick);
104
+ }
105
+ tick();
106
+ toggleBtn.onclick = () => {
107
+ if (running) { elapsed += Date.now() - startedAt; running = false; toggleBtn.textContent = 'Resume'; }
108
+ else { startedAt = Date.now(); running = true; toggleBtn.textContent = 'Pause'; }
109
+ };
110
+ resetBtn.onclick = () => { startedAt = Date.now(); elapsed = 0; running = true; toggleBtn.textContent = 'Pause'; };
111
+
112
+ function wrapFrame(slideHtml) {
113
+ const themeHref = ${JSON.stringify(e.themeHref)};
114
+ const themeLink = themeHref ? '<link rel="stylesheet" href="' + themeHref + '">' : '';
115
+ // Use the consumer's rikiki bundle URL \xB7 we cannot guess it perfectly, so
116
+ // assume it sits next to the theme css.
117
+ const bundleHref = themeHref.replace(/themes\\/[^/]+\\.css.*$/, 'dist/index.js');
118
+ return '<!doctype html><html><head><meta charset="UTF-8">' + themeLink +
119
+ '<script type="module" src="' + bundleHref + '"><' + '/script>' +
120
+ '<style>html,body{margin:0;padding:0;height:100%;overflow:hidden}body{display:flex}deck-root{flex:1}deck-root>*{display:flex!important}</style>' +
121
+ '</head><body><deck-root>' + slideHtml + '</deck-root></body></html>';
122
+ }
123
+
124
+ channel.onmessage = (e) => {
125
+ if (e.data?.type !== 'state') return;
126
+ const s = e.data.state;
127
+ counter.textContent = s.current + ' / ' + s.total;
128
+ notes.textContent = s.notes;
129
+ if (s.slideHtml) current.srcdoc = wrapFrame(s.slideHtml);
130
+ if (s.nextHtml) next.srcdoc = wrapFrame(s.nextHtml);
131
+ else next.srcdoc = '<!doctype html><html><body style="background:#0f1422;color:rgba(232,228,240,0.4);display:flex;align-items:center;justify-content:center;font-family:system-ui">End of deck</body></html>';
132
+ };
133
+
134
+ // Initial paint from the seed state
135
+ const seed = ${JSON.stringify(e)};
136
+ channel.postMessage({ type: 'state', state: seed });
137
+
138
+ // Forward keys back to the main window (so the speaker can drive nav from the laptop)
139
+ window.addEventListener('keydown', (e) => {
140
+ if (e.target.matches && e.target.matches('input,textarea,button')) return;
141
+ channel.postMessage({ type: 'key', key: e.key, shift: e.shiftKey });
142
+ });
143
+
144
+ // Tell main window we're alive
145
+ channel.postMessage({ type: 'hello' });
146
+ <\/script>
147
+ </body>
148
+ </html>`;function y(e){if(o=o??new WeakSet,o.has(e)){t?.close(),t=null;return}o.add(e),i=new BroadcastChannel(c),e.addEventListener("slide-change",()=>d(e)),i.addEventListener("message",a=>{let n=a.data;n?.type==="key"&&n.key&&window.dispatchEvent(new KeyboardEvent("keydown",{key:n.key,shiftKey:!!n.shift,bubbles:!0})),n?.type==="hello"&&d(e)});let r=m(e);if(t=window.open("","rikiki-presenter","width=1280,height=800,popup=yes"),!t){console.warn("[rikiki/presenter] popup was blocked \xB7 allow popups for this site"),o.delete(e);return}t.document.open(),t.document.write(h(r)),t.document.close();let s=setInterval(()=>{t&&t.closed&&(clearInterval(s),o?.delete(e),t=null)},1e3)}export{y as installPresenter};
@@ -0,0 +1,18 @@
1
+ import { LitElement } from 'lit';
2
+ export type DeckPunchTone = 'warn' | 'danger' | 'ok' | 'info' | 'muted' | 'accent';
3
+ export type DeckPunchSize = 'lead' | 'big' | 'mega' | 'stat' | 'display';
4
+ export declare class DeckPunch extends LitElement {
5
+ static styles: import("lit").CSSResult;
6
+ tone?: DeckPunchTone;
7
+ size?: DeckPunchSize;
8
+ weight?: string;
9
+ align?: string;
10
+ updated(): void;
11
+ render(): import("lit-html").TemplateResult<1>;
12
+ }
13
+ declare global {
14
+ interface HTMLElementTagNameMap {
15
+ 'deck-punch': DeckPunch;
16
+ }
17
+ }
18
+ //# sourceMappingURL=deck-punch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-punch.d.ts","sourceRoot":"","sources":["../src/deck-punch.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AACnF,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAmBzE,qBACa,SAAU,SAAQ,UAAU;IACvC,OAAgB,MAAM,0BAiBpB;IAE0B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,CAAC;IACN,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEjD,OAAO;IAaP,MAAM;CAGhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,SAAS,CAAC;KACzB;CACF"}
@@ -0,0 +1 @@
1
+ var p=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var r=(n,i,o,s)=>{for(var t=s>1?void 0:s?d(i,o):i,l=n.length-1,c;l>=0;l--)(c=n[l])&&(t=(s?c(i,o,t):c(t))||t);return s&&t&&p(i,o,t),t};import{LitElement as f,html as m,css as v}from"https://cdn.jsdelivr.net/npm/lit@3/+esm";import{customElement as y,property as a}from"https://cdn.jsdelivr.net/npm/lit@3/decorators.js/+esm";var g={warn:"var(--rik-status-warn)",danger:"var(--rik-status-danger)",ok:"var(--rik-status-success)",info:"var(--rik-accent)",muted:"var(--rik-text-default--faint)",accent:"var(--rik-accent)"},h={lead:"var(--rik-font-size-lead)",big:"var(--rik-font-size-big)",mega:"var(--rik-font-size-mega)",stat:"var(--rik-font-size-stat)",display:"clamp(2.6rem, 6vw, 5rem)"},e=class extends f{updated(){this.tone&&g[this.tone]?this.style.setProperty("--_color",g[this.tone]):this.style.removeProperty("--_color"),this.size&&h[this.size]?this.style.setProperty("--_size",h[this.size]):this.style.removeProperty("--_size")}render(){return m`<slot></slot>`}};e.styles=v`:host{display:block;margin:0;font-family:var(--rik-font-display,var(--rik-font-sans));font-weight:900;line-height:1.1;letter-spacing:-0.02em;font-size:var(--deck-punch-size,var(--_size,var(--rik-font-size-lead)));color:var(--deck-punch-color,var(--_color,inherit))}:host([weight="700"]){font-weight:700}:host([weight="800"]){font-weight:800}:host([align="center"]){text-align:center}:host([align="right"]){text-align:right}`,r([a({type:String})],e.prototype,"tone",2),r([a({type:String})],e.prototype,"size",2),r([a({type:String,reflect:!0})],e.prototype,"weight",2),r([a({type:String,reflect:!0})],e.prototype,"align",2),e=r([y("deck-punch")],e);export{e as DeckPunch};
@@ -0,0 +1,76 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class DeckRoot extends LitElement {
3
+ static styles: import("lit").CSSResult;
4
+ current: number;
5
+ step: number;
6
+ /** When non-null, a full-screen overlay covers the deck (clicker B/./W/,
7
+ * keys). Pressing any key dismisses it · same convention as PowerPoint. */
8
+ blank: 'black' | 'white' | null;
9
+ overview: boolean;
10
+ /** Optional slide transition · "slide" | "fade" | "zoom". When set, the
11
+ * deck-transition.js plugin is fetched on first navigation. Per-slide
12
+ * override available via `data-transition` on the slide host. */
13
+ transition: string | null;
14
+ /** Carousel-mode auto-advance · milliseconds between slides.
15
+ * Pauses on hover / focus, restarts on mouse-leave. Resets on any
16
+ * user-triggered navigation. Use 0 (default) to disable. */
17
+ autoplay: number;
18
+ /** Wrap around at the deck edges. When advancing past the last slide,
19
+ * jump to the first; when going back from the first, jump to the last. */
20
+ loop: boolean;
21
+ /** Enable pointer-driven horizontal swipe for navigation (touch + mouse).
22
+ * Translates a swipe ≥ 60 px into an advance / back navigation. */
23
+ swipe: boolean;
24
+ private slides;
25
+ private chapters;
26
+ private _overviewTeardown;
27
+ private _transitionLoaded;
28
+ private _autoplayTimer;
29
+ private _autoplayPaused;
30
+ private _swipeStartX;
31
+ private _swipeStartY;
32
+ private _swipePointerId;
33
+ firstUpdated(): void;
34
+ disconnectedCallback(): void;
35
+ private _startAutoplay;
36
+ private _stopAutoplay;
37
+ private _autoTick;
38
+ private _onHoverEnter;
39
+ private _onHoverLeave;
40
+ private _onPointerDown;
41
+ private _onPointerUp;
42
+ /** Group slides into chapters bounded by <deck-section> markers. */
43
+ private _buildChapters;
44
+ /** True when at least one chapter has multiple slides and there are 2+ chapters. */
45
+ private _has2DNav;
46
+ /** Flat index → {chapter, intra-chapter index}. */
47
+ private _coords;
48
+ private _flatFromCoords;
49
+ private _onHash;
50
+ private _readHash;
51
+ private _writeHash;
52
+ private _onKey;
53
+ /** Lazy-import the help module the first time the user opens it. */
54
+ private _toggleHelp;
55
+ /** Lazy-import the presenter (speaker-notes window) plugin on first P press. */
56
+ private _togglePresenter;
57
+ private _closeHelp;
58
+ /** Lazy-import the overview module the first time the user opens it. */
59
+ private _renderOverviewIfActive;
60
+ private _maxSteps;
61
+ private _advance;
62
+ private _back;
63
+ private _goTo;
64
+ private _goToCoords;
65
+ private _applyActive;
66
+ private _applyStep;
67
+ private _updateUI;
68
+ updated(): void;
69
+ render(): unknown;
70
+ }
71
+ declare global {
72
+ interface HTMLElementTagNameMap {
73
+ 'deck-root': DeckRoot;
74
+ }
75
+ }
76
+ //# sourceMappingURL=deck-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-root.d.ts","sourceRoot":"","sources":["../src/deck-root.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAU5C,qBACa,QAAS,SAAQ,UAAU;IAMtC,OAAgB,MAAM,0BAoEpB;IAEO,OAAO,SAAK;IACZ,IAAI,SAAK;IAClB;gFAC4E;IACnE,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAQ;IACJ,QAAQ,UAAS;IAC7D;;sEAEkE;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5E;;iEAE6D;IAClB,QAAQ,SAAK;IACxD;+EAC2E;IAC/B,IAAI,UAAS;IACzD;wEACoE;IACxB,KAAK,UAAS;IAG1D,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,QAAQ,CAAiB;IAEjC,OAAO,CAAC,iBAAiB,CAA6B;IAEtD,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAuB;IAErC,YAAY,IAAI,IAAI;IA4BpB,oBAAoB,IAAI,IAAI;IAarC,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,aAAa,CAAsE;IAC3F,OAAO,CAAC,aAAa,CAA+F;IAGpH,OAAO,CAAC,cAAc,CAQpB;IACF,OAAO,CAAC,YAAY,CAUlB;IAEF,oEAAoE;IACpE,OAAO,CAAC,cAAc;IActB,oFAAoF;IACpF,OAAO,CAAC,SAAS;IAIjB,mDAAmD;IACnD,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,OAAO,CAA0C;IAEzD,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,MAAM,CAuEZ;IAEF,oEAAoE;YACtD,WAAW;IAKzB,gFAAgF;YAClE,gBAAgB;YAIhB,UAAU;IAKxB,wEAAwE;YAC1D,uBAAuB;IAkBrC,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,KAAK;IAqBb,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,SAAS;IAiBR,OAAO,IAAI,IAAI;IAKf,MAAM,IAAI,OAAO;CAmB3B;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}