@dxos/plugin-presenter 0.8.4-main.c4373fc → 0.8.4-main.d9fc60f731

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 (207) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +309 -0
  3. package/dist/lib/neutral/CollectionPresenterArticle-DFREOQTG.mjs +46 -0
  4. package/dist/lib/neutral/CollectionPresenterArticle-DFREOQTG.mjs.map +7 -0
  5. package/dist/lib/neutral/DocumentPresenterContainer-KCDZ2O2C.mjs +24 -0
  6. package/dist/lib/neutral/DocumentPresenterContainer-KCDZ2O2C.mjs.map +7 -0
  7. package/dist/lib/neutral/MarkdownSlide-WXILOIBE.mjs +18 -0
  8. package/dist/lib/neutral/MarkdownSlide-WXILOIBE.mjs.map +7 -0
  9. package/dist/lib/neutral/PresenterPlugin.mjs +35 -0
  10. package/dist/lib/neutral/PresenterPlugin.mjs.map +7 -0
  11. package/dist/lib/neutral/PresenterPlugin.node.mjs +16 -0
  12. package/dist/lib/neutral/PresenterPlugin.node.mjs.map +7 -0
  13. package/dist/lib/neutral/PresenterPlugin.workerd.mjs +12 -0
  14. package/dist/lib/neutral/PresenterPlugin.workerd.mjs.map +7 -0
  15. package/dist/lib/neutral/PresenterSettings-2G4XD4QY.mjs +25 -0
  16. package/dist/lib/neutral/PresenterSettings-2G4XD4QY.mjs.map +7 -0
  17. package/dist/lib/neutral/app-graph-builder-DIEDSRPX.mjs +97 -0
  18. package/dist/lib/neutral/app-graph-builder-DIEDSRPX.mjs.map +7 -0
  19. package/dist/lib/neutral/capabilities/index.mjs +13 -0
  20. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-PPL2FF6R.mjs +38 -0
  24. package/dist/lib/neutral/chunk-PPL2FF6R.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-V323QBC3.mjs +41 -0
  26. package/dist/lib/neutral/chunk-V323QBC3.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-VVALMI52.mjs +69 -0
  28. package/dist/lib/neutral/chunk-VVALMI52.mjs.map +7 -0
  29. package/dist/lib/neutral/components/index.mjs +502 -0
  30. package/dist/lib/neutral/components/index.mjs.map +7 -0
  31. package/dist/lib/neutral/containers/index.mjs +13 -0
  32. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  33. package/dist/lib/neutral/index.mjs +18 -0
  34. package/dist/lib/neutral/index.mjs.map +7 -0
  35. package/dist/lib/neutral/meta.json +1 -0
  36. package/dist/lib/neutral/meta.mjs +8 -0
  37. package/dist/lib/neutral/meta.mjs.map +7 -0
  38. package/dist/lib/neutral/plugin.mjs +12 -0
  39. package/dist/lib/neutral/plugin.mjs.map +7 -0
  40. package/dist/lib/neutral/react-surface-SPJGAJIF.mjs +54 -0
  41. package/dist/lib/neutral/react-surface-SPJGAJIF.mjs.map +7 -0
  42. package/dist/lib/neutral/settings-R6LRDAAK.mjs +28 -0
  43. package/dist/lib/neutral/settings-R6LRDAAK.mjs.map +7 -0
  44. package/dist/lib/neutral/translations.mjs +19 -0
  45. package/dist/lib/neutral/translations.mjs.map +7 -0
  46. package/dist/lib/neutral/types/index.mjs +14 -0
  47. package/dist/lib/neutral/types/index.mjs.map +7 -0
  48. package/dist/types/src/PresenterPlugin.d.ts +3 -1
  49. package/dist/types/src/PresenterPlugin.d.ts.map +1 -1
  50. package/dist/types/src/PresenterPlugin.node.d.ts +4 -0
  51. package/dist/types/src/PresenterPlugin.node.d.ts.map +1 -0
  52. package/dist/types/src/PresenterPlugin.test.d.ts +2 -0
  53. package/dist/types/src/PresenterPlugin.test.d.ts.map +1 -0
  54. package/dist/types/src/PresenterPlugin.workerd.d.ts +4 -0
  55. package/dist/types/src/PresenterPlugin.workerd.d.ts.map +1 -0
  56. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  57. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  58. package/dist/types/src/capabilities/index.d.ts +4 -3
  59. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  60. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  61. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  62. package/dist/types/src/capabilities/settings.d.ts +5 -2
  63. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  64. package/dist/types/src/components/Markdown/Panel.d.ts +8 -0
  65. package/dist/types/src/components/Markdown/Panel.d.ts.map +1 -0
  66. package/dist/types/src/components/Markdown/{Container.stories.d.ts → Panel.stories.d.ts} +1 -1
  67. package/dist/types/src/components/Markdown/Panel.stories.d.ts.map +1 -0
  68. package/dist/types/src/components/Markdown/Slide.d.ts +1 -1
  69. package/dist/types/src/components/Markdown/Slide.d.ts.map +1 -1
  70. package/dist/types/src/components/Markdown/Slide.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/Markdown/index.d.ts +1 -1
  72. package/dist/types/src/components/Markdown/index.d.ts.map +1 -1
  73. package/dist/types/src/components/Markdown/theme.d.ts.map +1 -1
  74. package/dist/types/src/components/Presenter/Layout.d.ts +5 -5
  75. package/dist/types/src/components/Presenter/Layout.d.ts.map +1 -1
  76. package/dist/types/src/components/Presenter/Pager.d.ts +1 -1
  77. package/dist/types/src/components/Presenter/Pager.d.ts.map +1 -1
  78. package/dist/types/src/components/Presenter/Pager.stories.d.ts.map +1 -1
  79. package/dist/types/src/components/PresenterSettings/PresenterSettings.d.ts +6 -0
  80. package/dist/types/src/components/PresenterSettings/PresenterSettings.d.ts.map +1 -0
  81. package/dist/types/src/components/PresenterSettings/PresenterSettings.stories.d.ts +23 -0
  82. package/dist/types/src/components/PresenterSettings/PresenterSettings.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/PresenterSettings/index.d.ts +2 -0
  84. package/dist/types/src/components/PresenterSettings/index.d.ts.map +1 -0
  85. package/dist/types/src/components/RevealPlayer/RevealPlayer.d.ts +5 -4
  86. package/dist/types/src/components/RevealPlayer/RevealPlayer.d.ts.map +1 -1
  87. package/dist/types/src/components/RevealPlayer/RevealPlayer.stories.d.ts +7 -6
  88. package/dist/types/src/components/RevealPlayer/RevealPlayer.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/index.d.ts +5 -25
  90. package/dist/types/src/components/index.d.ts.map +1 -1
  91. package/dist/types/src/containers/CollectionPresenterArticle/CollectionPresenterArticle.d.ts +6 -0
  92. package/dist/types/src/containers/CollectionPresenterArticle/CollectionPresenterArticle.d.ts.map +1 -0
  93. package/dist/types/src/containers/CollectionPresenterArticle/index.d.ts +2 -0
  94. package/dist/types/src/containers/CollectionPresenterArticle/index.d.ts.map +1 -0
  95. package/dist/types/src/containers/DocumentPresenterContainer/DocumentPresenterContainer.d.ts +6 -0
  96. package/dist/types/src/containers/DocumentPresenterContainer/DocumentPresenterContainer.d.ts.map +1 -0
  97. package/dist/types/src/containers/DocumentPresenterContainer/index.d.ts +2 -0
  98. package/dist/types/src/containers/DocumentPresenterContainer/index.d.ts.map +1 -0
  99. package/dist/types/src/containers/MarkdownSlide/MarkdownSlide.d.ts +8 -0
  100. package/dist/types/src/containers/MarkdownSlide/MarkdownSlide.d.ts.map +1 -0
  101. package/dist/types/src/containers/MarkdownSlide/index.d.ts +2 -0
  102. package/dist/types/src/containers/MarkdownSlide/index.d.ts.map +1 -0
  103. package/dist/types/src/containers/index.d.ts +5 -0
  104. package/dist/types/src/containers/index.d.ts.map +1 -0
  105. package/dist/types/src/index.d.ts +1 -2
  106. package/dist/types/src/index.d.ts.map +1 -1
  107. package/dist/types/src/meta.d.ts +2 -2
  108. package/dist/types/src/meta.d.ts.map +1 -1
  109. package/dist/types/src/plugin.d.ts +3 -0
  110. package/dist/types/src/plugin.d.ts.map +1 -0
  111. package/dist/types/src/testing.d.ts.map +1 -1
  112. package/dist/types/src/translations.d.ts +4 -6
  113. package/dist/types/src/translations.d.ts.map +1 -1
  114. package/dist/types/src/types/PresenterCapabilities.d.ts +4 -0
  115. package/dist/types/src/types/PresenterCapabilities.d.ts.map +1 -0
  116. package/dist/types/src/types/PresenterOperation.d.ts +17 -0
  117. package/dist/types/src/types/PresenterOperation.d.ts.map +1 -0
  118. package/dist/types/src/types/Settings.d.ts +7 -0
  119. package/dist/types/src/types/Settings.d.ts.map +1 -0
  120. package/dist/types/src/types/index.d.ts +11 -0
  121. package/dist/types/src/types/index.d.ts.map +1 -0
  122. package/dist/types/src/useExitPresenter.d.ts +3 -4
  123. package/dist/types/src/useExitPresenter.d.ts.map +1 -1
  124. package/dist/types/tsconfig.tsbuildinfo +1 -1
  125. package/package.json +99 -43
  126. package/src/PresenterPlugin.node.ts +16 -0
  127. package/src/PresenterPlugin.test.ts +23 -0
  128. package/src/PresenterPlugin.tsx +19 -25
  129. package/src/PresenterPlugin.workerd.ts +11 -0
  130. package/src/capabilities/app-graph-builder.ts +92 -103
  131. package/src/capabilities/index.ts +4 -4
  132. package/src/capabilities/react-surface.tsx +59 -55
  133. package/src/capabilities/settings.ts +24 -12
  134. package/src/components/Markdown/{Container.stories.tsx → Panel.stories.tsx} +7 -7
  135. package/src/components/Markdown/{Container.tsx → Panel.tsx} +6 -6
  136. package/src/components/Markdown/Slide.stories.tsx +4 -4
  137. package/src/components/Markdown/Slide.tsx +2 -2
  138. package/src/components/Markdown/index.ts +1 -1
  139. package/src/components/Markdown/theme.ts +5 -5
  140. package/src/components/Presenter/Layout.tsx +24 -23
  141. package/src/components/Presenter/Pager.stories.tsx +2 -2
  142. package/src/components/Presenter/Pager.tsx +53 -18
  143. package/src/components/PresenterSettings/PresenterSettings.stories.tsx +32 -0
  144. package/src/components/PresenterSettings/PresenterSettings.tsx +31 -0
  145. package/src/components/PresenterSettings/index.ts +5 -0
  146. package/src/components/RevealPlayer/RevealPlayer.stories.tsx +5 -5
  147. package/src/components/RevealPlayer/RevealPlayer.tsx +104 -95
  148. package/src/components/index.ts +5 -5
  149. package/src/containers/CollectionPresenterArticle/CollectionPresenterArticle.tsx +50 -0
  150. package/src/containers/CollectionPresenterArticle/index.ts +5 -0
  151. package/src/containers/DocumentPresenterContainer/DocumentPresenterContainer.tsx +24 -0
  152. package/src/containers/DocumentPresenterContainer/index.ts +5 -0
  153. package/src/containers/MarkdownSlide/MarkdownSlide.tsx +26 -0
  154. package/src/containers/MarkdownSlide/index.ts +5 -0
  155. package/src/containers/index.ts +9 -0
  156. package/src/index.ts +1 -3
  157. package/src/meta.ts +29 -5
  158. package/src/plugin.ts +9 -0
  159. package/src/testing.ts +6 -6
  160. package/src/translations.ts +4 -5
  161. package/src/types/PresenterCapabilities.ts +15 -0
  162. package/src/types/PresenterOperation.ts +29 -0
  163. package/src/types/Settings.ts +20 -0
  164. package/src/types/index.ts +21 -0
  165. package/src/useExitPresenter.ts +26 -25
  166. package/src/vite-env.d.ts +5 -0
  167. package/dist/lib/browser/CollectionPresenterContainer-LPJILYRF.mjs +0 -191
  168. package/dist/lib/browser/CollectionPresenterContainer-LPJILYRF.mjs.map +0 -7
  169. package/dist/lib/browser/DocumentPresenterContainer-F42V4KAL.mjs +0 -183
  170. package/dist/lib/browser/DocumentPresenterContainer-F42V4KAL.mjs.map +0 -7
  171. package/dist/lib/browser/MarkdownSlide-BLVWTH3U.mjs +0 -223
  172. package/dist/lib/browser/MarkdownSlide-BLVWTH3U.mjs.map +0 -7
  173. package/dist/lib/browser/app-graph-builder-RLGABE65.mjs +0 -106
  174. package/dist/lib/browser/app-graph-builder-RLGABE65.mjs.map +0 -7
  175. package/dist/lib/browser/chunk-6ZM323ED.mjs +0 -13
  176. package/dist/lib/browser/chunk-6ZM323ED.mjs.map +0 -7
  177. package/dist/lib/browser/chunk-7DV6S5XB.mjs +0 -39
  178. package/dist/lib/browser/chunk-7DV6S5XB.mjs.map +0 -7
  179. package/dist/lib/browser/chunk-QTSOWA2K.mjs +0 -41
  180. package/dist/lib/browser/chunk-QTSOWA2K.mjs.map +0 -7
  181. package/dist/lib/browser/chunk-UVGTHJUO.mjs +0 -36
  182. package/dist/lib/browser/chunk-UVGTHJUO.mjs.map +0 -7
  183. package/dist/lib/browser/index.mjs +0 -65
  184. package/dist/lib/browser/index.mjs.map +0 -7
  185. package/dist/lib/browser/meta.json +0 -1
  186. package/dist/lib/browser/react-surface-P7YJFHF3.mjs +0 -57
  187. package/dist/lib/browser/react-surface-P7YJFHF3.mjs.map +0 -7
  188. package/dist/lib/browser/settings-7A4A2H6X.mjs +0 -22
  189. package/dist/lib/browser/settings-7A4A2H6X.mjs.map +0 -7
  190. package/dist/types/src/components/CollectionPresenterContainer.d.ts +0 -7
  191. package/dist/types/src/components/CollectionPresenterContainer.d.ts.map +0 -1
  192. package/dist/types/src/components/DocumentPresenterContainer.d.ts +0 -7
  193. package/dist/types/src/components/DocumentPresenterContainer.d.ts.map +0 -1
  194. package/dist/types/src/components/Markdown/Container.d.ts +0 -8
  195. package/dist/types/src/components/Markdown/Container.d.ts.map +0 -1
  196. package/dist/types/src/components/Markdown/Container.stories.d.ts.map +0 -1
  197. package/dist/types/src/components/MarkdownSlide.d.ts +0 -7
  198. package/dist/types/src/components/MarkdownSlide.d.ts.map +0 -1
  199. package/dist/types/src/components/PresenterSettings.d.ts +0 -6
  200. package/dist/types/src/components/PresenterSettings.d.ts.map +0 -1
  201. package/dist/types/src/types.d.ts +0 -39
  202. package/dist/types/src/types.d.ts.map +0 -1
  203. package/src/components/CollectionPresenterContainer.tsx +0 -44
  204. package/src/components/DocumentPresenterContainer.tsx +0 -23
  205. package/src/components/MarkdownSlide.tsx +0 -24
  206. package/src/components/PresenterSettings.tsx +0 -30
  207. package/src/types.ts +0 -46
package/LICENSE CHANGED
@@ -1,8 +1,105 @@
1
- MIT License
2
- Copyright (c) 2022 DXOS
1
+ # Functional Source License, Version 1.1, ALv2 Future License
3
2
 
4
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
3
+ ## Abbreviation
5
4
 
6
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
5
+ FSL-1.1-Apache-2.0
7
6
 
8
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7
+ ## Notice
8
+
9
+ Copyright 2026 DXOS
10
+
11
+ ## Terms and Conditions
12
+
13
+ ### Licensor ("We")
14
+
15
+ The party offering the Software under these Terms and Conditions.
16
+
17
+ ### The Software
18
+
19
+ The "Software" is each version of the software that we make available under
20
+ these Terms and Conditions, as indicated by our inclusion of these Terms and
21
+ Conditions with the Software.
22
+
23
+ ### License Grant
24
+
25
+ Subject to your compliance with this License Grant and the Patents,
26
+ Redistribution and Trademark clauses below, we hereby grant you the right to
27
+ use, copy, modify, create derivative works, publicly perform, publicly display
28
+ and redistribute the Software for any Permitted Purpose identified below.
29
+
30
+ ### Permitted Purpose
31
+
32
+ A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
33
+ means making the Software available to others in a commercial product or
34
+ service that:
35
+
36
+ 1. substitutes for the Software;
37
+
38
+ 2. substitutes for any other product or service we offer using the Software
39
+ that exists as of the date we make the Software available; or
40
+
41
+ 3. offers the same or substantially similar functionality as the Software.
42
+
43
+ Permitted Purposes specifically include using the Software:
44
+
45
+ 1. for your internal use and access;
46
+
47
+ 2. for non-commercial education;
48
+
49
+ 3. for non-commercial research; and
50
+
51
+ 4. in connection with professional services that you provide to a licensee
52
+ using the Software in accordance with these Terms and Conditions.
53
+
54
+ ### Patents
55
+
56
+ To the extent your use for a Permitted Purpose would necessarily infringe our
57
+ patents, the license grant above includes a license under our patents. If you
58
+ make a claim against any party that the Software infringes or contributes to
59
+ the infringement of any patent, then your patent license to the Software ends
60
+ immediately.
61
+
62
+ ### Redistribution
63
+
64
+ The Terms and Conditions apply to all copies, modifications and derivatives of
65
+ the Software.
66
+
67
+ If you redistribute any copies, modifications or derivatives of the Software,
68
+ you must include a copy of or a link to these Terms and Conditions and not
69
+ remove any copyright notices provided in or with the Software.
70
+
71
+ ### Disclaimer
72
+
73
+ THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
74
+ IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
75
+ PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
76
+
77
+ IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
78
+ SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
79
+ EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
80
+
81
+ ### Trademarks
82
+
83
+ Except for displaying the License Details and identifying us as the origin of
84
+ the Software, you have no right under these Terms and Conditions to use our
85
+ trademarks, trade names, service marks or product names.
86
+
87
+ ## Grant of Future License
88
+
89
+ We hereby irrevocably grant you an additional license to use the Software under
90
+ the Apache License, Version 2.0 that is effective on the second anniversary of
91
+ the date we make the Software available. On or after that date, you may use the
92
+ Software under the Apache License, Version 2.0, in which case the following
93
+ will apply:
94
+
95
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
96
+ this file except in compliance with the License.
97
+
98
+ You may obtain a copy of the License at
99
+
100
+ http://www.apache.org/licenses/LICENSE-2.0
101
+
102
+ Unless required by applicable law or agreed to in writing, software distributed
103
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
104
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
105
+ specific language governing permissions and limitations under the License.
package/PLUGIN.mdl ADDED
@@ -0,0 +1,309 @@
1
+ ---
2
+ id: org.dxos.plugin.presenter
3
+ name: PresenterPlugin
4
+ version: 0.1.0
5
+ ---
6
+
7
+ A presentation plugin for DXOS Composer that turns existing workspace objects — markdown documents and collections — into interactive slideshows with fullscreen mode and keyboard navigation.
8
+
9
+ ## Extensions
10
+
11
+ The following extension dialects are used in this document.
12
+ Each extension is defined in the Appendix or resolved via its URI.
13
+
14
+ | Term | URI |
15
+ |-------------|--------------------------------|
16
+ | `type` | `org.dxos.mdl.type@1.0` |
17
+ | `feat` | `org.dxos.mdl.feat@1.0` |
18
+ | `test` | `org.dxos.mdl.test@1.0` |
19
+ | `component` | `org.dxos.mdl.component@1.0` |
20
+ | `op` | `org.dxos.mdl.op@1.0` |
21
+
22
+ ## Types
23
+
24
+ ```mdl
25
+ type PresentationTarget
26
+ literals: document | collection
27
+ desc: The kind of workspace object being presented.
28
+ ```
29
+
30
+ ```mdl
31
+ type SlideIndex
32
+ fields:
33
+ current: number # zero-based index of the active slide
34
+ count: number # total number of slides in the presentation
35
+ ```
36
+
37
+ ```mdl
38
+ type PresentationSettings
39
+ fields:
40
+ presentCollections?: boolean # when true, Collections may also be presented as slideshows (experimental)
41
+ ```
42
+
43
+ ## Components
44
+
45
+ ```mdl
46
+ component DocumentPresenterContainer
47
+ desc: |
48
+ Full-screen Reveal.js player for a single Markdown document.
49
+ Parses the document content into slides using horizontal/vertical `---` separators.
50
+ Renders in a Panel that fills the available viewport.
51
+ props:
52
+ document: Markdown.Document
53
+ slots:
54
+ (none)
55
+ actions:
56
+ exit() # navigates back to the originating document view
57
+ layout: |
58
+ ┌─────────────────────────────┐
59
+ │ │
60
+ │ RevealPlayer │
61
+ │ (full-screen slide canvas) │
62
+ │ │
63
+ └─────────────────────────────┘
64
+ ```
65
+
66
+ ```mdl
67
+ component CollectionPresenterArticle
68
+ desc: |
69
+ Slideshow player for a Collection.
70
+ Renders one slide per object in the collection's ordered items array.
71
+ The active slide is delegated to the AppSurface.Slide surface, so each
72
+ item's own plugin renders it (e.g. MarkdownSlide for documents).
73
+ props:
74
+ subject: Collection.Collection
75
+ role?: string
76
+ state:
77
+ slide: number # zero-based index of the current slide
78
+ running: boolean # whether keyboard navigation is active (from PresenterContext)
79
+ slots:
80
+ (none)
81
+ actions:
82
+ setSlide(index: number)
83
+ exit()
84
+ layout: |
85
+ ┌─────────────────────────────┐
86
+ │ │
87
+ │ Surface (slide N) │ ← AppSurface.Slide surface
88
+ │ │
89
+ ├────────────────┬────────────┤
90
+ │ [Pager] │ [PageNum] │
91
+ └────────────────┴────────────┘
92
+ ```
93
+
94
+ ```mdl
95
+ component MarkdownSlide
96
+ desc: |
97
+ Renders a single Markdown document as a slide panel inside a Collection presentation.
98
+ Used as the AppSurface.Slide surface implementation for Markdown.Document objects.
99
+ props:
100
+ document: Markdown.Document
101
+ layout: |
102
+ ┌─────────────────────────────┐
103
+ │ Panel │
104
+ │ └─ Slide (markdown) │
105
+ └─────────────────────────────┘
106
+ ```
107
+
108
+ ## Operations
109
+
110
+ ```mdl
111
+ op TogglePresentation
112
+ desc: |
113
+ Toggles presentation mode for a Markdown document or Collection.
114
+ Opens the presenter companion node in solo-fullscreen layout via the Deck plugin.
115
+ If the deck is not already in fullscreen, switches to solo--fullscreen before opening.
116
+ input:
117
+ object: Markdown.Document | Collection.Collection
118
+ state?: boolean # explicit on/off override; omit to toggle
119
+ output: void
120
+ effects: [layout:navigate, deck:solo-fullscreen]
121
+ requires: [DeckCapabilities.State, DeckOperation.Adjust, LayoutOperation.Open]
122
+ note: |
123
+ Resolves the presenter companion node path as `<objectPath>/presenter`.
124
+ Keyboard shortcut: Shift+Cmd+P (macOS), Shift+Alt+P (Windows/Linux).
125
+ ```
126
+
127
+ ## Features
128
+
129
+ ```mdl
130
+ feat F-1: Presentation Mode
131
+
132
+ req F-1.1: Every Markdown document in the workspace has a companion "Presenter" node in the app graph.
133
+ req F-1.2:
134
+ when: settings.presentCollections is true
135
+ then: every Collection also has a companion Presenter node
136
+ req F-1.3:
137
+ when: user activates TogglePresentation on a document or collection
138
+ then: Composer opens the presenter node in solo-fullscreen mode
139
+ req F-1.4:
140
+ when: user presses Shift+Cmd+P (macOS) or Shift+Alt+P (Windows)
141
+ then: TogglePresentation is invoked for the focused object
142
+ ```
143
+
144
+ ```mdl
145
+ feat F-2: Document Slideshow (Reveal.js)
146
+
147
+ req F-2.1:
148
+ when: DocumentPresenterContainer mounts with a Markdown.Document
149
+ then: RevealPlayer parses the document content and renders slides
150
+ req F-2.2: Horizontal slides are separated by `---`; vertical slides by `----`.
151
+ req F-2.3:
152
+ when: user presses Escape or the exit action is triggered
153
+ then: presenter navigates back to the originating document view
154
+ ```
155
+
156
+ ```mdl
157
+ feat F-3: Collection Slideshow
158
+
159
+ req F-3.1:
160
+ when: CollectionPresenterArticle mounts with a Collection
161
+ then: slide 0 is shown, corresponding to collection.objects[0]
162
+ req F-3.2:
163
+ when: user navigates to slide N via the Pager
164
+ then: the AppSurface.Slide surface renders collection.objects[N]
165
+ req F-3.3: PageNumber displays the current slide index and total count.
166
+ req F-3.4:
167
+ when: user presses Escape or the exit action is triggered
168
+ then: presenter navigates back to the collection view
169
+ ```
170
+
171
+ ```mdl
172
+ feat F-4: Plugin Settings
173
+
174
+ req F-4.1: PresenterSettings panel is registered for the plugin settings surface.
175
+ req F-4.2:
176
+ when: user enables "Present collections (experimental)"
177
+ then: settings.presentCollections is set to true and Collection nodes gain Presenter companions
178
+ ```
179
+
180
+ ## Acceptance
181
+
182
+ ```mdl
183
+ test T-1: Document presenter opens in fullscreen
184
+ given: a Markdown document exists in the workspace
185
+ when: user invokes TogglePresentation (keyboard or action menu)
186
+ then:
187
+ - Composer switches to solo-fullscreen layout
188
+ - DocumentPresenterContainer is shown with the document content
189
+ - RevealPlayer is visible with at least one slide
190
+ ```
191
+
192
+ ```mdl
193
+ test T-2: Slide navigation via Reveal.js
194
+ given: a Markdown document with three `---`-separated sections
195
+ when: DocumentPresenterContainer renders the document
196
+ then:
197
+ - three horizontal slides are produced
198
+ - arrow-key navigation advances and retreats between slides
199
+ ```
200
+
201
+ ```mdl
202
+ test T-3: Exit returns to document view
203
+ given: DocumentPresenterContainer is open in fullscreen
204
+ when: user presses Escape
205
+ then: Composer navigates back to the document article view
206
+ ```
207
+
208
+ ```mdl
209
+ test T-4: Collection slideshow renders per-item surfaces
210
+ given: a Collection with two Markdown documents and settings.presentCollections = true
211
+ when: CollectionPresenterArticle mounts
212
+ then:
213
+ - slide 0 shows MarkdownSlide for collection.objects[0]
214
+ - Pager shows count = 2
215
+ ```
216
+
217
+ ```mdl
218
+ test T-5: Collection slide advance
219
+ given: CollectionPresenterArticle at slide 0 with a three-item collection
220
+ when: user clicks the next-slide control in Pager
221
+ then:
222
+ - slide index advances to 1
223
+ - AppSurface.Slide renders collection.objects[1]
224
+ - PageNumber shows "2 / 3"
225
+ ```
226
+
227
+ ```mdl
228
+ test T-6: Collections hidden when setting disabled
229
+ given: settings.presentCollections is false (default)
230
+ when: app graph is built for a Collection node
231
+ then: no Presenter companion node is created for the collection
232
+ ```
233
+
234
+ ```mdl
235
+ test T-7: Keyboard shortcut registered
236
+ given: a Markdown document node is focused in the app graph
237
+ then:
238
+ - action with key TogglePresentation is present on the node
239
+ - keyBinding shows Shift+Cmd+P on macOS
240
+ ```
241
+
242
+ ---
243
+
244
+ ## Appendix: Extension Definitions
245
+
246
+ Extension block types used in this document are defined below using
247
+ the core `ext` primitive — the only construct the base language provides.
248
+
249
+ ```mdl
250
+ ext type
251
+ uri: org.dxos.mdl.type@1.0
252
+ desc: A named data structure with typed fields and optional literals.
253
+ fields:
254
+ desc?: Prose
255
+ fields?: FieldMap
256
+ literals?: UnionList
257
+ extends?: TypeRef[]
258
+ ```
259
+
260
+ ```mdl
261
+ ext feat
262
+ uri: org.dxos.mdl.feat@1.0
263
+ desc: A named feature grouping one or more requirements.
264
+ fields:
265
+ desc?: Prose
266
+ req: RequirementList
267
+ nesting: self
268
+ ```
269
+
270
+ ```mdl
271
+ ext test
272
+ uri: org.dxos.mdl.test@1.0
273
+ desc: An acceptance scenario expressed as given / when / then steps.
274
+ fields:
275
+ given?: Step | Step[]
276
+ when?: Step | Step[]
277
+ then: Step | Step[]
278
+ tags?: TagList
279
+ ```
280
+
281
+ ```mdl
282
+ ext component
283
+ uri: org.dxos.mdl.component@1.0
284
+ desc: A UI component with props, internal state, slots, actions, and events.
285
+ fields:
286
+ desc?: Prose
287
+ props?: FieldMap
288
+ state?: FieldMap
289
+ slots?: FieldMap
290
+ actions?: ActionMap
291
+ emits?: EventMap
292
+ layout?: CodeBlock
293
+ ```
294
+
295
+ ```mdl
296
+ ext op
297
+ uri: org.dxos.mdl.op@1.0
298
+ desc: |
299
+ A named operation with typed inputs, outputs, and declared errors.
300
+ Pure ops have no effects or requires. Effectful ops declare both.
301
+ fields:
302
+ desc?: Prose
303
+ input?: FieldMap
304
+ output?: TypeExpr
305
+ errors?: ErrorMap
306
+ effects?: EffectList
307
+ requires?: ServiceList
308
+ note?: Prose
309
+ ```
@@ -0,0 +1,46 @@
1
+ import {
2
+ useExitPresenter
3
+ } from "./chunk-V323QBC3.mjs";
4
+ import "./chunk-J5LGTIGS.mjs";
5
+
6
+ // src/containers/CollectionPresenterArticle/CollectionPresenterArticle.tsx
7
+ import React, { useContext, useState } from "react";
8
+ import { Surface } from "@dxos/app-framework/ui";
9
+ import { AppSurface } from "@dxos/app-toolkit/ui";
10
+ import { Obj } from "@dxos/echo";
11
+ import { Panel } from "@dxos/react-ui";
12
+ import { PageNumber, Pager, Layout as PresenterLayout } from "#components";
13
+ import { PresenterContext } from "#types";
14
+ var CollectionPresenterArticle = ({ role, subject: collection }) => {
15
+ const [slide, setSlide] = useState(0);
16
+ const { running } = useContext(PresenterContext);
17
+ const handleExit = useExitPresenter(collection);
18
+ return /* @__PURE__ */ React.createElement(Panel.Root, {
19
+ role,
20
+ classNames: "relative"
21
+ }, /* @__PURE__ */ React.createElement(Panel.Content, {
22
+ asChild: true
23
+ }, /* @__PURE__ */ React.createElement(PresenterLayout, {
24
+ bottomRight: /* @__PURE__ */ React.createElement(PageNumber, {
25
+ index: slide,
26
+ count: collection.objects.length
27
+ }),
28
+ bottomLeft: /* @__PURE__ */ React.createElement(Pager, {
29
+ index: slide,
30
+ count: collection.objects.length,
31
+ keys: running,
32
+ onChange: setSlide,
33
+ onExit: handleExit
34
+ })
35
+ }, /* @__PURE__ */ React.createElement(Surface.Surface, {
36
+ type: AppSurface.Slide,
37
+ data: {
38
+ subject: collection.objects[slide],
39
+ attendableId: Obj.getURI(collection)
40
+ }
41
+ }))));
42
+ };
43
+ export {
44
+ CollectionPresenterArticle as default
45
+ };
46
+ //# sourceMappingURL=CollectionPresenterArticle-DFREOQTG.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/CollectionPresenterArticle/CollectionPresenterArticle.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useContext, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type Collection, Obj } from '@dxos/echo';\nimport { Panel } from '@dxos/react-ui';\n\nimport { PageNumber, Pager, Layout as PresenterLayout } from '#components';\nimport { PresenterContext } from '#types';\n\nimport { useExitPresenter } from '../../useExitPresenter';\n\nexport type CollectionPresenterArticleProps = AppSurface.ObjectArticleProps<Collection.Collection>;\n\nexport const CollectionPresenterArticle = ({ role, subject: collection }: CollectionPresenterArticleProps) => {\n const [slide, setSlide] = useState(0);\n const { running } = useContext(PresenterContext);\n const handleExit = useExitPresenter(collection);\n\n return (\n <Panel.Root role={role} classNames='relative'>\n <Panel.Content asChild>\n <PresenterLayout\n bottomRight={<PageNumber index={slide} count={collection.objects.length} />}\n bottomLeft={\n <Pager\n index={slide}\n count={collection.objects.length}\n keys={running}\n onChange={setSlide}\n onExit={handleExit}\n />\n }\n >\n <Surface.Surface\n type={AppSurface.Slide}\n data={{\n subject: collection.objects[slide],\n attendableId: Obj.getURI(collection),\n }}\n />\n </PresenterLayout>\n </Panel.Content>\n </Panel.Root>\n );\n};\n"],
5
+ "mappings": ";;;;;;AAIA,OAAOA,SAASC,YAAYC,gBAAgB;AAE5C,SAASC,eAAe;AACxB,SAASC,kBAAkB;AAC3B,SAA0BC,WAAW;AACrC,SAASC,aAAa;AAEtB,SAASC,YAAYC,OAAOC,UAAUC,uBAAuB;AAC7D,SAASC,wBAAwB;AAM1B,IAAMC,6BAA6B,CAAC,EAAEC,MAAMC,SAASC,WAAU,MAAmC;AACvG,QAAM,CAACC,OAAOC,QAAAA,IAAYC,SAAS,CAAA;AACnC,QAAM,EAAEC,QAAO,IAAKC,WAAWC,gBAAAA;AAC/B,QAAMC,aAAaC,iBAAiBR,UAAAA;AAEpC,SACE,sBAAA,cAACS,MAAMC,MAAI;IAACZ;IAAYa,YAAW;KACjC,sBAAA,cAACF,MAAMG,SAAO;IAACC,SAAAA;KACb,sBAAA,cAACC,iBAAAA;IACCC,aAAa,sBAAA,cAACC,YAAAA;MAAWC,OAAOhB;MAAOiB,OAAOlB,WAAWmB,QAAQC;;IACjEC,YACE,sBAAA,cAACC,OAAAA;MACCL,OAAOhB;MACPiB,OAAOlB,WAAWmB,QAAQC;MAC1BG,MAAMnB;MACNoB,UAAUtB;MACVuB,QAAQlB;;KAIZ,sBAAA,cAACmB,QAAQA,SAAO;IACdC,MAAMC,WAAWC;IACjBC,MAAM;MACJ/B,SAASC,WAAWmB,QAAQlB,KAAAA;MAC5B8B,cAAcC,IAAIC,OAAOjC,UAAAA;IAC3B;;AAMZ;",
6
+ "names": ["React", "useContext", "useState", "Surface", "AppSurface", "Obj", "Panel", "PageNumber", "Pager", "Layout", "PresenterLayout", "PresenterContext", "CollectionPresenterArticle", "role", "subject", "collection", "slide", "setSlide", "useState", "running", "useContext", "PresenterContext", "handleExit", "useExitPresenter", "Panel", "Root", "classNames", "Content", "asChild", "PresenterLayout", "bottomRight", "PageNumber", "index", "count", "objects", "length", "bottomLeft", "Pager", "keys", "onChange", "onExit", "Surface", "type", "AppSurface", "Slide", "data", "attendableId", "Obj", "getURI"]
7
+ }
@@ -0,0 +1,24 @@
1
+ import {
2
+ useExitPresenter
3
+ } from "./chunk-V323QBC3.mjs";
4
+ import "./chunk-J5LGTIGS.mjs";
5
+
6
+ // src/containers/DocumentPresenterContainer/DocumentPresenterContainer.tsx
7
+ import React from "react";
8
+ import { Panel } from "@dxos/react-ui";
9
+ import { RevealPlayer } from "#components";
10
+ var DocumentPresenterContainer = ({ document }) => {
11
+ const handleExit = useExitPresenter(document);
12
+ return /* @__PURE__ */ React.createElement(Panel.Root, {
13
+ classNames: "relative"
14
+ }, /* @__PURE__ */ React.createElement(Panel.Content, {
15
+ asChild: true
16
+ }, /* @__PURE__ */ React.createElement(RevealPlayer, {
17
+ content: document.content.target?.content ?? "",
18
+ onExit: handleExit
19
+ })));
20
+ };
21
+ export {
22
+ DocumentPresenterContainer as default
23
+ };
24
+ //# sourceMappingURL=DocumentPresenterContainer-KCDZ2O2C.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/DocumentPresenterContainer/DocumentPresenterContainer.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type FC } from 'react';\n\nimport { type Markdown } from '@dxos/plugin-markdown';\nimport { Panel } from '@dxos/react-ui';\n\nimport { RevealPlayer } from '#components';\n\nimport { useExitPresenter } from '../../useExitPresenter';\n\nexport const DocumentPresenterContainer: FC<{ document: Markdown.Document }> = ({ document }) => {\n const handleExit = useExitPresenter(document);\n\n return (\n <Panel.Root classNames='relative'>\n <Panel.Content asChild>\n <RevealPlayer content={document.content.target?.content ?? ''} onExit={handleExit} />\n </Panel.Content>\n </Panel.Root>\n );\n};\n"],
5
+ "mappings": ";;;;;;AAIA,OAAOA,WAAwB;AAG/B,SAASC,aAAa;AAEtB,SAASC,oBAAoB;AAItB,IAAMC,6BAAkE,CAAC,EAAEC,SAAQ,MAAE;AAC1F,QAAMC,aAAaC,iBAAiBF,QAAAA;AAEpC,SACE,sBAAA,cAACG,MAAMC,MAAI;IAACC,YAAW;KACrB,sBAAA,cAACF,MAAMG,SAAO;IAACC,SAAAA;KACb,sBAAA,cAACC,cAAAA;IAAaC,SAAST,SAASS,QAAQC,QAAQD,WAAW;IAAIE,QAAQV;;AAI/E;",
6
+ "names": ["React", "Panel", "RevealPlayer", "DocumentPresenterContainer", "document", "handleExit", "useExitPresenter", "Panel", "Root", "classNames", "Content", "asChild", "RevealPlayer", "content", "target", "onExit"]
7
+ }
@@ -0,0 +1,18 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/containers/MarkdownSlide/MarkdownSlide.tsx
4
+ import React from "react";
5
+ import { Panel, Slide } from "#components";
6
+ var MarkdownSlide = ({ document }) => {
7
+ const content = document.content.target?.content;
8
+ if (!content) {
9
+ return null;
10
+ }
11
+ return /* @__PURE__ */ React.createElement(Panel, null, /* @__PURE__ */ React.createElement(Slide, {
12
+ content
13
+ }));
14
+ };
15
+ export {
16
+ MarkdownSlide as default
17
+ };
18
+ //# sourceMappingURL=MarkdownSlide-WXILOIBE.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/MarkdownSlide/MarkdownSlide.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Markdown } from '@dxos/plugin-markdown';\n\nimport { Panel, Slide } from '#components';\n\ntype MarkdownSlideProps = {\n document: Markdown.Document;\n};\n\nexport const MarkdownSlide = ({ document }: MarkdownSlideProps) => {\n const content = document.content.target?.content;\n if (!content) {\n return null;\n }\n\n return (\n <Panel>\n <Slide content={content} />\n </Panel>\n );\n};\n"],
5
+ "mappings": ";;;AAIA,OAAOA,WAAW;AAIlB,SAASC,OAAOC,aAAa;AAMtB,IAAMC,gBAAgB,CAAC,EAAEC,SAAQ,MAAsB;AAC5D,QAAMC,UAAUD,SAASC,QAAQC,QAAQD;AACzC,MAAI,CAACA,SAAS;AACZ,WAAO;EACT;AAEA,SACE,sBAAA,cAACJ,OAAAA,MACC,sBAAA,cAACC,OAAAA;IAAMG;;AAGb;",
6
+ "names": ["React", "Panel", "Slide", "MarkdownSlide", "document", "content", "target"]
7
+ }
@@ -0,0 +1,35 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/PresenterPlugin.tsx
4
+ import { Plugin } from "@dxos/app-framework";
5
+ import { AppPlugin } from "@dxos/app-toolkit";
6
+ import { AppGraphBuilder, PresenterSettings, ReactSurface } from "#capabilities";
7
+ import { meta } from "#meta";
8
+ import { translations } from "#translations";
9
+
10
+ // raw-loader:/__w/dxos/dxos/packages/plugins/plugin-presenter/PLUGIN.mdl?raw
11
+ var PLUGIN_default = '---\nid: org.dxos.plugin.presenter\nname: PresenterPlugin\nversion: 0.1.0\n---\n\nA presentation plugin for DXOS Composer that turns existing workspace objects \u2014 markdown documents and collections \u2014 into interactive slideshows with fullscreen mode and keyboard navigation.\n\n## Extensions\n\nThe following extension dialects are used in this document.\nEach extension is defined in the Appendix or resolved via its URI.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n\n## Types\n\n```mdl\ntype PresentationTarget\n literals: document | collection\n desc: The kind of workspace object being presented.\n```\n\n```mdl\ntype SlideIndex\n fields:\n current: number # zero-based index of the active slide\n count: number # total number of slides in the presentation\n```\n\n```mdl\ntype PresentationSettings\n fields:\n presentCollections?: boolean # when true, Collections may also be presented as slideshows (experimental)\n```\n\n## Components\n\n```mdl\ncomponent DocumentPresenterContainer\n desc: |\n Full-screen Reveal.js player for a single Markdown document.\n Parses the document content into slides using horizontal/vertical `---` separators.\n Renders in a Panel that fills the available viewport.\n props:\n document: Markdown.Document\n slots:\n (none)\n actions:\n exit() # navigates back to the originating document view\n layout: |\n \u250C\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\u2510\n \u2502 \u2502\n \u2502 RevealPlayer \u2502\n \u2502 (full-screen slide canvas) \u2502\n \u2502 \u2502\n \u2514\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\u2518\n```\n\n```mdl\ncomponent CollectionPresenterArticle\n desc: |\n Slideshow player for a Collection.\n Renders one slide per object in the collection\'s ordered items array.\n The active slide is delegated to the AppSurface.Slide surface, so each\n item\'s own plugin renders it (e.g. MarkdownSlide for documents).\n props:\n subject: Collection.Collection\n role?: string\n state:\n slide: number # zero-based index of the current slide\n running: boolean # whether keyboard navigation is active (from PresenterContext)\n slots:\n (none)\n actions:\n setSlide(index: number)\n exit()\n layout: |\n \u250C\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\u2510\n \u2502 \u2502\n \u2502 Surface (slide N) \u2502 \u2190 AppSurface.Slide surface\n \u2502 \u2502\n \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 [Pager] \u2502 [PageNum] \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n```mdl\ncomponent MarkdownSlide\n desc: |\n Renders a single Markdown document as a slide panel inside a Collection presentation.\n Used as the AppSurface.Slide surface implementation for Markdown.Document objects.\n props:\n document: Markdown.Document\n layout: |\n \u250C\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\u2510\n \u2502 Panel \u2502\n \u2502 \u2514\u2500 Slide (markdown) \u2502\n \u2514\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\u2518\n```\n\n## Operations\n\n```mdl\nop TogglePresentation\n desc: |\n Toggles presentation mode for a Markdown document or Collection.\n Opens the presenter companion node in solo-fullscreen layout via the Deck plugin.\n If the deck is not already in fullscreen, switches to solo--fullscreen before opening.\n input:\n object: Markdown.Document | Collection.Collection\n state?: boolean # explicit on/off override; omit to toggle\n output: void\n effects: [layout:navigate, deck:solo-fullscreen]\n requires: [DeckCapabilities.State, DeckOperation.Adjust, LayoutOperation.Open]\n note: |\n Resolves the presenter companion node path as `<objectPath>/presenter`.\n Keyboard shortcut: Shift+Cmd+P (macOS), Shift+Alt+P (Windows/Linux).\n```\n\n## Features\n\n```mdl\nfeat F-1: Presentation Mode\n\n req F-1.1: Every Markdown document in the workspace has a companion "Presenter" node in the app graph.\n req F-1.2:\n when: settings.presentCollections is true\n then: every Collection also has a companion Presenter node\n req F-1.3:\n when: user activates TogglePresentation on a document or collection\n then: Composer opens the presenter node in solo-fullscreen mode\n req F-1.4:\n when: user presses Shift+Cmd+P (macOS) or Shift+Alt+P (Windows)\n then: TogglePresentation is invoked for the focused object\n```\n\n```mdl\nfeat F-2: Document Slideshow (Reveal.js)\n\n req F-2.1:\n when: DocumentPresenterContainer mounts with a Markdown.Document\n then: RevealPlayer parses the document content and renders slides\n req F-2.2: Horizontal slides are separated by `---`; vertical slides by `----`.\n req F-2.3:\n when: user presses Escape or the exit action is triggered\n then: presenter navigates back to the originating document view\n```\n\n```mdl\nfeat F-3: Collection Slideshow\n\n req F-3.1:\n when: CollectionPresenterArticle mounts with a Collection\n then: slide 0 is shown, corresponding to collection.objects[0]\n req F-3.2:\n when: user navigates to slide N via the Pager\n then: the AppSurface.Slide surface renders collection.objects[N]\n req F-3.3: PageNumber displays the current slide index and total count.\n req F-3.4:\n when: user presses Escape or the exit action is triggered\n then: presenter navigates back to the collection view\n```\n\n```mdl\nfeat F-4: Plugin Settings\n\n req F-4.1: PresenterSettings panel is registered for the plugin settings surface.\n req F-4.2:\n when: user enables "Present collections (experimental)"\n then: settings.presentCollections is set to true and Collection nodes gain Presenter companions\n```\n\n## Acceptance\n\n```mdl\ntest T-1: Document presenter opens in fullscreen\n given: a Markdown document exists in the workspace\n when: user invokes TogglePresentation (keyboard or action menu)\n then:\n - Composer switches to solo-fullscreen layout\n - DocumentPresenterContainer is shown with the document content\n - RevealPlayer is visible with at least one slide\n```\n\n```mdl\ntest T-2: Slide navigation via Reveal.js\n given: a Markdown document with three `---`-separated sections\n when: DocumentPresenterContainer renders the document\n then:\n - three horizontal slides are produced\n - arrow-key navigation advances and retreats between slides\n```\n\n```mdl\ntest T-3: Exit returns to document view\n given: DocumentPresenterContainer is open in fullscreen\n when: user presses Escape\n then: Composer navigates back to the document article view\n```\n\n```mdl\ntest T-4: Collection slideshow renders per-item surfaces\n given: a Collection with two Markdown documents and settings.presentCollections = true\n when: CollectionPresenterArticle mounts\n then:\n - slide 0 shows MarkdownSlide for collection.objects[0]\n - Pager shows count = 2\n```\n\n```mdl\ntest T-5: Collection slide advance\n given: CollectionPresenterArticle at slide 0 with a three-item collection\n when: user clicks the next-slide control in Pager\n then:\n - slide index advances to 1\n - AppSurface.Slide renders collection.objects[1]\n - PageNumber shows "2 / 3"\n```\n\n```mdl\ntest T-6: Collections hidden when setting disabled\n given: settings.presentCollections is false (default)\n when: app graph is built for a Collection node\n then: no Presenter companion node is created for the collection\n```\n\n```mdl\ntest T-7: Keyboard shortcut registered\n given: a Markdown document node is focused in the app graph\n then:\n - action with key TogglePresentation is present on the node\n - keyBinding shows Shift+Cmd+P on macOS\n```\n\n---\n\n## Appendix: Extension Definitions\n\nExtension block types used in this document are defined below using\nthe core `ext` primitive \u2014 the only construct the base language provides.\n\n```mdl\next type\n uri: org.dxos.mdl.type@1.0\n desc: A named data structure with typed fields and optional literals.\n fields:\n desc?: Prose\n fields?: FieldMap\n literals?: UnionList\n extends?: TypeRef[]\n```\n\n```mdl\next feat\n uri: org.dxos.mdl.feat@1.0\n desc: A named feature grouping one or more requirements.\n fields:\n desc?: Prose\n req: RequirementList\n nesting: self\n```\n\n```mdl\next test\n uri: org.dxos.mdl.test@1.0\n desc: An acceptance scenario expressed as given / when / then steps.\n fields:\n given?: Step | Step[]\n when?: Step | Step[]\n then: Step | Step[]\n tags?: TagList\n```\n\n```mdl\next component\n uri: org.dxos.mdl.component@1.0\n desc: A UI component with props, internal state, slots, actions, and events.\n fields:\n desc?: Prose\n props?: FieldMap\n state?: FieldMap\n slots?: FieldMap\n actions?: ActionMap\n emits?: EventMap\n layout?: CodeBlock\n```\n\n```mdl\next op\n uri: org.dxos.mdl.op@1.0\n desc: |\n A named operation with typed inputs, outputs, and declared errors.\n Pure ops have no effects or requires. Effectful ops declare both.\n fields:\n desc?: Prose\n input?: FieldMap\n output?: TypeExpr\n errors?: ErrorMap\n effects?: EffectList\n requires?: ServiceList\n note?: Prose\n```\n';
12
+
13
+ // src/PresenterPlugin.tsx
14
+ var PresenterPlugin = Plugin.define(meta).pipe(AppPlugin.addAppGraphModule({
15
+ activate: AppGraphBuilder
16
+ }), AppPlugin.addSettingsModule({
17
+ activate: PresenterSettings
18
+ }), AppPlugin.addSurfaceModule({
19
+ activate: ReactSurface
20
+ }), AppPlugin.addTranslationsModule({
21
+ translations
22
+ }), AppPlugin.addPluginAssetModule({
23
+ asset: {
24
+ pluginId: meta.id,
25
+ path: "PLUGIN.mdl",
26
+ content: PLUGIN_default,
27
+ mimeType: "application/x-mdl"
28
+ }
29
+ }), Plugin.make);
30
+ var PresenterPlugin_default = PresenterPlugin;
31
+ export {
32
+ PresenterPlugin,
33
+ PresenterPlugin_default as default
34
+ };
35
+ //# sourceMappingURL=PresenterPlugin.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/PresenterPlugin.tsx", "raw-loader:/__w/dxos/dxos/packages/plugins/plugin-presenter/PLUGIN.mdl?raw"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\n\nimport { AppGraphBuilder, PresenterSettings, ReactSurface } from '#capabilities';\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\n// eslint-disable-next-line import/no-relative-packages\nimport pluginSpec from '../PLUGIN.mdl?raw';\n\n// TODO(burdon): Only scale markdown content.\n// TODO(burdon): Map stack content; Slide content type (e.g., markdown, sketch, IPFS image, table, etc.)\n\nexport const PresenterPlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),\n AppPlugin.addSettingsModule({ activate: PresenterSettings }),\n AppPlugin.addSurfaceModule({ activate: ReactSurface }),\n AppPlugin.addTranslationsModule({ translations }),\n AppPlugin.addPluginAssetModule({\n asset: { pluginId: meta.id, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },\n }),\n Plugin.make,\n);\n\nexport default PresenterPlugin;\n", "---\nid: org.dxos.plugin.presenter\nname: PresenterPlugin\nversion: 0.1.0\n---\n\nA presentation plugin for DXOS Composer that turns existing workspace objects \u2014 markdown documents and collections \u2014 into interactive slideshows with fullscreen mode and keyboard navigation.\n\n## Extensions\n\nThe following extension dialects are used in this document.\nEach extension is defined in the Appendix or resolved via its URI.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n\n## Types\n\n```mdl\ntype PresentationTarget\n literals: document | collection\n desc: The kind of workspace object being presented.\n```\n\n```mdl\ntype SlideIndex\n fields:\n current: number # zero-based index of the active slide\n count: number # total number of slides in the presentation\n```\n\n```mdl\ntype PresentationSettings\n fields:\n presentCollections?: boolean # when true, Collections may also be presented as slideshows (experimental)\n```\n\n## Components\n\n```mdl\ncomponent DocumentPresenterContainer\n desc: |\n Full-screen Reveal.js player for a single Markdown document.\n Parses the document content into slides using horizontal/vertical `---` separators.\n Renders in a Panel that fills the available viewport.\n props:\n document: Markdown.Document\n slots:\n (none)\n actions:\n exit() # navigates back to the originating document view\n layout: |\n \u250C\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\u2510\n \u2502 \u2502\n \u2502 RevealPlayer \u2502\n \u2502 (full-screen slide canvas) \u2502\n \u2502 \u2502\n \u2514\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\u2518\n```\n\n```mdl\ncomponent CollectionPresenterArticle\n desc: |\n Slideshow player for a Collection.\n Renders one slide per object in the collection's ordered items array.\n The active slide is delegated to the AppSurface.Slide surface, so each\n item's own plugin renders it (e.g. MarkdownSlide for documents).\n props:\n subject: Collection.Collection\n role?: string\n state:\n slide: number # zero-based index of the current slide\n running: boolean # whether keyboard navigation is active (from PresenterContext)\n slots:\n (none)\n actions:\n setSlide(index: number)\n exit()\n layout: |\n \u250C\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\u2510\n \u2502 \u2502\n \u2502 Surface (slide N) \u2502 \u2190 AppSurface.Slide surface\n \u2502 \u2502\n \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 [Pager] \u2502 [PageNum] \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n```mdl\ncomponent MarkdownSlide\n desc: |\n Renders a single Markdown document as a slide panel inside a Collection presentation.\n Used as the AppSurface.Slide surface implementation for Markdown.Document objects.\n props:\n document: Markdown.Document\n layout: |\n \u250C\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\u2510\n \u2502 Panel \u2502\n \u2502 \u2514\u2500 Slide (markdown) \u2502\n \u2514\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\u2518\n```\n\n## Operations\n\n```mdl\nop TogglePresentation\n desc: |\n Toggles presentation mode for a Markdown document or Collection.\n Opens the presenter companion node in solo-fullscreen layout via the Deck plugin.\n If the deck is not already in fullscreen, switches to solo--fullscreen before opening.\n input:\n object: Markdown.Document | Collection.Collection\n state?: boolean # explicit on/off override; omit to toggle\n output: void\n effects: [layout:navigate, deck:solo-fullscreen]\n requires: [DeckCapabilities.State, DeckOperation.Adjust, LayoutOperation.Open]\n note: |\n Resolves the presenter companion node path as `<objectPath>/presenter`.\n Keyboard shortcut: Shift+Cmd+P (macOS), Shift+Alt+P (Windows/Linux).\n```\n\n## Features\n\n```mdl\nfeat F-1: Presentation Mode\n\n req F-1.1: Every Markdown document in the workspace has a companion \"Presenter\" node in the app graph.\n req F-1.2:\n when: settings.presentCollections is true\n then: every Collection also has a companion Presenter node\n req F-1.3:\n when: user activates TogglePresentation on a document or collection\n then: Composer opens the presenter node in solo-fullscreen mode\n req F-1.4:\n when: user presses Shift+Cmd+P (macOS) or Shift+Alt+P (Windows)\n then: TogglePresentation is invoked for the focused object\n```\n\n```mdl\nfeat F-2: Document Slideshow (Reveal.js)\n\n req F-2.1:\n when: DocumentPresenterContainer mounts with a Markdown.Document\n then: RevealPlayer parses the document content and renders slides\n req F-2.2: Horizontal slides are separated by `---`; vertical slides by `----`.\n req F-2.3:\n when: user presses Escape or the exit action is triggered\n then: presenter navigates back to the originating document view\n```\n\n```mdl\nfeat F-3: Collection Slideshow\n\n req F-3.1:\n when: CollectionPresenterArticle mounts with a Collection\n then: slide 0 is shown, corresponding to collection.objects[0]\n req F-3.2:\n when: user navigates to slide N via the Pager\n then: the AppSurface.Slide surface renders collection.objects[N]\n req F-3.3: PageNumber displays the current slide index and total count.\n req F-3.4:\n when: user presses Escape or the exit action is triggered\n then: presenter navigates back to the collection view\n```\n\n```mdl\nfeat F-4: Plugin Settings\n\n req F-4.1: PresenterSettings panel is registered for the plugin settings surface.\n req F-4.2:\n when: user enables \"Present collections (experimental)\"\n then: settings.presentCollections is set to true and Collection nodes gain Presenter companions\n```\n\n## Acceptance\n\n```mdl\ntest T-1: Document presenter opens in fullscreen\n given: a Markdown document exists in the workspace\n when: user invokes TogglePresentation (keyboard or action menu)\n then:\n - Composer switches to solo-fullscreen layout\n - DocumentPresenterContainer is shown with the document content\n - RevealPlayer is visible with at least one slide\n```\n\n```mdl\ntest T-2: Slide navigation via Reveal.js\n given: a Markdown document with three `---`-separated sections\n when: DocumentPresenterContainer renders the document\n then:\n - three horizontal slides are produced\n - arrow-key navigation advances and retreats between slides\n```\n\n```mdl\ntest T-3: Exit returns to document view\n given: DocumentPresenterContainer is open in fullscreen\n when: user presses Escape\n then: Composer navigates back to the document article view\n```\n\n```mdl\ntest T-4: Collection slideshow renders per-item surfaces\n given: a Collection with two Markdown documents and settings.presentCollections = true\n when: CollectionPresenterArticle mounts\n then:\n - slide 0 shows MarkdownSlide for collection.objects[0]\n - Pager shows count = 2\n```\n\n```mdl\ntest T-5: Collection slide advance\n given: CollectionPresenterArticle at slide 0 with a three-item collection\n when: user clicks the next-slide control in Pager\n then:\n - slide index advances to 1\n - AppSurface.Slide renders collection.objects[1]\n - PageNumber shows \"2 / 3\"\n```\n\n```mdl\ntest T-6: Collections hidden when setting disabled\n given: settings.presentCollections is false (default)\n when: app graph is built for a Collection node\n then: no Presenter companion node is created for the collection\n```\n\n```mdl\ntest T-7: Keyboard shortcut registered\n given: a Markdown document node is focused in the app graph\n then:\n - action with key TogglePresentation is present on the node\n - keyBinding shows Shift+Cmd+P on macOS\n```\n\n---\n\n## Appendix: Extension Definitions\n\nExtension block types used in this document are defined below using\nthe core `ext` primitive \u2014 the only construct the base language provides.\n\n```mdl\next type\n uri: org.dxos.mdl.type@1.0\n desc: A named data structure with typed fields and optional literals.\n fields:\n desc?: Prose\n fields?: FieldMap\n literals?: UnionList\n extends?: TypeRef[]\n```\n\n```mdl\next feat\n uri: org.dxos.mdl.feat@1.0\n desc: A named feature grouping one or more requirements.\n fields:\n desc?: Prose\n req: RequirementList\n nesting: self\n```\n\n```mdl\next test\n uri: org.dxos.mdl.test@1.0\n desc: An acceptance scenario expressed as given / when / then steps.\n fields:\n given?: Step | Step[]\n when?: Step | Step[]\n then: Step | Step[]\n tags?: TagList\n```\n\n```mdl\next component\n uri: org.dxos.mdl.component@1.0\n desc: A UI component with props, internal state, slots, actions, and events.\n fields:\n desc?: Prose\n props?: FieldMap\n state?: FieldMap\n slots?: FieldMap\n actions?: ActionMap\n emits?: EventMap\n layout?: CodeBlock\n```\n\n```mdl\next op\n uri: org.dxos.mdl.op@1.0\n desc: |\n A named operation with typed inputs, outputs, and declared errors.\n Pure ops have no effects or requires. Effectful ops declare both.\n fields:\n desc?: Prose\n input?: FieldMap\n output?: TypeExpr\n errors?: ErrorMap\n effects?: EffectList\n requires?: ServiceList\n note?: Prose\n```\n"],
5
+ "mappings": ";;;AAIA,SAASA,cAAc;AACvB,SAASC,iBAAiB;AAE1B,SAASC,iBAAiBC,mBAAmBC,oBAAoB;AACjE,SAASC,YAAY;AACrB,SAASC,oBAAoB;;;ACT7B;;;ADiBO,IAAMC,kBAAkBC,OAAOC,OAAOC,IAAAA,EAAMC,KACjDC,UAAUC,kBAAkB;EAAEC,UAAUC;AAAgB,CAAA,GACxDH,UAAUI,kBAAkB;EAAEF,UAAUG;AAAkB,CAAA,GAC1DL,UAAUM,iBAAiB;EAAEJ,UAAUK;AAAa,CAAA,GACpDP,UAAUQ,sBAAsB;EAAEC;AAAa,CAAA,GAC/CT,UAAUU,qBAAqB;EAC7BC,OAAO;IAAEC,UAAUd,KAAKe;IAAIC,MAAM;IAAcC,SAASC;IAAYC,UAAU;EAAoB;AACrG,CAAA,GACArB,OAAOsB,IAAI;AAGb,IAAA,0BAAevB;",
6
+ "names": ["Plugin", "AppPlugin", "AppGraphBuilder", "PresenterSettings", "ReactSurface", "meta", "translations", "PresenterPlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addAppGraphModule", "activate", "AppGraphBuilder", "addSettingsModule", "PresenterSettings", "addSurfaceModule", "ReactSurface", "addTranslationsModule", "translations", "addPluginAssetModule", "asset", "pluginId", "id", "path", "content", "pluginSpec", "mimeType", "make"]
7
+ }
@@ -0,0 +1,16 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/PresenterPlugin.node.ts
4
+ import { Plugin } from "@dxos/app-framework";
5
+ import { AppPlugin } from "@dxos/app-toolkit";
6
+ import { AppGraphBuilder } from "#capabilities";
7
+ import { meta } from "#meta";
8
+ var PresenterPlugin = Plugin.define(meta).pipe(AppPlugin.addAppGraphModule({
9
+ activate: AppGraphBuilder
10
+ }), Plugin.make);
11
+ var PresenterPlugin_node_default = PresenterPlugin;
12
+ export {
13
+ PresenterPlugin,
14
+ PresenterPlugin_node_default as default
15
+ };
16
+ //# sourceMappingURL=PresenterPlugin.node.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/PresenterPlugin.node.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\n\nimport { AppGraphBuilder } from '#capabilities';\nimport { meta } from '#meta';\n\nexport const PresenterPlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),\n Plugin.make,\n);\n\nexport default PresenterPlugin;\n"],
5
+ "mappings": ";;;AAIA,SAASA,cAAc;AACvB,SAASC,iBAAiB;AAE1B,SAASC,uBAAuB;AAChC,SAASC,YAAY;AAEd,IAAMC,kBAAkBJ,OAAOK,OAAOF,IAAAA,EAAMG,KACjDL,UAAUM,kBAAkB;EAAEC,UAAUN;AAAgB,CAAA,GACxDF,OAAOS,IAAI;AAGb,IAAA,+BAAeL;",
6
+ "names": ["Plugin", "AppPlugin", "AppGraphBuilder", "meta", "PresenterPlugin", "define", "pipe", "addAppGraphModule", "activate", "make"]
7
+ }