@dxos/plugin-magazine 0.10.0 → 0.11.1

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.10.0",
3
+ "version": "0.11.1",
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-toolkit": "0.10.0",
108
- "@dxos/client": "0.10.0",
109
- "@dxos/app-framework": "0.10.0",
110
- "@dxos/assistant-toolkit": "0.10.0",
111
- "@dxos/compute": "0.10.0",
112
- "@dxos/echo": "0.10.0",
113
- "@dxos/effect": "0.10.0",
114
- "@dxos/echo-react": "0.10.0",
115
- "@dxos/invariant": "0.10.0",
116
- "@dxos/keys": "0.10.0",
117
- "@dxos/log": "0.10.0",
118
- "@dxos/plugin-assistant": "0.10.0",
119
- "@dxos/markdown": "0.10.0",
120
- "@dxos/plugin-attention": "0.10.0",
121
- "@dxos/plugin-client": "0.10.0",
122
- "@dxos/plugin-routine": "0.10.0",
123
- "@dxos/plugin-space": "0.10.0",
124
- "@dxos/react-client": "0.10.0",
125
- "@dxos/react-ui-attention": "0.10.0",
126
- "@dxos/react-ui-form": "0.10.0",
127
- "@dxos/react-ui-markdown": "0.10.0",
128
- "@dxos/react-ui-masonry": "0.10.0",
129
- "@dxos/schema": "0.10.0",
130
- "@dxos/plugin-graph": "0.10.0",
131
- "@dxos/react-ui-menu": "0.10.0",
132
- "@dxos/util": "0.10.0"
104
+ "@dxos/app-framework": "0.11.1",
105
+ "@dxos/app-toolkit": "0.11.1",
106
+ "@dxos/assistant-toolkit": "0.11.1",
107
+ "@dxos/client": "0.11.1",
108
+ "@dxos/compute": "0.11.1",
109
+ "@dxos/echo": "0.11.1",
110
+ "@dxos/echo-react": "0.11.1",
111
+ "@dxos/effect": "0.11.1",
112
+ "@dxos/invariant": "0.11.1",
113
+ "@dxos/keys": "0.11.1",
114
+ "@dxos/log": "0.11.1",
115
+ "@dxos/markdown": "0.11.1",
116
+ "@dxos/plugin-attention": "0.11.1",
117
+ "@dxos/plugin-client": "0.11.1",
118
+ "@dxos/plugin-graph": "0.11.1",
119
+ "@dxos/plugin-routine": "0.11.1",
120
+ "@dxos/plugin-assistant": "0.11.1",
121
+ "@dxos/plugin-space": "0.11.1",
122
+ "@dxos/react-ui-attention": "0.11.1",
123
+ "@dxos/react-client": "0.11.1",
124
+ "@dxos/react-ui-form": "0.11.1",
125
+ "@dxos/react-ui-markdown": "0.11.1",
126
+ "@dxos/react-ui-masonry": "0.11.1",
127
+ "@dxos/react-ui-menu": "0.11.1",
128
+ "@dxos/schema": "0.11.1",
129
+ "@dxos/util": "0.11.1"
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/echo-client": "0.10.0",
143
- "@dxos/ai": "0.10.0",
144
- "@dxos/functions-runtime": "0.10.0",
145
- "@dxos/plugin-testing": "0.10.0",
146
- "@dxos/react-ui": "0.10.0",
147
- "@dxos/random": "0.10.0",
148
- "@dxos/react-ui-mosaic": "0.10.0",
149
- "@dxos/storybook-utils": "0.10.0",
150
- "@dxos/ui-theme": "0.10.0",
151
- "@dxos/react-ui-syntax-highlighter": "0.10.0"
138
+ "vite": "^8.1.4",
139
+ "@dxos/agent-runtime": "0.11.1",
140
+ "@dxos/ai": "0.11.1",
141
+ "@dxos/echo-client": "0.11.1",
142
+ "@dxos/random": "0.11.1",
143
+ "@dxos/react-ui": "0.11.1",
144
+ "@dxos/plugin-testing": "0.11.1",
145
+ "@dxos/react-ui-mosaic": "0.11.1",
146
+ "@dxos/react-ui-syntax-highlighter": "0.11.1",
147
+ "@dxos/storybook-utils": "0.11.1",
148
+ "@dxos/ui-theme": "0.11.1"
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.10.0",
158
- "@dxos/react-ui-mosaic": "0.10.0",
159
- "@dxos/ui-theme": "0.10.0"
154
+ "@dxos/react-ui": "^0.11.1",
155
+ "@dxos/react-ui-mosaic": "^0.11.1",
156
+ "@dxos/ui-theme": "^0.11.1"
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';