@heyramzi/ui 2.11.1 → 2.11.2

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 (266) hide show
  1. package/dist/agents/helpers.js +38 -38
  2. package/dist/agents/page-state.js +49 -50
  3. package/dist/agents/vendor/color.js +146 -127
  4. package/dist/agents/vendor/draw.js +617 -508
  5. package/dist/agents/vendor/engine.js +698 -599
  6. package/dist/agents/vendor/mesh.js +653 -683
  7. package/dist/agents/vendor/plastic.js +3913 -3112
  8. package/dist/agents/vendor/presets.js +163 -164
  9. package/dist/agents/vendor/shapes.js +21 -20
  10. package/dist/agents/vendor/ticker.js +41 -42
  11. package/dist/agents/vendor/types.js +1 -0
  12. package/dist/agents/vendor/wear.js +1421 -1448
  13. package/dist/ai/confirmation/confirmation-context.svelte.js +6 -6
  14. package/dist/ai/confirmation/index.js +3 -1
  15. package/dist/ai/index.js +33 -0
  16. package/dist/ai/prompt-input/index.js +3 -1
  17. package/dist/ai/reasoning/index.js +3 -1
  18. package/dist/ai/reasoning/reasoning-context.svelte.js +6 -6
  19. package/dist/ai/suggestion/index.js +3 -1
  20. package/dist/ai/typing-dots/index.js +3 -1
  21. package/dist/animations/text-swap.js +24 -24
  22. package/dist/brand/index.js +54 -48
  23. package/dist/canvas/card/resize.js +5 -3
  24. package/dist/canvas/edges/edge-path.js +255 -242
  25. package/dist/canvas/editor/context-menu.js +39 -36
  26. package/dist/canvas/editor/dispatch.svelte.js +154 -151
  27. package/dist/canvas/editor/editor-context.js +7 -2
  28. package/dist/canvas/editor/editor-mode.js +1 -0
  29. package/dist/canvas/editor/frame.js +73 -76
  30. package/dist/canvas/editor/hand-context.js +5 -2
  31. package/dist/canvas/editor/history-core.js +163 -191
  32. package/dist/canvas/editor/keymap.js +95 -169
  33. package/dist/canvas/editor/layout-actions.js +143 -144
  34. package/dist/canvas/editor/lock.js +52 -51
  35. package/dist/canvas/editor/rebase.js +217 -240
  36. package/dist/canvas/editor/style.js +132 -137
  37. package/dist/canvas/editor/text-field-context.js +7 -2
  38. package/dist/canvas/editor/z-order.js +65 -70
  39. package/dist/canvas/headless/alignment.js +22 -16
  40. package/dist/canvas/headless/break-apart-find.js +286 -279
  41. package/dist/canvas/headless/break-apart-pieces.js +62 -58
  42. package/dist/canvas/headless/break-apart-plan.js +299 -325
  43. package/dist/canvas/headless/break-apart-style.js +75 -70
  44. package/dist/canvas/headless/break-apart.js +188 -181
  45. package/dist/canvas/headless/canvas-cleanup.js +78 -58
  46. package/dist/canvas/headless/edge-anchors.js +115 -116
  47. package/dist/canvas/headless/edge-memo.js +24 -22
  48. package/dist/canvas/headless/edge-serialization.js +17 -27
  49. package/dist/canvas/headless/figure-geometry.js +232 -264
  50. package/dist/canvas/headless/fit-viewport.js +84 -67
  51. package/dist/canvas/headless/grid.js +88 -86
  52. package/dist/canvas/headless/icon-node.js +44 -36
  53. package/dist/canvas/headless/index.js +1 -0
  54. package/dist/canvas/headless/linkify.js +17 -19
  55. package/dist/canvas/headless/pen-marks.js +101 -95
  56. package/dist/canvas/headless/sketch.js +231 -209
  57. package/dist/canvas/headless/snap-guides.js +99 -83
  58. package/dist/canvas/headless/svg-figure.js +133 -117
  59. package/dist/canvas/headless/table-layout.js +146 -107
  60. package/dist/canvas/index.js +2 -0
  61. package/dist/canvas/lod/lod-mode.svelte.js +20 -18
  62. package/dist/canvas/lod/render-all.svelte.js +36 -39
  63. package/dist/canvas/ops/arrange.js +78 -71
  64. package/dist/canvas/ops/ops.js +260 -255
  65. package/dist/canvas/pen/colors.js +37 -35
  66. package/dist/canvas/pen/eraser.js +28 -27
  67. package/dist/canvas/pen/geometry.js +120 -130
  68. package/dist/canvas/pen/index.js +1 -0
  69. package/dist/canvas/pen/ops.js +11 -11
  70. package/dist/canvas/pen/pen-session.js +150 -159
  71. package/dist/canvas/pen/plugin.js +107 -104
  72. package/dist/canvas/pen/shapes.js +73 -68
  73. package/dist/canvas/pen/stroke-path.js +32 -30
  74. package/dist/canvas/pen/types.js +21 -21
  75. package/dist/canvas/pen/ui.js +10 -8
  76. package/dist/canvas/plugin.js +46 -46
  77. package/dist/canvas/screen/glyphs.js +12 -11
  78. package/dist/canvas/screen/labels.js +22 -22
  79. package/dist/canvas/screen/parts.js +98 -111
  80. package/dist/canvas/screen/plugin.js +47 -56
  81. package/dist/canvas/screen/types.js +30 -35
  82. package/dist/canvas/screen/ui.js +7 -7
  83. package/dist/canvas/test-utils.js +14 -14
  84. package/dist/canvas/types.js +1 -0
  85. package/dist/canvas/ui/forward-wheel.js +24 -25
  86. package/dist/canvas/ui/icons.js +64 -131
  87. package/dist/canvas/ui/place-panel.js +58 -49
  88. package/dist/canvas/ui/shortcut-tip.js +14 -12
  89. package/dist/canvas/ui/tools.js +300 -385
  90. package/dist/charts/dashboard/chart.js +4 -0
  91. package/dist/charts/dashboard/data-table.js +11 -0
  92. package/dist/charts/dashboard/windows.js +8 -3
  93. package/dist/charts/edge-fade.js +10 -5
  94. package/dist/charts/hover-band.js +16 -11
  95. package/dist/charts/index.js +0 -1
  96. package/dist/charts/motion.js +11 -7
  97. package/dist/charts/primitives/chart-utils.js +12 -12
  98. package/dist/components/copy/clipboard.js +32 -32
  99. package/dist/components/copy/copied.svelte.js +31 -23
  100. package/dist/components/data-table/data-table.js +39 -39
  101. package/dist/components/docs/index.js +4 -0
  102. package/dist/components/docs/scroll-spy.svelte.js +73 -68
  103. package/dist/components/list-page/filter-section.js +4 -1
  104. package/dist/components/list-page/index.js +2 -0
  105. package/dist/components/list-page/list-table.js +7 -2
  106. package/dist/components/list-page/queue-rail.js +14 -0
  107. package/dist/components/list-page/section-host.js +4 -2
  108. package/dist/components/list-page/step.js +4 -3
  109. package/dist/components/list-page/types.js +1 -0
  110. package/dist/components/picker/trigger.js +48 -30
  111. package/dist/components/picker/types.js +1 -0
  112. package/dist/components/segmented/collapse.js +38 -27
  113. package/dist/components/segmented/index.js +8 -0
  114. package/dist/components/segmented/segmented.js +67 -42
  115. package/dist/components/star-rating-input/index.js +3 -1
  116. package/dist/components/table-view/types.js +1 -0
  117. package/dist/components/tags-input/tags.js +81 -69
  118. package/dist/components/theme/index.js +4 -0
  119. package/dist/components/toolbar/index.js +4 -0
  120. package/dist/components/toolbar/toolbar-trigger.js +14 -1
  121. package/dist/editor/anchors.js +17 -13
  122. package/dist/editor/block-id.js +52 -51
  123. package/dist/editor/block-ops.js +108 -80
  124. package/dist/editor/doc-blocks.js +155 -166
  125. package/dist/editor/extensions.js +139 -180
  126. package/dist/editor/index.js +4 -0
  127. package/dist/editor/markdown-test-helpers.js +4 -2
  128. package/dist/editor/markdown.js +420 -408
  129. package/dist/editor/serializer.js +204 -200
  130. package/dist/editor/slash-items.js +89 -101
  131. package/dist/editor/youtube-url.js +25 -20
  132. package/dist/effects/animated-beam/path-calculator.svelte.js +43 -38
  133. package/dist/effects/animated-beam/types.js +1 -0
  134. package/dist/effects/border-beam/css.js +92 -78
  135. package/dist/effects/border-beam/presets.js +1705 -1720
  136. package/dist/effects/border-beam/register-properties.js +43 -33
  137. package/dist/effects/border-beam/types.js +1 -0
  138. package/dist/effects/image-comparison/compare.js +3 -2
  139. package/dist/effects/image-reveal/types.js +1 -0
  140. package/dist/effects/magnetic/magnetic.js +58 -52
  141. package/dist/effects/reveal/observe.js +50 -40
  142. package/dist/effects/reveal/types.js +1 -0
  143. package/dist/effects/shader-gradient/color.js +36 -29
  144. package/dist/effects/shader-gradient/renderer.js +384 -295
  145. package/dist/effects/shader-gradient/shaders.js +31 -0
  146. package/dist/effects/shader-gradient/types.js +1 -0
  147. package/dist/icons/apple-symbol-exports.js +99 -124
  148. package/dist/icons/sf-symbols.js +357 -461
  149. package/dist/icons/trades.js +43 -28
  150. package/dist/inbox/index.js +1 -0
  151. package/dist/inbox/logic.js +126 -122
  152. package/dist/inbox/types.js +43 -43
  153. package/dist/lib/arrive.js +19 -12
  154. package/dist/lib/icon-types.js +1 -0
  155. package/dist/lib/initials.js +16 -10
  156. package/dist/lib/layout.js +5 -0
  157. package/dist/lib/panel.js +13 -0
  158. package/dist/lib/result.js +22 -22
  159. package/dist/lib/sliding-pill.js +59 -44
  160. package/dist/lib/theme-transition.js +43 -43
  161. package/dist/lib/tone.js +31 -24
  162. package/dist/lib/utils.js +3 -1
  163. package/dist/onboarding/define-tours.js +24 -23
  164. package/dist/onboarding/onboarding.svelte.js +16 -12
  165. package/dist/onboarding/pick.js +10 -6
  166. package/dist/onboarding/stores.js +40 -41
  167. package/dist/onboarding/wait.js +24 -23
  168. package/dist/panel/side-panel-types.js +1 -0
  169. package/dist/record/demo-data.js +459 -486
  170. package/dist/record/fields.js +129 -131
  171. package/dist/record/format.js +70 -82
  172. package/dist/record/gutter.js +1 -0
  173. package/dist/record/kinds.js +95 -105
  174. package/dist/record/logic.js +238 -219
  175. package/dist/record/types.js +49 -48
  176. package/dist/shadcn/accordion/index.js +3 -1
  177. package/dist/shadcn/alert/index.js +3 -1
  178. package/dist/shadcn/alert-dialog/index.js +3 -1
  179. package/dist/shadcn/attachment/index.js +3 -1
  180. package/dist/shadcn/avatar/index.js +3 -1
  181. package/dist/shadcn/breadcrumb/index.js +3 -1
  182. package/dist/shadcn/bubble/index.js +3 -1
  183. package/dist/shadcn/button/index.js +3 -1
  184. package/dist/shadcn/calendar/index.js +3 -1
  185. package/dist/shadcn/card/index.js +3 -1
  186. package/dist/shadcn/checkbox/index.js +3 -1
  187. package/dist/shadcn/code-block/index.js +3 -1
  188. package/dist/shadcn/collapsible/index.js +3 -1
  189. package/dist/shadcn/command/index.js +4 -1
  190. package/dist/shadcn/context-menu/index.js +3 -1
  191. package/dist/shadcn/dialog/index.js +3 -1
  192. package/dist/shadcn/dropdown-menu/menu-item.js +40 -20
  193. package/dist/shadcn/empty/index.js +3 -1
  194. package/dist/shadcn/field/index.js +3 -1
  195. package/dist/shadcn/hooks/highlighter.js +77 -75
  196. package/dist/shadcn/hooks/is-mobile.svelte.js +3 -3
  197. package/dist/shadcn/hooks/use-highlighted-code.svelte.js +62 -62
  198. package/dist/shadcn/input/index.js +3 -1
  199. package/dist/shadcn/kbd/index.js +3 -1
  200. package/dist/shadcn/label/index.js +3 -1
  201. package/dist/shadcn/marker/index.js +3 -1
  202. package/dist/shadcn/message/index.js +3 -1
  203. package/dist/shadcn/message-scroller/index.js +3 -1
  204. package/dist/shadcn/popover/index.js +3 -1
  205. package/dist/shadcn/progress/index.js +3 -1
  206. package/dist/shadcn/progress/tone.js +8 -7
  207. package/dist/shadcn/radio-group/index.js +3 -1
  208. package/dist/shadcn/scroll-area/index.js +3 -1
  209. package/dist/shadcn/select/index.js +3 -1
  210. package/dist/shadcn/separator/index.js +3 -1
  211. package/dist/shadcn/sheet/index.js +3 -1
  212. package/dist/shadcn/sidebar/context.svelte.js +42 -28
  213. package/dist/shadcn/sidebar/index.js +3 -1
  214. package/dist/shadcn/skeleton/index.js +3 -1
  215. package/dist/shadcn/slider/index.js +3 -1
  216. package/dist/shadcn/switch/index.js +3 -1
  217. package/dist/shadcn/table/index.js +3 -1
  218. package/dist/shadcn/tabs/index.js +3 -1
  219. package/dist/shadcn/textarea/index.js +3 -1
  220. package/dist/shadcn/toggle/index.js +3 -1
  221. package/dist/shadcn/toggle-group/index.js +3 -1
  222. package/dist/shadcn/tooltip/context.js +7 -2
  223. package/dist/shadcn/tooltip/index.js +3 -1
  224. package/dist/shadcn/trace/index.js +3 -1
  225. package/dist/slides/bridges.js +65 -59
  226. package/dist/slides/deck-controller.svelte.js +210 -207
  227. package/dist/slides/export/capture.js +66 -71
  228. package/dist/slides/export/ffmpeg.js +76 -72
  229. package/dist/slides/export/index.js +3 -0
  230. package/dist/slides/export/launch.js +9 -6
  231. package/dist/slides/export/pdf.js +60 -54
  232. package/dist/slides/export/types.js +1 -0
  233. package/dist/slides/labels.js +24 -24
  234. package/dist/slides/layout.js +39 -41
  235. package/dist/slides/model.js +9 -7
  236. package/dist/slides/navigation.js +78 -73
  237. package/dist/slides/types.js +2 -2
  238. package/dist/status/define-statuses.js +18 -14
  239. package/dist/status/status-types.js +1 -0
  240. package/dist/test-setup.js +24 -20
  241. package/dist/thread/logic.js +73 -77
  242. package/dist/thread/types.js +21 -21
  243. package/dist/work/board-order.js +94 -90
  244. package/dist/work/dates.js +16 -9
  245. package/dist/work/detail/detail-types.js +18 -18
  246. package/dist/work/docs/edited.js +32 -29
  247. package/dist/work/docs/index.js +4 -0
  248. package/dist/work/docs/labels.js +34 -34
  249. package/dist/work/docs/menu.js +113 -106
  250. package/dist/work/docs/outline.js +39 -29
  251. package/dist/work/gantt/logic.js +211 -235
  252. package/dist/work/inbox/inbox-logic.js +71 -75
  253. package/dist/work/inbox/inbox-statuses.js +75 -72
  254. package/dist/work/inbox/inbox-types.js +1 -0
  255. package/dist/work/kanban-drag.js +27 -22
  256. package/dist/work/kanban-types.js +1 -0
  257. package/dist/work/presets/sales.js +36 -32
  258. package/dist/work/reorder.js +9 -8
  259. package/dist/work/task-types.js +1 -0
  260. package/dist/work/time/duration.js +51 -46
  261. package/dist/work/time/time-types.js +23 -23
  262. package/dist/work/use-kanban-dnd.svelte.js +126 -125
  263. package/package.json +3 -1
  264. package/src/components/list-page/master-detail.svelte +3 -1
  265. package/src/components/list-page/rail-row.svelte +4 -4
  266. package/src/editor/markdown.ts +30 -35
@@ -1,181 +1,170 @@
1
+ /**
2
+ * Heading anchors with a hover "Copy link", and code blocks with line numbers and a language
3
+ * label. Both are decorations, so the document stays plain Tiptap JSON.
4
+ */
1
5
  import { Extension } from "@tiptap/core";
2
6
  import { Plugin, PluginKey } from "@tiptap/pm/state";
3
7
  import { Decoration, DecorationSet } from "@tiptap/pm/view";
4
8
  import { anchorIds } from "./anchors.js";
5
9
  const LINK_ICON = `<svg width="12" height="12" viewBox="0 0 256 256" fill="currentColor" aria-hidden="true"><path d="M240 88.23a54.43 54.43 0 0 1-16 37L189.25 160a54.27 54.27 0 0 1-38.63 16h-.05A54.63 54.63 0 0 1 96 119.84a8 8 0 0 1 16 .45A38.62 38.62 0 0 0 150.58 160a38.4 38.4 0 0 0 27.31-11.31l34.75-34.75a38.63 38.63 0 0 0-54.63-54.63l-11 11A8 8 0 0 1 135.7 59l11-11a54.65 54.65 0 0 1 77.3 0A54.86 54.86 0 0 1 240 88.23ZM109 185.66l-11 11A38.41 38.41 0 0 1 70.6 208a38.63 38.63 0 0 1-27.29-65.94L78 107.31a38.63 38.63 0 0 1 54.63 0 8 8 0 0 0 11.31-11.31 54.65 54.65 0 0 0-77.3 0L32 130.75A54.62 54.62 0 0 0 70.56 224a54.28 54.28 0 0 0 38.64-16l11-11a8 8 0 0 0-11.2-11.34Z"/></svg>`;
6
10
  const anchorsKey = new PluginKey("headingAnchors");
11
+ /** Gives every heading an `id` and a hover "Copy link" that copies a URL to that section. */
7
12
  export const HeadingAnchors = Extension.create({
8
- name: "headingAnchors",
9
- addOptions () {
10
- return {
11
- label: "Copy link",
12
- oncopy: undefined
13
- };
14
- },
15
- addProseMirrorPlugins () {
16
- const options = this.options;
17
- return [
18
- new Plugin({
19
- key: anchorsKey,
20
- props: {
21
- decorations (state) {
22
- const found = [];
23
- state.doc.descendants((node, pos)=>{
24
- if (node.type.name !== "heading") return;
25
- found.push({
26
- pos,
27
- size: node.nodeSize,
28
- label: node.textContent.trim()
29
- });
30
- });
31
- if (found.length === 0) return DecorationSet.empty;
32
- const ids = anchorIds(found.map((heading)=>heading.label));
33
- const decorations = found.flatMap((heading, i)=>{
34
- const id = ids[i];
35
- return [
36
- Decoration.node(heading.pos, heading.pos + heading.size, {
37
- id,
38
- class: "has-anchor"
39
- }),
40
- Decoration.widget(heading.pos + heading.size - 1, ()=>{
41
- const button = document.createElement("button");
42
- button.type = "button";
43
- button.className = "heading-anchor";
44
- button.contentEditable = "false";
45
- button.innerHTML = `${LINK_ICON}<span>${options.label}</span>`;
46
- button.addEventListener("mousedown", (event)=>event.preventDefault());
47
- button.addEventListener("click", ()=>{
48
- const { origin, pathname, search } = window.location;
49
- const url = `${origin}${pathname}${search}#${id}`;
50
- void navigator.clipboard?.writeText(url).catch(()=>{});
51
- button.dataset.copied = "true";
52
- setTimeout(()=>delete button.dataset.copied, 1400);
53
- options.oncopy?.(url, id);
54
- });
55
- return button;
56
- }, {
57
- side: 1,
58
- key: `anchor-${id}`,
59
- ignoreSelection: true
60
- })
61
- ];
62
- });
63
- return DecorationSet.create(state.doc, decorations);
64
- }
65
- }
66
- })
67
- ];
68
- }
13
+ name: "headingAnchors",
14
+ addOptions() {
15
+ return {
16
+ label: "Copy link",
17
+ oncopy: undefined
18
+ };
19
+ },
20
+ addProseMirrorPlugins() {
21
+ const options = this.options;
22
+ return [new Plugin({
23
+ key: anchorsKey,
24
+ props: { decorations(state) {
25
+ const found = [];
26
+ state.doc.descendants((node, pos) => {
27
+ if (node.type.name !== "heading") return;
28
+ found.push({
29
+ pos,
30
+ size: node.nodeSize,
31
+ label: node.textContent.trim()
32
+ });
33
+ });
34
+ if (found.length === 0) return DecorationSet.empty;
35
+ const ids = anchorIds(found.map((heading) => heading.label));
36
+ const decorations = found.flatMap((heading, i) => {
37
+ const id = ids[i];
38
+ return [Decoration.node(heading.pos, heading.pos + heading.size, {
39
+ id,
40
+ class: "has-anchor"
41
+ }), Decoration.widget(heading.pos + heading.size - 1, () => {
42
+ const button = document.createElement("button");
43
+ button.type = "button";
44
+ button.className = "heading-anchor";
45
+ button.contentEditable = "false";
46
+ button.innerHTML = `${LINK_ICON}<span>${options.label}</span>`;
47
+ button.addEventListener("mousedown", (event) => event.preventDefault());
48
+ button.addEventListener("click", () => {
49
+ const { origin, pathname, search } = window.location;
50
+ const url = `${origin}${pathname}${search}#${id}`;
51
+ void navigator.clipboard?.writeText(url).catch(() => {});
52
+ button.dataset.copied = "true";
53
+ setTimeout(() => delete button.dataset.copied, 1400);
54
+ options.oncopy?.(url, id);
55
+ });
56
+ return button;
57
+ }, {
58
+ side: 1,
59
+ key: `anchor-${id}`,
60
+ ignoreSelection: true
61
+ })];
62
+ });
63
+ return DecorationSet.create(state.doc, decorations);
64
+ } }
65
+ })];
66
+ }
69
67
  });
70
68
  export const CODE_LANGUAGES = [
71
- {
72
- value: "",
73
- label: "Plain text"
74
- },
75
- {
76
- value: "typescript",
77
- label: "TypeScript"
78
- },
79
- {
80
- value: "javascript",
81
- label: "JavaScript"
82
- },
83
- {
84
- value: "svelte",
85
- label: "Svelte"
86
- },
87
- {
88
- value: "html",
89
- label: "HTML"
90
- },
91
- {
92
- value: "css",
93
- label: "CSS"
94
- },
95
- {
96
- value: "json",
97
- label: "JSON"
98
- },
99
- {
100
- value: "bash",
101
- label: "Bash"
102
- },
103
- {
104
- value: "sql",
105
- label: "SQL"
106
- },
107
- {
108
- value: "python",
109
- label: "Python"
110
- },
111
- {
112
- value: "markdown",
113
- label: "Markdown"
114
- }
69
+ {
70
+ value: "",
71
+ label: "Plain text"
72
+ },
73
+ {
74
+ value: "typescript",
75
+ label: "TypeScript"
76
+ },
77
+ {
78
+ value: "javascript",
79
+ label: "JavaScript"
80
+ },
81
+ {
82
+ value: "svelte",
83
+ label: "Svelte"
84
+ },
85
+ {
86
+ value: "html",
87
+ label: "HTML"
88
+ },
89
+ {
90
+ value: "css",
91
+ label: "CSS"
92
+ },
93
+ {
94
+ value: "json",
95
+ label: "JSON"
96
+ },
97
+ {
98
+ value: "bash",
99
+ label: "Bash"
100
+ },
101
+ {
102
+ value: "sql",
103
+ label: "SQL"
104
+ },
105
+ {
106
+ value: "python",
107
+ label: "Python"
108
+ },
109
+ {
110
+ value: "markdown",
111
+ label: "Markdown"
112
+ }
115
113
  ];
114
+ /** "1\n2\n3" for a block of three lines: the gutter, which CSS prints beside the code. */
116
115
  export function lineNumbers(code) {
117
- const count = code.split("\n").length;
118
- return Array.from({
119
- length: count
120
- }, (_, i)=>i + 1).join("\n");
116
+ const count = code.split("\n").length;
117
+ return Array.from({ length: count }, (_, i) => i + 1).join("\n");
121
118
  }
122
119
  const codeKey = new PluginKey("codeBlockChrome");
120
+ /** Line numbers in a gutter and a language picker in the corner of every code block. */
123
121
  export const CodeBlockChrome = Extension.create({
124
- name: "codeBlockChrome",
125
- addProseMirrorPlugins () {
126
- return [
127
- new Plugin({
128
- key: codeKey,
129
- props: {
130
- decorations (state) {
131
- const decorations = [];
132
- state.doc.descendants((node, pos)=>{
133
- if (node.type.name !== "codeBlock") return;
134
- const language = typeof node.attrs.language === "string" ? node.attrs.language : "";
135
- decorations.push(Decoration.node(pos, pos + node.nodeSize, {
136
- "data-lines": lineNumbers(node.textContent)
137
- }), Decoration.widget(pos + 1, (view, getPos)=>{
138
- const select = document.createElement("select");
139
- select.className = "code-language";
140
- select.contentEditable = "false";
141
- select.setAttribute("aria-label", "Language");
142
- const known = CODE_LANGUAGES.some((item)=>item.value === language);
143
- const options = known ? CODE_LANGUAGES : [
144
- ...CODE_LANGUAGES,
145
- {
146
- value: language,
147
- label: language
148
- }
149
- ];
150
- for (const item of options){
151
- const option = document.createElement("option");
152
- option.value = item.value;
153
- option.textContent = item.label;
154
- option.selected = item.value === language;
155
- select.append(option);
156
- }
157
- select.addEventListener("mousedown", (event)=>event.stopPropagation());
158
- select.addEventListener("change", ()=>{
159
- const at = (getPos() ?? 1) - 1;
160
- const target = view.state.doc.nodeAt(at);
161
- if (!target) return;
162
- view.dispatch(view.state.tr.setNodeMarkup(at, undefined, {
163
- ...target.attrs,
164
- language: select.value || null
165
- }));
166
- view.focus();
167
- });
168
- return select;
169
- }, {
170
- side: -1,
171
- key: `lang-${pos}-${language}`,
172
- stopEvent: ()=>true
173
- }));
174
- });
175
- return decorations.length ? DecorationSet.create(state.doc, decorations) : DecorationSet.empty;
176
- }
177
- }
178
- })
179
- ];
180
- }
122
+ name: "codeBlockChrome",
123
+ addProseMirrorPlugins() {
124
+ return [new Plugin({
125
+ key: codeKey,
126
+ props: { decorations(state) {
127
+ const decorations = [];
128
+ state.doc.descendants((node, pos) => {
129
+ if (node.type.name !== "codeBlock") return;
130
+ const language = typeof node.attrs.language === "string" ? node.attrs.language : "";
131
+ decorations.push(Decoration.node(pos, pos + node.nodeSize, { "data-lines": lineNumbers(node.textContent) }), Decoration.widget(pos + 1, (view, getPos) => {
132
+ const select = document.createElement("select");
133
+ select.className = "code-language";
134
+ select.contentEditable = "false";
135
+ select.setAttribute("aria-label", "Language");
136
+ const known = CODE_LANGUAGES.some((item) => item.value === language);
137
+ const options = known ? CODE_LANGUAGES : [...CODE_LANGUAGES, {
138
+ value: language,
139
+ label: language
140
+ }];
141
+ for (const item of options) {
142
+ const option = document.createElement("option");
143
+ option.value = item.value;
144
+ option.textContent = item.label;
145
+ option.selected = item.value === language;
146
+ select.append(option);
147
+ }
148
+ select.addEventListener("mousedown", (event) => event.stopPropagation());
149
+ select.addEventListener("change", () => {
150
+ const at = (getPos() ?? 1) - 1;
151
+ const target = view.state.doc.nodeAt(at);
152
+ if (!target) return;
153
+ view.dispatch(view.state.tr.setNodeMarkup(at, undefined, {
154
+ ...target.attrs,
155
+ language: select.value || null
156
+ }));
157
+ view.focus();
158
+ });
159
+ return select;
160
+ }, {
161
+ side: -1,
162
+ key: `lang-${pos}-${language}`,
163
+ stopEvent: () => true
164
+ }));
165
+ });
166
+ return decorations.length ? DecorationSet.create(state.doc, decorations) : DecorationSet.empty;
167
+ } }
168
+ })];
169
+ }
181
170
  });