@dxos/plugin-presenter 0.8.4-main.f5c0578 → 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 (156) 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 +1 -1
  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/{components/MarkdownSlide.d.ts → containers/DocumentPresenterContainer/DocumentPresenterContainer.d.ts} +2 -3
  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 +70 -44
  82. package/src/PresenterPlugin.tsx +12 -27
  83. package/src/capabilities/app-graph-builder.ts +93 -71
  84. package/src/capabilities/index.ts +4 -4
  85. package/src/capabilities/react-surface.tsx +58 -43
  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 +11 -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 +53 -18
  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 +8 -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/{components → containers/MarkdownSlide}/MarkdownSlide.tsx +9 -7
  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-OUCNLVND.mjs +0 -191
  120. package/dist/lib/browser/CollectionPresenterContainer-OUCNLVND.mjs.map +0 -7
  121. package/dist/lib/browser/DocumentPresenterContainer-THZU5S4O.mjs +0 -185
  122. package/dist/lib/browser/DocumentPresenterContainer-THZU5S4O.mjs.map +0 -7
  123. package/dist/lib/browser/MarkdownSlide-KG7ESCSU.mjs +0 -336
  124. package/dist/lib/browser/MarkdownSlide-KG7ESCSU.mjs.map +0 -7
  125. package/dist/lib/browser/app-graph-builder-GXESSA7Q.mjs +0 -77
  126. package/dist/lib/browser/app-graph-builder-GXESSA7Q.mjs.map +0 -7
  127. package/dist/lib/browser/chunk-RDCZJT62.mjs +0 -37
  128. package/dist/lib/browser/chunk-RDCZJT62.mjs.map +0 -7
  129. package/dist/lib/browser/chunk-UVGTHJUO.mjs +0 -36
  130. package/dist/lib/browser/chunk-UVGTHJUO.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-W4IR3DJE.mjs +0 -39
  134. package/dist/lib/browser/chunk-W4IR3DJE.mjs.map +0 -7
  135. package/dist/lib/browser/react-surface-H3L7Y3ED.mjs +0 -57
  136. package/dist/lib/browser/react-surface-H3L7Y3ED.mjs.map +0 -7
  137. package/dist/lib/browser/settings-VQVVDAGY.mjs +0 -22
  138. package/dist/lib/browser/settings-VQVVDAGY.mjs.map +0 -7
  139. package/dist/types/src/components/CollectionPresenterContainer.d.ts +0 -7
  140. package/dist/types/src/components/CollectionPresenterContainer.d.ts.map +0 -1
  141. package/dist/types/src/components/DocumentPresenterContainer.d.ts +0 -7
  142. package/dist/types/src/components/DocumentPresenterContainer.d.ts.map +0 -1
  143. package/dist/types/src/components/Markdown/Container.d.ts +0 -8
  144. package/dist/types/src/components/Markdown/Container.d.ts.map +0 -1
  145. package/dist/types/src/components/Markdown/Container.stories.d.ts +0 -26
  146. package/dist/types/src/components/Markdown/Container.stories.d.ts.map +0 -1
  147. package/dist/types/src/components/MarkdownSlide.d.ts.map +0 -1
  148. package/dist/types/src/components/PresenterSettings.d.ts +0 -6
  149. package/dist/types/src/components/PresenterSettings.d.ts.map +0 -1
  150. package/dist/types/src/types.d.ts +0 -39
  151. package/dist/types/src/types.d.ts.map +0 -1
  152. package/src/components/CollectionPresenterContainer.tsx +0 -44
  153. package/src/components/DocumentPresenterContainer.tsx +0 -23
  154. package/src/components/Markdown/Container.stories.tsx +0 -58
  155. package/src/components/PresenterSettings.tsx +0 -26
  156. package/src/types.ts +0 -46
@@ -2,31 +2,34 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
 
7
- import { type Meta } from '@storybook/react-vite';
7
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
8
8
 
9
- import { createSlide } from '../../testing';
9
+ import { createSlide } from '#testing';
10
10
 
11
11
  import { Slide } from './Slide';
12
12
 
13
- const meta: Meta = {
14
- title: 'plugins/plugin-presenter/Slide',
13
+ const meta = {
14
+ title: 'plugins/plugin-presenter/components/Slide',
15
15
  component: Slide,
16
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
16
17
  parameters: {
17
18
  layout: 'fullscreen',
18
19
  },
19
- };
20
+ } satisfies Meta<typeof Slide>;
20
21
 
21
22
  export default meta;
22
23
 
23
- export const Default = {
24
+ type Story = StoryObj<typeof meta>;
25
+
26
+ export const Default: Story = {
24
27
  args: {
25
28
  content: createSlide(),
26
29
  },
27
30
  };
28
31
 
29
- export const Code = {
32
+ export const Code: Story = {
30
33
  args: {
31
34
  content: createSlide({ code: true }),
32
35
  },
@@ -2,21 +2,22 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import 'highlight.js/styles/github.css';
6
+
5
7
  import { h } from 'hastscript';
6
8
  import React from 'react';
7
- import ReactMarkdown from 'react-markdown';
8
- import addClasses from 'rehype-add-classes';
9
- import highlight from 'rehype-highlight';
9
+ import ReactMarkdown, { type Options as ReactMarkdownOptions } from 'react-markdown';
10
+ import rehypeAddClasses from 'rehype-add-classes';
11
+ import rehypeHighlight from 'rehype-highlight';
10
12
  import remarkFrontmatter from 'remark-frontmatter';
11
13
  import remarkParseFrontmatter from 'remark-parse-frontmatter';
12
14
 
13
- import 'highlight.js/styles/github.css';
14
-
15
+ import styles from './styles.css?raw';
15
16
  import { theme } from './theme';
16
17
 
17
18
  export type SlideProps = {
18
19
  content?: string;
19
- classes?: { [selector: string]: string };
20
+ classes?: Record<string, string>;
20
21
  };
21
22
 
22
23
  export const Slide = ({ content = '', classes = theme.nodes }: SlideProps) => {
@@ -24,132 +25,13 @@ export const Slide = ({ content = '', classes = theme.nodes }: SlideProps) => {
24
25
  // configurable. Find a way to remove the literal stylesheet here.
25
26
  return (
26
27
  <>
27
- <style>{`
28
- .dark pre code.hljs {
29
- display: block;
30
- overflow-x: auto;
31
- padding: 1em
32
- }
33
- .dark code.hljs {
34
- padding: 3px 5px
35
- }
36
- /*!
37
- Theme: GitHub Dark
38
- Description: Dark theme as seen on github.com
39
- Author: github.com
40
- Maintainer: @Hirse
41
- Updated: 2021-05-15
42
-
43
- Outdated base version: https://github.com/primer/github-syntax-dark
44
- Current colors taken from GitHub's CSS
45
- */
46
- .dark .hljs {
47
- color: #c9d1d9;
48
- background: #0d1117
49
- }
50
- .dark .hljs-doctag,
51
- .dark .hljs-keyword,
52
- .dark .hljs-meta .hljs-keyword,
53
- .dark .hljs-template-tag,
54
- .dark .hljs-template-variable,
55
- .dark .hljs-type,
56
- .dark .hljs-variable.language_ {
57
- /* prettylights-syntax-keyword */
58
- color: #ff7b72
59
- }
60
- .dark .hljs-title,
61
- .dark .hljs-title.class_,
62
- .dark .hljs-title.class_.inherited__,
63
- .dark .hljs-title.function_ {
64
- /* prettylights-syntax-entity */
65
- color: #d2a8ff
66
- }
67
- .dark .hljs-attr,
68
- .dark .hljs-attribute,
69
- .dark .hljs-literal,
70
- .dark .hljs-meta,
71
- .dark .hljs-number,
72
- .dark .hljs-operator,
73
- .dark .hljs-variable,
74
- .dark .hljs-selector-attr,
75
- .dark .hljs-selector-class,
76
- .dark .hljs-selector-id {
77
- /* prettylights-syntax-constant */
78
- color: #79c0ff
79
- }
80
- .dark .hljs-regexp,
81
- .dark .hljs-string,
82
- .dark .hljs-meta .hljs-string {
83
- /* prettylights-syntax-string */
84
- color: #a5d6ff
85
- }
86
- .dark .hljs-built_in,
87
- .dark .hljs-symbol {
88
- /* prettylights-syntax-variable */
89
- color: #ffa657
90
- }
91
- .dark .hljs-comment,
92
- .dark .hljs-code,
93
- .dark .hljs-formula {
94
- /* prettylights-syntax-comment */
95
- color: #8b949e
96
- }
97
- .dark .hljs-name,
98
- .dark .hljs-quote,
99
- .dark .hljs-selector-tag,
100
- .dark .hljs-selector-pseudo {
101
- /* prettylights-syntax-entity-tag */
102
- color: #7ee787
103
- }
104
- .dark .hljs-subst {
105
- /* prettylights-syntax-storage-modifier-import */
106
- color: #c9d1d9
107
- }
108
- .dark .hljs-section {
109
- /* prettylights-syntax-markup-heading */
110
- color: #1f6feb;
111
- font-weight: bold
112
- }
113
- .dark .hljs-bullet {
114
- /* prettylights-syntax-markup-list */
115
- color: #f2cc60
116
- }
117
- .dark .hljs-emphasis {
118
- /* prettylights-syntax-markup-italic */
119
- color: #c9d1d9;
120
- font-style: italic
121
- }
122
- .dark .hljs-strong {
123
- /* prettylights-syntax-markup-bold */
124
- color: #c9d1d9;
125
- font-weight: bold
126
- }
127
- .dark .hljs-addition {
128
- /* prettylights-syntax-markup-inserted */
129
- color: #aff5b4;
130
- background-color: #033a16
131
- }
132
- .dark .hljs-deletion {
133
- /* prettylights-syntax-markup-deleted */
134
- color: #ffdcd7;
135
- background-color: #67060c
136
- }
137
- .dark .hljs-char.escape_,
138
- .dark .hljs-link,
139
- .dark .hljs-params,
140
- .dark .hljs-property,
141
- .dark .hljs-punctuation,
142
- .dark .hljs-tag {
143
- /* purposely ignored */
144
-
145
- }
146
- `}</style>
28
+ <style>{styles}</style>
147
29
  <ReactMarkdown
148
30
  components={components}
149
31
  // Markdown to HTML.
150
32
  remarkPlugins={[[remarkFrontmatter, 'yaml'], remarkParseFrontmatter as any]}
151
33
  // HTML processing.
152
- rehypePlugins={[highlight, [addClasses, classes], slideLayout]}
34
+ rehypePlugins={[[rehypeAddClasses, classes], rehypeHighlight as any, slideLayout]}
153
35
  >
154
36
  {content}
155
37
  </ReactMarkdown>
@@ -164,7 +46,7 @@ export const Slide = ({ content = '', classes = theme.nodes }: SlideProps) => {
164
46
  * E.g., layout image from front-matter.
165
47
  */
166
48
  const slideLayout =
167
- (options = {}) =>
49
+ (_options = {}) =>
168
50
  (tree: any, file: any) => {
169
51
  const {
170
52
  data: { frontmatter = {} },
@@ -210,9 +92,11 @@ const slideLayout =
210
92
  tree.children = [root];
211
93
  };
212
94
 
213
- const ImageWrapper = ({ node, ...props }: { node: any }) => {
95
+ const ImageWrapper = ({ node: _, ...props }: { node: any }) => {
214
96
  const { alt = '', src } = props as { alt: string; src: string };
215
97
  return <img alt={alt} src={src} />;
216
98
  };
217
99
 
218
- const components = { img: ImageWrapper };
100
+ const components: ReactMarkdownOptions['components'] = {
101
+ img: ({ node, ...props }) => <ImageWrapper node={node} {...props} />,
102
+ };
@@ -2,5 +2,5 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- export * from './Container';
5
+ export * from './Panel';
6
6
  export * from './Slide';
@@ -0,0 +1,104 @@
1
+ /*!
2
+ Theme: GitHub Dark
3
+ Description: Dark theme as seen on github.com
4
+ Author: github.com
5
+ Maintainer: @Hirse
6
+ Updated: 2021-05-15
7
+ Outdated base version: https://github.com/primer/github-syntax-dark
8
+ Current colors taken from GitHub's CSS
9
+ */
10
+ /* TODO(burdon): Use tokens. */
11
+ .dark pre code.hljs {
12
+ display: block;
13
+ overflow-x: auto;
14
+ padding: 1em;
15
+ }
16
+ .dark code.hljs {
17
+ padding: 3px 5px;
18
+ }
19
+ .dark .hljs {
20
+ color: #c9d1d9;
21
+ background: #0d1117;
22
+ }
23
+ .dark .hljs-doctag,
24
+ .dark .hljs-keyword,
25
+ .dark .hljs-meta .hljs-keyword,
26
+ .dark .hljs-template-tag,
27
+ .dark .hljs-template-variable,
28
+ .dark .hljs-type,
29
+ .dark .hljs-variable.language_ {
30
+ color: #ff7b72;
31
+ }
32
+ .dark .hljs-title,
33
+ .dark .hljs-title.class_,
34
+ .dark .hljs-title.class_.inherited__,
35
+ .dark .hljs-title.function_ {
36
+ color: #d2a8ff;
37
+ }
38
+ .dark .hljs-attr,
39
+ .dark .hljs-attribute,
40
+ .dark .hljs-literal,
41
+ .dark .hljs-meta,
42
+ .dark .hljs-number,
43
+ .dark .hljs-operator,
44
+ .dark .hljs-variable,
45
+ .dark .hljs-selector-attr,
46
+ .dark .hljs-selector-class,
47
+ .dark .hljs-selector-id {
48
+ color: #79c0ff;
49
+ }
50
+ .dark .hljs-regexp,
51
+ .dark .hljs-string,
52
+ .dark .hljs-meta .hljs-string {
53
+ color: #a5d6ff;
54
+ }
55
+ .dark .hljs-built_in,
56
+ .dark .hljs-symbol {
57
+ color: #ffa657;
58
+ }
59
+ .dark .hljs-comment,
60
+ .dark .hljs-code,
61
+ .dark .hljs-formula {
62
+ color: #8b949e;
63
+ }
64
+ .dark .hljs-name,
65
+ .dark .hljs-quote,
66
+ .dark .hljs-selector-tag,
67
+ .dark .hljs-selector-pseudo {
68
+ color: #7ee787;
69
+ }
70
+ .dark .hljs-subst {
71
+ color: #c9d1d9;
72
+ }
73
+ .dark .hljs-section {
74
+ color: #1f6feb;
75
+ font-weight: bold;
76
+ }
77
+ .dark .hljs-bullet {
78
+ color: #f2cc60;
79
+ }
80
+ .dark .hljs-emphasis {
81
+ color: #c9d1d9;
82
+ font-style: italic;
83
+ }
84
+ .dark .hljs-strong {
85
+ color: #c9d1d9;
86
+ font-weight: bold;
87
+ }
88
+ .dark .hljs-addition {
89
+ color: #aff5b4;
90
+ background-color: #033a16;
91
+ }
92
+ .dark .hljs-deletion {
93
+ color: #ffdcd7;
94
+ background-color: #67060c;
95
+ }
96
+ .dark .hljs-char.escape_,
97
+ .dark .hljs-link,
98
+ .dark .hljs-params,
99
+ .dark .hljs-property,
100
+ .dark .hljs-punctuation,
101
+ .dark .hljs-tag {
102
+ /* purposely ignored */
103
+ all: unset;
104
+ }
@@ -5,14 +5,14 @@
5
5
  // TODO(burdon): Create theme type and picker.
6
6
 
7
7
  export const theme = {
8
- root: 'bg-attention leading-relaxed font-mono',
8
+ root: 'bg-attention-surface leading-relaxed font-mono',
9
9
 
10
10
  padding: 'px-40 py-16 gap-8',
11
11
 
12
12
  nodes: {
13
- h1: 'text-[80px] text-accentText',
14
- h2: 'text-[60px] text-accentText',
15
- h3: 'text-[48px] text-accentText',
13
+ h1: 'text-[80px] text-accent-text',
14
+ h2: 'text-[60px] text-accent-text',
15
+ h3: 'text-[48px] text-accent-text',
16
16
 
17
17
  p: 'text-[48px]',
18
18
 
@@ -20,7 +20,7 @@ export const theme = {
20
20
  ol: 'my-[16px] ml-24 leading-relaxed list-decimal',
21
21
  li: 'pl-6 text-[48px]',
22
22
 
23
- pre: 'w-full mx-0 my-[32px] p-0 __border-l-[16px] bg-inputSurface p-4 __whitespace-pre-line',
23
+ pre: 'w-full mx-0 my-[32px] p-4 bg-input-surface',
24
24
  code: 'p-0 text-[40px]',
25
25
  },
26
26
  };
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ declare module '*.css?raw' {
6
+ const content: string;
7
+ export default content;
8
+ }
@@ -4,30 +4,31 @@
4
4
 
5
5
  import React, { type PropsWithChildren, type ReactNode } from 'react';
6
6
 
7
- import { type ThemedClassName } from '@dxos/react-ui';
8
- import { mx } from '@dxos/react-ui-theme';
7
+ import { composable, composableProps } from '@dxos/ui-theme';
9
8
 
10
- export type LayoutProps = ThemedClassName<
11
- PropsWithChildren<{
12
- className?: string;
13
- topLeft?: ReactNode;
14
- topRight?: ReactNode;
15
- bottomLeft?: ReactNode;
16
- bottomRight?: ReactNode;
17
- }>
18
- >;
9
+ export type LayoutProps = PropsWithChildren<{
10
+ topLeft?: ReactNode;
11
+ topRight?: ReactNode;
12
+ bottomLeft?: ReactNode;
13
+ bottomRight?: ReactNode;
14
+ }>;
19
15
 
20
- export const Layout = ({ children, classNames, topLeft, topRight, bottomLeft, bottomRight }: LayoutProps) => {
21
- return (
22
- <div className={mx('flex grow relative overflow-hidden bg-attention', classNames)}>
23
- <div className={mx('flex flex-col grow overflow-hidden')}>{children}</div>
16
+ export const Layout = composable<HTMLDivElement, LayoutProps>(
17
+ ({ children, topLeft, topRight, bottomLeft, bottomRight, ...props }, forwardedRef) => {
18
+ return (
19
+ <div
20
+ {...composableProps(props, { classNames: 'flex grow relative overflow-hidden bg-attention-surface' })}
21
+ ref={forwardedRef}
22
+ >
23
+ <div className='flex flex-col grow overflow-hidden'>{children}</div>
24
24
 
25
- <div className='z-[200]'>
26
- <div className='absolute top-4 left-4'>{topLeft}</div>
27
- <div className='absolute top-4 right-4'>{topRight}</div>
28
- <div className='absolute bottom-4 left-4'>{bottomLeft}</div>
29
- <div className='absolute bottom-4 right-4'>{bottomRight}</div>
25
+ <div className='z-[200]'>
26
+ <div className='absolute top-4 left-4'>{topLeft}</div>
27
+ <div className='absolute top-4 right-4'>{topRight}</div>
28
+ <div className='absolute bottom-4 left-4'>{bottomLeft}</div>
29
+ <div className='absolute bottom-4 right-4'>{bottomRight}</div>
30
+ </div>
30
31
  </div>
31
- </div>
32
- );
33
- };
32
+ );
33
+ },
34
+ );
@@ -2,12 +2,10 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useState } from 'react';
9
7
 
10
- import { withTheme } from '@dxos/storybook-utils';
8
+ import { withTheme } from '@dxos/react-ui/testing';
11
9
 
12
10
  import { PageNumber, Pager, type PagerProps, StartButton } from './Pager';
13
11
 
@@ -24,15 +22,17 @@ const DefaultStory = ({ count = 20 }: PagerProps) => {
24
22
  );
25
23
  };
26
24
 
27
- export const Default = {};
28
-
29
- const meta: Meta<PagerProps> = {
30
- title: 'plugins/plugin-presenter/Pager',
25
+ const meta = {
26
+ title: 'plugins/plugin-presenter/components/Pager',
31
27
  render: DefaultStory,
32
- decorators: [withTheme],
28
+ decorators: [withTheme()],
33
29
  parameters: {
34
30
  layout: 'centered',
35
31
  },
36
- };
32
+ } satisfies Meta<typeof DefaultStory>;
37
33
 
38
34
  export default meta;
35
+
36
+ type Story = StoryObj<typeof meta>;
37
+
38
+ export const Default: Story = {};
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { useEffect } from 'react';
6
6
 
7
- import { Button, Icon, useControlledState } from '@dxos/react-ui';
7
+ import { IconButton, useControlledState } from '@dxos/react-ui';
8
8
 
9
9
  export type PagerProps = {
10
10
  index?: number;
@@ -14,8 +14,8 @@ export type PagerProps = {
14
14
  onExit?: () => void;
15
15
  };
16
16
 
17
- export const Pager = ({ index: controlledIndex = 0, count = 0, keys, onChange, onExit }: PagerProps) => {
18
- const [index, setIndex] = useControlledState(controlledIndex);
17
+ export const Pager = ({ index: indexProp = 0, count = 0, keys, onChange, onExit }: PagerProps) => {
18
+ const [index, setIndex] = useControlledState(indexProp);
19
19
  useEffect(() => {
20
20
  onChange?.(index);
21
21
  }, [index]);
@@ -76,18 +76,46 @@ export const Pager = ({ index: controlledIndex = 0, count = 0, keys, onChange, o
76
76
 
77
77
  return (
78
78
  <div className='flex items-center text-neutral-500'>
79
- <Button variant='ghost' classNames='p-0' onClick={() => onChange?.(0)}>
80
- <Icon icon='ph--caret-double-left--regular' size={6} />
81
- </Button>
82
- <Button variant='ghost' classNames='p-0' onClick={() => handleChangeIndex(-1)}>
83
- <Icon icon='ph--caret-left--regular' size={6} />
84
- </Button>
85
- <Button variant='ghost' classNames='p-0' onClick={() => handleChangeIndex(1)}>
86
- <Icon icon='ph--caret-right--regular' size={6} />
87
- </Button>
88
- <Button variant='ghost' classNames='p-0' onClick={() => onChange?.(count - 1)}>
89
- <Icon icon='ph--caret-double-right--regular' size={6} />
90
- </Button>
79
+ <IconButton
80
+ icon='ph--caret-double-left--regular'
81
+ size={6}
82
+ label='Jump to first'
83
+ iconOnly
84
+ noTooltip
85
+ variant='ghost'
86
+ classNames='p-0'
87
+ onClick={() => onChange?.(0)}
88
+ />
89
+ <IconButton
90
+ icon='ph--caret-left--regular'
91
+ size={6}
92
+ label='Previous'
93
+ iconOnly
94
+ noTooltip
95
+ variant='ghost'
96
+ classNames='p-0'
97
+ onClick={() => handleChangeIndex(-1)}
98
+ />
99
+ <IconButton
100
+ icon='ph--caret-right--regular'
101
+ size={6}
102
+ label='Next'
103
+ iconOnly
104
+ noTooltip
105
+ variant='ghost'
106
+ classNames='p-0'
107
+ onClick={() => handleChangeIndex(1)}
108
+ />
109
+ <IconButton
110
+ icon='ph--caret-double-right--regular'
111
+ size={6}
112
+ label='Jump to last'
113
+ iconOnly
114
+ noTooltip
115
+ variant='ghost'
116
+ classNames='p-0'
117
+ onClick={() => onChange?.(count - 1)}
118
+ />
91
119
  </div>
92
120
  );
93
121
  };
@@ -113,8 +141,15 @@ export const PageNumber = ({ index = 0, count = 1 }: PageNumberProps) => {
113
141
 
114
142
  export const StartButton = ({ running, onClick }: { running?: boolean; onClick?: (start: boolean) => void }) => {
115
143
  return (
116
- <Button variant='ghost' classNames='p-0' onClick={() => onClick?.(!running)}>
117
- {(running && <Icon icon='ph--x--regular' size={6} />) || <Icon icon='ph--play--regular' size={6} />}
118
- </Button>
144
+ <IconButton
145
+ icon={running ? 'ph--x--regular' : 'ph--play--regular'}
146
+ size={6}
147
+ label={running ? 'Stop' : 'Play'}
148
+ iconOnly
149
+ noTooltip
150
+ variant='ghost'
151
+ classNames='p-0'
152
+ onClick={() => onClick?.(!running)}
153
+ />
119
154
  );
120
155
  };
@@ -0,0 +1,32 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+
7
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
8
+
9
+ import { translations } from '#translations';
10
+
11
+ import { PresenterSettings } from './PresenterSettings';
12
+
13
+ const meta = {
14
+ title: 'plugins/plugin-presenter/components/PresenterSettings',
15
+ component: PresenterSettings,
16
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
17
+ tags: ['settings'],
18
+ parameters: {
19
+ layout: 'fullscreen',
20
+ translations,
21
+ },
22
+ } satisfies Meta<typeof PresenterSettings>;
23
+
24
+ export default meta;
25
+
26
+ type Story = StoryObj<typeof meta>;
27
+
28
+ export const Default: Story = {
29
+ args: {
30
+ settings: { presentCollections: true },
31
+ },
32
+ };
@@ -0,0 +1,31 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { type AppSurface } from '@dxos/app-toolkit/ui';
8
+ import { useTranslation } from '@dxos/react-ui';
9
+ import { Settings as SettingsForm } from '@dxos/react-ui-form';
10
+
11
+ import { meta } from '#meta';
12
+ import { Settings } from '#types';
13
+
14
+ export type PresenterSettingsProps = AppSurface.SettingsArticleProps<Settings.Settings>;
15
+
16
+ export const PresenterSettings = ({ settings, onSettingsChange }: PresenterSettingsProps) => {
17
+ const { t } = useTranslation(meta.id);
18
+
19
+ return (
20
+ <SettingsForm.Viewport>
21
+ <SettingsForm.Section title={t('settings.title', { ns: meta.id })}>
22
+ <SettingsForm.FieldSet
23
+ readonly={!onSettingsChange}
24
+ schema={Settings.Settings}
25
+ values={settings}
26
+ onValuesChanged={(values) => onSettingsChange?.(() => values)}
27
+ />
28
+ </SettingsForm.Section>
29
+ </SettingsForm.Viewport>
30
+ );
31
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export { PresenterSettings as default } from './PresenterSettings';
@@ -2,13 +2,13 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta } from '@storybook/react-vite';
8
6
 
9
- import CONTENT from '../../../testing/deck.md?raw';
10
- import { translations } from '../../translations';
7
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
8
+
9
+ import { translations } from '#translations';
11
10
 
11
+ import CONTENT from '../../../testing/deck.md?raw';
12
12
  import { RevealPlayer } from './RevealPlayer';
13
13
 
14
14
  // https://revealjs.com/markdown
@@ -19,14 +19,15 @@ import { RevealPlayer } from './RevealPlayer';
19
19
  // https://fontsource.org/fonts
20
20
  // https://fonts.google.com
21
21
 
22
- const meta: Meta<typeof RevealPlayer> = {
23
- title: 'plugins/plugin-presenter/RevealPlayer',
22
+ const meta = {
23
+ title: 'plugins/plugin-presenter/components/RevealPlayer',
24
24
  component: RevealPlayer,
25
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
25
26
  parameters: {
26
27
  layout: 'fullscreen',
27
28
  translations,
28
29
  },
29
- };
30
+ } satisfies Meta<typeof RevealPlayer>;
30
31
 
31
32
  export default meta;
32
33