@stephen-netu/design-system 0.2.1 → 0.5.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 (359) hide show
  1. package/dist/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte +10 -2
  2. package/dist/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte.d.ts.map +1 -1
  3. package/dist/b0-app-shell/{command-bar/CommandBar.svelte → global-command-bar/GlobalCommandBar.svelte} +75 -75
  4. package/dist/b0-app-shell/{command-bar/CommandBar.svelte.d.ts → global-command-bar/GlobalCommandBar.svelte.d.ts} +6 -6
  5. package/dist/b0-app-shell/global-command-bar/GlobalCommandBar.svelte.d.ts.map +1 -0
  6. package/dist/b0-app-shell/index.d.ts +1 -1
  7. package/dist/b0-app-shell/index.d.ts.map +1 -1
  8. package/dist/b0-app-shell/index.js +1 -1
  9. package/dist/d0-data-viz/BarChart.test.js +53 -0
  10. package/dist/d0-data-viz/CheckpointBar.test.js +83 -0
  11. package/dist/d0-data-viz/CheckpointPill.svelte +8 -3
  12. package/dist/d0-data-viz/CheckpointPill.svelte.d.ts.map +1 -1
  13. package/dist/d0-data-viz/CheckpointPill.test.js +78 -0
  14. package/dist/d0-data-viz/ConnectionHealth.test.js +70 -0
  15. package/dist/d0-data-viz/MetricCard.test.js +57 -0
  16. package/dist/d0-data-viz/SparkLine.test.js +47 -0
  17. package/dist/d0-data-viz/StorageMap.test.js +63 -0
  18. package/dist/d0-data-viz/Timeline.test.js +62 -0
  19. package/dist/d0-data-viz/WorldLineTimeline.test.js +99 -0
  20. package/dist/d0-data-viz/checkpoint-types.js +1 -1
  21. package/dist/d0-data-viz/storage-map-types.d.ts.map +1 -1
  22. package/dist/d0-data-viz/storage-map-types.js +6 -3
  23. package/dist/d0-data-viz/theme-integration.d.ts +3 -3
  24. package/dist/d0-data-viz/theme-integration.js +4 -4
  25. package/dist/d0-data-viz/theme-integration.test.js +41 -0
  26. package/dist/demos/AmbientPrimitivesDemo.svelte +103 -0
  27. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts +5 -0
  28. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts.map +1 -0
  29. package/dist/demos/BspSizingInfographic.svelte +3 -32
  30. package/dist/demos/NodepadBlocksShowcase.svelte +2 -1
  31. package/dist/demos/NodepadBlocksShowcase.svelte.d.ts.map +1 -1
  32. package/dist/demos/index.d.ts +1 -0
  33. package/dist/demos/index.d.ts.map +1 -1
  34. package/dist/demos/index.js +1 -0
  35. package/dist/editor/CodeEditor.svelte +83 -26
  36. package/dist/editor/CodeEditor.svelte.d.ts +0 -1
  37. package/dist/editor/CodeEditor.svelte.d.ts.map +1 -1
  38. package/dist/editor/CodeEditor.test.js +38 -0
  39. package/dist/editor/ExternalChangeDialog.svelte +117 -0
  40. package/dist/editor/ExternalChangeDialog.svelte.d.ts +13 -0
  41. package/dist/editor/ExternalChangeDialog.svelte.d.ts.map +1 -0
  42. package/dist/editor/FindReplaceDialog.svelte +32 -32
  43. package/dist/editor/MarkdownEditor.svelte +105 -605
  44. package/dist/editor/MarkdownEditor.svelte.d.ts +1 -1
  45. package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
  46. package/dist/editor/MarkdownEditor.test.js +38 -0
  47. package/dist/editor/codemirror-config.d.ts +36 -0
  48. package/dist/editor/codemirror-config.d.ts.map +1 -0
  49. package/dist/editor/codemirror-config.js +87 -0
  50. package/dist/editor/components/CorrectionTooltip.svelte +180 -160
  51. package/dist/editor/components/CorrectionTooltip.svelte.d.ts +7 -23
  52. package/dist/editor/components/CorrectionTooltip.svelte.d.ts.map +1 -1
  53. package/dist/editor/extensions/autocomplete.d.ts +2 -2
  54. package/dist/editor/extensions/autocomplete.d.ts.map +1 -1
  55. package/dist/editor/extensions/autocomplete.test.js +121 -0
  56. package/dist/editor/extensions/spellcheck.d.ts +21 -3
  57. package/dist/editor/extensions/spellcheck.d.ts.map +1 -1
  58. package/dist/editor/extensions/spellcheck.js +51 -9
  59. package/dist/editor/extensions/spellcheck.test.js +168 -0
  60. package/dist/editor/extensions/types.d.ts +2 -1
  61. package/dist/editor/extensions/types.d.ts.map +1 -1
  62. package/dist/editor/index.d.ts +2 -1
  63. package/dist/editor/index.d.ts.map +1 -1
  64. package/dist/editor/index.js +1 -0
  65. package/dist/editor/markdown-preview.d.ts +9 -0
  66. package/dist/editor/markdown-preview.d.ts.map +1 -0
  67. package/dist/editor/markdown-preview.js +19 -0
  68. package/dist/editor/markdown-preview.test.js +38 -0
  69. package/dist/editor/useCodeMirror.d.ts +23 -0
  70. package/dist/editor/useCodeMirror.d.ts.map +1 -0
  71. package/dist/editor/useCodeMirror.js +40 -0
  72. package/dist/editor/useFilePersistence.d.ts +32 -0
  73. package/dist/editor/useFilePersistence.d.ts.map +1 -0
  74. package/dist/editor/useFilePersistence.js +117 -0
  75. package/dist/entity-graph-view/WorldView.svelte +1 -1
  76. package/dist/fabric/ai/ChatPanel.svelte +84 -85
  77. package/dist/fabric/ai/ChatPanel.svelte.d.ts.map +1 -1
  78. package/dist/fabric/ai/ResearchPanel.svelte +35 -25
  79. package/dist/fabric/ai/ResearchPanel.svelte.d.ts.map +1 -1
  80. package/dist/fabric/data/FileTree.svelte +195 -0
  81. package/dist/fabric/data/FileTree.svelte.d.ts +19 -0
  82. package/dist/fabric/data/FileTree.svelte.d.ts.map +1 -0
  83. package/dist/fabric/data/FileTree.test.js +127 -0
  84. package/dist/fabric/data/index.d.ts +5 -9
  85. package/dist/fabric/data/index.d.ts.map +1 -1
  86. package/dist/fabric/data/index.js +4 -1
  87. package/dist/fabric/index.d.ts +5 -5
  88. package/dist/fabric/index.d.ts.map +1 -1
  89. package/dist/fabric/index.js +5 -3
  90. package/dist/fabric/input/{CommandBar.svelte → AppHeaderBar.svelte} +13 -13
  91. package/dist/fabric/input/{CommandBar.svelte.d.ts → AppHeaderBar.svelte.d.ts} +5 -5
  92. package/dist/fabric/input/AppHeaderBar.svelte.d.ts.map +1 -0
  93. package/dist/fabric/input/{CommandBar.test.js → AppHeaderBar.test.js} +9 -9
  94. package/dist/fabric/input/KeyboardShortcuts.svelte +23 -21
  95. package/dist/fabric/input/index.d.ts +2 -2
  96. package/dist/fabric/input/index.d.ts.map +1 -1
  97. package/dist/fabric/input/index.js +1 -1
  98. package/dist/fabric/layout/CollapsiblePanel.svelte +8 -10
  99. package/dist/fabric/layout/KanbanBoard.svelte +25 -155
  100. package/dist/fabric/layout/KanbanBoard.svelte.d.ts +2 -26
  101. package/dist/fabric/layout/KanbanBoard.svelte.d.ts.map +1 -1
  102. package/dist/fabric/layout/KanbanBoard.test.js +125 -10
  103. package/dist/fabric/layout/KanbanCard.svelte +27 -223
  104. package/dist/fabric/layout/KanbanCard.svelte.d.ts +2 -19
  105. package/dist/fabric/layout/KanbanCard.svelte.d.ts.map +1 -1
  106. package/dist/fabric/layout/KanbanColumn.svelte +41 -275
  107. package/dist/fabric/layout/KanbanColumn.svelte.d.ts +2 -22
  108. package/dist/fabric/layout/KanbanColumn.svelte.d.ts.map +1 -1
  109. package/dist/fabric/layout/index.d.ts +2 -5
  110. package/dist/fabric/layout/index.d.ts.map +1 -1
  111. package/dist/fabric/layout/index.js +1 -1
  112. package/dist/fabric/navigation/ActivityRail.svelte +3 -5
  113. package/dist/fabric/navigation/ActivityRail.svelte.d.ts.map +1 -1
  114. package/dist/g0-generative/components/Text.svelte +38 -0
  115. package/dist/g0-generative/components/Text.svelte.d.ts +9 -0
  116. package/dist/g0-generative/components/Text.svelte.d.ts.map +1 -0
  117. package/dist/g0-generative/index.d.ts +1 -0
  118. package/dist/g0-generative/index.d.ts.map +1 -1
  119. package/dist/g0-generative/index.js +1 -0
  120. package/dist/g0-generative/library/ComponentLibrary.d.ts +4 -0
  121. package/dist/g0-generative/library/ComponentLibrary.d.ts.map +1 -1
  122. package/dist/g0-generative/library/ComponentLibrary.js +10 -0
  123. package/dist/g0-generative/library/ComponentLibrary.test.js +135 -0
  124. package/dist/g0-generative/renderer/OpenUIRenderer.svelte +16 -56
  125. package/dist/g0-generative/renderer/OpenUIRenderer.svelte.d.ts.map +1 -1
  126. package/dist/g0-generative/renderer/OpenUIRenderer.test.js +143 -0
  127. package/dist/g0-geo/SovereignMap.svelte +13 -13
  128. package/dist/g0-geo/SovereignMap.svelte.d.ts.map +1 -1
  129. package/dist/index.d.ts +0 -1
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +7 -3
  132. package/dist/l0-layout/SectionSplitter.svelte +5 -5
  133. package/dist/l0-layout/block-writer/BlockContent.svelte +23 -22
  134. package/dist/l0-layout/block-writer/BlockContent.svelte.d.ts.map +1 -1
  135. package/dist/l0-layout/block-writer/BlockContent.test.js +47 -0
  136. package/dist/l0-layout/block-writer/BlockItem.svelte +6 -4
  137. package/dist/l0-layout/block-writer/markdown.js +11 -11
  138. package/dist/l0-layout/block-writer/markdown.test.js +81 -0
  139. package/dist/l0-layout/card/CompactCard.svelte +4 -3
  140. package/dist/l0-layout/card/StackedCard.svelte +87 -0
  141. package/dist/l0-layout/card/StackedCard.svelte.d.ts +9 -0
  142. package/dist/l0-layout/card/StackedCard.svelte.d.ts.map +1 -0
  143. package/dist/l0-layout/card/StackedCard.test.js +29 -0
  144. package/dist/l0-layout/grant/GrantCard.svelte +15 -5
  145. package/dist/l0-layout/grant/GrantCard.svelte.d.ts.map +1 -1
  146. package/dist/l0-layout/index.d.ts +3 -0
  147. package/dist/l0-layout/index.d.ts.map +1 -1
  148. package/dist/l0-layout/index.js +2 -0
  149. package/dist/l0-layout/kanban/KanbanBoard.svelte +246 -29
  150. package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts +28 -2
  151. package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts.map +1 -1
  152. package/dist/l0-layout/kanban/KanbanCard.svelte +175 -150
  153. package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts +16 -18
  154. package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts.map +1 -1
  155. package/dist/l0-layout/kanban/KanbanColumn.svelte +152 -78
  156. package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts +28 -7
  157. package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts.map +1 -1
  158. package/dist/l0-layout/kanban/index.d.ts +6 -0
  159. package/dist/l0-layout/kanban/index.d.ts.map +1 -0
  160. package/dist/l0-layout/kanban/index.js +3 -0
  161. package/dist/n0-node-graph/Node.svelte +2 -2
  162. package/dist/n0-node-graph/NodePalette.svelte +2 -2
  163. package/dist/n1-flow-canvas/FlowCanvas.svelte +50 -6
  164. package/dist/n1-flow-canvas/FlowCanvas.svelte.d.ts.map +1 -1
  165. package/dist/n1-flow-canvas/graph-state.test.js +69 -0
  166. package/dist/n1-flow-canvas/index.d.ts +2 -0
  167. package/dist/n1-flow-canvas/index.d.ts.map +1 -1
  168. package/dist/n1-flow-canvas/index.js +1 -0
  169. package/dist/n1-flow-canvas/pipeline-adapter.d.ts +37 -0
  170. package/dist/n1-flow-canvas/pipeline-adapter.d.ts.map +1 -0
  171. package/dist/n1-flow-canvas/pipeline-adapter.js +160 -0
  172. package/dist/n1-flow-canvas/utils.test.js +116 -0
  173. package/dist/n2-manifold-disk/ManifoldDisk.svelte +62 -35
  174. package/dist/n2-manifold-disk/ManifoldDisk.svelte.d.ts.map +1 -1
  175. package/dist/n3-force-graph/GraphTooltip.svelte +2 -2
  176. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +34 -29
  177. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
  178. package/dist/n4-adaptive-manifold/classifier.test.js +104 -0
  179. package/dist/n4-adaptive-manifold/n4-tokens.css +2 -2
  180. package/dist/n4-adaptive-manifold/types.d.ts +3 -0
  181. package/dist/n4-adaptive-manifold/types.d.ts.map +1 -1
  182. package/dist/p0-primitives/ThemeProvider.svelte +38 -18
  183. package/dist/p0-primitives/ThemeProvider.svelte.d.ts +6 -1
  184. package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
  185. package/dist/p0-primitives/canvas-theme.d.ts +33 -1
  186. package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
  187. package/dist/p0-primitives/canvas-theme.js +82 -17
  188. package/dist/p0-primitives/debug.d.ts +6 -0
  189. package/dist/p0-primitives/debug.d.ts.map +1 -0
  190. package/dist/p0-primitives/debug.js +21 -0
  191. package/dist/p0-primitives/index.d.ts +2 -1
  192. package/dist/p0-primitives/index.d.ts.map +1 -1
  193. package/dist/p0-primitives/index.js +1 -0
  194. package/dist/p0-primitives/theme-context.d.ts +9 -0
  195. package/dist/p0-primitives/theme-context.d.ts.map +1 -0
  196. package/dist/p0-primitives/theme-context.js +8 -0
  197. package/dist/p0-primitives/theme.d.ts.map +1 -1
  198. package/dist/p0-primitives/theme.js +11 -31
  199. package/dist/p0-primitives/tokens/ambient.css +76 -0
  200. package/dist/p0-primitives/tokens/tokens.css +140 -34
  201. package/dist/p0-primitives/utils/index.d.ts +4 -2
  202. package/dist/p0-primitives/utils/index.d.ts.map +1 -1
  203. package/dist/p0-primitives/utils/index.js +1 -0
  204. package/dist/p0-primitives/utils/reveal.d.ts +15 -0
  205. package/dist/p0-primitives/utils/reveal.d.ts.map +1 -0
  206. package/dist/p0-primitives/utils/reveal.js +29 -0
  207. package/dist/p0-primitives/utils/reveal.test.js +95 -0
  208. package/dist/s0-state/SyncStatus.svelte +2 -2
  209. package/dist/s0-state/ThemeStore.svelte.d.ts +3 -2
  210. package/dist/s0-state/ThemeStore.svelte.d.ts.map +1 -1
  211. package/dist/s0-state/ThemeStore.svelte.js +20 -1
  212. package/dist/s0-state/index.d.ts +2 -2
  213. package/dist/s0-state/index.d.ts.map +1 -1
  214. package/dist/s0-state/index.js +3 -0
  215. package/dist/s0-state/modal-stack-store.svelte.d.ts +27 -2
  216. package/dist/s0-state/modal-stack-store.svelte.d.ts.map +1 -1
  217. package/dist/s0-state/modal-stack-store.svelte.js +21 -2
  218. package/dist/showcase/Showcase.svelte +43 -34
  219. package/dist/showcase/Showcase.svelte.d.ts.map +1 -1
  220. package/dist/spatial/BspTilingCanvas.svelte +5 -5
  221. package/dist/spatial/BspTilingSimulation.test.js +88 -0
  222. package/dist/spatial/CameraController.test.js +120 -0
  223. package/dist/spatial/ForceCanvas.svelte +18 -13
  224. package/dist/spatial/ForceCanvas.svelte.d.ts.map +1 -1
  225. package/dist/spatial/ForceSimulation.svelte.d.ts.map +1 -1
  226. package/dist/spatial/ForceSimulation.svelte.js +33 -22
  227. package/dist/spatial/LodRenderer.svelte +14 -1
  228. package/dist/spatial/LodRenderer.svelte.d.ts.map +1 -1
  229. package/dist/spatial/ParticleAssembleMark.svelte +285 -0
  230. package/dist/spatial/ParticleAssembleMark.svelte.d.ts +24 -0
  231. package/dist/spatial/ParticleAssembleMark.svelte.d.ts.map +1 -0
  232. package/dist/spatial/SnapZoomCamera.svelte +23 -13
  233. package/dist/spatial/SnapZoomCamera.svelte.d.ts.map +1 -1
  234. package/dist/spatial/ZoneTiler.svelte +3 -2
  235. package/dist/spatial/ZoneTiler.test.js +90 -0
  236. package/dist/spatial/d3-types.d.ts +31 -0
  237. package/dist/spatial/d3-types.d.ts.map +1 -0
  238. package/dist/spatial/d3-types.js +19 -0
  239. package/dist/spatial/index.js +1 -0
  240. package/dist/spatial/particle-assemble-math.d.ts +22 -0
  241. package/dist/spatial/particle-assemble-math.d.ts.map +1 -0
  242. package/dist/spatial/particle-assemble-math.js +26 -0
  243. package/dist/spatial/particle-assemble-math.test.js +56 -0
  244. package/dist/ssr-import-clean.test.js +37 -0
  245. package/dist/t0-transport/fs.d.ts +12 -0
  246. package/dist/t0-transport/fs.d.ts.map +1 -0
  247. package/dist/t0-transport/fs.js +55 -0
  248. package/dist/t0-transport/index.d.ts +1 -0
  249. package/dist/t0-transport/index.d.ts.map +1 -1
  250. package/dist/t0-transport/index.js +1 -0
  251. package/dist/t0-transport/invoke.d.ts.map +1 -1
  252. package/dist/t0-transport/invoke.js +5 -2
  253. package/dist/t0-transport/quality.d.ts +12 -3
  254. package/dist/t0-transport/quality.d.ts.map +1 -1
  255. package/dist/t0-transport/quality.js +17 -4
  256. package/dist/t0-transport/substrate.svelte.d.ts +27 -0
  257. package/dist/t0-transport/substrate.svelte.d.ts.map +1 -0
  258. package/dist/t0-transport/substrate.svelte.js +55 -0
  259. package/dist/u0-primitives/LockIndicator.svelte +17 -15
  260. package/dist/u0-primitives/VerticalToolbar.svelte +25 -22
  261. package/dist/u0-primitives/accordion/Accordion.svelte +14 -12
  262. package/dist/u0-primitives/accordion/Accordion.svelte.d.ts +0 -7
  263. package/dist/u0-primitives/accordion/Accordion.svelte.d.ts.map +1 -1
  264. package/dist/u0-primitives/accordion/Accordion.test.js +5 -5
  265. package/dist/u0-primitives/animated-icon/AnimatedIcon.svelte +3 -3
  266. package/dist/u0-primitives/animated-icon/AnimatedIcon.test.js +82 -0
  267. package/dist/u0-primitives/avatar/Avatar.svelte +14 -14
  268. package/dist/u0-primitives/avatar/Avatar.test.js +81 -0
  269. package/dist/u0-primitives/badge/Badge.svelte +6 -4
  270. package/dist/u0-primitives/badge/Badge.test.js +10 -10
  271. package/dist/u0-primitives/badge/ValidityBadge.svelte +4 -27
  272. package/dist/u0-primitives/badge/ValidityBadge.test.js +9 -9
  273. package/dist/u0-primitives/button/Button.svelte +18 -13
  274. package/dist/u0-primitives/button/Button.svelte.d.ts +1 -0
  275. package/dist/u0-primitives/button/Button.svelte.d.ts.map +1 -1
  276. package/dist/u0-primitives/button/Button.test.js +11 -11
  277. package/dist/u0-primitives/card/Card.svelte +60 -32
  278. package/dist/u0-primitives/card/Card.svelte.d.ts.map +1 -1
  279. package/dist/u0-primitives/card/Card.test.js +86 -0
  280. package/dist/u0-primitives/command-palette/CommandPalette.svelte +75 -43
  281. package/dist/u0-primitives/command-palette/CommandPalette.svelte.d.ts.map +1 -1
  282. package/dist/u0-primitives/command-palette/CommandPalette.test.js +202 -0
  283. package/dist/u0-primitives/command-palette/commandStore.svelte.d.ts.map +1 -1
  284. package/dist/u0-primitives/command-palette/commandStore.svelte.js +2 -1
  285. package/dist/u0-primitives/dropdown/Dropdown.svelte +20 -25
  286. package/dist/u0-primitives/dropdown/Dropdown.test.js +1 -1
  287. package/dist/u0-primitives/grant-badge/GrantStatusBadge.svelte +2 -2
  288. package/dist/u0-primitives/index.d.ts +8 -0
  289. package/dist/u0-primitives/index.d.ts.map +1 -1
  290. package/dist/u0-primitives/index.js +9 -0
  291. package/dist/u0-primitives/input/Input.svelte +85 -23
  292. package/dist/u0-primitives/input/Input.svelte.d.ts +2 -10
  293. package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
  294. package/dist/u0-primitives/input/Input.test.js +82 -2
  295. package/dist/u0-primitives/live-dot/LiveDot.svelte +56 -0
  296. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts +11 -0
  297. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts.map +1 -0
  298. package/dist/u0-primitives/live-dot/LiveDot.test.js +41 -0
  299. package/dist/u0-primitives/live-dot/index.d.ts +3 -0
  300. package/dist/u0-primitives/live-dot/index.d.ts.map +1 -0
  301. package/dist/u0-primitives/live-dot/index.js +1 -0
  302. package/dist/u0-primitives/modal/Modal.svelte +64 -38
  303. package/dist/u0-primitives/modal/Modal.svelte.d.ts.map +1 -1
  304. package/dist/u0-primitives/modal/Modal.test.js +63 -15
  305. package/dist/u0-primitives/rsvp/RsvpReader.svelte +8 -8
  306. package/dist/u0-primitives/rsvp/RsvpReader.svelte.d.ts.map +1 -1
  307. package/dist/u0-primitives/spinner/Spinner.svelte +11 -79
  308. package/dist/u0-primitives/spinner/Spinner.svelte.d.ts.map +1 -1
  309. package/dist/u0-primitives/steps/Steps.svelte +20 -21
  310. package/dist/u0-primitives/surface-state/SurfaceState.svelte +190 -0
  311. package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts +15 -0
  312. package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts.map +1 -0
  313. package/dist/u0-primitives/tabs/Tabs.svelte +13 -11
  314. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte +94 -0
  315. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts +16 -0
  316. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts.map +1 -0
  317. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.test.js +48 -0
  318. package/dist/u0-primitives/theme-swatch-group/index.d.ts +3 -0
  319. package/dist/u0-primitives/theme-swatch-group/index.d.ts.map +1 -0
  320. package/dist/u0-primitives/theme-swatch-group/index.js +1 -0
  321. package/dist/u0-primitives/toggle/Toggle.svelte +22 -13
  322. package/dist/u0-primitives/tooltip/Tooltip.svelte +9 -9
  323. package/dist/u0-primitives/tooltip/Tooltip.test.js +12 -12
  324. package/dist/u0-primitives/web-components/button-component.d.ts +5 -1
  325. package/dist/u0-primitives/web-components/button-component.d.ts.map +1 -1
  326. package/dist/u0-primitives/web-components/button-component.js +72 -33
  327. package/dist/u0-primitives/web-components/index.d.ts +3 -0
  328. package/dist/u0-primitives/web-components/index.d.ts.map +1 -0
  329. package/dist/u0-primitives/web-components/index.js +2 -0
  330. package/dist/u0-primitives/web-components/input-component.d.ts +5 -1
  331. package/dist/u0-primitives/web-components/input-component.d.ts.map +1 -1
  332. package/dist/u0-primitives/web-components/input-component.js +56 -39
  333. package/dist/u0-primitives/web-components/web-components.test.js +96 -0
  334. package/dist/u0-primitives/window-frame/WindowFrame.svelte +87 -0
  335. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts +10 -0
  336. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts.map +1 -0
  337. package/dist/u0-primitives/window-frame/WindowFrame.test.js +31 -0
  338. package/dist/u0-primitives/window-frame/index.d.ts +3 -0
  339. package/dist/u0-primitives/window-frame/index.d.ts.map +1 -0
  340. package/dist/u0-primitives/window-frame/index.js +1 -0
  341. package/dist/v0-diagrams/MarkmapDiagram.test.js +49 -0
  342. package/dist/v0-diagrams/MermaidDiagram.svelte +21 -9
  343. package/dist/v0-diagrams/MermaidDiagram.svelte.d.ts.map +1 -1
  344. package/dist/v0-diagrams/MermaidDiagram.test.js +40 -0
  345. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte +11 -2
  346. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte.d.ts.map +1 -1
  347. package/package.json +57 -15
  348. package/src/n4-adaptive-manifold/n4-tokens.css +2 -2
  349. package/src/p0-primitives/tokens/ambient.css +76 -0
  350. package/src/p0-primitives/tokens/tokens.css +140 -34
  351. package/src/p0-primitives/tokens/tokens.json +55 -26
  352. package/dist/b0-app-shell/command-bar/CommandBar.svelte.d.ts.map +0 -1
  353. package/dist/fabric/input/CommandBar.svelte.d.ts.map +0 -1
  354. package/dist/stores/vaultStore.svelte +0 -14
  355. package/dist/stores/vaultStore.svelte.d.ts +0 -24
  356. package/dist/stores/vaultStore.svelte.d.ts.map +0 -1
  357. package/dist/tauri/index.d.ts +0 -3
  358. package/dist/tauri/index.d.ts.map +0 -1
  359. package/dist/tauri/index.js +0 -11
@@ -1,32 +1,15 @@
1
1
  <script lang="ts">
2
- /**
3
- * MarkdownEditor Component - Phase 2
4
- *
5
- * CodeMirror 6 integration with markdown support.
6
- * Includes external file change detection and find/replace.
7
- *
8
- * NOTE: This is a heavy stateful component (CodeMirror creates ~200+ DOM nodes).
9
- * Prefer {#if} over visibility:hidden when toggling to avoid mounting hidden
10
- * editor instances. Use visibility:hidden only for the outer chrome wrapper.
11
- */
12
-
13
- import { onMount, onDestroy, untrack } from 'svelte';
14
- import { EditorView, keymap, lineNumbers, highlightActiveLineGutter, highlightSpecialChars,
15
- drawSelection, dropCursor, rectangularSelection, crosshairCursor,
16
- highlightActiveLine, type ViewUpdate } from '@codemirror/view';
17
- import { EditorState, type Extension } from '@codemirror/state';
18
- import { markdown } from '@codemirror/lang-markdown';
19
- import { defaultKeymap, history, historyKeymap } from '@codemirror/commands';
20
- import { search } from '@codemirror/search';
21
- import { writeFile, readFile } from '../tauri';
22
- import { vaultStore } from '../stores/vaultStore.svelte';
2
+ import { untrack } from 'svelte';
3
+ import { EditorView } from '@codemirror/view';
23
4
  import FindReplaceDialog from './FindReplaceDialog.svelte';
24
- import { autoFormat } from './extensions/autoformat';
25
- import { expansion } from './extensions/expansion';
26
- import { autocomplete } from './extensions/autocomplete';
27
- import { spellcheck } from './extensions/spellcheck';
5
+ import CorrectionTooltip from './components/CorrectionTooltip.svelte';
6
+ import ExternalChangeDialog from './ExternalChangeDialog.svelte';
7
+ import DOMPurify from 'dompurify';
8
+ import { markdownToHtml } from './markdown-preview';
9
+ import { useCodeMirror } from './useCodeMirror';
10
+ import { useFilePersistence } from './useFilePersistence';
28
11
  import type { CompletionSource } from './extensions/autocomplete';
29
- import type { SpellCheckDictionary } from './extensions/spellcheck';
12
+ import type { SpellCheckCorrection, SpellCheckDictionary } from './extensions/spellcheck';
30
13
 
31
14
  interface Props {
32
15
  filePath: string | null;
@@ -34,642 +17,159 @@
34
17
  onChange?: (content: string) => void;
35
18
  onSave?: () => void;
36
19
  onClose?: () => void;
37
- onExternalChange?: (newContent: string) => void;
20
+ onExternalChange?: (content: string) => void;
38
21
  completionSource?: CompletionSource;
39
22
  spellCheckDictionary?: SpellCheckDictionary;
40
23
  }
41
24
 
42
- let { filePath, initialContent, onChange, onSave, onClose, onExternalChange, completionSource, spellCheckDictionary }: Props = $props();
25
+ interface ActiveCorrection extends SpellCheckCorrection { from: number; to: number; }
43
26
 
27
+ let { filePath, initialContent, onChange, onSave, onClose, onExternalChange, completionSource, spellCheckDictionary }: Props = $props();
44
28
  let content = $state(untrack(() => initialContent));
45
29
  let isDirty = $state(false);
46
30
  let isSaving = $state(false);
47
31
  let saveError = $state<string | null>(null);
48
32
  let showPreview = $state(false);
49
-
50
- // Auto-save
51
- let autoSaveTimeout: ReturnType<typeof setTimeout> | null = null;
52
-
53
- // External change detection
33
+ let showFindReplace = $state(false);
54
34
  let showExternalChangeDialog = $state(false);
55
- let externalChangeCheckInterval: ReturnType<typeof setInterval> | null = null;
56
- let isCheckingExternalChanges = $state(false);
57
-
58
- // CodeMirror instance
35
+ let activeCorrection = $state<ActiveCorrection | null>(null);
59
36
  let editorContainer: HTMLDivElement;
60
37
  let editorView = $state<EditorView | null>(null);
38
+ let autoSaveTimeout: ReturnType<typeof setTimeout> | null = null;
39
+ let stopExternalChangeMonitoring: (() => void) | null = null;
40
+ let lastKnownMtimeMs = $state<number | null>(null);
41
+ let isCheckingExternalChanges = $state(false);
61
42
 
62
- // Find/Replace state
63
- let showFindReplace = $state(false);
64
-
65
- // Computed
66
- let fileName = $derived(filePath?.split('/').pop() || filePath || 'Untitled');
67
- let saveStatus = $derived(
68
- isSaving ? 'Saving...' :
69
- saveError ? 'Error!' :
70
- isDirty ? 'Unsaved' : 'Saved'
71
- );
43
+ const filePersistence = useFilePersistence({
44
+ getFilePath: () => filePath,
45
+ getContent: () => content,
46
+ getIsDirty: () => isDirty,
47
+ getIsSaving: () => isSaving,
48
+ getIsCheckingExternalChanges: () => isCheckingExternalChanges,
49
+ getShowExternalChangeDialog: () => showExternalChangeDialog,
50
+ getLastKnownMtimeMs: () => lastKnownMtimeMs,
51
+ getEditorView: () => editorView,
52
+ setContent: (value) => { content = value; },
53
+ setIsDirty: (value) => { isDirty = value; },
54
+ setIsSaving: (value) => { isSaving = value; },
55
+ setSaveError: (value) => { saveError = value; },
56
+ setShowExternalChangeDialog: (value) => { showExternalChangeDialog = value; },
57
+ setIsCheckingExternalChanges: (value) => { isCheckingExternalChanges = value; },
58
+ setLastKnownMtimeMs: (value) => { lastKnownMtimeMs = value; },
59
+ onChange: (value) => onChange?.(value),
60
+ onSave: () => onSave?.(),
61
+ onExternalChange: (value) => onExternalChange?.(value)
62
+ });
72
63
 
73
- // Custom keymap for save and find/replace
74
- const saveKeymap = keymap.of([{
75
- key: 'Ctrl-s',
76
- mac: 'Cmd-s',
77
- run: () => {
78
- saveContent();
79
- return true;
80
- }
81
- }, {
82
- key: 'Ctrl-f',
83
- mac: 'Cmd-f',
84
- run: () => {
85
- openFindReplace(false);
86
- return true;
87
- }
88
- }, {
89
- key: 'Ctrl-Shift-f',
90
- mac: 'Cmd-Shift-f',
91
- run: () => {
92
- openFindReplace(true);
93
- return true;
64
+ const codeMirror = useCodeMirror({
65
+ getContainer: () => editorContainer,
66
+ getInitialContent: () => initialContent,
67
+ completionSource: () => completionSource,
68
+ spellCheckDictionary: () => spellCheckDictionary,
69
+ onCorrectionClick: (correction, _view, from, to) => { activeCorrection = { ...correction, from, to }; },
70
+ onSave: filePersistence.saveContent,
71
+ onFind: () => openFindReplace(),
72
+ onFindReplace: () => openFindReplace(),
73
+ onDocChanged: handleDocChanged,
74
+ onEditorReady: (view) => {
75
+ editorView = view;
76
+ stopExternalChangeMonitoring = filePersistence.startExternalChangeMonitoring();
77
+ },
78
+ onEditorDestroy: () => {
79
+ editorView = null;
80
+ if (autoSaveTimeout) { clearTimeout(autoSaveTimeout); autoSaveTimeout = null; }
81
+ stopExternalChangeMonitoring?.();
82
+ stopExternalChangeMonitoring = null;
94
83
  }
95
- }]);
84
+ });
96
85
 
97
- // Open find/replace dialog
98
- function openFindReplace(withReplace: boolean) {
86
+ let fileName = $derived(filePath?.split('/').pop() || filePath || 'Untitled');
87
+ let saveStatus = $derived(isSaving ? 'Saving...' : saveError ? 'Error!' : filePath && !filePersistence.persistenceAvailable ? 'Not persisted' : isDirty ? 'Unsaved' : 'Saved');
88
+
89
+ function openFindReplace() {
99
90
  showFindReplace = true;
100
- // The dialog will handle toggling replace mode via the button
101
- // We could pass this as a prop if we want to open directly to replace mode
102
91
  }
103
92
 
104
- // Close find/replace dialog
105
93
  function closeFindReplace() {
106
94
  showFindReplace = false;
107
- // Focus back to editor
108
- editorView?.focus();
109
- }
110
-
111
- // Custom dark theme matching Atelier - uses CSS variables via style injection
112
- const atelierTheme = EditorView.theme({
113
- '&': {
114
- backgroundColor: 'var(--bg-canvas)',
115
- color: 'var(--text-primary)',
116
- fontSize: '14px',
117
- fontFamily: "var(--font-mono)"
118
- },
119
- '.cm-content': {
120
- caretColor: 'var(--accent-primary)',
121
- padding: '16px'
122
- },
123
- '.cm-cursor': {
124
- borderLeftColor: 'var(--accent-primary)'
125
- },
126
- '.cm-activeLine': {
127
- backgroundColor: 'var(--accent-subtle)'
128
- },
129
- '.cm-gutters': {
130
- backgroundColor: 'var(--bg-app)',
131
- borderRight: '1px solid var(--border-subtle)',
132
- color: 'var(--text-tertiary)'
133
- },
134
- '.cm-activeLineGutter': {
135
- backgroundColor: 'var(--accent-subtle)',
136
- color: 'var(--accent-primary)'
137
- },
138
- '.cm-selectionBackground': {
139
- backgroundColor: 'var(--accent-subtle)'
140
- }
141
- }, { dark: true });
142
-
143
- // Check for external file changes
144
- async function checkExternalChanges() {
145
- if (!filePath || isCheckingExternalChanges || showExternalChangeDialog || !isDirty) return;
146
-
147
- isCheckingExternalChanges = true;
148
- try {
149
- const hasChanged = await vaultStore.hasFileChangedExternally(filePath);
150
- if (hasChanged) {
151
- showExternalChangeDialog = true;
152
- }
153
- } catch (err) {
154
- // Silently fail - file might not exist
155
- console.debug('External change check failed:', err);
156
- } finally {
157
- isCheckingExternalChanges = false;
158
- }
95
+ codeMirror.focus();
159
96
  }
160
97
 
161
- // Handle reload from disk
162
- async function handleReloadFromDisk() {
98
+ function handleDocChanged(newContent: string) {
99
+ content = newContent;
100
+ activeCorrection = null;
101
+ isDirty = true;
102
+ saveError = null;
103
+ onChange?.(newContent);
163
104
  if (!filePath) return;
164
-
165
- try {
166
- const newContent = await readFile(filePath);
167
-
168
- // Update editor content
169
- if (editorView) {
170
- editorView.dispatch({
171
- changes: {
172
- from: 0,
173
- to: editorView.state.doc.length,
174
- insert: newContent
175
- }
176
- });
177
- }
178
-
179
- content = newContent;
180
- isDirty = false;
181
- saveError = null;
182
-
183
- // Notify parent
184
- onExternalChange?.(newContent);
185
- onChange?.(newContent);
186
-
187
- // Update tracked state in vaultStore
188
- const modifiedAt = await vaultStore.getFileModifiedTime(filePath);
189
- vaultStore.updateFileState(filePath, newContent, modifiedAt);
190
- } catch (err) {
191
- console.error('Failed to reload file:', err);
192
- saveError = err instanceof Error ? err.message : 'Failed to reload file';
193
- } finally {
194
- showExternalChangeDialog = false;
195
- }
105
+ if (autoSaveTimeout) clearTimeout(autoSaveTimeout);
106
+ autoSaveTimeout = setTimeout(() => { void filePersistence.saveContent(); }, 800);
196
107
  }
197
108
 
198
- // Handle keep current (ignore external changes)
199
- function handleKeepCurrent() {
200
- showExternalChangeDialog = false;
201
- // Mark as dirty to indicate divergence from disk
202
- isDirty = true;
109
+ function handleAcceptCorrection(suggestion: string) {
110
+ if (!activeCorrection || !editorView) return;
111
+ editorView.dispatch({ changes: { from: activeCorrection.from, to: activeCorrection.to, insert: suggestion } });
112
+ activeCorrection = null;
203
113
  }
204
114
 
205
- // Minimal editor setup (replaces basicSetup)
206
- const minimalSetup: Extension[] = [
207
- lineNumbers(),
208
- highlightActiveLineGutter(),
209
- highlightSpecialChars(),
210
- history(),
211
- keymap.of(defaultKeymap),
212
- keymap.of(historyKeymap),
213
- drawSelection(),
214
- dropCursor(),
215
- rectangularSelection(),
216
- crosshairCursor(),
217
- highlightActiveLine(),
218
- ];
219
-
220
- // Initialize CodeMirror
221
- onMount(() => {
222
- const extensions: Extension[] = [
223
- minimalSetup,
224
- markdown(),
225
- atelierTheme,
226
- saveKeymap,
227
- autoFormat(),
228
- expansion(),
229
- ...(completionSource ? [autocomplete({ source: completionSource })] : []),
230
- ...(spellCheckDictionary ? [spellcheck(spellCheckDictionary)] : []),
231
- EditorView.updateListener.of((update: ViewUpdate) => {
232
- if (update.docChanged) {
233
- content = update.state.doc.toString();
234
- isDirty = true;
235
- saveError = null;
236
- onChange?.(content);
237
- // Auto-save: debounced 800ms after last keystroke
238
- if (filePath) {
239
- if (autoSaveTimeout) clearTimeout(autoSaveTimeout);
240
- autoSaveTimeout = setTimeout(() => saveContent(), 800);
241
- }
242
- }
243
- })
244
- ];
245
-
246
- const state = EditorState.create({
247
- doc: initialContent,
248
- extensions
249
- });
115
+ function handleAddWordToDictionary() {
116
+ if (!activeCorrection) return;
117
+ spellCheckDictionary?.addWord(activeCorrection.original);
118
+ activeCorrection = null;
119
+ }
250
120
 
251
- editorView = new EditorView({
252
- state,
253
- parent: editorContainer
254
- });
121
+ function handleDismissCorrection() {
122
+ activeCorrection = null;
123
+ }
255
124
 
256
- // Start external change detection polling (every 2 seconds)
257
- externalChangeCheckInterval = setInterval(checkExternalChanges, 2000);
258
-
259
- // Also check when window regains focus
260
- const handleWindowFocus = () => {
261
- checkExternalChanges();
262
- };
263
- window.addEventListener('focus', handleWindowFocus);
264
-
265
- return () => {
266
- window.removeEventListener('focus', handleWindowFocus);
267
- if (externalChangeCheckInterval) {
268
- clearInterval(externalChangeCheckInterval);
269
- externalChangeCheckInterval = null;
270
- }
271
- };
272
- });
125
+ function handleKeepCurrent() {
126
+ filePersistence.keepCurrent();
127
+ }
273
128
 
274
- // Cleanup
275
- onDestroy(() => {
276
- editorView?.destroy();
277
- if (autoSaveTimeout) clearTimeout(autoSaveTimeout);
278
- if (externalChangeCheckInterval) {
279
- clearInterval(externalChangeCheckInterval);
280
- externalChangeCheckInterval = null;
281
- }
282
- });
129
+ function togglePreview() {
130
+ showPreview = !showPreview;
131
+ }
283
132
 
284
- // Update content when file changes
285
133
  $effect(() => {
286
- if (editorView && initialContent !== editorView.state.doc.toString()) {
287
- editorView.dispatch({
288
- changes: {
289
- from: 0,
290
- to: editorView.state.doc.length,
291
- insert: initialContent
292
- }
293
- });
134
+ if (editorView) {
135
+ codeMirror.syncContent(initialContent);
294
136
  content = initialContent;
295
137
  isDirty = false;
296
138
  saveError = null;
297
139
  }
298
140
  });
299
-
300
- // Save file
301
- async function saveContent() {
302
- if (!isDirty || isSaving || !filePath) return;
303
-
304
- isSaving = true;
305
- saveError = null;
306
-
307
- try {
308
- await writeFile(filePath, content);
309
- isDirty = false;
310
- onSave?.();
311
-
312
- // Update tracked modification time after save
313
- const modifiedAt = await vaultStore.getFileModifiedTime(filePath);
314
- vaultStore.updateFileState(filePath, content, modifiedAt);
315
- } catch (err) {
316
- saveError = err instanceof Error ? err.message : String(err);
317
- console.error('Failed to save file:', err);
318
- } finally {
319
- isSaving = false;
320
- }
321
- }
322
-
323
- function togglePreview() {
324
- showPreview = !showPreview;
325
- }
326
-
327
- // Simple markdown preview
328
- function markdownToHtml(md: string): string {
329
- return md
330
- .replace(/^### (.*$)/gim, '<h3>$1</h3>')
331
- .replace(/^## (.*$)/gim, '<h2>$1</h2>')
332
- .replace(/^# (.*$)/gim, '<h1>$1</h1>')
333
- .replace(/\*\*(.*?)\*\*/gim, '<strong>$1</strong>')
334
- .replace(/\*(.*?)\*/gim, '<em>$1</em>')
335
- .replace(/`([^`]+)`/gim, '<code>$1</code>')
336
- .replace(/^- (.*$)/gim, '<li>$1</li>')
337
- .replace(/(<li>.*<\/li>)/s, '<ul>$1</ul>')
338
- .replace(/\n/gim, '<br>');
339
- }
340
141
  </script>
341
142
 
342
143
  <div class="markdown-editor" data-testid="markdown-editor">
343
- <!-- Header -->
344
144
  <div class="editor-header" data-testid="editor-header">
345
145
  <div class="file-info">
346
146
  <span class="file-name" data-testid="editor-filename">{fileName}</span>
347
- <span class="save-status" class:dirty={isDirty} class:error={saveError} data-testid="save-status">
348
- {saveStatus}
349
- </span>
147
+ <span class="save-status" class:dirty={isDirty} class:error={!!saveError} data-testid="save-status">{saveStatus}</span>
350
148
  </div>
351
149
  <div class="editor-actions">
352
- <button
353
- class="action-btn"
354
- class:active={showPreview}
355
- onclick={togglePreview}
356
- >
357
- Preview
358
- </button>
359
- {#if onClose}
360
- <button
361
- class="action-btn"
362
- onclick={onClose}
363
- >
364
- Close
365
- </button>
366
- {/if}
367
- {#if !filePath}
368
- <button
369
- class="action-btn primary"
370
- onclick={saveContent}
371
- disabled={!isDirty || isSaving}
372
- >
373
- {isSaving ? 'Saving...' : 'Save'}
374
- </button>
150
+ <button class="action-btn" class:active={showPreview} onclick={togglePreview}>Preview</button>
151
+ {#if onClose}<button class="action-btn" onclick={onClose}>Close</button>{/if}
152
+ {#if filePath && filePersistence.persistenceAvailable}
153
+ <button class="action-btn primary" onclick={filePersistence.saveContent} disabled={!isDirty || isSaving}>{isSaving ? 'Saving...' : 'Save'}</button>
375
154
  {/if}
376
155
  </div>
377
156
  </div>
378
-
379
- <!-- Body -->
380
157
  <div class="editor-body" class:split={showPreview}>
381
158
  <div class="editor-pane" bind:this={editorContainer}>
382
- <!-- Find/Replace Dialog -->
383
- <FindReplaceDialog
384
- {editorView}
385
- isOpen={showFindReplace}
386
- onClose={closeFindReplace}
387
- />
159
+ <FindReplaceDialog {editorView} isOpen={showFindReplace} onClose={closeFindReplace} />
388
160
  </div>
389
-
390
161
  {#if showPreview}
391
- <div class="preview-pane">
392
- <div class="preview-content">
393
- {@html markdownToHtml(content)}
394
- </div>
395
- </div>
162
+ <div class="preview-pane"><div class="preview-content">{@html DOMPurify.sanitize(markdownToHtml(content))}</div></div>
396
163
  {/if}
397
164
  </div>
398
-
399
- {#if saveError}
400
- <div class="error-banner">
401
- Failed to save: {saveError}
402
- </div>
165
+ {#if activeCorrection}
166
+ <CorrectionTooltip correction={{ original: activeCorrection.original, suggestions: activeCorrection.suggestions }} position={activeCorrection.position} onAccept={handleAcceptCorrection} onDismiss={handleDismissCorrection} onAddToDictionary={handleAddWordToDictionary} />
403
167
  {/if}
168
+ {#if saveError}<div class="error-banner">Failed to save: {saveError}</div>{/if}
404
169
  </div>
170
+ {#if showExternalChangeDialog}<ExternalChangeDialog onReload={filePersistence.reloadFromDisk} onKeepCurrent={handleKeepCurrent} />{/if}
405
171
 
406
- <!-- External Change Detection Dialog -->
407
- {#if showExternalChangeDialog}
408
- <div class="dialog-overlay">
409
- <div class="dialog">
410
- <div class="dialog-header">
411
- <h3>File Changed Externally</h3>
412
- </div>
413
- <div class="dialog-body">
414
- <p>This file has been modified outside of Atelier.</p>
415
- <p>Would you like to reload it from disk, or keep your current changes?</p>
416
- </div>
417
- <div class="dialog-footer">
418
- <button
419
- class="action-btn"
420
- onclick={handleKeepCurrent}
421
- >
422
- Keep Current
423
- </button>
424
- <button
425
- class="action-btn primary"
426
- onclick={handleReloadFromDisk}
427
- >
428
- Reload from Disk
429
- </button>
430
- </div>
431
- </div>
432
- </div>
433
- {/if}
434
-
435
- <style>
436
- .markdown-editor {
437
- display: flex;
438
- flex-direction: column;
439
- height: 100%;
440
- background: var(--bg-canvas, #141414);
441
- color: var(--text-primary, #f5f2eb);
442
- }
443
-
444
- .editor-header {
445
- display: flex;
446
- align-items: center;
447
- justify-content: space-between;
448
- padding: 12px 16px;
449
- border-bottom: 1px solid var(--border-subtle, #2a2a2a);
450
- background: var(--bg-panel, #1a1a1a);
451
- }
452
-
453
- .file-info {
454
- display: flex;
455
- align-items: center;
456
- gap: var(--space-3);
457
- }
458
-
459
- .file-name {
460
- font-weight: 500;
461
- font-size: 14px;
462
- }
463
-
464
- .save-status {
465
- font-size: 12px;
466
- color: var(--text-tertiary, #6b6b6b);
467
- }
468
-
469
- .save-status.dirty {
470
- color: var(--accent-primary, var(--color-accent));
471
- }
472
-
473
- .save-status.error {
474
- color: var(--color-error, #ef4444);
475
- }
476
-
477
- .editor-actions {
478
- display: flex;
479
- gap: var(--space-2);
480
- }
481
-
482
- .action-btn {
483
- padding: 6px 12px;
484
- border: 1px solid var(--border-subtle, #2a2a2a);
485
- background: var(--bg-panel-elevated, #252525);
486
- color: var(--text-secondary, #a0a0a0);
487
- border-radius: var(--radius-sm, 4px);
488
- cursor: pointer;
489
- font-size: 13px;
490
- transition: all 0.15s ease;
491
- }
492
-
493
- .action-btn:hover {
494
- background: var(--border-subtle);
495
- color: var(--text-primary, #f5f2eb);
496
- }
497
-
498
- .action-btn.active {
499
- background: var(--accent-subtle, var(--color-accent-muted));
500
- color: var(--accent-primary, var(--color-accent));
501
- border-color: var(--accent-primary, var(--color-accent));
502
- }
503
-
504
- .action-btn.primary {
505
- background: var(--accent-primary, var(--color-accent));
506
- color: white;
507
- border-color: var(--accent-primary, var(--color-accent));
508
- }
509
-
510
- .action-btn.primary:hover {
511
- background: var(--accent-hover, #c9843d);
512
- }
513
-
514
- .action-btn:disabled {
515
- opacity: 0.5;
516
- cursor: not-allowed;
517
- }
518
-
519
- .editor-body {
520
- display: flex;
521
- flex: 1;
522
- overflow: hidden;
523
- }
524
-
525
- .editor-body.split .editor-pane,
526
- .editor-body.split .preview-pane {
527
- flex: 1;
528
- width: 50%;
529
- }
530
-
531
- .editor-pane {
532
- flex: 1;
533
- overflow: hidden;
534
- position: relative;
535
- :global(.cm-editor) {
536
- height: 100%;
537
- }
538
- :global(.cm-scroller) {
539
- overflow: auto;
540
- }
541
- }
542
-
543
- .preview-pane {
544
- border-left: 1px solid var(--border-subtle, #2a2a2a);
545
- overflow-y: auto;
546
- background: var(--bg-panel, #1a1a1a);
547
- }
548
-
549
- .preview-content {
550
- padding: 16px;
551
- font-size: 14px;
552
- line-height: 1.6;
553
- }
554
-
555
- .preview-content :global(h1),
556
- .preview-content :global(h2),
557
- .preview-content :global(h3) {
558
- margin-top: 0;
559
- margin-bottom: 16px;
560
- }
561
-
562
- .preview-content :global(p) {
563
- margin-bottom: 12px;
564
- }
565
-
566
- .preview-content :global(code) {
567
- background: var(--bg-panel-elevated, #252525);
568
- padding: 2px 6px;
569
- border-radius: var(--radius-sm, 3px);
570
- font-family: var(--font-mono, 'JetBrains Mono', monospace);
571
- font-size: 0.9em;
572
- }
573
-
574
- .preview-content :global(pre) {
575
- background: var(--bg-panel-elevated, #252525);
576
- padding: 12px;
577
- border-radius: var(--radius-md, 6px);
578
- overflow-x: auto;
579
- margin-bottom: 12px;
580
- }
581
-
582
- .preview-content :global(pre code) {
583
- background: none;
584
- padding: 0;
585
- }
586
-
587
- .preview-content :global(ul),
588
- .preview-content :global(ol) {
589
- margin-bottom: 12px;
590
- padding-left: 24px;
591
- }
592
-
593
- .preview-content :global(li) {
594
- margin-bottom: 4px;
595
- }
596
-
597
- .preview-content :global(blockquote) {
598
- border-left: 3px solid var(--accent-primary);
599
- padding-left: 12px;
600
- margin-left: 0;
601
- margin-bottom: 12px;
602
- color: var(--text-secondary);
603
- }
604
-
605
- .preview-content :global(a) {
606
- color: var(--accent-primary);
607
- text-decoration: none;
608
- }
609
-
610
- .preview-content :global(a:hover) {
611
- text-decoration: underline;
612
- }
613
-
614
- .error-banner {
615
- padding: 8px 16px;
616
- background: var(--color-error, #ef4444);
617
- color: white;
618
- font-size: 13px;
619
- }
620
-
621
- /* Dialog Styles */
622
- .dialog-overlay {
623
- position: fixed;
624
- inset: 0;
625
- background: rgba(0, 0, 0, 0.7);
626
- display: flex;
627
- align-items: center;
628
- justify-content: center;
629
- z-index: 1000;
630
- }
631
-
632
- .dialog {
633
- background: var(--bg-panel, #1a1a1a);
634
- border: 1px solid var(--border-subtle, #2a2a2a);
635
- border-radius: var(--radius-lg, 8px);
636
- min-width: 400px;
637
- max-width: 500px;
638
- box-shadow: var(--shadow-lg, 0 10px 40px rgba(0,0,0,0.5));
639
- }
640
-
641
- .dialog-header {
642
- padding: 16px 20px;
643
- border-bottom: 1px solid var(--border-subtle, #2a2a2a);
644
- }
645
-
646
- .dialog-header h3 {
647
- margin: 0;
648
- font-size: 16px;
649
- font-weight: 600;
650
- color: var(--text-primary, #f5f2eb);
651
- }
652
-
653
- .dialog-body {
654
- padding: 20px;
655
- }
656
-
657
- .dialog-body p {
658
- margin: 0 0 12px 0;
659
- color: var(--text-secondary, #a0a0a0);
660
- font-size: 14px;
661
- line-height: 1.5;
662
- }
663
-
664
- .dialog-body p:last-child {
665
- margin-bottom: 0;
666
- }
667
-
668
- .dialog-footer {
669
- display: flex;
670
- justify-content: flex-end;
671
- gap: var(--space-3);
672
- padding: 16px 20px;
673
- border-top: 1px solid var(--border-subtle, #2a2a2a);
674
- }
172
+ <!-- svelte-ignore css_unused_selector -->
173
+ <style>
174
+ .markdown-editor{display:flex;flex-direction:column;height:100%;background:var(--color-bg-canvas,#141414);color:var(--color-text-primary,#f5f2eb)}.editor-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--border-subtle,#2a2a2a);background:var(--color-bg-panel,#1a1a1a)}.file-info{display:flex;align-items:center;gap:var(--space-3)}.file-name{font-weight:500;font-size:14px}.save-status{font-size:12px;color:var(--color-text-tertiary,#6b6b6b)}.save-status.dirty{color:var(--color-accent)}.save-status.error{color:var(--color-error,#ef4444)}.editor-actions{display:flex;gap:var(--space-2)}.action-btn{padding:6px 12px;border:1px solid var(--border-subtle,#2a2a2a);background:var(--color-bg-panel-elevated,#252525);color:var(--color-text-secondary,#a0a0a0);border-radius:var(--radius-sm,4px);cursor:pointer;font-size:13px;transition:all .15s ease}.action-btn:hover{background:var(--border-subtle);color:var(--color-text-primary,#f5f2eb)}.action-btn.active{background:var(--color-accent-subtle);color:var(--color-accent);border-color:var(--color-accent)}.action-btn.primary{background:var(--color-accent);color:white;border-color:var(--color-accent)}.action-btn.primary:hover{background:var(--color-accent-hover,#c9843d)}.action-btn:disabled{opacity:.5;cursor:not-allowed}.editor-body{display:flex;flex:1;overflow:hidden}.editor-body.split>:is(.editor-pane,.preview-pane){flex:1;width:50%}.editor-pane{flex:1;overflow:hidden;position:relative}:global(.cm-editor){height:100%}:global(.cm-scroller){overflow:auto}.preview-pane{border-left:1px solid var(--border-subtle,#2a2a2a);overflow-y:auto;background:var(--color-bg-panel,#1a1a1a)}.preview-content{padding:16px;font-size:14px;line-height:1.6}.preview-content :is(h1,h2,h3){margin-top:0;margin-bottom:16px}.preview-content p,.preview-content ul,.preview-content ol,.preview-content blockquote{margin-bottom:12px}.preview-content ul,.preview-content ol{padding-left:24px}.preview-content li{margin-bottom:4px}.preview-content code{background:var(--color-bg-panel-elevated,#252525);padding:2px 6px;border-radius:var(--radius-sm,3px);font-family:var(--font-mono,'JetBrains Mono',monospace);font-size:.9em}.preview-content pre{background:var(--color-bg-panel-elevated,#252525);padding:12px;border-radius:var(--radius-md,6px);overflow-x:auto;margin-bottom:12px}.preview-content pre code{background:none;padding:0}.preview-content blockquote{border-left:3px solid var(--color-accent);padding-left:12px;margin-left:0;color:var(--color-text-secondary)}.preview-content a{color:var(--color-accent);text-decoration:none}.preview-content a:hover{text-decoration:underline}.error-banner{padding:8px 16px;background:var(--color-error,#ef4444);color:white;font-size:13px}
675
175
  </style>