@jant/core 0.3.37 → 0.3.39

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 (1177) hide show
  1. package/LICENSE +189 -189
  2. package/README.md +5 -4
  3. package/bin/commands/assets/prepare.js +55 -0
  4. package/bin/commands/db/execute-file.js +113 -0
  5. package/bin/commands/db/export.js +5 -0
  6. package/bin/commands/db/rehearse.js +65 -0
  7. package/bin/commands/deploy.js +162 -0
  8. package/bin/commands/export.js +73 -75
  9. package/bin/commands/import-site.js +1531 -267
  10. package/bin/commands/migrate.js +79 -0
  11. package/bin/commands/reset-password.js +80 -7
  12. package/bin/commands/site/export.js +415 -0
  13. package/bin/commands/site/import.js +5 -0
  14. package/bin/commands/site/localize-media.js +118 -0
  15. package/bin/commands/site/snapshot/export.js +357 -0
  16. package/bin/commands/site/snapshot/import.js +363 -0
  17. package/bin/commands/start.js +46 -0
  18. package/bin/commands/uploads/cleanup.js +119 -0
  19. package/bin/jant.js +55 -15
  20. package/bin/lib/cli-api-token.js +6 -0
  21. package/bin/lib/d1-query.js +194 -0
  22. package/bin/lib/load-node-runtime.js +10 -0
  23. package/bin/lib/migration-artifacts.js +99 -0
  24. package/bin/lib/migration-rehearsal.js +438 -0
  25. package/bin/lib/migration-runner.js +311 -0
  26. package/bin/lib/node-database.js +48 -0
  27. package/bin/lib/node-sqlite.js +158 -0
  28. package/bin/lib/public-assets.js +66 -0
  29. package/bin/lib/r2-query.js +170 -0
  30. package/bin/lib/runtime-target.js +33 -0
  31. package/bin/lib/site-localize-media.js +427 -0
  32. package/bin/lib/site-media-parser.js +1150 -0
  33. package/bin/lib/site-selection.js +222 -0
  34. package/bin/lib/site-snapshot.js +484 -0
  35. package/bin/lib/site-url.js +84 -0
  36. package/bin/lib/sql-export.js +194 -0
  37. package/bin/lib/wrangler-cli.js +41 -0
  38. package/bin/lib/wrangler-config.js +86 -0
  39. package/dist/app-BfoG98VD.js +30410 -0
  40. package/dist/client/_assets/chunks/0041f681602cc834bb5c55ced0155b8e-BNpHLJgt.woff2 +0 -0
  41. package/dist/client/_assets/chunks/008ea9091e332c639ceb18874eacd60c-CygB704Q.woff2 +0 -0
  42. package/dist/client/_assets/chunks/00c9ac960d866ffaf8a866e5939024e2-CqRrlxSi.woff2 +0 -0
  43. package/dist/client/_assets/chunks/02629e5d0a9860b7fe32ec1f0563213a-YvgSIv_V.woff2 +0 -0
  44. package/dist/client/_assets/chunks/02e48e353415a00e0f556608cab33a43-YFgu4zi3.woff2 +0 -0
  45. package/dist/client/_assets/chunks/02faf6bb0ab4d56ada037c0bbaf9b9f7-DUuUM2eo.woff2 +0 -0
  46. package/dist/client/_assets/chunks/031089da45fbfb7dc18ac827bef4c56e-D4ahCOTO.woff2 +0 -0
  47. package/dist/client/_assets/chunks/03ac785139320b7b13bac9c150bf72bf-BG7zubxs.woff2 +0 -0
  48. package/dist/client/_assets/chunks/053bd3d7aec0040d0cc50c261a1f4e3e-BdG4yI0n.woff2 +0 -0
  49. package/dist/client/_assets/chunks/057a3d44d7fc606f113d863376d0ecf0-BsEMbuKV.woff2 +0 -0
  50. package/dist/client/_assets/chunks/0713613227cc4c686c45a279f8bdc166-BzLoJcLo.woff2 +0 -0
  51. package/dist/client/_assets/chunks/0b1f83a3c7e715560a55ad9eb0fb1c94-asGrAhxW.woff2 +0 -0
  52. package/dist/client/_assets/chunks/0c055db157e7a13f3103cc2a6b67fec3-1T6huY_I.woff2 +0 -0
  53. package/dist/client/_assets/chunks/0d3f5cc265cb6c439c517f2c4cebbddf-CmkfpVHX.woff2 +0 -0
  54. package/dist/client/_assets/chunks/0e97f44ebc65384c346fe19bcc52fa20-BJTzmZzt.woff2 +0 -0
  55. package/dist/client/_assets/chunks/10f2b44b3711d3f5bdcc30d373b543d1-BRTxD_6-.woff2 +0 -0
  56. package/dist/client/_assets/chunks/1139d32ae2bdeb26c0c8f31330aa9a9f-B7k4Da0E.woff2 +0 -0
  57. package/dist/client/_assets/chunks/1259e5825b314fe2b8bb96d6e8069ee5-Ba8VoZCg.woff2 +0 -0
  58. package/dist/client/_assets/chunks/12c518ebfe62818af550c08947e359e7-B7eDp07N.woff2 +0 -0
  59. package/dist/client/_assets/chunks/145831a59caa06d894022fe60212ed21-B3xSIk4b.woff2 +0 -0
  60. package/dist/client/_assets/chunks/14b040a2dda256936bc7b3470e548394-CF7zgNWs.woff2 +0 -0
  61. package/dist/client/_assets/chunks/14c1506106d92621bafb11016735194e-cbk_paoP.woff2 +0 -0
  62. package/dist/client/_assets/chunks/154a2c266902003bd8b7449386b10776-CYgd0apt.woff2 +0 -0
  63. package/dist/client/_assets/chunks/15f8c0df47fd639d1b0d9bd5cf507c9b-B11bYwtn.woff2 +0 -0
  64. package/dist/client/_assets/chunks/1668bd859ffe15bed7d5563117d8d5fb-DJotYU-j.woff2 +0 -0
  65. package/dist/client/_assets/chunks/169a096e61d38a773216f51d1ec2cc06-CzS4CZjy.woff2 +0 -0
  66. package/dist/client/_assets/chunks/1884a2b22d314c7d57707f03aec348e0-BdBJ4_JO.woff2 +0 -0
  67. package/dist/client/_assets/chunks/189f272ea2600c74d576b7b15c014922-CylwUmhO.woff2 +0 -0
  68. package/dist/client/_assets/chunks/190e3f8632494e7c095117f26b1c811e-DT09KhZe.woff2 +0 -0
  69. package/dist/client/_assets/chunks/19ad151c22ce1befe0a9ea643fbee570-BOjbPzxL.woff2 +0 -0
  70. package/dist/client/_assets/chunks/19e39850472250bfdbce654d30859879-Db8MVQ-5.woff2 +0 -0
  71. package/dist/client/_assets/chunks/1b5d0d740450fb996749464c9b882025-BG0yepI2.woff2 +0 -0
  72. package/dist/client/_assets/chunks/1bca0a2a8840ad0ee9414940593db144-CfiRZ0Fs.woff2 +0 -0
  73. package/dist/client/_assets/chunks/1c820b5295868008ca7c78afa5b7655d-rGkaVY0Z.woff2 +0 -0
  74. package/dist/client/_assets/chunks/1cda27dcaab977ae4ef5d5ab2a10ae03-3n1CbajX.woff2 +0 -0
  75. package/dist/client/_assets/chunks/1e2640116bbba817f43c43cc69371cf1-BLnekPNy.woff2 +0 -0
  76. package/dist/client/_assets/chunks/1f4bc38a1c50f55f335f5411cae47696-3J1JFXeu.woff2 +0 -0
  77. package/dist/client/_assets/chunks/1fbccc182322b513f57cd156a9a491b0-bRVH28a5.woff2 +0 -0
  78. package/dist/client/_assets/chunks/1fbe225742c69f4ba9ea5f74922f0ca1-BHRIiKDB.woff2 +0 -0
  79. package/dist/client/_assets/chunks/2022cf097cb952d9fe75b53b4587d2c3-Btdq5ZEB.woff2 +0 -0
  80. package/dist/client/_assets/chunks/21e0a71d86be7b8a9e812e7af09dd061-SSZaQU5Z.woff2 +0 -0
  81. package/dist/client/_assets/chunks/2240a3c43ca5ef59ae3c348c7884792f-DQgT8QLe.woff2 +0 -0
  82. package/dist/client/_assets/chunks/2573703213da30d3ba18925b100b2c2b-D61uHyrJ.woff2 +0 -0
  83. package/dist/client/_assets/chunks/265e048cc9f2f8a711ba585a534d5351-geHDzSNf.woff2 +0 -0
  84. package/dist/client/_assets/chunks/26839c0e47c73514b8d8f660d24d6b19-D2gmzZl-.woff2 +0 -0
  85. package/dist/client/_assets/chunks/280e3d2b58e9ad3501816072e01b0c13-Dx5yDwjz.woff2 +0 -0
  86. package/dist/client/_assets/chunks/2874d07e228da9583b0e73646dacd498-26mUURU-.woff2 +0 -0
  87. package/dist/client/_assets/chunks/29d49891713a2785a3a383001cf58c59-DVb6JpZh.woff2 +0 -0
  88. package/dist/client/_assets/chunks/2a22e14a9ad53f2abb3c7e85017b7d12-CU_4APNf.woff2 +0 -0
  89. package/dist/client/_assets/chunks/2a7cedfcd6e4c7cec36f4fd7b0f329c2-BUp7BYdq.woff2 +0 -0
  90. package/dist/client/_assets/chunks/2acea04a920f6af31e7db97052f563c6-KdL2n7-Y.woff2 +0 -0
  91. package/dist/client/_assets/chunks/2ae2ca951489c9d50cde5b36a2a5515b-CWV12jwD.woff2 +0 -0
  92. package/dist/client/_assets/chunks/2b3e8c5703b91f39f6027f43f0da6f4b-FHYDvFqX.woff2 +0 -0
  93. package/dist/client/_assets/chunks/2ba802b14f21a58fc61606c88fa93373-BmrW6szo.woff2 +0 -0
  94. package/dist/client/_assets/chunks/2d81eb6ab0ebbc0cabfb3a3341ba8800-Ds2YcMj0.woff2 +0 -0
  95. package/dist/client/_assets/chunks/2deb444546774c3a3ab38c75eb69cdfb-Dm9USQXk.woff2 +0 -0
  96. package/dist/client/_assets/chunks/2e98b666924b8e0a09d1aeeefd24bdd2-Cmh3DrKG.woff2 +0 -0
  97. package/dist/client/_assets/chunks/2f27ee4fb2cf6a280e110e09c18ef73e-D_yYWYMZ.woff2 +0 -0
  98. package/dist/client/_assets/chunks/2fbccf9a3853eb59db1a825e044515fd-CiShE3Wo.woff2 +0 -0
  99. package/dist/client/_assets/chunks/2fd3fceb6faed5e3db768e88d7614dca-D74stxc-.woff2 +0 -0
  100. package/dist/client/_assets/chunks/2ff009fa8701505d7f3dc6c83763f019-nkOuUfA-.woff2 +0 -0
  101. package/dist/client/_assets/chunks/31342cebfa5ea7fac06b4ea372d96bc5-DdIH_TkU.woff2 +0 -0
  102. package/dist/client/_assets/chunks/31424fe5d54692e7c8b38021ccb8597c-CfNu45zJ.woff2 +0 -0
  103. package/dist/client/_assets/chunks/3179006d1c7ebfa50d27482a2859d9a0-e7PNUH9y.woff2 +0 -0
  104. package/dist/client/_assets/chunks/34c2edb3c37f71258f5c4a31091f0c6c-Cyr8VjPf.woff2 +0 -0
  105. package/dist/client/_assets/chunks/35cf5dd04315e0b906e1a413d7905a2f-A-QPUrVX.woff2 +0 -0
  106. package/dist/client/_assets/chunks/360c190344c26278bbc50e2f4d6a2b3f-B7OhzvgR.woff2 +0 -0
  107. package/dist/client/_assets/chunks/375329ba0b50b94b35006498e555867c-CDc5XB7_.woff2 +0 -0
  108. package/dist/client/_assets/chunks/387c811226f303af62f1e21aae6f5c83-BmPYUAdb.woff2 +0 -0
  109. package/dist/client/_assets/chunks/389a950f2a1211946d294716e679e381-Diuxk8JN.woff2 +0 -0
  110. package/dist/client/_assets/chunks/39b0bbc910af9d2d6dcd8bd4abd6387d-NhvZf71d.woff2 +0 -0
  111. package/dist/client/_assets/chunks/3adc8f6350cf5067bcb6dc5e44c45d41-DIO3oy0b.woff2 +0 -0
  112. package/dist/client/_assets/chunks/3b41385fc27419c19822060daa0b5cb3-Dh5JVnsu.woff2 +0 -0
  113. package/dist/client/_assets/chunks/3bed5bd57de8f738e53cddaea88983d9-BAGVbLtM.woff2 +0 -0
  114. package/dist/client/_assets/chunks/3c201fd8d1bb20abe7d06b940e83a4d9-Bz0dCLvM.woff2 +0 -0
  115. package/dist/client/_assets/chunks/3cbe4a697fd595ef42c899de7d3e5445-zWwFRRI_.woff2 +0 -0
  116. package/dist/client/_assets/chunks/3d385ea0880df7204258e290648ec012-BQqoFH8R.woff2 +0 -0
  117. package/dist/client/_assets/chunks/3d83dacbbec3d8532ae9afede21f3aab-BH06SEJj.woff2 +0 -0
  118. package/dist/client/_assets/chunks/3dc1a4f0d7af59e16b5162a2b077a442-CkXZW3CY.woff2 +0 -0
  119. package/dist/client/_assets/chunks/3dc68e473fe23bd076dd46785cd23583-Cv6HZ0Dr.woff2 +0 -0
  120. package/dist/client/_assets/chunks/427577dcb707d1d35eebd155b4222aa7-D7-mHA6o.woff2 +0 -0
  121. package/dist/client/_assets/chunks/42a74b6a625bbf0a9616ed4db3152c88-CQ58KTMS.woff2 +0 -0
  122. package/dist/client/_assets/chunks/435b7dca567809813fcb395a27ed83a0-C6E3YXBr.woff2 +0 -0
  123. package/dist/client/_assets/chunks/43693195e775d515689fa035394067fd-DLMrklI6.woff2 +0 -0
  124. package/dist/client/_assets/chunks/43fb49e5b79ee7e553869d84e6e08b1e-BgOVrd59.woff2 +0 -0
  125. package/dist/client/_assets/chunks/44dcbbc3cc8f22e613b342d691511ab6-dRyYwGGi.woff2 +0 -0
  126. package/dist/client/_assets/chunks/450a5b53be0a8a778bb0b623e86b652f-qwII2gXW.woff2 +0 -0
  127. package/dist/client/_assets/chunks/457485e72835364662dfead6281638c1-Mv279UyL.woff2 +0 -0
  128. package/dist/client/_assets/chunks/47479c470fae70f10b7c964a7ecbf274-D9VNBclD.woff2 +0 -0
  129. package/dist/client/_assets/chunks/474fac21b12b7efd71f7c321578878b0-BJRz_Yd3.woff2 +0 -0
  130. package/dist/client/_assets/chunks/477866c8396474a17317dcac3e7a014f-e90LWIFy.woff2 +0 -0
  131. package/dist/client/_assets/chunks/478ebdaadda7775c391c5dcab4e697df-RfXJJ1gl.woff2 +0 -0
  132. package/dist/client/_assets/chunks/488846410760fe128dae939836ca5423-D0YbXQOX.woff2 +0 -0
  133. package/dist/client/_assets/chunks/48d6a97a185c799be4fe67aaf7edf213-CqLkiJik.woff2 +0 -0
  134. package/dist/client/_assets/chunks/48eb0a91e50c7f026e248c64145e72af-D8LB2Dye.woff2 +0 -0
  135. package/dist/client/_assets/chunks/490edb9fc8a4356aea556eed32287464-Bxk-XtyT.woff2 +0 -0
  136. package/dist/client/_assets/chunks/4a23fe6e82fd496b5eb20401b6164efe-CfhsfLd6.woff2 +0 -0
  137. package/dist/client/_assets/chunks/4b0e79ba18b2ce424fa93e84996d7cba-B0dS4UvF.woff2 +0 -0
  138. package/dist/client/_assets/chunks/4bc743968cf1c3ce5711de67ef1ccc4d-Dmn20LlT.woff2 +0 -0
  139. package/dist/client/_assets/chunks/4c4bdd0b3f3a52e28f3b643c1c5d43be-BLqyuzyK.woff2 +0 -0
  140. package/dist/client/_assets/chunks/4c96411f3693a9a8657a9c1190f82bce-BhP7AS2j.woff2 +0 -0
  141. package/dist/client/_assets/chunks/4c9aa12aba2a6a57410eacaff7427916-CLDZgzM7.woff2 +0 -0
  142. package/dist/client/_assets/chunks/4cca7233bf8ce5dec2e5d146b993d626-Bf7OgJe6.woff2 +0 -0
  143. package/dist/client/_assets/chunks/4cf0f292f3358bd2f73b1cf4ec1476f3-CIfjw85D.woff2 +0 -0
  144. package/dist/client/_assets/chunks/4d0a9128d06ea857f203bf5d007b1ab9-BZ-BuqS9.woff2 +0 -0
  145. package/dist/client/_assets/chunks/4dc0728df0f2ba70796f45f05654c7ba-DGd3NDaT.woff2 +0 -0
  146. package/dist/client/_assets/chunks/4dc2bc2c55b47f57d13b63aa6b1c8bd4-g3WbclK2.woff2 +0 -0
  147. package/dist/client/_assets/chunks/4e1cc6aafb411b572c8d3511e925ecf1-BUf15jYj.woff2 +0 -0
  148. package/dist/client/_assets/chunks/4e5384920bbb155d9d8d74887b09ea5b-2KLteQXT.woff2 +0 -0
  149. package/dist/client/_assets/chunks/501f66f24bce8234441954de1b568403-CIe4N6pO.woff2 +0 -0
  150. package/dist/client/_assets/chunks/50cfd672bfa62512ba090420acf35c87-CibXrwCT.woff2 +0 -0
  151. package/dist/client/_assets/chunks/5227dbe9933760a48baff21ebd13fc98-v8CBITMX.woff2 +0 -0
  152. package/dist/client/_assets/chunks/526b263e72c189f4b065738aaa6d423a-Dj5Ns6Ev.woff2 +0 -0
  153. package/dist/client/_assets/chunks/53a88404451448cd2e620a0ca0e45a20-CI0P5NCv.woff2 +0 -0
  154. package/dist/client/_assets/chunks/54da934819a917f561b439bfd10f88b6-CpoNRhz7.woff2 +0 -0
  155. package/dist/client/_assets/chunks/54e301f412730f391225db59dae1c8d5-CxTAz9F1.woff2 +0 -0
  156. package/dist/client/_assets/chunks/551b1d7a0b80c8d42af09863cdca7f01-BIGKH8GS.woff2 +0 -0
  157. package/dist/client/_assets/chunks/555d990ab3fd7d3d66c6d1fa9a82fec5-BndAe6f2.woff2 +0 -0
  158. package/dist/client/_assets/chunks/557cd00c5d6827e13d72a0c71b23587b-C6gpr-g-.woff2 +0 -0
  159. package/dist/client/_assets/chunks/563fa31542d553f25abab65cf7f81e1d-Cl_1me5X.woff2 +0 -0
  160. package/dist/client/_assets/chunks/56e1c4734bbbb38af2fbc262bf6e98f2-DZ32amUx.woff2 +0 -0
  161. package/dist/client/_assets/chunks/5947f5da5da9a352a2b534ee64bfc29a-DT0Fj-SL.woff2 +0 -0
  162. package/dist/client/_assets/chunks/5979c33a7eb5963bf8e83e46931b5fb5--4f9yv1z.woff2 +0 -0
  163. package/dist/client/_assets/chunks/597d69d0710e0178b162afb0a0c20401-CpThXFdo.woff2 +0 -0
  164. package/dist/client/_assets/chunks/59966ee0b069b577510fe68c350da0ee-Bs_HDvyP.woff2 +0 -0
  165. package/dist/client/_assets/chunks/5a10741e41259e235841440394c0763d-uCZGOg0A.woff2 +0 -0
  166. package/dist/client/_assets/chunks/5bfc7a121c35ae42623ef804fb525e0e-mS7vyFFz.woff2 +0 -0
  167. package/dist/client/_assets/chunks/5cc23a76e122d0ad2f7cede41bc35b27-4T1ZVQJu.woff2 +0 -0
  168. package/dist/client/_assets/chunks/5d48855bed5f3554eff91b573d7376ac-CPzsdNDF.woff2 +0 -0
  169. package/dist/client/_assets/chunks/5ddcbe564b29ef08632e1aeb33455435-CQzDKa-z.woff2 +0 -0
  170. package/dist/client/_assets/chunks/5f90024544c2907c6c0203c6210c50be-C_1uxIky.woff2 +0 -0
  171. package/dist/client/_assets/chunks/605667a998e91e2b6a4a3cd7c31fe5a9-Co2lOjER.woff2 +0 -0
  172. package/dist/client/_assets/chunks/60a14064ed334f0155795d795e926abe-C2HuVyw5.woff2 +0 -0
  173. package/dist/client/_assets/chunks/60d8b0805a0a8c54a6cca216004beff5-CV1GX5br.woff2 +0 -0
  174. package/dist/client/_assets/chunks/611b62d5fd9698d9b5ce495ba6f14c93-CPi2xRKF.woff2 +0 -0
  175. package/dist/client/_assets/chunks/61bf4287453da4025d03fa6b2dba66ca-CMh4XzzB.woff2 +0 -0
  176. package/dist/client/_assets/chunks/638369541268ed5a10af97ad77498c73-DrpvGu-L.woff2 +0 -0
  177. package/dist/client/_assets/chunks/649b12d7cee7bb981842946e4547e6ca-EACt8KkC.woff2 +0 -0
  178. package/dist/client/_assets/chunks/653bef2ed891ae48d8ed712283080649-C3d1ZTAc.woff2 +0 -0
  179. package/dist/client/_assets/chunks/67d2a81f06ba352f17fbdc3a5e6ea59e-DC8Iostn.woff2 +0 -0
  180. package/dist/client/_assets/chunks/67f32ceea9e78e5109f87724ad886010-C_3-9sSn.woff2 +0 -0
  181. package/dist/client/_assets/chunks/68304f3229cf763465f044fccb5892c0-CTvPlN8c.woff2 +0 -0
  182. package/dist/client/_assets/chunks/687d0f0f90a9b23e40102e16ad8e9836-Bzlx1W-7.woff2 +0 -0
  183. package/dist/client/_assets/chunks/688a88911e4da17b609196a959b8b930-BgwP4zIQ.woff2 +0 -0
  184. package/dist/client/_assets/chunks/68f2fab82ec8e9291f08c3145111549c-CXqagiiH.woff2 +0 -0
  185. package/dist/client/_assets/chunks/69519ada3f3f74ca20aacb8af48ab6b4-DncDOElk.woff2 +0 -0
  186. package/dist/client/_assets/chunks/6a6e884fb2b65ec5b4a3d5ecd0d01a6a-DBNJo4jq.woff2 +0 -0
  187. package/dist/client/_assets/chunks/6db6ddf72c38a78ce44c1327701152e1-CFUWMaQQ.woff2 +0 -0
  188. package/dist/client/_assets/chunks/6e1a8b45b01939088c3a8cfcf8c10681-BemqZSaI.woff2 +0 -0
  189. package/dist/client/_assets/chunks/6e2164fad867d166de2e5b274f04a563-_YD_QMym.woff2 +0 -0
  190. package/dist/client/_assets/chunks/6e83fe0b6e708eaf1c3003d6dee11488-CRqY8z2g.woff2 +0 -0
  191. package/dist/client/_assets/chunks/6eefc9d430171c1e1e4034ecadee31c8-d3VCnQ01.woff2 +0 -0
  192. package/dist/client/_assets/chunks/70861376e5d4f92f8aa7aa1b2749b617-BqwxmSo2.woff2 +0 -0
  193. package/dist/client/_assets/chunks/70adaf50c56d5ff859c64d35e0f1e34e-BCmTRExx.woff2 +0 -0
  194. package/dist/client/_assets/chunks/7124d150570d39ced8d45507dc11ca1e-Co_mUkqP.woff2 +0 -0
  195. package/dist/client/_assets/chunks/71eafb8fbe3a734283517e230ad8b6db-CFmZ-qAS.woff2 +0 -0
  196. package/dist/client/_assets/chunks/72ee453ac0e19bd2c631c8921c44e3de-CEidyyfI.woff2 +0 -0
  197. package/dist/client/_assets/chunks/751f54dbb115140d5b645a6ba4aff5d3-DY-S96zI.woff2 +0 -0
  198. package/dist/client/_assets/chunks/753b5f6fb254bacb6618ace25af3df60-uBG6c32o.woff2 +0 -0
  199. package/dist/client/_assets/chunks/7609e7e74dd4d916a7abc7ecc7d95f7e-CzrNhght.woff2 +0 -0
  200. package/dist/client/_assets/chunks/76b9d6fe838ae4151d95ce7200aa2bf6-BfQWDykU.woff2 +0 -0
  201. package/dist/client/_assets/chunks/76d4244186d118eea245d1385a4de2ec-CEoql1pw.woff2 +0 -0
  202. package/dist/client/_assets/chunks/77a7533bd21ccd33192d142a93555aa8-BzSb8ker.woff2 +0 -0
  203. package/dist/client/_assets/chunks/78ce29fed872e44fc9014d94875d2aac-D1BDuJXp.woff2 +0 -0
  204. package/dist/client/_assets/chunks/79a7fdf7d9c722b5723ae25e6ff8e203-5rPAnIr7.woff2 +0 -0
  205. package/dist/client/_assets/chunks/79a85a253e9b3f12d2e2cb15e16b3003-DTjWGv2X.woff2 +0 -0
  206. package/dist/client/_assets/chunks/7a86b155111ba20f3e87306ff6beac77-DchSNxJ1.woff2 +0 -0
  207. package/dist/client/_assets/chunks/7b1e76975b0984e6f83e3f9f8069e784-OB_rGzsR.woff2 +0 -0
  208. package/dist/client/_assets/chunks/7b6c60131822a0e4d36d980d52509d4e-8dQVuUiW.woff2 +0 -0
  209. package/dist/client/_assets/chunks/7caa14a095a6bc313aab780fe4ff7999-BJ-80Ois.woff2 +0 -0
  210. package/dist/client/_assets/chunks/7cbda564cb2dd4799ab9e89d51286aa7-MlT7YRSz.woff2 +0 -0
  211. package/dist/client/_assets/chunks/7d138084cf03c14116b11297fce0e3e3-CdWCcyam.woff2 +0 -0
  212. package/dist/client/_assets/chunks/7d65a3d6a65050eb5e6eca43398aeba4-CYB359u-.woff2 +0 -0
  213. package/dist/client/_assets/chunks/7dfc711962c8771f97e7c8898a6bcb65-Yv69yrg4.woff2 +0 -0
  214. package/dist/client/_assets/chunks/7ef123b62d530fcba73974fa265e0aae-CD7IMlBc.woff2 +0 -0
  215. package/dist/client/_assets/chunks/7f60eefa15956d6f06dd92404887d58c-LqioDjlc.woff2 +0 -0
  216. package/dist/client/_assets/chunks/7f8c15e0ecb102738981d9fa4cb6b921-8qiw7Fmn.woff2 +0 -0
  217. package/dist/client/_assets/chunks/80466082a896fd328f30a78593c7c568-BMAVDyAy.woff2 +0 -0
  218. package/dist/client/_assets/chunks/812b5a4b87f3a7b4afc1cfebc864f413-B4_mWnLK.woff2 +0 -0
  219. package/dist/client/_assets/chunks/812dfb7f8144d01b3cc9d5ce0b472f40-DxhfKDhh.woff2 +0 -0
  220. package/dist/client/_assets/chunks/84742b1ede4f0bb6d27131298eba21b4-4_QYQ-wj.woff2 +0 -0
  221. package/dist/client/_assets/chunks/8555f0285e3d28e95e2fc0ccccd9caff-CEnfoaRy.woff2 +0 -0
  222. package/dist/client/_assets/chunks/880162ae92cd9e120eb4e4e11fae459d-Cj61LKOn.woff2 +0 -0
  223. package/dist/client/_assets/chunks/8a3c84b0df36f851f5fea75ee8757951-CfHrA-x8.woff2 +0 -0
  224. package/dist/client/_assets/chunks/8b0c8c9f8cfa9fa090d97c5a5efb1f4c-DZc3EGF4.woff2 +0 -0
  225. package/dist/client/_assets/chunks/8c8393bc875f1ee36697a2113f4421ea-CnBugeCf.woff2 +0 -0
  226. package/dist/client/_assets/chunks/8dc035a34c76e6515ca203e2df182588-B1reQPCB.woff2 +0 -0
  227. package/dist/client/_assets/chunks/8e04e64c8f68d292a18d4160fbde8671-DkT7v-sd.woff2 +0 -0
  228. package/dist/client/_assets/chunks/8e6c9bb43afb8cbbff7cf1055e67c9bd-c7wzPI7v.woff2 +0 -0
  229. package/dist/client/_assets/chunks/8eb06109812cb80be44f47b8179c2709-DOaU0xD8.woff2 +0 -0
  230. package/dist/client/_assets/chunks/8f2b960c2823670e94f5b08aa65657e6-CHT-Gunr.woff2 +0 -0
  231. package/dist/client/_assets/chunks/8f89f57230d184f92a36e241874229d7-D6P0FMCn.woff2 +0 -0
  232. package/dist/client/_assets/chunks/904324af375d5fd370af1054355a050e-CHiXmgO7.woff2 +0 -0
  233. package/dist/client/_assets/chunks/90ac4f9d2aa02afdace2843b49fc18bb-CWArmWzF.woff2 +0 -0
  234. package/dist/client/_assets/chunks/90b6f57d77847f512fd11db74fa912f1-DzYbq8hW.woff2 +0 -0
  235. package/dist/client/_assets/chunks/911a2092d64d6d6494b254d819af2b91-C0xmZ-Cu.woff2 +0 -0
  236. package/dist/client/_assets/chunks/913759e6690f9fc0746a20b96f4bdcb4-B0k9hqx0.woff2 +0 -0
  237. package/dist/client/_assets/chunks/9154e26efe532a85a27d80902f5a2d6c-DJQmzPmB.woff2 +0 -0
  238. package/dist/client/_assets/chunks/9180de34b48b325200a97e267befff32-ClJx20hD.woff2 +0 -0
  239. package/dist/client/_assets/chunks/94e7ed67f1557b76fead6b6e456a0415-CjAhhvRn.woff2 +0 -0
  240. package/dist/client/_assets/chunks/95127a92346c04fec1fa81d6295b0a28-DNbeXPGm.woff2 +0 -0
  241. package/dist/client/_assets/chunks/958efb9b2fa2ea0008ffef009885f9f8-CNOwBDS1.woff2 +0 -0
  242. package/dist/client/_assets/chunks/95df3b9f681d9df411c30aea5b24f2e0-Dv7GHFVj.woff2 +0 -0
  243. package/dist/client/_assets/chunks/975af5a496e8d87d821910aa9fe4d598-CG5KDMOI.woff2 +0 -0
  244. package/dist/client/_assets/chunks/97a874bbf55ce89a4ab7cd27c7e938b1-fhost-bL.woff2 +0 -0
  245. package/dist/client/_assets/chunks/9ca9b71010a5faeee7047ef97aeee13b-K6NP7P3o.woff2 +0 -0
  246. package/dist/client/_assets/chunks/9cd0b77920b9d6c64eb686493123fc76-Db6wX5BE.woff2 +0 -0
  247. package/dist/client/_assets/chunks/9de02d745b8e25c6411fb152fb067748-CGxZtq8G.woff2 +0 -0
  248. package/dist/client/_assets/chunks/9eb33a430058d839ebbe2af4b2e0daa9-Cjd-WSds.woff2 +0 -0
  249. package/dist/client/_assets/chunks/9ebd27835ffcbd794e67151ab046ce68-DmxtZVr5.woff2 +0 -0
  250. package/dist/client/_assets/chunks/9f5a73aa8ba417688019d628f334db07-P03uxox_.woff2 +0 -0
  251. package/dist/client/_assets/chunks/9fbc06b2e3ff16b9d705c76db563ef17-XDHSv5Te.woff2 +0 -0
  252. package/dist/client/_assets/chunks/9fd53607094e329fa8e5c785b3ff0f1a-B-9qgOdM.woff2 +0 -0
  253. package/dist/client/_assets/chunks/a077f51cfb5cffb4ff4d8e229c0e9e79-BaPgyZ5H.woff2 +0 -0
  254. package/dist/client/_assets/chunks/a0f0c06d5c7a3ffa97706178cce212a8-DN_NE4Ic.woff2 +0 -0
  255. package/dist/client/_assets/chunks/a38c1830367f784181b6f544b0b11bbd-BmPGDXn1.woff2 +0 -0
  256. package/dist/client/_assets/chunks/a397997b579d3945c9c70a979c17a8ad-DXa54wGz.woff2 +0 -0
  257. package/dist/client/_assets/chunks/a3b929542e6c5a0644b73a7c8a8b6c03-B5i2p-Hj.woff2 +0 -0
  258. package/dist/client/_assets/chunks/a578742770fcd2226e3c45b5b6efdcb0-C1QhQdHg.woff2 +0 -0
  259. package/dist/client/_assets/chunks/a68d9d5027803832bb28e78cdcd04949-D_bwWhwg.woff2 +0 -0
  260. package/dist/client/_assets/chunks/a8857f5d478f101c053ba02d2f223e90-CHOaRPpq.woff2 +0 -0
  261. package/dist/client/_assets/chunks/a904b05966368bcf90b632c7c2e5f76b-BbTXYQVh.woff2 +0 -0
  262. package/dist/client/_assets/chunks/a9cf85e27428c14351d30eac8cbc8d91-DMaVc3-8.woff2 +0 -0
  263. package/dist/client/_assets/chunks/aa0ce6740f301351761a0615cc8b2e99-4RL3pitV.woff2 +0 -0
  264. package/dist/client/_assets/chunks/aa218a2c45f3749537ce876201e5152b-DndHqA-p.woff2 +0 -0
  265. package/dist/client/_assets/chunks/aa28db16818f9eaa8c817f289e1c3270-Drm1Jwhe.woff2 +0 -0
  266. package/dist/client/_assets/chunks/aa64c9953af43ca65832f413895bb433-CR32RteD.woff2 +0 -0
  267. package/dist/client/_assets/chunks/aa96d698491c2540e2dcf7009c65c456-BXlPVR0v.woff2 +0 -0
  268. package/dist/client/_assets/chunks/ada8f0241244c60ec8d3d59ad37f20a5-BFQsznEm.woff2 +0 -0
  269. package/dist/client/_assets/chunks/ae25c41034ddc1a9e0b41f5034c9aa4b-COQJkHOc.woff2 +0 -0
  270. package/dist/client/_assets/chunks/ae289ae3f8cdb54a3a6c07174517afec-DFGIoTY6.woff2 +0 -0
  271. package/dist/client/_assets/chunks/ae401fb4db80d5ff5cd3f8d9bc811070-Byt9AwoT.woff2 +0 -0
  272. package/dist/client/_assets/chunks/b02dfa2aa52cbdb1b2f11a9f44335469-DVWsuPSL.woff2 +0 -0
  273. package/dist/client/_assets/chunks/b0ab3a7f319ce6dd3c9a4de2674e7c72-CksmA6Hr.woff2 +0 -0
  274. package/dist/client/_assets/chunks/b159deb135e9946eea0572d52778170b-BZrtOTn0.woff2 +0 -0
  275. package/dist/client/_assets/chunks/b2e326f7f9b807451bf9c745df747efe-BvlONCPB.woff2 +0 -0
  276. package/dist/client/_assets/chunks/b341de0bc0bfe194a6c28dcfb566029e-DJAj3r6U.woff2 +0 -0
  277. package/dist/client/_assets/chunks/b846c293981ca5429eabaa967f222f26-GS-TAaO6.woff2 +0 -0
  278. package/dist/client/_assets/chunks/b91450304d9ac44f5c6e0da0792e055d-vS0S7kl0.woff2 +0 -0
  279. package/dist/client/_assets/chunks/baa325551b381c5e035ef143e56d4abe-DJg3GhKJ.woff2 +0 -0
  280. package/dist/client/_assets/chunks/bc3f0cb8b55ee11d32b94ca488976f8d-Dp5KZMSD.woff2 +0 -0
  281. package/dist/client/_assets/chunks/bcb3307527d6d0033bf0f17660b91e71-BMgRW_eW.woff2 +0 -0
  282. package/dist/client/_assets/chunks/be64f9379412876e00fd3a0bfa6b6fe9-BJ3FMWFM.woff2 +0 -0
  283. package/dist/client/_assets/chunks/befed8a4fa817773fa7109db6fe07f56-3sAmDsOO.woff2 +0 -0
  284. package/dist/client/_assets/chunks/bf1acc86e17b4229c548828a9d6f455d-JNuPCGDM.woff2 +0 -0
  285. package/dist/client/_assets/chunks/c09ee2b219982f8d46ad9968b7e6e0ba-qVb8yJHb.woff2 +0 -0
  286. package/dist/client/_assets/chunks/c0c7836749e585cee24ab2f8457c5b01-Ds0003oT.woff2 +0 -0
  287. package/dist/client/_assets/chunks/c2ac4ef1860812036ca2b8c4e4089bdc-DsziO8Du.woff2 +0 -0
  288. package/dist/client/_assets/chunks/c31019c08bd22464f7a88f090281404c-CUC0jMW1.woff2 +0 -0
  289. package/dist/client/_assets/chunks/c33c59feccf391f0c5f1f5d24e36d1fe-BXTVggad.woff2 +0 -0
  290. package/dist/client/_assets/chunks/c39ec937c6a8d124e8b68cf829ea5ad4-CarrkdmQ.woff2 +0 -0
  291. package/dist/client/_assets/chunks/c3fbc1f2557c343863a10698f8c966a2-BiOC1yo2.woff2 +0 -0
  292. package/dist/client/_assets/chunks/c3fd21315345ae541f6e98067059fa19-rHtO7vK5.woff2 +0 -0
  293. package/dist/client/_assets/chunks/c568a16e3168ceb1f191b70022c492ea-BpAiyU80.woff2 +0 -0
  294. package/dist/client/_assets/chunks/c57ee3b49b7e45b995539a6b2c51f138-IHDXeVRU.woff2 +0 -0
  295. package/dist/client/_assets/chunks/c5c1c0be944ea39a3f50a02d32f5b759-DAwbrvTL.woff2 +0 -0
  296. package/dist/client/_assets/chunks/c5e66d60be3375835bbd8d6b797f6eac-DWp4tpvN.woff2 +0 -0
  297. package/dist/client/_assets/chunks/c5f1075caf6d1344ee720de85114a521-DTTbeLhd.woff2 +0 -0
  298. package/dist/client/_assets/chunks/c82fd9456d7465b5e5bd3659e9b14c55-Cs6h6hE6.woff2 +0 -0
  299. package/dist/client/_assets/chunks/c90b7b65d2b9696fbf3a506738f94d68-DsvgiuQQ.woff2 +0 -0
  300. package/dist/client/_assets/chunks/cae29b3f8951eaf20d2f61c2206e28d9-CoHXmhmG.woff2 +0 -0
  301. package/dist/client/_assets/chunks/cba6ad3981cb7861428d4be169ee8124-CBdFsPAF.woff2 +0 -0
  302. package/dist/client/_assets/chunks/cc26525aa2af1f0b929af32ce50a7fba-D55LVtW9.woff2 +0 -0
  303. package/dist/client/_assets/chunks/cd0e7b51eddb22a77a09b025c0281434-ByI_TSTq.woff2 +0 -0
  304. package/dist/client/_assets/chunks/cd10a3af2133805d8c92104d1ee6ff18-Dtr5mBXe.woff2 +0 -0
  305. package/dist/client/_assets/chunks/cd6d074f3957d58bac58437fc97e5e33-CrVZuSbw.woff2 +0 -0
  306. package/dist/client/_assets/chunks/cd75ca47da9ae4c0899e37d4c543319b-DXU1s4Ja.woff2 +0 -0
  307. package/dist/client/_assets/chunks/cef249b6d013fb0cc0d574176bc23811-BL7WfNHA.woff2 +0 -0
  308. package/dist/client/_assets/chunks/d043b8d7a48bb0ac59ee1f1477d88eee-d5CwY2I8.woff2 +0 -0
  309. package/dist/client/_assets/chunks/d0bd387fda28e58d3c9b3efa2468dd8a-CjDFowFS.woff2 +0 -0
  310. package/dist/client/_assets/chunks/d12ce1d8445213317f9163283e58a05d-4RtGQnak.woff2 +0 -0
  311. package/dist/client/_assets/chunks/d15a3317942b7d31978a759fbf2222c8-DQ9QFQdS.woff2 +0 -0
  312. package/dist/client/_assets/chunks/d28fb13acf9ced9f0657fd4012c81cd2-D8Bgk6sd.woff2 +0 -0
  313. package/dist/client/_assets/chunks/d320b000b5978c7251148a6a154741b8-CcGZjeFx.woff2 +0 -0
  314. package/dist/client/_assets/chunks/d3714e6b90de8e2085dfb2514464dd6a-8LsVAcmb.woff2 +0 -0
  315. package/dist/client/_assets/chunks/d3beff96216c8af1aa79246476b6a323-hQysoMK3.woff2 +0 -0
  316. package/dist/client/_assets/chunks/d3e311f30c811dc339c262a79a51877e-CkUTbS74.woff2 +0 -0
  317. package/dist/client/_assets/chunks/d51f4cdc83711e510f5d25f03235597e-BY3VAGvr.woff2 +0 -0
  318. package/dist/client/_assets/chunks/d5df4a8dfd4328c67d933b3912c6ad0f-A2fccswC.woff2 +0 -0
  319. package/dist/client/_assets/chunks/d740dc2e854aaa7b3dcdd3ed25455eeb-Cw8LrB06.woff2 +0 -0
  320. package/dist/client/_assets/chunks/d8325ba7ae651bc30440905bd67b95f1-Dg8M_ijr.woff2 +0 -0
  321. package/dist/client/_assets/chunks/da13b136efb1d1e4c76575af8f79a698-BbfzLGVB.woff2 +0 -0
  322. package/dist/client/_assets/chunks/da2cf0ec56bf69374ee37764c7e3ea3d-fyVBKE2g.woff2 +0 -0
  323. package/dist/client/_assets/chunks/da93ae099ff3b7aae27b3f674d3fc721-BDG5ywtd.woff2 +0 -0
  324. package/dist/client/_assets/chunks/daf62255dd60679946f28c442ca62533-BnIjYSn3.woff2 +0 -0
  325. package/dist/client/_assets/chunks/dccda6a2e2db3b530788bdfa2acd1979-ByL7eZcn.woff2 +0 -0
  326. package/dist/client/_assets/chunks/dd01a1035345f6921a48525b8ce08f06-vkP6t4fC.woff2 +0 -0
  327. package/dist/client/_assets/chunks/e2204cf85edcb96c5de5c3dcf240da9d-Ch3zKjD-.woff2 +0 -0
  328. package/dist/client/_assets/chunks/e264213b9e102dabc603adb6e4fda5e6-CyxmQBHB.woff2 +0 -0
  329. package/dist/client/_assets/chunks/e3e913e145ddcd9323b2a0972967feb6-3sjEdzck.woff2 +0 -0
  330. package/dist/client/_assets/chunks/e4fb59479cedc87ba79785590bf861ca-sx7RZ8Vu.woff2 +0 -0
  331. package/dist/client/_assets/chunks/e5d00355f73293d40b61299459d17ca5-D8Vt3D-z.woff2 +0 -0
  332. package/dist/client/_assets/chunks/e647b8d2efc501c0cc0e407249cc7135-BrSW9DU4.woff2 +0 -0
  333. package/dist/client/_assets/chunks/e6e60ffb2ebd1828628764b507060aea-Dqyf48QC.woff2 +0 -0
  334. package/dist/client/_assets/chunks/e7c7ef3669ae48c0a736f06ca471e1d7-DNCebEB-.woff2 +0 -0
  335. package/dist/client/_assets/chunks/e81a742cacef744130c40de1b90837d8-DtAIFBk_.woff2 +0 -0
  336. package/dist/client/_assets/chunks/e8b755172122d1d0a5dd453e96b0ff24-BNTSyPYU.woff2 +0 -0
  337. package/dist/client/_assets/chunks/e99280299c305402eaa5271a3e36c49b-BpqXwl7U.woff2 +0 -0
  338. package/dist/client/_assets/chunks/e9c66b085052ece66bfadf45f711d3e1-DVza3Uob.woff2 +0 -0
  339. package/dist/client/_assets/chunks/ed7c6dafaa6d8bcf015ef0ca574837df-C7bcndJl.woff2 +0 -0
  340. package/dist/client/_assets/chunks/f00eb499abb94fa7b799d6d8c9b050e9-D_XvVTI9.woff2 +0 -0
  341. package/dist/client/_assets/chunks/f2900a1d30c3a33129f4e2225669bd0e-in84LilX.woff2 +0 -0
  342. package/dist/client/_assets/chunks/f2fb1f1fbf7e44afb53c672ec286a22e-tFk0sTQc.woff2 +0 -0
  343. package/dist/client/_assets/chunks/f372129c60aaece937cf7b91ee75c9b8-DiP_JYOt.woff2 +0 -0
  344. package/dist/client/_assets/chunks/f5237486197aeff59341a1ff38b8eff8-D_uuqrNZ.woff2 +0 -0
  345. package/dist/client/_assets/chunks/f553d54ef931066712d8f3f0ce018e1b-D8K983U5.woff2 +0 -0
  346. package/dist/client/_assets/chunks/f5d7487963d43c89da63aaf10f2e6fb7-B7GIrfPU.woff2 +0 -0
  347. package/dist/client/_assets/chunks/f649cba8e14c33d6bf2265483b14b895-Nm5wSov8.woff2 +0 -0
  348. package/dist/client/_assets/chunks/f6839df1bf7cb4dc8d27e5ea55bbe633-BIjWKN84.woff2 +0 -0
  349. package/dist/client/_assets/chunks/f6b7304e028980f77a7f7007bb540abd-CIlBt6sf.woff2 +0 -0
  350. package/dist/client/_assets/chunks/f75496953a40ff241178240209f56990-MOSKd67d.woff2 +0 -0
  351. package/dist/client/_assets/chunks/f7d36ffff7a75c9c6216d576a57dd00d-CaXQA5A8.woff2 +0 -0
  352. package/dist/client/_assets/chunks/f7f3f63e7a149cd89eccab3b52171d05-oNOOSdDV.woff2 +0 -0
  353. package/dist/client/_assets/chunks/f8db8bef0a6e1178835d350ae0d384a1-ZAiKM369.woff2 +0 -0
  354. package/dist/client/_assets/chunks/f92d74d1d217d21b39075ff23f79f7fd-BlTe0_IX.woff2 +0 -0
  355. package/dist/client/_assets/chunks/f9d6d981d8b87b3e469027277f585741-DQqIv77a.woff2 +0 -0
  356. package/dist/client/_assets/chunks/fa7d3b99744d7f2dc9e00864a97a62d6-Pfww07DK.woff2 +0 -0
  357. package/dist/client/_assets/chunks/fa8ed469ef290bfeb571418fe0abb628-D5v-Z7kY.woff2 +0 -0
  358. package/dist/client/_assets/chunks/fb0e90665980954719c2eb685b130bc0-CiWRvo58.woff2 +0 -0
  359. package/dist/client/_assets/chunks/fb4649a82c50620773d79820e2e5ff13-dw14czgx.woff2 +0 -0
  360. package/dist/client/_assets/chunks/fb61b690208eff56e6d8432951270901-CUAnVvWa.woff2 +0 -0
  361. package/dist/client/_assets/chunks/fb9402d6c6357a825affc402f14d5a7e-CIp4G53L.woff2 +0 -0
  362. package/dist/client/_assets/chunks/fcc41f6a067ddd658bba5c9dff234a32-BtZTNo2r.woff2 +0 -0
  363. package/dist/client/_assets/chunks/fd6ad889fcf3583bd9b0b6db53aad434-DqiKyYmz.woff2 +0 -0
  364. package/dist/client/_assets/chunks/ff0937ad63cda71ff420945ead55ab4d-CXGPdnOz.woff2 +0 -0
  365. package/dist/client/_assets/chunks/heic-to-XcUDQvtx.js +1 -0
  366. package/dist/client/_assets/chunks/literata-cyrillic-ext-wght-normal-CGKlZYBf.woff2 +0 -0
  367. package/dist/client/_assets/chunks/literata-cyrillic-wght-normal-DLqwHbi6.woff2 +0 -0
  368. package/dist/client/_assets/chunks/literata-greek-ext-wght-normal-e3e57Shi.woff2 +0 -0
  369. package/dist/client/_assets/chunks/literata-greek-wght-normal-CO1l-giJ.woff2 +0 -0
  370. package/dist/client/_assets/chunks/literata-latin-ext-wght-normal-BnEbWgdZ.woff2 +0 -0
  371. package/dist/client/_assets/chunks/literata-latin-wght-normal-DLxlUchJ.woff2 +0 -0
  372. package/dist/client/_assets/chunks/literata-vietnamese-wght-normal-LcSrhZ7T.woff2 +0 -0
  373. package/dist/client/_assets/chunks/module-ChVQstFd.js +716 -0
  374. package/dist/client/_assets/chunks/native-CR5HLOyf.js +1 -0
  375. package/dist/client/_assets/chunks/news-cycle-cyrillic-400-normal-9BSXki1I.woff +0 -0
  376. package/dist/client/_assets/chunks/news-cycle-cyrillic-400-normal-CUYmhJri.woff2 +0 -0
  377. package/dist/client/_assets/chunks/news-cycle-cyrillic-ext-400-normal-CKyb9yaQ.woff2 +0 -0
  378. package/dist/client/_assets/chunks/news-cycle-cyrillic-ext-400-normal-Llxpm7uO.woff +0 -0
  379. package/dist/client/_assets/chunks/news-cycle-greek-400-normal-BiAZ91Zl.woff2 +0 -0
  380. package/dist/client/_assets/chunks/news-cycle-greek-400-normal-D88oNngQ.woff +0 -0
  381. package/dist/client/_assets/chunks/news-cycle-greek-ext-400-normal-Ckclqjrc.woff2 +0 -0
  382. package/dist/client/_assets/chunks/news-cycle-greek-ext-400-normal-oz-bBDWj.woff +0 -0
  383. package/dist/client/_assets/chunks/news-cycle-latin-400-normal-BLgpQ3uo.woff +0 -0
  384. package/dist/client/_assets/chunks/news-cycle-latin-400-normal-BgW97ttO.woff2 +0 -0
  385. package/dist/client/_assets/chunks/news-cycle-latin-ext-400-normal-DmDltzLi.woff2 +0 -0
  386. package/dist/client/_assets/chunks/news-cycle-latin-ext-400-normal-lewDoXxP.woff +0 -0
  387. package/dist/client/_assets/chunks/news-cycle-vietnamese-400-normal-QPSuG-pc.woff +0 -0
  388. package/dist/client/_assets/chunks/news-cycle-vietnamese-400-normal-t2mxI9x9.woff2 +0 -0
  389. package/dist/client/_assets/chunks/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  390. package/dist/client/_assets/chunks/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  391. package/dist/client/_assets/chunks/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  392. package/dist/client/_assets/chunks/source-sans-3-cyrillic-ext-wght-normal-DzyfIafT.woff2 +0 -0
  393. package/dist/client/_assets/chunks/source-sans-3-cyrillic-wght-normal-BMDVbyM7.woff2 +0 -0
  394. package/dist/client/_assets/chunks/source-sans-3-greek-ext-wght-normal-BWSLJLk6.woff2 +0 -0
  395. package/dist/client/_assets/chunks/source-sans-3-greek-wght-normal-C9H9m1vD.woff2 +0 -0
  396. package/dist/client/_assets/chunks/source-sans-3-latin-ext-wght-normal-C8iNium2.woff2 +0 -0
  397. package/dist/client/_assets/chunks/source-sans-3-latin-wght-normal-BqRLTx4X.woff2 +0 -0
  398. package/dist/client/_assets/chunks/source-sans-3-vietnamese-wght-normal-C1uRvKPU.woff2 +0 -0
  399. package/dist/client/_assets/chunks/url-CG0eolsk.js +1 -0
  400. package/dist/client/_assets/client-auth.js +3251 -0
  401. package/dist/client/_assets/client-cjk-tc.css +1 -0
  402. package/dist/client/_assets/client-cjk.css +1 -0
  403. package/dist/client/_assets/client.css +2 -0
  404. package/dist/client/_assets/client.js +380 -0
  405. package/dist/index.js +2 -20359
  406. package/dist/node.js +479 -0
  407. package/package.json +67 -40
  408. package/src/__tests__/bin/uploads-cleanup.test.ts +77 -0
  409. package/src/__tests__/export-service.test.ts +550 -0
  410. package/src/__tests__/helpers/app.ts +60 -27
  411. package/src/__tests__/helpers/db.ts +14 -24
  412. package/src/__tests__/helpers/lingui-core-macro-mock.ts +15 -2
  413. package/src/__tests__/import-site-command.test.ts +406 -0
  414. package/src/__tests__/site-localize-media.test.ts +150 -0
  415. package/src/__tests__/site-media-parser.test.ts +216 -0
  416. package/src/app.tsx +272 -175
  417. package/src/assets/branding/generated/README.txt +15 -0
  418. package/src/assets/branding/generated/jant-apple-touch-icon.png +0 -0
  419. package/src/assets/branding/generated/jant-brand-assets.zip +0 -0
  420. package/src/assets/branding/generated/jant-brand-tile-512.png +0 -0
  421. package/src/assets/branding/generated/jant-brand-tile.svg +1 -0
  422. package/src/assets/branding/generated/jant-circle-tile-512.png +0 -0
  423. package/src/assets/branding/generated/jant-circle-tile.svg +1 -0
  424. package/src/assets/branding/generated/jant-favicon.ico +0 -0
  425. package/src/assets/branding/generated/jant-logo-negative.svg +1 -0
  426. package/src/assets/branding/generated/jant-logo-positive-512.png +0 -0
  427. package/src/assets/branding/generated/jant-logo-positive.svg +1 -0
  428. package/src/assets/branding/generated/jant-social-preview.png +0 -0
  429. package/src/assets/branding/generated/jant-square-tile-512.png +0 -0
  430. package/src/assets/branding/generated/jant-square-tile.svg +1 -0
  431. package/src/assets/branding/jant-logo-positive.svg +3 -0
  432. package/src/auth.ts +47 -6
  433. package/src/client/__tests__/avatar-upload.test.ts +186 -0
  434. package/src/client/__tests__/collection-form-bridge.test.ts +127 -0
  435. package/src/client/__tests__/collection-page-actions.test.ts +112 -0
  436. package/src/client/__tests__/collection-sort-menu.test.ts +78 -0
  437. package/src/client/__tests__/compose-bridge.test.ts +260 -0
  438. package/src/client/__tests__/compose-discovery.test.ts +155 -0
  439. package/src/client/__tests__/compose-shortcuts.test.ts +133 -0
  440. package/src/client/__tests__/confirm.test.ts +98 -0
  441. package/src/client/__tests__/custom-url-menu.test.ts +104 -0
  442. package/src/client/__tests__/form-enter-submit.test.ts +110 -0
  443. package/src/client/__tests__/post-form-bridge.test.ts +82 -0
  444. package/src/client/__tests__/sortable-list.test.ts +91 -0
  445. package/src/client/__tests__/toast.test.ts +46 -0
  446. package/src/client/archive-nav.js +1 -3
  447. package/src/client/avatar-upload.ts +66 -25
  448. package/src/client/collection-form-bridge.ts +32 -15
  449. package/src/client/collection-page-actions.ts +160 -0
  450. package/src/client/collection-sort-menu.ts +105 -0
  451. package/src/client/components/__tests__/jant-collection-form.test.ts +199 -51
  452. package/src/client/components/__tests__/jant-collection-sidebar.test.ts +250 -0
  453. package/src/client/components/__tests__/jant-compose-dialog.test.ts +2507 -342
  454. package/src/client/components/__tests__/jant-compose-editor.test.ts +484 -20
  455. package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +298 -0
  456. package/src/client/components/__tests__/jant-post-form.test.ts +9 -8
  457. package/src/client/components/__tests__/jant-post-menu.test.ts +325 -0
  458. package/src/client/components/__tests__/jant-settings-avatar.test.ts +27 -3
  459. package/src/client/components/__tests__/jant-settings-general.test.ts +312 -84
  460. package/src/client/components/collection-manager-types.ts +51 -0
  461. package/src/client/components/collection-types.ts +12 -10
  462. package/src/client/components/compose-types.ts +80 -13
  463. package/src/client/components/jant-collection-form.ts +338 -509
  464. package/src/client/components/jant-collection-sidebar.ts +461 -463
  465. package/src/client/components/jant-compose-dialog.ts +1566 -479
  466. package/src/client/components/jant-compose-editor.ts +531 -276
  467. package/src/client/components/jant-compose-fullscreen.ts +184 -112
  468. package/src/client/components/jant-confirm-dialog.ts +249 -0
  469. package/src/client/components/jant-nav-manager.ts +79 -103
  470. package/src/client/components/jant-post-form.ts +4 -1
  471. package/src/client/components/jant-post-menu.ts +583 -306
  472. package/src/client/components/jant-settings-avatar.ts +15 -9
  473. package/src/client/components/jant-settings-general.ts +444 -137
  474. package/src/client/components/nav-manager-types.ts +6 -3
  475. package/src/client/components/post-form-template.ts +2 -9
  476. package/src/client/components/post-form-types.ts +2 -4
  477. package/src/client/components/settings-types.ts +34 -2
  478. package/src/client/compose-bridge.ts +297 -171
  479. package/src/client/compose-discovery-bridge.ts +9 -0
  480. package/src/client/compose-discovery.ts +254 -0
  481. package/src/client/compose-launch.ts +98 -0
  482. package/src/client/compose-shortcuts.ts +61 -0
  483. package/src/client/confirm.ts +40 -0
  484. package/src/client/custom-url-menu.ts +128 -0
  485. package/src/client/form-enter-submit.ts +87 -0
  486. package/src/client/json.ts +37 -0
  487. package/src/client/multipart-upload.ts +51 -18
  488. package/src/client/post-form-bridge.ts +20 -14
  489. package/src/client/runtime-paths.ts +72 -0
  490. package/src/client/settings-bridge.ts +54 -10
  491. package/src/client/site-header-nav.js +84 -0
  492. package/src/client/sortable-list.ts +152 -0
  493. package/src/client/thread-context.ts +11 -5
  494. package/src/client/tiptap/__tests__/floating-position.test.ts +74 -0
  495. package/src/client/tiptap/__tests__/link-toolbar.test.ts +94 -0
  496. package/src/client/tiptap/__tests__/paste-media.test.ts +39 -0
  497. package/src/client/tiptap/bubble-menu.ts +98 -13
  498. package/src/client/tiptap/create-editor.ts +6 -0
  499. package/src/client/tiptap/extensions.ts +15 -4
  500. package/src/client/tiptap/floating-position.ts +167 -0
  501. package/src/client/tiptap/inline-image-upload.ts +73 -0
  502. package/src/client/tiptap/link-input-rules.ts +56 -0
  503. package/src/client/tiptap/link-toolbar.ts +60 -14
  504. package/src/client/tiptap/paste-media.ts +120 -0
  505. package/src/client/tiptap/slash-commands.ts +205 -52
  506. package/src/client/tiptap/toolbar-mode.ts +31 -0
  507. package/src/client/toast.ts +136 -16
  508. package/src/client/types/sortablejs.d.ts +4 -4
  509. package/src/client/upload-session.ts +270 -0
  510. package/src/client/upload-with-metadata.ts +10 -17
  511. package/src/client-auth.ts +38 -0
  512. package/src/client.ts +10 -29
  513. package/src/db/__tests__/d1-query.test.ts +84 -0
  514. package/src/db/__tests__/demo-canonical-snapshot.test.ts +78 -0
  515. package/src/db/__tests__/demo-env-loader.test.ts +114 -0
  516. package/src/db/__tests__/dialect.test.ts +42 -0
  517. package/src/db/__tests__/migration-artifacts.test.ts +82 -0
  518. package/src/db/__tests__/migration-rehearsal.test.ts +73 -0
  519. package/src/db/__tests__/migration-runner.test.ts +72 -0
  520. package/src/db/__tests__/migrations.test.ts +293 -8
  521. package/src/db/__tests__/r2-query.test.ts +102 -0
  522. package/src/db/__tests__/wrangler-config.test.ts +86 -0
  523. package/src/db/backfills/0000_normalize_legacy_time_zone_values.sql +38 -0
  524. package/src/db/backfills/README.md +11 -0
  525. package/src/db/dialect.ts +71 -0
  526. package/src/db/index.ts +84 -2
  527. package/src/db/migrations/0000_baseline.sql +35 -57
  528. package/src/db/migrations/0002_site_aware_core.sql +354 -0
  529. package/src/db/migrations/0003_fts_site_aware.sql +38 -0
  530. package/src/db/migrations/0004_perpetual_eternity.sql +29 -0
  531. package/src/db/migrations/meta/0000_snapshot.json +134 -138
  532. package/src/db/migrations/meta/0001_snapshot.json +135 -139
  533. package/src/db/migrations/meta/0002_snapshot.json +1717 -0
  534. package/src/db/migrations/meta/0003_snapshot.json +1717 -0
  535. package/src/db/migrations/meta/0004_snapshot.json +1897 -0
  536. package/src/db/migrations/meta/_journal.json +23 -2
  537. package/src/db/migrations/pg/0000_pg_site_aware_baseline.sql +306 -0
  538. package/src/db/migrations/pg/0001_pg_search_support.sql +8 -0
  539. package/src/db/migrations/pg/0002_breezy_lockjaw.sql +29 -0
  540. package/src/db/migrations/pg/README.md +8 -0
  541. package/src/db/migrations/pg/meta/0000_snapshot.json +2195 -0
  542. package/src/db/migrations/pg/meta/0001_snapshot.json +2248 -0
  543. package/src/db/migrations/pg/meta/0002_snapshot.json +2476 -0
  544. package/src/db/migrations/pg/meta/_journal.json +27 -0
  545. package/src/db/pg/__tests__/node.test.ts +58 -0
  546. package/src/db/pg/node.ts +151 -0
  547. package/src/db/pg/schema.ts +739 -0
  548. package/src/db/raw-query.ts +15 -0
  549. package/src/db/rehearsal-fixtures/demo-current.json +25 -0
  550. package/src/db/rehearsal-fixtures/demo-current.sql +142 -0
  551. package/src/db/schema-bundle.ts +12 -0
  552. package/src/db/schema.ts +309 -128
  553. package/src/db/sqlite/schema.ts +1 -0
  554. package/src/i18n/__tests__/context.test.tsx +35 -0
  555. package/src/i18n/context.tsx +10 -2
  556. package/src/i18n/locales/en.po +1778 -231
  557. package/src/i18n/locales/en.ts +1 -1
  558. package/src/i18n/locales/glossary.zh-Hans.yml +116 -0
  559. package/src/i18n/locales/glossary.zh-Hant.yml +116 -0
  560. package/src/i18n/locales/zh-Hans.po +1819 -272
  561. package/src/i18n/locales/zh-Hans.ts +1 -1
  562. package/src/i18n/locales/zh-Hant.po +1823 -276
  563. package/src/i18n/locales/zh-Hant.ts +1 -1
  564. package/src/index.ts +4 -0
  565. package/src/lib/__tests__/asset-path.test.ts +54 -0
  566. package/src/lib/__tests__/blurhash-placeholder.test.ts +25 -1
  567. package/src/lib/__tests__/collection-sort.test.ts +45 -0
  568. package/src/lib/__tests__/constants.test.ts +1 -0
  569. package/src/lib/__tests__/favicon.test.ts +1 -1
  570. package/src/lib/__tests__/feed.test.ts +147 -0
  571. package/src/lib/__tests__/hosted-control-plane.test.ts +106 -0
  572. package/src/lib/__tests__/hosted-domain.test.ts +78 -0
  573. package/src/lib/__tests__/hosted-signin.test.ts +103 -0
  574. package/src/lib/__tests__/icons.test.ts +14 -172
  575. package/src/lib/__tests__/image.test.ts +23 -4
  576. package/src/lib/__tests__/jant-branding.test.ts +160 -0
  577. package/src/lib/__tests__/markdown-to-tiptap.test.ts +27 -0
  578. package/src/lib/__tests__/page-title.test.ts +20 -0
  579. package/src/lib/__tests__/password.test.ts +60 -0
  580. package/src/lib/__tests__/post-display.test.ts +99 -0
  581. package/src/lib/__tests__/post-meta.test.ts +126 -0
  582. package/src/lib/__tests__/public-storage.test.ts +75 -0
  583. package/src/lib/__tests__/resolve-config.test.ts +156 -28
  584. package/src/lib/__tests__/schemas.test.ts +268 -22
  585. package/src/lib/__tests__/search-snippet.test.ts +43 -0
  586. package/src/lib/__tests__/site-resolution.test.ts +39 -0
  587. package/src/lib/__tests__/slug-format.test.ts +46 -0
  588. package/src/lib/__tests__/startup-config.test.ts +87 -0
  589. package/src/lib/__tests__/storage.test.ts +218 -1
  590. package/src/lib/__tests__/theme.test.ts +50 -13
  591. package/src/lib/__tests__/time.test.ts +44 -0
  592. package/src/lib/__tests__/timeline.test.ts +410 -4
  593. package/src/lib/__tests__/timezones.test.ts +51 -18
  594. package/src/lib/__tests__/tiptap-to-markdown.test.ts +23 -0
  595. package/src/lib/__tests__/url.test.ts +79 -1
  596. package/src/lib/__tests__/view.test.ts +74 -13
  597. package/src/lib/asset-path.ts +87 -0
  598. package/src/lib/blurhash-placeholder.ts +56 -1
  599. package/src/lib/collection-sort.ts +61 -0
  600. package/src/lib/confirm.ts +37 -0
  601. package/src/lib/constants.ts +3 -6
  602. package/src/lib/crypto.ts +47 -0
  603. package/src/lib/env.ts +245 -0
  604. package/src/lib/errors.ts +25 -9
  605. package/src/lib/favicon.ts +2 -1
  606. package/src/lib/featured-icons.ts +33 -0
  607. package/src/lib/feed.ts +73 -24
  608. package/src/lib/hosted-control-plane-sync.ts +27 -0
  609. package/src/lib/hosted-control-plane.ts +99 -0
  610. package/src/lib/hosted-domain-check.ts +98 -0
  611. package/src/lib/hosted-domain.ts +61 -0
  612. package/src/lib/hosted-signin.ts +115 -0
  613. package/src/lib/hosted-sso.ts +110 -0
  614. package/src/lib/icons.ts +10 -175
  615. package/src/lib/ids.ts +54 -0
  616. package/src/lib/image.ts +18 -7
  617. package/src/lib/jant-branding-generated.ts +947 -0
  618. package/src/lib/jant-branding.ts +520 -0
  619. package/src/lib/markdown-to-tiptap.ts +57 -0
  620. package/src/lib/media-helpers.ts +6 -2
  621. package/src/lib/navigation.ts +9 -2
  622. package/src/lib/page-title.ts +23 -0
  623. package/src/lib/pagination.ts +34 -0
  624. package/src/lib/password.ts +164 -0
  625. package/src/lib/post-display.ts +162 -0
  626. package/src/lib/post-meta.ts +95 -0
  627. package/src/lib/public-storage.ts +57 -0
  628. package/src/lib/render.tsx +22 -0
  629. package/src/lib/resolve-config.ts +78 -27
  630. package/src/lib/schemas.ts +264 -73
  631. package/src/lib/search-snippet.ts +110 -8
  632. package/src/lib/site-resolution.ts +28 -0
  633. package/src/lib/slug-format.ts +84 -0
  634. package/src/lib/slug.ts +1 -1
  635. package/src/lib/startup-config.ts +244 -0
  636. package/src/lib/storage.ts +722 -28
  637. package/src/lib/theme.ts +13 -6
  638. package/src/lib/time.ts +59 -15
  639. package/src/lib/timeline.ts +386 -62
  640. package/src/lib/timezones.ts +120 -50
  641. package/src/lib/tiptap-render.ts +1 -3
  642. package/src/lib/tiptap-to-markdown.ts +49 -0
  643. package/src/lib/upload.ts +216 -11
  644. package/src/lib/url.ts +210 -0
  645. package/src/lib/view.ts +87 -31
  646. package/src/middleware/__tests__/auth.test.ts +216 -14
  647. package/src/middleware/__tests__/error-handler.test.ts +37 -0
  648. package/src/middleware/__tests__/onboarding.test.ts +9 -0
  649. package/src/middleware/__tests__/secure-headers.test.ts +111 -0
  650. package/src/middleware/auth.ts +156 -28
  651. package/src/middleware/config.ts +29 -9
  652. package/src/middleware/error-handler.ts +16 -1
  653. package/src/middleware/onboarding.ts +15 -6
  654. package/src/middleware/secure-headers.ts +136 -25
  655. package/src/node/__tests__/cli-db-execute-file.test.ts +109 -0
  656. package/src/node/__tests__/cli-deploy.test.ts +124 -0
  657. package/src/node/__tests__/cli-export.test.ts +66 -0
  658. package/src/node/__tests__/cli-reset-password.test.ts +91 -0
  659. package/src/node/__tests__/cli-runtime-target.test.ts +37 -0
  660. package/src/node/__tests__/cli-site-selection.test.ts +133 -0
  661. package/src/node/__tests__/cli-site-snapshot.test.ts +636 -0
  662. package/src/node/__tests__/cli-site-token-env.test.ts +137 -0
  663. package/src/node/__tests__/runtime.test.ts +346 -0
  664. package/src/node/index.ts +18 -0
  665. package/src/node/request-handler.ts +668 -0
  666. package/src/node/runtime.ts +88 -0
  667. package/src/preset.css +73 -16
  668. package/src/routes/__tests__/compose.test.ts +77 -4
  669. package/src/routes/api/__tests__/attachments.test.ts +92 -0
  670. package/src/routes/api/__tests__/collections.test.ts +138 -24
  671. package/src/routes/api/__tests__/nav-items.test.ts +81 -20
  672. package/src/routes/api/__tests__/posts.test.ts +315 -57
  673. package/src/routes/api/__tests__/search.test.ts +25 -1
  674. package/src/routes/api/__tests__/settings.test.ts +380 -2
  675. package/src/routes/api/__tests__/upload-multipart.test.ts +216 -26
  676. package/src/routes/api/__tests__/uploads.test.ts +420 -0
  677. package/src/routes/api/attachments.ts +24 -0
  678. package/src/routes/api/collections.ts +59 -28
  679. package/src/routes/api/custom-urls.ts +6 -5
  680. package/src/routes/api/export.ts +37 -7
  681. package/src/routes/api/internal/__tests__/api-tokens.test.ts +55 -0
  682. package/src/routes/api/internal/__tests__/sites.test.ts +472 -0
  683. package/src/routes/api/internal/__tests__/uploads.test.ts +131 -0
  684. package/src/routes/api/internal/api-tokens.ts +17 -0
  685. package/src/routes/api/internal/sites.ts +241 -0
  686. package/src/routes/api/internal/uploads.ts +37 -0
  687. package/src/routes/api/nav-items.ts +24 -15
  688. package/src/routes/api/posts.ts +222 -74
  689. package/src/routes/api/search.ts +50 -9
  690. package/src/routes/api/settings.ts +141 -7
  691. package/src/routes/api/upload-multipart.ts +105 -16
  692. package/src/routes/api/upload.ts +90 -21
  693. package/src/routes/api/uploads.ts +247 -0
  694. package/src/routes/auth/__tests__/dev.test.ts +135 -0
  695. package/src/routes/auth/__tests__/hosted-sso.test.ts +136 -0
  696. package/src/routes/auth/__tests__/setup.test.ts +73 -49
  697. package/src/routes/auth/dev.ts +72 -0
  698. package/src/routes/auth/hosted-sso.ts +64 -0
  699. package/src/routes/auth/reset.tsx +41 -7
  700. package/src/routes/auth/setup.tsx +37 -38
  701. package/src/routes/auth/signin.tsx +36 -6
  702. package/src/routes/compose.tsx +25 -38
  703. package/src/routes/dash/__tests__/font-theme.test.ts +45 -34
  704. package/src/routes/dash/__tests__/settings-avatar.test.ts +24 -11
  705. package/src/routes/dash/custom-urls.tsx +245 -67
  706. package/src/routes/dash/settings.tsx +530 -139
  707. package/src/routes/feed/__tests__/rss.test.ts +200 -51
  708. package/src/routes/feed/__tests__/sitemap.test.ts +64 -0
  709. package/src/routes/feed/rss.ts +112 -48
  710. package/src/routes/feed/sitemap.ts +16 -6
  711. package/src/routes/hosted/__tests__/domain-check.test.ts +94 -0
  712. package/src/routes/hosted/domain-check.ts +39 -0
  713. package/src/routes/pages/__tests__/collections.test.ts +27 -21
  714. package/src/routes/pages/__tests__/featured.test.ts +9 -2
  715. package/src/routes/pages/archive.tsx +79 -33
  716. package/src/routes/pages/brand.tsx +119 -0
  717. package/src/routes/pages/collection.tsx +143 -59
  718. package/src/routes/pages/collections.tsx +46 -20
  719. package/src/routes/pages/featured.tsx +31 -39
  720. package/src/routes/pages/home.tsx +50 -25
  721. package/src/routes/pages/latest.tsx +20 -4
  722. package/src/routes/pages/new.tsx +10 -6
  723. package/src/routes/pages/page.tsx +27 -53
  724. package/src/routes/pages/partials.tsx +83 -0
  725. package/src/routes/pages/search.tsx +11 -9
  726. package/src/routes/pages/theme-sample.tsx +98 -0
  727. package/src/runtime/__tests__/node.test.ts +258 -0
  728. package/src/runtime/cloudflare.ts +102 -0
  729. package/src/runtime/index.ts +14 -0
  730. package/src/runtime/node.ts +187 -0
  731. package/src/runtime/site.ts +169 -0
  732. package/src/services/__tests__/api-token.test.ts +5 -2
  733. package/src/services/__tests__/auth.test.ts +348 -0
  734. package/src/services/__tests__/collection.test.ts +154 -16
  735. package/src/services/__tests__/custom-url.test.ts +10 -3
  736. package/src/services/__tests__/hosted-handoff.test.ts +123 -0
  737. package/src/services/__tests__/media.test.ts +256 -33
  738. package/src/services/__tests__/navigation.test.ts +89 -4
  739. package/src/services/__tests__/post-timeline.test.ts +111 -2
  740. package/src/services/__tests__/post.test.ts +463 -38
  741. package/src/services/__tests__/search.test.ts +145 -14
  742. package/src/services/__tests__/settings.test.ts +162 -2
  743. package/src/services/__tests__/site-admin.test.ts +48 -0
  744. package/src/services/__tests__/site-profile.test.ts +175 -0
  745. package/src/services/api-token.ts +44 -11
  746. package/src/services/auth.ts +211 -9
  747. package/src/services/bootstrap.ts +68 -0
  748. package/src/services/collection.ts +501 -100
  749. package/src/services/custom-url.ts +42 -12
  750. package/src/services/export.ts +2269 -320
  751. package/src/services/hosted-handoff.ts +184 -0
  752. package/src/services/index.ts +110 -12
  753. package/src/services/media.ts +309 -39
  754. package/src/services/navigation.ts +141 -20
  755. package/src/services/path.ts +45 -9
  756. package/src/services/post.ts +1529 -246
  757. package/src/services/search.ts +222 -29
  758. package/src/services/settings.ts +202 -48
  759. package/src/services/site-admin.ts +825 -0
  760. package/src/services/site-member.ts +74 -0
  761. package/src/services/site-profile.ts +52 -0
  762. package/src/services/site.ts +250 -0
  763. package/src/services/upload-session.ts +707 -0
  764. package/src/style-cjk-tc.css +3 -0
  765. package/src/style-cjk.css +3 -0
  766. package/src/styles/components.css +647 -16
  767. package/src/styles/fonts/latin.css +4 -0
  768. package/src/styles/fonts/noto-serif-sc/400/02629e5d0a9860b7fe32ec1f0563213a.woff2 +0 -0
  769. package/src/styles/fonts/noto-serif-sc/400/031089da45fbfb7dc18ac827bef4c56e.woff2 +0 -0
  770. package/src/styles/fonts/noto-serif-sc/400/03ac785139320b7b13bac9c150bf72bf.woff2 +0 -0
  771. package/src/styles/fonts/noto-serif-sc/400/0b1f83a3c7e715560a55ad9eb0fb1c94.woff2 +0 -0
  772. package/src/styles/fonts/noto-serif-sc/400/14b040a2dda256936bc7b3470e548394.woff2 +0 -0
  773. package/src/styles/fonts/noto-serif-sc/400/189f272ea2600c74d576b7b15c014922.woff2 +0 -0
  774. package/src/styles/fonts/noto-serif-sc/400/1fbccc182322b513f57cd156a9a491b0.woff2 +0 -0
  775. package/src/styles/fonts/noto-serif-sc/400/21e0a71d86be7b8a9e812e7af09dd061.woff2 +0 -0
  776. package/src/styles/fonts/noto-serif-sc/400/265e048cc9f2f8a711ba585a534d5351.woff2 +0 -0
  777. package/src/styles/fonts/noto-serif-sc/400/2ae2ca951489c9d50cde5b36a2a5515b.woff2 +0 -0
  778. package/src/styles/fonts/noto-serif-sc/400/2ba802b14f21a58fc61606c88fa93373.woff2 +0 -0
  779. package/src/styles/fonts/noto-serif-sc/400/2deb444546774c3a3ab38c75eb69cdfb.woff2 +0 -0
  780. package/src/styles/fonts/noto-serif-sc/400/2fbccf9a3853eb59db1a825e044515fd.woff2 +0 -0
  781. package/src/styles/fonts/noto-serif-sc/400/2ff009fa8701505d7f3dc6c83763f019.woff2 +0 -0
  782. package/src/styles/fonts/noto-serif-sc/400/31424fe5d54692e7c8b38021ccb8597c.woff2 +0 -0
  783. package/src/styles/fonts/noto-serif-sc/400/360c190344c26278bbc50e2f4d6a2b3f.woff2 +0 -0
  784. package/src/styles/fonts/noto-serif-sc/400/39b0bbc910af9d2d6dcd8bd4abd6387d.woff2 +0 -0
  785. package/src/styles/fonts/noto-serif-sc/400/3adc8f6350cf5067bcb6dc5e44c45d41.woff2 +0 -0
  786. package/src/styles/fonts/noto-serif-sc/400/3bed5bd57de8f738e53cddaea88983d9.woff2 +0 -0
  787. package/src/styles/fonts/noto-serif-sc/400/3c201fd8d1bb20abe7d06b940e83a4d9.woff2 +0 -0
  788. package/src/styles/fonts/noto-serif-sc/400/3d385ea0880df7204258e290648ec012.woff2 +0 -0
  789. package/src/styles/fonts/noto-serif-sc/400/3dc1a4f0d7af59e16b5162a2b077a442.woff2 +0 -0
  790. package/src/styles/fonts/noto-serif-sc/400/3dc68e473fe23bd076dd46785cd23583.woff2 +0 -0
  791. package/src/styles/fonts/noto-serif-sc/400/435b7dca567809813fcb395a27ed83a0.woff2 +0 -0
  792. package/src/styles/fonts/noto-serif-sc/400/43693195e775d515689fa035394067fd.woff2 +0 -0
  793. package/src/styles/fonts/noto-serif-sc/400/43fb49e5b79ee7e553869d84e6e08b1e.woff2 +0 -0
  794. package/src/styles/fonts/noto-serif-sc/400/44dcbbc3cc8f22e613b342d691511ab6.woff2 +0 -0
  795. package/src/styles/fonts/noto-serif-sc/400/474fac21b12b7efd71f7c321578878b0.woff2 +0 -0
  796. package/src/styles/fonts/noto-serif-sc/400/4a23fe6e82fd496b5eb20401b6164efe.woff2 +0 -0
  797. package/src/styles/fonts/noto-serif-sc/400/4bc743968cf1c3ce5711de67ef1ccc4d.woff2 +0 -0
  798. package/src/styles/fonts/noto-serif-sc/400/4cf0f292f3358bd2f73b1cf4ec1476f3.woff2 +0 -0
  799. package/src/styles/fonts/noto-serif-sc/400/501f66f24bce8234441954de1b568403.woff2 +0 -0
  800. package/src/styles/fonts/noto-serif-sc/400/53a88404451448cd2e620a0ca0e45a20.woff2 +0 -0
  801. package/src/styles/fonts/noto-serif-sc/400/557cd00c5d6827e13d72a0c71b23587b.woff2 +0 -0
  802. package/src/styles/fonts/noto-serif-sc/400/563fa31542d553f25abab65cf7f81e1d.woff2 +0 -0
  803. package/src/styles/fonts/noto-serif-sc/400/56e1c4734bbbb38af2fbc262bf6e98f2.woff2 +0 -0
  804. package/src/styles/fonts/noto-serif-sc/400/5947f5da5da9a352a2b534ee64bfc29a.woff2 +0 -0
  805. package/src/styles/fonts/noto-serif-sc/400/5a10741e41259e235841440394c0763d.woff2 +0 -0
  806. package/src/styles/fonts/noto-serif-sc/400/60d8b0805a0a8c54a6cca216004beff5.woff2 +0 -0
  807. package/src/styles/fonts/noto-serif-sc/400/61bf4287453da4025d03fa6b2dba66ca.woff2 +0 -0
  808. package/src/styles/fonts/noto-serif-sc/400/638369541268ed5a10af97ad77498c73.woff2 +0 -0
  809. package/src/styles/fonts/noto-serif-sc/400/687d0f0f90a9b23e40102e16ad8e9836.woff2 +0 -0
  810. package/src/styles/fonts/noto-serif-sc/400/6e2164fad867d166de2e5b274f04a563.woff2 +0 -0
  811. package/src/styles/fonts/noto-serif-sc/400/6eefc9d430171c1e1e4034ecadee31c8.woff2 +0 -0
  812. package/src/styles/fonts/noto-serif-sc/400/71eafb8fbe3a734283517e230ad8b6db.woff2 +0 -0
  813. package/src/styles/fonts/noto-serif-sc/400/751f54dbb115140d5b645a6ba4aff5d3.woff2 +0 -0
  814. package/src/styles/fonts/noto-serif-sc/400/7609e7e74dd4d916a7abc7ecc7d95f7e.woff2 +0 -0
  815. package/src/styles/fonts/noto-serif-sc/400/76b9d6fe838ae4151d95ce7200aa2bf6.woff2 +0 -0
  816. package/src/styles/fonts/noto-serif-sc/400/78ce29fed872e44fc9014d94875d2aac.woff2 +0 -0
  817. package/src/styles/fonts/noto-serif-sc/400/79a85a253e9b3f12d2e2cb15e16b3003.woff2 +0 -0
  818. package/src/styles/fonts/noto-serif-sc/400/7caa14a095a6bc313aab780fe4ff7999.woff2 +0 -0
  819. package/src/styles/fonts/noto-serif-sc/400/7d138084cf03c14116b11297fce0e3e3.woff2 +0 -0
  820. package/src/styles/fonts/noto-serif-sc/400/880162ae92cd9e120eb4e4e11fae459d.woff2 +0 -0
  821. package/src/styles/fonts/noto-serif-sc/400/8f2b960c2823670e94f5b08aa65657e6.woff2 +0 -0
  822. package/src/styles/fonts/noto-serif-sc/400/8f89f57230d184f92a36e241874229d7.woff2 +0 -0
  823. package/src/styles/fonts/noto-serif-sc/400/9180de34b48b325200a97e267befff32.woff2 +0 -0
  824. package/src/styles/fonts/noto-serif-sc/400/95df3b9f681d9df411c30aea5b24f2e0.woff2 +0 -0
  825. package/src/styles/fonts/noto-serif-sc/400/975af5a496e8d87d821910aa9fe4d598.woff2 +0 -0
  826. package/src/styles/fonts/noto-serif-sc/400/97a874bbf55ce89a4ab7cd27c7e938b1.woff2 +0 -0
  827. package/src/styles/fonts/noto-serif-sc/400/9fd53607094e329fa8e5c785b3ff0f1a.woff2 +0 -0
  828. package/src/styles/fonts/noto-serif-sc/400/a578742770fcd2226e3c45b5b6efdcb0.woff2 +0 -0
  829. package/src/styles/fonts/noto-serif-sc/400/ae401fb4db80d5ff5cd3f8d9bc811070.woff2 +0 -0
  830. package/src/styles/fonts/noto-serif-sc/400/b0ab3a7f319ce6dd3c9a4de2674e7c72.woff2 +0 -0
  831. package/src/styles/fonts/noto-serif-sc/400/b159deb135e9946eea0572d52778170b.woff2 +0 -0
  832. package/src/styles/fonts/noto-serif-sc/400/b91450304d9ac44f5c6e0da0792e055d.woff2 +0 -0
  833. package/src/styles/fonts/noto-serif-sc/400/baa325551b381c5e035ef143e56d4abe.woff2 +0 -0
  834. package/src/styles/fonts/noto-serif-sc/400/c0c7836749e585cee24ab2f8457c5b01.woff2 +0 -0
  835. package/src/styles/fonts/noto-serif-sc/400/c2ac4ef1860812036ca2b8c4e4089bdc.woff2 +0 -0
  836. package/src/styles/fonts/noto-serif-sc/400/c31019c08bd22464f7a88f090281404c.woff2 +0 -0
  837. package/src/styles/fonts/noto-serif-sc/400/c57ee3b49b7e45b995539a6b2c51f138.woff2 +0 -0
  838. package/src/styles/fonts/noto-serif-sc/400/cd75ca47da9ae4c0899e37d4c543319b.woff2 +0 -0
  839. package/src/styles/fonts/noto-serif-sc/400/d12ce1d8445213317f9163283e58a05d.woff2 +0 -0
  840. package/src/styles/fonts/noto-serif-sc/400/d28fb13acf9ced9f0657fd4012c81cd2.woff2 +0 -0
  841. package/src/styles/fonts/noto-serif-sc/400/d3714e6b90de8e2085dfb2514464dd6a.woff2 +0 -0
  842. package/src/styles/fonts/noto-serif-sc/400/d3beff96216c8af1aa79246476b6a323.woff2 +0 -0
  843. package/src/styles/fonts/noto-serif-sc/400/d3e311f30c811dc339c262a79a51877e.woff2 +0 -0
  844. package/src/styles/fonts/noto-serif-sc/400/d51f4cdc83711e510f5d25f03235597e.woff2 +0 -0
  845. package/src/styles/fonts/noto-serif-sc/400/d5df4a8dfd4328c67d933b3912c6ad0f.woff2 +0 -0
  846. package/src/styles/fonts/noto-serif-sc/400/dccda6a2e2db3b530788bdfa2acd1979.woff2 +0 -0
  847. package/src/styles/fonts/noto-serif-sc/400/f5237486197aeff59341a1ff38b8eff8.woff2 +0 -0
  848. package/src/styles/fonts/noto-serif-sc/400/f553d54ef931066712d8f3f0ce018e1b.woff2 +0 -0
  849. package/src/styles/fonts/noto-serif-sc/400/f649cba8e14c33d6bf2265483b14b895.woff2 +0 -0
  850. package/src/styles/fonts/noto-serif-sc/400/f6839df1bf7cb4dc8d27e5ea55bbe633.woff2 +0 -0
  851. package/src/styles/fonts/noto-serif-sc/400/f6b7304e028980f77a7f7007bb540abd.woff2 +0 -0
  852. package/src/styles/fonts/noto-serif-sc/400/f8db8bef0a6e1178835d350ae0d384a1.woff2 +0 -0
  853. package/src/styles/fonts/noto-serif-sc/400/fb4649a82c50620773d79820e2e5ff13.woff2 +0 -0
  854. package/src/styles/fonts/noto-serif-sc/400/fb9402d6c6357a825affc402f14d5a7e.woff2 +0 -0
  855. package/src/styles/fonts/noto-serif-sc/700/0041f681602cc834bb5c55ced0155b8e.woff2 +0 -0
  856. package/src/styles/fonts/noto-serif-sc/700/00c9ac960d866ffaf8a866e5939024e2.woff2 +0 -0
  857. package/src/styles/fonts/noto-serif-sc/700/02e48e353415a00e0f556608cab33a43.woff2 +0 -0
  858. package/src/styles/fonts/noto-serif-sc/700/02faf6bb0ab4d56ada037c0bbaf9b9f7.woff2 +0 -0
  859. package/src/styles/fonts/noto-serif-sc/700/057a3d44d7fc606f113d863376d0ecf0.woff2 +0 -0
  860. package/src/styles/fonts/noto-serif-sc/700/10f2b44b3711d3f5bdcc30d373b543d1.woff2 +0 -0
  861. package/src/styles/fonts/noto-serif-sc/700/14c1506106d92621bafb11016735194e.woff2 +0 -0
  862. package/src/styles/fonts/noto-serif-sc/700/154a2c266902003bd8b7449386b10776.woff2 +0 -0
  863. package/src/styles/fonts/noto-serif-sc/700/19e39850472250bfdbce654d30859879.woff2 +0 -0
  864. package/src/styles/fonts/noto-serif-sc/700/1b5d0d740450fb996749464c9b882025.woff2 +0 -0
  865. package/src/styles/fonts/noto-serif-sc/700/1bca0a2a8840ad0ee9414940593db144.woff2 +0 -0
  866. package/src/styles/fonts/noto-serif-sc/700/1cda27dcaab977ae4ef5d5ab2a10ae03.woff2 +0 -0
  867. package/src/styles/fonts/noto-serif-sc/700/1f4bc38a1c50f55f335f5411cae47696.woff2 +0 -0
  868. package/src/styles/fonts/noto-serif-sc/700/2022cf097cb952d9fe75b53b4587d2c3.woff2 +0 -0
  869. package/src/styles/fonts/noto-serif-sc/700/2240a3c43ca5ef59ae3c348c7884792f.woff2 +0 -0
  870. package/src/styles/fonts/noto-serif-sc/700/280e3d2b58e9ad3501816072e01b0c13.woff2 +0 -0
  871. package/src/styles/fonts/noto-serif-sc/700/2874d07e228da9583b0e73646dacd498.woff2 +0 -0
  872. package/src/styles/fonts/noto-serif-sc/700/29d49891713a2785a3a383001cf58c59.woff2 +0 -0
  873. package/src/styles/fonts/noto-serif-sc/700/2d81eb6ab0ebbc0cabfb3a3341ba8800.woff2 +0 -0
  874. package/src/styles/fonts/noto-serif-sc/700/3179006d1c7ebfa50d27482a2859d9a0.woff2 +0 -0
  875. package/src/styles/fonts/noto-serif-sc/700/34c2edb3c37f71258f5c4a31091f0c6c.woff2 +0 -0
  876. package/src/styles/fonts/noto-serif-sc/700/389a950f2a1211946d294716e679e381.woff2 +0 -0
  877. package/src/styles/fonts/noto-serif-sc/700/42a74b6a625bbf0a9616ed4db3152c88.woff2 +0 -0
  878. package/src/styles/fonts/noto-serif-sc/700/457485e72835364662dfead6281638c1.woff2 +0 -0
  879. package/src/styles/fonts/noto-serif-sc/700/488846410760fe128dae939836ca5423.woff2 +0 -0
  880. package/src/styles/fonts/noto-serif-sc/700/48eb0a91e50c7f026e248c64145e72af.woff2 +0 -0
  881. package/src/styles/fonts/noto-serif-sc/700/4b0e79ba18b2ce424fa93e84996d7cba.woff2 +0 -0
  882. package/src/styles/fonts/noto-serif-sc/700/54e301f412730f391225db59dae1c8d5.woff2 +0 -0
  883. package/src/styles/fonts/noto-serif-sc/700/597d69d0710e0178b162afb0a0c20401.woff2 +0 -0
  884. package/src/styles/fonts/noto-serif-sc/700/5cc23a76e122d0ad2f7cede41bc35b27.woff2 +0 -0
  885. package/src/styles/fonts/noto-serif-sc/700/5d48855bed5f3554eff91b573d7376ac.woff2 +0 -0
  886. package/src/styles/fonts/noto-serif-sc/700/5ddcbe564b29ef08632e1aeb33455435.woff2 +0 -0
  887. package/src/styles/fonts/noto-serif-sc/700/605667a998e91e2b6a4a3cd7c31fe5a9.woff2 +0 -0
  888. package/src/styles/fonts/noto-serif-sc/700/67f32ceea9e78e5109f87724ad886010.woff2 +0 -0
  889. package/src/styles/fonts/noto-serif-sc/700/68f2fab82ec8e9291f08c3145111549c.woff2 +0 -0
  890. package/src/styles/fonts/noto-serif-sc/700/69519ada3f3f74ca20aacb8af48ab6b4.woff2 +0 -0
  891. package/src/styles/fonts/noto-serif-sc/700/6a6e884fb2b65ec5b4a3d5ecd0d01a6a.woff2 +0 -0
  892. package/src/styles/fonts/noto-serif-sc/700/6e1a8b45b01939088c3a8cfcf8c10681.woff2 +0 -0
  893. package/src/styles/fonts/noto-serif-sc/700/70adaf50c56d5ff859c64d35e0f1e34e.woff2 +0 -0
  894. package/src/styles/fonts/noto-serif-sc/700/72ee453ac0e19bd2c631c8921c44e3de.woff2 +0 -0
  895. package/src/styles/fonts/noto-serif-sc/700/753b5f6fb254bacb6618ace25af3df60.woff2 +0 -0
  896. package/src/styles/fonts/noto-serif-sc/700/76d4244186d118eea245d1385a4de2ec.woff2 +0 -0
  897. package/src/styles/fonts/noto-serif-sc/700/7a86b155111ba20f3e87306ff6beac77.woff2 +0 -0
  898. package/src/styles/fonts/noto-serif-sc/700/7b1e76975b0984e6f83e3f9f8069e784.woff2 +0 -0
  899. package/src/styles/fonts/noto-serif-sc/700/7b6c60131822a0e4d36d980d52509d4e.woff2 +0 -0
  900. package/src/styles/fonts/noto-serif-sc/700/7cbda564cb2dd4799ab9e89d51286aa7.woff2 +0 -0
  901. package/src/styles/fonts/noto-serif-sc/700/7f60eefa15956d6f06dd92404887d58c.woff2 +0 -0
  902. package/src/styles/fonts/noto-serif-sc/700/7f8c15e0ecb102738981d9fa4cb6b921.woff2 +0 -0
  903. package/src/styles/fonts/noto-serif-sc/700/812b5a4b87f3a7b4afc1cfebc864f413.woff2 +0 -0
  904. package/src/styles/fonts/noto-serif-sc/700/812dfb7f8144d01b3cc9d5ce0b472f40.woff2 +0 -0
  905. package/src/styles/fonts/noto-serif-sc/700/84742b1ede4f0bb6d27131298eba21b4.woff2 +0 -0
  906. package/src/styles/fonts/noto-serif-sc/700/8555f0285e3d28e95e2fc0ccccd9caff.woff2 +0 -0
  907. package/src/styles/fonts/noto-serif-sc/700/8e04e64c8f68d292a18d4160fbde8671.woff2 +0 -0
  908. package/src/styles/fonts/noto-serif-sc/700/958efb9b2fa2ea0008ffef009885f9f8.woff2 +0 -0
  909. package/src/styles/fonts/noto-serif-sc/700/9ca9b71010a5faeee7047ef97aeee13b.woff2 +0 -0
  910. package/src/styles/fonts/noto-serif-sc/700/9cd0b77920b9d6c64eb686493123fc76.woff2 +0 -0
  911. package/src/styles/fonts/noto-serif-sc/700/9ebd27835ffcbd794e67151ab046ce68.woff2 +0 -0
  912. package/src/styles/fonts/noto-serif-sc/700/a077f51cfb5cffb4ff4d8e229c0e9e79.woff2 +0 -0
  913. package/src/styles/fonts/noto-serif-sc/700/a397997b579d3945c9c70a979c17a8ad.woff2 +0 -0
  914. package/src/styles/fonts/noto-serif-sc/700/a68d9d5027803832bb28e78cdcd04949.woff2 +0 -0
  915. package/src/styles/fonts/noto-serif-sc/700/a904b05966368bcf90b632c7c2e5f76b.woff2 +0 -0
  916. package/src/styles/fonts/noto-serif-sc/700/aa218a2c45f3749537ce876201e5152b.woff2 +0 -0
  917. package/src/styles/fonts/noto-serif-sc/700/aa28db16818f9eaa8c817f289e1c3270.woff2 +0 -0
  918. package/src/styles/fonts/noto-serif-sc/700/aa96d698491c2540e2dcf7009c65c456.woff2 +0 -0
  919. package/src/styles/fonts/noto-serif-sc/700/ae25c41034ddc1a9e0b41f5034c9aa4b.woff2 +0 -0
  920. package/src/styles/fonts/noto-serif-sc/700/ae289ae3f8cdb54a3a6c07174517afec.woff2 +0 -0
  921. package/src/styles/fonts/noto-serif-sc/700/b02dfa2aa52cbdb1b2f11a9f44335469.woff2 +0 -0
  922. package/src/styles/fonts/noto-serif-sc/700/b2e326f7f9b807451bf9c745df747efe.woff2 +0 -0
  923. package/src/styles/fonts/noto-serif-sc/700/c33c59feccf391f0c5f1f5d24e36d1fe.woff2 +0 -0
  924. package/src/styles/fonts/noto-serif-sc/700/c82fd9456d7465b5e5bd3659e9b14c55.woff2 +0 -0
  925. package/src/styles/fonts/noto-serif-sc/700/c90b7b65d2b9696fbf3a506738f94d68.woff2 +0 -0
  926. package/src/styles/fonts/noto-serif-sc/700/cba6ad3981cb7861428d4be169ee8124.woff2 +0 -0
  927. package/src/styles/fonts/noto-serif-sc/700/cc26525aa2af1f0b929af32ce50a7fba.woff2 +0 -0
  928. package/src/styles/fonts/noto-serif-sc/700/cd0e7b51eddb22a77a09b025c0281434.woff2 +0 -0
  929. package/src/styles/fonts/noto-serif-sc/700/cd6d074f3957d58bac58437fc97e5e33.woff2 +0 -0
  930. package/src/styles/fonts/noto-serif-sc/700/cef249b6d013fb0cc0d574176bc23811.woff2 +0 -0
  931. package/src/styles/fonts/noto-serif-sc/700/d0bd387fda28e58d3c9b3efa2468dd8a.woff2 +0 -0
  932. package/src/styles/fonts/noto-serif-sc/700/da93ae099ff3b7aae27b3f674d3fc721.woff2 +0 -0
  933. package/src/styles/fonts/noto-serif-sc/700/e264213b9e102dabc603adb6e4fda5e6.woff2 +0 -0
  934. package/src/styles/fonts/noto-serif-sc/700/e7c7ef3669ae48c0a736f06ca471e1d7.woff2 +0 -0
  935. package/src/styles/fonts/noto-serif-sc/700/e81a742cacef744130c40de1b90837d8.woff2 +0 -0
  936. package/src/styles/fonts/noto-serif-sc/700/e8b755172122d1d0a5dd453e96b0ff24.woff2 +0 -0
  937. package/src/styles/fonts/noto-serif-sc/700/e99280299c305402eaa5271a3e36c49b.woff2 +0 -0
  938. package/src/styles/fonts/noto-serif-sc/700/e9c66b085052ece66bfadf45f711d3e1.woff2 +0 -0
  939. package/src/styles/fonts/noto-serif-sc/700/ed7c6dafaa6d8bcf015ef0ca574837df.woff2 +0 -0
  940. package/src/styles/fonts/noto-serif-sc/700/f2900a1d30c3a33129f4e2225669bd0e.woff2 +0 -0
  941. package/src/styles/fonts/noto-serif-sc/700/fa7d3b99744d7f2dc9e00864a97a62d6.woff2 +0 -0
  942. package/src/styles/fonts/noto-serif-sc/700/fb0e90665980954719c2eb685b130bc0.woff2 +0 -0
  943. package/src/styles/fonts/noto-serif-sc/noto-serif-sc.css +3615 -0
  944. package/src/styles/fonts/noto-serif-tc/400/008ea9091e332c639ceb18874eacd60c.woff2 +0 -0
  945. package/src/styles/fonts/noto-serif-tc/400/053bd3d7aec0040d0cc50c261a1f4e3e.woff2 +0 -0
  946. package/src/styles/fonts/noto-serif-tc/400/0713613227cc4c686c45a279f8bdc166.woff2 +0 -0
  947. package/src/styles/fonts/noto-serif-tc/400/0e97f44ebc65384c346fe19bcc52fa20.woff2 +0 -0
  948. package/src/styles/fonts/noto-serif-tc/400/1139d32ae2bdeb26c0c8f31330aa9a9f.woff2 +0 -0
  949. package/src/styles/fonts/noto-serif-tc/400/15f8c0df47fd639d1b0d9bd5cf507c9b.woff2 +0 -0
  950. package/src/styles/fonts/noto-serif-tc/400/1668bd859ffe15bed7d5563117d8d5fb.woff2 +0 -0
  951. package/src/styles/fonts/noto-serif-tc/400/190e3f8632494e7c095117f26b1c811e.woff2 +0 -0
  952. package/src/styles/fonts/noto-serif-tc/400/19ad151c22ce1befe0a9ea643fbee570.woff2 +0 -0
  953. package/src/styles/fonts/noto-serif-tc/400/1c820b5295868008ca7c78afa5b7655d.woff2 +0 -0
  954. package/src/styles/fonts/noto-serif-tc/400/1fbe225742c69f4ba9ea5f74922f0ca1.woff2 +0 -0
  955. package/src/styles/fonts/noto-serif-tc/400/2a7cedfcd6e4c7cec36f4fd7b0f329c2.woff2 +0 -0
  956. package/src/styles/fonts/noto-serif-tc/400/2acea04a920f6af31e7db97052f563c6.woff2 +0 -0
  957. package/src/styles/fonts/noto-serif-tc/400/2e98b666924b8e0a09d1aeeefd24bdd2.woff2 +0 -0
  958. package/src/styles/fonts/noto-serif-tc/400/2fd3fceb6faed5e3db768e88d7614dca.woff2 +0 -0
  959. package/src/styles/fonts/noto-serif-tc/400/35cf5dd04315e0b906e1a413d7905a2f.woff2 +0 -0
  960. package/src/styles/fonts/noto-serif-tc/400/387c811226f303af62f1e21aae6f5c83.woff2 +0 -0
  961. package/src/styles/fonts/noto-serif-tc/400/3b41385fc27419c19822060daa0b5cb3.woff2 +0 -0
  962. package/src/styles/fonts/noto-serif-tc/400/3cbe4a697fd595ef42c899de7d3e5445.woff2 +0 -0
  963. package/src/styles/fonts/noto-serif-tc/400/3d83dacbbec3d8532ae9afede21f3aab.woff2 +0 -0
  964. package/src/styles/fonts/noto-serif-tc/400/47479c470fae70f10b7c964a7ecbf274.woff2 +0 -0
  965. package/src/styles/fonts/noto-serif-tc/400/4dc0728df0f2ba70796f45f05654c7ba.woff2 +0 -0
  966. package/src/styles/fonts/noto-serif-tc/400/4dc2bc2c55b47f57d13b63aa6b1c8bd4.woff2 +0 -0
  967. package/src/styles/fonts/noto-serif-tc/400/4e1cc6aafb411b572c8d3511e925ecf1.woff2 +0 -0
  968. package/src/styles/fonts/noto-serif-tc/400/5227dbe9933760a48baff21ebd13fc98.woff2 +0 -0
  969. package/src/styles/fonts/noto-serif-tc/400/526b263e72c189f4b065738aaa6d423a.woff2 +0 -0
  970. package/src/styles/fonts/noto-serif-tc/400/54da934819a917f561b439bfd10f88b6.woff2 +0 -0
  971. package/src/styles/fonts/noto-serif-tc/400/5bfc7a121c35ae42623ef804fb525e0e.woff2 +0 -0
  972. package/src/styles/fonts/noto-serif-tc/400/5f90024544c2907c6c0203c6210c50be.woff2 +0 -0
  973. package/src/styles/fonts/noto-serif-tc/400/649b12d7cee7bb981842946e4547e6ca.woff2 +0 -0
  974. package/src/styles/fonts/noto-serif-tc/400/653bef2ed891ae48d8ed712283080649.woff2 +0 -0
  975. package/src/styles/fonts/noto-serif-tc/400/67d2a81f06ba352f17fbdc3a5e6ea59e.woff2 +0 -0
  976. package/src/styles/fonts/noto-serif-tc/400/68304f3229cf763465f044fccb5892c0.woff2 +0 -0
  977. package/src/styles/fonts/noto-serif-tc/400/688a88911e4da17b609196a959b8b930.woff2 +0 -0
  978. package/src/styles/fonts/noto-serif-tc/400/6db6ddf72c38a78ce44c1327701152e1.woff2 +0 -0
  979. package/src/styles/fonts/noto-serif-tc/400/77a7533bd21ccd33192d142a93555aa8.woff2 +0 -0
  980. package/src/styles/fonts/noto-serif-tc/400/7d65a3d6a65050eb5e6eca43398aeba4.woff2 +0 -0
  981. package/src/styles/fonts/noto-serif-tc/400/7dfc711962c8771f97e7c8898a6bcb65.woff2 +0 -0
  982. package/src/styles/fonts/noto-serif-tc/400/7ef123b62d530fcba73974fa265e0aae.woff2 +0 -0
  983. package/src/styles/fonts/noto-serif-tc/400/80466082a896fd328f30a78593c7c568.woff2 +0 -0
  984. package/src/styles/fonts/noto-serif-tc/400/8a3c84b0df36f851f5fea75ee8757951.woff2 +0 -0
  985. package/src/styles/fonts/noto-serif-tc/400/8b0c8c9f8cfa9fa090d97c5a5efb1f4c.woff2 +0 -0
  986. package/src/styles/fonts/noto-serif-tc/400/8dc035a34c76e6515ca203e2df182588.woff2 +0 -0
  987. package/src/styles/fonts/noto-serif-tc/400/8eb06109812cb80be44f47b8179c2709.woff2 +0 -0
  988. package/src/styles/fonts/noto-serif-tc/400/904324af375d5fd370af1054355a050e.woff2 +0 -0
  989. package/src/styles/fonts/noto-serif-tc/400/911a2092d64d6d6494b254d819af2b91.woff2 +0 -0
  990. package/src/styles/fonts/noto-serif-tc/400/9de02d745b8e25c6411fb152fb067748.woff2 +0 -0
  991. package/src/styles/fonts/noto-serif-tc/400/9eb33a430058d839ebbe2af4b2e0daa9.woff2 +0 -0
  992. package/src/styles/fonts/noto-serif-tc/400/9f5a73aa8ba417688019d628f334db07.woff2 +0 -0
  993. package/src/styles/fonts/noto-serif-tc/400/a0f0c06d5c7a3ffa97706178cce212a8.woff2 +0 -0
  994. package/src/styles/fonts/noto-serif-tc/400/a38c1830367f784181b6f544b0b11bbd.woff2 +0 -0
  995. package/src/styles/fonts/noto-serif-tc/400/a9cf85e27428c14351d30eac8cbc8d91.woff2 +0 -0
  996. package/src/styles/fonts/noto-serif-tc/400/aa0ce6740f301351761a0615cc8b2e99.woff2 +0 -0
  997. package/src/styles/fonts/noto-serif-tc/400/bc3f0cb8b55ee11d32b94ca488976f8d.woff2 +0 -0
  998. package/src/styles/fonts/noto-serif-tc/400/bcb3307527d6d0033bf0f17660b91e71.woff2 +0 -0
  999. package/src/styles/fonts/noto-serif-tc/400/bf1acc86e17b4229c548828a9d6f455d.woff2 +0 -0
  1000. package/src/styles/fonts/noto-serif-tc/400/c3fbc1f2557c343863a10698f8c966a2.woff2 +0 -0
  1001. package/src/styles/fonts/noto-serif-tc/400/c5c1c0be944ea39a3f50a02d32f5b759.woff2 +0 -0
  1002. package/src/styles/fonts/noto-serif-tc/400/c5f1075caf6d1344ee720de85114a521.woff2 +0 -0
  1003. package/src/styles/fonts/noto-serif-tc/400/cae29b3f8951eaf20d2f61c2206e28d9.woff2 +0 -0
  1004. package/src/styles/fonts/noto-serif-tc/400/d043b8d7a48bb0ac59ee1f1477d88eee.woff2 +0 -0
  1005. package/src/styles/fonts/noto-serif-tc/400/d320b000b5978c7251148a6a154741b8.woff2 +0 -0
  1006. package/src/styles/fonts/noto-serif-tc/400/da13b136efb1d1e4c76575af8f79a698.woff2 +0 -0
  1007. package/src/styles/fonts/noto-serif-tc/400/da2cf0ec56bf69374ee37764c7e3ea3d.woff2 +0 -0
  1008. package/src/styles/fonts/noto-serif-tc/400/daf62255dd60679946f28c442ca62533.woff2 +0 -0
  1009. package/src/styles/fonts/noto-serif-tc/400/dd01a1035345f6921a48525b8ce08f06.woff2 +0 -0
  1010. package/src/styles/fonts/noto-serif-tc/400/e4fb59479cedc87ba79785590bf861ca.woff2 +0 -0
  1011. package/src/styles/fonts/noto-serif-tc/400/e5d00355f73293d40b61299459d17ca5.woff2 +0 -0
  1012. package/src/styles/fonts/noto-serif-tc/400/e647b8d2efc501c0cc0e407249cc7135.woff2 +0 -0
  1013. package/src/styles/fonts/noto-serif-tc/400/e6e60ffb2ebd1828628764b507060aea.woff2 +0 -0
  1014. package/src/styles/fonts/noto-serif-tc/400/f00eb499abb94fa7b799d6d8c9b050e9.woff2 +0 -0
  1015. package/src/styles/fonts/noto-serif-tc/400/f7d36ffff7a75c9c6216d576a57dd00d.woff2 +0 -0
  1016. package/src/styles/fonts/noto-serif-tc/400/f7f3f63e7a149cd89eccab3b52171d05.woff2 +0 -0
  1017. package/src/styles/fonts/noto-serif-tc/400/fcc41f6a067ddd658bba5c9dff234a32.woff2 +0 -0
  1018. package/src/styles/fonts/noto-serif-tc/400/fd6ad889fcf3583bd9b0b6db53aad434.woff2 +0 -0
  1019. package/src/styles/fonts/noto-serif-tc/700/0c055db157e7a13f3103cc2a6b67fec3.woff2 +0 -0
  1020. package/src/styles/fonts/noto-serif-tc/700/0d3f5cc265cb6c439c517f2c4cebbddf.woff2 +0 -0
  1021. package/src/styles/fonts/noto-serif-tc/700/1259e5825b314fe2b8bb96d6e8069ee5.woff2 +0 -0
  1022. package/src/styles/fonts/noto-serif-tc/700/12c518ebfe62818af550c08947e359e7.woff2 +0 -0
  1023. package/src/styles/fonts/noto-serif-tc/700/145831a59caa06d894022fe60212ed21.woff2 +0 -0
  1024. package/src/styles/fonts/noto-serif-tc/700/169a096e61d38a773216f51d1ec2cc06.woff2 +0 -0
  1025. package/src/styles/fonts/noto-serif-tc/700/1884a2b22d314c7d57707f03aec348e0.woff2 +0 -0
  1026. package/src/styles/fonts/noto-serif-tc/700/1e2640116bbba817f43c43cc69371cf1.woff2 +0 -0
  1027. package/src/styles/fonts/noto-serif-tc/700/2573703213da30d3ba18925b100b2c2b.woff2 +0 -0
  1028. package/src/styles/fonts/noto-serif-tc/700/26839c0e47c73514b8d8f660d24d6b19.woff2 +0 -0
  1029. package/src/styles/fonts/noto-serif-tc/700/2a22e14a9ad53f2abb3c7e85017b7d12.woff2 +0 -0
  1030. package/src/styles/fonts/noto-serif-tc/700/2b3e8c5703b91f39f6027f43f0da6f4b.woff2 +0 -0
  1031. package/src/styles/fonts/noto-serif-tc/700/2f27ee4fb2cf6a280e110e09c18ef73e.woff2 +0 -0
  1032. package/src/styles/fonts/noto-serif-tc/700/31342cebfa5ea7fac06b4ea372d96bc5.woff2 +0 -0
  1033. package/src/styles/fonts/noto-serif-tc/700/375329ba0b50b94b35006498e555867c.woff2 +0 -0
  1034. package/src/styles/fonts/noto-serif-tc/700/427577dcb707d1d35eebd155b4222aa7.woff2 +0 -0
  1035. package/src/styles/fonts/noto-serif-tc/700/450a5b53be0a8a778bb0b623e86b652f.woff2 +0 -0
  1036. package/src/styles/fonts/noto-serif-tc/700/477866c8396474a17317dcac3e7a014f.woff2 +0 -0
  1037. package/src/styles/fonts/noto-serif-tc/700/478ebdaadda7775c391c5dcab4e697df.woff2 +0 -0
  1038. package/src/styles/fonts/noto-serif-tc/700/48d6a97a185c799be4fe67aaf7edf213.woff2 +0 -0
  1039. package/src/styles/fonts/noto-serif-tc/700/490edb9fc8a4356aea556eed32287464.woff2 +0 -0
  1040. package/src/styles/fonts/noto-serif-tc/700/4c4bdd0b3f3a52e28f3b643c1c5d43be.woff2 +0 -0
  1041. package/src/styles/fonts/noto-serif-tc/700/4c96411f3693a9a8657a9c1190f82bce.woff2 +0 -0
  1042. package/src/styles/fonts/noto-serif-tc/700/4c9aa12aba2a6a57410eacaff7427916.woff2 +0 -0
  1043. package/src/styles/fonts/noto-serif-tc/700/4cca7233bf8ce5dec2e5d146b993d626.woff2 +0 -0
  1044. package/src/styles/fonts/noto-serif-tc/700/4d0a9128d06ea857f203bf5d007b1ab9.woff2 +0 -0
  1045. package/src/styles/fonts/noto-serif-tc/700/4e5384920bbb155d9d8d74887b09ea5b.woff2 +0 -0
  1046. package/src/styles/fonts/noto-serif-tc/700/50cfd672bfa62512ba090420acf35c87.woff2 +0 -0
  1047. package/src/styles/fonts/noto-serif-tc/700/551b1d7a0b80c8d42af09863cdca7f01.woff2 +0 -0
  1048. package/src/styles/fonts/noto-serif-tc/700/555d990ab3fd7d3d66c6d1fa9a82fec5.woff2 +0 -0
  1049. package/src/styles/fonts/noto-serif-tc/700/5979c33a7eb5963bf8e83e46931b5fb5.woff2 +0 -0
  1050. package/src/styles/fonts/noto-serif-tc/700/59966ee0b069b577510fe68c350da0ee.woff2 +0 -0
  1051. package/src/styles/fonts/noto-serif-tc/700/60a14064ed334f0155795d795e926abe.woff2 +0 -0
  1052. package/src/styles/fonts/noto-serif-tc/700/611b62d5fd9698d9b5ce495ba6f14c93.woff2 +0 -0
  1053. package/src/styles/fonts/noto-serif-tc/700/6e83fe0b6e708eaf1c3003d6dee11488.woff2 +0 -0
  1054. package/src/styles/fonts/noto-serif-tc/700/70861376e5d4f92f8aa7aa1b2749b617.woff2 +0 -0
  1055. package/src/styles/fonts/noto-serif-tc/700/7124d150570d39ced8d45507dc11ca1e.woff2 +0 -0
  1056. package/src/styles/fonts/noto-serif-tc/700/79a7fdf7d9c722b5723ae25e6ff8e203.woff2 +0 -0
  1057. package/src/styles/fonts/noto-serif-tc/700/8c8393bc875f1ee36697a2113f4421ea.woff2 +0 -0
  1058. package/src/styles/fonts/noto-serif-tc/700/8e6c9bb43afb8cbbff7cf1055e67c9bd.woff2 +0 -0
  1059. package/src/styles/fonts/noto-serif-tc/700/90ac4f9d2aa02afdace2843b49fc18bb.woff2 +0 -0
  1060. package/src/styles/fonts/noto-serif-tc/700/90b6f57d77847f512fd11db74fa912f1.woff2 +0 -0
  1061. package/src/styles/fonts/noto-serif-tc/700/913759e6690f9fc0746a20b96f4bdcb4.woff2 +0 -0
  1062. package/src/styles/fonts/noto-serif-tc/700/9154e26efe532a85a27d80902f5a2d6c.woff2 +0 -0
  1063. package/src/styles/fonts/noto-serif-tc/700/94e7ed67f1557b76fead6b6e456a0415.woff2 +0 -0
  1064. package/src/styles/fonts/noto-serif-tc/700/95127a92346c04fec1fa81d6295b0a28.woff2 +0 -0
  1065. package/src/styles/fonts/noto-serif-tc/700/9fbc06b2e3ff16b9d705c76db563ef17.woff2 +0 -0
  1066. package/src/styles/fonts/noto-serif-tc/700/a3b929542e6c5a0644b73a7c8a8b6c03.woff2 +0 -0
  1067. package/src/styles/fonts/noto-serif-tc/700/a8857f5d478f101c053ba02d2f223e90.woff2 +0 -0
  1068. package/src/styles/fonts/noto-serif-tc/700/aa64c9953af43ca65832f413895bb433.woff2 +0 -0
  1069. package/src/styles/fonts/noto-serif-tc/700/ada8f0241244c60ec8d3d59ad37f20a5.woff2 +0 -0
  1070. package/src/styles/fonts/noto-serif-tc/700/b341de0bc0bfe194a6c28dcfb566029e.woff2 +0 -0
  1071. package/src/styles/fonts/noto-serif-tc/700/b846c293981ca5429eabaa967f222f26.woff2 +0 -0
  1072. package/src/styles/fonts/noto-serif-tc/700/be64f9379412876e00fd3a0bfa6b6fe9.woff2 +0 -0
  1073. package/src/styles/fonts/noto-serif-tc/700/befed8a4fa817773fa7109db6fe07f56.woff2 +0 -0
  1074. package/src/styles/fonts/noto-serif-tc/700/c09ee2b219982f8d46ad9968b7e6e0ba.woff2 +0 -0
  1075. package/src/styles/fonts/noto-serif-tc/700/c39ec937c6a8d124e8b68cf829ea5ad4.woff2 +0 -0
  1076. package/src/styles/fonts/noto-serif-tc/700/c3fd21315345ae541f6e98067059fa19.woff2 +0 -0
  1077. package/src/styles/fonts/noto-serif-tc/700/c568a16e3168ceb1f191b70022c492ea.woff2 +0 -0
  1078. package/src/styles/fonts/noto-serif-tc/700/c5e66d60be3375835bbd8d6b797f6eac.woff2 +0 -0
  1079. package/src/styles/fonts/noto-serif-tc/700/cd10a3af2133805d8c92104d1ee6ff18.woff2 +0 -0
  1080. package/src/styles/fonts/noto-serif-tc/700/d15a3317942b7d31978a759fbf2222c8.woff2 +0 -0
  1081. package/src/styles/fonts/noto-serif-tc/700/d740dc2e854aaa7b3dcdd3ed25455eeb.woff2 +0 -0
  1082. package/src/styles/fonts/noto-serif-tc/700/d8325ba7ae651bc30440905bd67b95f1.woff2 +0 -0
  1083. package/src/styles/fonts/noto-serif-tc/700/e2204cf85edcb96c5de5c3dcf240da9d.woff2 +0 -0
  1084. package/src/styles/fonts/noto-serif-tc/700/e3e913e145ddcd9323b2a0972967feb6.woff2 +0 -0
  1085. package/src/styles/fonts/noto-serif-tc/700/f2fb1f1fbf7e44afb53c672ec286a22e.woff2 +0 -0
  1086. package/src/styles/fonts/noto-serif-tc/700/f372129c60aaece937cf7b91ee75c9b8.woff2 +0 -0
  1087. package/src/styles/fonts/noto-serif-tc/700/f5d7487963d43c89da63aaf10f2e6fb7.woff2 +0 -0
  1088. package/src/styles/fonts/noto-serif-tc/700/f75496953a40ff241178240209f56990.woff2 +0 -0
  1089. package/src/styles/fonts/noto-serif-tc/700/f92d74d1d217d21b39075ff23f79f7fd.woff2 +0 -0
  1090. package/src/styles/fonts/noto-serif-tc/700/f9d6d981d8b87b3e469027277f585741.woff2 +0 -0
  1091. package/src/styles/fonts/noto-serif-tc/700/fa8ed469ef290bfeb571418fe0abb628.woff2 +0 -0
  1092. package/src/styles/fonts/noto-serif-tc/700/fb61b690208eff56e6d8432951270901.woff2 +0 -0
  1093. package/src/styles/fonts/noto-serif-tc/700/ff0937ad63cda71ff420945ead55ab4d.woff2 +0 -0
  1094. package/src/styles/fonts/noto-serif-tc/noto-serif-tc.css +3104 -0
  1095. package/src/styles/tokens.css +42 -7
  1096. package/src/styles/ui.css +7586 -3401
  1097. package/src/types/app-context.ts +7 -0
  1098. package/src/types/bindings.ts +77 -27
  1099. package/src/types/config.ts +104 -4
  1100. package/src/types/constants.ts +43 -4
  1101. package/src/types/entities.ts +63 -4
  1102. package/src/types/operations.ts +45 -15
  1103. package/src/types/props.ts +46 -9
  1104. package/src/types/views.ts +51 -8
  1105. package/src/ui/__tests__/color-themes.test.ts +81 -0
  1106. package/src/ui/__tests__/font-themes.test.ts +76 -7
  1107. package/src/ui/color-themes.ts +424 -238
  1108. package/src/ui/compose/ComposeDialog.tsx +149 -91
  1109. package/src/ui/compose/ComposePrompt.tsx +20 -3
  1110. package/src/ui/dash/ActionButtons.tsx +16 -2
  1111. package/src/ui/dash/DangerZone.tsx +10 -1
  1112. package/src/ui/dash/StatusBadge.tsx +3 -3
  1113. package/src/ui/dash/appearance/AdvancedContent.tsx +9 -2
  1114. package/src/ui/dash/appearance/ColorThemeContent.tsx +326 -63
  1115. package/src/ui/dash/appearance/FontThemeContent.tsx +75 -17
  1116. package/src/ui/dash/appearance/NavigationContent.tsx +48 -21
  1117. package/src/ui/dash/settings/AccountContent.tsx +7 -2
  1118. package/src/ui/dash/settings/AccountMenuContent.tsx +242 -111
  1119. package/src/ui/dash/settings/ApiTokensContent.tsx +38 -8
  1120. package/src/ui/dash/settings/AvatarContent.tsx +1 -1
  1121. package/src/ui/dash/settings/DeleteAccountContent.tsx +300 -0
  1122. package/src/ui/dash/settings/GeneralContent.tsx +120 -6
  1123. package/src/ui/dash/settings/SessionsContent.tsx +23 -5
  1124. package/src/ui/dash/settings/SettingsDirectory.tsx +99 -0
  1125. package/src/ui/dash/settings/SettingsRootContent.tsx +176 -221
  1126. package/src/ui/feed/CuratedThreadPreview.tsx +73 -0
  1127. package/src/ui/feed/LinkCard.tsx +52 -36
  1128. package/src/ui/feed/NoteCard.tsx +10 -4
  1129. package/src/ui/feed/PostStatusBadges.tsx +4 -21
  1130. package/src/ui/feed/QuoteCard.tsx +11 -3
  1131. package/src/ui/feed/ThreadPreview.tsx +11 -5
  1132. package/src/ui/feed/TimelineFeed.tsx +53 -15
  1133. package/src/ui/feed/__tests__/timeline-cards.test.ts +172 -0
  1134. package/src/ui/feed/thread-preview-state.ts +2 -4
  1135. package/src/ui/font-themes.ts +211 -43
  1136. package/src/ui/layouts/BaseLayout.tsx +161 -30
  1137. package/src/ui/layouts/SiteLayout.tsx +51 -18
  1138. package/src/ui/layouts/__tests__/BaseLayout.test.tsx +169 -0
  1139. package/src/ui/pages/ArchivePage.tsx +320 -120
  1140. package/src/ui/pages/BrandPage.tsx +927 -0
  1141. package/src/ui/pages/CollectionEditorPage.tsx +155 -0
  1142. package/src/ui/pages/CollectionPage.tsx +410 -18
  1143. package/src/ui/pages/CollectionsPage.tsx +57 -57
  1144. package/src/ui/pages/FeaturedPage.tsx +24 -3
  1145. package/src/ui/pages/HomePage.tsx +13 -0
  1146. package/src/ui/pages/PostPage.tsx +13 -4
  1147. package/src/ui/pages/SearchPage.tsx +12 -2
  1148. package/src/ui/pages/ThemeSamplePage.tsx +1160 -0
  1149. package/src/ui/shared/AdminBreadcrumb.tsx +22 -6
  1150. package/src/ui/shared/CollectionDirectory.tsx +117 -0
  1151. package/src/ui/shared/CollectionsManager.tsx +277 -0
  1152. package/src/ui/shared/DecorativeQuoteMark.tsx +32 -0
  1153. package/src/ui/shared/HomePageBranding.tsx +22 -0
  1154. package/src/ui/shared/JantBrandMark.tsx +35 -0
  1155. package/src/ui/shared/MediaGallery.tsx +106 -36
  1156. package/src/ui/shared/PaginatedPageHeader.tsx +49 -0
  1157. package/src/ui/shared/Pagination.tsx +2 -6
  1158. package/src/ui/shared/PostFooter.tsx +130 -67
  1159. package/src/ui/shared/__tests__/home-page-branding.test.tsx +14 -0
  1160. package/src/ui/shared/__tests__/media-gallery.test.ts +82 -0
  1161. package/src/ui/shared/__tests__/navigation-labels.test.ts +103 -0
  1162. package/src/ui/shared/__tests__/pagination.test.ts +18 -1
  1163. package/src/ui/shared/__tests__/post-footer.test.ts +122 -0
  1164. package/src/ui/shared/collection-management-labels.ts +161 -0
  1165. package/src/ui/shared/navigation-labels.ts +126 -0
  1166. package/src/vendor/datastar.js +1955 -7
  1167. package/dist/client/assets/heic-to-DIRPI3VF.js +0 -1
  1168. package/dist/client/assets/module-RjUF93sV.js +0 -716
  1169. package/dist/client/assets/native-48B9X9Wg.js +0 -1
  1170. package/dist/client/assets/url-FWFqPJPb.js +0 -1
  1171. package/dist/client/client.css +0 -1
  1172. package/dist/client/client.js +0 -33565
  1173. package/src/client/components/collection-sidebar-types.ts +0 -43
  1174. package/src/client/tiptap/paste-image.ts +0 -129
  1175. package/src/lib/emoji-catalog.ts +0 -963
  1176. package/src/lib/icon-catalog.ts +0 -5213
  1177. package/src/ui/shared/CollectionsSidebar.tsx +0 -294
@@ -1 +1 @@
1
- /*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+AXdXp\":[\"標籤和 URL 為必填\"],\"+zy2Nq\":[\"類型\"],\"/DFKdU\":[\"輸入引述...\"],\"/eDNhN\":[\"以精選貼文開啟\"],\"/rTz0M\":[\"音訊\"],\"0OGSSc\":[\"頭像顯示已更新。\"],\"0ieXE7\":[\"評分最高\"],\"1DBGsz\":[\"筆記\"],\"1F6Mzc\":[\"目前尚無導覽項目。新增連結或在下方啟用系統項目。\"],\"1Oj1sI\":[\"排序已儲存\"],\"1u8a3u\":[\"搜尋表情符號...\"],\"2B7HLH\":[\"New post\"],\"2TgGnr\":[\"名稱、描述、語言\"],\"2cFU6q\":[\"網站頁尾\"],\"3Cw1AI\":[\"新增集合\"],\"3VrybB\":[\"重新導向\"],\"3Yvsaz\":[\"302 (暫時)\"],\"3wKq0C\":[\"無法儲存。 請稍後再試。\"],\"4Jge8E\":[\"Active Sessions\"],\"4Ml90q\":[\"SEO\"],\"4WO1Hp\":[\"找不到符合的集合。\"],\"4cEClj\":[\"Sessions\"],\"68qugd\":[\"變更您的登入密碼\"],\"6EwmNQ\":[\"網站小圖示與頁首圖示\"],\"6V3Ea3\":[\"已複製\"],\"6lGV3K\":[\"顯示較少\"],\"7FaY4u\":[\"使用方式\"],\"7MZxzw\":[\"密碼已變更.\"],\"7d1a0d\":[\"Public\"],\"7nGhhM\":[\"在想什麼?\"],\"7vhWI8\":[\"新密碼\"],\"81nFIS\":[\"密碼不相符. 請確保兩個欄位相同.\"],\"87a/t/\":[\"標籤\"],\"89Upyo\":[\"該主題不可用。請選擇其他主題。\"],\"8Btgys\":[\"草稿已刪除.\"],\"8U2Z7f\":[\"新增自訂網址\"],\"8WX0J+\":[\"你的想法(選填)\"],\"8ZsakT\":[\"密碼\"],\"8bpHix\":[\"無法建立您的帳戶。請檢查資料後再試一次。\"],\"8qX8Jl\":[\"為您的網站選擇字型配對。所有選項皆使用系統字型以快速載入。\"],\"8tM8+a\":[\"儲存為草稿\"],\"9+vGLh\":[\"自訂 CSS\"],\"A1taO8\":[\"搜尋\"],\"AeXO77\":[\"帳戶\"],\"AyHO4m\":[\"這個收藏是關於什麼?\"],\"B495Gs\":[\"封存\"],\"B4ESok\":[\"API 參考\"],\"Bmaby2\":[\"所有格式\"],\"D9Oea+\":[\"永久連結\"],\"DCKkhU\":[\"目前密碼\"],\"DHhJ7s\":[\"上一頁\"],\"DOx286\":[\"草稿已還原。\"],\"DPfwMq\":[\"完成\"],\"DoJzLz\":[\"收藏集\"],\"EEYbdt\":[\"Publish\"],\"EGwzOK\":[\"完成設定\"],\"EO3I6h\":[\"上傳失敗。請稍後再試。\"],\"Enslfm\":[\"目的地\"],\"FESYvt\":[\"為視障者描述此內容...\"],\"FM+KeU\":[\"尚無草稿. 儲存草稿後將會顯示在此.\"],\"FMgjDM\":[\"切換內建導覽項目. 已啟用的項目會連同連結一起出現在您的導覽中.\"],\"FkMol5\":[\"精選\"],\"Fxf4jq\":[\"描述(選填)\"],\"GX2VMa\":[\"建立您的管理員帳號.\"],\"GXsAby\":[\"撤銷\"],\"GlEzsR\":[\"供搜尋引擎與訂閱閱讀器使用的簡短介紹。僅限純文字。\"],\"GorKul\":[\"歡迎使用 Jant\"],\"GvJQun\":[\"目前沒有精選貼文。將貼文標記為精選即可在此處突顯\"],\"GxkJXS\":[\"上傳中...\"],\"H29JXm\":[\"+ 替代文字\"],\"H4lgRd\":[\"身分驗證尚未設定. 請檢查您的伺服器設定.\"],\"HG79RB\":[\"Post as Private\"],\"HKH+W+\":[\"Data\"],\"HNEHJP\":[\"示範憑證已預先填入 — 按「登入」以繼續。\"],\"Hp1l6f\":[\"Current\"],\"I6gXOa\":[\"路徑\"],\"ICsA6P\":[\"You have unsaved changes\"],\"IW5PBo\":[\"複製 Token\"],\"IagCbF\":[\"URL\"],\"ImOQa9\":[\"回覆\"],\"J6bLeg\":[\"新增自訂連結至任意 URL\"],\"JL7LF5\":[\"available CSS variables, data attributes, and examples.\"],\"JcD7qf\":[\"更多操作\"],\"JjX0OO\":[\"請立即複製您的 token — 之後不會再顯示。\"],\"JuN5GC\":[\"未選取任何檔案。請選擇要上傳的檔案。\"],\"KbS2K9\":[\"重設密碼\"],\"KdSsVl\":[\"作者 (選填)\"],\"KiJn9B\":[\"筆記\"],\"KlZ+t+\":[\"%name% + %count% more\"],\"KuCcWu\":[\"顯示於所有文章與頁面的底部。支援 Markdown.\"],\"L0gres\":[\"其餘項目會被收納到 ··· 選單\"],\"L85WcV\":[\"網址別名\"],\"LcvzvX\":[\"輕觸以重試\"],\"LdyooL\":[\"連結\"],\"LkA8jz\":[\"新增替代文字\"],\"M2kIWU\":[\"字型主題\"],\"M6CbAU\":[\"切換編輯面板\"],\"M8kJqa\":[\"草稿\"],\"MHrjPM\":[\"標題\"],\"MSc/Yq\":[\"Do you want to publish your changes or discard them?\"],\"MXSt4t\":[\"建立於 \",[\"0\"]],\"MdMyne\":[\"來源連結(選填)\"],\"MqghUt\":[\"搜尋文章...\"],\"Myqkib\":[\"建立一個集合以開始。\"],\"NU2Fqi\":[\"儲存 CSS\"],\"NhHXCr\":[\"自訂 URL 路徑 (不含前導斜線)\"],\"Nldjdr\":[\"尚未有自訂網址。建立一個來新增轉址或為文章設定自訂路徑。\"],\"O1367B\":[\"所有收藏集\"],\"O3oNi5\":[\"電子郵件\"],\"OVSkIF\":[\"敏捷的棕色狐狸躍過那隻懶惰的狗。\"],\"PJnyHS\":[\"已儲存最大可見導覽連結數\"],\"PKhdhq\":[\"頁首顯示的連結數量\"],\"PZ7HJ8\":[\"部落格頭像\"],\"PxJ9W6\":[\"產生 Token\"],\"Qnrzvb\":[\"啟用的 API 權杖\"],\"QyDt3L\":[\"檔案已上傳。\"],\"Rj01Fz\":[\"連結\"],\"RxsRD6\":[\"時區\"],\"S8NCfs\":[\"儲存到草稿,稍後可編輯並發佈。\"],\"SJmfuf\":[\"網站名稱\"],\"SKZhW9\":[\"令牌名稱\"],\"TEhb9O\":[\"新增分隔線\"],\"TWt5I9\":[\"還有 \",[\"hiddenCount\"],\" 則 \",[\"0\"]],\"UIMXHD\":[\"移除分隔線\"],\"Ui5/i3\":[\"允許搜尋引擎索引我的網站\"],\"Uj/btJ\":[\"在我的網站標頭顯示頭像\"],\"UxKoFf\":[\"導覽\"],\"UzGRD9\":[\"首頁檢視已儲存\"],\"V4WsyL\":[\"新增連結\"],\"VhMDMg\":[\"變更密碼\"],\"Vn3jYy\":[\"導覽項目\"],\"WDcQq9\":[\"未列出\"],\"Weq9zb\":[\"一般\"],\"WpXcBJ\":[\"這裡還沒有任何內容.\"],\"X+8FMk\":[\"目前的密碼不符。請再試一次。\"],\"X1G9eY\":[\"導覽預覽\"],\"XrnWzN\":[\"已發佈!\"],\"XxJL62\":[\"自訂樣式\"],\"Y/F35r\":[\"使用 curl 建立貼文:\"],\"Y6hOOP\":[\"Signed in \",[\"0\"]],\"YIix5Y\":[\"搜尋...\"],\"YdG2RF\":[\"Export Site\"],\"Z6NwTi\":[\"儲存為草稿\"],\"ZGs2so\":[\"永久刪除此收藏?其中的文章不會被刪除。\"],\"ZQKLI1\":[\"危險區域\"],\"ZhhOwV\":[\"引用\"],\"ZiooJI\":[\"API 令牌\"],\"ZmSeP+\":[\"要儲存為草稿嗎?\"],\"ZmUkwN\":[\"新增自訂連結至導覽列\"],\"a14mj8\":[\"Unknown device\"],\"aFkzVF\":[\"目標貼文或集合的 URL slug\"],\"aHTB7P\":[\"附加於您的貼文的補充內容\"],\"alKG0+\":[\"字型主題\"],\"an5hVd\":[\"圖片\"],\"anibOb\":[\"關於本部落格\"],\"any7NR\":[\"Theming guide\"],\"b+/jO6\":[\"301 (永久)\"],\"bHYIks\":[\"登出\"],\"bzSI52\":[\"放棄\"],\"c3MN2z\":[\"所有可用的端點和請求格式.\"],\"cSDy01\":[\"自訂 CSS 已更新。\"],\"cTUByn\":[\"由新到舊\"],\"ccaIM9\":[\"更多連結\"],\"cgmi4V\":[\"刪除草稿\"],\"cnGeoo\":[\"刪除\"],\"d/o/BH\":[\"無法發布。已儲存為草稿。\"],\"dEgA5A\":[\"取消\"],\"dmCcPs\":[\"這會用於你的 favicon 和 apple-touch-icon。為達最佳效果,請上傳至少 180x180 像素的正方形圖片。\"],\"ePK91l\":[\"編輯\"],\"eRujag\":[\"Post as Featured\"],\"eWLklq\":[\"引用\"],\"ebQKK7\":[\"網站\"],\"egK+Yy\":[\"用於腳本與自動化的 Bearer 令牌\"],\"ehj/zN\":[\"重新導向類型\"],\"eneWvv\":[\"草稿\"],\"etgedT\":[\"表情符號\"],\"f4MAoA\":[\"部分上傳失敗。已儲存為草稿。\"],\"f8fH8W\":[\"設計\"],\"fFDkGR\":[\"Sessions, password, export\"],\"fMPkxb\":[\"顯示更多\"],\"fqDzSu\":[\"評分\"],\"ft3WqP\":[\"套用於整個網站,包括管理頁面。所有主題皆支援深色模式。\"],\"fttd2R\":[\"我的收藏\"],\"g98BZB\":[\"頁首連結,精選\"],\"gj52YE\":[\"此收藏為空。請從編輯器新增文章。\"],\"gpaPhA\":[\"協助螢幕閱讀器描述圖片\"],\"gtQsRO\":[\"建立自訂網址\"],\"hDRU5q\":[\"找到 \",[\"0\"],\" 筆結果\"],\"hFkbiy\":[\"No active sessions found.\"],\"hGiKlz\":[\"設定已更新.\"],\"hGmyDl\":[\"權杖讓你在不用登入的情況下,從腳本、捷徑和其他工具存取 API。\"],\"hXzOVo\":[\"下一頁\"],\"harFs3\":[\"重新導向與自訂路徑\"],\"heSQoS\":[\"貼上網址...\"],\"i0vDGK\":[\"排序順序\"],\"i6nDCI\":[\"請選擇新密碼.\"],\"iEUzMn\":[\"系統\"],\"iH8pgl\":[\"Back\"],\"idD8Ev\":[\"已儲存\"],\"j5nQL2\":[\"例如 iOS Shortcuts\"],\"jUV7CU\":[\"上傳頭像\"],\"jVUmOK\":[\"支援 Markdown\"],\"jgBjXJ\":[\"撤銷此權杖?任何使用它的腳本將會停止運作。\"],\"ji7oVU\":[\"編輯貼文\"],\"jpctdh\":[\"檢視\"],\"jvyYZG\":[\"在想什麼...\"],\"k1ifdL\":[\"處理中...\"],\"k97t+V\":[\"Download as a Zola static site (.zip)\"],\"kNiQp6\":[\"已釘選\"],\"kPMIr+\":[\"為連結加上標題...\"],\"ke1gWS\":[\"自訂 URL\"],\"kfcRb0\":[\"頭像\"],\"kj6ppi\":[\"項目\"],\"kr39oD\":[\"尚未建立任何收藏集。建立一個以主題整理貼文。\"],\"l/6JHD\":[\"搜尋圖示...\"],\"l6ANt9\":[\"評分最低\"],\"lLW3vJ\":[\"目標網址別名\"],\"m16xKo\":[\"新增\"],\"mKT7g0\":[\"文字附件\"],\"mSNmrX\":[\"列出貼文:\"],\"mcmuCe\":[\"圖示\"],\"n1ekoW\":[\"登入\"],\"n6QD94\":[\"由舊到新\"],\"nFukaP\":[\"電子郵件或密碼錯誤。請檢查您的登入資訊後重試。\"],\"nWRfmt\":[\"排版\"],\"o/vNDE\":[\"lets you override any theme variable.\"],\"o21Y+P\":[\"項目\"],\"oKOOsY\":[\"色彩主題\"],\"oSiRP0\":[\"系統連結\"],\"p2/GCq\":[\"確認密碼\"],\"pS8mgN\":[\"Manage active sign-in sessions\"],\"pZq3aX\":[\"上傳失敗。請再試一次。\"],\"psoxDF\":[\"該字型主題不可用。請選擇其他一個。\"],\"q+hNag\":[\"集合\"],\"q8RviX\":[\"有標題\"],\"qt89I8\":[\"草稿已儲存。\"],\"r09tue\":[\"沒有貼文符合這些篩選條件。請調整您的選擇或清除所有篩選條件。\"],\"rFmBG3\":[\"色彩主題\"],\"rlonmB\":[\"無法刪除. 請稍後再試.\"],\"sER+bs\":[\"檔案\"],\"sxkWRg\":[\"進階\"],\"t/YqKh\":[\"移除\"],\"tKlWWY\":[\"表情符號\"],\"tLO9d0\":[\"Post Unlisted\"],\"tfDRzk\":[\"儲存\"],\"thAGHG\":[\"已更新 SEO 設定.\"],\"tiq7kl\":[\"第 \",[\"page\"],\" 頁\"],\"toJdZA\":[\"重新排序\"],\"u3wRF+\":[\"已發佈\"],\"u6KOjV\":[\"Want more control?\"],\"ui6aMF\":[\"These devices are currently signed in to your account. Revoke any session you don't recognize.\"],\"vGjmyl\":[\"已刪除\"],\"vSJd18\":[\"影片\"],\"vXCC6J\":[\"有些地方看起來不對。請檢查表單並再試一次。\"],\"vXIe7J\":[\"語言\"],\"vmQmHx\":[\"新增自訂 CSS 以覆寫任何樣式。使用像 [data-page], [data-post], [data-format] 的資料屬性來針對特定元素。\"],\"vpSPA1\":[\"驗證祕鑰遺失。請檢查您的環境變數。\"],\"vzU4k9\":[\"建立新集合\"],\"w8Rv8T\":[\"標籤為必填\"],\"wJ+GRy\":[\"All visibility\"],\"wL3cK8\":[\"最新\"],\"wc+17X\":[\"/* 在此放入自訂 CSS */\"],\"wja8aL\":[\"無標題\"],\"wm3Zlr\":[\"所有年份\"],\"xCWek4\":[\"檔案儲存尚未設定。請檢查您的伺服器設定。\"],\"xVvw1i\":[\"此重設連結已不再有效。請申請新的連結以繼續。\"],\"xYilR2\":[\"媒體\"],\"xeiujy\":[\"Text\"],\"y28hnO\":[\"發佈\"],\"y2o/Y0\":[\"此連結已過期\"],\"yQ2kGp\":[\"載入更多\"],\"ycM1Xg\":[\"沒有結果。請嘗試不同的關鍵字。\"],\"yjkELF\":[\"確認新密碼\"],\"ylo1I0\":[\"上次使用於 \",[\"0\"]],\"yzF66j\":[\"連結\"],\"z8ajIE\":[\"找到 1 個結果\"],\"zBFr9G\":[\"貼上長文章、AI 回覆或任何文字...\\n\\nMarkdown 格式會被保留.\"],\"zJDAbh\":[\"不儲存\"],\"zennIg\":[\"URL 安全的識別字串(小寫、數字、連字號)。對於 CJK 標題,slug 將在伺服器上自動產生。\"],\"zl926n\":[\"關閉時, 訪客會先看到你的最新文章\"],\"zwBp5t\":[\"Private\"]}")as Messages;
1
+ /*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"+2aYLu\":[\"頁首連結數量上限已更新。\"],\"+4u2g6\":[\"已製作好的 1:1 PNG,適用於簡報、樣機、目錄及其他方形配置。\"],\"+AXdXp\":[\"標籤和 URL 為必填\"],\"+DPYOZ\":[\"新增指向主 RSS feed 的連結。可在一般設定中修改 /feed 的輸出內容。\"],\"+G8qqW\":[\"選集已儲存。\"],\"+IJm1Z\":[\"淡化\"],\"+Irvp3\":[\"此頁面上的所有內容皆可直接用於文章、發布貼文、名錄及產品報導。\"],\"+Qaboy\":[\"網站圖示\"],\"+fWu2O\":[\"更平靜、更溫暖的強調色,讓預設主題更安靜,也更有分寸。\"],\"+h8YKs\":[\"低干擾配色,帶來更乾淨、更平靜的閱讀節奏。\"],\"+siMqD\":[\"日誌\"],\"+zy2Nq\":[\"類型\"],\"/3H2/s\":[\"這個託管站點透過 \",[\"providerLabel\"],\" 登入。在那裡管理密碼和託管站點存取權限。\"],\"/DFKdU\":[\"輸入引述...\"],\"/PfPLc\":[\"標籤(選填)\"],\"/PoNoq\":[\"編輯連結\"],\"/Ui2OV\":[\"在深色背景上使用反白標誌。\"],\"/Ybds4\":[\"Jant 的主要標誌,用於網站、檔案、媒體報導與編輯版面。\"],\"/rTz0M\":[\"音訊\"],\"0+tKwI\":[\"匯出與示範限制\"],\"0EcUWz\":[\"要放棄變更嗎?\"],\"0Lj7or\":[\"儲存文字附件?\"],\"0OGSSc\":[\"頭像顯示已更新。\"],\"0UzCUX\":[\"更新您用來登入的密碼\"],\"0XDp7X\":[\"連結應該在頁面上清晰易讀,不應帶有發光效果.\"],\"0ieXE7\":[\"評分最高\"],\"14BEca\":[\"了解原因\"],\"15++NM\":[\"行內強調\"],\"1DBGsz\":[\"筆記\"],\"1F6Mzc\":[\"目前尚無導覽項目。新增連結或在下方啟用系統項目。\"],\"1NeeWI\":[\"方形資產,用於頭像、應用程式、瀏覽器和分享連結\"],\"1THMr2\":[\"品牌包\"],\"1njn7W\":[\"淺色\"],\"2B7HLH\":[\"新增貼文\"],\"2C7mSG\":[\"選集連結\"],\"2DoBvq\":[\"訂閱源\"],\"2ETv7R\":[\"在真實閱讀情境中微調顏色\"],\"2HbvFp\":[\"實際文章元件\"],\"2MXb5X\":[\"安靜設計手記\"],\"2PTjMB\":[\"我想刪除 \",[\"siteName\"]],\"2cFU6q\":[\"網站頁尾\"],\"2koDOQ\":[\"貼文串 強調色\"],\"2q/Q7x\":[\"可見性\"],\"2sCqzD\":[\"用於網站、檔案、文章,以及其他淺色或中性背景。\"],\"3Cw1AI\":[\"新增選集\"],\"3VrybB\":[\"重新導向\"],\"3Yvsaz\":[\"302 (暫時)\"],\"3lJk5u\":[\"保持圖稿不變.\"],\"3mdteM\":[\"再判斷這個強調色是否帶上了過多產品化的氣息。\"],\"3n0zbB\":[\"示範模式下不提供工作階段管理。請直接使用共享示範工作階段。\"],\"3neqtf\":[\"貼文串 強調色\"],\"3qkggm\":[\"全螢幕\"],\"3vMdv3\":[\"這個連結是保留位址,請換一個。\"],\"3wKq0C\":[\"無法儲存。 請稍後再試。\"],\"3xi01/\":[\"最後檢查頁尾的資訊,確保強調元素不會與排版相互衝突。\"],\"47iMgt\":[\"值得借鏡的編輯介面\"],\"49Bsal\":[\"訂閱源設定已更新。\"],\"4D09NB\":[\"連結到你的選集頁\"],\"4J/OYU\":[\"選集已建立。\"],\"4Jge8E\":[\"目前的工作階段\"],\"4KIa+q\":[\"匯出已下載。\"],\"4cEClj\":[\"工作階段\"],\"4eiXo+\":[\"留空則自動生成。\"],\"4pV0kE\":[\"可用作頭像\"],\"4zGJ5E\":[\"永久刪除帳號\"],\"5VQnR3\":[\"當你需要一個不會變動的 feed 連結時,使用這些地址。\"],\"5lWFkC\":[\"登入\"],\"5pAjd8\":[\"強調色應該有存在感,但不要過於刺眼。\"],\"5sEkBi\":[\"開啟原始檔案\"],\"69OXZB\":[\"刪除託管站點\"],\"6ArdBh\":[\"將精選貼文作為 /feed 的內容。\"],\"6DjeBT\":[\"示範站點會一律對搜尋引擎隱藏。\"],\"6FFB7q\":[\"將最新公開貼文作為 /feed 的內容。\"],\"6K1Vef\":[\"永久刪除此部落格? 此操作無法復原。\"],\"6UTABI\":[\"選集排序已更新。\"],\"6V3Ea3\":[\"已複製\"],\"6Y4BBO\":[\"以溫暖紙張色調呈現的抽象編輯版面\"],\"6cjUDB\":[\"品牌資產\"],\"6lGV3K\":[\"顯示較少\"],\"6p0JeQ\":[\"以確保兩者仍然感覺屬於同一個產品。\"],\"6rhkhp\":[\"首頁檢視已更新。\"],\"6sVyMq\":[\"先補上 URL,再發佈這則連結。\"],\"6wixKm\":[\"下載一個 Zola 站點 ZIP,可用於靜態發佈或匯入另一套 Jant。\"],\"6yCv8j\":[\"儲存對文字附件的變更、不儲存,或繼續編輯。\"],\"72fkwh\":[\"將精選設為首頁檢視\"],\"74kJNs\":[\"查看這個貼文串裡更早的筆記\"],\"7DvUqV\":[\"從上到下閱讀頁面,勿查看色票。\"],\"7FaY4u\":[\"使用方式\"],\"7G9YLi\":[\"允許搜尋引擎收錄我的網站\"],\"7MZxzw\":[\"密碼已變更.\"],\"7aris6\":[\"3月15日\"],\"7d1a0d\":[\"公開\"],\"7hYXO0\":[\"將此用於深色背景、以影像為背景的表面,以及任何會使綠色 logo 失去對比的配置\"],\"7kMW54\":[\"在瀏覽器中開啟原始 SVG\"],\"7nGhhM\":[\"在想什麼?\"],\"7vhWI8\":[\"新密碼\"],\"7z05Pf\":[\"Open the hosted site controls in \",[\"providerLabel\"],\" to cancel billing or permanently delete this site.\"],\"81nFIS\":[\"密碼不相符. 請確保兩個欄位相同.\"],\"87a/t/\":[\"標籤\"],\"89Upyo\":[\"該主題不可用。請選擇其他主題。\"],\"8BfEpW\":[\"託管帳號\"],\"8Btgys\":[\"草稿已刪除.\"],\"8U2Z7f\":[\"新增自訂網址\"],\"8WX0J+\":[\"你的想法(選填)\"],\"8ZsakT\":[\"密碼\"],\"8bpHix\":[\"無法建立您的帳戶。請檢查資料後再試一次。\"],\"8eC78s\":[\"較柔和的強調色讓\"],\"8tM8+a\":[\"儲存為草稿\"],\"9+vGLh\":[\"自訂 CSS\"],\"90IRF2\":[\"這篇文章想回答一個具體問題:當預設強調色要撐起一整段閱讀體驗時,它是否依然足夠平靜?\"],\"9SHZas\":[\"登入時顯示「設定」,未登入時顯示「登入」\"],\"9T7Cwm\":[\"重新導向、自訂路徑與 URL 控制\"],\"9aUyym\":[\"查看您在哪裡已登入並終止舊的登入會話\"],\"9aloPG\":[\"參考資料\"],\"9dr9Nh\":[\"打開外部連結\"],\"A1D8Yt\":[\"強調色該承擔什麼\"],\"A1taO8\":[\"搜尋\"],\"A2Vg/u\":[\"導覽與閱讀狀態\"],\"Ac5qDn\":[\"拖曳選集和分隔線,調整成你想要的順序。\"],\"AeXO77\":[\"帳戶\"],\"AjHkcv\":[\"社群分享與連結展開時的預設預覽圖片。\"],\"AnY+O9\":[\"在首頁底部顯示「Build with Jant」\"],\"ApZDMk\":[\"這會用於你的 favicon 和 apple-touch-icon。為達最佳效果,請上傳至少 512×512 像素、帶純色背景的正方形 PNG 圖片。\"],\"AyHO4m\":[\"這個選集是關於什麼的?\"],\"B1FFMj\":[\"下載品牌套件\"],\"B495Gs\":[\"封存\"],\"B4ESok\":[\"API 參考\"],\"BdjLtf\":[\"個貼文串\"],\"Bmaby2\":[\"所有格式\"],\"C+9df9\":[\"引用或凸顯的段落應該感覺像註解,而不是警告。\"],\"C0/57J\":[\"這是選集連結的最後一段。\"],\"CAh1km\":[\"個選集\"],\"D4em/+\":[\"標誌\"],\"DCKkhU\":[\"目前密碼\"],\"DHhJ7s\":[\"上一頁\"],\"DKKKeF\":[\"在 \",[\"providerLabel\"],\" 中管理密碼和託管站點存取權限\"],\"DOx286\":[\"草稿已還原。\"],\"DPfwMq\":[\"完成\"],\"DYlMYF\":[\"內建背景\"],\"DoJzLz\":[\"選集\"],\"Du2B9f\":[\"預設強調色應優先支援閱讀. 先比較它與 the\"],\"DxwUcG\":[\"先將色盤當作內容來閱讀\"],\"E3NcGH\":[\"方形標誌 PNG\"],\"ECrbov\":[\"氛圍感更強的配色,時間、地點和情緒感更鮮明。\"],\"EEYbdt\":[\"發布\"],\"EGwzOK\":[\"完成設定\"],\"EHWwm1\":[\"預設的重點應有書寫感,而非品牌化\"],\"EO3I6h\":[\"上傳失敗。請稍後再試。\"],\"EQNPYo\":[\"精選於 \",[\"date\"],\" \",[\"time\"]],\"EQtz4D\":[\"開啟幾個連結,檢查它們是否仍然與頁面原生風格相符。\"],\"EUPyPZ\":[\"以及另外 \",[\"count\"],\" 個\"],\"EetoJL\":[\"引導視線而不搶佔版面。\"],\"Eiv3bO\":[\"按鈕可以保持穩定,但連結、貼文串標記與細微的強調應該感覺更接近紙上的墨跡,而非儀表板的外觀。\"],\"EmQw8O\":[\"如果這篇文章仍讓你想繼續閱讀,代表配色可能已經很接近了。\"],\"Enslfm\":[\"目的地\"],\"EsJdRp\":[\"儲存主題\"],\"FESYvt\":[\"為視障者描述此內容...\"],\"FEr96N\":[\"主題\"],\"FGySZL\":[\"預設的強調色在看起來像鋼筆底線時最為合適。將它與下列比較\"],\"FM+KeU\":[\"還沒有草稿。儲存草稿後就會顯示在這裡。\"],\"FMgjDM\":[\"切換內建導覽項目。啟用的項目會和連結一起顯示在導覽中。\"],\"Fdv5k7\":[\"調校時要注意什麼\"],\"FkMol5\":[\"精選\"],\"Fxf4jq\":[\"描述(選填)\"],\"G0qJsQ\":[\"找不到安全權杖。請重新整理頁面後再試一次。\"],\"G2u/aQ\":[\"下載官方 Jant 標誌、圖示與預覽資產。\"],\"GMMWcy\":[\"名稱、中繼資料、語言與搜尋預設值\"],\"GX2VMa\":[\"建立您的管理員帳號.\"],\"GXsAby\":[\"撤銷\"],\"GiRWtR\":[\"為什麼預設強調色應該像書寫,而不是品牌標記\"],\"GlEzsR\":[\"供搜尋引擎與訂閱閱讀器使用的簡短介紹。僅限純文字。\"],\"GorKul\":[\"歡迎使用 Jant\"],\"GxkJXS\":[\"上傳中...\"],\"GzTVPx\":[\"匯出靜態站點\"],\"H29JXm\":[\"+ 替代文字\"],\"H4lgRd\":[\"身分驗證尚未設定. 請檢查您的伺服器設定.\"],\"HFPGej\":[\"沒有符合這些篩選條件的貼文串。調整篩選條件,或清除所有篩選。\"],\"HG79RB\":[\"以私密方式發佈\"],\"HKH+W+\":[\"資料\"],\"HNEHJP\":[\"示範憑證已預先填入 — 按「登入」以繼續。\"],\"HbAIQc\":[\"供參考的連結,用於檢查語氣是否偏向編輯風格而非促銷性.\"],\"Hp1l6f\":[\"目前\"],\"Ht1V3q\":[\"也因為這個原因,行內程式碼應該保持中性。像 theme.siteAccent = soften(green, 12%) 這樣的內容,不該突然變成頁面裡最吵的一部分。\"],\"HxlY7t\":[\"修改後,訂閱 /feed 的讀者會收到不同內容。\"],\"I22eN0\":[\"已分享的連結\"],\"I6gXOa\":[\"路徑\"],\"I6zLrz\":[\"請在需要透明的方形標誌、帶內建背景的造型方塊、瀏覽器圖示,或預設預覽圖片時使用這些檔案。\"],\"ICsA6P\":[\"您有未儲存的變更\"],\"ID38tA\":[\"示範模式下不提供刪除帳戶。共享示範會另外重設。\"],\"IF9tPu\":[\"何時該用站點匯出、資料庫備份與復原演練。\"],\"IUX7p+\":[\"白色標誌置於 Jant 綠色圓角方塊上,適用於應用程式圖示模擬、觸控圖示、目錄列表及其他需呈現較柔和感受的方形配置。\"],\"IW5PBo\":[\"複製 Token\"],\"IagCbF\":[\"URL\"],\"ImOQa9\":[\"回覆\"],\"J4tAHl\":[\"標題在強調變淡時仍應保持其層級.\"],\"J6bLeg\":[\"新增自訂連結至任意 URL\"],\"JL7LF5\":[\"可用的 CSS 變數、data attributes,以及範例。\"],\"JTviaO\":[\"管理登入安全, 匯出, 以及無法復原的操作.\"],\"JYj5R2\":[\"瀏覽檔案\"],\"JcD7qf\":[\"更多操作\"],\"JjX0OO\":[\"請立即複製您的 token — 之後不會再顯示。\"],\"JuN5GC\":[\"未選取任何檔案。請選擇要上傳的檔案。\"],\"KOqvXP\":[\"請勿變更顏色、拉伸、旋轉、描邊或對標誌新增任何效果。\"],\"KbS2K9\":[\"重設密碼\"],\"KdSsVl\":[\"作者 (選填)\"],\"Khu3PV\":[\"發布設定\"],\"KiJn9B\":[\"筆記\"],\"KlZ+t+\":[\"%name% + 還有 %count% 個\"],\"KsvRin\":[\"從 Latest 隱藏\"],\"KuCcWu\":[\"顯示於所有文章與頁面的底部。支援 Markdown.\"],\"KzmC5L\":[\"控制項\"],\"L0gres\":[\"其餘項目會被收納到 ··· 選單\"],\"L4t4/q\":[\"3 月 14 日\"],\"L7svJg\":[\"閱讀\"],\"Lbkbwy\":[\"用於評估強調色在較柔和、引用密集內容上的呈現的引用卡片。\"],\"LcvzvX\":[\"輕觸以重試\"],\"LdyooL\":[\"連結\"],\"LkA8jz\":[\"新增替代文字\"],\"LxRg6f\":[\"即時主題控制\"],\"M/haSd\":[\"始終顯示主題的淺色版本。\"],\"M2kIWU\":[\"字型主題\"],\"M4tzVU\":[\"最新貼文\"],\"M6CbAU\":[\"切換編輯面板\"],\"M8kJqa\":[\"草稿\"],\"MHrjPM\":[\"標題\"],\"MILa7n\":[\"方形磁貼\"],\"MSc/Yq\":[\"您要發佈變更還是捨棄它們?\"],\"MXSt4t\":[\"建立於 \",[\"0\"]],\"Mc7+6G\":[\"請輸入以 http://、https:// 或 mailto: 開頭的有效 URL。\"],\"MdMyne\":[\"來源連結(選填)\"],\"MiMY3Q\":[\"Apple 觸控圖示\"],\"MiyoI7\":[\"預設筆記範例\"],\"MqghUt\":[\"搜尋文章...\"],\"MrvdXK\":[\"以紙感為先的配色,介面更溫暖,也更有手寫感。\"],\"MtENL9\":[\"調整您的網站外觀、閱讀體驗與執行方式。\"],\"Myqkib\":[\"建立一個選集即可開始。\"],\"N/8NPV\":[\"刪除之前先下載站點匯出。刪除後將無法復原這個帳戶。\"],\"N7UNHY\":[\"Featured feed\"],\"N8UzTV\":[\"則回覆\"],\"NAFbuE\":[\"搜尋片段\"],\"NH9Z1R\":[\"從這裡開始\"],\"NHnUHF\":[\"Favicon 與您標頭上的個人標記\"],\"NU2Fqi\":[\"儲存 CSS\"],\"NhHXCr\":[\"自訂 URL 路徑(不含前導斜線)\"],\"Nldjdr\":[\"尚未有自訂網址。建立一個來新增轉址或為文章設定自訂路徑。\"],\"NqsRbb\":[\"Jant 標誌\"],\"O1367B\":[\"所有選集\"],\"O3oNi5\":[\"電子郵件\"],\"OEdMhi\":[\"最好的預設顏色是那種只有閱讀一段時間後才會注意到的顏色。\"],\"OEt/to\":[\"使用指引\"],\"OJxdgi\":[\"將這個連結控制在 200 個字元以內。\"],\"OSJXFg\":[\"套用到整個網站,包括管理頁面。先選擇配色,再決定要依系統顯示還是固定模式。\"],\"OaoJcz\":[\"社群預覽\"],\"OmfDbR\":[\"網站強調色\"],\"Ovks1h\":[\"較柔和的藍色感覺更像墨水,而不是產品的鍍鉻。\"],\"P/sHNL\":[\"在全域變更主題之前,請使用此頁面來評估按鈕、連結、卡片、表單、貼文串強調與低調表面。\"],\"PKhdhq\":[\"頁首顯示的連結數量\"],\"PZ7HJ8\":[\"部落格頭像\"],\"PxJ9W6\":[\"產生 Token\"],\"PxSKQl\":[\"隱藏了 \",[\"0\"],\" 則\"],\"Q2mGA7\":[\"清除篩選\"],\"QBqVyM\":[\"供 iPhone 與 iPad 捷徑使用的主畫面圖示。\"],\"Qgbxdw\":[\"為 Jant 設計更平靜的預設強調色\"],\"Qn9Ao8\":[\"圓形圖塊\"],\"Qnrzvb\":[\"啟用的 API 權杖\"],\"QyDt3L\":[\"檔案已上傳。\"],\"R5CMuK\":[\"Jant 在帶有編輯氣質的點綴下最為出色。按鈕可以保持紮實,但行內強調應該像筆跡,而不是儀表板式的醒目標示。\"],\"R6Z4LE\":[\"下載失敗。請再試一次。\"],\"R8AthW\":[\"分隔線\"],\"R9Khdg\":[\"自動\"],\"RAv3u7\":[\"與主題控制項比較\"],\"ROa4Ti\":[\"供閱讀的介面應該引導視線,而不是不斷搶奪注意力。\"],\"RdmNnl\":[\"瀏覽器分頁\"],\"RfGczC\":[\"方形標誌\"],\"Rj01Fz\":[\"連結\"],\"RxsRD6\":[\"時區\"],\"S37om9\":[\"包含資源\"],\"S8NCfs\":[\"儲存到草稿,稍後可編輯並發佈。\"],\"SJGVAw\":[\"帶有編輯風格,稍微低調。\"],\"SJmfuf\":[\"網站名稱\"],\"SKZhW9\":[\"權杖名稱\"],\"SaNhJE\":[\"感覺更有意圖,而不是黯淡無光。\"],\"SpTWH3\":[\"下載 SVG\"],\"SvRuJt\":[\"介面語氣的實地筆記\"],\"T/R+Qz\":[\"主色\"],\"TNZKpI\":[\"危險\"],\"TWt5I9\":[\"還有 \",[\"hiddenCount\"],\" 則 \",[\"0\"]],\"TvaTxw\":[\"不會出現在 Latest 中,但仍會出現在你加入的 Collection 裡。\"],\"Tz0i8g\":[\"設定\"],\"UIMXHD\":[\"移除分隔線\"],\"UaZwcz\":[\"建立後還可設定更多選項。\"],\"Uc5y7o\":[\"為網站、檔案、目錄與編輯版面選擇標準標誌。\"],\"Uj/btJ\":[\"在我的網站標頭顯示頭像\"],\"UxKoFf\":[\"導覽\"],\"V18SVO\":[\"在淺色背景上使用標誌。\"],\"V4WsyL\":[\"新增連結\"],\"V5pZwT\":[\"搜尋設定已更新。\"],\"VCA6B2\":[\"這些是真正的動態內容元件,具有實際的頁腳、摘要與行內連結。請使用此區段來判斷主題套用到實際內容後是否仍然感覺沉穩。\"],\"VhMDMg\":[\"變更密碼\"],\"Vn3jYy\":[\"導覽項目\"],\"VoZYGU\":[\"這將永久刪除你所有的資料 — 文章、媒體檔案、選集、設定,以及你的帳戶。你的部落格將會重設為初始設定狀態。此操作無法復原。\"],\"WCOanD\":[\"此參考很有用,因為它將連結與引文視為閱讀節奏的一部分。 在調整時請記住這一點\"],\"WbIbzR\":[\"正在檢查連結...\"],\"WcWS//\":[\"下載檔案\"],\"Weq9zb\":[\"一般\"],\"WhsN3P\":[\"在 Jant 中,一個好的預設重點應該感覺像編輯結構,而不是產品品牌化。這表示連結、強調與貼文串提示可以可見,而不會把頁面變成 UI 裝飾。\"],\"Wi9i06\":[\"依每位訪客的系統偏好顯示。\"],\"Wn+/rH\":[\"透明方形\"],\"WpXcBJ\":[\"這裡還沒有內容。\"],\"X+8FMk\":[\"目前的密碼不符。請再試一次。\"],\"X1G9eY\":[\"導覽預覽\"],\"XU7b+L\":[\"主要標誌檔案\"],\"XV1mAn\":[\"僅登入後可見。\"],\"XrnWzN\":[\"已發佈!\"],\"Y/F35r\":[\"使用 curl 建立貼文:\"],\"Y6hOOP\":[\"已於 \",[\"0\"],\" 登入\"],\"YF6zHf\":[\"網站設定已更新。\"],\"YIix5Y\":[\"搜尋...\"],\"YSCkGF\":[\"頁首 RSS 會指向你的 %feed% feed(/feed)。可在一般設定中修改 /feed 的輸出內容。\"],\"YUglt2\":[\"正在產生連結...\"],\"YXiA6e\":[\"主要按鈕\"],\"Ygx3Yl\":[\"用於分頁與書籤的小型瀏覽器圖示。\"],\"Z6NwTi\":[\"儲存為草稿\"],\"ZGs2so\":[\"要永久刪除此選集嗎?裡面的貼文不會被刪除。\"],\"ZQKLI1\":[\"危險區域\"],\"ZV5ykW\":[\"下載 PNG\"],\"ZhhOwV\":[\"引用\"],\"ZiooJI\":[\"API 權杖\"],\"Zm7Qb0\":[\"備份與復原指南\"],\"ZmSeP+\":[\"要儲存為草稿嗎?\"],\"ZmUkwN\":[\"新增自訂連結至導覽列\"],\"a14mj8\":[\"未知裝置\"],\"a3LDKx\":[\"安全性\"],\"a5j82I\":[\"沒有選集符合這次搜尋。試試其他名稱。\"],\"aAIQg2\":[\"外觀\"],\"aFkzVF\":[\"目標貼文或選集的 URL slug\"],\"aHTB7P\":[\"附加於您的貼文的補充內容\"],\"aMEyv0\":[\"保持穩健且易讀.\"],\"aN6wx0\":[\"精選裡還沒有內容。將貼文標記為精選後,就會顯示在這裡。\"],\"aYpXKS\":[\"並檢查該強調色是在引導注意力還是過於搶眼。\"],\"af+9p6\":[\"低調中繼資料\"],\"alKG0+\":[\"字型主題\"],\"an5hVd\":[\"圖片\"],\"anibOb\":[\"關於本部落格\"],\"any7NR\":[\"主題指南\"],\"auFlOr\":[\"圖示與預覽\"],\"avuFKG\":[\"個貼文串\"],\"b+/jO6\":[\"301 (永久)\"],\"bFpC86\":[\"一次下載所有內容\"],\"bHOiy1\":[\"示範模式下不提供密碼變更。請使用共享的示範憑證登入。\"],\"bHYIks\":[\"登出\"],\"bfCbdi\":[\"目前貼文\"],\"bkBJmZ\":[\"這在檢查顏色時很有用,因為它把重點色放在引文樣式、摘要資料和較為低調的解釋段落旁。將它和原先的比較\"],\"bmrL08\":[\"示範模式下會隱藏工作階段、密碼變更和刪除帳戶。匯出仍可使用。\"],\"bzSI52\":[\"放棄\"],\"c2JRUS\":[\"自動生成\"],\"c3MN2z\":[\"所有可用的端點和請求格式.\"],\"cFpd0L\":[\"克制中性色\"],\"cIoW7X\":[\"行內連結\"],\"cSDy01\":[\"自訂 CSS 已更新。\"],\"cTUByn\":[\"由新到舊\"],\"cb7FR8\":[\"白色 logo 放在 Jant 綠色方形圖塊上,適用於需要真正從邊到邊方形的平台與版面配置。\"],\"ccaIM9\":[\"更多連結\"],\"cgmi4V\":[\"刪除草稿\"],\"clzoNp\":[\"始終顯示主題的深色版本。\"],\"cnGeoo\":[\"刪除\"],\"d+F4pf\":[\"圖片應該安靜地置於文章中,而不是讓人感覺像卡片預覽。\"],\"d/o/BH\":[\"無法發布。已儲存為草稿。\"],\"d3FRkY\":[\"無法複製,請再試一次。\"],\"dD7NPy\":[\"外框\"],\"dEgA5A\":[\"取消\"],\"dTXUY+\":[\"確認刪除帳號\"],\"dUsGbd\":[\"恰到好處的裝飾應融入文字,直到需要時才顯現。\"],\"dXoieq\":[\"摘要\"],\"dYKrp3\":[\"從 Latest 隱藏\"],\"dbUuAj\":[\"會出現在 Latest 中。\"],\"dk7TCH\":[\"永久刪除所有資料並重設部落格\"],\"e/tSI5\":[\"導覽排序已更新。\"],\"ePK91l\":[\"編輯\"],\"eWLklq\":[\"引用\"],\"ebQKK7\":[\"網站\"],\"egK+Yy\":[\"用於腳本與自動化的 Bearer 權杖\"],\"ehj/zN\":[\"重新導向類型\"],\"eneWvv\":[\"草稿\"],\"f+m8jj\":[\"訂閱源 URL 已複製。\"],\"f4MAoA\":[\"部分上傳失敗。已儲存為草稿。\"],\"f5s9EI\":[\"按 N 開始寫作\"],\"f6Hub0\":[\"排序\"],\"f8fH8W\":[\"設計\"],\"fFDkGR\":[\"工作階段、密碼與匯出\"],\"fKrDxS\":[\"品牌圖塊\"],\"fMPkxb\":[\"顯示更多\"],\"fqDzSu\":[\"評分\"],\"fttd2R\":[\"我的選集\"],\"gFdWl+\":[\"一篇長篇文章範例,用於在真實閱讀情境中檢查預設調色盤。\"],\"gNKz6Z\":[\"選集已刪除。\"],\"gXH9r/\":[\"開啟原始 PNG 檔案\"],\"gj52YE\":[\"此選集為空。請從編輯器新增貼文。\"],\"gpaPhA\":[\"協助螢幕閱讀器描述圖片\"],\"gtQsRO\":[\"建立自訂網址\"],\"h5RcXU\":[\"Post hidden\"],\"hBO/y4\":[\"安全權杖已過期。請重新整理頁面後再試一次。\"],\"hDRU5q\":[\"找到 \",[\"0\"],\" 筆結果\"],\"hGmyDl\":[\"權杖讓你不必登入,也能從腳本、捷徑和其他工具存取 API。\"],\"hLlWo5\":[\"幾項簡單規則.\"],\"hXzOVo\":[\"下一頁\"],\"he3ygx\":[\"複製\"],\"heSQoS\":[\"貼上網址...\"],\"i0qMbr\":[\"首頁\"],\"i0vDGK\":[\"排序方式\"],\"i5+Y7d\":[\"下載官方 Jant 標誌、圖示與預覽檔案。\"],\"i6nDCI\":[\"請選擇新密碼.\"],\"iEUzMn\":[\"系統\"],\"iG7KNr\":[\"標誌\"],\"iH8pgl\":[\"返回\"],\"iVOMRi\":[\"首頁設定已更新。\"],\"icZdbX\":[\"尚未歸入已命名分組的主題。\"],\"ilSmIt\":[\"銳利邊緣\"],\"iu7tUI\":[\"麵包屑導覽\"],\"j4VrG6\":[\"下載匯出 ZIP\"],\"j5nQL2\":[\"例如 iOS Shortcuts\"],\"jAXE5p\":[\"反白標誌\"],\"jAqB/k\":[\"私密發布\"],\"jO813m\":[\"更多配色\"],\"jQflRT\":[\"這會使用真實的單篇文章詳細呈現,示例包含較長的文章、內嵌圖片、表格、列表、引用和程式碼。內容欄位維持與正式網站相同的寬度。\"],\"jUV7CU\":[\"上傳頭像\"],\"jVUmOK\":[\"支援 Markdown\"],\"jd+8Mm\":[\"社群預覽圖片\"],\"jfaqmf\":[\"關閉後,首頁會先顯示你的最新貼文。\"],\"jgBjXJ\":[\"撤銷此權杖?任何使用它的腳本將會停止運作。\"],\"ji7oVU\":[\"編輯貼文\"],\"jpctdh\":[\"檢視\"],\"jvtP25\":[\"在線程中 →\"],\"jvyYZG\":[\"在想什麼...\"],\"k1ifdL\":[\"處理中...\"],\"k3Iw35\":[\"在標準綠色版本對比度不足時,改用白色標誌。\"],\"kMXclu\":[\"下載站點匯出\"],\"kNiQp6\":[\"已釘選\"],\"kPMIr+\":[\"為連結加上標題...\"],\"kVQs7s\":[\"細緻樣式覆寫\"],\"ke1gWS\":[\"自訂 URL\"],\"kfcRb0\":[\"頭像\"],\"kj6ppi\":[\"項目\"],\"kr39oD\":[\"還沒有選集。建立一個選集,依主題整理貼文。\"],\"kzvWob\":[\"連結到文章歸檔頁\"],\"lLW3vJ\":[\"目標網址別名\"],\"laT1IJ\":[\"iOS 主畫面\"],\"lb+Xwx\":[\"自訂連結\"],\"m16xKo\":[\"新增\"],\"mDyWuM\":[\"暖調編輯風\"],\"mKT7g0\":[\"文字附件\"],\"mSNmrX\":[\"列出貼文:\"],\"mc/vLq\":[\"這個連結已被佔用。換一個試試。\"],\"n1ekoW\":[\"登入\"],\"n6QD94\":[\"由舊到新\"],\"nFukaP\":[\"電子郵件或密碼錯誤。請檢查您的登入資訊後重試。\"],\"nK07ni\":[\"為你的網站選擇一種排版方向。每個主題都會同時改變字型搭配與閱讀節奏。\"],\"nV6twc\":[\"整理\"],\"nd8Puv\":[\"白色標誌置於 Jant 綠色圓形,適用於個人資料圖片、徽章及其他需要即用圓形配置的情境。\"],\"ndrEYW\":[\"當強調色更溫暖一點、也沒那麼直白時,整頁會更像寫作空間,而不是產品介面。\"],\"o/vNDE\":[\"可讓你覆寫任何主題變數。\"],\"o21Y+P\":[\"項目\"],\"oKOOsY\":[\"色彩主題\"],\"oSiRP0\":[\"系統連結\"],\"ode0+L\":[\"主題範例\"],\"ovBPCi\":[\"預設\"],\"p1Z67P\":[\"當 primary 太僵硬時,整個頁面讀起來像產品介面,而非寫作空間。\"],\"p2/GCq\":[\"確認密碼\"],\"pB0OKE\":[\"新增分隔線\"],\"pBHx39\":[\"深色背景\"],\"pVrU5x\":[\"如果這一頁顯得太有品牌姿態,最先該收一收的是預設主題的網站強調色,而不是邊框或正文顏色。\"],\"pZq3aX\":[\"上傳失敗。請再試一次。\"],\"psoxDF\":[\"該字型主題不可用。請選擇其他一個。\"],\"pvnfJD\":[\"深色\"],\"q+hNag\":[\"選集\"],\"q5YRzz\":[\"顏色檢查\"],\"q8RviX\":[\"有標題\"],\"qiN9NB\":[\"表面\"],\"qt89I8\":[\"草稿已儲存。\"],\"quvfGs\":[\"而不是把它當作孤立的色票來評斷。\"],\"rA2TFI\":[\"切換色盤與模式,無需開啟設定或變更啟用中的網站主題。\"],\"rFmBG3\":[\"色彩主題\"],\"rdUucN\":[\"預覽\"],\"rlonmB\":[\"無法刪除. 請稍後再試.\"],\"s8G5Or\":[\"This upload would exceed your shared hosted media limit. Remove files or upgrade storage to continue.\"],\"s9gHf5\":[\"my-post-link\"],\"sER+bs\":[\"檔案\"],\"satWc6\":[\"主 RSS feed\"],\"sgr2wQ\":[\"個選集\"],\"slujBW\":[\"只能使用小寫字母、數字和連字號。\"],\"sxkWRg\":[\"進階\"],\"syiAKf\":[\"筆記樣式\"],\"t/YqKh\":[\"移除\"],\"t42hIC\":[\"大多數人需要的東西都在同一個 ZIP 檔案中。\"],\"tCctex\":[\"品牌套件包含 SVG 標誌、透明方形 PNG、圓角、方形與圓形圖塊、favicon、Apple touch icon,以及預設的社交預覽圖片。\"],\"tKlWWY\":[\"表情符號\"],\"tSWVu5\":[\"發佈於 \",[\"date\"],\" \",[\"time\"]],\"tbSs3k\":[\"鮮明氛圍\"],\"tfDRzk\":[\"儲存\"],\"u1VTd3\":[\"調色盤、表面色調與整體氛圍\"],\"u3wRF+\":[\"已發佈\"],\"u6KOjV\":[\"想自訂得更細?\"],\"ui6aMF\":[\"這些裝置目前已登入您的帳戶。撤銷任何您不認識的工作階段。\"],\"uowbPn\":[\"Remove attachment\"],\"v3E8iS\":[\"實用檢查清單\"],\"vBEKwo\":[\"在這裡管理這個站點的目前工作階段。密碼和託管站點存取權限都透過 \",[\"providerLabel\"],\" 管理。\"],\"vRldcl\":[\"字體選擇與閱讀質感\"],\"vSJd18\":[\"影片\"],\"vSYKYI\":[\"主 feed\"],\"vTuib7\":[\"這會控制 /feed 要回傳哪一種 feed。\"],\"vXCC6J\":[\"有些地方看起來不對。請檢查表單並再試一次。\"],\"vXIe7J\":[\"語言\"],\"vdFnYM\":[\"重設連結\"],\"vgpfCi\":[\"儲存草稿\"],\"vmQmHx\":[\"新增自訂 CSS 以覆寫任何樣式。使用像 [data-page], [data-post], [data-format] 的資料屬性來針對特定元素。\"],\"vpSPA1\":[\"驗證祕鑰遺失。請檢查您的環境變數。\"],\"vzU4k9\":[\"新增選集\"],\"vzX5FB\":[\"刪除帳號\"],\"w0Emel\":[\"建議連結\"],\"w6mlns\":[\"文章詳細頁面\"],\"w8Rv8T\":[\"標籤為必填\"],\"wJ+GRy\":[\"全部可見性\"],\"wL3cK8\":[\"最新\"],\"wPmHHc\":[\"安靜的介面應讓文字先說話。\"],\"wc+17X\":[\"/* 在此放入自訂 CSS */\"],\"wja8aL\":[\"無標題\"],\"wlnK1t\":[\"一個 ZIP 檔,內含主標誌、反向標誌、方形 PNG、圓角、方形及圓形圖示,另外還有 favicon、Apple touch icon 與社群預覽圖像。\"],\"wm3Zlr\":[\"所有年份\"],\"wuLtXn\":[\"目前沒有活動中的工作階段。已登入的裝置會顯示在這裡。\"],\"xCWek4\":[\"檔案儲存尚未設定。請檢查您的伺服器設定。\"],\"xVrkxi\":[\"低調設計\"],\"xVvw1i\":[\"此重設連結已不再有效。請申請新的連結以繼續。\"],\"xYilR2\":[\"媒體\"],\"xbN8dp\":[\"柔和的顏色也該保有清晰的閱讀節奏。\"],\"xeiujy\":[\"文字\"],\"xhTx3y\":[\"大多數版位請選擇標準 logo,需要更高對比時請使用反白 logo。\"],\"y28hnO\":[\"發佈\"],\"y2o/Y0\":[\"此連結已過期\"],\"y8Md/V\":[\"語言和時間已更新。\"],\"yNCqOt\":[\"Latest feed\"],\"yQ2kGp\":[\"載入更多\"],\"yQ3kNF\":[\"請輸入以下字句以確認:\"],\"ycM1Xg\":[\"沒有結果。請嘗試不同的關鍵字。\"],\"yjjCV8\":[\"固定 feed 連結\"],\"yjkELF\":[\"確認新密碼\"],\"ylo1I0\":[\"上次使用於 \",[\"0\"]],\"ynMAhG\":[\"預設標誌\"],\"yzF66j\":[\"連結\"],\"z8ajIE\":[\"找到 1 個結果\"],\"zBFr9G\":[\"貼上長文章、AI 回覆或任何文字...\\n\\nMarkdown 格式會被保留.\"],\"zJDAbh\":[\"不儲存\"],\"zXH2jX\":[\"語言與時間\"],\"zcDmsG\":[\"精選貼文\"],\"zoK+eO\":[\"先補上標題,再發佈這則連結。\"],\"zwBp5t\":[\"私密\"],\"zxRN6H\":[\"頁首連結、首頁檢視與溢出選單\"]}")as Messages;
package/src/index.ts CHANGED
@@ -25,11 +25,14 @@ export type {
25
25
  Setting,
26
26
  CreatePost,
27
27
  UpdatePost,
28
+ PostAttachmentInput,
29
+ TextAttachmentContent,
28
30
  CreateNavItem,
29
31
  UpdateNavItem,
30
32
  CreateCollection,
31
33
  UpdateCollection,
32
34
  AppConfig,
35
+ TextAttachmentContentFormat,
33
36
  // View Model types
34
37
  PostView,
35
38
  MediaView,
@@ -55,6 +58,7 @@ export {
55
58
  NAV_ITEM_TYPES,
56
59
  MAX_MEDIA_ATTACHMENTS,
57
60
  MAX_PINNED_POSTS,
61
+ TEXT_ATTACHMENT_CONTENT_FORMATS,
58
62
  MEDIA_KINDS,
59
63
  } from "./types.js";
60
64
 
@@ -0,0 +1,54 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ ASSET_BASE_PATH,
4
+ getPublicAssetBasePath,
5
+ isAssetPath,
6
+ toAssetPath,
7
+ toPublicAssetPath,
8
+ } from "../asset-path.js";
9
+
10
+ describe("getPublicAssetBasePath", () => {
11
+ it("uses the root asset path when the site has no prefix", () => {
12
+ expect(getPublicAssetBasePath("")).toBe("/_assets");
13
+ });
14
+
15
+ it("includes the site prefix in the public asset path", () => {
16
+ expect(getPublicAssetBasePath("/blog")).toBe("/blog/_assets");
17
+ });
18
+ });
19
+
20
+ describe("toAssetPath", () => {
21
+ it("joins relative asset paths against the internal base path", () => {
22
+ expect(toAssetPath("client.js")).toBe("/_assets/client.js");
23
+ });
24
+
25
+ it("joins relative asset paths against a prefixed public base path", () => {
26
+ expect(toAssetPath("chunks/app.js", "/blog/_assets")).toBe(
27
+ "/blog/_assets/chunks/app.js",
28
+ );
29
+ });
30
+ });
31
+
32
+ describe("isAssetPath", () => {
33
+ it("matches the internal asset namespace", () => {
34
+ expect(isAssetPath("/_assets/client.css")).toBe(true);
35
+ });
36
+
37
+ it("matches prefixed public asset namespaces", () => {
38
+ expect(isAssetPath("/blog/_assets/client.css", "/blog/_assets")).toBe(true);
39
+ });
40
+ });
41
+
42
+ describe("toPublicAssetPath", () => {
43
+ it("rewrites internal asset paths to the public asset base path", () => {
44
+ expect(
45
+ toPublicAssetPath(`${ASSET_BASE_PATH}/client.js`, "/blog/_assets"),
46
+ ).toBe("/blog/_assets/client.js");
47
+ });
48
+
49
+ it("leaves already-public asset paths unchanged", () => {
50
+ expect(toPublicAssetPath("/blog/_assets/client.js", "/blog/_assets")).toBe(
51
+ "/blog/_assets/client.js",
52
+ );
53
+ });
54
+ });
@@ -3,7 +3,10 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect } from "vitest";
6
- import { blurhashToDataUrl } from "../blurhash-placeholder.js";
6
+ import {
7
+ blurhashToDataUrl,
8
+ getBlurhashDecodeSize,
9
+ } from "../blurhash-placeholder.js";
7
10
 
8
11
  describe("blurhashToDataUrl", () => {
9
12
  // A known valid blurhash string
@@ -72,4 +75,25 @@ describe("blurhashToDataUrl", () => {
72
75
  const url2 = blurhashToDataUrl("LGF5]+Yk^6#M@-5c,1J5@[or[Q6.");
73
76
  expect(url1).not.toBe(url2);
74
77
  });
78
+
79
+ it("keeps landscape blurhash placeholders aligned with source aspect ratio", () => {
80
+ expect(getBlurhashDecodeSize(1600, 900)).toEqual({
81
+ width: 16,
82
+ height: 9,
83
+ });
84
+ });
85
+
86
+ it("keeps portrait blurhash placeholders aligned with source aspect ratio", () => {
87
+ expect(getBlurhashDecodeSize(900, 1600)).toEqual({
88
+ width: 9,
89
+ height: 16,
90
+ });
91
+ });
92
+
93
+ it("falls back to the default blurhash decode size when media size is missing", () => {
94
+ expect(getBlurhashDecodeSize()).toEqual({
95
+ width: 4,
96
+ height: 3,
97
+ });
98
+ });
75
99
  });
@@ -0,0 +1,45 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ isRatingSortOrder,
4
+ resolveCollectionSortOrder,
5
+ supportsCollectionRatingSort,
6
+ } from "../collection-sort.js";
7
+
8
+ describe("isRatingSortOrder", () => {
9
+ it("returns true for rating-based sort orders", () => {
10
+ expect(isRatingSortOrder("rating_desc")).toBe(true);
11
+ });
12
+
13
+ it("returns false for time-based sort orders", () => {
14
+ expect(isRatingSortOrder("newest")).toBe(false);
15
+ expect(isRatingSortOrder("oldest")).toBe(false);
16
+ });
17
+ });
18
+
19
+ describe("supportsCollectionRatingSort", () => {
20
+ it("requires at least two rated posts", () => {
21
+ expect(supportsCollectionRatingSort(0)).toBe(false);
22
+ expect(supportsCollectionRatingSort(1)).toBe(false);
23
+ expect(supportsCollectionRatingSort(2)).toBe(true);
24
+ });
25
+ });
26
+
27
+ describe("resolveCollectionSortOrder", () => {
28
+ it("uses the collection default when no query override exists", () => {
29
+ expect(resolveCollectionSortOrder(undefined, "oldest", false)).toBe(
30
+ "oldest",
31
+ );
32
+ });
33
+
34
+ it("keeps rating sort when the collection supports it", () => {
35
+ expect(resolveCollectionSortOrder("rating_desc", "newest", true)).toBe(
36
+ "rating_desc",
37
+ );
38
+ });
39
+
40
+ it("falls back to newest when rating sort is unavailable", () => {
41
+ expect(resolveCollectionSortOrder(undefined, "rating_desc", false)).toBe(
42
+ "newest",
43
+ );
44
+ });
45
+ });
@@ -9,6 +9,7 @@ describe("RESERVED_PATHS", () => {
9
9
  expect(RESERVED_PATHS).toContain("signin");
10
10
  expect(RESERVED_PATHS).toContain("search");
11
11
  expect(RESERVED_PATHS).toContain("c");
12
+ expect(RESERVED_PATHS).toContain("_assets");
12
13
  });
13
14
  });
14
15
 
@@ -13,7 +13,7 @@ describe("FAVICON_SIZES", () => {
13
13
  });
14
14
 
15
15
  it("has correct apple-touch-icon size", () => {
16
- expect(FAVICON_SIZES.APPLE_TOUCH).toBe(180);
16
+ expect(FAVICON_SIZES.APPLE_TOUCH).toBe(512);
17
17
  });
18
18
  });
19
19
 
@@ -0,0 +1,147 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { defaultAtomRenderer, defaultRssRenderer } from "../feed.js";
3
+ import type { FeedData, FeedPostView } from "../../types.js";
4
+
5
+ function makePostView(overrides: Partial<FeedPostView> = {}): FeedPostView {
6
+ return {
7
+ id: "post-1",
8
+ permalink: "/post-1",
9
+ slug: "post-1",
10
+ format: "note",
11
+ status: "published",
12
+ visibility: "public",
13
+ pinned: false,
14
+ featured: false,
15
+ publishedAt: "2026-03-19T00:00:00.000Z",
16
+ publishedAtFormatted: "Mar 19, 2026",
17
+ publishedAtTime: "00:00",
18
+ publishedAtRelative: "now",
19
+ updatedAt: "2026-03-19T00:00:00.000Z",
20
+ media: [],
21
+ collections: [],
22
+ isLastInThread: true,
23
+ ...overrides,
24
+ };
25
+ }
26
+
27
+ function makeFeedData(post: FeedPostView): FeedData {
28
+ return {
29
+ siteName: "Jant",
30
+ siteDescription: "Thoughts, links, and quotes — one post at a time",
31
+ siteUrl: "https://example.com",
32
+ siteLanguage: "en",
33
+ selfUrl: "https://example.com/feed/atom.xml",
34
+ posts: [post],
35
+ };
36
+ }
37
+
38
+ describe("feed renderers", () => {
39
+ it("keeps Atom entry titles empty for untitled posts and strips script tags from content", () => {
40
+ const atomXml = defaultAtomRenderer(
41
+ makeFeedData(
42
+ makePostView({
43
+ title: undefined,
44
+ summary: "哈哈哈😍",
45
+ excerpt: "哈哈哈😍",
46
+ bodyHtml:
47
+ '<p>哈哈哈😍</p><script type="application/json" data-jant-meta>{"kind":"text"}</script>',
48
+ }),
49
+ ),
50
+ );
51
+ const rssXml = defaultRssRenderer(
52
+ makeFeedData(
53
+ makePostView({
54
+ title: undefined,
55
+ summary: "哈哈哈😍",
56
+ excerpt: "哈哈哈😍",
57
+ bodyHtml:
58
+ '<p>哈哈哈😍</p><script type="application/json" data-jant-meta>{"kind":"text"}</script>',
59
+ }),
60
+ ),
61
+ );
62
+
63
+ expect(atomXml).toContain("<title></title>");
64
+ expect(atomXml).toContain('<summary type="text">哈哈哈😍</summary>');
65
+ expect(atomXml).toContain("<![CDATA[<p>哈哈哈😍</p>]]>");
66
+ expect(atomXml).not.toContain("data-jant-meta");
67
+ expect(atomXml).not.toContain('{"kind":"text"}');
68
+ expect(rssXml).not.toContain("<title><![CDATA[哈哈哈😍]]></title>");
69
+ expect(rssXml).not.toContain("data-jant-meta");
70
+ });
71
+
72
+ it("does not double-escape RSS titles inside CDATA", () => {
73
+ const xml = defaultRssRenderer(
74
+ makeFeedData(
75
+ makePostView({
76
+ title: "Tom & Jerry",
77
+ bodyHtml: "<p>Cartoon chaos</p>",
78
+ }),
79
+ ),
80
+ );
81
+
82
+ expect(xml).toContain("<title><![CDATA[Tom & Jerry]]></title>");
83
+ expect(xml).not.toContain("<title><![CDATA[Tom &amp; Jerry]]></title>");
84
+ });
85
+
86
+ it("does not expose quote attribution as feed title", () => {
87
+ const atomXml = defaultAtomRenderer(
88
+ makeFeedData(
89
+ makePostView({
90
+ format: "quote",
91
+ title: "Marcus Aurelius",
92
+ url: "https://example.com/meditations",
93
+ quoteText: "What stands in the way becomes the way.",
94
+ summary: undefined,
95
+ excerpt: undefined,
96
+ }),
97
+ ),
98
+ );
99
+ const rssXml = defaultRssRenderer(
100
+ makeFeedData(
101
+ makePostView({
102
+ format: "quote",
103
+ title: "Marcus Aurelius",
104
+ url: "https://example.com/meditations",
105
+ quoteText: "What stands in the way becomes the way.",
106
+ summary: undefined,
107
+ excerpt: undefined,
108
+ }),
109
+ ),
110
+ );
111
+
112
+ expect(atomXml).toContain("<title></title>");
113
+ expect(atomXml).toContain(
114
+ '<summary type="text">What stands in the way becomes the way.</summary>',
115
+ );
116
+ expect(atomXml).toContain("Marcus Aurelius");
117
+ expect(rssXml).not.toContain("<title><![CDATA[Marcus Aurelius]]></title>");
118
+ expect(rssXml).toContain("What stands in the way becomes the way.");
119
+ expect(rssXml).toContain("https://example.com/meditations");
120
+ });
121
+
122
+ it("uses feed-specific timestamps when provided", () => {
123
+ const rssXml = defaultRssRenderer(
124
+ makeFeedData(
125
+ makePostView({
126
+ feedPublishedAt: "2026-03-20T08:30:00.000Z",
127
+ }),
128
+ ),
129
+ );
130
+ const atomXml = defaultAtomRenderer(
131
+ makeFeedData(
132
+ makePostView({
133
+ feedPublishedAt: "2026-03-20T08:30:00.000Z",
134
+ feedUpdatedAt: "2026-03-20T09:45:00.000Z",
135
+ }),
136
+ ),
137
+ );
138
+
139
+ expect(rssXml).toContain(
140
+ "<pubDate>Fri, 20 Mar 2026 08:30:00 GMT</pubDate>",
141
+ );
142
+ expect(atomXml).toContain(
143
+ "<published>2026-03-20T08:30:00.000Z</published>",
144
+ );
145
+ expect(atomXml).toContain("<updated>2026-03-20T09:45:00.000Z</updated>");
146
+ });
147
+ });
@@ -0,0 +1,106 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { createHostedControlPlaneClient } from "../hosted-control-plane.js";
3
+
4
+ describe("createHostedControlPlaneClient", () => {
5
+ it("returns null outside host-based mode", () => {
6
+ expect(
7
+ createHostedControlPlaneClient({
8
+ HOSTED_CONTROL_PLANE_BASE_URL: "https://cloud-jant.localtest.me",
9
+ HOSTED_CONTROL_PLANE_INTERNAL_TOKEN: "internal-token-123456",
10
+ SITE_RESOLUTION_MODE: "single-site",
11
+ }),
12
+ ).toBeNull();
13
+ });
14
+
15
+ it("posts site metadata to the hosted control plane", async () => {
16
+ const fetchMock = vi.fn(async () => new Response(null, { status: 204 }));
17
+ const client = createHostedControlPlaneClient(
18
+ {
19
+ HOSTED_CONTROL_PLANE_BASE_URL: "https://cloud-jant.localtest.me",
20
+ HOSTED_CONTROL_PLANE_INTERNAL_BASE_URL: "http://127.0.0.1:3300",
21
+ HOSTED_CONTROL_PLANE_INTERNAL_TOKEN: "internal-token-123456",
22
+ SITE_RESOLUTION_MODE: "host-based",
23
+ },
24
+ fetchMock as unknown as typeof fetch,
25
+ );
26
+
27
+ expect(client).not.toBeNull();
28
+ await client?.syncSiteMetadata({
29
+ avatarUrl: "https://assets.example.com/site-avatar.webp",
30
+ coreSiteId: "sit_123",
31
+ displayName: "Updated Site",
32
+ });
33
+
34
+ expect(fetchMock).toHaveBeenCalledWith(
35
+ "http://127.0.0.1:3300/api/internal/core-sites/sit_123/metadata",
36
+ expect.objectContaining({
37
+ body: JSON.stringify({
38
+ avatarUrl: "https://assets.example.com/site-avatar.webp",
39
+ coreSiteId: "sit_123",
40
+ displayName: "Updated Site",
41
+ }),
42
+ headers: expect.objectContaining({
43
+ Authorization: "Bearer internal-token-123456",
44
+ "Content-Type": "application/json",
45
+ }),
46
+ method: "POST",
47
+ }),
48
+ );
49
+ });
50
+
51
+ it("posts hosted media quota checks to the control plane", async () => {
52
+ const fetchMock = vi.fn(
53
+ async () =>
54
+ new Response(
55
+ JSON.stringify({
56
+ allowed: true,
57
+ limitBytes: 50,
58
+ remainingBytes: 40,
59
+ usedBytes: 10,
60
+ }),
61
+ {
62
+ status: 200,
63
+ headers: {
64
+ "Content-Type": "application/json",
65
+ },
66
+ },
67
+ ),
68
+ );
69
+ const client = createHostedControlPlaneClient(
70
+ {
71
+ HOSTED_CONTROL_PLANE_BASE_URL: "https://cloud-jant.localtest.me",
72
+ HOSTED_CONTROL_PLANE_INTERNAL_BASE_URL: "http://127.0.0.1:3300",
73
+ HOSTED_CONTROL_PLANE_INTERNAL_TOKEN: "internal-token-123456",
74
+ SITE_RESOLUTION_MODE: "host-based",
75
+ },
76
+ fetchMock as unknown as typeof fetch,
77
+ );
78
+
79
+ expect(client).not.toBeNull();
80
+ await expect(
81
+ client?.checkMediaWriteQuota({
82
+ additionalBytes: 25,
83
+ coreSiteId: "sit_123",
84
+ }),
85
+ ).resolves.toEqual({
86
+ allowed: true,
87
+ limitBytes: 50,
88
+ remainingBytes: 40,
89
+ usedBytes: 10,
90
+ });
91
+
92
+ expect(fetchMock).toHaveBeenCalledWith(
93
+ "http://127.0.0.1:3300/api/internal/core-sites/sit_123/media/quota/check",
94
+ expect.objectContaining({
95
+ body: JSON.stringify({
96
+ additionalBytes: 25,
97
+ }),
98
+ headers: expect.objectContaining({
99
+ Authorization: "Bearer internal-token-123456",
100
+ "Content-Type": "application/json",
101
+ }),
102
+ method: "POST",
103
+ }),
104
+ );
105
+ });
106
+ });
@@ -0,0 +1,78 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import {
3
+ getHostedCanonicalRedirect,
4
+ shouldBypassHostedCanonicalRedirect,
5
+ } from "../hosted-domain.js";
6
+ import type { Site, SiteDomain } from "../../types.js";
7
+
8
+ const currentSite: Site = {
9
+ id: "sit_demo",
10
+ key: "demo",
11
+ status: "active",
12
+ createdAt: 0,
13
+ updatedAt: 0,
14
+ };
15
+
16
+ const aliasDomain: SiteDomain = {
17
+ id: "sdom_alias",
18
+ siteId: "sit_demo",
19
+ host: "demo.jant.example",
20
+ pathPrefix: null,
21
+ kind: "alias",
22
+ redirectToPrimary: true,
23
+ createdAt: 0,
24
+ updatedAt: 0,
25
+ };
26
+
27
+ describe("hosted canonical redirects", () => {
28
+ it("bypasses hosted redirects for admin and auth paths", () => {
29
+ expect(
30
+ shouldBypassHostedCanonicalRedirect("/.well-known/jant-domain-check"),
31
+ ).toBe(true);
32
+ expect(shouldBypassHostedCanonicalRedirect("/signin")).toBe(true);
33
+ expect(shouldBypassHostedCanonicalRedirect("/settings/account")).toBe(true);
34
+ expect(shouldBypassHostedCanonicalRedirect("/api/posts")).toBe(true);
35
+ expect(shouldBypassHostedCanonicalRedirect("/archive")).toBe(false);
36
+ });
37
+
38
+ it("redirects alias hosts to the current primary domain for public routes", async () => {
39
+ const getPrimaryDomainForSite = vi.fn(async () => ({
40
+ ...aliasDomain,
41
+ id: "sdom_primary",
42
+ host: "www.demo.example",
43
+ kind: "primary" as const,
44
+ }));
45
+
46
+ const redirectUrl = await getHostedCanonicalRedirect({
47
+ currentSite,
48
+ currentSiteDomain: aliasDomain,
49
+ publicRequestUrl: "https://demo.jant.example/archive?page=2",
50
+ services: {
51
+ site: {
52
+ getPrimaryDomainForSite,
53
+ },
54
+ } as never,
55
+ });
56
+
57
+ expect(getPrimaryDomainForSite).toHaveBeenCalledWith("sit_demo");
58
+ expect(redirectUrl).toBe("https://www.demo.example/archive?page=2");
59
+ });
60
+
61
+ it("does not redirect alias hosts for bypassed routes", async () => {
62
+ const getPrimaryDomainForSite = vi.fn();
63
+
64
+ const redirectUrl = await getHostedCanonicalRedirect({
65
+ currentSite,
66
+ currentSiteDomain: aliasDomain,
67
+ publicRequestUrl: "https://demo.jant.example/settings",
68
+ services: {
69
+ site: {
70
+ getPrimaryDomainForSite,
71
+ },
72
+ } as never,
73
+ });
74
+
75
+ expect(getPrimaryDomainForSite).not.toHaveBeenCalled();
76
+ expect(redirectUrl).toBeNull();
77
+ });
78
+ });