@heycys/gallery 0.1.1 → 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 (370) hide show
  1. package/THIRD-PARTY-NOTICES.md +1 -1
  2. package/browser/editor/components/columns/page.mjs +4 -4
  3. package/browser/editor/components/embed/index.mjs +2 -2
  4. package/browser/editor/components/flowchart/add.mjs +7 -6
  5. package/browser/editor/components/flowchart/page.mjs +1 -1
  6. package/browser/editor/components/icons.mjs +8 -0
  7. package/browser/editor/components/image/crop.mjs +6 -9
  8. package/browser/editor/components/installed/index.mjs +11 -4
  9. package/browser/editor/components/installed/page.mjs +27 -16
  10. package/browser/editor/components/installed/served.mjs +6 -5
  11. package/browser/editor/components/instances.mjs +18 -0
  12. package/browser/editor/components/list/page.mjs +3 -6
  13. package/browser/editor/components/registry.mjs +13 -4
  14. package/browser/editor/components/table/index.mjs +59 -2
  15. package/browser/editor/components/table/page.mjs +1 -1
  16. package/browser/editor/page/annotate/card.mjs +3 -6
  17. package/browser/editor/page/autosave.mjs +310 -37
  18. package/browser/editor/page/board/client.mjs +57 -0
  19. package/browser/editor/page/board/hint.mjs +145 -0
  20. package/browser/editor/page/board/history.mjs +119 -0
  21. package/browser/editor/page/board/index.mjs +970 -0
  22. package/browser/editor/page/board/settings.mjs +209 -0
  23. package/browser/editor/page/caret.mjs +1 -1
  24. package/browser/editor/page/changes/bar.mjs +6 -14
  25. package/browser/editor/page/changes/index.mjs +2 -2
  26. package/browser/editor/page/clipboard/import/html.mjs +29 -6
  27. package/browser/editor/page/clipboard/import/inline.mjs +32 -0
  28. package/browser/editor/page/clipboard/import/markdown.mjs +58 -13
  29. package/browser/editor/page/clipboard/import/read.mjs +6 -1
  30. package/browser/editor/page/clipboard/import/to-blocks.mjs +44 -12
  31. package/browser/editor/page/clipboard/import/yuque.mjs +622 -0
  32. package/browser/editor/page/clipboard/index.mjs +124 -13
  33. package/browser/editor/page/clipboard/own/blocks.mjs +11 -11
  34. package/browser/editor/page/clipboard/own/chart-keys.mjs +41 -28
  35. package/browser/editor/page/clipboard/own/selection.mjs +1 -1
  36. package/browser/editor/page/columns/index.mjs +48 -46
  37. package/browser/editor/page/commit.mjs +80 -22
  38. package/browser/editor/page/conflicts.mjs +7 -7
  39. package/browser/editor/page/core.mjs +31 -15
  40. package/browser/editor/page/custom-page.mjs +106 -0
  41. package/browser/editor/page/editor.mjs +51 -14
  42. package/browser/editor/page/emoji-picker/styles.mjs +7 -12
  43. package/browser/editor/page/emoji-picker/upload.mjs +2 -2
  44. package/browser/editor/page/handle/index.mjs +5 -8
  45. package/browser/editor/page/history.mjs +24 -4
  46. package/browser/editor/page/links/index.mjs +5 -3
  47. package/browser/editor/page/links/pages.mjs +27 -9
  48. package/browser/editor/page/look.mjs +54 -3
  49. package/browser/editor/page/margin.mjs +18 -3
  50. package/browser/editor/page/media-menu/index.mjs +6 -7
  51. package/browser/editor/page/menu.mjs +18 -7
  52. package/browser/editor/page/notices.mjs +2 -2
  53. package/browser/editor/page/page-objects.mjs +13 -2
  54. package/browser/editor/page/panel.mjs +4 -9
  55. package/browser/editor/page/present-links.mjs +11 -2
  56. package/browser/editor/page/resize/index.mjs +42 -29
  57. package/browser/editor/page/served.mjs +14 -0
  58. package/browser/editor/page/session.mjs +48 -4
  59. package/browser/editor/page/slash-menu/index.mjs +3 -3
  60. package/browser/editor/page/table/cells.mjs +102 -46
  61. package/browser/editor/page/table/icons.mjs +2 -0
  62. package/browser/editor/page/table/index.mjs +29 -10
  63. package/browser/editor/page/table/pictures.mjs +299 -0
  64. package/browser/editor/page/table/views.mjs +150 -0
  65. package/browser/editor/page/text-select/index.mjs +26 -12
  66. package/browser/editor/page/todo-writes.mjs +75 -0
  67. package/browser/editor/page/typing/index.mjs +53 -3
  68. package/browser/editor/page/ui.mjs +13 -0
  69. package/browser/shared/block-packs.mjs +404 -0
  70. package/browser/shared/board-places.mjs +224 -0
  71. package/browser/shared/card-size.mjs +59 -0
  72. package/browser/shared/colors.mjs +3 -2
  73. package/browser/shared/component-catalog.mjs +323 -46
  74. package/browser/shared/component-source.mjs +37 -0
  75. package/browser/shared/components/index.mjs +12 -3
  76. package/browser/shared/components/installed.mjs +35 -3
  77. package/browser/shared/components/page.mjs +18 -8
  78. package/browser/shared/components/state.mjs +5 -1
  79. package/browser/shared/document-look.mjs +10 -5
  80. package/browser/shared/drafts.mjs +432 -0
  81. package/browser/shared/extension-sidebar.mjs +126 -0
  82. package/browser/shared/extensions.mjs +79 -0
  83. package/browser/shared/file-table.mjs +101 -0
  84. package/browser/shared/i18n/en.mjs +307 -27
  85. package/browser/shared/json-layout.mjs +47 -0
  86. package/browser/shared/net-cache.mjs +133 -0
  87. package/browser/shared/net-keys.mjs +32 -0
  88. package/browser/shared/net-policy.mjs +177 -0
  89. package/browser/shared/outline-shape.mjs +128 -0
  90. package/browser/shared/outline.mjs +331 -67
  91. package/browser/shared/pack-manifest.mjs +77 -0
  92. package/browser/shared/page-address.mjs +6 -3
  93. package/browser/shared/page-cards.mjs +308 -0
  94. package/browser/shared/page-links.mjs +69 -6
  95. package/browser/shared/pages.mjs +388 -0
  96. package/browser/shared/paths.mjs +6 -0
  97. package/browser/shared/preview-server.mjs +3 -7
  98. package/browser/shared/session.mjs +8 -1
  99. package/browser/shared/shipped-blocks.mjs +299 -0
  100. package/browser/shared/table-chart.mjs +33 -1
  101. package/browser/shared/todos.mjs +83 -0
  102. package/browser/shared/user-directory.mjs +24 -0
  103. package/browser/shared/versions.mjs +14 -0
  104. package/browser/shared/web-links.mjs +134 -0
  105. package/browser/shared/workspace-columns.mjs +120 -0
  106. package/browser/shared/workspace-name.mjs +154 -0
  107. package/browser/shared/workspace-query.mjs +125 -0
  108. package/browser/shared/workspace-registry.mjs +272 -0
  109. package/browser/shared/workspace.mjs +171 -20
  110. package/dist/chunk-2NRBY6AJ.mjs +2 -0
  111. package/dist/chunk-32ZUEFZ7.mjs +2 -0
  112. package/dist/chunk-35NQ4PLQ.mjs +2 -0
  113. package/dist/chunk-3KJHLHUO.mjs +2 -0
  114. package/dist/chunk-3NJACR4W.mjs +2 -0
  115. package/dist/chunk-4AV456RQ.mjs +2 -0
  116. package/dist/chunk-4OZWXZE5.mjs +5 -0
  117. package/dist/chunk-5XYHDBJ5.mjs +2 -0
  118. package/dist/chunk-5ZJA7CXT.mjs +2 -0
  119. package/dist/chunk-6A53MZYZ.mjs +2 -0
  120. package/dist/chunk-6EXH3ORZ.mjs +166 -0
  121. package/dist/chunk-6EZ7FNIK.mjs +3 -0
  122. package/dist/{chunk-V5JTW2LH.mjs → chunk-6QBHU4DF.mjs} +1 -1
  123. package/dist/{chunk-Y6RLRPG3.mjs → chunk-6VTU6KEO.mjs} +1 -1
  124. package/dist/chunk-B4P2CM2J.mjs +3 -0
  125. package/dist/{chunk-FDLXYYG4.mjs → chunk-BPL64HGA.mjs} +1 -1
  126. package/dist/chunk-BVEFGE4B.mjs +2 -0
  127. package/dist/{chunk-LS4F7JUM.mjs → chunk-BZ5RAF7L.mjs} +1 -1
  128. package/dist/chunk-CRJEG7MT.mjs +2 -0
  129. package/dist/{chunk-LCTHTZIL.mjs → chunk-D4CKRD3V.mjs} +91 -91
  130. package/dist/chunk-D4EURAX4.mjs +4 -0
  131. package/dist/chunk-DQCE7TJY.mjs +5 -0
  132. package/dist/chunk-DR73Y2UJ.mjs +3 -0
  133. package/dist/{chunk-TMYZB6AV.mjs → chunk-EKNHM3P4.mjs} +1 -1
  134. package/dist/{chunk-GB5SOYQJ.mjs → chunk-ERLAIBOA.mjs} +2 -2
  135. package/dist/chunk-EURLTOTZ.mjs +4 -0
  136. package/dist/chunk-FJYN7RTH.mjs +4 -0
  137. package/dist/chunk-FWNRPMCJ.mjs +12 -0
  138. package/dist/chunk-FWW4CSAZ.mjs +2 -0
  139. package/dist/{chunk-2B5E4CDJ.mjs → chunk-GPIWQ4X4.mjs} +1 -1
  140. package/dist/chunk-GY3FAUVM.mjs +2 -0
  141. package/dist/chunk-HLYV7RIH.mjs +2 -0
  142. package/dist/chunk-HMYTM3GT.mjs +15 -0
  143. package/dist/chunk-IA4PSIMD.mjs +2 -0
  144. package/dist/chunk-JEUK3ZO7.mjs +2 -0
  145. package/dist/chunk-KTKHRC6H.mjs +2 -0
  146. package/dist/chunk-L7UP52JO.mjs +2 -0
  147. package/dist/{chunk-SYGN7GLU.mjs → chunk-MHW7ZKOU.mjs} +1 -1
  148. package/dist/chunk-N76HWBA3.mjs +10 -0
  149. package/dist/chunk-N7AZZLGT.mjs +548 -0
  150. package/dist/chunk-NAMN3RAF.mjs +2 -0
  151. package/dist/{chunk-5ZKJ3H4P.mjs → chunk-NFMCP2HI.mjs} +3 -3
  152. package/dist/chunk-NG375ILQ.mjs +2 -0
  153. package/dist/chunk-NVRNLK25.mjs +6 -0
  154. package/dist/chunk-NWFBE2YA.mjs +2 -0
  155. package/dist/chunk-NWR2LT5B.mjs +2 -0
  156. package/dist/chunk-OJKMINIU.mjs +20 -0
  157. package/dist/{chunk-4FS7Z7WR.mjs → chunk-OUUP3WKT.mjs} +1 -1
  158. package/dist/{chunk-BGGDRNYQ.mjs → chunk-OW5NWPOJ.mjs} +1 -1
  159. package/dist/chunk-PAREWQGB.mjs +4 -0
  160. package/dist/chunk-POQSE4C2.mjs +2 -0
  161. package/dist/chunk-PUOQ65NC.mjs +2 -0
  162. package/dist/{chunk-XNROSH2T.mjs → chunk-PVER7LSC.mjs} +2 -2
  163. package/dist/chunk-PZDLJJTJ.mjs +3 -0
  164. package/dist/chunk-Q47PLKIJ.mjs +15 -0
  165. package/dist/chunk-Q4UEPUWF.mjs +2 -0
  166. package/dist/chunk-QKXMPUXC.mjs +2 -0
  167. package/dist/chunk-QOUEFUCH.mjs +16 -0
  168. package/dist/chunk-RFDZXFJF.mjs +13 -0
  169. package/dist/chunk-RKPWLGZ3.mjs +4 -0
  170. package/dist/chunk-RMECZA2K.mjs +2 -0
  171. package/dist/{chunk-7DTINW6U.mjs → chunk-SQ6Y2ZMA.mjs} +2 -2
  172. package/dist/chunk-SX4LJYT6.mjs +8 -0
  173. package/dist/chunk-SXHBYZST.mjs +16 -0
  174. package/dist/chunk-TANZRINB.mjs +2 -0
  175. package/dist/chunk-TEZAWDSQ.mjs +2 -0
  176. package/dist/chunk-UBBRTJ2R.mjs +24 -0
  177. package/dist/chunk-UFNYFFKO.mjs +20 -0
  178. package/dist/chunk-UGWYKHBL.mjs +170 -0
  179. package/dist/chunk-UKSHDZZ6.mjs +2 -0
  180. package/dist/chunk-UNOYVIYR.mjs +2 -0
  181. package/dist/{chunk-E7LWZRXY.mjs → chunk-V6RIYQZZ.mjs} +1 -1
  182. package/dist/chunk-VJPFVNNW.mjs +15 -0
  183. package/dist/chunk-VS3ZMVGX.mjs +5 -0
  184. package/dist/chunk-VTKNEYT3.mjs +6 -0
  185. package/dist/chunk-VXACTLO3.mjs +3 -0
  186. package/dist/chunk-YI43RG4P.mjs +2 -0
  187. package/dist/chunk-YQGT4AB2.mjs +6 -0
  188. package/dist/chunk-ZB4H7ZN4.mjs +2 -0
  189. package/dist/{chunk-IVDLMMBD.mjs → chunk-ZHEHPMBK.mjs} +1 -1
  190. package/dist/chunk-ZTHICSSF.mjs +2 -0
  191. package/dist/chunk-ZUNVAXLH.mjs +2 -0
  192. package/dist/chunk-ZWPMCK7P.mjs +2 -0
  193. package/dist/cli.mjs +1 -1
  194. package/dist/server.mjs +1 -1
  195. package/dist/{chunk-U6KNPJPR.mjs → update-fetch.mjs} +1 -1
  196. package/dist/worker.mjs +1 -1
  197. package/kit/board.css +95 -0
  198. package/kit/board.js +250 -0
  199. package/kit/charts.js +5 -71
  200. package/kit/code.js +14 -14
  201. package/kit/report.css +255 -17
  202. package/kit/runtime.js +1600 -125
  203. package/kit/state.js +10 -1
  204. package/kit/tables.js +128 -43
  205. package/kit/ui.js +77 -35
  206. package/package.json +2 -1
  207. package/packs/gallery/card/component.json +14 -0
  208. package/packs/gallery/card/example.html +10 -0
  209. package/packs/gallery/card/preview.svg +1 -0
  210. package/packs/gallery/card/style.css +6 -0
  211. package/packs/gallery/card/template.html +6 -0
  212. package/packs/gallery/card/writing.md +14 -0
  213. package/packs/gallery/chart-card/component.json +15 -0
  214. package/packs/gallery/chart-card/example.html +14 -0
  215. package/packs/gallery/chart-card/kit.js +130 -0
  216. package/packs/gallery/chart-card/preview.svg +1 -0
  217. package/packs/gallery/chart-card/style.css +42 -0
  218. package/packs/gallery/chart-card/template.html +13 -0
  219. package/packs/gallery/chart-card/writing.md +20 -0
  220. package/packs/gallery/chart-view/component.json +20 -0
  221. package/packs/gallery/chart-view/example.html +13 -0
  222. package/packs/gallery/chart-view/kit.js +355 -0
  223. package/packs/gallery/chart-view/preview.svg +1 -0
  224. package/packs/gallery/chart-view/style.css +94 -0
  225. package/packs/gallery/chart-view/template.html +3 -0
  226. package/packs/gallery/chart-view/writing.md +22 -0
  227. package/packs/gallery/countdown/component.json +18 -0
  228. package/packs/gallery/countdown/example.html +3 -0
  229. package/packs/gallery/countdown/kit.js +156 -0
  230. package/packs/gallery/countdown/preview.svg +1 -0
  231. package/packs/gallery/countdown/style.css +130 -0
  232. package/packs/gallery/countdown/template.html +3 -0
  233. package/packs/gallery/countdown/writing.md +22 -0
  234. package/packs/gallery/habit/component.json +14 -0
  235. package/packs/gallery/habit/example.html +3 -0
  236. package/packs/gallery/habit/kit.js +295 -0
  237. package/packs/gallery/habit/preview.svg +1 -0
  238. package/packs/gallery/habit/style.css +246 -0
  239. package/packs/gallery/habit/template.html +3 -0
  240. package/packs/gallery/habit/writing.md +21 -0
  241. package/packs/gallery/heatmap/component.json +18 -0
  242. package/packs/gallery/heatmap/example.html +3 -0
  243. package/packs/gallery/heatmap/kit.js +351 -0
  244. package/packs/gallery/heatmap/preview.svg +1 -0
  245. package/packs/gallery/heatmap/style.css +201 -0
  246. package/packs/gallery/heatmap/template.html +3 -0
  247. package/packs/gallery/heatmap/writing.md +21 -0
  248. package/packs/gallery/kanban/component.json +18 -0
  249. package/packs/gallery/kanban/example.html +12 -0
  250. package/packs/gallery/kanban/kit.js +540 -0
  251. package/packs/gallery/kanban/preview.svg +1 -0
  252. package/packs/gallery/kanban/style.css +212 -0
  253. package/packs/gallery/kanban/template.html +3 -0
  254. package/packs/gallery/kanban/writing.md +20 -0
  255. package/packs/gallery/metric/component.json +22 -0
  256. package/packs/gallery/metric/example.html +15 -0
  257. package/packs/gallery/metric/kit.js +248 -0
  258. package/packs/gallery/metric/preview.svg +1 -0
  259. package/packs/gallery/metric/style.css +92 -0
  260. package/packs/gallery/metric/template.html +3 -0
  261. package/packs/gallery/metric/writing.md +23 -0
  262. package/packs/gallery/note/component.json +14 -0
  263. package/packs/gallery/note/example.html +3 -0
  264. package/packs/gallery/note/kit.js +102 -0
  265. package/packs/gallery/note/preview.svg +1 -0
  266. package/packs/gallery/note/style.css +76 -0
  267. package/packs/gallery/note/template.html +3 -0
  268. package/packs/gallery/note/writing.md +18 -0
  269. package/packs/gallery/pack.json +8 -0
  270. package/packs/gallery/recent/component.json +13 -0
  271. package/packs/gallery/recent/example.html +1 -0
  272. package/packs/gallery/recent/kit.js +238 -0
  273. package/packs/gallery/recent/preview.svg +1 -0
  274. package/packs/gallery/recent/style.css +158 -0
  275. package/packs/gallery/recent/template.html +1 -0
  276. package/packs/gallery/recent/writing.md +15 -0
  277. package/packs/gallery/static/component.json +13 -0
  278. package/packs/gallery/static/example.html +11 -0
  279. package/packs/gallery/static/preview.svg +1 -0
  280. package/packs/gallery/static/style.css +138 -0
  281. package/packs/gallery/static/template.html +1 -0
  282. package/packs/gallery/static/writing.md +18 -0
  283. package/packs/gallery/stats/component.json +13 -0
  284. package/packs/gallery/stats/example.html +1 -0
  285. package/packs/gallery/stats/kit.js +166 -0
  286. package/packs/gallery/stats/preview.svg +1 -0
  287. package/packs/gallery/stats/style.css +151 -0
  288. package/packs/gallery/stats/template.html +1 -0
  289. package/packs/gallery/stats/writing.md +11 -0
  290. package/packs/gallery/today/component.json +12 -0
  291. package/packs/gallery/today/example.html +1 -0
  292. package/packs/gallery/today/kit.js +185 -0
  293. package/packs/gallery/today/preview.svg +1 -0
  294. package/packs/gallery/today/style.css +120 -0
  295. package/packs/gallery/today/template.html +1 -0
  296. package/packs/gallery/today/writing.md +14 -0
  297. package/packs/gallery/todos/component.json +19 -0
  298. package/packs/gallery/todos/example.html +3 -0
  299. package/packs/gallery/todos/kit.js +342 -0
  300. package/packs/gallery/todos/preview.svg +1 -0
  301. package/packs/gallery/todos/style.css +267 -0
  302. package/packs/gallery/todos/template.html +3 -0
  303. package/packs/gallery/todos/writing.md +30 -0
  304. package/packs/gallery/weather/component.json +19 -0
  305. package/packs/gallery/weather/example.html +3 -0
  306. package/packs/gallery/weather/kit.js +312 -0
  307. package/packs/gallery/weather/preview.svg +1 -0
  308. package/packs/gallery/weather/style.css +258 -0
  309. package/packs/gallery/weather/template.html +3 -0
  310. package/packs/gallery/weather/writing.md +26 -0
  311. package/packs/gallery-soft/pack.json +8 -0
  312. package/release.json +12 -10
  313. package/sdk/doc-kit.d.ts +396 -5
  314. package/sdk/doc-state.d.ts +2 -0
  315. package/skill/SKILL.md +56 -23
  316. package/skill/references/block-script.md +140 -0
  317. package/skill/references/building-blocks.md +257 -0
  318. package/skill/references/extensions.md +59 -0
  319. package/skill/references/pages-and-data.md +221 -0
  320. package/skill/references/writing-html.md +6 -4
  321. package/skill/sdk/doc-kit.d.ts +396 -5
  322. package/skill/sdk/doc-state.d.ts +2 -0
  323. package/web/assets/index-BK2e_07w.js +13 -0
  324. package/web/assets/index-CWFI83mF.css +1 -0
  325. package/web/index.html +2 -2
  326. package/dist/chunk-3HIRPVLU.mjs +0 -2
  327. package/dist/chunk-5MHMDLZD.mjs +0 -4
  328. package/dist/chunk-64K7IPLO.mjs +0 -255
  329. package/dist/chunk-6QXGZM36.mjs +0 -8
  330. package/dist/chunk-6RGJOMJP.mjs +0 -16
  331. package/dist/chunk-AJ73XJF3.mjs +0 -2
  332. package/dist/chunk-AUZGSZJH.mjs +0 -13
  333. package/dist/chunk-BFE45AKL.mjs +0 -2
  334. package/dist/chunk-BXO2ZY5P.mjs +0 -2
  335. package/dist/chunk-CEH4MRCC.mjs +0 -2
  336. package/dist/chunk-CY2FNNAB.mjs +0 -16
  337. package/dist/chunk-DFUDV4LX.mjs +0 -2
  338. package/dist/chunk-DKXG4XDG.mjs +0 -2
  339. package/dist/chunk-EZQ34M3F.mjs +0 -124
  340. package/dist/chunk-EZY3WC6Z.mjs +0 -15
  341. package/dist/chunk-FUKQNOQS.mjs +0 -9
  342. package/dist/chunk-JPOSLGOC.mjs +0 -6
  343. package/dist/chunk-L3QKH4OK.mjs +0 -26
  344. package/dist/chunk-LAE5NQ4B.mjs +0 -2
  345. package/dist/chunk-LEF6DRCK.mjs +0 -59
  346. package/dist/chunk-NO5NJCHO.mjs +0 -2
  347. package/dist/chunk-NQPVAU63.mjs +0 -2
  348. package/dist/chunk-NSKUTQ5J.mjs +0 -5
  349. package/dist/chunk-O35FIXRB.mjs +0 -2
  350. package/dist/chunk-P2CAZPDP.mjs +0 -3
  351. package/dist/chunk-PL6GHLGD.mjs +0 -15
  352. package/dist/chunk-QJIR2BLP.mjs +0 -6
  353. package/dist/chunk-QUPLVPB2.mjs +0 -7
  354. package/dist/chunk-R7BNENLY.mjs +0 -4
  355. package/dist/chunk-S6O4UHLC.mjs +0 -2
  356. package/dist/chunk-SGJWQKEI.mjs +0 -2
  357. package/dist/chunk-TX6JH7TR.mjs +0 -2
  358. package/dist/chunk-TYK6VNAB.mjs +0 -10
  359. package/dist/chunk-UALRNVSE.mjs +0 -4
  360. package/dist/chunk-V3HXVQEM.mjs +0 -2
  361. package/dist/chunk-V5VXUJKG.mjs +0 -2
  362. package/dist/chunk-VBXMADMP.mjs +0 -2
  363. package/dist/chunk-VNV55RUA.mjs +0 -2
  364. package/dist/chunk-VPD2PS35.mjs +0 -2
  365. package/dist/chunk-W4VKN3GF.mjs +0 -7
  366. package/dist/chunk-W5BXXPDJ.mjs +0 -3
  367. package/dist/chunk-XUNHRCOG.mjs +0 -6
  368. package/skill/references/building-components.md +0 -367
  369. package/web/assets/index-Bh74DfsV.css +0 -1
  370. package/web/assets/index-UW0RyFFt.js +0 -13
@@ -0,0 +1,126 @@
1
+ import { said } from "./i18n/index.mjs";
2
+ import { isExtensionId } from "./outline-shape.mjs";
3
+ import { linkAddress, linkIcon } from "./web-links.mjs";
4
+
5
+ // The sidebar column an extension provides (docs/workbench.md "Extension columns", references/extensions.md
6
+ // for the Agent that writes one): <workspace>/extensions/<id>/sidebar.json,
7
+ // { "title": "语雀", "icon": "📗", "entries": [
8
+ // { "id": "team", "title": "团队知识库", "url": "https://www.yuque.com/team",
9
+ // "children": [ { "id": "weekly", "title": "周报", "url": "https://www.yuque.com/team/weekly" } ] },
10
+ // { "id": "panel", "title": "发布面板", "url": "http://127.0.0.1:4318/" } ] }
11
+ // `title` is the column's name (100 characters at most), `icon` an emoji or an icon of the 图标 tab (no
12
+ // picture is ever loaded from the web). An entry has an `id` (1 to 128 of A-Z a-z 0-9 . _ : -, once in
13
+ // the file: the extension keeps it, for it is what an address and an open entry go by), a `title` (200
14
+ // at most), an `url` (http or https, 2048 at most: none, and the entry only holds its `children`, which
15
+ // a click opens and closes), an `icon` and `children` (8 levels, 2000 entries in all, 1 MB the file).
16
+ // Pure and the same wherever it is read (the server answers the workbench with it, gallery extension
17
+ // check prints it); reading the file is ./extensions.mjs's (Node's). What makes the file unusable is a
18
+ // refusal (`error`, said() of a reason: the column then shows one row, 条目读不出来:<reason>); what is
19
+ // only left out of it (an icon that is none) is a note, said by gallery extension check and shown nowhere.
20
+
21
+ /** The extension's file in its folder. */
22
+ export const SIDEBAR_FILE = "sidebar.json";
23
+ export const SIDEBAR_LIMITS = { bytes: 1_048_576, levels: 8, entries: 2000, id: 128, title: 200, column: 100 };
24
+ export const entryIdPattern = /^[A-Za-z0-9._:-]{1,128}$/;
25
+
26
+ /** An entry's key in the workbench's address (`#~<extension id>/<entry id>`), and as its row says it. */
27
+ export const extensionKey = (extension, entry) => `~${extension}/${entry}`;
28
+ /** The extension and the entry a key names: { extension, entry }, or null for what is none. */
29
+ export function parseExtensionKey(value) {
30
+ if (typeof value !== "string" || !value.startsWith("~")) return null;
31
+ const at = value.indexOf("/");
32
+ if (at < 0) return null;
33
+ const extension = value.slice(1, at);
34
+ const entry = value.slice(at + 1);
35
+ return isExtensionId(extension) && entryIdPattern.test(entry) ? { extension, entry } : null;
36
+ }
37
+
38
+ const tidy = (value) => (typeof value === "string" ? value.replace(/\s+/g, " ").trim() : "");
39
+ const refused = (message) => ({ error: message });
40
+
41
+ /**
42
+ * What the text of a sidebar.json says: { sidebar: { title, icon?, entries, count }, notes } with each
43
+ * entry { id, title, icon?, url?, children? } (the address as the URL spells it, a title's white space
44
+ * run together), or { error } (said(): why the file is no sidebar), the first reason found. `notes`: said()
45
+ * of what was left out (an icon that is no emoji nor icon of the 图标 tab).
46
+ */
47
+ export function readSidebarText(text) {
48
+ const source = String(text);
49
+ if (source.length > SIDEBAR_LIMITS.bytes) return refused(said("文件超过 1MB"));
50
+ let value;
51
+ try {
52
+ value = JSON.parse(source.replace(/^/, ""));
53
+ } catch (error) {
54
+ return refused(said("不是 JSON:{0}", error.message));
55
+ }
56
+ if (!value || typeof value !== "object" || Array.isArray(value)) return refused(said("最外层要是一个对象,有 title 和 entries"));
57
+ const title = tidy(value.title);
58
+ if (!title || title.length > SIDEBAR_LIMITS.column) return refused(said("title 要有,是栏的名字(100 个字以内)"));
59
+ if (!Array.isArray(value.entries)) return refused(said("entries 要是一个列表"));
60
+ const notes = [];
61
+ let icon;
62
+ if (value.icon !== undefined && value.icon !== null && value.icon !== "") {
63
+ if (linkIcon(value.icon)) icon = value.icon;
64
+ else notes.push(said("icon 不是表情,也不是图标页签里的图标,没有显示"));
65
+ }
66
+ const ids = new Set();
67
+ let count = 0;
68
+ const walk = (list, path, level) => {
69
+ if (level > SIDEBAR_LIMITS.levels && list.length) return { error: said("条目超过 {0} 层({1})", SIDEBAR_LIMITS.levels, path) };
70
+ const made = [];
71
+ for (const [index, raw] of list.entries()) {
72
+ const where = `${path}[${index}]`;
73
+ if (++count > SIDEBAR_LIMITS.entries) return { error: said("条目超过 {0} 个", SIDEBAR_LIMITS.entries) };
74
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) return { error: said("{0} 要是一个对象", where) };
75
+ if (typeof raw.id !== "string" || !entryIdPattern.test(raw.id)) return { error: said("{0} 的 id 不对(1 到 128 个字符,只能用字母、数字和 . _ : -)", where) };
76
+ if (ids.has(raw.id)) return { error: said("{0} 的 id「{1}」重复了(同一个文件里 id 不能重)", where, raw.id) };
77
+ ids.add(raw.id);
78
+ const name = tidy(raw.title);
79
+ if (!name || name.length > SIDEBAR_LIMITS.title) return { error: said("{0} 要有 title(名称,200 个字以内)", where) };
80
+ const entry = { id: raw.id, title: name };
81
+ if (raw.url !== undefined && raw.url !== null && raw.url !== "") {
82
+ const address = linkAddress(raw.url);
83
+ if (address.refused === "scheme") return { error: said("{0} 的 url 只能是 http 或 https 的网址", where) };
84
+ if (address.refused === "long") return { error: said("{0} 的 url 太长了(最多 2048 个字符)", where) };
85
+ if (address.refused) return { error: said("{0} 的 url 不是一个网址", where) };
86
+ entry.url = address.url;
87
+ }
88
+ if (raw.icon !== undefined && raw.icon !== null && raw.icon !== "") {
89
+ if (linkIcon(raw.icon)) entry.icon = raw.icon;
90
+ else notes.push(said("{0} 的 icon 不是表情,也不是图标页签里的图标,没有显示", where));
91
+ }
92
+ if (raw.children !== undefined && raw.children !== null) {
93
+ if (!Array.isArray(raw.children)) return { error: said("{0} 的 children 要是一个列表", where) };
94
+ const inner = walk(raw.children, `${where}.children`, level + 1);
95
+ if (inner.error) return inner;
96
+ if (inner.entries.length) entry.children = inner.entries;
97
+ }
98
+ made.push(entry);
99
+ }
100
+ return { entries: made };
101
+ };
102
+ const walked = walk(value.entries, "entries", 1);
103
+ if (walked.error) return refused(walked.error);
104
+ return { sidebar: { title, ...(icon ? { icon } : {}), entries: walked.entries, count }, notes };
105
+ }
106
+
107
+ /** The entry `id` of `entries` (a tree: children under each), or null. */
108
+ export function entryIn(entries, id) {
109
+ for (const entry of entries ?? []) {
110
+ if (entry.id === id) return entry;
111
+ const inside = entryIn(entry.children, id);
112
+ if (inside) return inside;
113
+ }
114
+ return null;
115
+ }
116
+
117
+ /**
118
+ * The entry key `key` (`~<extension id>/<entry id>`, a workbench's hash, decoded) names among `extensions`
119
+ * (the columns as GET outline lists them: [{ id, entries }]), or null: what a link to an entry's address
120
+ * opens (one with an `url`) wherever a page reads it (the workbench, a page alone in a tab, 演示视图).
121
+ */
122
+ export function entryOfKey(extensions, key) {
123
+ const named = parseExtensionKey(key);
124
+ const extension = named && (extensions ?? []).find(({ id }) => id === named.extension);
125
+ return extension ? entryIn(extension.entries, named.entry) : null;
126
+ }
@@ -0,0 +1,79 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { SIDEBAR_FILE, SIDEBAR_LIMITS, readSidebarText } from "./extension-sidebar.mjs";
4
+ import { said } from "./i18n/index.mjs";
5
+ import { isExtensionId } from "./outline-shape.mjs";
6
+ import { DOCUMENT_FOLDERS, layoutOf } from "./workspace.mjs";
7
+
8
+ // The extensions of a workspace (docs/workbench.md "Extension columns"): each a folder
9
+ // <workspace>/extensions/<id>/ whose sidebar.json (./extension-sidebar.mjs) gives a column of the sidebar
10
+ // its entries; what else the folder holds (the extension's own server, its code) is none of Gallery's.
11
+ // Read from disk each time it is asked (the workbench's list, the outline's columns, gallery extension):
12
+ // the extension writes the file, the watcher tells the workbench (src/server/routes.mjs changeOf), no
13
+ // state is kept here. Node's built-ins only.
14
+
15
+ /**
16
+ * The folders of extensions/ that may be an extension, sorted: no dot name, a name that is an id
17
+ * (isExtensionId), not assets or materials (a document called extensions, made before they came, keeps those
18
+ * in its folder), and no link, which leads out of the workspace. [{ id, folder }].
19
+ */
20
+ export async function extensionFolders(root) {
21
+ const { extensions } = layoutOf(root);
22
+ const entries = await fs.readdir(extensions, { withFileTypes: true }).catch(() => []);
23
+ return entries
24
+ .filter((entry) => entry.isDirectory() && isExtensionId(entry.name) && !DOCUMENT_FOLDERS.includes(entry.name))
25
+ .map((entry) => ({ id: entry.name, folder: path.join(extensions, entry.name) }))
26
+ .sort((a, b) => (a.id < b.id ? -1 : 1));
27
+ }
28
+
29
+ /** The ids of the extensions that have a sidebar.json (the columns the sidebar has), sorted. */
30
+ export async function extensionColumnIds(root) {
31
+ const found = await Promise.all((await extensionFolders(root)).map(async ({ id, folder }) => ((await fs.stat(path.join(folder, SIDEBAR_FILE)).then(() => true, () => false)) ? id : null)));
32
+ return found.filter(Boolean);
33
+ }
34
+
35
+ /**
36
+ * Extension `id` as the sidebar shows it: { id, file (the sidebar.json's path), title (the column's name; the
37
+ * id when the file does not say one), icon?, entries (a tree of { id, title, icon?, url?, children? }), count
38
+ * (the entries in all), notes (said(): what was left out) } or, when the file is not usable, `error`
39
+ * (said(): why) with no entries; `missing` for a folder with no sidebar.json: an extension with nothing to show.
40
+ */
41
+ export async function readExtension(root, id) {
42
+ const file = path.join(layoutOf(root).extensions, id, SIDEBAR_FILE);
43
+ const empty = { id, file, title: id, entries: [], count: 0, notes: [] };
44
+ let stat;
45
+ try {
46
+ stat = await fs.stat(file);
47
+ } catch (error) {
48
+ return error.code === "ENOENT" ? { ...empty, missing: true, error: said("没有 sidebar.json") } : { ...empty, error: said("读不出这个文件:{0}", error.code ?? "error") };
49
+ }
50
+ if (!stat.isFile()) return { ...empty, error: said("sidebar.json 不是一个文件") };
51
+ if (stat.size > SIDEBAR_LIMITS.bytes) return { ...empty, error: said("文件超过 1MB") };
52
+ let text;
53
+ try {
54
+ text = await fs.readFile(file, "utf8");
55
+ } catch (error) {
56
+ return { ...empty, error: said("读不出这个文件:{0}", error.code ?? "error") };
57
+ }
58
+ const read = readSidebarText(text);
59
+ if (read.error) {
60
+ // What can still be said of a file that does not read: its name, when it has one.
61
+ let title = id;
62
+ try {
63
+ const named = JSON.parse(text.replace(/^/, ""))?.title;
64
+ if (typeof named === "string" && named.trim() && named.trim().length <= SIDEBAR_LIMITS.column) title = named.replace(/\s+/g, " ").trim();
65
+ } catch {}
66
+ return { ...empty, title, error: read.error };
67
+ }
68
+ return { ...empty, ...read.sidebar, notes: read.notes };
69
+ }
70
+
71
+ /**
72
+ * The extensions of workspace `root`, by id: those with a sidebar.json (the sidebar's columns), or with `all`
73
+ * every folder that may be one (gallery extension list). Each as readExtension says it.
74
+ */
75
+ export async function listExtensions(root, { all = false } = {}) {
76
+ const folders = await extensionFolders(root);
77
+ const read = await Promise.all(folders.map(({ id }) => readExtension(root, id)));
78
+ return all ? read : read.filter((extension) => !extension.missing);
79
+ }
@@ -0,0 +1,101 @@
1
+ import { parse } from "parse5";
2
+ import { BODY } from "./components/index.mjs";
3
+ import { attr, elementsOf, walk } from "./html-tree.mjs";
4
+ import { decoded, pageAddress } from "./page-address.mjs";
5
+ import { CHART_SOURCE, cellWords, tableRows } from "./table-chart.mjs";
6
+
7
+ // A table of a document's file read as the kit reads it on a page (render/kit/runtime/table-reading.js:
8
+ // a chart drawn from a table, a view's context.table(), a package's context.rows): its header's words and
9
+ // data-sort-type, its rows of data in the file's order, each cell's words and sort value
10
+ // (shared/table-chart.mjs), whether a cell spans others; and, by a key (data-doc-chart-source on its
11
+ // frame), its rows as a block reads them, { values, links }. The checks read a chart's table so
12
+ // (render/chart-declarations.mjs), and the workspace's facts a table another document names
13
+ // (workspace.query("table"): src/workbench/index.mjs, the plan's 5.2). Of parse5's tree; no DOM.
14
+
15
+ const textOf = (node) => (node.nodeName === "#text" ? node.value : (node.childNodes ?? []).map(textOf).join(""));
16
+ const cellsOf = (row) => elementsOf(row).filter((cell) => cell.tagName === "td" || cell.tagName === "th");
17
+ const spans = (cell) => ["rowspan", "colspan"].some((name) => {
18
+ const value = Number.parseInt(attr(cell, name) ?? "1", 10);
19
+ return Number.isFinite(value) && value !== 1;
20
+ });
21
+
22
+ // Its groups, its header row (its head's first row, else a first row of its body all header cells; null
23
+ // for neither) and its body's rows after that, never a <tfoot>'s.
24
+ function tableParts(table) {
25
+ const groups = elementsOf(table);
26
+ const rowsOf = (group) => elementsOf(group).filter((row) => row.tagName === "tr");
27
+ const head = groups.find((group) => group.tagName === "thead");
28
+ let header = head ? rowsOf(head)[0] ?? null : null;
29
+ let rows = groups.filter((group) => group.tagName === "tbody").flatMap(rowsOf);
30
+ if (!header && rows.length > 0 && cellsOf(rows[0]).length > 0 && cellsOf(rows[0]).every((cell) => cell.tagName === "th")) [header, ...rows] = rows;
31
+ return { groups, rowsOf, header, rows };
32
+ }
33
+
34
+ /**
35
+ * What a table of the file holds for a chart (tableRows' `table`), as the kit reads it in the page
36
+ * (charts/from-table.js tableCells): its header row's words (its head's first row, else a first row
37
+ * of header cells alone; null for neither) and its header cells' data-sort-type, its rows of data,
38
+ * each cell's words and sort value (data-sort-value, or null), the first words of its <tfoot>'s rows
39
+ * (`foot`, which no chart reads: the readings say they were left out), and whether a cell of them
40
+ * spans rows or columns (a cell's words cellWords', a formula's its TeX).
41
+ */
42
+ export function tableCells(table) {
43
+ const { groups, rowsOf, header, rows } = tableParts(table);
44
+ const words = (cell) => cellWords(textOf(cell));
45
+ return {
46
+ names: header ? cellsOf(header).map(words) : null,
47
+ types: header ? cellsOf(header).map((cell) => attr(cell, "data-sort-type") ?? null) : null,
48
+ rows: rows.map((row) => cellsOf(row).map((cell) => ({ words: words(cell), sort: attr(cell, "data-sort-value")?.trim() ?? null }))),
49
+ foot: groups.filter((group) => group.tagName === "tfoot").flatMap(rowsOf).map((row) => (cellsOf(row)[0] ? words(cellsOf(row)[0]) : "")),
50
+ merged: [header, ...rows].some((row) => row && cellsOf(row).some(spans)),
51
+ };
52
+ }
53
+
54
+ // The links a row's cells hold to documents of the workspace, as a file writes them (shared/page-address.mjs):
55
+ // another's ../<slug>/doc.html, with #<block id> for a block, and #<block id> for one of this document (`own`).
56
+ function linksOf(row, own) {
57
+ const links = [];
58
+ walk(row, (node) => {
59
+ if (node.tagName !== "a") return;
60
+ const href = (attr(node, "href") ?? "").trim();
61
+ if (!href) return;
62
+ const place = href.startsWith("#") && href.length > 1 ? (own ? { slug: own, block: decoded(href.slice(1)) } : null) : pageAddress(href);
63
+ if (place) links.push({ slug: place.slug, title: cellWords(textOf(node)), block: place.block ?? null });
64
+ });
65
+ return links;
66
+ }
67
+
68
+ /**
69
+ * The table of a document's `text` (its page's HTML, as its pages see it) that `key` names, the first
70
+ * frame carrying it as data-doc-chart-source (the one the kit and gallery check read; none a <template>
71
+ * holds, nor the own region of an instance), its rows as a block reads them: { columns, rows: [{ values,
72
+ * links, words }] }, `values` by the header's words (cellValue: a number, its words or null; of two names
73
+ * alike the later column's), `links` those its cells hold to documents (`own`: the document's slug, which
74
+ * a link within it names), `words` each column's words as written (what a filter matches); or { error }:
75
+ * "missing" (no table carries it) or "merged" (a cell spans others: a value has one cell).
76
+ */
77
+ export function keyedTable(text, key, own = null) {
78
+ let table = null;
79
+ walk(parse(String(text)), (node) => {
80
+ if (table !== null || attr(node, CHART_SOURCE) !== key) return;
81
+ table = node.tagName === "table" ? node : elementsOf(node).find((child) => child.tagName === "table") ?? false;
82
+ }, { ...BODY, inTemplates: false });
83
+ if (!table) return { error: "missing" };
84
+ const cells = tableCells(table);
85
+ const read = tableRows(cells);
86
+ if (read.error) return { error: "merged" };
87
+ const { header, rows } = tableParts(table);
88
+ const dataRows = header ? rows : rows.slice(1);
89
+ const dataCells = cells.names ? cells.rows : cells.rows.slice(1);
90
+ const names = read.data.columns;
91
+ return {
92
+ columns: [...names],
93
+ rows: read.data.map((values, at) => {
94
+ const words = {};
95
+ names.forEach((name, column) => {
96
+ words[name] = dataCells[at][column]?.words ?? "";
97
+ });
98
+ return { values: { ...values }, links: linksOf(dataRows[at], own), words };
99
+ }),
100
+ };
101
+ }