@dxos/plugin-presenter 0.8.4-main.f9ba587 → 0.8.4-main.fcc0d83b33

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 (181) hide show
  1. package/dist/lib/browser/PresenterSettings-2G4XD4QY.mjs +25 -0
  2. package/dist/lib/browser/PresenterSettings-2G4XD4QY.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  4. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +521 -52
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/operations/index.mjs +30 -0
  9. package/dist/lib/browser/operations/index.mjs.map +7 -0
  10. package/dist/lib/browser/translations.mjs +19 -0
  11. package/dist/lib/browser/translations.mjs.map +7 -0
  12. package/dist/types/src/PresenterPlugin.d.ts +2 -1
  13. package/dist/types/src/PresenterPlugin.d.ts.map +1 -1
  14. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  15. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  16. package/dist/types/src/capabilities/index.d.ts +4 -3
  17. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  18. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  19. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  20. package/dist/types/src/capabilities/settings.d.ts +5 -2
  21. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  22. package/dist/types/src/components/Markdown/Panel.d.ts +8 -0
  23. package/dist/types/src/components/Markdown/Panel.d.ts.map +1 -0
  24. package/dist/types/src/components/Markdown/Panel.stories.d.ts +18 -0
  25. package/dist/types/src/components/Markdown/Panel.stories.d.ts.map +1 -0
  26. package/dist/types/src/components/Markdown/Slide.d.ts +2 -4
  27. package/dist/types/src/components/Markdown/Slide.d.ts.map +1 -1
  28. package/dist/types/src/components/Markdown/Slide.stories.d.ts +11 -12
  29. package/dist/types/src/components/Markdown/Slide.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/Markdown/index.d.ts +1 -1
  31. package/dist/types/src/components/Markdown/index.d.ts.map +1 -1
  32. package/dist/types/src/components/Markdown/theme.d.ts.map +1 -1
  33. package/dist/types/src/components/Presenter/Layout.d.ts +5 -5
  34. package/dist/types/src/components/Presenter/Layout.d.ts.map +1 -1
  35. package/dist/types/src/components/Presenter/Pager.d.ts +4 -4
  36. package/dist/types/src/components/Presenter/Pager.d.ts.map +1 -1
  37. package/dist/types/src/components/Presenter/Pager.stories.d.ts +12 -4
  38. package/dist/types/src/components/Presenter/Pager.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/PresenterSettings/PresenterSettings.d.ts +6 -0
  40. package/dist/types/src/components/PresenterSettings/PresenterSettings.d.ts.map +1 -0
  41. package/dist/types/src/components/PresenterSettings/PresenterSettings.stories.d.ts +23 -0
  42. package/dist/types/src/components/PresenterSettings/PresenterSettings.stories.d.ts.map +1 -0
  43. package/dist/types/src/components/PresenterSettings/index.d.ts +2 -0
  44. package/dist/types/src/components/PresenterSettings/index.d.ts.map +1 -0
  45. package/dist/types/src/components/RevealPlayer/RevealPlayer.d.ts +5 -4
  46. package/dist/types/src/components/RevealPlayer/RevealPlayer.d.ts.map +1 -1
  47. package/dist/types/src/components/RevealPlayer/RevealPlayer.stories.d.ts +19 -2
  48. package/dist/types/src/components/RevealPlayer/RevealPlayer.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/index.d.ts +5 -10
  50. package/dist/types/src/components/index.d.ts.map +1 -1
  51. package/dist/types/src/containers/CollectionPresenterContainer/CollectionPresenterContainer.d.ts +6 -0
  52. package/dist/types/src/containers/CollectionPresenterContainer/CollectionPresenterContainer.d.ts.map +1 -0
  53. package/dist/types/src/containers/CollectionPresenterContainer/index.d.ts +2 -0
  54. package/dist/types/src/containers/CollectionPresenterContainer/index.d.ts.map +1 -0
  55. package/dist/types/src/containers/DocumentPresenterContainer/DocumentPresenterContainer.d.ts +6 -0
  56. package/dist/types/src/containers/DocumentPresenterContainer/DocumentPresenterContainer.d.ts.map +1 -0
  57. package/dist/types/src/containers/DocumentPresenterContainer/index.d.ts +2 -0
  58. package/dist/types/src/containers/DocumentPresenterContainer/index.d.ts.map +1 -0
  59. package/dist/types/src/containers/MarkdownSlide/MarkdownSlide.d.ts +8 -0
  60. package/dist/types/src/containers/MarkdownSlide/MarkdownSlide.d.ts.map +1 -0
  61. package/dist/types/src/containers/MarkdownSlide/index.d.ts +2 -0
  62. package/dist/types/src/containers/MarkdownSlide/index.d.ts.map +1 -0
  63. package/dist/types/src/containers/index.d.ts +5 -0
  64. package/dist/types/src/containers/index.d.ts.map +1 -0
  65. package/dist/types/src/meta.d.ts +2 -3
  66. package/dist/types/src/meta.d.ts.map +1 -1
  67. package/dist/types/src/operations/definitions.d.ts +17 -0
  68. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  69. package/dist/types/src/operations/index.d.ts +2 -0
  70. package/dist/types/src/operations/index.d.ts.map +1 -0
  71. package/dist/types/src/testing.d.ts.map +1 -1
  72. package/dist/types/src/translations.d.ts +4 -5
  73. package/dist/types/src/translations.d.ts.map +1 -1
  74. package/dist/types/src/types/Settings.d.ts +7 -0
  75. package/dist/types/src/types/Settings.d.ts.map +1 -0
  76. package/dist/types/src/types/index.d.ts +15 -0
  77. package/dist/types/src/types/index.d.ts.map +1 -0
  78. package/dist/types/src/useExitPresenter.d.ts +3 -4
  79. package/dist/types/src/useExitPresenter.d.ts.map +1 -1
  80. package/dist/types/tsconfig.tsbuildinfo +1 -1
  81. package/package.json +71 -46
  82. package/src/PresenterPlugin.tsx +12 -27
  83. package/src/capabilities/app-graph-builder.ts +94 -72
  84. package/src/capabilities/index.ts +4 -4
  85. package/src/capabilities/react-surface.tsx +59 -44
  86. package/src/capabilities/settings.ts +24 -12
  87. package/src/components/Markdown/Panel.stories.tsx +58 -0
  88. package/src/components/Markdown/{Container.tsx → Panel.tsx} +6 -6
  89. package/src/components/Markdown/Slide.stories.tsx +12 -8
  90. package/src/components/Markdown/Slide.tsx +14 -130
  91. package/src/components/Markdown/index.ts +1 -1
  92. package/src/components/Markdown/styles.css +104 -0
  93. package/src/components/Markdown/theme.ts +5 -5
  94. package/src/components/Markdown/typings.d.ts +8 -0
  95. package/src/components/Presenter/Layout.tsx +24 -23
  96. package/src/components/Presenter/Pager.stories.tsx +10 -10
  97. package/src/components/Presenter/Pager.tsx +55 -22
  98. package/src/components/PresenterSettings/PresenterSettings.stories.tsx +32 -0
  99. package/src/components/PresenterSettings/PresenterSettings.tsx +31 -0
  100. package/src/components/PresenterSettings/index.ts +5 -0
  101. package/src/components/RevealPlayer/RevealPlayer.stories.tsx +9 -7
  102. package/src/components/RevealPlayer/RevealPlayer.tsx +58 -52
  103. package/src/components/index.ts +5 -5
  104. package/src/containers/CollectionPresenterContainer/CollectionPresenterContainer.tsx +50 -0
  105. package/src/containers/CollectionPresenterContainer/index.ts +5 -0
  106. package/src/containers/DocumentPresenterContainer/DocumentPresenterContainer.tsx +24 -0
  107. package/src/containers/DocumentPresenterContainer/index.ts +5 -0
  108. package/src/containers/MarkdownSlide/MarkdownSlide.tsx +26 -0
  109. package/src/containers/MarkdownSlide/index.ts +5 -0
  110. package/src/containers/index.ts +9 -0
  111. package/src/meta.ts +9 -6
  112. package/src/operations/definitions.ts +23 -0
  113. package/src/operations/index.ts +5 -0
  114. package/src/testing.ts +6 -6
  115. package/src/translations.ts +4 -4
  116. package/src/types/Settings.ts +20 -0
  117. package/src/types/index.ts +30 -0
  118. package/src/useExitPresenter.ts +26 -24
  119. package/dist/lib/browser/CollectionPresenterContainer-CMHKK7TI.mjs +0 -189
  120. package/dist/lib/browser/CollectionPresenterContainer-CMHKK7TI.mjs.map +0 -7
  121. package/dist/lib/browser/DocumentPresenterContainer-E7RGK572.mjs +0 -185
  122. package/dist/lib/browser/DocumentPresenterContainer-E7RGK572.mjs.map +0 -7
  123. package/dist/lib/browser/MarkdownSlide-QHC3GZII.mjs +0 -336
  124. package/dist/lib/browser/MarkdownSlide-QHC3GZII.mjs.map +0 -7
  125. package/dist/lib/browser/app-graph-builder-2ZLAWPF2.mjs +0 -77
  126. package/dist/lib/browser/app-graph-builder-2ZLAWPF2.mjs.map +0 -7
  127. package/dist/lib/browser/chunk-SW3HIRDA.mjs +0 -39
  128. package/dist/lib/browser/chunk-SW3HIRDA.mjs.map +0 -7
  129. package/dist/lib/browser/chunk-TANLITL2.mjs +0 -36
  130. package/dist/lib/browser/chunk-TANLITL2.mjs.map +0 -7
  131. package/dist/lib/browser/chunk-VSD5LSE5.mjs +0 -15
  132. package/dist/lib/browser/chunk-VSD5LSE5.mjs.map +0 -7
  133. package/dist/lib/browser/chunk-ZUDP646V.mjs +0 -37
  134. package/dist/lib/browser/chunk-ZUDP646V.mjs.map +0 -7
  135. package/dist/lib/browser/react-surface-5WI73FAE.mjs +0 -57
  136. package/dist/lib/browser/react-surface-5WI73FAE.mjs.map +0 -7
  137. package/dist/lib/browser/settings-X7M27QCY.mjs +0 -22
  138. package/dist/lib/browser/settings-X7M27QCY.mjs.map +0 -7
  139. package/dist/lib/node-esm/CollectionPresenterContainer-VGIYRG3V.mjs +0 -190
  140. package/dist/lib/node-esm/CollectionPresenterContainer-VGIYRG3V.mjs.map +0 -7
  141. package/dist/lib/node-esm/DocumentPresenterContainer-RG4P7XA6.mjs +0 -186
  142. package/dist/lib/node-esm/DocumentPresenterContainer-RG4P7XA6.mjs.map +0 -7
  143. package/dist/lib/node-esm/MarkdownSlide-IDPOGD64.mjs +0 -338
  144. package/dist/lib/node-esm/MarkdownSlide-IDPOGD64.mjs.map +0 -7
  145. package/dist/lib/node-esm/app-graph-builder-PNVMZBL6.mjs +0 -78
  146. package/dist/lib/node-esm/app-graph-builder-PNVMZBL6.mjs.map +0 -7
  147. package/dist/lib/node-esm/chunk-GDG7Q5H4.mjs +0 -40
  148. package/dist/lib/node-esm/chunk-GDG7Q5H4.mjs.map +0 -7
  149. package/dist/lib/node-esm/chunk-MVKQEF6Y.mjs +0 -17
  150. package/dist/lib/node-esm/chunk-MVKQEF6Y.mjs.map +0 -7
  151. package/dist/lib/node-esm/chunk-VZEWAW63.mjs +0 -38
  152. package/dist/lib/node-esm/chunk-VZEWAW63.mjs.map +0 -7
  153. package/dist/lib/node-esm/chunk-YI6PZYVI.mjs +0 -38
  154. package/dist/lib/node-esm/chunk-YI6PZYVI.mjs.map +0 -7
  155. package/dist/lib/node-esm/index.mjs +0 -67
  156. package/dist/lib/node-esm/index.mjs.map +0 -7
  157. package/dist/lib/node-esm/meta.json +0 -1
  158. package/dist/lib/node-esm/react-surface-JWLPKDCJ.mjs +0 -58
  159. package/dist/lib/node-esm/react-surface-JWLPKDCJ.mjs.map +0 -7
  160. package/dist/lib/node-esm/settings-G2PHYWSK.mjs +0 -23
  161. package/dist/lib/node-esm/settings-G2PHYWSK.mjs.map +0 -7
  162. package/dist/types/src/components/CollectionPresenterContainer.d.ts +0 -7
  163. package/dist/types/src/components/CollectionPresenterContainer.d.ts.map +0 -1
  164. package/dist/types/src/components/DocumentPresenterContainer.d.ts +0 -7
  165. package/dist/types/src/components/DocumentPresenterContainer.d.ts.map +0 -1
  166. package/dist/types/src/components/Markdown/Container.d.ts +0 -8
  167. package/dist/types/src/components/Markdown/Container.d.ts.map +0 -1
  168. package/dist/types/src/components/Markdown/Container.stories.d.ts +0 -26
  169. package/dist/types/src/components/Markdown/Container.stories.d.ts.map +0 -1
  170. package/dist/types/src/components/MarkdownSlide.d.ts +0 -7
  171. package/dist/types/src/components/MarkdownSlide.d.ts.map +0 -1
  172. package/dist/types/src/components/PresenterSettings.d.ts +0 -6
  173. package/dist/types/src/components/PresenterSettings.d.ts.map +0 -1
  174. package/dist/types/src/types.d.ts +0 -39
  175. package/dist/types/src/types.d.ts.map +0 -1
  176. package/src/components/CollectionPresenterContainer.tsx +0 -43
  177. package/src/components/DocumentPresenterContainer.tsx +0 -22
  178. package/src/components/Markdown/Container.stories.tsx +0 -57
  179. package/src/components/MarkdownSlide.tsx +0 -24
  180. package/src/components/PresenterSettings.tsx +0 -26
  181. package/src/types.ts +0 -46
@@ -0,0 +1,25 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/components/PresenterSettings/PresenterSettings.tsx
4
+ import React from "react";
5
+ import { useTranslation } from "@dxos/react-ui";
6
+ import { Settings as SettingsForm } from "@dxos/react-ui-form";
7
+ import { meta } from "#meta";
8
+ import { Settings } from "#types";
9
+ var PresenterSettings = ({ settings, onSettingsChange }) => {
10
+ const { t } = useTranslation(meta.id);
11
+ return /* @__PURE__ */ React.createElement(SettingsForm.Viewport, null, /* @__PURE__ */ React.createElement(SettingsForm.Section, {
12
+ title: t("settings.title", {
13
+ ns: meta.id
14
+ })
15
+ }, /* @__PURE__ */ React.createElement(SettingsForm.FieldSet, {
16
+ readonly: !onSettingsChange,
17
+ schema: Settings.Settings,
18
+ values: settings,
19
+ onValuesChanged: (values) => onSettingsChange?.(() => values)
20
+ })));
21
+ };
22
+ export {
23
+ PresenterSettings as default
24
+ };
25
+ //# sourceMappingURL=PresenterSettings-2G4XD4QY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/PresenterSettings/PresenterSettings.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Settings as SettingsForm } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { Settings } from '#types';\n\nexport type PresenterSettingsProps = AppSurface.SettingsArticleProps<Settings.Settings>;\n\nexport const PresenterSettings = ({ settings, onSettingsChange }: PresenterSettingsProps) => {\n const { t } = useTranslation(meta.id);\n\n return (\n <SettingsForm.Viewport>\n <SettingsForm.Section title={t('settings.title', { ns: meta.id })}>\n <SettingsForm.FieldSet\n readonly={!onSettingsChange}\n schema={Settings.Settings}\n values={settings}\n onValuesChanged={(values) => onSettingsChange?.(() => values)}\n />\n </SettingsForm.Section>\n </SettingsForm.Viewport>\n );\n};\n"],
5
+ "mappings": ";;;AAIA,OAAOA,WAAW;AAGlB,SAASC,sBAAsB;AAC/B,SAASC,YAAYC,oBAAoB;AAEzC,SAASC,YAAY;AACrB,SAASF,gBAAgB;AAIlB,IAAMG,oBAAoB,CAAC,EAAEC,UAAUC,iBAAgB,MAA0B;AACtF,QAAM,EAAEC,EAAC,IAAKP,eAAeG,KAAKK,EAAE;AAEpC,SACE,sBAAA,cAACN,aAAaO,UAAQ,MACpB,sBAAA,cAACP,aAAaQ,SAAO;IAACC,OAAOJ,EAAE,kBAAkB;MAAEK,IAAIT,KAAKK;IAAG,CAAA;KAC7D,sBAAA,cAACN,aAAaW,UAAQ;IACpBC,UAAU,CAACR;IACXS,QAAQd,SAASA;IACjBe,QAAQX;IACRY,iBAAiB,CAACD,WAAWV,mBAAmB,MAAMU,MAAAA;;AAKhE;",
6
+ "names": ["React", "useTranslation", "Settings", "SettingsForm", "meta", "PresenterSettings", "settings", "onSettingsChange", "t", "id", "Viewport", "Section", "title", "ns", "FieldSet", "readonly", "schema", "values", "onValuesChanged"]
7
+ }
@@ -0,0 +1,10 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ export {
8
+ __export
9
+ };
10
+ //# sourceMappingURL=chunk-J5LGTIGS.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,66 +1,535 @@
1
- import {
2
- CollectionPresenterContainer,
3
- DocumentPresenterContainer,
4
- MarkdownSlide,
5
- PresenterSettings
6
- } from "./chunk-ZUDP646V.mjs";
7
- import {
8
- PRESENTER_PLUGIN,
9
- meta
10
- } from "./chunk-VSD5LSE5.mjs";
1
+ import "./chunk-J5LGTIGS.mjs";
11
2
 
12
- // src/PresenterPlugin.tsx
13
- import { definePlugin, defineModule, Events, contributes, Capabilities } from "@dxos/app-framework";
3
+ // src/components/index.ts
4
+ import { lazy } from "react";
14
5
 
15
- // src/capabilities/index.ts
16
- import { lazy } from "@dxos/app-framework";
17
- var AppGraphBuilder = lazy(() => import("./app-graph-builder-2ZLAWPF2.mjs"));
18
- var ReactSurface = lazy(() => import("./react-surface-5WI73FAE.mjs"));
19
- var PresenterSettings2 = lazy(() => import("./settings-X7M27QCY.mjs"));
6
+ // src/components/Markdown/Panel.tsx
7
+ import React, { useState } from "react";
8
+ import { useResizeDetector } from "react-resize-detector";
9
+ import { mx } from "@dxos/ui-theme";
10
+ var Panel = ({ children, classNames }) => {
11
+ const [props, setProps] = useState({});
12
+ const { ref: containerRef, width, height } = useResizeDetector({
13
+ refreshMode: "debounce",
14
+ refreshRate: 200,
15
+ refreshOptions: {
16
+ leading: true
17
+ },
18
+ onResize: ({ width: width2, height: height2 }) => {
19
+ if (width2 && height2) {
20
+ setProps(createLayoutProps({
21
+ width: width2,
22
+ height: height2
23
+ }));
24
+ }
25
+ }
26
+ });
27
+ return /* @__PURE__ */ React.createElement("div", {
28
+ ref: containerRef,
29
+ className: mx("flex grow relative overflow-hidden bg-attention-surface", classNames)
30
+ }, /* @__PURE__ */ React.createElement("div", {
31
+ className: mx("dx-container absolute"),
32
+ style: props
33
+ }, width && height && children));
34
+ };
35
+ var createLayoutProps = ({ width, height }) => {
36
+ const aspectRatio = 16 / 9;
37
+ const nominalWidth = 2560;
38
+ const nominalHeight = nominalWidth / aspectRatio;
39
+ const scale = Math.min(width / nominalWidth, height / nominalHeight);
40
+ return {
41
+ left: (width - nominalWidth) / 2,
42
+ top: (height - nominalHeight) / 2,
43
+ width: nominalWidth,
44
+ height: nominalHeight,
45
+ transform: `scale(${scale})`
46
+ };
47
+ };
48
+
49
+ // src/components/Markdown/Slide.tsx
50
+ import "highlight.js/styles/github.css";
51
+ import { h } from "hastscript";
52
+ import React2 from "react";
53
+ import ReactMarkdown from "react-markdown";
54
+ import rehypeAddClasses from "rehype-add-classes";
55
+ import rehypeHighlight from "rehype-highlight";
56
+ import remarkFrontmatter from "remark-frontmatter";
57
+ import remarkParseFrontmatter from "remark-parse-frontmatter";
58
+
59
+ // raw-loader:/__w/dxos/dxos/packages/plugins/plugin-presenter/src/components/Markdown/styles.css?raw
60
+ var styles_default = "/*!\n Theme: GitHub Dark\n Description: Dark theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n Outdated base version: https://github.com/primer/github-syntax-dark\n Current colors taken from GitHub's CSS\n*/\n/* TODO(burdon): Use tokens. */\n.dark pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em;\n}\n.dark code.hljs {\n padding: 3px 5px;\n}\n.dark .hljs {\n color: #c9d1d9;\n background: #0d1117;\n}\n.dark .hljs-doctag,\n.dark .hljs-keyword,\n.dark .hljs-meta .hljs-keyword,\n.dark .hljs-template-tag,\n.dark .hljs-template-variable,\n.dark .hljs-type,\n.dark .hljs-variable.language_ {\n color: #ff7b72;\n}\n.dark .hljs-title,\n.dark .hljs-title.class_,\n.dark .hljs-title.class_.inherited__,\n.dark .hljs-title.function_ {\n color: #d2a8ff;\n}\n.dark .hljs-attr,\n.dark .hljs-attribute,\n.dark .hljs-literal,\n.dark .hljs-meta,\n.dark .hljs-number,\n.dark .hljs-operator,\n.dark .hljs-variable,\n.dark .hljs-selector-attr,\n.dark .hljs-selector-class,\n.dark .hljs-selector-id {\n color: #79c0ff;\n}\n.dark .hljs-regexp,\n.dark .hljs-string,\n.dark .hljs-meta .hljs-string {\n color: #a5d6ff;\n}\n.dark .hljs-built_in,\n.dark .hljs-symbol {\n color: #ffa657;\n}\n.dark .hljs-comment,\n.dark .hljs-code,\n.dark .hljs-formula {\n color: #8b949e;\n}\n.dark .hljs-name,\n.dark .hljs-quote,\n.dark .hljs-selector-tag,\n.dark .hljs-selector-pseudo {\n color: #7ee787;\n}\n.dark .hljs-subst {\n color: #c9d1d9;\n}\n.dark .hljs-section {\n color: #1f6feb;\n font-weight: bold;\n}\n.dark .hljs-bullet {\n color: #f2cc60;\n}\n.dark .hljs-emphasis {\n color: #c9d1d9;\n font-style: italic;\n}\n.dark .hljs-strong {\n color: #c9d1d9;\n font-weight: bold;\n}\n.dark .hljs-addition {\n color: #aff5b4;\n background-color: #033a16;\n}\n.dark .hljs-deletion {\n color: #ffdcd7;\n background-color: #67060c;\n}\n.dark .hljs-char.escape_,\n.dark .hljs-link,\n.dark .hljs-params,\n.dark .hljs-property,\n.dark .hljs-punctuation,\n.dark .hljs-tag {\n /* purposely ignored */\n all: unset;\n}\n";
61
+
62
+ // src/components/Markdown/theme.ts
63
+ var theme = {
64
+ root: "bg-attention-surface leading-relaxed font-mono",
65
+ padding: "px-40 py-16 gap-8",
66
+ nodes: {
67
+ h1: "text-[80px] text-accent-text",
68
+ h2: "text-[60px] text-accent-text",
69
+ h3: "text-[48px] text-accent-text",
70
+ p: "text-[48px]",
71
+ ul: "my-[16px] ml-12 leading-relaxed list-disc",
72
+ ol: "my-[16px] ml-24 leading-relaxed list-decimal",
73
+ li: "pl-6 text-[48px]",
74
+ pre: "w-full mx-0 my-[32px] p-4 bg-input-surface",
75
+ code: "p-0 text-[40px]"
76
+ }
77
+ };
20
78
 
21
- // src/translations.ts
22
- var translations = [
23
- {
24
- "en-US": {
25
- [meta.id]: {
26
- "plugin name": "Presenter",
27
- "toggle presentation label": "Present",
28
- "present collections label": "Present collections (experimental)"
79
+ // src/components/Markdown/Slide.tsx
80
+ var Slide = ({ content = "", classes = theme.nodes }) => {
81
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement("style", null, styles_default), /* @__PURE__ */ React2.createElement(ReactMarkdown, {
82
+ components,
83
+ // Markdown to HTML.
84
+ remarkPlugins: [
85
+ [
86
+ remarkFrontmatter,
87
+ "yaml"
88
+ ],
89
+ remarkParseFrontmatter
90
+ ],
91
+ // HTML processing.
92
+ rehypePlugins: [
93
+ [
94
+ rehypeAddClasses,
95
+ classes
96
+ ],
97
+ rehypeHighlight,
98
+ slideLayout
99
+ ]
100
+ }, content));
101
+ };
102
+ var slideLayout = (_options = {}) => (tree, file) => {
103
+ const { data: { frontmatter = {} } } = file;
104
+ let content = tree.children;
105
+ const { layout, image } = frontmatter;
106
+ if (image) {
107
+ const img = h("div", {
108
+ class: "flex grow shrink-0 bg-cover bg-center bg-no-repeat",
109
+ style: {
110
+ backgroundImage: `url(${image})`
111
+ }
112
+ });
113
+ switch (layout) {
114
+ case "fullscreen": {
115
+ content = img;
116
+ break;
117
+ }
118
+ case "columns": {
119
+ content = h("div", {
120
+ class: "flex grow grid grid-cols-2"
121
+ }, [
122
+ h("div", {
123
+ class: theme.padding
124
+ }, [
125
+ content
126
+ ]),
127
+ img
128
+ ]);
129
+ break;
29
130
  }
131
+ case "rows": {
132
+ content = h("div", {
133
+ class: "flex grow flex-col"
134
+ }, [
135
+ h("div", {
136
+ class: theme.padding
137
+ }, [
138
+ content
139
+ ]),
140
+ h("div", {
141
+ class: [
142
+ "flex grow pt-0",
143
+ theme.padding
144
+ ]
145
+ }, [
146
+ img
147
+ ])
148
+ ]);
149
+ break;
150
+ }
151
+ }
152
+ } else {
153
+ content = h("div", {
154
+ class: [
155
+ "flex grow flex-col",
156
+ theme.padding
157
+ ]
158
+ }, [
159
+ content
160
+ ]);
161
+ }
162
+ const root = h("div", {
163
+ class: [
164
+ "flex flex-col grow",
165
+ theme.root
166
+ ]
167
+ }, [
168
+ content
169
+ ]);
170
+ tree.children = [
171
+ root
172
+ ];
173
+ };
174
+ var ImageWrapper = ({ node: _, ...props }) => {
175
+ const { alt = "", src } = props;
176
+ return /* @__PURE__ */ React2.createElement("img", {
177
+ alt,
178
+ src
179
+ });
180
+ };
181
+ var components = {
182
+ img: ({ node, ...props }) => /* @__PURE__ */ React2.createElement(ImageWrapper, {
183
+ node,
184
+ ...props
185
+ })
186
+ };
187
+
188
+ // src/components/Presenter/Layout.tsx
189
+ import React3 from "react";
190
+ import { composable, composableProps } from "@dxos/ui-theme";
191
+ var Layout = composable(({ children, topLeft, topRight, bottomLeft, bottomRight, ...props }, forwardedRef) => {
192
+ return /* @__PURE__ */ React3.createElement("div", {
193
+ ...composableProps(props, {
194
+ classNames: "flex grow relative overflow-hidden bg-attention-surface"
195
+ }),
196
+ ref: forwardedRef
197
+ }, /* @__PURE__ */ React3.createElement("div", {
198
+ className: "flex flex-col grow overflow-hidden"
199
+ }, children), /* @__PURE__ */ React3.createElement("div", {
200
+ className: "z-[200]"
201
+ }, /* @__PURE__ */ React3.createElement("div", {
202
+ className: "absolute top-4 left-4"
203
+ }, topLeft), /* @__PURE__ */ React3.createElement("div", {
204
+ className: "absolute top-4 right-4"
205
+ }, topRight), /* @__PURE__ */ React3.createElement("div", {
206
+ className: "absolute bottom-4 left-4"
207
+ }, bottomLeft), /* @__PURE__ */ React3.createElement("div", {
208
+ className: "absolute bottom-4 right-4"
209
+ }, bottomRight)));
210
+ });
211
+
212
+ // src/components/Presenter/Pager.tsx
213
+ import React4, { useEffect } from "react";
214
+ import { IconButton, useControlledState } from "@dxos/react-ui";
215
+ var Pager = ({ index: indexProp = 0, count = 0, keys, onChange, onExit }) => {
216
+ const [index, setIndex] = useControlledState(indexProp);
217
+ useEffect(() => {
218
+ onChange?.(index);
219
+ }, [
220
+ index
221
+ ]);
222
+ const handleChangeIndex = (dir) => {
223
+ setIndex((index2) => {
224
+ const next = index2 + dir;
225
+ return next >= 0 && next < count ? next : index2;
226
+ });
227
+ };
228
+ useEffect(() => {
229
+ if (!keys) {
230
+ return;
30
231
  }
232
+ const keydownHandler = (event) => {
233
+ switch (event.key) {
234
+ case "Escape": {
235
+ onExit?.();
236
+ break;
237
+ }
238
+ case "ArrowLeft": {
239
+ if (event.shiftKey) {
240
+ onChange?.(0);
241
+ } else {
242
+ handleChangeIndex(-1);
243
+ }
244
+ break;
245
+ }
246
+ case "ArrowRight": {
247
+ if (event.shiftKey) {
248
+ onChange?.(count - 1);
249
+ } else {
250
+ handleChangeIndex(1);
251
+ }
252
+ break;
253
+ }
254
+ case "ArrowUp": {
255
+ onChange?.(0);
256
+ break;
257
+ }
258
+ case "ArrowDown": {
259
+ onChange?.(count - 1);
260
+ break;
261
+ }
262
+ }
263
+ };
264
+ window.addEventListener("keydown", keydownHandler);
265
+ return () => window.removeEventListener("keydown", keydownHandler);
266
+ }, [
267
+ keys,
268
+ count
269
+ ]);
270
+ if (index === void 0 || !count) {
271
+ return null;
272
+ }
273
+ return /* @__PURE__ */ React4.createElement("div", {
274
+ className: "flex items-center text-neutral-500"
275
+ }, /* @__PURE__ */ React4.createElement(IconButton, {
276
+ icon: "ph--caret-double-left--regular",
277
+ size: 6,
278
+ label: "Jump to first",
279
+ iconOnly: true,
280
+ noTooltip: true,
281
+ variant: "ghost",
282
+ classNames: "p-0",
283
+ onClick: () => onChange?.(0)
284
+ }), /* @__PURE__ */ React4.createElement(IconButton, {
285
+ icon: "ph--caret-left--regular",
286
+ size: 6,
287
+ label: "Previous",
288
+ iconOnly: true,
289
+ noTooltip: true,
290
+ variant: "ghost",
291
+ classNames: "p-0",
292
+ onClick: () => handleChangeIndex(-1)
293
+ }), /* @__PURE__ */ React4.createElement(IconButton, {
294
+ icon: "ph--caret-right--regular",
295
+ size: 6,
296
+ label: "Next",
297
+ iconOnly: true,
298
+ noTooltip: true,
299
+ variant: "ghost",
300
+ classNames: "p-0",
301
+ onClick: () => handleChangeIndex(1)
302
+ }), /* @__PURE__ */ React4.createElement(IconButton, {
303
+ icon: "ph--caret-double-right--regular",
304
+ size: 6,
305
+ label: "Jump to last",
306
+ iconOnly: true,
307
+ noTooltip: true,
308
+ variant: "ghost",
309
+ classNames: "p-0",
310
+ onClick: () => onChange?.(count - 1)
311
+ }));
312
+ };
313
+ var PageNumber = ({ index = 0, count = 1 }) => {
314
+ if (index === void 0 || !count) {
315
+ return null;
316
+ }
317
+ return /* @__PURE__ */ React4.createElement("div", {
318
+ className: "flex items-center text-neutral-500 text-2xl"
319
+ }, /* @__PURE__ */ React4.createElement("div", null, index + 1, " / ", count));
320
+ };
321
+ var StartButton = ({ running, onClick }) => {
322
+ return /* @__PURE__ */ React4.createElement(IconButton, {
323
+ icon: running ? "ph--x--regular" : "ph--play--regular",
324
+ size: 6,
325
+ label: running ? "Stop" : "Play",
326
+ iconOnly: true,
327
+ noTooltip: true,
328
+ variant: "ghost",
329
+ classNames: "p-0",
330
+ onClick: () => onClick?.(!running)
331
+ });
332
+ };
333
+
334
+ // src/components/RevealPlayer/RevealPlayer.tsx
335
+ import "reveal.js/dist/reveal.css";
336
+ import "reveal.js/dist/theme/black.css";
337
+ import "highlight.js/styles/tokyo-night-dark.css";
338
+ import hljs from "highlight.js";
339
+ import typescript from "highlight.js/lib/languages/typescript";
340
+ import React5, { useRef } from "react";
341
+ import Reveal from "reveal.js";
342
+ import RevealHighlight from "reveal.js/plugin/highlight/highlight";
343
+ import RevealMarkdown from "reveal.js/plugin/markdown/plugin.js";
344
+ import { useAsyncEffect } from "@dxos/react-ui";
345
+ import { composable as composable2, composableProps as composableProps2 } from "@dxos/ui-theme";
346
+ var styles = `
347
+ <style type="text/css">
348
+ .reveal h1 {
349
+ font-weight: 100;
350
+ font-size: 60px;
351
+ opacity: 0.5;
352
+ }
353
+ .reveal h2 {
354
+ font-weight: 100;
355
+ padding-top: 60px;
356
+ padding-left: 40px;
357
+ font-size: 48px;
358
+ opacity: 0.3;
359
+ }
360
+ .reveal h1, h2, p {
361
+ font-family: "Raleway", sans-serif;
362
+ text-align: left;
363
+ font-weight: 200;
364
+ }
365
+ .reveal ul {
366
+ font-family: "Raleway", sans-serif;
367
+ display: block;
368
+ list-style: "- ";
31
369
  }
32
- ];
370
+ .reveal blockquote p {
371
+ text-align: center;
372
+ font-weight: 100;
373
+ padding: 32px;
374
+ }
375
+ .reveal pre {
376
+ margin-left: 0;
377
+ }
378
+ .reveal code {
379
+ font-size: 20px;
380
+ background: #111111;
381
+ color: #eeeeee;
382
+ max-height: unset !important;
383
+ }
384
+ </style>
385
+ `;
386
+ var RevealPlayer = composable2(({ content, slide, fullscreen = true, onExit, children, ...props }, forwardedRef) => {
387
+ const deckDivRef = useRef(null);
388
+ const deckRef = useRef(null);
389
+ useAsyncEffect(async () => {
390
+ if (deckRef.current) {
391
+ return;
392
+ }
393
+ hljs.registerLanguage("typescript", typescript);
394
+ deckRef.current = new Reveal(deckDivRef.current, {
395
+ // view: 'scroll',
396
+ progress: false,
397
+ transition: "none",
398
+ slideNumber: false,
399
+ embedded: true,
400
+ // Disable autoplay to prevent errors in headless environments (e.g., CI).
401
+ autoPlayMedia: false,
402
+ // TODO(burdon): Speaker view requires server to serve popout window.
403
+ // https://revealjs.com/speaker-view
404
+ showNotes: false,
405
+ // width: 1600,
406
+ // height: 900,
407
+ margin: 0.1,
408
+ // center: false,
409
+ // minScale: 0.1,
410
+ // maxScale: 1.4,
411
+ // https://revealjs.com/markdown
412
+ // TODO(burdon): Requires server to serve popout window.
413
+ plugins: [
414
+ RevealMarkdown,
415
+ RevealHighlight
416
+ ],
417
+ // See https://marked.js.org/using_advanced#options
418
+ markdown: {
419
+ gfm: true,
420
+ smartypants: true,
421
+ highlight: (code, language) => {
422
+ if (language) {
423
+ return hljs.highlight(code, {
424
+ language
425
+ }).value;
426
+ }
427
+ return hljs.highlightAuto(code).value;
428
+ }
429
+ }
430
+ });
431
+ await deckRef.current.initialize();
432
+ if (slide !== void 0) {
433
+ deckRef.current.slide(slide < 0 ? deckRef.current?.getTotalSlides() + slide : slide - 1);
434
+ }
435
+ deckRef.current.addKeyBinding({
436
+ keyCode: 27,
437
+ key: "Escape",
438
+ description: "Exit full screen"
439
+ }, () => {
440
+ onExit?.();
441
+ });
442
+ return () => {
443
+ try {
444
+ if (deckRef.current) {
445
+ deckRef.current.destroy();
446
+ deckRef.current = null;
447
+ }
448
+ } catch {
449
+ }
450
+ };
451
+ });
452
+ return /* @__PURE__ */ React5.createElement("div", {
453
+ ...composableProps2(props, {
454
+ classNames: [
455
+ "dx-container grid place-items-center bg-black",
456
+ fullscreen && "absolute inset-0"
457
+ ]
458
+ }),
459
+ ref: forwardedRef
460
+ }, /* @__PURE__ */ React5.createElement("div", {
461
+ role: "none",
462
+ className: "relative aspect-video h-full w-full h-auto max-h-full overflow-hidden"
463
+ }, /* @__PURE__ */ React5.createElement("div", {
464
+ ref: deckDivRef,
465
+ className: "absolute inset-0 reveal"
466
+ }, /* @__PURE__ */ React5.createElement("style", null, /* @__PURE__ */ React5.createElement("link", {
467
+ rel: "preconnect",
468
+ href: "https://fonts.googleapis.com"
469
+ }), /* @__PURE__ */ React5.createElement("link", {
470
+ rel: "preconnect",
471
+ href: "https://fonts.gstatic.com",
472
+ crossOrigin: ""
473
+ }), /* @__PURE__ */ React5.createElement("link", {
474
+ rel: "stylesheet",
475
+ href: "https://fonts.googleapis.com/css2?family=Raleway:ital,wght@0,100..900;1,100..900&display=swap"
476
+ })), /* @__PURE__ */ React5.createElement("div", {
477
+ className: "slides"
478
+ }, /* @__PURE__ */ React5.createElement("div", {
479
+ className: "text-center!"
480
+ }), /* @__PURE__ */ React5.createElement("section", {
481
+ "data-markdown": []
482
+ }, /* @__PURE__ */ React5.createElement("textarea", {
483
+ "data-template": true,
484
+ defaultValue: [
485
+ styles,
486
+ content
487
+ ].join("\n")
488
+ }))))));
489
+ });
490
+
491
+ // src/components/index.ts
492
+ var PresenterSettings = lazy(() => import("./PresenterSettings-2G4XD4QY.mjs"));
493
+
494
+ // src/meta.ts
495
+ import { trim } from "@dxos/util";
496
+ var meta = {
497
+ id: "org.dxos.plugin.presenter",
498
+ name: "Presenter",
499
+ description: trim`
500
+ Transform markdown documents into interactive presentation slideshows.
501
+ Navigate between slides with keyboard controls and present content in full-screen mode.
502
+ `,
503
+ icon: "ph--presentation--regular",
504
+ iconHue: "indigo",
505
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-presenter"
506
+ };
33
507
 
34
508
  // src/PresenterPlugin.tsx
35
- var PresenterPlugin = () => definePlugin(meta, [
36
- defineModule({
37
- id: `${meta.id}/module/settings`,
38
- activatesOn: Events.SetupSettings,
39
- activate: PresenterSettings2
40
- }),
41
- defineModule({
42
- id: `${meta.id}/module/translations`,
43
- activatesOn: Events.SetupTranslations,
44
- activate: () => contributes(Capabilities.Translations, translations)
45
- }),
46
- defineModule({
47
- id: `${meta.id}/module/react-surface`,
48
- activatesOn: Events.SetupReactSurface,
49
- activate: ReactSurface
50
- }),
51
- defineModule({
52
- id: `${meta.id}/module/app-graph-builder`,
53
- activatesOn: Events.SetupAppGraph,
54
- activate: AppGraphBuilder
55
- })
56
- ]);
509
+ import { Plugin } from "@dxos/app-framework";
510
+ import { AppPlugin } from "@dxos/app-toolkit";
511
+ import { AppGraphBuilder, PresenterSettings as PresenterSettings2, ReactSurface } from "#capabilities";
512
+ import { meta as meta2 } from "#meta";
513
+ import { translations } from "#translations";
514
+ var PresenterPlugin = Plugin.define(meta2).pipe(AppPlugin.addAppGraphModule({
515
+ activate: AppGraphBuilder
516
+ }), AppPlugin.addSettingsModule({
517
+ activate: PresenterSettings2
518
+ }), AppPlugin.addSurfaceModule({
519
+ activate: ReactSurface
520
+ }), AppPlugin.addTranslationsModule({
521
+ translations
522
+ }), Plugin.make);
57
523
  export {
58
- CollectionPresenterContainer,
59
- DocumentPresenterContainer,
60
- MarkdownSlide,
61
- PRESENTER_PLUGIN,
524
+ Layout,
525
+ PageNumber,
526
+ Pager,
527
+ Panel,
62
528
  PresenterPlugin,
63
529
  PresenterSettings,
530
+ RevealPlayer,
531
+ Slide,
532
+ StartButton,
64
533
  meta
65
534
  };
66
535
  //# sourceMappingURL=index.mjs.map