@heycys/gallery 0.1.0 → 0.1.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 (465) hide show
  1. package/THIRD-PARTY-NOTICES.md +51 -1
  2. package/browser/editor/components/callout/index.mjs +40 -15
  3. package/browser/editor/components/columns/page.mjs +45 -32
  4. package/browser/editor/components/details/index.mjs +2 -1
  5. package/browser/editor/components/dialog/index.mjs +2 -1
  6. package/browser/editor/components/dialog/page.mjs +0 -18
  7. package/browser/editor/components/divider/index.mjs +1 -1
  8. package/browser/editor/components/embed/index.mjs +2 -2
  9. package/browser/editor/components/figure/page.mjs +10 -1
  10. package/browser/editor/components/file/page.mjs +2 -2
  11. package/browser/editor/components/flowchart/add.mjs +7 -6
  12. package/browser/editor/components/flowchart/page.mjs +1 -1
  13. package/browser/editor/components/heading/index.mjs +2 -0
  14. package/browser/editor/components/heading/page.mjs +6 -0
  15. package/browser/editor/components/highlight/index.mjs +4 -20
  16. package/browser/editor/components/icons.mjs +13 -2
  17. package/browser/editor/components/image/crop.mjs +6 -9
  18. package/browser/editor/components/image/page.mjs +2 -2
  19. package/browser/editor/components/installed/index.mjs +82 -29
  20. package/browser/editor/components/installed/page.mjs +146 -34
  21. package/browser/editor/components/installed/served.mjs +6 -5
  22. package/browser/editor/components/instances.mjs +18 -0
  23. package/browser/editor/components/kit.mjs +3 -0
  24. package/browser/editor/components/list/page.mjs +3 -6
  25. package/browser/editor/components/media/page.mjs +44 -14
  26. package/browser/editor/components/pages.mjs +2 -2
  27. package/browser/editor/components/registry.mjs +68 -33
  28. package/browser/editor/components/section/index.mjs +2 -1
  29. package/browser/editor/components/set-apart.mjs +24 -0
  30. package/browser/editor/components/table/index.mjs +64 -5
  31. package/browser/editor/components/table/page.mjs +30 -19
  32. package/browser/editor/page/annotate/anchors.mjs +4 -3
  33. package/browser/editor/page/annotate/card.mjs +3 -6
  34. package/browser/editor/page/annotate/index.mjs +61 -34
  35. package/browser/editor/page/autosave.mjs +357 -38
  36. package/browser/editor/page/beside.mjs +5 -5
  37. package/browser/editor/page/block-menu/colors.mjs +3 -1
  38. package/browser/editor/page/block-menu/index.mjs +8 -6
  39. package/browser/editor/page/blocks.mjs +16 -7
  40. package/browser/editor/page/board/client.mjs +57 -0
  41. package/browser/editor/page/board/hint.mjs +145 -0
  42. package/browser/editor/page/board/history.mjs +119 -0
  43. package/browser/editor/page/board/index.mjs +970 -0
  44. package/browser/editor/page/board/settings.mjs +209 -0
  45. package/browser/editor/page/caret.mjs +5 -2
  46. package/browser/editor/page/changes/bar.mjs +94 -0
  47. package/browser/editor/page/changes/ghost.mjs +206 -0
  48. package/browser/editor/page/changes/gone-words.mjs +94 -0
  49. package/browser/editor/page/changes/index.mjs +447 -0
  50. package/browser/editor/page/changes/words.mjs +27 -0
  51. package/browser/editor/page/clipboard/import/colors.mjs +3 -3
  52. package/browser/editor/page/clipboard/import/html.mjs +29 -6
  53. package/browser/editor/page/clipboard/import/inline.mjs +32 -0
  54. package/browser/editor/page/clipboard/import/markdown.mjs +58 -13
  55. package/browser/editor/page/clipboard/import/read.mjs +6 -1
  56. package/browser/editor/page/clipboard/import/to-blocks.mjs +44 -12
  57. package/browser/editor/page/clipboard/import/yuque.mjs +622 -0
  58. package/browser/editor/page/clipboard/index.mjs +156 -26
  59. package/browser/editor/page/clipboard/own/blocks.mjs +25 -16
  60. package/browser/editor/page/clipboard/own/chart-keys.mjs +41 -28
  61. package/browser/editor/page/clipboard/own/describe.mjs +16 -7
  62. package/browser/editor/page/clipboard/own/export.mjs +6 -6
  63. package/browser/editor/page/clipboard/own/selection.mjs +3 -3
  64. package/browser/editor/page/clipboard/own/writers.mjs +0 -11
  65. package/browser/editor/page/columns/index.mjs +48 -46
  66. package/browser/editor/page/commit.mjs +98 -25
  67. package/browser/editor/page/conflicts.mjs +13 -33
  68. package/browser/editor/page/convert.mjs +8 -7
  69. package/browser/editor/page/core.mjs +81 -27
  70. package/browser/editor/page/custom-page.mjs +106 -0
  71. package/browser/editor/page/drag/index.mjs +40 -24
  72. package/browser/editor/page/drag/preview.mjs +9 -4
  73. package/browser/editor/page/editor.mjs +120 -28
  74. package/browser/editor/page/emoji-picker/emoji-tab.mjs +22 -13
  75. package/browser/editor/page/emoji-picker/grid.mjs +7 -5
  76. package/browser/editor/page/emoji-picker/icon-tab.mjs +4 -4
  77. package/browser/editor/page/emoji-picker/icons.mjs +0 -1
  78. package/browser/editor/page/emoji-picker/index.mjs +11 -9
  79. package/browser/editor/page/emoji-picker/styles.mjs +156 -2
  80. package/browser/editor/page/emoji-picker/support.mjs +6 -4
  81. package/browser/editor/page/emoji-picker/upload.mjs +14 -13
  82. package/browser/editor/page/fills.mjs +5 -3
  83. package/browser/editor/page/fold/index.mjs +348 -0
  84. package/browser/editor/page/fold/rule.mjs +125 -0
  85. package/browser/editor/page/folded.mjs +23 -0
  86. package/browser/editor/page/format-bar/bar.mjs +2 -1
  87. package/browser/editor/page/format-bar/index.mjs +1 -1
  88. package/browser/editor/page/geometry.mjs +8 -6
  89. package/browser/editor/page/handle/index.mjs +22 -14
  90. package/browser/editor/page/hints/index.mjs +1 -1
  91. package/browser/editor/page/history.mjs +24 -4
  92. package/browser/editor/page/insert/index.mjs +30 -17
  93. package/browser/editor/page/links/index.mjs +5 -3
  94. package/browser/editor/page/links/pages.mjs +27 -9
  95. package/browser/editor/page/long-runs.mjs +75 -0
  96. package/browser/editor/page/look.mjs +69 -6
  97. package/browser/editor/page/margin.mjs +63 -27
  98. package/browser/editor/page/media-menu/index.mjs +6 -7
  99. package/browser/editor/page/menu.mjs +86 -31
  100. package/browser/editor/page/merge.mjs +24 -0
  101. package/browser/editor/page/notices.mjs +3 -3
  102. package/browser/editor/page/offered.mjs +1 -1
  103. package/browser/editor/page/outline/folds.mjs +11 -10
  104. package/browser/editor/page/outline/index.mjs +131 -45
  105. package/browser/editor/page/outline/list.mjs +23 -11
  106. package/browser/editor/page/outline/read.mjs +1 -1
  107. package/browser/editor/page/outline/strip.mjs +7 -1
  108. package/browser/editor/page/page-objects.mjs +13 -2
  109. package/browser/editor/page/panel.mjs +9 -13
  110. package/browser/editor/page/present-links.mjs +11 -2
  111. package/browser/editor/page/resize/index.mjs +42 -29
  112. package/browser/editor/page/selection/delete.mjs +8 -6
  113. package/browser/editor/page/selection/index.mjs +10 -3
  114. package/browser/editor/page/served.mjs +14 -0
  115. package/browser/editor/page/session.mjs +101 -6
  116. package/browser/editor/page/slash-menu/index.mjs +3 -3
  117. package/browser/editor/page/table/cell-bar.mjs +4 -1
  118. package/browser/editor/page/table/cells.mjs +103 -47
  119. package/browser/editor/page/table/icons.mjs +3 -1
  120. package/browser/editor/page/table/index.mjs +40 -16
  121. package/browser/editor/page/table/pictures.mjs +299 -0
  122. package/browser/editor/page/table/views.mjs +150 -0
  123. package/browser/editor/page/table/widths.mjs +9 -4
  124. package/browser/editor/page/text-select/index.mjs +43 -14
  125. package/browser/editor/page/todo-writes.mjs +75 -0
  126. package/browser/editor/page/tooltip.mjs +1 -1
  127. package/browser/editor/page/type-grid.mjs +4 -3
  128. package/browser/editor/page/typing/code-edges.mjs +63 -17
  129. package/browser/editor/page/typing/index.mjs +65 -9
  130. package/browser/editor/page/typing/leave.mjs +1 -1
  131. package/browser/editor/page/ui.mjs +13 -0
  132. package/browser/shared/annotations.mjs +8 -10
  133. package/browser/shared/block-packs.mjs +404 -0
  134. package/browser/shared/board-places.mjs +224 -0
  135. package/browser/shared/card-size.mjs +59 -0
  136. package/browser/shared/code-folds.mjs +5 -1
  137. package/browser/shared/colors.mjs +17 -14
  138. package/browser/shared/component-catalog.mjs +345 -54
  139. package/browser/shared/component-source.mjs +37 -0
  140. package/browser/shared/components/callout.mjs +4 -2
  141. package/browser/shared/components/index.mjs +72 -9
  142. package/browser/shared/components/installed.mjs +110 -8
  143. package/browser/shared/components/page.mjs +22 -3
  144. package/browser/shared/components/state.mjs +5 -1
  145. package/browser/shared/components/table.mjs +1 -1
  146. package/browser/shared/components/text.mjs +2 -2
  147. package/browser/shared/document-look.mjs +183 -0
  148. package/browser/shared/drafts.mjs +432 -0
  149. package/browser/shared/emoji/data/LICENSE-lucide.txt +43 -0
  150. package/browser/shared/emoji/data/README.md +4 -2
  151. package/browser/shared/emoji/data/categories.json +1 -1
  152. package/browser/shared/emoji/data/keywords-en.json +1 -1
  153. package/browser/shared/emoji/data/keywords-zh.json +1 -1
  154. package/browser/shared/emoji/data/names.json +1 -1
  155. package/browser/shared/emoji/data/positions.json +1 -1
  156. package/browser/shared/emoji/data/twemoji-index.json +1 -1
  157. package/browser/shared/emoji/data/twemoji-svg.bin +0 -0
  158. package/browser/shared/emoji/data.mjs +10 -12
  159. package/browser/shared/emoji/emoji.mjs +8 -7
  160. package/browser/shared/emoji/icon-value.mjs +4 -3
  161. package/browser/shared/extension-sidebar.mjs +126 -0
  162. package/browser/shared/extensions.mjs +79 -0
  163. package/browser/shared/file-table.mjs +101 -0
  164. package/browser/shared/html-tree.mjs +11 -5
  165. package/browser/shared/i18n/en.mjs +374 -35
  166. package/browser/shared/json-layout.mjs +47 -0
  167. package/browser/shared/long-runs.mjs +39 -0
  168. package/browser/shared/net-cache.mjs +133 -0
  169. package/browser/shared/net-keys.mjs +32 -0
  170. package/browser/shared/net-policy.mjs +177 -0
  171. package/browser/shared/new-names.mjs +5 -2
  172. package/browser/shared/outline-shape.mjs +128 -0
  173. package/browser/shared/outline.mjs +458 -0
  174. package/browser/shared/pack-manifest.mjs +77 -0
  175. package/browser/shared/page-address.mjs +6 -3
  176. package/browser/shared/page-cards.mjs +308 -0
  177. package/browser/shared/page-links.mjs +69 -6
  178. package/browser/shared/pages.mjs +388 -0
  179. package/browser/shared/paths.mjs +6 -0
  180. package/browser/shared/preferences.mjs +10 -4
  181. package/browser/shared/preview-server.mjs +3 -7
  182. package/browser/shared/session.mjs +13 -5
  183. package/browser/shared/shipped-blocks.mjs +299 -0
  184. package/browser/shared/table-chart.mjs +33 -1
  185. package/browser/shared/todos.mjs +83 -0
  186. package/browser/shared/user-directory.mjs +24 -0
  187. package/browser/shared/versions.mjs +14 -0
  188. package/browser/shared/web-links.mjs +134 -0
  189. package/browser/shared/workspace-columns.mjs +120 -0
  190. package/browser/shared/workspace-look.mjs +91 -0
  191. package/browser/shared/workspace-name.mjs +154 -0
  192. package/browser/shared/workspace-query.mjs +125 -0
  193. package/browser/shared/workspace-registry.mjs +272 -0
  194. package/browser/shared/workspace.mjs +171 -20
  195. package/browser/shared/zoom.mjs +5 -5
  196. package/dist/chunk-2NRBY6AJ.mjs +2 -0
  197. package/dist/chunk-32ZUEFZ7.mjs +2 -0
  198. package/dist/chunk-35NQ4PLQ.mjs +2 -0
  199. package/dist/chunk-3KJHLHUO.mjs +2 -0
  200. package/dist/chunk-3NJACR4W.mjs +2 -0
  201. package/dist/chunk-4AV456RQ.mjs +2 -0
  202. package/dist/chunk-4OZWXZE5.mjs +5 -0
  203. package/dist/chunk-5XYHDBJ5.mjs +2 -0
  204. package/dist/chunk-5ZJA7CXT.mjs +2 -0
  205. package/dist/chunk-6A53MZYZ.mjs +2 -0
  206. package/dist/chunk-6EXH3ORZ.mjs +166 -0
  207. package/dist/chunk-6EZ7FNIK.mjs +3 -0
  208. package/dist/{chunk-UXUK4PMC.mjs → chunk-6QBHU4DF.mjs} +1 -1
  209. package/dist/{chunk-6U2SLSDN.mjs → chunk-6VTU6KEO.mjs} +1 -1
  210. package/dist/chunk-B4P2CM2J.mjs +3 -0
  211. package/dist/chunk-BPL64HGA.mjs +4 -0
  212. package/dist/chunk-BVEFGE4B.mjs +2 -0
  213. package/dist/chunk-BZ5RAF7L.mjs +2 -0
  214. package/dist/chunk-CRJEG7MT.mjs +2 -0
  215. package/dist/{chunk-B3VTYBYR.mjs → chunk-D4CKRD3V.mjs} +91 -91
  216. package/dist/chunk-D4EURAX4.mjs +4 -0
  217. package/dist/chunk-DQCE7TJY.mjs +5 -0
  218. package/dist/chunk-DR73Y2UJ.mjs +3 -0
  219. package/dist/{chunk-TMYZB6AV.mjs → chunk-EKNHM3P4.mjs} +1 -1
  220. package/dist/{chunk-DB4WKGYF.mjs → chunk-ERLAIBOA.mjs} +2 -2
  221. package/dist/chunk-EURLTOTZ.mjs +4 -0
  222. package/dist/chunk-FJYN7RTH.mjs +4 -0
  223. package/dist/chunk-FWNRPMCJ.mjs +12 -0
  224. package/dist/chunk-FWW4CSAZ.mjs +2 -0
  225. package/dist/{chunk-2B5E4CDJ.mjs → chunk-GPIWQ4X4.mjs} +1 -1
  226. package/dist/chunk-GY3FAUVM.mjs +2 -0
  227. package/dist/chunk-HLYV7RIH.mjs +2 -0
  228. package/dist/chunk-HMYTM3GT.mjs +15 -0
  229. package/dist/chunk-IA4PSIMD.mjs +2 -0
  230. package/dist/chunk-JEUK3ZO7.mjs +2 -0
  231. package/dist/chunk-JVHHHGEA.mjs +3 -0
  232. package/dist/chunk-KTKHRC6H.mjs +2 -0
  233. package/dist/chunk-L7UP52JO.mjs +2 -0
  234. package/dist/chunk-MHW7ZKOU.mjs +2 -0
  235. package/dist/chunk-N76HWBA3.mjs +10 -0
  236. package/dist/chunk-N7AZZLGT.mjs +548 -0
  237. package/dist/chunk-NAMN3RAF.mjs +2 -0
  238. package/dist/{chunk-YXAUQPVK.mjs → chunk-NFMCP2HI.mjs} +3 -3
  239. package/dist/chunk-NG375ILQ.mjs +2 -0
  240. package/dist/chunk-NVRNLK25.mjs +6 -0
  241. package/dist/chunk-NWFBE2YA.mjs +2 -0
  242. package/dist/chunk-NWR2LT5B.mjs +2 -0
  243. package/dist/chunk-OJKMINIU.mjs +20 -0
  244. package/dist/chunk-OUUP3WKT.mjs +2 -0
  245. package/dist/chunk-OW5NWPOJ.mjs +10 -0
  246. package/dist/chunk-PAREWQGB.mjs +4 -0
  247. package/dist/chunk-POQSE4C2.mjs +2 -0
  248. package/dist/chunk-PUOQ65NC.mjs +2 -0
  249. package/dist/{chunk-Z52HTUW7.mjs → chunk-PVER7LSC.mjs} +2 -2
  250. package/dist/chunk-PZDLJJTJ.mjs +3 -0
  251. package/dist/chunk-Q47PLKIJ.mjs +15 -0
  252. package/dist/chunk-Q4UEPUWF.mjs +2 -0
  253. package/dist/chunk-QKXMPUXC.mjs +2 -0
  254. package/dist/chunk-QOUEFUCH.mjs +16 -0
  255. package/dist/chunk-RFDZXFJF.mjs +13 -0
  256. package/dist/chunk-RKPWLGZ3.mjs +4 -0
  257. package/dist/chunk-RMECZA2K.mjs +2 -0
  258. package/dist/{chunk-EUX7IC5J.mjs → chunk-SQ6Y2ZMA.mjs} +2 -2
  259. package/dist/chunk-SX4LJYT6.mjs +8 -0
  260. package/dist/chunk-SXHBYZST.mjs +16 -0
  261. package/dist/chunk-TANZRINB.mjs +2 -0
  262. package/dist/chunk-TEZAWDSQ.mjs +2 -0
  263. package/dist/chunk-UBBRTJ2R.mjs +24 -0
  264. package/dist/chunk-UFNYFFKO.mjs +20 -0
  265. package/dist/chunk-UGWYKHBL.mjs +170 -0
  266. package/dist/chunk-UKSHDZZ6.mjs +2 -0
  267. package/dist/chunk-UMHUSOPJ.mjs +2 -0
  268. package/dist/chunk-UNOYVIYR.mjs +2 -0
  269. package/dist/chunk-V6RIYQZZ.mjs +4 -0
  270. package/dist/chunk-VJPFVNNW.mjs +15 -0
  271. package/dist/chunk-VS3ZMVGX.mjs +5 -0
  272. package/dist/chunk-VTKNEYT3.mjs +6 -0
  273. package/dist/chunk-VXACTLO3.mjs +3 -0
  274. package/dist/chunk-W3BGBJQW.mjs +2 -0
  275. package/dist/chunk-YI43RG4P.mjs +2 -0
  276. package/dist/chunk-YQGT4AB2.mjs +6 -0
  277. package/dist/chunk-ZB4H7ZN4.mjs +2 -0
  278. package/dist/{chunk-ACOPDCNB.mjs → chunk-ZHEHPMBK.mjs} +1 -1
  279. package/dist/chunk-ZTHICSSF.mjs +2 -0
  280. package/dist/chunk-ZUNVAXLH.mjs +2 -0
  281. package/dist/chunk-ZWPMCK7P.mjs +2 -0
  282. package/dist/cli.mjs +1 -1
  283. package/dist/server.mjs +1 -1
  284. package/dist/{chunk-EVJ3BX3M.mjs → update-fetch.mjs} +1 -1
  285. package/dist/worker.mjs +1 -1
  286. package/kit/board.css +95 -0
  287. package/kit/board.js +250 -0
  288. package/kit/charts.js +5 -71
  289. package/kit/code.js +14 -14
  290. package/kit/math.js +18 -2
  291. package/kit/report.css +500 -151
  292. package/kit/runtime.js +1720 -170
  293. package/kit/state.js +10 -1
  294. package/kit/tables.js +172 -37
  295. package/kit/ui.js +166 -27
  296. package/package.json +2 -1
  297. package/packs/gallery/card/component.json +14 -0
  298. package/packs/gallery/card/example.html +10 -0
  299. package/packs/gallery/card/preview.svg +1 -0
  300. package/packs/gallery/card/style.css +6 -0
  301. package/packs/gallery/card/template.html +6 -0
  302. package/packs/gallery/card/writing.md +14 -0
  303. package/packs/gallery/chart-card/component.json +15 -0
  304. package/packs/gallery/chart-card/example.html +14 -0
  305. package/packs/gallery/chart-card/kit.js +130 -0
  306. package/packs/gallery/chart-card/preview.svg +1 -0
  307. package/packs/gallery/chart-card/style.css +42 -0
  308. package/packs/gallery/chart-card/template.html +13 -0
  309. package/packs/gallery/chart-card/writing.md +20 -0
  310. package/packs/gallery/chart-view/component.json +20 -0
  311. package/packs/gallery/chart-view/example.html +13 -0
  312. package/packs/gallery/chart-view/kit.js +355 -0
  313. package/packs/gallery/chart-view/preview.svg +1 -0
  314. package/packs/gallery/chart-view/style.css +94 -0
  315. package/packs/gallery/chart-view/template.html +3 -0
  316. package/packs/gallery/chart-view/writing.md +22 -0
  317. package/packs/gallery/countdown/component.json +18 -0
  318. package/packs/gallery/countdown/example.html +3 -0
  319. package/packs/gallery/countdown/kit.js +156 -0
  320. package/packs/gallery/countdown/preview.svg +1 -0
  321. package/packs/gallery/countdown/style.css +130 -0
  322. package/packs/gallery/countdown/template.html +3 -0
  323. package/packs/gallery/countdown/writing.md +22 -0
  324. package/packs/gallery/habit/component.json +14 -0
  325. package/packs/gallery/habit/example.html +3 -0
  326. package/packs/gallery/habit/kit.js +295 -0
  327. package/packs/gallery/habit/preview.svg +1 -0
  328. package/packs/gallery/habit/style.css +246 -0
  329. package/packs/gallery/habit/template.html +3 -0
  330. package/packs/gallery/habit/writing.md +21 -0
  331. package/packs/gallery/heatmap/component.json +18 -0
  332. package/packs/gallery/heatmap/example.html +3 -0
  333. package/packs/gallery/heatmap/kit.js +351 -0
  334. package/packs/gallery/heatmap/preview.svg +1 -0
  335. package/packs/gallery/heatmap/style.css +201 -0
  336. package/packs/gallery/heatmap/template.html +3 -0
  337. package/packs/gallery/heatmap/writing.md +21 -0
  338. package/packs/gallery/kanban/component.json +18 -0
  339. package/packs/gallery/kanban/example.html +12 -0
  340. package/packs/gallery/kanban/kit.js +540 -0
  341. package/packs/gallery/kanban/preview.svg +1 -0
  342. package/packs/gallery/kanban/style.css +212 -0
  343. package/packs/gallery/kanban/template.html +3 -0
  344. package/packs/gallery/kanban/writing.md +20 -0
  345. package/packs/gallery/metric/component.json +22 -0
  346. package/packs/gallery/metric/example.html +15 -0
  347. package/packs/gallery/metric/kit.js +248 -0
  348. package/packs/gallery/metric/preview.svg +1 -0
  349. package/packs/gallery/metric/style.css +92 -0
  350. package/packs/gallery/metric/template.html +3 -0
  351. package/packs/gallery/metric/writing.md +23 -0
  352. package/packs/gallery/note/component.json +14 -0
  353. package/packs/gallery/note/example.html +3 -0
  354. package/packs/gallery/note/kit.js +102 -0
  355. package/packs/gallery/note/preview.svg +1 -0
  356. package/packs/gallery/note/style.css +76 -0
  357. package/packs/gallery/note/template.html +3 -0
  358. package/packs/gallery/note/writing.md +18 -0
  359. package/packs/gallery/pack.json +8 -0
  360. package/packs/gallery/recent/component.json +13 -0
  361. package/packs/gallery/recent/example.html +1 -0
  362. package/packs/gallery/recent/kit.js +238 -0
  363. package/packs/gallery/recent/preview.svg +1 -0
  364. package/packs/gallery/recent/style.css +158 -0
  365. package/packs/gallery/recent/template.html +1 -0
  366. package/packs/gallery/recent/writing.md +15 -0
  367. package/packs/gallery/static/component.json +13 -0
  368. package/packs/gallery/static/example.html +11 -0
  369. package/packs/gallery/static/preview.svg +1 -0
  370. package/packs/gallery/static/style.css +138 -0
  371. package/packs/gallery/static/template.html +1 -0
  372. package/packs/gallery/static/writing.md +18 -0
  373. package/packs/gallery/stats/component.json +13 -0
  374. package/packs/gallery/stats/example.html +1 -0
  375. package/packs/gallery/stats/kit.js +166 -0
  376. package/packs/gallery/stats/preview.svg +1 -0
  377. package/packs/gallery/stats/style.css +151 -0
  378. package/packs/gallery/stats/template.html +1 -0
  379. package/packs/gallery/stats/writing.md +11 -0
  380. package/packs/gallery/today/component.json +12 -0
  381. package/packs/gallery/today/example.html +1 -0
  382. package/packs/gallery/today/kit.js +185 -0
  383. package/packs/gallery/today/preview.svg +1 -0
  384. package/packs/gallery/today/style.css +120 -0
  385. package/packs/gallery/today/template.html +1 -0
  386. package/packs/gallery/today/writing.md +14 -0
  387. package/packs/gallery/todos/component.json +19 -0
  388. package/packs/gallery/todos/example.html +3 -0
  389. package/packs/gallery/todos/kit.js +342 -0
  390. package/packs/gallery/todos/preview.svg +1 -0
  391. package/packs/gallery/todos/style.css +267 -0
  392. package/packs/gallery/todos/template.html +3 -0
  393. package/packs/gallery/todos/writing.md +30 -0
  394. package/packs/gallery/weather/component.json +19 -0
  395. package/packs/gallery/weather/example.html +3 -0
  396. package/packs/gallery/weather/kit.js +312 -0
  397. package/packs/gallery/weather/preview.svg +1 -0
  398. package/packs/gallery/weather/style.css +258 -0
  399. package/packs/gallery/weather/template.html +3 -0
  400. package/packs/gallery/weather/writing.md +26 -0
  401. package/packs/gallery-soft/pack.json +8 -0
  402. package/release.json +13 -11
  403. package/sdk/doc-kit.d.ts +404 -7
  404. package/sdk/doc-state.d.ts +2 -0
  405. package/skill/SKILL.md +71 -26
  406. package/skill/references/block-script.md +140 -0
  407. package/skill/references/building-blocks.md +257 -0
  408. package/skill/references/example-report.html +1 -1
  409. package/skill/references/extensions.md +59 -0
  410. package/skill/references/pages-and-data.md +221 -0
  411. package/skill/references/writing-html.md +9 -7
  412. package/skill/sdk/doc-kit.d.ts +404 -7
  413. package/skill/sdk/doc-state.d.ts +2 -0
  414. package/web/assets/index-BK2e_07w.js +13 -0
  415. package/web/assets/index-CWFI83mF.css +1 -0
  416. package/web/index.html +2 -2
  417. package/browser/editor/components/callout/page.mjs +0 -13
  418. package/dist/chunk-2PBALTR3.mjs +0 -57
  419. package/dist/chunk-3LA3EMDE.mjs +0 -15
  420. package/dist/chunk-5FRMCDPY.mjs +0 -16
  421. package/dist/chunk-5LEK2CBS.mjs +0 -2
  422. package/dist/chunk-5OFN5AHC.mjs +0 -2
  423. package/dist/chunk-5SIYS5HN.mjs +0 -2
  424. package/dist/chunk-5TEK3RAD.mjs +0 -2
  425. package/dist/chunk-6CYG3Z4V.mjs +0 -2
  426. package/dist/chunk-7GHT2UCA.mjs +0 -15
  427. package/dist/chunk-7QQBR7PB.mjs +0 -2
  428. package/dist/chunk-ATCJYAR4.mjs +0 -2
  429. package/dist/chunk-C7HWOBIF.mjs +0 -2
  430. package/dist/chunk-E7VYDG2X.mjs +0 -2
  431. package/dist/chunk-EZY3WC6Z.mjs +0 -15
  432. package/dist/chunk-FQGQH4KM.mjs +0 -2
  433. package/dist/chunk-G7TOXONE.mjs +0 -6
  434. package/dist/chunk-GPF4YWWB.mjs +0 -9
  435. package/dist/chunk-GYQV7Y4J.mjs +0 -120
  436. package/dist/chunk-HMHK3EQ6.mjs +0 -2
  437. package/dist/chunk-HQQMJCQJ.mjs +0 -10
  438. package/dist/chunk-IERUOGC3.mjs +0 -6
  439. package/dist/chunk-ITNLYXXV.mjs +0 -3
  440. package/dist/chunk-L4DVONOG.mjs +0 -2
  441. package/dist/chunk-LAE5NQ4B.mjs +0 -2
  442. package/dist/chunk-LC7YNQFG.mjs +0 -2
  443. package/dist/chunk-LHTFLRB6.mjs +0 -4
  444. package/dist/chunk-NFIBI4IP.mjs +0 -26
  445. package/dist/chunk-NSKUTQ5J.mjs +0 -5
  446. package/dist/chunk-O52JMOCZ.mjs +0 -2
  447. package/dist/chunk-P2CAZPDP.mjs +0 -3
  448. package/dist/chunk-QMQUXTU4.mjs +0 -12
  449. package/dist/chunk-QVWVFC5K.mjs +0 -6
  450. package/dist/chunk-QYKCJ7FG.mjs +0 -8
  451. package/dist/chunk-QZY6Q64C.mjs +0 -2
  452. package/dist/chunk-TDQP3DKQ.mjs +0 -10
  453. package/dist/chunk-TX6JH7TR.mjs +0 -2
  454. package/dist/chunk-UNUEWH4S.mjs +0 -2
  455. package/dist/chunk-V4CPWKMZ.mjs +0 -2
  456. package/dist/chunk-VACRB2NE.mjs +0 -3
  457. package/dist/chunk-W63L7367.mjs +0 -7
  458. package/dist/chunk-W7CXPCRV.mjs +0 -6
  459. package/dist/chunk-XINNG4F2.mjs +0 -4
  460. package/dist/chunk-YL2DPWVS.mjs +0 -4
  461. package/dist/chunk-YZ5Z6H4W.mjs +0 -4
  462. package/dist/chunk-ZBIM6ARY.mjs +0 -216
  463. package/skill/references/building-components.md +0 -327
  464. package/web/assets/index-B6Ai3wsa.js +0 -13
  465. package/web/assets/index-SYPC3EZy.css +0 -1
@@ -1,6 +1,6 @@
1
1
  # Third-party notices
2
2
 
3
- @heycys/gallery 0.1.0 carries the following code and data of others, bundled into dist/ and web/, built into kit/, or as files in vendor/ and browser/.
3
+ @heycys/gallery 0.1.2 carries the following code and data of others, bundled into dist/ and web/, built into kit/, or as files in vendor/ and browser/.
4
4
 
5
5
  ## @asamuzakjp/css-color 5.1.11
6
6
 
@@ -3251,3 +3251,53 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3251
3251
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3252
3252
  SOFTWARE.
3253
3253
  ```
3254
+
3255
+ ## Lucide icons
3256
+
3257
+ A few line icons are Lucide's (https://lucide.dev), as lucide-react 1.67.0 has them: the workbench's sidebar toggle, search, 新建 and settings gear, the 写作偏好 book, and the icon of a page with none (the workbench, the editor, the kit's page block, the browser tab).
3258
+
3259
+ ```
3260
+ ISC License
3261
+
3262
+ Copyright (c) 2026 Lucide Icons and Contributors
3263
+
3264
+ Permission to use, copy, modify, and/or distribute this software for any
3265
+ purpose with or without fee is hereby granted, provided that the above
3266
+ copyright notice and this permission notice appear in all copies.
3267
+
3268
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3269
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3270
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3271
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3272
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3273
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3274
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3275
+
3276
+ ---
3277
+
3278
+ The following Lucide icons are derived from the Feather project:
3279
+
3280
+ airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out
3281
+
3282
+ The MIT License (MIT) (for the icons listed above)
3283
+
3284
+ Copyright (c) 2013-present Cole Bemis
3285
+
3286
+ Permission is hereby granted, free of charge, to any person obtaining a copy
3287
+ of this software and associated documentation files (the "Software"), to deal
3288
+ in the Software without restriction, including without limitation the rights
3289
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
3290
+ copies of the Software, and to permit persons to whom the Software is
3291
+ furnished to do so, subject to the following conditions:
3292
+
3293
+ The above copyright notice and this permission notice shall be included in all
3294
+ copies or substantial portions of the Software.
3295
+
3296
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3297
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3298
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3299
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3300
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3301
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3302
+ SOFTWARE.
3303
+ ```
@@ -1,15 +1,23 @@
1
1
  import { svg } from "../icons.mjs";
2
+ import { CALLOUT } from "../kit.mjs";
3
+ import { setApart } from "../set-apart.mjs";
2
4
  import { t } from "../../../shared/i18n/index.mjs";
3
5
 
4
- // 提示块: the kit's .doc-callout holding inline text only, one text block that does not split
5
- // (Enter at its end makes a paragraph after it: `opensAfter`). page.mjs: its look while edited.
6
+ // 提示块: the kit's .doc-callout, a box of blocks that keep their own types set apart on a fill, a
7
+ // line at its left (the user's, 2026-11-07: a container as the highlight block is). It is the
8
+ // highlight block's kind of block in every rule but its look: no icon leads it, its line, its square
9
+ // corners. One written the old way, words straight in it (every callout before 2026-11-07, and what
10
+ // an Agent may still write), holds them as one paragraph: natural HTML makes them one in the file
11
+ // the first time the page writes it (source/natural.mjs, a box that holds one), the clipboard reads
12
+ // it so (set-apart.mjs).
6
13
  //
7
- // Where the engines reach it (src/editor/page/ unless named): typing/ (Enter: `opensBefore`, `opensAfter`),
8
- // core.mjs (a new one's kind and capabilities: newHost, reading `host`), convert.mjs (its type), clipboard/own/ (`clipboard`),
9
- // ../source/ (finding one that holds inline text only, and taking in the paragraph an Agent writes alone in one: `takes`).
10
- // Its look: the kit's styles/callout.css (src/render/kit/); its color a background only, the
11
- // palette's blue when it has none (`defaults`: that blue is the one 颜色 › marks, and picking it
12
- // writes no class).
14
+ // Where the engines reach it (src/editor/page/ unless named): typing/ (Enter on its empty last
15
+ // paragraph: `leaveByEnter`, typing/leave.mjs; Backspace in its one empty block: `removedEmpty`),
16
+ // convert.mjs (a block turned into one keeps its type; none inside another), clipboard/own/ (copying
17
+ // it, and any block with its class: `clipboard`), handle/ (its first line shows its handle:
18
+ // `firstLineActs`). Its look: the kit's styles/callout.css (src/render/kit/); its color a background
19
+ // only, the palette's blue when it has none (`colorDefaults`: that blue is the one 颜色 › marks, and
20
+ // picking it writes no class).
13
21
 
14
22
  // Its type's icon: a rounded box whose left side is a bar more than twice as thick as its lines (the
15
23
  // callout's line), the text's T in the middle of the room right of it. Drawn on the 20-unit grid
@@ -20,20 +28,37 @@ export default {
20
28
  name: "callout",
21
29
  listed: () => t("提示块"),
22
30
  units: {
23
- callout: { name: t("提示块"), match: [{ rank: 130, class: "doc-callout" }], boxed: true, colors: ["background"], colorDefaults: { background: "blue" } },
31
+ callout: {
32
+ name: t("提示块"), match: [{ rank: 130, class: "doc-callout" }],
33
+ boxed: true,
34
+ removedEmpty: true, // Backspace on its one empty block deletes it whole (typing/)
35
+ colors: ["background"], colorDefaults: { background: "blue" },
36
+ },
24
37
  },
25
- components: ["doc-callout"],
26
- hosts: {
27
- // It may be left empty (an empty one stays, as Notion's), and is written so.
28
- callout: { name: t("提示块"), whole: "div.doc-callout", takes: "p", opensBefore: true, opensAfter: true, caps: ({ bound }) => bound ? ["empty", "links"] : ["remove", "empty", "links"] },
38
+ boxes: {
39
+ callout: {
40
+ role: "flow", name: t("提示块"),
41
+ leaveByEnter: true, // Enter on its empty last block moves that block out after it (typing/leave.mjs)
42
+ endIsPadding: true, // under its last block is its padding: a click there makes no block (geometry.mjs endOf)
43
+ firstLineActs: true, // its first block shows its handle
44
+ groups: true,
45
+ holdsOne: true, // emptied, it keeps an empty paragraph (core.mjs tidyEmptied)
46
+ selectAll: { content: true },
47
+ classes: [{ rank: 75, class: "doc-callout" }],
48
+ },
29
49
  },
30
50
  types: {
31
51
  callout: {
32
52
  turn: 12, menu: ["basic", 11],
33
- tag: "div", className: "doc-callout", kind: "callout", host: "callout", leaf: "callout", text: true, empty: true, clipboard: { kind: "callout" },
53
+ tag: "div", className: "doc-callout", kind: "callout", box: "callout", leaf: "paragraph", container: ".doc-callout",
54
+ takesAsIs: true, holder: 4,
55
+ nests: false, // none inside another (a drop or a file may still nest one)
56
+ joins: false, // a block turned into one is one of its own, never another's
57
+ // Its blocks, one with words straight in it a paragraph of them (set-apart.mjs, the highlight block's rule too).
58
+ clipboard: { kind: "aside", claims: CALLOUT.match, ...setApart("callout", CALLOUT.match) },
34
59
  label: t("提示块"), icon: CALLOUT_ICON,
35
60
  words: "提示块 提示框 提示 注意 警告 tishi zhuyi jinggao tsk ts callout tip warning notice",
36
- glance: { row: 12, name: "提示块", write: "`div.doc-callout`", rule: "Kit blocks" },
61
+ glance: { row: 12, name: "提示块", write: "`div.doc-callout` holding `<p>`", rule: "Kit blocks" },
37
62
  },
38
63
  },
39
64
  };
@@ -49,11 +49,11 @@ export function ratiosAfterRemove(ratios, removed) {
49
49
  /**
50
50
  * The gap after column `index` dragged by `fraction` of the row's width: only the two columns
51
51
  * beside it change, snapping to their equal split or to a tenth of the row for the left one when
52
- * within 1%, both keeping the least share (1/24, or more where `least` says so for a part: the
52
+ * within `near` of the row (page/columns/ gives 5px of it; 1% when not said; 0: no snapping), both keeping the least share (1/24, or more where `least` says so for a part: the
53
53
  * share its content needs, a flowchart's node as narrow as the kit lets it be, page/columns/).
54
54
  * `ratios` are those when the drag started.
55
55
  */
56
- export function ratiosAfterResize(ratios, index, fraction, least = []) {
56
+ export function ratiosAfterResize(ratios, index, fraction, least = [], near = 0.01) {
57
57
  const left = ratios[index];
58
58
  const right = ratios[index + 1];
59
59
  const low = Math.max(MIN_RATIO, least[index] ?? 0);
@@ -62,8 +62,8 @@ export function ratiosAfterResize(ratios, index, fraction, least = []) {
62
62
  let moved = fraction;
63
63
  const equal = (left + right) / 2 - left;
64
64
  const step = Math.round(10 * (left + moved)) / 10 - left;
65
- if (Math.abs(equal - moved) < 0.01) moved = equal;
66
- else if (Math.abs(step - moved) < 0.01) moved = step;
65
+ if (Math.abs(equal - moved) < near) moved = equal;
66
+ else if (Math.abs(step - moved) < near) moved = step;
67
67
  moved = Math.min(Math.max(moved, low - left), right - high);
68
68
  const out = [...ratios];
69
69
  out[index] = left + moved;
@@ -97,36 +97,42 @@ export function setRatios(row, ratios) {
97
97
  // ---------- making rows and columns ----------
98
98
 
99
99
  /**
100
- * A new row where `target` stands: `target` in one column, each of `groups` (lists of nodes: blocks
101
- * with their leads) in a column of its own, `side` of it ("left" or "right"); equal widths.
102
- * Returns { focus: the row, created }.
100
+ * A new row where `target` stands: `target` (a block, or blocks next to each other: a folded heading
101
+ * with what it hides) in one column, each of `groups` (lists of nodes: blocks with their leads) in a
102
+ * column of its own, `side` of it ("left" or "right"); equal widths. Returns { focus: the row, created }.
103
103
  */
104
104
  export function rowAround(target, groups, side = "right") {
105
105
  begin();
106
- const doc = target.ownerDocument;
107
- const parts = withLeads(target);
106
+ const own = [target].flat();
107
+ const doc = own[0].ownerDocument;
108
+ const parts = own.flatMap(withLeads);
108
109
  const row = made(newContainer(doc, "columns"));
109
110
  parts[0].before(row);
110
- const own = made(newContainer(doc, "column"));
111
- placeBefore(own, parts, null);
111
+ const column = made(newContainer(doc, "column"));
112
+ placeBefore(column, parts, null);
112
113
  const others = groups.map((nodes) => {
113
- const column = made(newContainer(doc, "column"));
114
- placeBefore(column, nodes, null);
115
- return column;
114
+ const other = made(newContainer(doc, "column"));
115
+ placeBefore(other, nodes, null);
116
+ return other;
116
117
  });
117
- row.append(...(side === "left" ? [...others, own] : [own, ...others]));
118
+ row.append(...(side === "left" ? [...others, column] : [column, ...others]));
118
119
  return done(row);
119
120
  }
120
121
 
121
- /** Blocks next to each other (with their leads), each in a column of its own of a new row where they stood. Returns { focus: the row, created }. */
122
+ /**
123
+ * Blocks next to each other (with their leads), each in a column of its own of a new row where they
124
+ * stood; one may be a list of blocks (a folded heading with what it hides), a column for them all.
125
+ * Returns { focus: the row, created }.
126
+ */
122
127
  export function rowOf(units) {
123
128
  begin();
124
- const doc = units[0].ownerDocument;
129
+ const groups = units.map((unit) => [unit].flat());
130
+ const doc = groups[0][0].ownerDocument;
125
131
  const row = made(newContainer(doc, "columns"));
126
- withLeads(units[0])[0].before(row);
127
- for (const unit of units) {
132
+ withLeads(groups[0][0])[0].before(row);
133
+ for (const group of groups) {
128
134
  const column = made(newContainer(doc, "column"));
129
- placeBefore(column, withLeads(unit), null);
135
+ placeBefore(column, group.flatMap(withLeads), null);
130
136
  row.append(column);
131
137
  }
132
138
  return done(row);
@@ -151,11 +157,12 @@ export function addColumn(row, index, nodes = null) {
151
157
  }
152
158
 
153
159
  /**
154
- * 分两栏 (分三栏, 分四栏: `count` columns) with a block alone: a new row, the block in the left column
155
- * and a new empty paragraph in each of the others. Returns { focus: the first of them, created }.
160
+ * 分两栏 (分三栏, 分四栏: `count` columns) with a block alone (or a folded heading with what it hides,
161
+ * `target` a list: rowAround): a new row, the block in the left column and a new empty paragraph in
162
+ * each of the others. Returns { focus: the first of them, created }.
156
163
  */
157
164
  export function splitBeside(target, count = 2) {
158
- const paragraphs = Array.from({ length: count - 1 }, () => newHost(target.ownerDocument, "paragraph"));
165
+ const paragraphs = Array.from({ length: count - 1 }, () => newHost([target].flat()[0].ownerDocument, "paragraph"));
159
166
  const { created } = rowAround(target, paragraphs.map((paragraph) => [paragraph]), "right");
160
167
  return { focus: paragraphs[0], created };
161
168
  }
@@ -174,9 +181,11 @@ export const fitColumn = (units) => units.length > 0 && units.every((unit) => ac
174
181
  * "分栏" for blocks (in document order): null when it does not apply, otherwise why it cannot be
175
182
  * done, or "". One block in a column adds a column right of its own; one block elsewhere becomes a
176
183
  * row with a new empty column beside it; several next to each other in one container (not in a
177
- * column), a row with a column each.
184
+ * column), a row with a column each. `taken(unit)`: what goes into a unit's column with it (a folded
185
+ * heading's: it and what it hides, fold/ withHidden), each of which a column must take, and which
186
+ * stands between the units it joins as they are next to each other for the reader.
178
187
  */
179
- export function columnsCheck(units) {
188
+ export function columnsCheck(units, taken = (unit) => [unit]) {
180
189
  if (units.length === 0) return null;
181
190
  const box = units[0].parentElement;
182
191
  if (!box?.hasAttribute("data-ge-box") || units.some((unit) => unit.parentElement !== box)) return null;
@@ -185,12 +194,13 @@ export function columnsCheck(units) {
185
194
  if (units.length > 1) return null;
186
195
  return columnsOf(column.parentElement).length >= MAX_COLUMNS ? t("一行最多 {0} 栏", MAX_COLUMNS) : "";
187
196
  }
188
- if (!accepts(boxKind(box), "columns") || !fitColumn(units)) return null;
197
+ const all = units.flatMap(taken);
198
+ if (!accepts(boxKind(box), "columns") || !fitColumn(all)) return null;
189
199
  if (units.length > MAX_COLUMNS) return t("一行最多 {0} 栏", MAX_COLUMNS);
190
200
  if (units.length === 1) return "";
191
201
  const blocks = unitsOf(box);
192
- const first = blocks.indexOf(units[0]);
193
- return units.every((unit, index) => blocks[first + index] === unit) ? "" : t("只有相邻的块能并排分栏:中间还有没选中的块");
202
+ const first = blocks.indexOf(all[0]);
203
+ return all.every((unit, index) => blocks[first + index] === unit) ? "" : t("只有相邻的块能并排分栏:中间还有没选中的块");
194
204
  }
195
205
 
196
206
  // ---------- the commands ----------
@@ -200,10 +210,13 @@ export function columnsCheck(units) {
200
210
  * struct (a structural undo step), say, and blocks() (the block handles and selection, blocks.mjs).
201
211
  */
202
212
  export function create({ struct, say, blocks }) {
213
+ // What goes into a block's column with it: a folded heading's section goes with it (fold/ withHidden).
214
+ const taken = (unit) => blocks().folds?.withHidden(unit) ?? [unit];
215
+
203
216
  // Blocks that pass columnsCheck: a block in a column gets a column right of its own; a block
204
217
  // elsewhere becomes a row of `count` columns, it in the first and empty ones beside it (Feishu's
205
- // two columns; the block menu's 分两栏, 分三栏, 分四栏); several, a row with a column each. The caret
206
- // goes into the first new column's paragraph, or the row is selected.
218
+ // two columns; the block menu's 分两栏, 分三栏, 分四栏); several, a row with a column each, a folded
219
+ // heading's with what it hides. The caret goes into the first new column's paragraph, or the row is selected.
207
220
  function split(units, count = 2) {
208
221
  blocks().clear();
209
222
  const column = units.length === 1 ? columnOf(units[0]) : null;
@@ -212,7 +225,7 @@ export function create({ struct, say, blocks }) {
212
225
  return;
213
226
  }
214
227
  const result = struct([units[0].parentElement], [], () => {
215
- const made = units.length === 1 ? splitBeside(units[0], count) : rowOf(units);
228
+ const made = units.length === 1 ? splitBeside(taken(units[0]), count) : rowOf(units.map(taken));
216
229
  return { touched: [], focus: made.focus, select: units, created: made.created };
217
230
  });
218
231
  if (units.length === 1) caretAt(result.focus, "start");
@@ -238,7 +251,7 @@ export function create({ struct, say, blocks }) {
238
251
  return {
239
252
  tidy: tidyRows,
240
253
  // What the block tools and the gaps between columns read and do by themselves (block-menu/, drag/, page/columns/).
241
- columnOps: { split, add, columnOf, columnsCheck, columnsOf, addColumn, rowAround, ratiosOf, ratiosAfterResize, setRatios, sized },
254
+ columnOps: { split, add, columnOf, columnsCheck: (units, take = taken) => columnsCheck(units, take), columnsOf, addColumn, rowAround, ratiosOf, ratiosAfterResize, setRatios, sized },
242
255
  };
243
256
  }
244
257
 
@@ -26,7 +26,8 @@ export default {
26
26
  },
27
27
  boxes: {
28
28
  // Its content always holds a block (holdsOne): emptied, it keeps an empty paragraph to write in.
29
- details: { role: "flow", name: t("折叠列表"), groups: true, holdsOne: true, emptyIsNothing: true, selectAll: { content: true }, classes: [{ rank: 30, class: classOf(stepOf(DETAILS.content)) }], find: (unit) => detailsContent(unit) },
29
+ // Under its last block is its padding: a click there makes no block (endIsPadding).
30
+ details: { role: "flow", name: t("折叠列表"), groups: true, holdsOne: true, endIsPadding: true, emptyIsNothing: true, selectAll: { content: true }, classes: [{ rank: 30, class: classOf(stepOf(DETAILS.content)) }], find: (unit) => detailsContent(unit) },
30
31
  },
31
32
  placeholders: { label: t("折叠列表标题") },
32
33
  hosts: {
@@ -22,7 +22,8 @@ export const DIALOG_TRIGGER = "doc-dialog-trigger";
22
22
 
23
23
  export default {
24
24
  name: "dialog",
25
- // A link in the text that opens a card, a chip as padded as code: Backspace beside it takes it whole.
25
+ // A link in the text that opens a card, a chip as padded as code: Backspace right of it (Delete
26
+ // left of it) takes it whole, as a chip of the text goes; its words are edited from inside it.
26
27
  entry: { at: `a.${DIALOG_TRIGGER}`, removed: t("入口已移除:页面上没有地方能打开这张详情卡片了 · Ctrl+Z 撤销") },
27
28
  units: {
28
29
  // The server finds detail cards by their element (findUnits). No block of the page's flow, a card
@@ -1,7 +1,6 @@
1
1
  import { can, firstHost, newHost } from "../../page/core.mjs";
2
2
  import { caretAt, editable } from "../../page/caret.mjs";
3
3
  import { padCaret } from "../../page/pads.mjs";
4
- import { addStyle } from "../../page/ui.mjs";
5
4
  import { DIALOG } from "../kit.mjs";
6
5
  import { linkAround } from "../../page/links/index.mjs";
7
6
  import { DIALOG_TRIGGER, dialogContent, entryOf } from "./index.mjs";
@@ -18,22 +17,6 @@ import { t } from "../../../shared/i18n/index.mjs";
18
17
  // no one sees (an undo step, a word 搜索文档 found) opens it (show). A page shown again has the
19
18
  // cards it had, the same one on top (kept, reopen).
20
19
 
21
- // While the page is edited the page's gutters are the room the handle takes beside a block
22
- // (--ge-edge-room, handle/). The card keeps its width and its text the page's (dialog.css): at a
23
- // window narrower than it, what is left of those gutters stands outside the card, where a press
24
- // closes it.
25
- const STYLE = `
26
- :root[data-ge-editing] { --doc-dialog-edge: calc(var(--ge-edge-room) - var(--doc-dialog-side)); }
27
- @media screen {
28
- /* Where the page keeps room for the outline (margin.mjs), a card stands on the column, its text on the page's: the column and the room at each side of its text, as far left. */
29
- :root[data-ge-margin] .doc-dialog {
30
- width: calc(var(--ge-margin-column) + 2 * var(--doc-dialog-side));
31
- margin-left: calc(max(var(--ge-margin-side), calc((100% - var(--ge-outline-room, 0px) - var(--ge-margin-column)) / 2)) - var(--doc-dialog-side));
32
- margin-right: 0;
33
- }
34
- }
35
- `;
36
-
37
20
  /**
38
21
  * A new detail card (dialog.doc-dialog) with this id, the kit's markup: a content region (a box)
39
22
  * holding a heading of `title` (text), the size a detail card's opens with, and an empty paragraph.
@@ -112,7 +95,6 @@ function followCards() {
112
95
  * the page), blocks (the block tools) and isEditing.
113
96
  */
114
97
  export function create({ struct, say, limitText, selectionContext, hideFormatBar, closeTools, blocks, isEditing }) {
115
- addStyle(STYLE);
116
98
  const cards = followCards();
117
99
 
118
100
  // A card closed: it leaves nothing behind. The caret goes to its entry, outside it, when that is in
@@ -22,7 +22,7 @@ export default {
22
22
  name: "divider",
23
23
  listed: () => t("分割线"),
24
24
  units: {
25
- rule: { name: t("分割线"), match: [{ rank: 230, tag: "hr" }], boxed: true, turnsEmpty: true },
25
+ rule: { name: t("分割线"), match: [{ rank: 230, tag: "hr" }], boxed: true, turnsEmpty: true, leadsChapter: true },
26
26
  },
27
27
  types: {
28
28
  divider: {
@@ -24,8 +24,8 @@ export const HEIGHT = "--doc-embed-height";
24
24
  /** The frame's height as a size: the least and the most (px) it may be given. */
25
25
  export const HEIGHT_SIZE = { min: 96, max: 2000, px: true };
26
26
 
27
- /** The sandbox of a web page's frame (Notion's), and of an HTML file's (no origin of its own). */
28
- export const WEB_SANDBOX = "allow-scripts allow-popups allow-top-navigation-by-user-activation allow-forms allow-same-origin allow-storage-access-by-user-activation allow-popups-to-escape-sandbox";
27
+ /** The sandbox of a web page's frame (Notion's: the sidebar's web links have it too, shared/web-links.mjs), and of an HTML file's (no origin of its own). */
28
+ export { WEB_SANDBOX } from "../../../shared/web-links.mjs";
29
29
  export const FILE_SANDBOX = "allow-scripts allow-popups allow-forms allow-modals";
30
30
 
31
31
  /**
@@ -1,18 +1,27 @@
1
1
  import { SPAN } from "../../../shared/media.mjs";
2
2
  import { ICONS } from "../../page/menu.mjs";
3
3
  import { lookRow } from "../rows.mjs";
4
+ import { addStyle } from "../../page/ui.mjs";
4
5
  import { CENTERED, CHART_HEIGHT } from "./index.mjs";
5
6
  import { t } from "../../../shared/i18n/index.mjs";
6
7
 
7
8
  // 卡片 on the page: its rows of the block menu (docs/editor.md, "Resizing cards, tables and
8
9
  // code blocks"; resize/ drags the same sizes by their edges): the card centered or at full width,
9
- // and back to the default size once a width or height is set.
10
+ // and back to the default size once a width or height is set. Its title and caption take no fill
11
+ // while edited.
12
+
13
+ // A card's title and caption (the `field` kind, a table's scope line with it) are plain text, as a
14
+ // media block's caption: no fill under the pointer or the caret (editor.mjs's --ge-text-tint).
15
+ const STYLE = `
16
+ [data-ge-editing] [data-ge-kind="field"][contenteditable="true"] { --ge-text-tint: none; }
17
+ `;
10
18
 
11
19
  /**
12
20
  * look(element, { classes, sizes }, select): the editor's undoable change of classes and sizes
13
21
  * (history.mjs); say: the status line.
14
22
  */
15
23
  export function create({ look, say }) {
24
+ addStyle(STYLE);
16
25
  const row = (target, options) => lookRow({ look, say }, target, options);
17
26
  return {
18
27
  /** The card's rows of the block menu (none for another block). */
@@ -103,8 +103,8 @@ export function create({ pages, fileUrl }) {
103
103
  pick, menuItems,
104
104
  /** Whether a file makes a file block: any that is no image. */
105
105
  acceptsFile: (file) => !/^image\//.test(file.type),
106
- /** A file block below the block of `host` (a text block), `file` uploaded. Returns whether it took it. */
107
- fromFiles: (host, [file]) => media.paste(host, file, newFile, uploadInto),
106
+ /** A file block made of `file`, put where the paste puts it (`put`), its file uploaded. Returns whether it took it. */
107
+ fromFiles: (put, [file]) => media.paste(put, file, newFile, uploadInto),
108
108
  /** A new one: its file chosen next. */
109
109
  onCreated(figure) {
110
110
  pick(figure);
@@ -10,20 +10,21 @@ import { t } from "../../../shared/i18n/index.mjs";
10
10
  // card's vertical middle (the layer over the page draws it: overlay-layer.mjs, so it scrolls with
11
11
  // the node and never touches the report's markup; above the handle and a section's bar there,
12
12
  // IN_LAYER button, so the half of a row's last node's button over its section's bar is the
13
- // button's), a white surface with a hairline border and a thin outline plus, grey once the pointer
14
- // is on it (Notion-flat: no blue). A click adds a node right
13
+ // button's), a white surface lifted by a soft shadow (no line round it) and a thin outline plus, the plus
14
+ // darker once the pointer is on it and the surface grey only while it is pressed (the editor's icon button
15
+ // look, look.mjs BUTTONS; Notion-flat: no blue). A click adds a node right
15
16
  // after it (page.mjs addAfter: one undo step, the caret in its empty first line, bold armed); the
16
17
  // press itself moves no caret and starts no box selection. It goes as the pointer leaves the node
17
18
  // (and the button), as a drag or a box selection begins, and with any structural change that takes
18
19
  // its node away.
19
20
 
20
21
  const STYLE = `
21
- .ge-flow-add { z-index: ${IN_LAYER.button}; box-sizing: border-box; width: 22px; height: 22px; padding: 0; border: 1px solid light-dark(rgb(29 29 31 / 16%), rgb(243 243 243 / 18%)); border-radius: 50%;
22
- background: var(--doc-surface, #fff); color: var(--ge-ico2); cursor: pointer; pointer-events: auto; box-shadow: 0 1px 2px light-dark(rgb(25 25 25 / 6%), rgb(0 0 0 / 20%));
23
- opacity: 0; transition: opacity .12s, background-color .12s, color .12s, border-color .12s; }
22
+ .ge-flow-add { z-index: ${IN_LAYER.button}; box-sizing: border-box; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 50%;
23
+ background: var(--doc-surface, #fff); color: var(--ge-ico2); cursor: pointer; pointer-events: auto; box-shadow: 0 1px 3px light-dark(rgb(25 25 25 / 18%), rgb(0 0 0 / 45%));
24
+ opacity: 0; transition: opacity .12s, background-color .12s, color .12s; }
24
25
  .ge-flow-add[data-shown] { opacity: 1; }
25
26
  .ge-flow-add > svg { display: block; width: 14px; height: 14px; margin: 3px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; }
26
- .ge-flow-add:hover { background: light-dark(#f4f4f3, #2f2f2f); color: var(--ge-ico); border-color: light-dark(rgb(29 29 31 / 24%), rgb(255 255 255 / 26%)); }
27
+ .ge-flow-add:hover { color: var(--ge-ico); }
27
28
  .ge-flow-add:active { background: light-dark(#ebebea, #404040); }
28
29
  @media (prefers-reduced-motion: reduce) { .ge-flow-add { transition: none; } }
29
30
  `;
@@ -266,7 +266,7 @@ const NODE_CHOICES = [
266
266
  const STYLE = `
267
267
  [data-ge-editing] ol.doc-flow > li { --ge-text-radius: 8px; }
268
268
  [data-ge-editing] ol.doc-flow > li > * { --ge-text-radius: 3px; }
269
- [data-ge-editing] ol.doc-flow > li > p[data-ge-placeholder]:first-of-type::before { font-weight: 600; }
269
+ [data-ge-editing] ol.doc-flow > li > p[data-ge-placeholder]:first-of-type::before { font-weight: 700; }
270
270
  `;
271
271
 
272
272
  /**
@@ -8,6 +8,8 @@ import { t } from "../../../shared/i18n/index.mjs";
8
8
  // Where the engines reach it (src/editor/page/ unless named): typing/ (an empty heading's
9
9
  // placeholder, `placeholder` below), convert.mjs and markdown/ ("# " to "#### "), core.mjs (Enter splits a
10
10
  // heading into a paragraph), clipboard/own/ and src/transfer/markdown.mjs (written by its level: `clipboard`).
11
+ // Folding its section: page/fold/ (the triangle right of its words, what is hidden, the section going with
12
+ // it wherever blocks are taken away whole) and page.mjs (Ctrl/⌘+Enter in its words).
11
13
  // Its color (颜色 in the block menu): class switches, colors.mjs.
12
14
  // Its look: the kit's styles/flow.css (src/render/kit/).
13
15
  // How a heading of a level is written out: # … #### by level.
@@ -0,0 +1,6 @@
1
+ // 标题 on the page: Ctrl/⌘+Enter in its words folds or unfolds its section (notion-lite's toggle's
2
+ // commandEnter); the fold itself, its triangle and what goes with a folded heading are page/fold/.
3
+
4
+ export function create(ctx) {
5
+ return { keys: { commandEnter: ({ host }) => ctx.blocks()?.folds.toggle(host) ?? false } };
6
+ }
@@ -1,6 +1,6 @@
1
- import { escapeText } from "../../../shared/escape.mjs";
2
1
  import { svg } from "../icons.mjs";
3
2
  import { HIGHLIGHT } from "../kit.mjs";
3
+ import { setApart } from "../set-apart.mjs";
4
4
  import { t } from "../../../shared/i18n/index.mjs";
5
5
 
6
6
  // 高亮块: the kit's .doc-panel, a box of blocks that keep their own types, with the opening
@@ -33,6 +33,7 @@ export default {
33
33
  role: "flow", name: t("高亮块"),
34
34
  also: ["icon"], // a highlight block's icon
35
35
  leaveByEnter: true, // Enter on its empty last block moves that block out after it (typing/leave.mjs)
36
+ endIsPadding: true, // under its last block is its padding: a click there makes no block (the user's, 2026-11-06; geometry.mjs endOf)
36
37
  lead: "icon", // its icon, first in it
37
38
  firstLineActs: true, // its first block shows its handle
38
39
  groups: true,
@@ -52,25 +53,8 @@ export default {
52
53
  nests: false, // none inside another (a drop or a file may still nest one)
53
54
  joins: false, // a block turned into one is one of its own (Notion's callout), never another's
54
55
  leadIcon: "💡", // Notion's new callout
55
- clipboard: {
56
- kind: "aside", claims: HIGHLIGHT.match,
57
- // Its blocks; one with words straight in it, a paragraph of what it says. A list with its class
58
- // is a list, and a text block of a type of its own that type.
59
- describe(node, { isHost, holding, colorOf, copiedType, serializeInner, plain }) {
60
- if (!node.matches(HIGHLIGHT.match) || node.matches("ul, ol") || (isHost(node) && copiedType(node))) return undefined;
61
- const straight = [...node.childNodes].some((child) => child.nodeType === 3 && child.data.trim());
62
- const words = isHost(node) ? serializeInner(node) : straight ? escapeText(plain(node)) : null;
63
- const blocks = words === null ? holding(node) : [{ type: "paragraph", html: words }];
64
- const color = colorOf(node);
65
- return blocks ? { type: "highlight", blocks, ...(color ? { color } : {}) } : null;
66
- },
67
- endsIn(unit, { blocksIn, boxesOf, colorOf }) {
68
- if (!unit.matches(HIGHLIGHT.match)) return undefined;
69
- const color = colorOf(unit);
70
- return [{ type: "highlight", blocks: blocksIn(boxesOf(unit)), ...(color ? { color } : {}) }];
71
- },
72
- check: (block, { container }) => container(block),
73
- },
56
+ // Its blocks, one with words straight in it a paragraph of them (set-apart.mjs, the callout's rule too).
57
+ clipboard: { kind: "aside", claims: HIGHLIGHT.match, ...setApart("highlight", HIGHLIGHT.match) },
74
58
  label: t("高亮块"), icon: svg('<rect x="3.25" y="3.25" width="13.5" height="13.5" rx="2.5"/><rect x="6" y="6.5" width="8" height="2.75" rx=".6" fill="currentColor" stroke="none" opacity=".35"/><path d="M6.25 12.75h7.5"/>'),
75
59
  words: "高亮块 高亮 概述 摘要 gaoliang gaishu zhaiyao glk gl highlight panel summary",
76
60
  glance: { row: 12, name: "高亮块", before: "; ", write: "`<aside>`", after: "`aside.doc-panel` (one made in the preview a `div.doc-panel`, the same block)", rule: "Kit blocks" },
@@ -18,8 +18,19 @@ const LEVELS = {
18
18
  export const FORMULA_ICON = svg('<path d="M1.6 11.6 5.5 16.25 9.5 3.75h8.75"/><path d="m10.6 7.9 6.6 8.35M17.2 7.9l-6.6 8.35"/>');
19
19
 
20
20
  /** A link (two rings of a chain): the "/" menu's 链接, 链接视图, an empty link's chip, one drawing. */
21
- /** A page (the workbench's tree draws the same): the "/" menu's 页面, a page block left empty, a page with no icon in a search's rows. */
22
- export const PAGE_ICON = svg('<path d="M5.75 2.75h5.5l3.5 3.5v9.5a1.5 1.5 0 0 1-1.5 1.5h-7.5a1.5 1.5 0 0 1-1.5-1.5V4.25a1.5 1.5 0 0 1 1.5-1.5z"/><path d="M11 2.75v3c0 .41.34.75.75.75h3"/><path d="M7.25 10h5.5M7.25 13h3.5"/>');
21
+ /** A page (as the workbench's tree draws one with no icon: Lucide's file-text, FinHarness's 文档, here in 20 units): the "/" menu's 页面, a page block left empty, a page with no icon in a search's rows. */
22
+ export const PAGE_ICON = svg('<path d="M5 18.33a1.67 1.67 0 0 1-1.67-1.66V3.33a1.67 1.67 0 0 1 1.67-1.66h6.67a2 2 0 0 1 1.42.58l2.99 2.99a2 2 0 0 1 .59 1.43v10a1.67 1.67 0 0 1-1.67 1.66z"/><path d="M11.67 1.67v4.16c0 .46.37.84.83.84h4.17"/><path d="M8.33 7.5H6.67M13.33 10.83H6.67M13.33 14.17H6.67"/>');
23
+
24
+ /** A section (分区): blocks gathered between brackets, the block menu's 组成新分区 and the section's line in 设置 › 组件列表. */
25
+ export const SECTION_ICON = svg('<path d="M6 3.75h-.75a2 2 0 0 0-2 2v8.5a2 2 0 0 0 2 2H6M14 3.75h.75a2 2 0 0 1 2 2v8.5a2 2 0 0 1-2 2H14"/><path d="M7.25 7.75h5.5M7.25 12.25h5.5"/>');
26
+
27
+ /**
28
+ * A custom block (自定义块): a card of text, a rounded square with a short title line over two longer
29
+ * ones. The one mark of a block that has no picture of its own: the "/" menu's row and a block's menu,
30
+ * 添加自定义块's library, and a custom block's line in 设置 › 组件列表. On the 20 box of the icons beside
31
+ * it, so that the menus' stroke (1.25 at 20px) is its stroke too.
32
+ */
33
+ export const BLOCK_ICON = svg('<rect x="3.25" y="3.25" width="13.5" height="13.5" rx="2.5"/><path d="M6.75 7h3.5M6.75 10h6.5M6.75 13h4.5"/>');
23
34
 
24
35
  /** A detail card (详情卡片): a card with two lines of text. */
25
36
  export const DIALOG_ICON = svg('<rect x="3.25" y="3.75" width="13.5" height="12.5" rx="2.5"/><path d="M6.5 8h7M6.5 11.5h4.5"/>');
@@ -1,5 +1,5 @@
1
1
  import { Z } from "../../../shared/layers.mjs";
2
- import { addStyle, element, mount } from "../../page/ui.mjs";
2
+ import { addStyle, element, mount, textButton } from "../../page/ui.mjs";
3
3
  import { t } from "../../../shared/i18n/index.mjs";
4
4
 
5
5
  // 裁剪图片 (notion-lite's blocks/image/edit/crop.js, Notion's 31868): a dialog over the page, the
@@ -19,13 +19,10 @@ const STYLE = `
19
19
  box-shadow: 0 0 0 1px var(--ge-outline), 0 20px 40px rgb(0 0 0 / 30%); }
20
20
  .ge-crop-bar { display: flex; align-items: center; gap: 6px; padding: 10px 12px; border-bottom: 1px solid var(--ge-line); }
21
21
  .ge-crop-title { flex: 1; text-align: center; font-weight: 500; white-space: nowrap; }
22
- .ge-crop-shape, .ge-crop-cancel, .ge-crop-save { height: 28px; padding: 0 10px; border: 0; border-radius: 6px; background: transparent; color: inherit; font: inherit; cursor: pointer; }
23
- .ge-crop-shape { color: var(--ge-tx2); }
22
+ .ge-crop-shape { height: 28px; padding: 0 10px; border: 0; border-radius: 6px; background: transparent; color: var(--ge-tx2); font: inherit; cursor: pointer; }
24
23
  .ge-crop-shape[aria-pressed="true"] { background: var(--ge-fill); color: var(--ge-accent-text); }
25
- .ge-crop-shape:hover, .ge-crop-cancel:hover { background: var(--ge-hover); }
26
- .ge-crop-cancel { color: var(--ge-tx2); }
27
- .ge-crop-save { background: var(--ge-accent); color: #fff; font-weight: 500; }
28
- .ge-crop-save:hover { background: var(--ge-accent-hover); }
24
+ .ge-crop-shape:hover { background: var(--ge-hover); }
25
+ .ge-crop-shape[aria-pressed="true"]:hover { background: var(--ge-btn-primary-hover); }
29
26
  .ge-crop-body { display: flex; justify-content: center; padding: 30px; background: light-dark(#f7f6f3, #1f1f1f); }
30
27
  .ge-crop-stage { position: relative; overflow: hidden; }
31
28
  .ge-crop-stage > img { display: block; max-width: 70vw; max-height: 75vh; pointer-events: none; }
@@ -56,8 +53,8 @@ export function openCrop(img, save, from = {}) {
56
53
  button.addEventListener("click", () => shape(ratio, button));
57
54
  return button;
58
55
  });
59
- const cancel = element("button", { type: "button", class: "ge-crop-cancel", text: t("取消") });
60
- const done = element("button", { type: "button", class: "ge-crop-save", text: t("保存") });
56
+ const cancel = textButton(t("取消"), null, { class: "ge-crop-cancel" });
57
+ const done = textButton(t("保存"), null, { class: "ge-crop-save", primary: true });
61
58
  const dialog = element("div", { class: "ge-crop-dialog", role: "dialog", "aria-label": t("裁剪图片") },
62
59
  element("div", { class: "ge-crop-bar" }, ...shapes, element("div", { class: "ge-crop-title", text: t("裁剪图片") }), cancel, done),
63
60
  element("div", { class: "ge-crop-body" }, stage));
@@ -373,8 +373,8 @@ export function create({ pages, assetUrl }) {
373
373
  pick, menuItems, fromLink,
374
374
  /** Whether a file makes an image. */
375
375
  acceptsFile: (file) => /^image\//.test(file.type),
376
- /** An image below the block of `host` (a text block), the picture of `file` uploaded. Returns whether it took it. */
377
- fromFiles: (host, [file]) => media.paste(host, file, newImage, uploadInto),
376
+ /** An image made of `file`, put where the paste puts it (`put`), its picture uploaded. Returns whether it took it. */
377
+ fromFiles: (put, [file]) => media.paste(put, file, newImage, uploadInto),
378
378
  /** A new one: its picture chosen next. */
379
379
  onCreated(figure) {
380
380
  pick(figure);