@dxos/plugin-magazine 0.9.1-staging.ee54ba693a → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/dist/lib/MagazinePlugin.mjs +36 -0
  2. package/dist/lib/MagazinePlugin.mjs.map +1 -0
  3. package/dist/lib/MagazinePlugin.workerd.mjs +26 -0
  4. package/dist/lib/MagazinePlugin.workerd.mjs.map +1 -0
  5. package/dist/lib/atoms.mjs +175 -0
  6. package/dist/lib/atoms.mjs.map +1 -0
  7. package/dist/lib/capabilities.mjs +12 -0
  8. package/dist/lib/capabilities.mjs.map +1 -0
  9. package/dist/lib/chunk-FeedArticle.mjs +70 -0
  10. package/dist/lib/chunk-FeedArticle.mjs.map +1 -0
  11. package/dist/lib/chunk-FeedProperties.mjs +78 -0
  12. package/dist/lib/chunk-FeedProperties.mjs.map +1 -0
  13. package/dist/lib/chunk-MagazineArticle.mjs +267 -0
  14. package/dist/lib/chunk-MagazineArticle.mjs.map +1 -0
  15. package/dist/lib/chunk-PostArticle.mjs +174 -0
  16. package/dist/lib/chunk-PostArticle.mjs.map +1 -0
  17. package/dist/lib/chunk-PostCard.mjs +62 -0
  18. package/dist/lib/chunk-PostCard.mjs.map +1 -0
  19. package/dist/lib/chunk-app-graph-builder.mjs +91 -0
  20. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  21. package/dist/lib/chunk-clear-magazine.mjs +37 -0
  22. package/dist/lib/chunk-clear-magazine.mjs.map +1 -0
  23. package/dist/lib/chunk-create-object.mjs +59 -0
  24. package/dist/lib/chunk-create-object.mjs.map +1 -0
  25. package/dist/lib/chunk-curate-magazine.mjs +164 -0
  26. package/dist/lib/chunk-curate-magazine.mjs.map +1 -0
  27. package/dist/lib/chunk-date.mjs +25 -0
  28. package/dist/lib/chunk-date.mjs.map +1 -0
  29. package/dist/lib/chunk-fetch-article-content.mjs +26 -0
  30. package/dist/lib/chunk-fetch-article-content.mjs.map +1 -0
  31. package/dist/lib/chunk-load-post-content.mjs +57 -0
  32. package/dist/lib/chunk-load-post-content.mjs.map +1 -0
  33. package/dist/lib/{neutral/chunk-JFPR6OV4.mjs → chunk-meta.mjs} +19 -26
  34. package/dist/lib/chunk-meta.mjs.map +1 -0
  35. package/dist/lib/chunk-operation-handler.mjs +13 -0
  36. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  37. package/dist/lib/chunk-paths.mjs +8 -0
  38. package/dist/lib/chunk-paths.mjs.map +1 -0
  39. package/dist/lib/chunk-post-content.mjs +14 -0
  40. package/dist/lib/chunk-post-content.mjs.map +1 -0
  41. package/dist/lib/chunk-react-surface.mjs +60 -0
  42. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  43. package/dist/lib/chunk-routine-templates.mjs +52 -0
  44. package/dist/lib/chunk-routine-templates.mjs.map +1 -0
  45. package/dist/lib/chunk-skill-definition.mjs +12 -0
  46. package/dist/lib/chunk-skill-definition.mjs.map +1 -0
  47. package/dist/lib/chunk-sources.mjs +576 -0
  48. package/dist/lib/chunk-sources.mjs.map +1 -0
  49. package/dist/lib/chunk-sync-feed.mjs +86 -0
  50. package/dist/lib/chunk-sync-feed.mjs.map +1 -0
  51. package/dist/lib/chunk-text.mjs +52 -0
  52. package/dist/lib/chunk-text.mjs.map +1 -0
  53. package/dist/lib/chunk-types.mjs +607 -0
  54. package/dist/lib/chunk-types.mjs.map +1 -0
  55. package/dist/lib/components.mjs +323 -0
  56. package/dist/lib/components.mjs.map +1 -0
  57. package/dist/lib/containers.mjs +11 -0
  58. package/dist/lib/containers.mjs.map +1 -0
  59. package/dist/lib/index.mjs +3 -0
  60. package/dist/lib/meta.mjs +2 -0
  61. package/dist/lib/operations.mjs +7 -0
  62. package/dist/lib/operations.mjs.map +1 -0
  63. package/dist/lib/plugin.mjs +9 -0
  64. package/dist/lib/plugin.mjs.map +1 -0
  65. package/dist/lib/plugin.workerd.mjs +3 -0
  66. package/dist/lib/{neutral/skills/index.mjs → skills.mjs} +15 -28
  67. package/dist/lib/skills.mjs.map +1 -0
  68. package/dist/lib/testing.mjs +71 -0
  69. package/dist/lib/testing.mjs.map +1 -0
  70. package/dist/lib/translations.mjs +74 -0
  71. package/dist/lib/translations.mjs.map +1 -0
  72. package/dist/lib/types.mjs +2 -0
  73. package/dist/types/src/MagazinePlugin.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  75. package/dist/types/src/capabilities/create-object.d.ts +1 -1
  76. package/dist/types/src/capabilities/index.d.ts +0 -1
  77. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  79. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  80. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/routine-templates.d.ts +1 -1
  82. package/dist/types/src/components/PostContent/PostContent.d.ts +1 -13
  83. package/dist/types/src/components/PostContent/PostContent.d.ts.map +1 -1
  84. package/dist/types/src/components/PostContent/dedupe-images.d.ts +13 -0
  85. package/dist/types/src/components/PostContent/dedupe-images.d.ts.map +1 -0
  86. package/dist/types/src/components/PostContent/index.d.ts +1 -0
  87. package/dist/types/src/components/PostContent/index.d.ts.map +1 -1
  88. package/dist/types/src/components/PostStack/PostStack.d.ts +1 -1
  89. package/dist/types/src/components/PostStack/PostStack.d.ts.map +1 -1
  90. package/dist/types/src/components/SubscriptionStack/SubscriptionStack.d.ts +1 -1
  91. package/dist/types/src/components/SubscriptionStack/SubscriptionStack.d.ts.map +1 -1
  92. package/dist/types/src/containers/FeedArticle/FeedArticle.d.ts +4 -1
  93. package/dist/types/src/containers/FeedArticle/FeedArticle.d.ts.map +1 -1
  94. package/dist/types/src/containers/FeedProperties/FeedProperties.d.ts +4 -1
  95. package/dist/types/src/containers/FeedProperties/FeedProperties.d.ts.map +1 -1
  96. package/dist/types/src/containers/MagazineArticle/MagazineArticle.d.ts +4 -1
  97. package/dist/types/src/containers/MagazineArticle/MagazineArticle.d.ts.map +1 -1
  98. package/dist/types/src/containers/MagazineArticle/MagazineArticle.stories.d.ts.map +1 -1
  99. package/dist/types/src/containers/MagazineArticle/MagazineTile.d.ts +4 -1
  100. package/dist/types/src/containers/MagazineArticle/MagazineTile.d.ts.map +1 -1
  101. package/dist/types/src/containers/MagazineArticle/useToolbar.d.ts +4 -8
  102. package/dist/types/src/containers/MagazineArticle/useToolbar.d.ts.map +1 -1
  103. package/dist/types/src/containers/PostArticle/PostArticle.d.ts +4 -1
  104. package/dist/types/src/containers/PostArticle/PostArticle.d.ts.map +1 -1
  105. package/dist/types/src/containers/PostArticle/PostArticle.stories.d.ts.map +1 -1
  106. package/dist/types/src/containers/PostArticle/PostToolbar.d.ts +1 -1
  107. package/dist/types/src/containers/PostArticle/PostToolbar.d.ts.map +1 -1
  108. package/dist/types/src/containers/PostCard/PostCard.d.ts +4 -6
  109. package/dist/types/src/containers/PostCard/PostCard.d.ts.map +1 -1
  110. package/dist/types/src/containers/SubscriptionsArticle/SubscriptionsArticle.d.ts +4 -1
  111. package/dist/types/src/containers/SubscriptionsArticle/SubscriptionsArticle.d.ts.map +1 -1
  112. package/dist/types/src/containers/SubscriptionsArticle/SubscriptionsArticle.stories.d.ts.map +1 -1
  113. package/dist/types/src/stories/ArticleExtractor.stories.d.ts +1 -0
  114. package/dist/types/src/stories/ArticleExtractor.stories.d.ts.map +1 -1
  115. package/dist/types/src/stories/MagazineCurate.stories.d.ts.map +1 -1
  116. package/dist/types/src/templates/magazine-curation.d.ts.map +1 -1
  117. package/dist/types/src/translations.d.ts +1 -0
  118. package/dist/types/src/translations.d.ts.map +1 -1
  119. package/dist/types/tsconfig.tsbuildinfo +1 -1
  120. package/dx.config.ts +1 -1
  121. package/package.json +57 -60
  122. package/src/MagazinePlugin.tsx +0 -3
  123. package/src/atoms/atoms.test.ts +5 -4
  124. package/src/capabilities/app-graph-builder.ts +8 -6
  125. package/src/capabilities/index.ts +0 -1
  126. package/src/capabilities/{react-surface.tsx → react-surface.ts} +10 -12
  127. package/src/components/PostContent/PostContent.test.ts +1 -1
  128. package/src/components/PostContent/PostContent.tsx +1 -41
  129. package/src/components/PostContent/dedupe-images.ts +48 -0
  130. package/src/components/PostContent/index.ts +1 -0
  131. package/src/containers/FeedArticle/FeedArticle.stories.tsx +2 -2
  132. package/src/containers/FeedArticle/FeedArticle.tsx +4 -2
  133. package/src/containers/FeedProperties/FeedProperties.tsx +6 -4
  134. package/src/containers/MagazineArticle/MagazineArticle.stories.tsx +2 -1
  135. package/src/containers/MagazineArticle/MagazineArticle.tsx +8 -6
  136. package/src/containers/MagazineArticle/MagazineTile.tsx +2 -0
  137. package/src/containers/MagazineArticle/useToolbar.tsx +2 -0
  138. package/src/containers/PostArticle/PostArticle.stories.tsx +2 -1
  139. package/src/containers/PostArticle/PostArticle.tsx +6 -3
  140. package/src/containers/PostArticle/PostToolbar.tsx +1 -1
  141. package/src/containers/PostCard/PostCard.tsx +3 -1
  142. package/src/containers/SubscriptionsArticle/SubscriptionsArticle.stories.tsx +2 -1
  143. package/src/containers/SubscriptionsArticle/SubscriptionsArticle.tsx +5 -3
  144. package/src/operations/curate-magazine.test.ts +108 -4
  145. package/src/operations/sync-feed.test.ts +1 -1
  146. package/src/operations/sync-feed.ts +1 -1
  147. package/src/paths.ts +3 -3
  148. package/src/stories/ArticleExtractor.stories.tsx +1 -1
  149. package/src/stories/MagazineCurate.stories.tsx +3 -2
  150. package/src/templates/magazine-curation.ts +3 -2
  151. package/src/types/Magazine.test.ts +1 -1
  152. package/src/types/Subscription.ts +1 -1
  153. package/dist/lib/neutral/FeedArticle-PEWCFFSP.mjs +0 -90
  154. package/dist/lib/neutral/FeedArticle-PEWCFFSP.mjs.map +0 -7
  155. package/dist/lib/neutral/FeedProperties-EIO7IZOA.mjs +0 -97
  156. package/dist/lib/neutral/FeedProperties-EIO7IZOA.mjs.map +0 -7
  157. package/dist/lib/neutral/MagazineArticle-5T7RTIPS.mjs +0 -325
  158. package/dist/lib/neutral/MagazineArticle-5T7RTIPS.mjs.map +0 -7
  159. package/dist/lib/neutral/MagazinePlugin.mjs +0 -62
  160. package/dist/lib/neutral/MagazinePlugin.mjs.map +0 -7
  161. package/dist/lib/neutral/MagazinePlugin.workerd.mjs +0 -12
  162. package/dist/lib/neutral/MagazinePlugin.workerd.mjs.map +0 -7
  163. package/dist/lib/neutral/PostArticle-BGIPU7XA.mjs +0 -230
  164. package/dist/lib/neutral/PostArticle-BGIPU7XA.mjs.map +0 -7
  165. package/dist/lib/neutral/PostCard-VDGN7BBA.mjs +0 -60
  166. package/dist/lib/neutral/PostCard-VDGN7BBA.mjs.map +0 -7
  167. package/dist/lib/neutral/app-graph-builder-JDPRBVHL.mjs +0 -121
  168. package/dist/lib/neutral/app-graph-builder-JDPRBVHL.mjs.map +0 -7
  169. package/dist/lib/neutral/capabilities/index.mjs +0 -21
  170. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  171. package/dist/lib/neutral/chunk-3K4AQKBZ.mjs +0 -12
  172. package/dist/lib/neutral/chunk-3K4AQKBZ.mjs.map +0 -7
  173. package/dist/lib/neutral/chunk-AFPBWBTK.mjs +0 -591
  174. package/dist/lib/neutral/chunk-AFPBWBTK.mjs.map +0 -7
  175. package/dist/lib/neutral/chunk-APQRTYT3.mjs +0 -57
  176. package/dist/lib/neutral/chunk-APQRTYT3.mjs.map +0 -7
  177. package/dist/lib/neutral/chunk-GU725ZF4.mjs +0 -11
  178. package/dist/lib/neutral/chunk-GU725ZF4.mjs.map +0 -7
  179. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  180. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  181. package/dist/lib/neutral/chunk-JFPR6OV4.mjs.map +0 -7
  182. package/dist/lib/neutral/chunk-KTYLUOUG.mjs +0 -36
  183. package/dist/lib/neutral/chunk-KTYLUOUG.mjs.map +0 -7
  184. package/dist/lib/neutral/chunk-LFSQMLPK.mjs +0 -8
  185. package/dist/lib/neutral/chunk-LFSQMLPK.mjs.map +0 -7
  186. package/dist/lib/neutral/chunk-MBPX7RPI.mjs +0 -14
  187. package/dist/lib/neutral/chunk-MBPX7RPI.mjs.map +0 -7
  188. package/dist/lib/neutral/chunk-OYCDRSWB.mjs +0 -624
  189. package/dist/lib/neutral/chunk-OYCDRSWB.mjs.map +0 -7
  190. package/dist/lib/neutral/chunk-SAWKLGJU.mjs +0 -28
  191. package/dist/lib/neutral/chunk-SAWKLGJU.mjs.map +0 -7
  192. package/dist/lib/neutral/chunk-XCNCK47N.mjs +0 -15
  193. package/dist/lib/neutral/chunk-XCNCK47N.mjs.map +0 -7
  194. package/dist/lib/neutral/clear-magazine-KNY4OWY4.mjs +0 -59
  195. package/dist/lib/neutral/clear-magazine-KNY4OWY4.mjs.map +0 -7
  196. package/dist/lib/neutral/components/index.mjs +0 -338
  197. package/dist/lib/neutral/components/index.mjs.map +0 -7
  198. package/dist/lib/neutral/containers/index.mjs +0 -17
  199. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  200. package/dist/lib/neutral/create-object-SYZMRR4H.mjs +0 -98
  201. package/dist/lib/neutral/create-object-SYZMRR4H.mjs.map +0 -7
  202. package/dist/lib/neutral/curate-magazine-7RMKSJC5.mjs +0 -184
  203. package/dist/lib/neutral/curate-magazine-7RMKSJC5.mjs.map +0 -7
  204. package/dist/lib/neutral/fetch-article-content-CXPKXIMR.mjs +0 -31
  205. package/dist/lib/neutral/fetch-article-content-CXPKXIMR.mjs.map +0 -7
  206. package/dist/lib/neutral/index.mjs +0 -18
  207. package/dist/lib/neutral/index.mjs.map +0 -7
  208. package/dist/lib/neutral/load-post-content-H3S4TKVM.mjs +0 -65
  209. package/dist/lib/neutral/load-post-content-H3S4TKVM.mjs.map +0 -7
  210. package/dist/lib/neutral/meta.json +0 -1
  211. package/dist/lib/neutral/meta.mjs +0 -8
  212. package/dist/lib/neutral/meta.mjs.map +0 -7
  213. package/dist/lib/neutral/navigation-resolver-IN4OMCDR.mjs +0 -18
  214. package/dist/lib/neutral/navigation-resolver-IN4OMCDR.mjs.map +0 -7
  215. package/dist/lib/neutral/operation-handler-JE3743BU.mjs +0 -8
  216. package/dist/lib/neutral/operation-handler-JE3743BU.mjs.map +0 -7
  217. package/dist/lib/neutral/operations/index.mjs +0 -8
  218. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  219. package/dist/lib/neutral/plugin.mjs +0 -16
  220. package/dist/lib/neutral/plugin.mjs.map +0 -7
  221. package/dist/lib/neutral/plugin.workerd.mjs +0 -16
  222. package/dist/lib/neutral/plugin.workerd.mjs.map +0 -7
  223. package/dist/lib/neutral/react-surface-TZESAMG2.mjs +0 -60
  224. package/dist/lib/neutral/react-surface-TZESAMG2.mjs.map +0 -7
  225. package/dist/lib/neutral/routine-templates-D5A2L4KL.mjs +0 -52
  226. package/dist/lib/neutral/routine-templates-D5A2L4KL.mjs.map +0 -7
  227. package/dist/lib/neutral/skill-definition-3KLMUEC5.mjs +0 -8
  228. package/dist/lib/neutral/skill-definition-3KLMUEC5.mjs.map +0 -7
  229. package/dist/lib/neutral/skills/index.mjs.map +0 -7
  230. package/dist/lib/neutral/sync-feed-SDXYF7HU.mjs +0 -99
  231. package/dist/lib/neutral/sync-feed-SDXYF7HU.mjs.map +0 -7
  232. package/dist/lib/neutral/translations.mjs +0 -81
  233. package/dist/lib/neutral/translations.mjs.map +0 -7
  234. package/dist/lib/neutral/types/index.mjs +0 -14
  235. package/dist/lib/neutral/types/index.mjs.map +0 -7
  236. package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
  237. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
  238. package/dist/types/src/operations/curate-magazine.skill.test.d.ts +0 -2
  239. package/dist/types/src/operations/curate-magazine.skill.test.d.ts.map +0 -1
  240. package/src/capabilities/navigation-resolver.ts +0 -21
  241. package/src/operations/curate-magazine.skill.conversations.json +0 -1
  242. package/src/operations/curate-magazine.skill.test.ts +0 -167
package/dx.config.ts CHANGED
@@ -43,6 +43,6 @@ export default Config2.make({
43
43
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-magazine',
44
44
  icon: { key: 'ph--book-open-text--regular', hue: 'orange' },
45
45
  spec: 'PLUGIN.mdl',
46
- tags: ['labs'],
46
+ tags: ['alpha'],
47
47
  },
48
48
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-magazine",
3
- "version": "0.9.1-staging.ee54ba693a",
3
+ "version": "0.11.0",
4
4
  "description": "Magazine plugin for RSS and open protocol subscriptions.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -16,37 +16,37 @@
16
16
  "#atoms": {
17
17
  "source": "./src/atoms/index.ts",
18
18
  "types": "./dist/types/src/atoms/index.d.ts",
19
- "default": "./dist/lib/neutral/atoms/index.mjs"
19
+ "default": "./dist/lib/atoms.mjs"
20
20
  },
21
21
  "#skills": {
22
22
  "source": "./src/skills/index.ts",
23
23
  "types": "./dist/types/src/skills/index.d.ts",
24
- "default": "./dist/lib/neutral/skills/index.mjs"
24
+ "default": "./dist/lib/skills.mjs"
25
25
  },
26
26
  "#capabilities": {
27
27
  "source": "./src/capabilities/index.ts",
28
28
  "types": "./dist/types/src/capabilities/index.d.ts",
29
- "default": "./dist/lib/neutral/capabilities/index.mjs"
29
+ "default": "./dist/lib/capabilities.mjs"
30
30
  },
31
31
  "#components": {
32
32
  "source": "./src/components/index.ts",
33
33
  "types": "./dist/types/src/components/index.d.ts",
34
- "default": "./dist/lib/neutral/components/index.mjs"
34
+ "default": "./dist/lib/components.mjs"
35
35
  },
36
36
  "#containers": {
37
37
  "source": "./src/containers/index.ts",
38
38
  "types": "./dist/types/src/containers/index.d.ts",
39
- "default": "./dist/lib/neutral/containers/index.mjs"
39
+ "default": "./dist/lib/containers.mjs"
40
40
  },
41
41
  "#meta": {
42
42
  "source": "./src/meta.ts",
43
43
  "types": "./dist/types/src/meta.d.ts",
44
- "default": "./dist/lib/neutral/meta.mjs"
44
+ "default": "./dist/lib/meta.mjs"
45
45
  },
46
46
  "#operations": {
47
47
  "source": "./src/operations/index.ts",
48
48
  "types": "./dist/types/src/operations/index.d.ts",
49
- "default": "./dist/lib/neutral/operations/index.mjs"
49
+ "default": "./dist/lib/operations.mjs"
50
50
  },
51
51
  "#plugin": {
52
52
  "source": {
@@ -54,41 +54,37 @@
54
54
  "default": "./src/MagazinePlugin.tsx"
55
55
  },
56
56
  "types": "./dist/types/src/MagazinePlugin.d.ts",
57
- "workerd": "./dist/lib/neutral/MagazinePlugin.workerd.mjs",
58
- "default": "./dist/lib/neutral/MagazinePlugin.mjs"
57
+ "workerd": "./dist/lib/MagazinePlugin.workerd.mjs",
58
+ "default": "./dist/lib/MagazinePlugin.mjs"
59
59
  },
60
60
  "#testing": "./src/testing/index.ts",
61
61
  "#translations": {
62
62
  "source": "./src/translations.ts",
63
63
  "types": "./dist/types/src/translations.d.ts",
64
- "default": "./dist/lib/neutral/translations.mjs"
64
+ "default": "./dist/lib/translations.mjs"
65
65
  },
66
66
  "#types": {
67
67
  "source": "./src/types/index.ts",
68
68
  "types": "./dist/types/src/types/index.d.ts",
69
- "default": "./dist/lib/neutral/types/index.mjs"
69
+ "default": "./dist/lib/types.mjs"
70
70
  }
71
71
  },
72
72
  "exports": {
73
73
  ".": {
74
74
  "source": "./src/index.ts",
75
75
  "types": "./dist/types/src/index.d.ts",
76
- "default": "./dist/lib/neutral/index.mjs"
76
+ "import": "./dist/lib/index.mjs"
77
77
  },
78
78
  "./assets/PLUGIN.mdl": "./PLUGIN.mdl",
79
79
  "./plugin": {
80
- "source": {
81
- "workerd": "./src/plugin.workerd.ts",
82
- "default": "./src/plugin.ts"
83
- },
80
+ "source": "./src/plugin.ts",
84
81
  "types": "./dist/types/src/plugin.d.ts",
85
- "workerd": "./dist/lib/neutral/plugin.workerd.mjs",
86
- "default": "./dist/lib/neutral/plugin.mjs"
82
+ "import": "./dist/lib/plugin.mjs"
87
83
  },
88
84
  "./translations": {
89
85
  "source": "./src/translations.ts",
90
86
  "types": "./dist/types/src/translations.d.ts",
91
- "default": "./dist/lib/neutral/translations.mjs"
87
+ "import": "./dist/lib/translations.mjs"
92
88
  }
93
89
  },
94
90
  "types": "dist/types/src/index.d.ts",
@@ -99,37 +95,38 @@
99
95
  "PLUGIN.mdl"
100
96
  ],
101
97
  "dependencies": {
98
+ "@effect-atom/atom": "^0.5.3",
102
99
  "@effect-atom/atom-react": "^0.5.0",
103
100
  "@effect/platform": "0.96.2",
104
101
  "date-fns": "^3.6.0",
105
102
  "defuddle": "^0.18.1",
106
103
  "fast-xml-parser": "^5.5.9",
107
- "@dxos/app-framework": "0.9.1-staging.ee54ba693a",
108
- "@dxos/app-toolkit": "0.9.1-staging.ee54ba693a",
109
- "@dxos/assistant-toolkit": "0.9.1-staging.ee54ba693a",
110
- "@dxos/compute": "0.9.1-staging.ee54ba693a",
111
- "@dxos/echo": "0.9.1-staging.ee54ba693a",
112
- "@dxos/effect": "0.9.1-staging.ee54ba693a",
113
- "@dxos/invariant": "0.9.1-staging.ee54ba693a",
114
- "@dxos/echo-react": "0.9.1-staging.ee54ba693a",
115
- "@dxos/keys": "0.9.1-staging.ee54ba693a",
116
- "@dxos/log": "0.9.1-staging.ee54ba693a",
117
- "@dxos/markdown": "0.9.1-staging.ee54ba693a",
118
- "@dxos/plugin-assistant": "0.9.1-staging.ee54ba693a",
119
- "@dxos/plugin-attention": "0.9.1-staging.ee54ba693a",
120
- "@dxos/plugin-graph": "0.9.1-staging.ee54ba693a",
121
- "@dxos/plugin-routine": "0.9.1-staging.ee54ba693a",
122
- "@dxos/react-client": "0.9.1-staging.ee54ba693a",
123
- "@dxos/plugin-client": "0.9.1-staging.ee54ba693a",
124
- "@dxos/plugin-space": "0.9.1-staging.ee54ba693a",
125
- "@dxos/client": "0.9.1-staging.ee54ba693a",
126
- "@dxos/react-ui-attention": "0.9.1-staging.ee54ba693a",
127
- "@dxos/react-ui-form": "0.9.1-staging.ee54ba693a",
128
- "@dxos/react-ui-markdown": "0.9.1-staging.ee54ba693a",
129
- "@dxos/react-ui-masonry": "0.9.1-staging.ee54ba693a",
130
- "@dxos/react-ui-menu": "0.9.1-staging.ee54ba693a",
131
- "@dxos/schema": "0.9.1-staging.ee54ba693a",
132
- "@dxos/util": "0.9.1-staging.ee54ba693a"
104
+ "@dxos/app-framework": "0.11.0",
105
+ "@dxos/app-toolkit": "0.11.0",
106
+ "@dxos/assistant-toolkit": "0.11.0",
107
+ "@dxos/client": "0.11.0",
108
+ "@dxos/compute": "0.11.0",
109
+ "@dxos/echo": "0.11.0",
110
+ "@dxos/echo-react": "0.11.0",
111
+ "@dxos/effect": "0.11.0",
112
+ "@dxos/invariant": "0.11.0",
113
+ "@dxos/log": "0.11.0",
114
+ "@dxos/markdown": "0.11.0",
115
+ "@dxos/keys": "0.11.0",
116
+ "@dxos/plugin-assistant": "0.11.0",
117
+ "@dxos/plugin-attention": "0.11.0",
118
+ "@dxos/plugin-client": "0.11.0",
119
+ "@dxos/plugin-routine": "0.11.0",
120
+ "@dxos/plugin-graph": "0.11.0",
121
+ "@dxos/plugin-space": "0.11.0",
122
+ "@dxos/react-ui-attention": "0.11.0",
123
+ "@dxos/react-client": "0.11.0",
124
+ "@dxos/react-ui-form": "0.11.0",
125
+ "@dxos/react-ui-markdown": "0.11.0",
126
+ "@dxos/react-ui-menu": "0.11.0",
127
+ "@dxos/react-ui-masonry": "0.11.0",
128
+ "@dxos/util": "0.11.0",
129
+ "@dxos/schema": "0.11.0"
133
130
  },
134
131
  "devDependencies": {
135
132
  "@storybook/react-vite": "^10.4.2",
@@ -138,25 +135,25 @@
138
135
  "effect": "3.21.4",
139
136
  "react": "~19.2.7",
140
137
  "react-dom": "~19.2.7",
141
- "vite": "^8.0.16",
142
- "@dxos/ai": "0.9.1-staging.ee54ba693a",
143
- "@dxos/echo-client": "0.9.1-staging.ee54ba693a",
144
- "@dxos/functions-runtime": "0.9.1-staging.ee54ba693a",
145
- "@dxos/plugin-testing": "0.9.1-staging.ee54ba693a",
146
- "@dxos/react-ui": "0.9.1-staging.ee54ba693a",
147
- "@dxos/random": "0.9.1-staging.ee54ba693a",
148
- "@dxos/react-ui-mosaic": "0.9.1-staging.ee54ba693a",
149
- "@dxos/ui-theme": "0.9.1-staging.ee54ba693a",
150
- "@dxos/react-ui-syntax-highlighter": "0.9.1-staging.ee54ba693a",
151
- "@dxos/storybook-utils": "0.9.1-staging.ee54ba693a"
138
+ "vite": "^8.1.4",
139
+ "@dxos/agent-runtime": "0.11.0",
140
+ "@dxos/ai": "0.11.0",
141
+ "@dxos/plugin-testing": "0.11.0",
142
+ "@dxos/echo-client": "0.11.0",
143
+ "@dxos/random": "0.11.0",
144
+ "@dxos/react-ui": "0.11.0",
145
+ "@dxos/react-ui-syntax-highlighter": "0.11.0",
146
+ "@dxos/react-ui-mosaic": "0.11.0",
147
+ "@dxos/storybook-utils": "0.11.0",
148
+ "@dxos/ui-theme": "0.11.0"
152
149
  },
153
150
  "peerDependencies": {
154
151
  "effect": "3.21.4",
155
152
  "react": "~19.2.7",
156
153
  "react-dom": "~19.2.7",
157
- "@dxos/react-ui": "0.9.1-staging.ee54ba693a",
158
- "@dxos/react-ui-mosaic": "0.9.1-staging.ee54ba693a",
159
- "@dxos/ui-theme": "0.9.1-staging.ee54ba693a"
154
+ "@dxos/react-ui": "^0.11.0",
155
+ "@dxos/react-ui-mosaic": "^0.11.0",
156
+ "@dxos/ui-theme": "^0.11.0"
160
157
  },
161
158
  "publishConfig": {
162
159
  "access": "public"
@@ -6,13 +6,11 @@ import { ActivationEvent, Plugin } from '@dxos/app-framework';
6
6
  import { AppActivationEvents, AppPlugin } from '@dxos/app-toolkit';
7
7
  import { Instructions } from '@dxos/compute';
8
8
  import { AttentionEvents } from '@dxos/plugin-attention';
9
- import { ClientEvents } from '@dxos/plugin-client';
10
9
  import { StateMap, TagIndex } from '@dxos/schema';
11
10
 
12
11
  import {
13
12
  AppGraphBuilder,
14
13
  CreateObject,
15
- NavigationResolver,
16
14
  OperationHandler,
17
15
  ReactSurface,
18
16
  RoutineTemplates,
@@ -31,7 +29,6 @@ export const MagazinePlugin = Plugin.define(meta).pipe(
31
29
  activate: AppGraphBuilder,
32
30
  }),
33
31
  AppPlugin.addCreateObjectModule({ activate: CreateObject }),
34
- AppPlugin.addNavigationResolverModule({ activatesOn: ClientEvents.ClientReady, activate: NavigationResolver }),
35
32
  AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),
36
33
  AppPlugin.addPluginAssetModule({
37
34
  asset: { pluginId: meta.profile.key, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },
@@ -2,7 +2,7 @@
2
2
  // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import { Registry } from '@effect-atom/atom-react';
5
+ import { Registry } from '@effect-atom/atom';
6
6
  import * as Data from 'effect/Data';
7
7
  import { afterEach, beforeEach, describe, test } from 'vitest';
8
8
 
@@ -117,9 +117,10 @@ describe('postTagsAtom', () => {
117
117
 
118
118
  await Subscription.setTag(subscription, post.id, db, 'starred', true);
119
119
  await db.flush();
120
- // tagUrisAtom fires once when Tag.Tag is created (intermediate re-run, still starred=false),
121
- // then Obj.subscribe fires when subscription.tags is mutated (starred=true, setSelf).
122
- expect(fireCount).toBe(3);
120
+ // At least one further fire carries the mutation; the exact count is not part of the contract —
121
+ // the update scheduler coalesces, so an intermediate re-run (Tag.Tag created, still
122
+ // starred=false) may or may not surface as its own notification.
123
+ expect(fireCount).toBeGreaterThan(1);
123
124
  expect(registry.get(atom).starred).toBe(true);
124
125
  });
125
126
 
@@ -2,18 +2,18 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Atom } from '@effect-atom/atom-react';
5
+ import { Atom } from '@effect-atom/atom';
6
6
  import * as Effect from 'effect/Effect';
7
7
  import * as Option from 'effect/Option';
8
8
 
9
9
  import { Capability } from '@dxos/app-framework';
10
- import { AppCapabilities, AppNode, AppNodeMatcher, Paths, TypeSection } from '@dxos/app-toolkit';
10
+ import { AppCapabilities, AppNode, AppNodeMatcher, GraphPath, TypeSection } from '@dxos/app-toolkit';
11
11
  import { Operation } from '@dxos/compute';
12
12
  import { Obj, Ref, Type } from '@dxos/echo';
13
13
  import { AttentionCapabilities } from '@dxos/plugin-attention';
14
14
  import { GraphBuilder } from '@dxos/plugin-graph';
15
15
  import { SpaceOperation } from '@dxos/plugin-space';
16
- import { linkedSegment, selectionAspect } from '@dxos/react-ui-attention';
16
+ import { Selection } from '@dxos/react-ui-attention';
17
17
 
18
18
  import { meta } from '#meta';
19
19
  import { FeedOperation } from '#types';
@@ -26,7 +26,7 @@ export default Capability.makeModule(
26
26
  const viewState = yield* Capability.get(AttentionCapabilities.ViewState);
27
27
  const selectedId = Atom.family((nodeId: string) =>
28
28
  Atom.make((get) => {
29
- const selection = get(viewState.atom(selectionAspect, nodeId));
29
+ const selection = get(viewState.atom(Selection.aspect, nodeId));
30
30
  return selection.mode === 'single' ? selection.id : undefined;
31
31
  }),
32
32
  );
@@ -34,7 +34,9 @@ export default Capability.makeModule(
34
34
  const extensions = yield* Effect.all([
35
35
  // Magazine type section in the content group.
36
36
  TypeSection.createTypeSectionExtension(Magazine.Magazine, {
37
- match: AppNodeMatcher.whenNavTreeGroup(Paths.GroupTypes.content),
37
+ urlKey: 'magazine',
38
+ match: AppNodeMatcher.whenNavTreeGroup(GraphPath.GroupTypes.content),
39
+ groupSegment: GraphPath.GroupSegments.content,
38
40
  createObject: (space) =>
39
41
  Operation.invoke(SpaceOperation.OpenCreateObject, {
40
42
  target: space.db,
@@ -86,7 +88,7 @@ export default Capability.makeModule(
86
88
  }
87
89
  return Effect.succeed([
88
90
  AppNode.makeCompanion({
89
- id: linkedSegment('post'),
91
+ variant: 'post',
90
92
  label: ['post-companion.label', { ns: meta.profile.key }],
91
93
  icon: 'ph--article--regular',
92
94
  data: post,
@@ -14,4 +14,3 @@ export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHan
14
14
  () => import('./operation-handler'),
15
15
  );
16
16
  export const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));
17
- export const NavigationResolver = Capability.lazy('NavigationResolver', () => import('./navigation-resolver'));
@@ -3,7 +3,6 @@
3
3
  //
4
4
 
5
5
  import * as Effect from 'effect/Effect';
6
- import React from 'react';
7
6
 
8
7
  import { Capabilities, Capability } from '@dxos/app-framework';
9
8
  import { Surface } from '@dxos/app-framework/ui';
@@ -19,34 +18,33 @@ export default Capability.makeModule(() =>
19
18
  Surface.create({
20
19
  id: 'magazineArticle',
21
20
  filter: AppSurface.object(AppSurface.Article, Magazine.Magazine),
22
- component: ({ data, role }) => (
23
- <MagazineArticle role={role} subject={data.subject} attendableId={data.attendableId} />
24
- ),
21
+ component: MagazineArticle,
22
+ props: ({ role, data: { subject, attendableId } }) => ({ role, subject, attendableId }),
25
23
  }),
26
24
  Surface.create({
27
25
  id: 'feedArticle',
28
26
  filter: AppSurface.object(AppSurface.Article, Subscription.Subscription),
29
- component: ({ data, role }) => (
30
- <FeedArticle role={role} subject={data.subject} attendableId={data.attendableId} />
31
- ),
27
+ component: FeedArticle,
28
+ props: ({ role, data: { subject, attendableId } }) => ({ role, subject, attendableId }),
32
29
  }),
33
30
  Surface.create({
34
31
  id: 'postArticle',
35
32
  filter: AppSurface.object(AppSurface.Article, Subscription.Post),
36
- component: ({ data, role }) => (
37
- <PostArticle role={role} subject={data.subject} attendableId={data.attendableId} />
38
- ),
33
+ component: PostArticle,
34
+ props: ({ role, data: { subject, attendableId } }) => ({ role, subject, attendableId }),
39
35
  }),
40
36
  Surface.create({
41
37
  id: 'postCard',
42
38
  position: Position.first,
43
39
  filter: AppSurface.object(AppSurface.CardContent, Subscription.Post),
44
- component: ({ data, role }) => <PostCard role={role} subject={data.subject} />,
40
+ component: PostCard,
41
+ props: ({ role, data: { subject } }) => ({ role, subject }),
45
42
  }),
46
43
  Surface.create({
47
44
  id: 'feedProperties',
48
45
  filter: AppSurface.object(AppSurface.ObjectProperties, Subscription.Subscription),
49
- component: ({ data }) => <FeedProperties subject={data.subject} />,
46
+ component: FeedProperties,
47
+ props: ({ data: { subject } }) => ({ subject }),
50
48
  }),
51
49
  ]),
52
50
  ),
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { describe, expect, test } from 'vitest';
6
6
 
7
- import { dedupeImagesInMarkdown } from './PostContent';
7
+ import { dedupeImagesInMarkdown } from './dedupe-images';
8
8
 
9
9
  describe('dedupeImagesInMarkdown', () => {
10
10
  test('strips an image whose URL matches the hero imageUrl', () => {
@@ -12,6 +12,7 @@ import { usePostContentAtom } from '#atoms';
12
12
  import { Subscription } from '#types';
13
13
 
14
14
  import { formatDate, getImageUrl } from '../../util';
15
+ import { contentHasImage, dedupeImagesInMarkdown } from './dedupe-images';
15
16
 
16
17
  export type PostContentProps = {
17
18
  /** Post to render. */
@@ -20,47 +21,6 @@ export type PostContentProps = {
20
21
  metadata?: string[];
21
22
  };
22
23
 
23
- /**
24
- * Strips images from a markdown string whose URL is already on the
25
- * `excluded` list, AND drops any image that appears more than once. The
26
- * hero `post.imageUrl` is added to `excluded` by the caller so the
27
- * extracted article body doesn't re-render the same image immediately
28
- * below the hero. Captures both Markdown image syntax (`![alt](url
29
- * "title")`) and inline HTML `<img>` tags that defuddle sometimes
30
- * leaves behind.
31
- */
32
- export const dedupeImagesInMarkdown = (markdown: string, excluded: ReadonlyArray<string | undefined>): string => {
33
- const seen = new Set<string>();
34
- for (const url of excluded) {
35
- if (url) {
36
- seen.add(url);
37
- }
38
- }
39
-
40
- // Markdown image: `![alt](url)` or `![alt](url "title")`.
41
- const markdownImg = /!\[[^\]]*\]\(\s*([^)\s]+)(?:\s+"[^"]*")?\s*\)/g;
42
- // HTML image: `<img ... src="url" ...>`.
43
- const htmlImg = /<img\b[^>]*\bsrc=["']([^"']+)["'][^>]*>/gi;
44
-
45
- const dedupe = (input: string, regex: RegExp): string =>
46
- input.replace(regex, (match, url) => {
47
- if (typeof url !== 'string') {
48
- return match;
49
- }
50
- if (seen.has(url)) {
51
- return '';
52
- }
53
- seen.add(url);
54
- return match;
55
- });
56
-
57
- return dedupe(dedupe(markdown, markdownImg), htmlImg);
58
- };
59
-
60
- /** Returns true if the markdown contains at least one Markdown or inline HTML image. */
61
- export const contentHasImage = (markdown: string): boolean =>
62
- /!\[[^\]]*\]\(\s*[^)\s]+/.test(markdown) || /<img\b[^>]*\bsrc=["'][^"']+["']/i.test(markdown);
63
-
64
24
  /**
65
25
  * Shared presentational layout for an article-style post.
66
26
  * Render order: title → hero image → Markdown body (subscription contentFeed
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // Kept out of `PostContent.tsx`: react-refresh only fast-refreshes a module whose
6
+ // exports are all components, so values exported beside them force a full page reload on
7
+ // every edit.
8
+
9
+ /**
10
+ * Strips images from a markdown string whose URL is already on the
11
+ * `excluded` list, AND drops any image that appears more than once. The
12
+ * hero `post.imageUrl` is added to `excluded` by the caller so the
13
+ * extracted article body doesn't re-render the same image immediately
14
+ * below the hero. Captures both Markdown image syntax (`![alt](url
15
+ * "title")`) and inline HTML `<img>` tags that defuddle sometimes
16
+ * leaves behind.
17
+ */
18
+ export const dedupeImagesInMarkdown = (markdown: string, excluded: ReadonlyArray<string | undefined>): string => {
19
+ const seen = new Set<string>();
20
+ for (const url of excluded) {
21
+ if (url) {
22
+ seen.add(url);
23
+ }
24
+ }
25
+
26
+ // Markdown image: `![alt](url)` or `![alt](url "title")`.
27
+ const markdownImg = /!\[[^\]]*\]\(\s*([^)\s]+)(?:\s+"[^"]*")?\s*\)/g;
28
+ // HTML image: `<img ... src="url" ...>`.
29
+ const htmlImg = /<img\b[^>]*\bsrc=["']([^"']+)["'][^>]*>/gi;
30
+
31
+ const dedupe = (input: string, regex: RegExp): string =>
32
+ input.replace(regex, (match, url) => {
33
+ if (typeof url !== 'string') {
34
+ return match;
35
+ }
36
+ if (seen.has(url)) {
37
+ return '';
38
+ }
39
+ seen.add(url);
40
+ return match;
41
+ });
42
+
43
+ return dedupe(dedupe(markdown, markdownImg), htmlImg);
44
+ };
45
+
46
+ /** Returns true if the markdown contains at least one Markdown or inline HTML image. */
47
+ export const contentHasImage = (markdown: string): boolean =>
48
+ /!\[[^\]]*\]\(\s*[^)\s]+/.test(markdown) || /<img\b[^>]*\bsrc=["'][^"']+["']/i.test(markdown);
@@ -2,4 +2,5 @@
2
2
  // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
+ export * from './dedupe-images';
5
6
  export * from './PostContent';
@@ -67,13 +67,13 @@ const DefaultStory = ({ feedUrl }: FeedArticleStoryProps) => {
67
67
  const { feed, posts } = data;
68
68
 
69
69
  return (
70
- <Panel.Root role='article' className='dx-document'>
70
+ <Panel.Root role='article' classNames='dx-document'>
71
71
  <Panel.Toolbar asChild>
72
72
  <Toolbar.Root>
73
73
  <Toolbar.Text>{feed.name}</Toolbar.Text>
74
74
  </Toolbar.Root>
75
75
  </Panel.Toolbar>
76
- <Panel.Content>
76
+ <Panel.Content asChild>
77
77
  <PostStack id='story-feed' posts={posts} currentId={currentPostId} onAction={handleAction} />
78
78
  </Panel.Content>
79
79
  </Panel.Root>
@@ -7,7 +7,7 @@ import React, { useCallback, useState } from 'react';
7
7
  import { useOperationInvoker } from '@dxos/app-framework/ui';
8
8
  import { type AppSurface } from '@dxos/app-toolkit/ui';
9
9
  import { Filter, Obj, Query, Ref, Scope } from '@dxos/echo';
10
- import { useObject, useQuery } from '@dxos/react-client/echo';
10
+ import { useObject, useQuery } from '@dxos/echo-react';
11
11
  import { Panel } from '@dxos/react-ui';
12
12
 
13
13
  import { PostStack, type PostStackAction } from '#components';
@@ -53,7 +53,7 @@ export const FeedArticle = ({ role, subject, attendableId }: FeedArticleProps) =
53
53
  }, [subject, invokePromise]);
54
54
 
55
55
  return (
56
- <Panel.Root role={role} className='dx-document'>
56
+ <Panel.Root role={role} classNames='dx-document'>
57
57
  <FeedToolbar attendableId={attendableId} onSync={handleSync} />
58
58
  <Panel.Content asChild>
59
59
  <PostStack
@@ -66,3 +66,5 @@ export const FeedArticle = ({ role, subject, attendableId }: FeedArticleProps) =
66
66
  </Panel.Root>
67
67
  );
68
68
  };
69
+
70
+ FeedArticle.displayName = 'FeedArticle';
@@ -5,11 +5,11 @@
5
5
  import React, { useCallback, useMemo, useState } from 'react';
6
6
 
7
7
  import { useOperationInvoker } from '@dxos/app-framework/ui';
8
- import { LayoutOperation, Paths } from '@dxos/app-toolkit';
8
+ import { GraphPath, LayoutOperation } from '@dxos/app-toolkit';
9
9
  import { type AppSurface } from '@dxos/app-toolkit/ui';
10
10
  import { Operation, Trigger } from '@dxos/compute';
11
11
  import { Filter, Obj, Query, Ref } from '@dxos/echo';
12
- import { useObject, useQuery } from '@dxos/react-client/echo';
12
+ import { useObject, useQuery } from '@dxos/echo-react';
13
13
  import { IconButton, Input, useTranslation } from '@dxos/react-ui';
14
14
  import { Form } from '@dxos/react-ui-form';
15
15
 
@@ -68,8 +68,8 @@ export const FeedProperties = ({ subject }: FeedPropertiesProps) => {
68
68
  }
69
69
 
70
70
  void invokePromise(LayoutOperation.Open, {
71
- subject: [Paths.getSpacePath(db.spaceId, 'settings', 'org.dxos.plugin.routine.routines')],
72
- workspace: Paths.getSpacePath(db.spaceId),
71
+ subject: [GraphPath.getSpacePath(db.spaceId, 'settings', 'org.dxos.plugin.routine.routines')],
72
+ workspace: GraphPath.getSpacePath(db.spaceId),
73
73
  });
74
74
  }, [invokePromise, db]);
75
75
 
@@ -105,3 +105,5 @@ const ensureSyncFeedOperation = async (db: NonNullable<ReturnType<typeof Obj.get
105
105
 
106
106
  return db.add(Operation.serialize(FeedOperation.SyncFeed));
107
107
  };
108
+
109
+ FeedProperties.displayName = 'FeedProperties';
@@ -11,11 +11,12 @@ import { withPluginManager } from '@dxos/app-framework/testing';
11
11
  import { type Client } from '@dxos/client';
12
12
  import { type Space } from '@dxos/client/echo';
13
13
  import { Feed, Filter, Obj, Ref } from '@dxos/echo';
14
+ import { useQuery } from '@dxos/echo-react';
14
15
  import { ClientPlugin } from '@dxos/plugin-client/testing';
15
16
  import { initializeIdentity } from '@dxos/plugin-client/testing';
16
17
  import { SpacePlugin } from '@dxos/plugin-space/testing';
17
18
  import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
18
- import { useQuery, useSpaces } from '@dxos/react-client/echo';
19
+ import { useSpaces } from '@dxos/react-client/echo';
19
20
  import { Loading, withLayout } from '@dxos/react-ui/testing';
20
21
 
21
22
  import { MagazineSkill } from '#skills';
@@ -6,13 +6,13 @@ import { useAtomValue } from '@effect-atom/atom-react';
6
6
  import React, { useCallback, useEffect, useMemo } from 'react';
7
7
 
8
8
  import { useOperationInvoker } from '@dxos/app-framework/ui';
9
- import { LayoutOperation, Paths } from '@dxos/app-toolkit';
9
+ import { GraphPath, LayoutOperation } from '@dxos/app-toolkit';
10
10
  import { type AppSurface, useShowItem } from '@dxos/app-toolkit/ui';
11
11
  import { Obj, Ref } from '@dxos/echo';
12
+ import { useObject } from '@dxos/echo-react';
12
13
  import { log } from '@dxos/log';
13
- import { useObject } from '@dxos/react-client/echo';
14
14
  import { Panel, useTranslation } from '@dxos/react-ui';
15
- import { linkedSegment, useSelection } from '@dxos/react-ui-attention';
15
+ import { Attention, useSelection } from '@dxos/react-ui-attention';
16
16
  import { Masonry } from '@dxos/react-ui-masonry';
17
17
  import { Menu } from '@dxos/react-ui-menu';
18
18
 
@@ -65,8 +65,8 @@ export const MagazineArticle = ({ role, subject, attendableId }: MagazineArticle
65
65
  void showItem({
66
66
  contextId: id,
67
67
  selectionId: post.id,
68
- companion: linkedSegment('post'),
69
- path: Paths.getObjectPathFromObject(subject),
68
+ companion: Attention.linkedSegment('post'),
69
+ path: GraphPath.getObjectPathFromObject(subject),
70
70
  });
71
71
  },
72
72
  [id, showItem, invoker, subject],
@@ -76,7 +76,7 @@ export const MagazineArticle = ({ role, subject, attendableId }: MagazineArticle
76
76
  useEffect(() => {
77
77
  if (noPosts) {
78
78
  void invoker.invokePromise(LayoutOperation.UpdateCompanion, {
79
- subject: linkedSegment('settings'),
79
+ subject: Attention.linkedSegment('settings'),
80
80
  });
81
81
  }
82
82
  }, [noPosts, invoker]);
@@ -144,3 +144,5 @@ const TileAdapter = ({ data }: { data: TileData | undefined; index: number }) =>
144
144
  />
145
145
  );
146
146
  };
147
+
148
+ MagazineArticle.displayName = 'MagazineArticle';
@@ -86,3 +86,5 @@ export const MagazineTile = ({ post, magazine, current, onToggleStar, onOpen }:
86
86
  /** Convenience: format a Post's published date the way the magazine view shows it. */
87
87
  const formatPublished = (post: Obj.Snapshot<Subscription.Post>): string | undefined =>
88
88
  post.published ? formatDate(post.published) : undefined;
89
+
90
+ MagazineTile.displayName = 'MagazineTile';
@@ -143,3 +143,5 @@ export const useToolbar = ({ magazine }: UseToolbarProps) => {
143
143
 
144
144
  return { menu, viewAtom };
145
145
  };
146
+
147
+ useToolbar.displayName = 'useToolbar';