@jant/core 0.3.39 → 0.3.42

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 (1163) hide show
  1. package/README.md +21 -33
  2. package/bin/commands/assets/upload.js +247 -0
  3. package/bin/commands/collections.js +268 -0
  4. package/bin/commands/import-site.js +1169 -343
  5. package/bin/commands/media.js +302 -0
  6. package/bin/commands/migrate-text-attachments.js +183 -0
  7. package/bin/commands/migrate.js +263 -2
  8. package/bin/commands/posts.js +262 -0
  9. package/bin/commands/search.js +53 -0
  10. package/bin/commands/settings.js +93 -0
  11. package/bin/commands/site/export.js +34 -33
  12. package/bin/commands/site/{localize-media.js → pull-media.js} +17 -17
  13. package/bin/lib/d1-query.js +15 -3
  14. package/bin/lib/http-api.js +223 -0
  15. package/bin/lib/media-upload.js +206 -0
  16. package/bin/lib/migration-runner.js +64 -0
  17. package/bin/lib/runtime-target.js +7 -2
  18. package/bin/lib/site-media-parser.js +71 -16
  19. package/bin/lib/site-pull-media.js +698 -0
  20. package/bin/lib/site-snapshot.js +0 -1
  21. package/dist/{app-BfoG98VD.js → app-Cu3lveYI.js} +24017 -23072
  22. package/dist/app-DzCB4yOp.js +5 -0
  23. package/dist/client/.vite/manifest.json +3485 -0
  24. package/dist/client/_assets/chunks/02611a045a7fe83a12014e3debc9f731-BqEDtwXC.woff2 +0 -0
  25. package/dist/client/_assets/chunks/033466ef683afe931f7f520cfb42d928-BluLHEh9.woff2 +0 -0
  26. package/dist/client/_assets/chunks/04b8bde59cff68eeee74fb1914eb09c7-D5j2CLTt.woff2 +0 -0
  27. package/dist/client/_assets/chunks/057a6a98bda7fe57105ddaa99ec82015-DY_AoijT.woff2 +0 -0
  28. package/dist/client/_assets/chunks/05ac821472e235943ed1435e4bb8ecad-CUm8GiH6.woff2 +0 -0
  29. package/dist/client/_assets/chunks/05da12edb9d52210581dc6ec4541031f-BXAOx2XP.woff2 +0 -0
  30. package/dist/client/_assets/chunks/074c1f8483d5a4d8c45c8c5f3e4cbb32-CDqdMQm8.woff2 +0 -0
  31. package/dist/client/_assets/chunks/0968e4861204b51f62a2f8e9f15dd5e0-D5tLgF_8.woff2 +0 -0
  32. package/dist/client/_assets/chunks/0acd1fe2b2ea1ad1bfee7ae1fa139d27-BKK1m412.woff2 +0 -0
  33. package/dist/client/_assets/chunks/0c2ab6b295e55f356f8020d4e7747522-CkCQjQw3.woff2 +0 -0
  34. package/dist/client/_assets/chunks/0c5f9492af03a4fa42c784de94649de1-CQlJqksa.woff2 +0 -0
  35. package/dist/client/_assets/chunks/0d5dec931dc885f07fe5cd5af8bed675-C74x-U_U.woff2 +0 -0
  36. package/dist/client/_assets/chunks/0d9a936885a4c39077438effd3779cbd-Bw0fYF4S.woff2 +0 -0
  37. package/dist/client/_assets/chunks/0e645da524f7cfc0e8c3c03fb2b08428-BVeI_5Th.woff2 +0 -0
  38. package/dist/client/_assets/chunks/0f5e1a18987dbc84ca05188c129e1936-B6_lZ6fE.woff2 +0 -0
  39. package/dist/client/_assets/chunks/1076f0f6f66d28d7a2f16427faad4413-ubiXnD1P.woff2 +0 -0
  40. package/dist/client/_assets/chunks/112743a4ab5fdd1498dfdf2b11336380-B5FzQxTK.woff2 +0 -0
  41. package/dist/client/_assets/chunks/1211f03d3ff5759a702631445793f60e-DDcSiyCt.woff2 +0 -0
  42. package/dist/client/_assets/chunks/12ef1ba76bd20b004b865266a1aa70b3-BwmaD87S.woff2 +0 -0
  43. package/dist/client/_assets/chunks/135e83b403475c5dc9e49b43501a5b84-C5mE_KZS.woff2 +0 -0
  44. package/dist/client/_assets/chunks/1380210a722ac9aeef54005ad7b015c9-CjA-MP82.woff2 +0 -0
  45. package/dist/client/_assets/chunks/13b2c53b30e6a3e4de7132dbc18dbdfc-B9WOB7kv.woff2 +0 -0
  46. package/dist/client/_assets/chunks/147b24c2f08d03bbed30887d4cb3311c-IeeFCJ13.woff2 +0 -0
  47. package/dist/client/_assets/chunks/152395634a207579552f8cb54db88599-C2y2JyNZ.woff2 +0 -0
  48. package/dist/client/_assets/chunks/15d95680dc31cc6ce20e0a5464106dc4-CpD8dqRm.woff2 +0 -0
  49. package/dist/client/_assets/chunks/16663e567f81f4725a1522f37e18f71f-BNoxS9pQ.woff2 +0 -0
  50. package/dist/client/_assets/chunks/1733f27476507ca68b68a803bc533cc2-DXL-14Ug.woff2 +0 -0
  51. package/dist/client/_assets/chunks/17c7f5d0a45e92ede0e5dec3a2c77efa-CNj3jQMl.woff2 +0 -0
  52. package/dist/client/_assets/chunks/1824321da801e6257b902f3d1d09054c-D4dgdyWB.woff2 +0 -0
  53. package/dist/client/_assets/chunks/188c2db794f3dd7a45889ddbc81da9bb-C9NbUBBO.woff2 +0 -0
  54. package/dist/client/_assets/chunks/1a08931435f885e707edb85978ea3bb6-BOiP2u7G.woff2 +0 -0
  55. package/dist/client/_assets/chunks/1a3a92c7c060a71a6c35819b9ebcdbb9-DFfonQfz.woff2 +0 -0
  56. package/dist/client/_assets/chunks/1be602ad456b0d75902d352116cb35fd-Bc-XQtQh.woff2 +0 -0
  57. package/dist/client/_assets/chunks/1cf737900dd49c2e88f1b3221a82a602-CfTmnns3.woff2 +0 -0
  58. package/dist/client/_assets/chunks/1fba7ec0e412e911bf31841de5a8a4e4-18ELMbFF.woff2 +0 -0
  59. package/dist/client/_assets/chunks/233d3a685ee18276b319363474599d47-BaFdJ0-G.woff2 +0 -0
  60. package/dist/client/_assets/chunks/2612c60f9dc5459ac42763591240a1d6-CTD69cq1.woff2 +0 -0
  61. package/dist/client/_assets/chunks/284b53bbefb06924cf236d24c8ed5641-CPDiuOv6.woff2 +0 -0
  62. package/dist/client/_assets/chunks/28a97af9ab9d38983d20f39ff09840e1-mFqcT3Jw.woff2 +0 -0
  63. package/dist/client/_assets/chunks/2a56eaf19d1d38a6b57e2a388f733676-CU52qBlE.woff2 +0 -0
  64. package/dist/client/_assets/chunks/2ab8cf1f23a5ac7939a7876054e711a7-B4T3dK7A.woff2 +0 -0
  65. package/dist/client/_assets/chunks/2abfbab82b6a7c04426afc054d2464da-D5PIIHde.woff2 +0 -0
  66. package/dist/client/_assets/chunks/2bfaadaf3479c72286248e6de0be0ec9-DEpU6O74.woff2 +0 -0
  67. package/dist/client/_assets/chunks/2c8c55e4cec85ce77e95cac9d330f5cf-BCTA96EZ.woff2 +0 -0
  68. package/dist/client/_assets/chunks/2e6f4bb71ef6b38765d51acc5a79f638-Mbs6PECD.woff2 +0 -0
  69. package/dist/client/_assets/chunks/2ed9981d2e8983365bd051159b976b6d-D8gg6NWM.woff2 +0 -0
  70. package/dist/client/_assets/chunks/2f4c633e923ba30c6ba376367379fc91-CIJCFztv.woff2 +0 -0
  71. package/dist/client/_assets/chunks/31194d303a67561926a544ed0e072aee-w3-eGYAi.woff2 +0 -0
  72. package/dist/client/_assets/chunks/31a197213ae61d7043c81013f52d10d6-DXZrrkJP.woff2 +0 -0
  73. package/dist/client/_assets/chunks/349965eee0a9b6c984a319ab96a4ece9-DByAVmXw.woff2 +0 -0
  74. package/dist/client/_assets/chunks/34e6750e00c3a911ef87dc66b336594d-DNbWesOu.woff2 +0 -0
  75. package/dist/client/_assets/chunks/3623d96698132c61e861f984ce11cc23-jqV9ErzX.woff2 +0 -0
  76. package/dist/client/_assets/chunks/36cda3eae13370b934bba4429fab9078-BPDcUlw9.woff2 +0 -0
  77. package/dist/client/_assets/chunks/36f3df4730cfca4fc77fe52b52e6a126-BwK10NC0.woff2 +0 -0
  78. package/dist/client/_assets/chunks/37887deb7a9c466cf2af6ee7ff372ea6-BrAerJB1.woff2 +0 -0
  79. package/dist/client/_assets/chunks/37dbd564820cce2f7b3331e442da0df3-Cql2kzIi.woff2 +0 -0
  80. package/dist/client/_assets/chunks/37dc8505b20b37a2477a9121b16d44a7-CoXw6XWV.woff2 +0 -0
  81. package/dist/client/_assets/chunks/39211b02f24c69cbd1b54f6d41b01933-4Xu7vvnq.woff2 +0 -0
  82. package/dist/client/_assets/chunks/3aa13f1843d7c8fa16109b6395a9a29d-BQFZUc3B.woff2 +0 -0
  83. package/dist/client/_assets/chunks/3aba89c4d4281553078de4622b498cbb-8QS1zDYk.woff2 +0 -0
  84. package/dist/client/_assets/chunks/3ac0a07878cacdc98bb889f40f5970d3-C-BaM6-y.woff2 +0 -0
  85. package/dist/client/_assets/chunks/3d88558097559d775231194d43745ba7-CR2aqGC7.woff2 +0 -0
  86. package/dist/client/_assets/chunks/3dc3e8c35524cad2d1236f3393104ccf-9sqBsF7B.woff2 +0 -0
  87. package/dist/client/_assets/chunks/3e24063b19abd2b051af986a6870046d-TlweM3SW.woff2 +0 -0
  88. package/dist/client/_assets/chunks/3e2c06bdd9dcab29aeaeb0cfb7fa608a-BaqU-dIt.woff2 +0 -0
  89. package/dist/client/_assets/chunks/424123f9371ba357087363263eeafcda-C8SVfEJi.woff2 +0 -0
  90. package/dist/client/_assets/chunks/43b3bbf43055c3e65db9cdf2c5b18c1c-CbHx6-Ki.woff2 +0 -0
  91. package/dist/client/_assets/chunks/4410f876d27c9821839474b6b1059fd7-ClYz91aY.woff2 +0 -0
  92. package/dist/client/_assets/chunks/44704471b60c18b3ecec5300a88f1102-DDmmy6-m.woff2 +0 -0
  93. package/dist/client/_assets/chunks/45140742dfa8686b58db2899ce89f89a-D5IMMzDM.woff2 +0 -0
  94. package/dist/client/_assets/chunks/46604090efbb99c2db1800928af0a239-JX2fpYX_.woff2 +0 -0
  95. package/dist/client/_assets/chunks/46998df85d31e629c0142f0556f5e7c5-BIkNG9Wh.woff2 +0 -0
  96. package/dist/client/_assets/chunks/469d2754e315e77270c12fa0ab28026c-D-y-vsfA.woff2 +0 -0
  97. package/dist/client/_assets/chunks/479329a39a3eb6c0047e6b0981919855-vZKCRx42.woff2 +0 -0
  98. package/dist/client/_assets/chunks/491bbba374093fff045f55803a22bfef-DSQXiDCd.woff2 +0 -0
  99. package/dist/client/_assets/chunks/49902f1c41b281f8eb3771abdd4dccb8-DxVxNg2W.woff2 +0 -0
  100. package/dist/client/_assets/chunks/4c0760284569b87d8f2290c324953973-Bqd-TKHH.woff2 +0 -0
  101. package/dist/client/_assets/chunks/4cba92c942694bdc479bc54101bb1aa4-BrfsrgrC.woff2 +0 -0
  102. package/dist/client/_assets/chunks/4d38e56738156625329d93bd5c8cc74a-DONkMP0y.woff2 +0 -0
  103. package/dist/client/_assets/chunks/4db4f31a16965baa42cb7dad667a8f04-Dt1Cy4gr.woff2 +0 -0
  104. package/dist/client/_assets/chunks/4e7d263c30bb48604069a3b4404d4eeb-DNPCkvKD.woff2 +0 -0
  105. package/dist/client/_assets/chunks/5279c7e465d9871edf51fd02e691eee7-CKhyhvVf.woff2 +0 -0
  106. package/dist/client/_assets/chunks/527ff336279465617aafbafe1a830632-CC3lv4pm.woff2 +0 -0
  107. package/dist/client/_assets/chunks/54bfdb6f21f9d6191e5100580239e14f-PGlqYvgl.woff2 +0 -0
  108. package/dist/client/_assets/chunks/56b40518ea0608e62826bd44ee27f5f9-BD9F9Oss.woff2 +0 -0
  109. package/dist/client/_assets/chunks/56be5e32fd01668fe5ba814d94905839-CSyFA-9l.woff2 +0 -0
  110. package/dist/client/_assets/chunks/572b9e28f1e6d89b765a16d809db84a1-BIYMjzEa.woff2 +0 -0
  111. package/dist/client/_assets/chunks/57e9a86651366c1ba299e47aa7e358c2-BHuZXB4W.woff2 +0 -0
  112. package/dist/client/_assets/chunks/57f89adeae55aa7fe2add3fc1801ce03-Cy3PNrfx.woff2 +0 -0
  113. package/dist/client/_assets/chunks/5921cef36750ff6092d94b83a802823b-hF-uymTh.woff2 +0 -0
  114. package/dist/client/_assets/chunks/59e95d8b5332dcdae894a19946ab767d-ClRfsjWZ.woff2 +0 -0
  115. package/dist/client/_assets/chunks/5acc7f736217259db79a42bf44241c48-FYQUuFOM.woff2 +0 -0
  116. package/dist/client/_assets/chunks/5c05f8b75c9d7f25b3c04ca711cf43b3-D-YWPkSq.woff2 +0 -0
  117. package/dist/client/_assets/chunks/5df9ce98c75f8c50fb4fff7f01a23925-DgoCENyW.woff2 +0 -0
  118. package/dist/client/_assets/chunks/5e0124c7265f1b4cf0fc797b94efbebc-BTBNHsSB.woff2 +0 -0
  119. package/dist/client/_assets/chunks/5ec349ff62b9ee5fe0c6dae867704dc4-B4dezhrz.woff2 +0 -0
  120. package/dist/client/_assets/chunks/60020a830d809c26970cf8e48ba1eeda-B6FDTSik.woff2 +0 -0
  121. package/dist/client/_assets/chunks/601f812e8b1eafecd5ba585a6a6d7962-gIVBlUU9.woff2 +0 -0
  122. package/dist/client/_assets/chunks/6025ddaf99d86cc8bfd781006b19fbd6-CS-ze337.woff2 +0 -0
  123. package/dist/client/_assets/chunks/60bcfa3ea7446eb42394aab02d28be40-C-PQfCu3.woff2 +0 -0
  124. package/dist/client/_assets/chunks/60f6e28b3f0400b0e8fe32c3c7116102-Dag9L2qU.woff2 +0 -0
  125. package/dist/client/_assets/chunks/615a7e0d63f257109d599b2a1977de68-D6Y93yoG.woff2 +0 -0
  126. package/dist/client/_assets/chunks/615b38e0b5bb3ea68426f44f47706e6f-B5yzIIer.woff2 +0 -0
  127. package/dist/client/_assets/chunks/61a2c80d0c924d5a6187c02e8d1d1642-BY3MmHbZ.woff2 +0 -0
  128. package/dist/client/_assets/chunks/62fc94f8d4c5a750b7f25e7387539910-3ql2_WDK.woff2 +0 -0
  129. package/dist/client/_assets/chunks/639c7c6b0b0c27c738702741cfa4b8c0-BCD3OGri.woff2 +0 -0
  130. package/dist/client/_assets/chunks/63fafcb069520613d0ea35ad3e6b1e42-DP0Rrj4o.woff2 +0 -0
  131. package/dist/client/_assets/chunks/64a404d675f1d726f0891b7a80794595-DU3L0I9s.woff2 +0 -0
  132. package/dist/client/_assets/chunks/65a60d87c64228d258a123cbe85f5f31-B4kbf-79.woff2 +0 -0
  133. package/dist/client/_assets/chunks/65e9c4585d71bf48a5c62f367010da16-CvzgzReN.woff2 +0 -0
  134. package/dist/client/_assets/chunks/68a3a4bf337f8a0722be76676e20b850-Dnaw8EPD.woff2 +0 -0
  135. package/dist/client/_assets/chunks/6968e889e18891d912809fe484c2e745-Bj1m5e0s.woff2 +0 -0
  136. package/dist/client/_assets/chunks/6abdd163d2c4b85698db8aa1ce149361-B5FVGJuo.woff2 +0 -0
  137. package/dist/client/_assets/chunks/6b75213eb0be40ce84241eb2bb438a2e-CqHmF-NR.woff2 +0 -0
  138. package/dist/client/_assets/chunks/70714891ad3fbfc3d5f10a8669dacc5a-BWk5nLFN.woff2 +0 -0
  139. package/dist/client/_assets/chunks/7158022889c6c177062ac85036e7af10-B3D4K22n.woff2 +0 -0
  140. package/dist/client/_assets/chunks/73b794d885b88f7befb7ea8ab1780a15-D0ZehnEI.woff2 +0 -0
  141. package/dist/client/_assets/chunks/743f290baf027d4626a86e22f3d44600-DDTDQdRC.woff2 +0 -0
  142. package/dist/client/_assets/chunks/7520ca6ca8c60eb1e62d50e71c8d30f1-CVRaGu2G.woff2 +0 -0
  143. package/dist/client/_assets/chunks/757019c01c5e2c2b0f54293cea3b5636-BTovUnoH.woff2 +0 -0
  144. package/dist/client/_assets/chunks/759a647b77791b1e98f99bc0ab5317a7-CrK6FIFz.woff2 +0 -0
  145. package/dist/client/_assets/chunks/761d84afca8d7f34eebefe538adba827-DRbiVuwX.woff2 +0 -0
  146. package/dist/client/_assets/chunks/76e07530323418ec723c5d7634c9bcca-DGtVJTTH.woff2 +0 -0
  147. package/dist/client/_assets/chunks/76e51630143b95b6322ef93ad330da7a-D-kV82C_.woff2 +0 -0
  148. package/dist/client/_assets/chunks/76f117a3baacda304a71965a17266a13-DFfvsFUm.woff2 +0 -0
  149. package/dist/client/_assets/chunks/773819b7b9b8fd404a929867c0fd677e-Bu1xCMZb.woff2 +0 -0
  150. package/dist/client/_assets/chunks/77747f17625a259fb405b7bbdd84ac4b-o_vNfh-6.woff2 +0 -0
  151. package/dist/client/_assets/chunks/7817dd16805145d8538ad57590f69f5a-DguSUP3O.woff2 +0 -0
  152. package/dist/client/_assets/chunks/788498548ddfb710d6ef3c7bff79fa97-3ffoQfRd.woff2 +0 -0
  153. package/dist/client/_assets/chunks/78ea6c40923ce95367e3517dd1e5a849-DvLDRhX9.woff2 +0 -0
  154. package/dist/client/_assets/chunks/79aa7c8c842c4a27cf57c0a3a1ffca5a-sDoCeoKI.woff2 +0 -0
  155. package/dist/client/_assets/chunks/7b59f0ec7792b18458dc5a361e37884c-DWvxkKmT.woff2 +0 -0
  156. package/dist/client/_assets/chunks/7c3945788a689a69356c1a622d69d48b-1JjIpss2.woff2 +0 -0
  157. package/dist/client/_assets/chunks/7cc72fd2c9105560422b6a67c6162945-Co3AF5_G.woff2 +0 -0
  158. package/dist/client/_assets/chunks/7d0ea0690e432462f4d05a23d720ec19-Dx7DK4C3.woff2 +0 -0
  159. package/dist/client/_assets/chunks/7dffa5c1bec57e0903fd62357401ff1a-DuQHmiiN.woff2 +0 -0
  160. package/dist/client/_assets/chunks/7e38ca789a9e76ac91d9256374e154f0-BtETgGRe.woff2 +0 -0
  161. package/dist/client/_assets/chunks/7f9a6c9286b68de9c72b0024f7beeb40-JpXdo4FC.woff2 +0 -0
  162. package/dist/client/_assets/chunks/815a0b797465190f60d8b1a04656c42e-Spzo94nU.woff2 +0 -0
  163. package/dist/client/_assets/chunks/823d1bb11097331238d103c7f72138dc-CGN6m2VF.woff2 +0 -0
  164. package/dist/client/_assets/chunks/82f6ccc063960eed1cdfd1d61ada8862-CsmAqx2a.woff2 +0 -0
  165. package/dist/client/_assets/chunks/835b6505bb9eea9678925a1fa885353d-C6mSBwUc.woff2 +0 -0
  166. package/dist/client/_assets/chunks/845b4b67564d62cf5cad242f7ac08ea5-DnvzrloJ.woff2 +0 -0
  167. package/dist/client/_assets/chunks/84c8e7bc0931008ed91f44ed12dfea94-C2Hvhh-b.woff2 +0 -0
  168. package/dist/client/_assets/chunks/8726558cf297cbda831cc19514897205-gSFV1vW0.woff2 +0 -0
  169. package/dist/client/_assets/chunks/8855472f3c02f6c7ebb3216617ebe4af-C1JsWVqq.woff2 +0 -0
  170. package/dist/client/_assets/chunks/887a11290ba78b1e66c6d2f67043005e-L_A1f5Fz.woff2 +0 -0
  171. package/dist/client/_assets/chunks/888ba53510213d5d1f6a7deb60e569b6-OP8E-ELN.woff2 +0 -0
  172. package/dist/client/_assets/chunks/88db1d042074fb6e66821ffc10941930-kZ6K3e62.woff2 +0 -0
  173. package/dist/client/_assets/chunks/892aa49b2529c89bb4076d4aa51fe30f-Bw0_Km2A.woff2 +0 -0
  174. package/dist/client/_assets/chunks/8b5c9ef81159f31d2ab35f45ca4373e0-Djw95sKC.woff2 +0 -0
  175. package/dist/client/_assets/chunks/8b91c7c2ed390f1278b9befa3aa87233-B2C3iFbQ.woff2 +0 -0
  176. package/dist/client/_assets/chunks/8dc18c0cebe6aa4bf4c45dbb831048ab-bUlANLit.woff2 +0 -0
  177. package/dist/client/_assets/chunks/8e231d707f0c4f8e3cde90a6b52a79aa-CvwbWlul.woff2 +0 -0
  178. package/dist/client/_assets/chunks/8fb45117a62d92dce44a80f0b729ead5-Djr4-o5-.woff2 +0 -0
  179. package/dist/client/_assets/chunks/9064c12fd72c7aba235d8c3881755b91-BnguxT-p.woff2 +0 -0
  180. package/dist/client/_assets/chunks/90b7848e9b1623b77bdcf155e90b839c-CFvPRnoM.woff2 +0 -0
  181. package/dist/client/_assets/chunks/911b9e53e9814de2998c60bf3115f560-DmPmj635.woff2 +0 -0
  182. package/dist/client/_assets/chunks/919a879bd2d580d8491a31a449390689-BY2w-8_Y.woff2 +0 -0
  183. package/dist/client/_assets/chunks/91da6cb174bebfb96976e2f1316be2fe-DztAJb6W.woff2 +0 -0
  184. package/dist/client/_assets/chunks/92fdc376bce277874e75db666f175b44-DJUnHEIN.woff2 +0 -0
  185. package/dist/client/_assets/chunks/930a23430f0eb64480d7fe5f82834e21-2VrDPT7E.woff2 +0 -0
  186. package/dist/client/_assets/chunks/934dfdbed2bb2c4b6129199d699a34fa-CtpHsjRD.woff2 +0 -0
  187. package/dist/client/_assets/chunks/93bed0e5f2dd5a21cf73304fcfbc149d-DJiaETX7.woff2 +0 -0
  188. package/dist/client/_assets/chunks/93f3ea6918533d96d9c252378b9a4af0-D-FJaGi-.woff2 +0 -0
  189. package/dist/client/_assets/chunks/95a0951d2a2722ff773a1a45e8c474d6-DuZg-BpP.woff2 +0 -0
  190. package/dist/client/_assets/chunks/95ff41191c76ef893ac70a1043e95e44-C08QDbJO.woff2 +0 -0
  191. package/dist/client/_assets/chunks/96c75862c8cec51a7c05ff025fea86cd-DBnRwCuW.woff2 +0 -0
  192. package/dist/client/_assets/chunks/97d7a17234f2b5030ae9697ae00aded2-CkUSaB-p.woff2 +0 -0
  193. package/dist/client/_assets/chunks/982cd1765ca6bbb3e6547e47834d5148-DkIybx1r.woff2 +0 -0
  194. package/dist/client/_assets/chunks/985d4d41afa0934a4eb2de35473fb9a2-CF7rgJMw.woff2 +0 -0
  195. package/dist/client/_assets/chunks/995c4fda62d25c3b79dd5987737df6ae-CY5ri8HW.woff2 +0 -0
  196. package/dist/client/_assets/chunks/9b0c3caac458c7bc9c9133e40405ddea-DhPrYOcz.woff2 +0 -0
  197. package/dist/client/_assets/chunks/9b21e8244f5930c48ad5073f83777b6c-CuE9-r-r.woff2 +0 -0
  198. package/dist/client/_assets/chunks/9bb38fd05201de666b88b82d56a386f7-nMl6lB8X.woff2 +0 -0
  199. package/dist/client/_assets/chunks/9d0afa53dc2f92ba42024f55f11f6779-Bozpx8bL.woff2 +0 -0
  200. package/dist/client/_assets/chunks/9e13a47242926f1cd7d68c08d9ef8889-DwKQjc8M.woff2 +0 -0
  201. package/dist/client/_assets/chunks/9eff2ab2a9d2ced47ab761bf6fdb11ec-D86-Zm1H.woff2 +0 -0
  202. package/dist/client/_assets/chunks/9f1963fe8d4d6878d717d872a8f3fdb5-DxjITUFq.woff2 +0 -0
  203. package/dist/client/_assets/chunks/9f3bdab4025dc7c5ba1a5871e62e8918-BqxDEFLJ.woff2 +0 -0
  204. package/dist/client/_assets/chunks/9fce02d1a09f464c36c9fcfb14a354c5-F2tMAB_j.woff2 +0 -0
  205. package/dist/client/_assets/chunks/a00e94d4f04df6aa659db9c4954c7efe-CRBKCj_3.woff2 +0 -0
  206. package/dist/client/_assets/chunks/a0a6755c7e3f9e4cf03387027dd9f16c-BAyRqF2w.woff2 +0 -0
  207. package/dist/client/_assets/chunks/a0d00fe4816c95a8c7dffd445ef00b03-CxcTiRLJ.woff2 +0 -0
  208. package/dist/client/_assets/chunks/a0f199077fa1a33bc2a1e01c64de7fe6-IdgVJmZD.woff2 +0 -0
  209. package/dist/client/_assets/chunks/a2b0597837e382aca19919c4b74e58c8-7iVOBjzI.woff2 +0 -0
  210. package/dist/client/_assets/chunks/a373e85c96aa0dc303092429fb837e51-Dvmw8mbX.woff2 +0 -0
  211. package/dist/client/_assets/chunks/a379ada89abd750c587ded29f77e731c-CgPBsEsv.woff2 +0 -0
  212. package/dist/client/_assets/chunks/a4475c442c6b259354c9eda62e64e7df-TZ0c8vK-.woff2 +0 -0
  213. package/dist/client/_assets/chunks/a48be56ce5d3a99dc8f8331398004412-BR_ixH1W.woff2 +0 -0
  214. package/dist/client/_assets/chunks/a4a39b5f048671aa37c2b2a9581ab08a-EDfDYsUd.woff2 +0 -0
  215. package/dist/client/_assets/chunks/a534449d67561ac9b06489f64e57ad98-C355TCrD.woff2 +0 -0
  216. package/dist/client/_assets/chunks/a6e044424780a57610833cc856c15bf5-x1b8FE4H.woff2 +0 -0
  217. package/dist/client/_assets/chunks/a7c35e42a659347e490c3cb7983b2e7f-BWpA0-oz.woff2 +0 -0
  218. package/dist/client/_assets/chunks/a7c58070d68dc1724e9d4e781afb78db-ql27pT-6.woff2 +0 -0
  219. package/dist/client/_assets/chunks/a806759e72987951d6d08b7cbdf36a1b-TvLDwB_u.woff2 +0 -0
  220. package/dist/client/_assets/chunks/a88481ec8bc7be11cb66e46781a79bb9-Ck-r_sGx.woff2 +0 -0
  221. package/dist/client/_assets/chunks/a919a8c6fec6d7e8bb21177965f2e9d7-CC5uWzwd.woff2 +0 -0
  222. package/dist/client/_assets/chunks/a9a016d4a93409f65278327e8a8bb38d-dylrNwF8.woff2 +0 -0
  223. package/dist/client/_assets/chunks/aa662092cf249707123ca4d575e2764b-CSxNsTUL.woff2 +0 -0
  224. package/dist/client/_assets/chunks/aae1eda193285ab817a2d1b408440326-CjyjBoRm.woff2 +0 -0
  225. package/dist/client/_assets/chunks/ab92d41062a7644faa45f50bf384454a-Cq0X8a9H.woff2 +0 -0
  226. package/dist/client/_assets/chunks/accc43762ad05edfbff66ba1380d192a-B5jIykaZ.woff2 +0 -0
  227. package/dist/client/_assets/chunks/ad47bcd6d4663026d648c132d969318d-BYdIbDge.woff2 +0 -0
  228. package/dist/client/_assets/chunks/ad67113f88b59582991cb0c5d33ea19f-DOH1vcIZ.woff2 +0 -0
  229. package/dist/client/_assets/chunks/adb6e613fb99c6dd660b727101f554a8-DJDw_ZZK.woff2 +0 -0
  230. package/dist/client/_assets/chunks/adc4a98a89870ef984ee8f4b57c8a3a5-D30vw26R.woff2 +0 -0
  231. package/dist/client/_assets/chunks/af57a2e8c72f9ba0efb1af771d32c124-D5Zwq9pS.woff2 +0 -0
  232. package/dist/client/_assets/chunks/b0ae5f374e43dac992a4a5d334cebc0b-Ccoi4dPt.woff2 +0 -0
  233. package/dist/client/_assets/chunks/b0cb664cb2e1371efda8943c0b7dcd1c-YzGFnelF.woff2 +0 -0
  234. package/dist/client/_assets/chunks/b0d1cdced482352cf0d3ae58638aacb9-IunWfc6R.woff2 +0 -0
  235. package/dist/client/_assets/chunks/b12379ab782468d725519cd07a7d15bc-IjbydKs2.woff2 +0 -0
  236. package/dist/client/_assets/chunks/b320f5d185b2cff933ac549c184031c5-IYnPrIz4.woff2 +0 -0
  237. package/dist/client/_assets/chunks/b326a8a9c33b554db570da94f60bc380-B6dzaCQg.woff2 +0 -0
  238. package/dist/client/_assets/chunks/b55486f8a459c838fe329d4e79a8c211-DW8q7oGV.woff2 +0 -0
  239. package/dist/client/_assets/chunks/b6117ff2993b11bb1fdc7ea3588a010c-JoMYL5W_.woff2 +0 -0
  240. package/dist/client/_assets/chunks/b61982951bd51b724143c30dfaaa9fe9-D3KhBKl6.woff2 +0 -0
  241. package/dist/client/_assets/chunks/b91234c10fd8b8c8abc88e03afe66a1f-BABNh2la.woff2 +0 -0
  242. package/dist/client/_assets/chunks/b9317198f118a1dfd8ddf2b82ec028f3-CiMecxeH.woff2 +0 -0
  243. package/dist/client/_assets/chunks/ba825ae79b1a6f7e0cce5215fcb5c96f-B6EWU_D5.woff2 +0 -0
  244. package/dist/client/_assets/chunks/ba9c59d7dfa4494db1bb764ada81467d-D0yPcC1m.woff2 +0 -0
  245. package/dist/client/_assets/chunks/bab547459d514f46206e340c4bb2dc88-YnBqlGhw.woff2 +0 -0
  246. package/dist/client/_assets/chunks/bb0b15492b8cdbbec57c0bcfa0aa9241-BjIFbEsN.woff2 +0 -0
  247. package/dist/client/_assets/chunks/bc6183ac08f0fac78c46f80c10cf7c92-B81nbRb3.woff2 +0 -0
  248. package/dist/client/_assets/chunks/bc8ccea5abf6598cf3cfa97eb59804bb-B_7IbluG.woff2 +0 -0
  249. package/dist/client/_assets/chunks/bc95a792cbca6639214c9b0da13392ff-CHQe0E-D.woff2 +0 -0
  250. package/dist/client/_assets/chunks/bcc39eda837bb7a7a3d37c8c60fffb81-CGd1Zk6S.woff2 +0 -0
  251. package/dist/client/_assets/chunks/bcfa62f35731856246c146d3a6932bf3-DMDq6w4v.woff2 +0 -0
  252. package/dist/client/_assets/chunks/bd73264d7f98776708d5d6f3c9b78fcc-d9QWWMym.woff2 +0 -0
  253. package/dist/client/_assets/chunks/bed610b217d500f5975cfc9fe6157570-B5t7s1bw.woff2 +0 -0
  254. package/dist/client/_assets/chunks/bedc74b423b7293b6ad0bdecc61c42cc-4Nnh7peP.woff2 +0 -0
  255. package/dist/client/_assets/chunks/bf8901f8f11d4f433ea17dabc9370ea6-B8dkfvGn.woff2 +0 -0
  256. package/dist/client/_assets/chunks/bfb00d4a4c48661bd0be99f300a0faae-OxsWZ7l-.woff2 +0 -0
  257. package/dist/client/_assets/chunks/c0098958e20db68cab90097b5e62516f-VpjQo3vV.woff2 +0 -0
  258. package/dist/client/_assets/chunks/c063897793f593eb26d6ff7b7baaba18-BWeJJ1sH.woff2 +0 -0
  259. package/dist/client/_assets/chunks/c1b0df29ae41d764904df84e9ac83d1e-D1N934vs.woff2 +0 -0
  260. package/dist/client/_assets/chunks/c4143bb9f2fe77b6ccf20088a8904650-nHfYM24e.woff2 +0 -0
  261. package/dist/client/_assets/chunks/c42c67070cfe99cf823df92d81c7fa6e-B_a405Ez.woff2 +0 -0
  262. package/dist/client/_assets/chunks/c4bfaa5e50798246e3770718b7a7c84a-B-r6Y_o0.woff2 +0 -0
  263. package/dist/client/_assets/chunks/c4d749e45ecd5a5aed5a0bb3ebfd355d-CkqE1fRi.woff2 +0 -0
  264. package/dist/client/_assets/chunks/c6c2971ad1f3221f6cf84028aa0f477e-D7BZGIcY.woff2 +0 -0
  265. package/dist/client/_assets/chunks/c7ff3f6bbdcd5f604b7343602ab904df-Bq7UjVrZ.woff2 +0 -0
  266. package/dist/client/_assets/chunks/c84598999133455503042e06f4ab79cb-DIXndJX3.woff2 +0 -0
  267. package/dist/client/_assets/chunks/c945c62368357d05a53206620460fb30-82gFEf6n.woff2 +0 -0
  268. package/dist/client/_assets/chunks/c96d83978add28b356c22c4c84916733-BL4VaPIE.woff2 +0 -0
  269. package/dist/client/_assets/chunks/c97f41eef722121d86f55d553c056a39-CjejgQO2.woff2 +0 -0
  270. package/dist/client/_assets/chunks/ca62704509932d3232d62918de97af3f-CKWF-3mX.woff2 +0 -0
  271. package/dist/client/_assets/chunks/ca9a533988d7019597a60d4e17127e0c-ClZ6ygZM.woff2 +0 -0
  272. package/dist/client/_assets/chunks/cb7ccd6494256f7a2977b7c2b0225592-Cxp8XObm.woff2 +0 -0
  273. package/dist/client/_assets/chunks/ce022e18a1377ac509443c3c3790b431-DpH0t6Tn.woff2 +0 -0
  274. package/dist/client/_assets/chunks/ce41d70ce6a069a498525c9e15c45cf2-DGtgv-_b.woff2 +0 -0
  275. package/dist/client/_assets/chunks/cf2b28f90f47276f7e2688a65e88a101-LVbNkXHj.woff2 +0 -0
  276. package/dist/client/_assets/chunks/cf9cffe56636322f62b40d61130fbc5e-DNCBMqAo.woff2 +0 -0
  277. package/dist/client/_assets/chunks/d1f064825fa5784b5c930652bd831cce-BU6qwjp8.woff2 +0 -0
  278. package/dist/client/_assets/chunks/d20d8944bc0b85f5b2aae4b24f343516-oY9l-NmC.woff2 +0 -0
  279. package/dist/client/_assets/chunks/d2faabcedd19f016e7b21bce073c0ec8-Dv6eFCf5.woff2 +0 -0
  280. package/dist/client/_assets/chunks/d320171e57480510f87dbbc7d5264b0a-CcCfjaFX.woff2 +0 -0
  281. package/dist/client/_assets/chunks/d36644d6502527e1fff205d0c7eca434-kVBj8zy_.woff2 +0 -0
  282. package/dist/client/_assets/chunks/d3a72a99d365dddfbca8d017a8011368-Bgdmhl3M.woff2 +0 -0
  283. package/dist/client/_assets/chunks/d40ab99c7a38026f411c8f112f742b48-D7Nm7fg6.woff2 +0 -0
  284. package/dist/client/_assets/chunks/d42aafa0f246ad3b4c16fe96d3a3a432-CRxTqZXU.woff2 +0 -0
  285. package/dist/client/_assets/chunks/d4aaf23c13ae808a4bed617afd13aa07-d_T1SKe9.woff2 +0 -0
  286. package/dist/client/_assets/chunks/d509ee5c8241bc7c3de2039d75564fa5-BpNFD9JE.woff2 +0 -0
  287. package/dist/client/_assets/chunks/d675d717cd329bfd4c0524f76ae1579c-Bd5_ctoQ.woff2 +0 -0
  288. package/dist/client/_assets/chunks/d689b1861d7e4377dd72ad3013482612-jPsVOU3F.woff2 +0 -0
  289. package/dist/client/_assets/chunks/d6bb686bddfbe8f38a36a68e609a8667-C_QduS-X.woff2 +0 -0
  290. package/dist/client/_assets/chunks/d9020ff69a83b2a6ee1f42ae480f7db0-DLBUPMCe.woff2 +0 -0
  291. package/dist/client/_assets/chunks/d9047070d72a816b3dba9d40c2d85e69-LTQ42vEp.woff2 +0 -0
  292. package/dist/client/_assets/chunks/da04549f3f4ed28076b01b8cd710d313-CDXOeduw.woff2 +0 -0
  293. package/dist/client/_assets/chunks/da7af303f8c645f9a9dbae0e6e32dd35-DCkS2jqi.woff2 +0 -0
  294. package/dist/client/_assets/chunks/da90a9012ab2d98f759e3fa0820ef502-D0D9d1zg.woff2 +0 -0
  295. package/dist/client/_assets/chunks/dc6e234ded795e91f76d6647f628fbf0-IkooXcRh.woff2 +0 -0
  296. package/dist/client/_assets/chunks/dc8f6256445e68199540be9ade33529f-umb5tWbZ.woff2 +0 -0
  297. package/dist/client/_assets/chunks/dd0cfdfdac0866e66d587e2b5a9e9961-bl4ozE0c.woff2 +0 -0
  298. package/dist/client/_assets/chunks/de304c8a02e45ded4f8dcc479d167198-ClRu89-4.woff2 +0 -0
  299. package/dist/client/_assets/chunks/df10d94bea357a43313e20da5d84bd30-CmAgh2oA.woff2 +0 -0
  300. package/dist/client/_assets/chunks/df9568257eb29b156449fdd4bec5ec76-BMz6aLRr.woff2 +0 -0
  301. package/dist/client/_assets/chunks/e067cd0ed76c90cd0a93c9339253f20b-6RxCQ4jy.woff2 +0 -0
  302. package/dist/client/_assets/chunks/e08b07772e7bed3cec2832d43f7fd339-CQCkeKsr.woff2 +0 -0
  303. package/dist/client/_assets/chunks/e12150d5a39b30be8f567968c7a527b0-DjdoWzeQ.woff2 +0 -0
  304. package/dist/client/_assets/chunks/e34b2b141e472dc776c86fdf8eea23b0-Cjk7H-Ev.woff2 +0 -0
  305. package/dist/client/_assets/chunks/e444fd88f1390636e603d0d681538ac8-Bx7CPOZh.woff2 +0 -0
  306. package/dist/client/_assets/chunks/e53fcb2381eee345db4f6f973dd95a3e-DmkkCUWz.woff2 +0 -0
  307. package/dist/client/_assets/chunks/e5bd313ef81f687d398aacb11cec3069-CwBEbcji.woff2 +0 -0
  308. package/dist/client/_assets/chunks/e79898628283edc27180fc39d0d769c1-By2pplQz.woff2 +0 -0
  309. package/dist/client/_assets/chunks/e8c15be62faf978d208925e79ea6a10d-Ct5M9lTP.woff2 +0 -0
  310. package/dist/client/_assets/chunks/e8c364c16daa04835bf32d293d2598db-3v4Tut_d.woff2 +0 -0
  311. package/dist/client/_assets/chunks/e91c4d941ed9f5c2f3e27f205a3a225e-BwOJ2Lst.woff2 +0 -0
  312. package/dist/client/_assets/chunks/e9c566be7a5d38a9085225f7372bc82b-BCtnCVML.woff2 +0 -0
  313. package/dist/client/_assets/chunks/e9ebc567a711eeb29019ddae3e0ce7fe-CnNhV49O.woff2 +0 -0
  314. package/dist/client/_assets/chunks/eaf332445a40942928e5f5750c1c3116-qZ5LSRrj.woff2 +0 -0
  315. package/dist/client/_assets/chunks/eb5afb3d952b8593782caec6026514b6-BXugZF2T.woff2 +0 -0
  316. package/dist/client/_assets/chunks/ec86e23683052da5cfdc3b77641bd15a-BeLcbcRc.woff2 +0 -0
  317. package/dist/client/_assets/chunks/ecb8875a56c7b038b35432fda41ae128-BVqgNf1o.woff2 +0 -0
  318. package/dist/client/_assets/chunks/eda1b0cb6d1719dd9bedcf3216a9e8de-BJTfLL5z.woff2 +0 -0
  319. package/dist/client/_assets/chunks/edd6a4f608d04fc0351d7688cfc321e4-d3V4U40c.woff2 +0 -0
  320. package/dist/client/_assets/chunks/ee6fce20b420a480714607c66d7f97e5-DEtC-G5G.woff2 +0 -0
  321. package/dist/client/_assets/chunks/eee3836d6ac17ebb2c450bbcbc9db121-C5a2TZjQ.woff2 +0 -0
  322. package/dist/client/_assets/chunks/et-book-bold-line-figures-BFJr2_zv.woff +0 -0
  323. package/dist/client/_assets/chunks/et-book-display-italic-old-style-figures-CoeRJAe8.woff +0 -0
  324. package/dist/client/_assets/chunks/et-book-roman-line-figures-CaA40oOf.woff +0 -0
  325. package/dist/client/_assets/chunks/f1661731474b78bdf81114daf10b254f-KnMKX_U3.woff2 +0 -0
  326. package/dist/client/_assets/chunks/f2c58dee206ba9355046fc23d05491f7-Cm4tCWav.woff2 +0 -0
  327. package/dist/client/_assets/chunks/f50ac27ea4358d67fdda403c2bb52467-WCfYHde1.woff2 +0 -0
  328. package/dist/client/_assets/chunks/f55334112f8e8be82d65db29887a663f-vDq1zH8k.woff2 +0 -0
  329. package/dist/client/_assets/chunks/f5738255e92d8dd34a46d1bcdf4c4074-tpghTzL1.woff2 +0 -0
  330. package/dist/client/_assets/chunks/f740e93f3c0277ecc616594103bca683-C4BgW_ko.woff2 +0 -0
  331. package/dist/client/_assets/chunks/f7633b5af033d76ff2fb3c3c266d77c5-BCkrZxwO.woff2 +0 -0
  332. package/dist/client/_assets/chunks/f7d8468cba2335a83ee414ea68291bab-CVnotkZU.woff2 +0 -0
  333. package/dist/client/_assets/chunks/f91cd722855f4269256eae1187df64ec-DJlAx1A_.woff2 +0 -0
  334. package/dist/client/_assets/chunks/f9695c6c4df2bf6bc03045ff79d4f01f-DDaYGYHT.woff2 +0 -0
  335. package/dist/client/_assets/chunks/fa6e58ce4b52695e7ae19bbea6336ec8-B30jEpze.woff2 +0 -0
  336. package/dist/client/_assets/chunks/fada6eaa68ff8816afe43d2a36c5423e-DlGAWNPb.woff2 +0 -0
  337. package/dist/client/_assets/chunks/fbcc4bf5367218951172bdee6f77d7a6-Dax2VSCd.woff2 +0 -0
  338. package/dist/client/_assets/chunks/fc895f5ce66b656f4a933097bf2a8775-DjjysNdf.woff2 +0 -0
  339. package/dist/client/_assets/chunks/fc9ae5b600fb711f2d67e93ce768cba4-D1lx7LBz.woff2 +0 -0
  340. package/dist/client/_assets/chunks/fca6720fd14c467d29a90f18ef3859b9-B3btrwq3.woff2 +0 -0
  341. package/dist/client/_assets/chunks/fd1bb507bcbf04856eeb7f7fd47ea579-NR1nGJTt.woff2 +0 -0
  342. package/dist/client/_assets/chunks/fd1bceb55d3e0183ac2454b8532fec7d-D3t-v6nn.woff2 +0 -0
  343. package/dist/client/_assets/chunks/fd2069e6e8588c70b4f11364093b81f2-BoXhYVgw.woff2 +0 -0
  344. package/dist/client/_assets/chunks/{url-CG0eolsk.js → url-pLre2DM_.js} +1 -1
  345. package/dist/client/_assets/client-C_kImWZj.css +2 -0
  346. package/dist/client/_assets/client-D95FNDg5.js +272 -0
  347. package/dist/client/_assets/client-auth-BRFl5zQA.js +4547 -0
  348. package/dist/client/_assets/client-cjk-jp-DZwrTzQC.css +1 -0
  349. package/dist/client/_assets/client-cjk-kr-_3ZNI2ZP.css +1 -0
  350. package/dist/env-wCpMcNXs.js +252 -0
  351. package/dist/github-api-CficQztC.js +176 -0
  352. package/dist/github-app-F4qZ05xk.js +275 -0
  353. package/dist/github-sync-zohnA9qv.js +4696 -0
  354. package/dist/index.js +88 -2
  355. package/dist/node.js +71 -30
  356. package/dist/url-FvvgARU9.js +305 -0
  357. package/package.json +16 -12
  358. package/src/__tests__/bin/content-cli.test.ts +179 -0
  359. package/src/__tests__/bin/media-cli.test.ts +192 -0
  360. package/src/__tests__/export-hugo-build.test.ts +178 -0
  361. package/src/__tests__/export-import-roundtrip.test.ts +265 -0
  362. package/src/__tests__/export-service.test.ts +763 -510
  363. package/src/__tests__/helpers/export-fixtures.ts +108 -0
  364. package/src/__tests__/import-site-command.test.ts +358 -350
  365. package/src/__tests__/site-pull-media.test.ts +256 -0
  366. package/src/app.tsx +65 -13
  367. package/src/client/__tests__/collection-form-bridge.test.ts +87 -7
  368. package/src/client/__tests__/collection-page-actions.test.ts +4 -4
  369. package/src/client/__tests__/collection-picker-order.test.ts +53 -0
  370. package/src/client/__tests__/collection-sort-menu.test.ts +2 -2
  371. package/src/client/__tests__/compose-bridge.test.ts +305 -13
  372. package/src/client/__tests__/compose-launch.test.ts +120 -0
  373. package/src/client/__tests__/compose-shortcuts.test.ts +141 -0
  374. package/src/client/__tests__/feed-video-player.test.ts +44 -0
  375. package/src/client/__tests__/site-header-nav.test.ts +250 -0
  376. package/src/client/__tests__/sortable-list.test.ts +6 -2
  377. package/src/client/__tests__/thread-context.test.ts +117 -0
  378. package/src/client/collection-form-bridge.ts +109 -4
  379. package/src/client/collection-page-actions.ts +3 -1
  380. package/src/client/collection-picker-order.ts +104 -0
  381. package/src/client/components/__tests__/{jant-collection-sidebar.test.ts → jant-collection-directory.test.ts} +145 -8
  382. package/src/client/components/__tests__/jant-collection-form.test.ts +40 -18
  383. package/src/client/components/__tests__/jant-compose-dialog.test.ts +1285 -66
  384. package/src/client/components/__tests__/jant-compose-editor.test.ts +254 -19
  385. package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +127 -1
  386. package/src/client/components/__tests__/jant-media-lightbox.test.ts +237 -0
  387. package/src/client/components/__tests__/jant-nav-manager.test.ts +326 -0
  388. package/src/client/components/__tests__/jant-post-menu.test.ts +372 -2
  389. package/src/client/components/__tests__/jant-settings-avatar.test.ts +61 -5
  390. package/src/client/components/__tests__/jant-settings-general.test.ts +29 -28
  391. package/src/client/components/__tests__/jant-text-preview.test.ts +206 -0
  392. package/src/client/components/collection-manager-types.ts +18 -1
  393. package/src/client/components/compose-types.ts +48 -0
  394. package/src/client/components/jant-collection-directory.ts +1448 -0
  395. package/src/client/components/jant-collection-form.ts +65 -15
  396. package/src/client/components/jant-command-palette.ts +544 -0
  397. package/src/client/components/jant-compose-dialog.ts +2490 -375
  398. package/src/client/components/jant-compose-editor.ts +420 -75
  399. package/src/client/components/jant-compose-fullscreen.ts +59 -8
  400. package/src/client/components/jant-media-lightbox.ts +373 -18
  401. package/src/client/components/jant-nav-manager.ts +624 -286
  402. package/src/client/components/jant-post-menu.ts +451 -126
  403. package/src/client/components/jant-repo-picker-types.ts +39 -0
  404. package/src/client/components/jant-repo-picker.ts +799 -0
  405. package/src/client/components/jant-settings-avatar.ts +16 -2
  406. package/src/client/components/jant-settings-general.ts +137 -35
  407. package/src/client/components/jant-text-preview.ts +239 -55
  408. package/src/client/components/nav-manager-types.ts +25 -9
  409. package/src/client/components/settings-types.ts +13 -2
  410. package/src/client/compose-bridge.ts +428 -68
  411. package/src/client/compose-launch.ts +41 -4
  412. package/src/client/compose-shortcuts.ts +77 -5
  413. package/src/client/feed-video-player.ts +374 -0
  414. package/src/client/image-processor.ts +53 -127
  415. package/src/client/media-lightbox-events.ts +1 -0
  416. package/src/client/media-scroll-hint.ts +66 -0
  417. package/src/client/multipart-upload.ts +4 -1
  418. package/src/client/palette-shortcuts.ts +35 -0
  419. package/src/client/search-rank.ts +74 -0
  420. package/src/client/settings-bridge.ts +7 -0
  421. package/src/client/site-header-nav.d.ts +1 -0
  422. package/src/client/site-header-nav.js +139 -51
  423. package/src/client/sortable-list.ts +2 -0
  424. package/src/client/thread-context.ts +54 -11
  425. package/src/client/tiptap/__tests__/block-insertion.test.ts +65 -0
  426. package/src/client/tiptap/__tests__/footnotes.test.ts +692 -0
  427. package/src/client/tiptap/__tests__/link-toolbar.test.ts +120 -4
  428. package/src/client/tiptap/__tests__/markdown-clipboard.test.ts +48 -0
  429. package/src/client/tiptap/block-insertion.ts +36 -0
  430. package/src/client/tiptap/bubble-menu.ts +34 -4
  431. package/src/client/tiptap/create-editor.ts +49 -30
  432. package/src/client/tiptap/embed-dialog.ts +301 -0
  433. package/src/client/tiptap/embed-node.ts +373 -0
  434. package/src/client/tiptap/embed-paste.ts +91 -0
  435. package/src/client/tiptap/extensions.ts +77 -28
  436. package/src/client/tiptap/footnotes.ts +718 -0
  437. package/src/client/tiptap/html-block-node.ts +222 -0
  438. package/src/client/tiptap/image-node.ts +49 -6
  439. package/src/client/tiptap/inline-image-upload.ts +200 -40
  440. package/src/client/tiptap/link-input-rules.ts +50 -16
  441. package/src/client/tiptap/link-toolbar.ts +156 -133
  442. package/src/client/tiptap/markdown-clipboard.ts +120 -0
  443. package/src/client/tiptap/more-break.ts +36 -3
  444. package/src/client/tiptap/paste-media.ts +6 -0
  445. package/src/client/tiptap/slash-commands.ts +167 -14
  446. package/src/client/tiptap/tab-indent.ts +184 -0
  447. package/src/client/tiptap/toolbar-mode.ts +15 -2
  448. package/src/client/tiptap/wrapping-input-rules.ts +102 -0
  449. package/src/client/types/sortablejs.d.ts +9 -1
  450. package/src/client/upload-session.ts +2 -1
  451. package/src/client/video-processor.ts +177 -20
  452. package/src/client-auth.ts +9 -1
  453. package/src/client-site.ts +15 -0
  454. package/src/client.ts +2 -0
  455. package/src/db/__tests__/demo-canonical-snapshot.test.ts +1 -1
  456. package/src/db/__tests__/migration-rehearsal.test.ts +5 -1
  457. package/src/db/__tests__/migrations.test.ts +25 -2
  458. package/src/db/backfills/0001_strip_collection_path_c_prefix.sql +11 -0
  459. package/src/db/backfills/0002_strip_collection_path_c_prefix_fix.sql +12 -0
  460. package/src/db/backfills/0003_clear_system_nav_default_labels.sql +15 -0
  461. package/src/db/dialect.ts +40 -0
  462. package/src/db/migrations/0005_busy_the_phantom.sql +39 -0
  463. package/src/db/migrations/0006_adorable_magdalene.sql +3 -0
  464. package/src/db/migrations/0007_unusual_warstar.sql +1 -0
  465. package/src/db/migrations/0008_nasty_lockheed.sql +1 -0
  466. package/src/db/migrations/0009_clear_fixer.sql +31 -0
  467. package/src/db/migrations/0010_futuristic_preak.sql +31 -0
  468. package/src/db/migrations/0011_bizarre_smasher.sql +30 -0
  469. package/src/db/migrations/0012_furry_thena.sql +52 -0
  470. package/src/db/migrations/0013_mixed_lightspeed.sql +39 -0
  471. package/src/db/migrations/0014_high_the_santerians.sql +41 -0
  472. package/src/db/migrations/0015_skinny_shinobi_shaw.sql +1 -0
  473. package/src/db/migrations/0016_remarkable_nicolaos.sql +17 -0
  474. package/src/db/migrations/0017_powerful_moonstone.sql +14 -0
  475. package/src/db/migrations/meta/0005_snapshot.json +1904 -0
  476. package/src/db/migrations/meta/0006_snapshot.json +1925 -0
  477. package/src/db/migrations/meta/0007_snapshot.json +1933 -0
  478. package/src/db/migrations/meta/0008_snapshot.json +1940 -0
  479. package/src/db/migrations/meta/0009_snapshot.json +1952 -0
  480. package/src/db/migrations/meta/0010_snapshot.json +1952 -0
  481. package/src/db/migrations/meta/0011_snapshot.json +1948 -0
  482. package/src/db/migrations/meta/0012_snapshot.json +1955 -0
  483. package/src/db/migrations/meta/0013_snapshot.json +1977 -0
  484. package/src/db/migrations/meta/0014_snapshot.json +1988 -0
  485. package/src/db/migrations/meta/0015_snapshot.json +1995 -0
  486. package/src/db/migrations/meta/0016_snapshot.json +2104 -0
  487. package/src/db/migrations/meta/0017_snapshot.json +2188 -0
  488. package/src/db/migrations/meta/_journal.json +92 -1
  489. package/src/db/migrations/pg/0003_motionless_norrin_radd.sql +21 -0
  490. package/src/db/migrations/pg/0004_nervous_captain_midlands.sql +3 -0
  491. package/src/db/migrations/pg/0005_romantic_mesmero.sql +1 -0
  492. package/src/db/migrations/pg/0006_perpetual_bruce_banner.sql +1 -0
  493. package/src/db/migrations/pg/0007_nav_item_placement.sql +1 -0
  494. package/src/db/migrations/pg/0008_yielding_frightful_four.sql +3 -0
  495. package/src/db/migrations/pg/0009_outstanding_ogun.sql +1 -0
  496. package/src/db/migrations/pg/0010_overjoyed_gertrude_yorkes.sql +28 -0
  497. package/src/db/migrations/pg/0011_fixed_hulk.sql +19 -0
  498. package/src/db/migrations/pg/0012_cute_shockwave.sql +2 -0
  499. package/src/db/migrations/pg/0013_bizarre_obadiah_stane.sql +1 -0
  500. package/src/db/migrations/pg/0014_tearful_grim_reaper.sql +16 -0
  501. package/src/db/migrations/pg/0015_daffy_mikhail_rasputin.sql +14 -0
  502. package/src/db/migrations/pg/meta/0003_snapshot.json +2482 -0
  503. package/src/db/migrations/pg/meta/0004_snapshot.json +2500 -0
  504. package/src/db/migrations/pg/meta/0005_snapshot.json +2507 -0
  505. package/src/db/migrations/pg/meta/0006_snapshot.json +2513 -0
  506. package/src/db/migrations/pg/meta/0008_snapshot.json +2524 -0
  507. package/src/db/migrations/pg/meta/0009_snapshot.json +2520 -0
  508. package/src/db/migrations/pg/meta/0010_snapshot.json +2526 -0
  509. package/src/db/migrations/pg/meta/0011_snapshot.json +2563 -0
  510. package/src/db/migrations/pg/meta/0012_snapshot.json +2573 -0
  511. package/src/db/migrations/pg/meta/0013_snapshot.json +2579 -0
  512. package/src/db/migrations/pg/meta/0014_snapshot.json +2702 -0
  513. package/src/db/migrations/pg/meta/0015_snapshot.json +2803 -0
  514. package/src/db/migrations/pg/meta/_journal.json +92 -1
  515. package/src/db/pg/__tests__/node.test.ts +38 -0
  516. package/src/db/pg/node.ts +149 -0
  517. package/src/db/pg/schema.ts +130 -12
  518. package/src/db/rehearsal-fixtures/demo-current.sql +47 -3
  519. package/src/db/schema.ts +139 -12
  520. package/src/i18n/Trans.tsx +3 -3
  521. package/src/i18n/__tests__/context.test.tsx +9 -6
  522. package/src/i18n/__tests__/detect.test.ts +65 -48
  523. package/src/i18n/__tests__/fallback.test.ts +40 -0
  524. package/src/i18n/__tests__/message-placeholders.test.ts +43 -0
  525. package/src/i18n/__tests__/middleware.test.ts +83 -0
  526. package/src/i18n/context.tsx +9 -44
  527. package/src/i18n/detect.ts +95 -28
  528. package/src/i18n/i18n.ts +41 -17
  529. package/src/i18n/index.ts +7 -5
  530. package/src/i18n/locales/{en.po → public/en.po} +298 -1151
  531. package/src/i18n/locales/public/en.ts +1 -0
  532. package/src/i18n/locales/public/zh-Hans.po +2327 -0
  533. package/src/i18n/locales/public/zh-Hans.ts +1 -0
  534. package/src/i18n/locales/public/zh-Hant.po +2327 -0
  535. package/src/i18n/locales/public/zh-Hant.ts +1 -0
  536. package/src/i18n/locales/settings/en.po +1622 -0
  537. package/src/i18n/locales/settings/en.ts +1 -0
  538. package/src/i18n/locales/settings/zh-Hans.po +1622 -0
  539. package/src/i18n/locales/settings/zh-Hans.ts +1 -0
  540. package/src/i18n/locales/settings/zh-Hant.po +1622 -0
  541. package/src/i18n/locales/settings/zh-Hant.ts +1 -0
  542. package/src/i18n/middleware.ts +37 -24
  543. package/src/index.ts +4 -5
  544. package/src/lib/__tests__/collection-groups.test.ts +80 -0
  545. package/src/lib/__tests__/constants.test.ts +1 -1
  546. package/src/lib/__tests__/csp-builder.test.ts +68 -0
  547. package/src/lib/__tests__/display-text.test.ts +27 -0
  548. package/src/lib/__tests__/embed-providers.test.ts +104 -0
  549. package/src/lib/__tests__/embed-render.test.ts +60 -0
  550. package/src/lib/__tests__/feed.test.ts +125 -63
  551. package/src/lib/__tests__/hosted-signin.test.ts +11 -2
  552. package/src/lib/__tests__/markdown-roundtrip-embed.test.ts +88 -0
  553. package/src/lib/__tests__/markdown-to-tiptap.test.ts +59 -0
  554. package/src/lib/__tests__/markdown.test.ts +47 -5
  555. package/src/lib/__tests__/navigation.test.ts +148 -0
  556. package/src/lib/__tests__/post-display.test.ts +3 -2
  557. package/src/lib/__tests__/post-meta.test.ts +3 -0
  558. package/src/lib/__tests__/resolve-config.test.ts +30 -25
  559. package/src/lib/__tests__/schemas.test.ts +35 -0
  560. package/src/lib/__tests__/slug-format.test.ts +8 -0
  561. package/src/lib/__tests__/summary.test.ts +400 -1
  562. package/src/lib/__tests__/theme.test.ts +41 -2
  563. package/src/lib/__tests__/timeline.test.ts +114 -26
  564. package/src/lib/__tests__/tiptap-render.test.ts +224 -0
  565. package/src/lib/__tests__/tiptap-to-markdown.test.ts +51 -0
  566. package/src/lib/__tests__/video-playback.test.ts +48 -0
  567. package/src/lib/__tests__/view.test.ts +115 -8
  568. package/src/lib/__tests__/worker-response-cache.test.ts +311 -0
  569. package/src/lib/__tests__/youtube.test.ts +99 -0
  570. package/src/lib/api-media.ts +55 -0
  571. package/src/lib/api-posts.ts +99 -0
  572. package/src/lib/api-search.ts +47 -0
  573. package/src/lib/api-settings.ts +122 -0
  574. package/src/lib/asset-path.ts +20 -2
  575. package/src/lib/collection-groups.ts +70 -0
  576. package/src/lib/collection-paths.ts +40 -0
  577. package/src/lib/constants.ts +3 -4
  578. package/src/lib/csp-builder.ts +99 -0
  579. package/src/lib/decorative-quote-mark.ts +11 -0
  580. package/src/lib/display-text.ts +56 -0
  581. package/src/lib/embed-providers.ts +289 -0
  582. package/src/lib/embed-render.ts +151 -0
  583. package/src/lib/env.ts +70 -1
  584. package/src/lib/excerpt.ts +11 -2
  585. package/src/lib/feed.ts +89 -66
  586. package/src/lib/footnotes.ts +146 -0
  587. package/src/lib/github-api.ts +423 -0
  588. package/src/lib/github-app-state.ts +135 -0
  589. package/src/lib/github-app.ts +487 -0
  590. package/src/lib/github-sync-queue-handler.ts +69 -0
  591. package/src/lib/github-sync-site-config.ts +57 -0
  592. package/src/lib/github-sync-status.tsx +87 -0
  593. package/src/lib/github-sync-trigger.ts +199 -0
  594. package/src/lib/github-sync-worker.ts +72 -0
  595. package/src/lib/hosted-signin.ts +1 -1
  596. package/src/lib/hugo-markdown.ts +255 -0
  597. package/src/lib/job-queue-cf.ts +18 -0
  598. package/src/lib/job-queue-db.ts +149 -0
  599. package/src/lib/job-queue.ts +35 -0
  600. package/src/lib/markdown-manager.ts +864 -0
  601. package/src/lib/markdown-to-tiptap.ts +4 -323
  602. package/src/lib/markdown.ts +16 -24
  603. package/src/lib/media-helpers.ts +1 -0
  604. package/src/lib/navigation.ts +40 -8
  605. package/src/lib/post-display.ts +10 -22
  606. package/src/lib/public-storage.ts +6 -1
  607. package/src/lib/render.tsx +5 -2
  608. package/src/lib/resolve-config.ts +23 -11
  609. package/src/lib/rich-image.ts +89 -0
  610. package/src/lib/schemas.ts +186 -12
  611. package/src/lib/slug-format.ts +8 -0
  612. package/src/lib/summary.ts +125 -18
  613. package/src/lib/theme.ts +119 -0
  614. package/src/lib/timeline.ts +91 -63
  615. package/src/lib/tiptap-render.ts +265 -126
  616. package/src/lib/tiptap-to-markdown.ts +6 -329
  617. package/src/lib/upload.ts +97 -6
  618. package/src/lib/version.ts +18 -0
  619. package/src/lib/video-playback.ts +73 -0
  620. package/src/lib/view.ts +130 -90
  621. package/src/lib/webhook-signature.ts +65 -0
  622. package/src/lib/worker-response-cache.ts +220 -0
  623. package/src/lib/youtube.ts +119 -0
  624. package/src/middleware/__tests__/onboarding.test.ts +3 -3
  625. package/src/middleware/__tests__/secure-headers.test.ts +28 -1
  626. package/src/middleware/config.ts +7 -10
  627. package/src/middleware/cors.ts +49 -0
  628. package/src/middleware/secure-headers.ts +45 -55
  629. package/src/node/__tests__/cli-migrate.test.ts +111 -0
  630. package/src/node/__tests__/cli-runtime-target.test.ts +1 -1
  631. package/src/node/__tests__/cli-site-token-env.test.ts +2 -2
  632. package/src/preset.css +316 -12
  633. package/src/routes/__tests__/compose.test.ts +3 -1
  634. package/src/routes/api/__tests__/collections.test.ts +81 -27
  635. package/src/routes/api/__tests__/mcp.test.ts +389 -0
  636. package/src/routes/api/__tests__/nav-items.test.ts +163 -2
  637. package/src/routes/api/__tests__/posts.test.ts +190 -0
  638. package/src/routes/api/__tests__/settings.test.ts +99 -3
  639. package/src/routes/api/__tests__/upload-multipart.test.ts +10 -2
  640. package/src/routes/api/__tests__/upload.test.ts +132 -0
  641. package/src/routes/api/__tests__/uploads.test.ts +5 -3
  642. package/src/routes/api/collections.ts +67 -26
  643. package/src/routes/api/custom-urls.ts +1 -0
  644. package/src/routes/api/export.ts +8 -4
  645. package/src/routes/api/github-sync.tsx +380 -0
  646. package/src/routes/api/internal/__tests__/sites.test.ts +45 -2
  647. package/src/routes/api/internal/sites.ts +2 -0
  648. package/src/routes/api/internal/text-attachments.ts +60 -0
  649. package/src/routes/api/internal/uploads.ts +5 -1
  650. package/src/routes/api/mcp.ts +30 -0
  651. package/src/routes/api/nav-items.ts +30 -11
  652. package/src/routes/api/palette.ts +17 -0
  653. package/src/routes/api/posts.ts +37 -106
  654. package/src/routes/api/public/__tests__/posts.test.ts +372 -0
  655. package/src/routes/api/public/posts.ts +302 -0
  656. package/src/routes/api/search.ts +1 -47
  657. package/src/routes/api/settings.ts +44 -58
  658. package/src/routes/api/upload-multipart.ts +15 -5
  659. package/src/routes/api/upload.ts +62 -49
  660. package/src/routes/api/uploads.ts +1 -0
  661. package/src/routes/auth/__tests__/hosted-sso.test.ts +33 -0
  662. package/src/routes/auth/__tests__/setup.test.ts +29 -4
  663. package/src/routes/auth/hosted-sso-expired-page.tsx +89 -0
  664. package/src/routes/auth/hosted-sso.ts +42 -1
  665. package/src/routes/auth/reset.tsx +46 -32
  666. package/src/routes/auth/setup.tsx +53 -43
  667. package/src/routes/auth/signin.tsx +34 -24
  668. package/src/routes/compose.tsx +114 -1
  669. package/src/routes/dash/__tests__/font-theme.test.ts +6 -27
  670. package/src/routes/dash/__tests__/settings-avatar.test.ts +2 -3
  671. package/src/routes/dash/custom-urls.tsx +250 -112
  672. package/src/routes/dash/settings.tsx +1179 -70
  673. package/src/routes/feed/__tests__/{rss.test.ts → feed.test.ts} +62 -123
  674. package/src/routes/feed/feed.ts +386 -0
  675. package/src/routes/feed/manifest.ts +67 -0
  676. package/src/routes/feed/sitemap.ts +11 -2
  677. package/src/routes/pages/__tests__/collection-routing.test.ts +176 -0
  678. package/src/routes/pages/__tests__/collections.test.ts +2 -3
  679. package/src/routes/pages/__tests__/featured.test.ts +2 -3
  680. package/src/routes/pages/archive.tsx +523 -127
  681. package/src/routes/pages/collection.tsx +265 -59
  682. package/src/routes/pages/collections.tsx +5 -1
  683. package/src/routes/pages/home.tsx +2 -2
  684. package/src/routes/pages/latest.tsx +3 -3
  685. package/src/routes/pages/page.tsx +221 -3
  686. package/src/routes/pages/partials.tsx +5 -0
  687. package/src/routes/pages/search.tsx +17 -1
  688. package/src/routes/pages/theme-sample.tsx +1 -2
  689. package/src/runtime/__tests__/node.test.ts +1 -1
  690. package/src/runtime/__tests__/readiness.test.ts +89 -0
  691. package/src/runtime/readiness.ts +129 -0
  692. package/src/runtime/site.ts +9 -1
  693. package/src/services/__tests__/collection.test.ts +181 -53
  694. package/src/services/__tests__/github-app-installations.test.ts +181 -0
  695. package/src/services/__tests__/github-sync-classify.test.ts +189 -0
  696. package/src/services/__tests__/github-sync-push.test.ts +159 -0
  697. package/src/services/__tests__/media.test.ts +444 -7
  698. package/src/services/__tests__/navigation.test.ts +271 -14
  699. package/src/services/__tests__/post-timeline.test.ts +85 -17
  700. package/src/services/__tests__/post.test.ts +118 -10
  701. package/src/services/__tests__/settings.test.ts +43 -21
  702. package/src/services/auth.ts +2 -2
  703. package/src/services/bootstrap.ts +10 -7
  704. package/src/services/collection.ts +644 -191
  705. package/src/services/custom-url.ts +34 -7
  706. package/src/services/export-theme/assets/client-site.css +2 -0
  707. package/src/services/export-theme/assets/client-site.js +145 -0
  708. package/src/services/export-theme/layouts/_default/alias.html +49 -0
  709. package/src/services/export-theme/layouts/_default/baseof.html +21 -0
  710. package/src/services/export-theme/layouts/_default/list.html +104 -0
  711. package/src/services/export-theme/layouts/_default/rss.xml +160 -0
  712. package/src/services/export-theme/layouts/_default/single.html +15 -0
  713. package/src/services/export-theme/layouts/archive/list.html +31 -0
  714. package/src/services/export-theme/layouts/collection/single.html +19 -0
  715. package/src/services/export-theme/layouts/collections/list.html +111 -0
  716. package/src/services/export-theme/layouts/featured/list.html +28 -0
  717. package/src/services/export-theme/layouts/index.html +41 -0
  718. package/src/services/export-theme/layouts/partials/feed-post-content.xml +107 -0
  719. package/src/services/export-theme/layouts/partials/footer.html +32 -0
  720. package/src/services/export-theme/layouts/partials/head.html +52 -0
  721. package/src/services/export-theme/layouts/partials/header.html +115 -0
  722. package/src/services/export-theme/layouts/partials/media-gallery.html +246 -0
  723. package/src/services/export-theme/layouts/partials/pagination.html +55 -0
  724. package/src/services/export-theme/layouts/partials/post-card.html +127 -0
  725. package/src/services/export-theme/layouts/partials/reply.html +91 -0
  726. package/src/services/export-theme/layouts/partials/thread-preview.html +82 -0
  727. package/src/services/export-theme/layouts/post/list.html +129 -0
  728. package/src/services/export-theme/styles/main.css +1981 -0
  729. package/src/services/export-theme/theme.toml +12 -0
  730. package/src/services/export.ts +1365 -2412
  731. package/src/services/github-app-installations.ts +302 -0
  732. package/src/services/github-sync.ts +769 -0
  733. package/src/services/index.ts +15 -0
  734. package/src/services/mcp.ts +1324 -0
  735. package/src/services/media.ts +336 -25
  736. package/src/services/navigation.ts +115 -23
  737. package/src/services/path.ts +129 -28
  738. package/src/services/post.ts +779 -207
  739. package/src/services/search.ts +3 -0
  740. package/src/services/settings.ts +29 -15
  741. package/src/services/site-admin.ts +26 -6
  742. package/src/services/upload-session.ts +69 -34
  743. package/src/style-cjk-jp.css +3 -0
  744. package/src/style-cjk-kr.css +3 -0
  745. package/src/styles/components.css +160 -59
  746. package/src/styles/fonts/et-book/et-book-bold-line-figures.woff +0 -0
  747. package/src/styles/fonts/et-book/et-book-display-italic-old-style-figures.woff +0 -0
  748. package/src/styles/fonts/et-book/et-book-roman-line-figures.woff +0 -0
  749. package/src/styles/fonts/et-book.css +31 -0
  750. package/src/styles/fonts/latin.css +1 -0
  751. package/src/styles/fonts/noto-serif-jp/400/057a6a98bda7fe57105ddaa99ec82015.woff2 +0 -0
  752. package/src/styles/fonts/noto-serif-jp/400/0acd1fe2b2ea1ad1bfee7ae1fa139d27.woff2 +0 -0
  753. package/src/styles/fonts/noto-serif-jp/400/0c2ab6b295e55f356f8020d4e7747522.woff2 +0 -0
  754. package/src/styles/fonts/noto-serif-jp/400/0c5f9492af03a4fa42c784de94649de1.woff2 +0 -0
  755. package/src/styles/fonts/noto-serif-jp/400/0d9a936885a4c39077438effd3779cbd.woff2 +0 -0
  756. package/src/styles/fonts/noto-serif-jp/400/0e645da524f7cfc0e8c3c03fb2b08428.woff2 +0 -0
  757. package/src/styles/fonts/noto-serif-jp/400/135e83b403475c5dc9e49b43501a5b84.woff2 +0 -0
  758. package/src/styles/fonts/noto-serif-jp/400/13b2c53b30e6a3e4de7132dbc18dbdfc.woff2 +0 -0
  759. package/src/styles/fonts/noto-serif-jp/400/15d95680dc31cc6ce20e0a5464106dc4.woff2 +0 -0
  760. package/src/styles/fonts/noto-serif-jp/400/1733f27476507ca68b68a803bc533cc2.woff2 +0 -0
  761. package/src/styles/fonts/noto-serif-jp/400/188c2db794f3dd7a45889ddbc81da9bb.woff2 +0 -0
  762. package/src/styles/fonts/noto-serif-jp/400/1cf737900dd49c2e88f1b3221a82a602.woff2 +0 -0
  763. package/src/styles/fonts/noto-serif-jp/400/233d3a685ee18276b319363474599d47.woff2 +0 -0
  764. package/src/styles/fonts/noto-serif-jp/400/284b53bbefb06924cf236d24c8ed5641.woff2 +0 -0
  765. package/src/styles/fonts/noto-serif-jp/400/2a56eaf19d1d38a6b57e2a388f733676.woff2 +0 -0
  766. package/src/styles/fonts/noto-serif-jp/400/2abfbab82b6a7c04426afc054d2464da.woff2 +0 -0
  767. package/src/styles/fonts/noto-serif-jp/400/2e6f4bb71ef6b38765d51acc5a79f638.woff2 +0 -0
  768. package/src/styles/fonts/noto-serif-jp/400/31194d303a67561926a544ed0e072aee.woff2 +0 -0
  769. package/src/styles/fonts/noto-serif-jp/400/3623d96698132c61e861f984ce11cc23.woff2 +0 -0
  770. package/src/styles/fonts/noto-serif-jp/400/39211b02f24c69cbd1b54f6d41b01933.woff2 +0 -0
  771. package/src/styles/fonts/noto-serif-jp/400/3e24063b19abd2b051af986a6870046d.woff2 +0 -0
  772. package/src/styles/fonts/noto-serif-jp/400/4410f876d27c9821839474b6b1059fd7.woff2 +0 -0
  773. package/src/styles/fonts/noto-serif-jp/400/479329a39a3eb6c0047e6b0981919855.woff2 +0 -0
  774. package/src/styles/fonts/noto-serif-jp/400/527ff336279465617aafbafe1a830632.woff2 +0 -0
  775. package/src/styles/fonts/noto-serif-jp/400/56b40518ea0608e62826bd44ee27f5f9.woff2 +0 -0
  776. package/src/styles/fonts/noto-serif-jp/400/5acc7f736217259db79a42bf44241c48.woff2 +0 -0
  777. package/src/styles/fonts/noto-serif-jp/400/5c05f8b75c9d7f25b3c04ca711cf43b3.woff2 +0 -0
  778. package/src/styles/fonts/noto-serif-jp/400/5e0124c7265f1b4cf0fc797b94efbebc.woff2 +0 -0
  779. package/src/styles/fonts/noto-serif-jp/400/615a7e0d63f257109d599b2a1977de68.woff2 +0 -0
  780. package/src/styles/fonts/noto-serif-jp/400/61a2c80d0c924d5a6187c02e8d1d1642.woff2 +0 -0
  781. package/src/styles/fonts/noto-serif-jp/400/62fc94f8d4c5a750b7f25e7387539910.woff2 +0 -0
  782. package/src/styles/fonts/noto-serif-jp/400/639c7c6b0b0c27c738702741cfa4b8c0.woff2 +0 -0
  783. package/src/styles/fonts/noto-serif-jp/400/68a3a4bf337f8a0722be76676e20b850.woff2 +0 -0
  784. package/src/styles/fonts/noto-serif-jp/400/6abdd163d2c4b85698db8aa1ce149361.woff2 +0 -0
  785. package/src/styles/fonts/noto-serif-jp/400/73b794d885b88f7befb7ea8ab1780a15.woff2 +0 -0
  786. package/src/styles/fonts/noto-serif-jp/400/743f290baf027d4626a86e22f3d44600.woff2 +0 -0
  787. package/src/styles/fonts/noto-serif-jp/400/757019c01c5e2c2b0f54293cea3b5636.woff2 +0 -0
  788. package/src/styles/fonts/noto-serif-jp/400/76f117a3baacda304a71965a17266a13.woff2 +0 -0
  789. package/src/styles/fonts/noto-serif-jp/400/77747f17625a259fb405b7bbdd84ac4b.woff2 +0 -0
  790. package/src/styles/fonts/noto-serif-jp/400/788498548ddfb710d6ef3c7bff79fa97.woff2 +0 -0
  791. package/src/styles/fonts/noto-serif-jp/400/78ea6c40923ce95367e3517dd1e5a849.woff2 +0 -0
  792. package/src/styles/fonts/noto-serif-jp/400/7f9a6c9286b68de9c72b0024f7beeb40.woff2 +0 -0
  793. package/src/styles/fonts/noto-serif-jp/400/823d1bb11097331238d103c7f72138dc.woff2 +0 -0
  794. package/src/styles/fonts/noto-serif-jp/400/888ba53510213d5d1f6a7deb60e569b6.woff2 +0 -0
  795. package/src/styles/fonts/noto-serif-jp/400/892aa49b2529c89bb4076d4aa51fe30f.woff2 +0 -0
  796. package/src/styles/fonts/noto-serif-jp/400/95ff41191c76ef893ac70a1043e95e44.woff2 +0 -0
  797. package/src/styles/fonts/noto-serif-jp/400/96c75862c8cec51a7c05ff025fea86cd.woff2 +0 -0
  798. package/src/styles/fonts/noto-serif-jp/400/9b21e8244f5930c48ad5073f83777b6c.woff2 +0 -0
  799. package/src/styles/fonts/noto-serif-jp/400/9fce02d1a09f464c36c9fcfb14a354c5.woff2 +0 -0
  800. package/src/styles/fonts/noto-serif-jp/400/a0a6755c7e3f9e4cf03387027dd9f16c.woff2 +0 -0
  801. package/src/styles/fonts/noto-serif-jp/400/a4475c442c6b259354c9eda62e64e7df.woff2 +0 -0
  802. package/src/styles/fonts/noto-serif-jp/400/a4a39b5f048671aa37c2b2a9581ab08a.woff2 +0 -0
  803. package/src/styles/fonts/noto-serif-jp/400/a534449d67561ac9b06489f64e57ad98.woff2 +0 -0
  804. package/src/styles/fonts/noto-serif-jp/400/a919a8c6fec6d7e8bb21177965f2e9d7.woff2 +0 -0
  805. package/src/styles/fonts/noto-serif-jp/400/ad67113f88b59582991cb0c5d33ea19f.woff2 +0 -0
  806. package/src/styles/fonts/noto-serif-jp/400/adb6e613fb99c6dd660b727101f554a8.woff2 +0 -0
  807. package/src/styles/fonts/noto-serif-jp/400/adc4a98a89870ef984ee8f4b57c8a3a5.woff2 +0 -0
  808. package/src/styles/fonts/noto-serif-jp/400/b12379ab782468d725519cd07a7d15bc.woff2 +0 -0
  809. package/src/styles/fonts/noto-serif-jp/400/b55486f8a459c838fe329d4e79a8c211.woff2 +0 -0
  810. package/src/styles/fonts/noto-serif-jp/400/bb0b15492b8cdbbec57c0bcfa0aa9241.woff2 +0 -0
  811. package/src/styles/fonts/noto-serif-jp/400/bedc74b423b7293b6ad0bdecc61c42cc.woff2 +0 -0
  812. package/src/styles/fonts/noto-serif-jp/400/bfb00d4a4c48661bd0be99f300a0faae.woff2 +0 -0
  813. package/src/styles/fonts/noto-serif-jp/400/c1b0df29ae41d764904df84e9ac83d1e.woff2 +0 -0
  814. package/src/styles/fonts/noto-serif-jp/400/c42c67070cfe99cf823df92d81c7fa6e.woff2 +0 -0
  815. package/src/styles/fonts/noto-serif-jp/400/c4d749e45ecd5a5aed5a0bb3ebfd355d.woff2 +0 -0
  816. package/src/styles/fonts/noto-serif-jp/400/c96d83978add28b356c22c4c84916733.woff2 +0 -0
  817. package/src/styles/fonts/noto-serif-jp/400/cb7ccd6494256f7a2977b7c2b0225592.woff2 +0 -0
  818. package/src/styles/fonts/noto-serif-jp/400/ce41d70ce6a069a498525c9e15c45cf2.woff2 +0 -0
  819. package/src/styles/fonts/noto-serif-jp/400/d509ee5c8241bc7c3de2039d75564fa5.woff2 +0 -0
  820. package/src/styles/fonts/noto-serif-jp/400/d675d717cd329bfd4c0524f76ae1579c.woff2 +0 -0
  821. package/src/styles/fonts/noto-serif-jp/400/dc8f6256445e68199540be9ade33529f.woff2 +0 -0
  822. package/src/styles/fonts/noto-serif-jp/400/e8c15be62faf978d208925e79ea6a10d.woff2 +0 -0
  823. package/src/styles/fonts/noto-serif-jp/400/e91c4d941ed9f5c2f3e27f205a3a225e.woff2 +0 -0
  824. package/src/styles/fonts/noto-serif-jp/400/e9c566be7a5d38a9085225f7372bc82b.woff2 +0 -0
  825. package/src/styles/fonts/noto-serif-jp/400/e9ebc567a711eeb29019ddae3e0ce7fe.woff2 +0 -0
  826. package/src/styles/fonts/noto-serif-jp/400/ecb8875a56c7b038b35432fda41ae128.woff2 +0 -0
  827. package/src/styles/fonts/noto-serif-jp/400/f1661731474b78bdf81114daf10b254f.woff2 +0 -0
  828. package/src/styles/fonts/noto-serif-jp/400/f2c58dee206ba9355046fc23d05491f7.woff2 +0 -0
  829. package/src/styles/fonts/noto-serif-jp/400/f50ac27ea4358d67fdda403c2bb52467.woff2 +0 -0
  830. package/src/styles/fonts/noto-serif-jp/400/f55334112f8e8be82d65db29887a663f.woff2 +0 -0
  831. package/src/styles/fonts/noto-serif-jp/400/f740e93f3c0277ecc616594103bca683.woff2 +0 -0
  832. package/src/styles/fonts/noto-serif-jp/400/f7633b5af033d76ff2fb3c3c266d77c5.woff2 +0 -0
  833. package/src/styles/fonts/noto-serif-jp/400/f7d8468cba2335a83ee414ea68291bab.woff2 +0 -0
  834. package/src/styles/fonts/noto-serif-jp/400/fc9ae5b600fb711f2d67e93ce768cba4.woff2 +0 -0
  835. package/src/styles/fonts/noto-serif-jp/400/fd1bceb55d3e0183ac2454b8532fec7d.woff2 +0 -0
  836. package/src/styles/fonts/noto-serif-jp/700/02611a045a7fe83a12014e3debc9f731.woff2 +0 -0
  837. package/src/styles/fonts/noto-serif-jp/700/0f5e1a18987dbc84ca05188c129e1936.woff2 +0 -0
  838. package/src/styles/fonts/noto-serif-jp/700/112743a4ab5fdd1498dfdf2b11336380.woff2 +0 -0
  839. package/src/styles/fonts/noto-serif-jp/700/1211f03d3ff5759a702631445793f60e.woff2 +0 -0
  840. package/src/styles/fonts/noto-serif-jp/700/147b24c2f08d03bbed30887d4cb3311c.woff2 +0 -0
  841. package/src/styles/fonts/noto-serif-jp/700/16663e567f81f4725a1522f37e18f71f.woff2 +0 -0
  842. package/src/styles/fonts/noto-serif-jp/700/1824321da801e6257b902f3d1d09054c.woff2 +0 -0
  843. package/src/styles/fonts/noto-serif-jp/700/1a3a92c7c060a71a6c35819b9ebcdbb9.woff2 +0 -0
  844. package/src/styles/fonts/noto-serif-jp/700/1fba7ec0e412e911bf31841de5a8a4e4.woff2 +0 -0
  845. package/src/styles/fonts/noto-serif-jp/700/28a97af9ab9d38983d20f39ff09840e1.woff2 +0 -0
  846. package/src/styles/fonts/noto-serif-jp/700/2bfaadaf3479c72286248e6de0be0ec9.woff2 +0 -0
  847. package/src/styles/fonts/noto-serif-jp/700/2c8c55e4cec85ce77e95cac9d330f5cf.woff2 +0 -0
  848. package/src/styles/fonts/noto-serif-jp/700/2ed9981d2e8983365bd051159b976b6d.woff2 +0 -0
  849. package/src/styles/fonts/noto-serif-jp/700/2f4c633e923ba30c6ba376367379fc91.woff2 +0 -0
  850. package/src/styles/fonts/noto-serif-jp/700/349965eee0a9b6c984a319ab96a4ece9.woff2 +0 -0
  851. package/src/styles/fonts/noto-serif-jp/700/36cda3eae13370b934bba4429fab9078.woff2 +0 -0
  852. package/src/styles/fonts/noto-serif-jp/700/3aa13f1843d7c8fa16109b6395a9a29d.woff2 +0 -0
  853. package/src/styles/fonts/noto-serif-jp/700/3e2c06bdd9dcab29aeaeb0cfb7fa608a.woff2 +0 -0
  854. package/src/styles/fonts/noto-serif-jp/700/424123f9371ba357087363263eeafcda.woff2 +0 -0
  855. package/src/styles/fonts/noto-serif-jp/700/43b3bbf43055c3e65db9cdf2c5b18c1c.woff2 +0 -0
  856. package/src/styles/fonts/noto-serif-jp/700/44704471b60c18b3ecec5300a88f1102.woff2 +0 -0
  857. package/src/styles/fonts/noto-serif-jp/700/46604090efbb99c2db1800928af0a239.woff2 +0 -0
  858. package/src/styles/fonts/noto-serif-jp/700/46998df85d31e629c0142f0556f5e7c5.woff2 +0 -0
  859. package/src/styles/fonts/noto-serif-jp/700/49902f1c41b281f8eb3771abdd4dccb8.woff2 +0 -0
  860. package/src/styles/fonts/noto-serif-jp/700/4db4f31a16965baa42cb7dad667a8f04.woff2 +0 -0
  861. package/src/styles/fonts/noto-serif-jp/700/572b9e28f1e6d89b765a16d809db84a1.woff2 +0 -0
  862. package/src/styles/fonts/noto-serif-jp/700/5921cef36750ff6092d94b83a802823b.woff2 +0 -0
  863. package/src/styles/fonts/noto-serif-jp/700/59e95d8b5332dcdae894a19946ab767d.woff2 +0 -0
  864. package/src/styles/fonts/noto-serif-jp/700/5ec349ff62b9ee5fe0c6dae867704dc4.woff2 +0 -0
  865. package/src/styles/fonts/noto-serif-jp/700/601f812e8b1eafecd5ba585a6a6d7962.woff2 +0 -0
  866. package/src/styles/fonts/noto-serif-jp/700/6025ddaf99d86cc8bfd781006b19fbd6.woff2 +0 -0
  867. package/src/styles/fonts/noto-serif-jp/700/60f6e28b3f0400b0e8fe32c3c7116102.woff2 +0 -0
  868. package/src/styles/fonts/noto-serif-jp/700/64a404d675f1d726f0891b7a80794595.woff2 +0 -0
  869. package/src/styles/fonts/noto-serif-jp/700/7158022889c6c177062ac85036e7af10.woff2 +0 -0
  870. package/src/styles/fonts/noto-serif-jp/700/7e38ca789a9e76ac91d9256374e154f0.woff2 +0 -0
  871. package/src/styles/fonts/noto-serif-jp/700/815a0b797465190f60d8b1a04656c42e.woff2 +0 -0
  872. package/src/styles/fonts/noto-serif-jp/700/8726558cf297cbda831cc19514897205.woff2 +0 -0
  873. package/src/styles/fonts/noto-serif-jp/700/8855472f3c02f6c7ebb3216617ebe4af.woff2 +0 -0
  874. package/src/styles/fonts/noto-serif-jp/700/8e231d707f0c4f8e3cde90a6b52a79aa.woff2 +0 -0
  875. package/src/styles/fonts/noto-serif-jp/700/9064c12fd72c7aba235d8c3881755b91.woff2 +0 -0
  876. package/src/styles/fonts/noto-serif-jp/700/911b9e53e9814de2998c60bf3115f560.woff2 +0 -0
  877. package/src/styles/fonts/noto-serif-jp/700/92fdc376bce277874e75db666f175b44.woff2 +0 -0
  878. package/src/styles/fonts/noto-serif-jp/700/930a23430f0eb64480d7fe5f82834e21.woff2 +0 -0
  879. package/src/styles/fonts/noto-serif-jp/700/93bed0e5f2dd5a21cf73304fcfbc149d.woff2 +0 -0
  880. package/src/styles/fonts/noto-serif-jp/700/93f3ea6918533d96d9c252378b9a4af0.woff2 +0 -0
  881. package/src/styles/fonts/noto-serif-jp/700/95a0951d2a2722ff773a1a45e8c474d6.woff2 +0 -0
  882. package/src/styles/fonts/noto-serif-jp/700/982cd1765ca6bbb3e6547e47834d5148.woff2 +0 -0
  883. package/src/styles/fonts/noto-serif-jp/700/9b0c3caac458c7bc9c9133e40405ddea.woff2 +0 -0
  884. package/src/styles/fonts/noto-serif-jp/700/9f3bdab4025dc7c5ba1a5871e62e8918.woff2 +0 -0
  885. package/src/styles/fonts/noto-serif-jp/700/a00e94d4f04df6aa659db9c4954c7efe.woff2 +0 -0
  886. package/src/styles/fonts/noto-serif-jp/700/a2b0597837e382aca19919c4b74e58c8.woff2 +0 -0
  887. package/src/styles/fonts/noto-serif-jp/700/a373e85c96aa0dc303092429fb837e51.woff2 +0 -0
  888. package/src/styles/fonts/noto-serif-jp/700/a6e044424780a57610833cc856c15bf5.woff2 +0 -0
  889. package/src/styles/fonts/noto-serif-jp/700/a7c58070d68dc1724e9d4e781afb78db.woff2 +0 -0
  890. package/src/styles/fonts/noto-serif-jp/700/accc43762ad05edfbff66ba1380d192a.woff2 +0 -0
  891. package/src/styles/fonts/noto-serif-jp/700/ad47bcd6d4663026d648c132d969318d.woff2 +0 -0
  892. package/src/styles/fonts/noto-serif-jp/700/af57a2e8c72f9ba0efb1af771d32c124.woff2 +0 -0
  893. package/src/styles/fonts/noto-serif-jp/700/b0ae5f374e43dac992a4a5d334cebc0b.woff2 +0 -0
  894. package/src/styles/fonts/noto-serif-jp/700/b91234c10fd8b8c8abc88e03afe66a1f.woff2 +0 -0
  895. package/src/styles/fonts/noto-serif-jp/700/b9317198f118a1dfd8ddf2b82ec028f3.woff2 +0 -0
  896. package/src/styles/fonts/noto-serif-jp/700/ba825ae79b1a6f7e0cce5215fcb5c96f.woff2 +0 -0
  897. package/src/styles/fonts/noto-serif-jp/700/bc6183ac08f0fac78c46f80c10cf7c92.woff2 +0 -0
  898. package/src/styles/fonts/noto-serif-jp/700/bc8ccea5abf6598cf3cfa97eb59804bb.woff2 +0 -0
  899. package/src/styles/fonts/noto-serif-jp/700/bc95a792cbca6639214c9b0da13392ff.woff2 +0 -0
  900. package/src/styles/fonts/noto-serif-jp/700/bcfa62f35731856246c146d3a6932bf3.woff2 +0 -0
  901. package/src/styles/fonts/noto-serif-jp/700/c063897793f593eb26d6ff7b7baaba18.woff2 +0 -0
  902. package/src/styles/fonts/noto-serif-jp/700/c6c2971ad1f3221f6cf84028aa0f477e.woff2 +0 -0
  903. package/src/styles/fonts/noto-serif-jp/700/c97f41eef722121d86f55d553c056a39.woff2 +0 -0
  904. package/src/styles/fonts/noto-serif-jp/700/ca62704509932d3232d62918de97af3f.woff2 +0 -0
  905. package/src/styles/fonts/noto-serif-jp/700/d1f064825fa5784b5c930652bd831cce.woff2 +0 -0
  906. package/src/styles/fonts/noto-serif-jp/700/d2faabcedd19f016e7b21bce073c0ec8.woff2 +0 -0
  907. package/src/styles/fonts/noto-serif-jp/700/d320171e57480510f87dbbc7d5264b0a.woff2 +0 -0
  908. package/src/styles/fonts/noto-serif-jp/700/d3a72a99d365dddfbca8d017a8011368.woff2 +0 -0
  909. package/src/styles/fonts/noto-serif-jp/700/d42aafa0f246ad3b4c16fe96d3a3a432.woff2 +0 -0
  910. package/src/styles/fonts/noto-serif-jp/700/d4aaf23c13ae808a4bed617afd13aa07.woff2 +0 -0
  911. package/src/styles/fonts/noto-serif-jp/700/d6bb686bddfbe8f38a36a68e609a8667.woff2 +0 -0
  912. package/src/styles/fonts/noto-serif-jp/700/d9020ff69a83b2a6ee1f42ae480f7db0.woff2 +0 -0
  913. package/src/styles/fonts/noto-serif-jp/700/da90a9012ab2d98f759e3fa0820ef502.woff2 +0 -0
  914. package/src/styles/fonts/noto-serif-jp/700/df10d94bea357a43313e20da5d84bd30.woff2 +0 -0
  915. package/src/styles/fonts/noto-serif-jp/700/e34b2b141e472dc776c86fdf8eea23b0.woff2 +0 -0
  916. package/src/styles/fonts/noto-serif-jp/700/e444fd88f1390636e603d0d681538ac8.woff2 +0 -0
  917. package/src/styles/fonts/noto-serif-jp/700/e79898628283edc27180fc39d0d769c1.woff2 +0 -0
  918. package/src/styles/fonts/noto-serif-jp/700/eaf332445a40942928e5f5750c1c3116.woff2 +0 -0
  919. package/src/styles/fonts/noto-serif-jp/700/f91cd722855f4269256eae1187df64ec.woff2 +0 -0
  920. package/src/styles/fonts/noto-serif-jp/700/fc895f5ce66b656f4a933097bf2a8775.woff2 +0 -0
  921. package/src/styles/fonts/noto-serif-jp/700/fca6720fd14c467d29a90f18ef3859b9.woff2 +0 -0
  922. package/src/styles/fonts/noto-serif-jp/700/fd1bb507bcbf04856eeb7f7fd47ea579.woff2 +0 -0
  923. package/src/styles/fonts/noto-serif-jp/noto-serif-jp.css +3349 -0
  924. package/src/styles/fonts/noto-serif-kr/400/033466ef683afe931f7f520cfb42d928.woff2 +0 -0
  925. package/src/styles/fonts/noto-serif-kr/400/05da12edb9d52210581dc6ec4541031f.woff2 +0 -0
  926. package/src/styles/fonts/noto-serif-kr/400/0968e4861204b51f62a2f8e9f15dd5e0.woff2 +0 -0
  927. package/src/styles/fonts/noto-serif-kr/400/0d5dec931dc885f07fe5cd5af8bed675.woff2 +0 -0
  928. package/src/styles/fonts/noto-serif-kr/400/1076f0f6f66d28d7a2f16427faad4413.woff2 +0 -0
  929. package/src/styles/fonts/noto-serif-kr/400/12ef1ba76bd20b004b865266a1aa70b3.woff2 +0 -0
  930. package/src/styles/fonts/noto-serif-kr/400/152395634a207579552f8cb54db88599.woff2 +0 -0
  931. package/src/styles/fonts/noto-serif-kr/400/1a08931435f885e707edb85978ea3bb6.woff2 +0 -0
  932. package/src/styles/fonts/noto-serif-kr/400/31a197213ae61d7043c81013f52d10d6.woff2 +0 -0
  933. package/src/styles/fonts/noto-serif-kr/400/37dbd564820cce2f7b3331e442da0df3.woff2 +0 -0
  934. package/src/styles/fonts/noto-serif-kr/400/37dc8505b20b37a2477a9121b16d44a7.woff2 +0 -0
  935. package/src/styles/fonts/noto-serif-kr/400/3ac0a07878cacdc98bb889f40f5970d3.woff2 +0 -0
  936. package/src/styles/fonts/noto-serif-kr/400/491bbba374093fff045f55803a22bfef.woff2 +0 -0
  937. package/src/styles/fonts/noto-serif-kr/400/4d38e56738156625329d93bd5c8cc74a.woff2 +0 -0
  938. package/src/styles/fonts/noto-serif-kr/400/57e9a86651366c1ba299e47aa7e358c2.woff2 +0 -0
  939. package/src/styles/fonts/noto-serif-kr/400/57f89adeae55aa7fe2add3fc1801ce03.woff2 +0 -0
  940. package/src/styles/fonts/noto-serif-kr/400/5df9ce98c75f8c50fb4fff7f01a23925.woff2 +0 -0
  941. package/src/styles/fonts/noto-serif-kr/400/60020a830d809c26970cf8e48ba1eeda.woff2 +0 -0
  942. package/src/styles/fonts/noto-serif-kr/400/60bcfa3ea7446eb42394aab02d28be40.woff2 +0 -0
  943. package/src/styles/fonts/noto-serif-kr/400/63fafcb069520613d0ea35ad3e6b1e42.woff2 +0 -0
  944. package/src/styles/fonts/noto-serif-kr/400/65a60d87c64228d258a123cbe85f5f31.woff2 +0 -0
  945. package/src/styles/fonts/noto-serif-kr/400/6968e889e18891d912809fe484c2e745.woff2 +0 -0
  946. package/src/styles/fonts/noto-serif-kr/400/70714891ad3fbfc3d5f10a8669dacc5a.woff2 +0 -0
  947. package/src/styles/fonts/noto-serif-kr/400/761d84afca8d7f34eebefe538adba827.woff2 +0 -0
  948. package/src/styles/fonts/noto-serif-kr/400/76e07530323418ec723c5d7634c9bcca.woff2 +0 -0
  949. package/src/styles/fonts/noto-serif-kr/400/773819b7b9b8fd404a929867c0fd677e.woff2 +0 -0
  950. package/src/styles/fonts/noto-serif-kr/400/7817dd16805145d8538ad57590f69f5a.woff2 +0 -0
  951. package/src/styles/fonts/noto-serif-kr/400/7b59f0ec7792b18458dc5a361e37884c.woff2 +0 -0
  952. package/src/styles/fonts/noto-serif-kr/400/7c3945788a689a69356c1a622d69d48b.woff2 +0 -0
  953. package/src/styles/fonts/noto-serif-kr/400/835b6505bb9eea9678925a1fa885353d.woff2 +0 -0
  954. package/src/styles/fonts/noto-serif-kr/400/8b5c9ef81159f31d2ab35f45ca4373e0.woff2 +0 -0
  955. package/src/styles/fonts/noto-serif-kr/400/8b91c7c2ed390f1278b9befa3aa87233.woff2 +0 -0
  956. package/src/styles/fonts/noto-serif-kr/400/8fb45117a62d92dce44a80f0b729ead5.woff2 +0 -0
  957. package/src/styles/fonts/noto-serif-kr/400/90b7848e9b1623b77bdcf155e90b839c.woff2 +0 -0
  958. package/src/styles/fonts/noto-serif-kr/400/985d4d41afa0934a4eb2de35473fb9a2.woff2 +0 -0
  959. package/src/styles/fonts/noto-serif-kr/400/9bb38fd05201de666b88b82d56a386f7.woff2 +0 -0
  960. package/src/styles/fonts/noto-serif-kr/400/9eff2ab2a9d2ced47ab761bf6fdb11ec.woff2 +0 -0
  961. package/src/styles/fonts/noto-serif-kr/400/9f1963fe8d4d6878d717d872a8f3fdb5.woff2 +0 -0
  962. package/src/styles/fonts/noto-serif-kr/400/a0d00fe4816c95a8c7dffd445ef00b03.woff2 +0 -0
  963. package/src/styles/fonts/noto-serif-kr/400/a0f199077fa1a33bc2a1e01c64de7fe6.woff2 +0 -0
  964. package/src/styles/fonts/noto-serif-kr/400/a7c35e42a659347e490c3cb7983b2e7f.woff2 +0 -0
  965. package/src/styles/fonts/noto-serif-kr/400/aa662092cf249707123ca4d575e2764b.woff2 +0 -0
  966. package/src/styles/fonts/noto-serif-kr/400/aae1eda193285ab817a2d1b408440326.woff2 +0 -0
  967. package/src/styles/fonts/noto-serif-kr/400/b0cb664cb2e1371efda8943c0b7dcd1c.woff2 +0 -0
  968. package/src/styles/fonts/noto-serif-kr/400/b0d1cdced482352cf0d3ae58638aacb9.woff2 +0 -0
  969. package/src/styles/fonts/noto-serif-kr/400/b320f5d185b2cff933ac549c184031c5.woff2 +0 -0
  970. package/src/styles/fonts/noto-serif-kr/400/ba9c59d7dfa4494db1bb764ada81467d.woff2 +0 -0
  971. package/src/styles/fonts/noto-serif-kr/400/bab547459d514f46206e340c4bb2dc88.woff2 +0 -0
  972. package/src/styles/fonts/noto-serif-kr/400/bcc39eda837bb7a7a3d37c8c60fffb81.woff2 +0 -0
  973. package/src/styles/fonts/noto-serif-kr/400/bd73264d7f98776708d5d6f3c9b78fcc.woff2 +0 -0
  974. package/src/styles/fonts/noto-serif-kr/400/bed610b217d500f5975cfc9fe6157570.woff2 +0 -0
  975. package/src/styles/fonts/noto-serif-kr/400/bf8901f8f11d4f433ea17dabc9370ea6.woff2 +0 -0
  976. package/src/styles/fonts/noto-serif-kr/400/c4143bb9f2fe77b6ccf20088a8904650.woff2 +0 -0
  977. package/src/styles/fonts/noto-serif-kr/400/c7ff3f6bbdcd5f604b7343602ab904df.woff2 +0 -0
  978. package/src/styles/fonts/noto-serif-kr/400/c945c62368357d05a53206620460fb30.woff2 +0 -0
  979. package/src/styles/fonts/noto-serif-kr/400/ce022e18a1377ac509443c3c3790b431.woff2 +0 -0
  980. package/src/styles/fonts/noto-serif-kr/400/cf9cffe56636322f62b40d61130fbc5e.woff2 +0 -0
  981. package/src/styles/fonts/noto-serif-kr/400/d20d8944bc0b85f5b2aae4b24f343516.woff2 +0 -0
  982. package/src/styles/fonts/noto-serif-kr/400/d36644d6502527e1fff205d0c7eca434.woff2 +0 -0
  983. package/src/styles/fonts/noto-serif-kr/400/d40ab99c7a38026f411c8f112f742b48.woff2 +0 -0
  984. package/src/styles/fonts/noto-serif-kr/400/dc6e234ded795e91f76d6647f628fbf0.woff2 +0 -0
  985. package/src/styles/fonts/noto-serif-kr/400/dd0cfdfdac0866e66d587e2b5a9e9961.woff2 +0 -0
  986. package/src/styles/fonts/noto-serif-kr/400/de304c8a02e45ded4f8dcc479d167198.woff2 +0 -0
  987. package/src/styles/fonts/noto-serif-kr/400/e8c364c16daa04835bf32d293d2598db.woff2 +0 -0
  988. package/src/styles/fonts/noto-serif-kr/400/ec86e23683052da5cfdc3b77641bd15a.woff2 +0 -0
  989. package/src/styles/fonts/noto-serif-kr/400/eda1b0cb6d1719dd9bedcf3216a9e8de.woff2 +0 -0
  990. package/src/styles/fonts/noto-serif-kr/400/ee6fce20b420a480714607c66d7f97e5.woff2 +0 -0
  991. package/src/styles/fonts/noto-serif-kr/400/eee3836d6ac17ebb2c450bbcbc9db121.woff2 +0 -0
  992. package/src/styles/fonts/noto-serif-kr/400/f5738255e92d8dd34a46d1bcdf4c4074.woff2 +0 -0
  993. package/src/styles/fonts/noto-serif-kr/400/fa6e58ce4b52695e7ae19bbea6336ec8.woff2 +0 -0
  994. package/src/styles/fonts/noto-serif-kr/400/fd2069e6e8588c70b4f11364093b81f2.woff2 +0 -0
  995. package/src/styles/fonts/noto-serif-kr/700/04b8bde59cff68eeee74fb1914eb09c7.woff2 +0 -0
  996. package/src/styles/fonts/noto-serif-kr/700/05ac821472e235943ed1435e4bb8ecad.woff2 +0 -0
  997. package/src/styles/fonts/noto-serif-kr/700/074c1f8483d5a4d8c45c8c5f3e4cbb32.woff2 +0 -0
  998. package/src/styles/fonts/noto-serif-kr/700/1380210a722ac9aeef54005ad7b015c9.woff2 +0 -0
  999. package/src/styles/fonts/noto-serif-kr/700/17c7f5d0a45e92ede0e5dec3a2c77efa.woff2 +0 -0
  1000. package/src/styles/fonts/noto-serif-kr/700/1be602ad456b0d75902d352116cb35fd.woff2 +0 -0
  1001. package/src/styles/fonts/noto-serif-kr/700/2612c60f9dc5459ac42763591240a1d6.woff2 +0 -0
  1002. package/src/styles/fonts/noto-serif-kr/700/2ab8cf1f23a5ac7939a7876054e711a7.woff2 +0 -0
  1003. package/src/styles/fonts/noto-serif-kr/700/34e6750e00c3a911ef87dc66b336594d.woff2 +0 -0
  1004. package/src/styles/fonts/noto-serif-kr/700/36f3df4730cfca4fc77fe52b52e6a126.woff2 +0 -0
  1005. package/src/styles/fonts/noto-serif-kr/700/37887deb7a9c466cf2af6ee7ff372ea6.woff2 +0 -0
  1006. package/src/styles/fonts/noto-serif-kr/700/3aba89c4d4281553078de4622b498cbb.woff2 +0 -0
  1007. package/src/styles/fonts/noto-serif-kr/700/3d88558097559d775231194d43745ba7.woff2 +0 -0
  1008. package/src/styles/fonts/noto-serif-kr/700/3dc3e8c35524cad2d1236f3393104ccf.woff2 +0 -0
  1009. package/src/styles/fonts/noto-serif-kr/700/45140742dfa8686b58db2899ce89f89a.woff2 +0 -0
  1010. package/src/styles/fonts/noto-serif-kr/700/469d2754e315e77270c12fa0ab28026c.woff2 +0 -0
  1011. package/src/styles/fonts/noto-serif-kr/700/4c0760284569b87d8f2290c324953973.woff2 +0 -0
  1012. package/src/styles/fonts/noto-serif-kr/700/4cba92c942694bdc479bc54101bb1aa4.woff2 +0 -0
  1013. package/src/styles/fonts/noto-serif-kr/700/4e7d263c30bb48604069a3b4404d4eeb.woff2 +0 -0
  1014. package/src/styles/fonts/noto-serif-kr/700/5279c7e465d9871edf51fd02e691eee7.woff2 +0 -0
  1015. package/src/styles/fonts/noto-serif-kr/700/54bfdb6f21f9d6191e5100580239e14f.woff2 +0 -0
  1016. package/src/styles/fonts/noto-serif-kr/700/56be5e32fd01668fe5ba814d94905839.woff2 +0 -0
  1017. package/src/styles/fonts/noto-serif-kr/700/615b38e0b5bb3ea68426f44f47706e6f.woff2 +0 -0
  1018. package/src/styles/fonts/noto-serif-kr/700/65e9c4585d71bf48a5c62f367010da16.woff2 +0 -0
  1019. package/src/styles/fonts/noto-serif-kr/700/6b75213eb0be40ce84241eb2bb438a2e.woff2 +0 -0
  1020. package/src/styles/fonts/noto-serif-kr/700/7520ca6ca8c60eb1e62d50e71c8d30f1.woff2 +0 -0
  1021. package/src/styles/fonts/noto-serif-kr/700/759a647b77791b1e98f99bc0ab5317a7.woff2 +0 -0
  1022. package/src/styles/fonts/noto-serif-kr/700/76e51630143b95b6322ef93ad330da7a.woff2 +0 -0
  1023. package/src/styles/fonts/noto-serif-kr/700/79aa7c8c842c4a27cf57c0a3a1ffca5a.woff2 +0 -0
  1024. package/src/styles/fonts/noto-serif-kr/700/7cc72fd2c9105560422b6a67c6162945.woff2 +0 -0
  1025. package/src/styles/fonts/noto-serif-kr/700/7d0ea0690e432462f4d05a23d720ec19.woff2 +0 -0
  1026. package/src/styles/fonts/noto-serif-kr/700/7dffa5c1bec57e0903fd62357401ff1a.woff2 +0 -0
  1027. package/src/styles/fonts/noto-serif-kr/700/82f6ccc063960eed1cdfd1d61ada8862.woff2 +0 -0
  1028. package/src/styles/fonts/noto-serif-kr/700/845b4b67564d62cf5cad242f7ac08ea5.woff2 +0 -0
  1029. package/src/styles/fonts/noto-serif-kr/700/84c8e7bc0931008ed91f44ed12dfea94.woff2 +0 -0
  1030. package/src/styles/fonts/noto-serif-kr/700/887a11290ba78b1e66c6d2f67043005e.woff2 +0 -0
  1031. package/src/styles/fonts/noto-serif-kr/700/88db1d042074fb6e66821ffc10941930.woff2 +0 -0
  1032. package/src/styles/fonts/noto-serif-kr/700/8dc18c0cebe6aa4bf4c45dbb831048ab.woff2 +0 -0
  1033. package/src/styles/fonts/noto-serif-kr/700/919a879bd2d580d8491a31a449390689.woff2 +0 -0
  1034. package/src/styles/fonts/noto-serif-kr/700/91da6cb174bebfb96976e2f1316be2fe.woff2 +0 -0
  1035. package/src/styles/fonts/noto-serif-kr/700/934dfdbed2bb2c4b6129199d699a34fa.woff2 +0 -0
  1036. package/src/styles/fonts/noto-serif-kr/700/97d7a17234f2b5030ae9697ae00aded2.woff2 +0 -0
  1037. package/src/styles/fonts/noto-serif-kr/700/995c4fda62d25c3b79dd5987737df6ae.woff2 +0 -0
  1038. package/src/styles/fonts/noto-serif-kr/700/9d0afa53dc2f92ba42024f55f11f6779.woff2 +0 -0
  1039. package/src/styles/fonts/noto-serif-kr/700/9e13a47242926f1cd7d68c08d9ef8889.woff2 +0 -0
  1040. package/src/styles/fonts/noto-serif-kr/700/a379ada89abd750c587ded29f77e731c.woff2 +0 -0
  1041. package/src/styles/fonts/noto-serif-kr/700/a48be56ce5d3a99dc8f8331398004412.woff2 +0 -0
  1042. package/src/styles/fonts/noto-serif-kr/700/a806759e72987951d6d08b7cbdf36a1b.woff2 +0 -0
  1043. package/src/styles/fonts/noto-serif-kr/700/a88481ec8bc7be11cb66e46781a79bb9.woff2 +0 -0
  1044. package/src/styles/fonts/noto-serif-kr/700/a9a016d4a93409f65278327e8a8bb38d.woff2 +0 -0
  1045. package/src/styles/fonts/noto-serif-kr/700/ab92d41062a7644faa45f50bf384454a.woff2 +0 -0
  1046. package/src/styles/fonts/noto-serif-kr/700/b326a8a9c33b554db570da94f60bc380.woff2 +0 -0
  1047. package/src/styles/fonts/noto-serif-kr/700/b6117ff2993b11bb1fdc7ea3588a010c.woff2 +0 -0
  1048. package/src/styles/fonts/noto-serif-kr/700/b61982951bd51b724143c30dfaaa9fe9.woff2 +0 -0
  1049. package/src/styles/fonts/noto-serif-kr/700/c0098958e20db68cab90097b5e62516f.woff2 +0 -0
  1050. package/src/styles/fonts/noto-serif-kr/700/c4bfaa5e50798246e3770718b7a7c84a.woff2 +0 -0
  1051. package/src/styles/fonts/noto-serif-kr/700/c84598999133455503042e06f4ab79cb.woff2 +0 -0
  1052. package/src/styles/fonts/noto-serif-kr/700/ca9a533988d7019597a60d4e17127e0c.woff2 +0 -0
  1053. package/src/styles/fonts/noto-serif-kr/700/cf2b28f90f47276f7e2688a65e88a101.woff2 +0 -0
  1054. package/src/styles/fonts/noto-serif-kr/700/d689b1861d7e4377dd72ad3013482612.woff2 +0 -0
  1055. package/src/styles/fonts/noto-serif-kr/700/d9047070d72a816b3dba9d40c2d85e69.woff2 +0 -0
  1056. package/src/styles/fonts/noto-serif-kr/700/da04549f3f4ed28076b01b8cd710d313.woff2 +0 -0
  1057. package/src/styles/fonts/noto-serif-kr/700/da7af303f8c645f9a9dbae0e6e32dd35.woff2 +0 -0
  1058. package/src/styles/fonts/noto-serif-kr/700/df9568257eb29b156449fdd4bec5ec76.woff2 +0 -0
  1059. package/src/styles/fonts/noto-serif-kr/700/e067cd0ed76c90cd0a93c9339253f20b.woff2 +0 -0
  1060. package/src/styles/fonts/noto-serif-kr/700/e08b07772e7bed3cec2832d43f7fd339.woff2 +0 -0
  1061. package/src/styles/fonts/noto-serif-kr/700/e12150d5a39b30be8f567968c7a527b0.woff2 +0 -0
  1062. package/src/styles/fonts/noto-serif-kr/700/e53fcb2381eee345db4f6f973dd95a3e.woff2 +0 -0
  1063. package/src/styles/fonts/noto-serif-kr/700/e5bd313ef81f687d398aacb11cec3069.woff2 +0 -0
  1064. package/src/styles/fonts/noto-serif-kr/700/eb5afb3d952b8593782caec6026514b6.woff2 +0 -0
  1065. package/src/styles/fonts/noto-serif-kr/700/edd6a4f608d04fc0351d7688cfc321e4.woff2 +0 -0
  1066. package/src/styles/fonts/noto-serif-kr/700/f9695c6c4df2bf6bc03045ff79d4f01f.woff2 +0 -0
  1067. package/src/styles/fonts/noto-serif-kr/700/fada6eaa68ff8816afe43d2a36c5423e.woff2 +0 -0
  1068. package/src/styles/fonts/noto-serif-kr/700/fbcc4bf5367218951172bdee6f77d7a6.woff2 +0 -0
  1069. package/src/styles/fonts/noto-serif-kr/noto-serif-kr.css +2601 -0
  1070. package/src/styles/site-media.css +823 -0
  1071. package/src/styles/tokens.css +292 -21
  1072. package/src/styles/ui.css +4217 -1869
  1073. package/src/types/bindings.ts +3 -1
  1074. package/src/types/config.ts +139 -9
  1075. package/src/types/constants.ts +46 -11
  1076. package/src/types/entities.ts +24 -8
  1077. package/src/types/operations.ts +80 -1
  1078. package/src/types/props.ts +12 -3
  1079. package/src/types/raw-assets.d.ts +39 -0
  1080. package/src/types/views.ts +28 -7
  1081. package/src/ui/__tests__/color-themes.test.ts +7 -40
  1082. package/src/ui/__tests__/font-themes.test.ts +30 -11
  1083. package/src/ui/color-themes.ts +311 -270
  1084. package/src/ui/compose/ComposeDialog.tsx +712 -394
  1085. package/src/ui/compose/ComposePrompt.tsx +15 -10
  1086. package/src/ui/dash/ActionButtons.tsx +27 -18
  1087. package/src/ui/dash/DangerZone.tsx +15 -10
  1088. package/src/ui/dash/FormatBadge.tsx +21 -8
  1089. package/src/ui/dash/StatusBadge.tsx +33 -22
  1090. package/src/ui/dash/appearance/AdvancedContent.tsx +44 -30
  1091. package/src/ui/dash/appearance/CodeInjectionContent.tsx +164 -0
  1092. package/src/ui/dash/appearance/ColorThemeContent.tsx +127 -160
  1093. package/src/ui/dash/appearance/FontThemeContent.tsx +20 -15
  1094. package/src/ui/dash/appearance/NavigationContent.tsx +368 -225
  1095. package/src/ui/dash/appearance/__tests__/NavigationContent.test.tsx +54 -0
  1096. package/src/ui/dash/settings/AccountContent.tsx +34 -23
  1097. package/src/ui/dash/settings/AccountMenuContent.tsx +226 -137
  1098. package/src/ui/dash/settings/ApiTokensContent.tsx +122 -79
  1099. package/src/ui/dash/settings/AvatarContent.tsx +73 -45
  1100. package/src/ui/dash/settings/DeleteAccountContent.tsx +106 -66
  1101. package/src/ui/dash/settings/GeneralContent.tsx +274 -157
  1102. package/src/ui/dash/settings/GitHubSyncContent.tsx +558 -0
  1103. package/src/ui/dash/settings/SessionsContent.tsx +79 -38
  1104. package/src/ui/dash/settings/SettingsRootContent.tsx +209 -109
  1105. package/src/ui/dash/settings/__tests__/AccountMenuContent.test.tsx +67 -0
  1106. package/src/ui/dash/settings/__tests__/GeneralContent.test.tsx +75 -0
  1107. package/src/ui/feed/CuratedThreadPreview.tsx +24 -14
  1108. package/src/ui/feed/LinkCard.tsx +116 -84
  1109. package/src/ui/feed/LinkPreview.tsx +75 -0
  1110. package/src/ui/feed/NoteCard.tsx +60 -16
  1111. package/src/ui/feed/PostStatusBadges.tsx +15 -0
  1112. package/src/ui/feed/QuoteCard.tsx +10 -3
  1113. package/src/ui/feed/ThreadPreview.tsx +62 -36
  1114. package/src/ui/feed/TimelineFeed.tsx +2 -1
  1115. package/src/ui/feed/__tests__/thread-preview.test.ts +220 -11
  1116. package/src/ui/feed/__tests__/timeline-cards.test.ts +186 -5
  1117. package/src/ui/feed/thread-preview-state.ts +23 -10
  1118. package/src/ui/font-themes.ts +57 -97
  1119. package/src/ui/layouts/BaseLayout.tsx +221 -136
  1120. package/src/ui/layouts/SiteLayout.tsx +431 -143
  1121. package/src/ui/layouts/__tests__/BaseLayout.test.tsx +76 -6
  1122. package/src/ui/layouts/__tests__/SiteLayout.test.tsx +76 -0
  1123. package/src/ui/pages/ArchivePage.tsx +320 -207
  1124. package/src/ui/pages/BrandPage.tsx +499 -341
  1125. package/src/ui/pages/CollectionEditorPage.tsx +50 -30
  1126. package/src/ui/pages/CollectionPage.tsx +201 -61
  1127. package/src/ui/pages/CollectionsPage.tsx +27 -18
  1128. package/src/ui/pages/ComposePage.tsx +15 -10
  1129. package/src/ui/pages/FeaturedPage.tsx +16 -11
  1130. package/src/ui/pages/HomePage.tsx +15 -10
  1131. package/src/ui/pages/PostPage.tsx +5 -1
  1132. package/src/ui/pages/SearchPage.tsx +93 -43
  1133. package/src/ui/pages/ThemeSamplePage.tsx +758 -520
  1134. package/src/ui/pages/__tests__/ArchivePage.test.tsx +72 -0
  1135. package/src/ui/shared/CollectionDirectory.tsx +232 -37
  1136. package/src/ui/shared/CollectionsManager.tsx +155 -75
  1137. package/src/ui/shared/DecorativeQuoteMark.tsx +12 -9
  1138. package/src/ui/shared/MediaGallery.tsx +350 -256
  1139. package/src/ui/shared/Pagination.tsx +36 -25
  1140. package/src/ui/shared/PostFooter.tsx +139 -96
  1141. package/src/ui/shared/__tests__/media-gallery.test.ts +27 -0
  1142. package/src/ui/shared/__tests__/navigation-labels.test.ts +79 -28
  1143. package/src/ui/shared/__tests__/post-footer.test.ts +42 -17
  1144. package/src/ui/shared/collection-management-labels.ts +109 -33
  1145. package/src/ui/shared/navigation-labels.ts +78 -8
  1146. package/bin/lib/site-localize-media.js +0 -427
  1147. package/dist/client/_assets/client-auth.js +0 -3251
  1148. package/dist/client/_assets/client.css +0 -2
  1149. package/dist/client/_assets/client.js +0 -380
  1150. package/src/__tests__/site-localize-media.test.ts +0 -150
  1151. package/src/client/components/jant-collection-sidebar.ts +0 -803
  1152. package/src/i18n/locales/en.ts +0 -1
  1153. package/src/i18n/locales/zh-Hans.po +0 -3183
  1154. package/src/i18n/locales/zh-Hans.ts +0 -1
  1155. package/src/i18n/locales/zh-Hant.po +0 -3183
  1156. package/src/i18n/locales/zh-Hant.ts +0 -1
  1157. package/src/routes/feed/rss.ts +0 -216
  1158. package/src/types/lingui-react-macro.d.ts +0 -34
  1159. /package/dist/client/_assets/chunks/{heic-to-XcUDQvtx.js → heic-to-DUUaO23q.js} +0 -0
  1160. /package/dist/client/_assets/chunks/{module-ChVQstFd.js → module-DcsAZQZ_.js} +0 -0
  1161. /package/dist/client/_assets/chunks/{native-CR5HLOyf.js → native-DpcrFAPh.js} +0 -0
  1162. /package/dist/client/_assets/{client-cjk.css → client-cjk-B7Z0snDu.css} +0 -0
  1163. /package/dist/client/_assets/{client-cjk-tc.css → client-cjk-tc-BesJYrb2.css} +0 -0
@@ -0,0 +1,1981 @@
1
+ /*
2
+ * Jant Hugo Export — main.css
3
+ *
4
+ * Fresh minimal text-first design. All colors, spacing, and type sizing
5
+ * come from tokens.css (loaded first in the <head>). Color theme values
6
+ * are supplied by theme.css; customizations live in custom.css.
7
+ *
8
+ * Load order in <head>: tokens.css → main.css → theme.css → custom.css
9
+ *
10
+ * This file intentionally avoids any hardcoded hex, rgb, or px color
11
+ * values. Everything token-driven so the design evolves with the theme.
12
+ */
13
+
14
+ /* -------------------------------------------------------------------------
15
+ * Reset + box model
16
+ * ------------------------------------------------------------------------- */
17
+
18
+ *,
19
+ *::before,
20
+ *::after {
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ html {
25
+ font-size: 15px;
26
+ -webkit-text-size-adjust: 100%;
27
+ text-size-adjust: 100%;
28
+ }
29
+
30
+ body {
31
+ margin: 0;
32
+ font-family: var(--font-body);
33
+ font-size: var(--type-body-size, var(--type-content-body));
34
+ line-height: var(--type-body-leading);
35
+ color: var(--site-reading-body);
36
+ background-color: var(--site-page-bg);
37
+ -webkit-font-smoothing: antialiased;
38
+ -moz-osx-font-smoothing: grayscale;
39
+ }
40
+
41
+ img,
42
+ video,
43
+ audio,
44
+ iframe {
45
+ max-width: 100%;
46
+ height: auto;
47
+ }
48
+
49
+ figure {
50
+ margin: 0;
51
+ }
52
+
53
+ hr {
54
+ border: 0;
55
+ border-top: 1px solid var(--site-divider);
56
+ margin: var(--space-xl) 0;
57
+ }
58
+
59
+ /* -------------------------------------------------------------------------
60
+ * Typography
61
+ * ------------------------------------------------------------------------- */
62
+
63
+ h1,
64
+ h2,
65
+ h3,
66
+ h4,
67
+ h5,
68
+ h6 {
69
+ font-family: var(--font-heading);
70
+ font-weight: var(--type-heading-weight);
71
+ line-height: var(--type-heading-leading);
72
+ letter-spacing: var(--type-heading-tracking);
73
+ color: var(--site-reading-heading);
74
+ margin: 1.6em 0 0.6em;
75
+ }
76
+
77
+ h1 {
78
+ font-size: var(--type-content-display);
79
+ line-height: var(--type-display-leading);
80
+ font-weight: var(--type-display-weight);
81
+ letter-spacing: var(--type-display-tracking);
82
+ margin: 4rem 0 1.5rem;
83
+ }
84
+
85
+ h2 {
86
+ font-size: var(--type-content-title);
87
+ font-style: italic;
88
+ margin: 2.1rem 0 1.4rem;
89
+ }
90
+
91
+ h3 {
92
+ font-size: var(--type-content-subtitle);
93
+ font-style: italic;
94
+ margin: 2rem 0 1.4rem;
95
+ }
96
+
97
+ h4 {
98
+ font-size: var(--type-content-body);
99
+ font-weight: var(--fw-medium);
100
+ }
101
+
102
+ h5,
103
+ h6 {
104
+ font-size: var(--type-content-body);
105
+ font-weight: var(--fw-medium);
106
+ color: var(--site-reading-meta);
107
+ }
108
+
109
+ p {
110
+ margin: 1.4rem 0;
111
+ }
112
+
113
+ small {
114
+ font-size: var(--type-sm);
115
+ }
116
+
117
+ code,
118
+ kbd,
119
+ samp {
120
+ font-family: var(--font-mono);
121
+ font-size: var(--type-code);
122
+ }
123
+
124
+ pre {
125
+ font-family: var(--font-mono);
126
+ font-size: var(--type-code-block);
127
+ line-height: 1.5;
128
+ padding: 1rem;
129
+ overflow-x: auto;
130
+ background-color: var(--site-feed-card-bg);
131
+ border: 1px solid var(--site-feed-card-border);
132
+ border-radius: 0.375rem;
133
+ }
134
+
135
+ pre code {
136
+ padding: 0;
137
+ background: transparent;
138
+ border: 0;
139
+ font-size: inherit;
140
+ }
141
+
142
+ :not(pre) > code {
143
+ padding: 0.1em 0.35em;
144
+ background-color: var(--site-feed-card-bg);
145
+ border: 1px solid var(--site-feed-card-border);
146
+ border-radius: 0.25rem;
147
+ }
148
+
149
+ /* Blockquotes — tinted background card with quote icon (matches main site). */
150
+ blockquote {
151
+ position: relative;
152
+ margin: 1.4rem 0;
153
+ padding: 1.4rem 1rem 0.75rem;
154
+ border: none;
155
+ background: var(--site-blockquote-bg);
156
+ border-radius: 6px;
157
+ color: var(--site-blockquote-text);
158
+ font-family: var(--font-blockquote);
159
+ font-style: italic;
160
+ font-weight: inherit;
161
+ quotes: none;
162
+ text-wrap: pretty;
163
+ }
164
+
165
+ blockquote::before {
166
+ content: "";
167
+ display: block;
168
+ width: 1.3rem;
169
+ height: 1.3rem;
170
+ margin-bottom: 0.35rem;
171
+ background: var(--site-blockquote-rail);
172
+ opacity: 0.6;
173
+ mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 96 96' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M24.4 10.5C16.9 17.7 11.5 26.8 8.2 37.7C4.9 48.7 4.8 58.9 7.8 68.2C10.3 75.7 15.4 79.5 22.9 79.5C28 79.5 32.2 77.8 35.4 74.2C38.6 70.7 40.2 66.5 40.2 61.4C40.2 56.5 38.8 52.6 36 49.6C33.3 46.6 29.7 45.1 25.2 45.1C23.4 45.1 21.8 45.3 20.2 45.8C22.2 37.3 26.7 29.2 33.6 21.4L24.4 10.5Z'/%3E%3Cpath d='M60.8 10.5C53.3 17.7 47.9 26.8 44.6 37.7C41.3 48.7 41.2 58.9 44.2 68.2C46.7 75.7 51.8 79.5 59.3 79.5C64.4 79.5 68.6 77.8 71.8 74.2C75 70.7 76.6 66.5 76.6 61.4C76.6 56.5 75.2 52.6 72.4 49.6C69.7 46.6 66.1 45.1 61.6 45.1C59.8 45.1 58.2 45.3 56.6 45.8C58.6 37.3 63.1 29.2 70 21.4L60.8 10.5Z'/%3E%3C/svg%3E");
174
+ mask-size: contain;
175
+ mask-repeat: no-repeat;
176
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 96 96' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M24.4 10.5C16.9 17.7 11.5 26.8 8.2 37.7C4.9 48.7 4.8 58.9 7.8 68.2C10.3 75.7 15.4 79.5 22.9 79.5C28 79.5 32.2 77.8 35.4 74.2C38.6 70.7 40.2 66.5 40.2 61.4C40.2 56.5 38.8 52.6 36 49.6C33.3 46.6 29.7 45.1 25.2 45.1C23.4 45.1 21.8 45.3 20.2 45.8C22.2 37.3 26.7 29.2 33.6 21.4L24.4 10.5Z'/%3E%3Cpath d='M60.8 10.5C53.3 17.7 47.9 26.8 44.6 37.7C41.3 48.7 41.2 58.9 44.2 68.2C46.7 75.7 51.8 79.5 59.3 79.5C64.4 79.5 68.6 77.8 71.8 74.2C75 70.7 76.6 66.5 76.6 61.4C76.6 56.5 75.2 52.6 72.4 49.6C69.7 46.6 66.1 45.1 61.6 45.1C59.8 45.1 58.2 45.3 56.6 45.8C58.6 37.3 63.1 29.2 70 21.4L60.8 10.5Z'/%3E%3C/svg%3E");
177
+ -webkit-mask-size: contain;
178
+ -webkit-mask-repeat: no-repeat;
179
+ }
180
+
181
+ blockquote :where(p:first-of-type)::before,
182
+ blockquote :where(p:last-of-type)::after {
183
+ content: none;
184
+ }
185
+
186
+ blockquote > :first-child {
187
+ margin-top: 0;
188
+ }
189
+
190
+ blockquote > :last-child {
191
+ margin-bottom: 0;
192
+ }
193
+
194
+ blockquote p {
195
+ margin: 0;
196
+ }
197
+
198
+ blockquote p + p,
199
+ blockquote ul,
200
+ blockquote ol,
201
+ blockquote pre {
202
+ margin-top: 0.6em;
203
+ }
204
+
205
+ blockquote cite {
206
+ font-style: normal;
207
+ color: var(--site-reading-meta);
208
+ font-size: var(--type-sm);
209
+ }
210
+
211
+ /* CJK: no italic for blockquotes (no true italic glyph) */
212
+ :lang(zh) blockquote,
213
+ :lang(ja) blockquote,
214
+ :lang(ko) blockquote {
215
+ font-style: normal;
216
+ }
217
+
218
+ ul,
219
+ ol {
220
+ padding-left: 1.625em;
221
+ margin: 1.25em 0;
222
+ }
223
+
224
+ li {
225
+ margin-top: 1.2em;
226
+ margin-bottom: 1.2em;
227
+ }
228
+
229
+ /* Normalize li > p so list spacing is controlled by li alone,
230
+ regardless of whether the markdown renderer wraps li contents in <p>. */
231
+ li > p:first-child {
232
+ margin-top: 0;
233
+ }
234
+
235
+ li > p:last-child {
236
+ margin-bottom: 0;
237
+ }
238
+
239
+ a {
240
+ color: var(--site-reading-link);
241
+ text-decoration: underline;
242
+ text-decoration-color: var(--site-reading-link-underline);
243
+ text-underline-offset: 0.15em;
244
+ transition:
245
+ color 0.2s ease,
246
+ text-decoration-color 0.2s ease;
247
+ }
248
+
249
+ a:hover,
250
+ a:focus {
251
+ color: var(--site-reading-link-hover);
252
+ text-decoration-color: currentColor;
253
+ }
254
+
255
+ a:focus-visible {
256
+ outline: 2px solid var(--site-accent);
257
+ outline-offset: 2px;
258
+ border-radius: 2px;
259
+ }
260
+
261
+ time {
262
+ color: var(--site-reading-meta);
263
+ font-size: var(--type-sm);
264
+ font-variant-numeric: tabular-nums;
265
+ }
266
+
267
+ /* -------------------------------------------------------------------------
268
+ * Page layout — Tufte horizontal frame
269
+ *
270
+ * Mirrors the main site's `.site-page > header/main/footer` rule. Every
271
+ * top-level section gets the same asymmetric padding so the reading column
272
+ * aligns with the rest of the site.
273
+ *
274
+ * 12.5% left + 4% right = 16.5% padding → content = 83.5% of the box.
275
+ * max-width = body-max-width / 0.835 so the inner content area exactly
276
+ * equals `--layout-body-max-width` on wide viewports. min() caps keep
277
+ * padding from growing beyond 210px / 67px. Mobile widens to 5% / 5%
278
+ * and the 55% content column collapses to 100% (via tokens.css).
279
+ * ------------------------------------------------------------------------- */
280
+
281
+ .site-page {
282
+ min-height: 100vh;
283
+ min-height: 100dvh;
284
+ background-color: var(--site-page-bg);
285
+ }
286
+
287
+ .site-page > header,
288
+ .site-page > main,
289
+ .site-page > footer,
290
+ .site-page > .home-branding-credit {
291
+ width: 100%;
292
+ max-width: calc(var(--layout-body-max-width) / 0.835);
293
+ padding-left: min(12.5%, 210px);
294
+ padding-right: min(4%, 67px);
295
+ margin-left: auto;
296
+ margin-right: auto;
297
+ }
298
+
299
+ @media (max-width: 760px) {
300
+ .site-page > header,
301
+ .site-page > main,
302
+ .site-page > footer,
303
+ .site-page > .home-branding-credit {
304
+ padding-left: max(5%, 28px);
305
+ padding-right: 5%;
306
+ }
307
+ }
308
+
309
+ .site-main {
310
+ padding-top: var(--space-xl);
311
+ padding-bottom: var(--space-xl);
312
+ }
313
+
314
+ /* -------------------------------------------------------------------------
315
+ * Header
316
+ * ------------------------------------------------------------------------- */
317
+
318
+ .site-header {
319
+ padding-top: 24px;
320
+ background-color: var(--site-page-bg);
321
+ }
322
+
323
+ @media (min-width: 700px) {
324
+ .site-header {
325
+ padding-top: 30px;
326
+ }
327
+ }
328
+
329
+ .site-header-inner {
330
+ display: flex;
331
+ flex-direction: column;
332
+ align-items: stretch;
333
+ gap: 0;
334
+ }
335
+
336
+ .site-header-top {
337
+ display: flex;
338
+ align-items: center;
339
+ justify-content: space-between;
340
+ gap: clamp(0.6rem, 2.2vw, 1rem);
341
+ flex-wrap: nowrap;
342
+ min-height: 2.75rem;
343
+ width: 100%;
344
+ }
345
+
346
+ .site-header-top-bordered {
347
+ padding-bottom: 15px;
348
+ }
349
+
350
+ @media (min-width: 700px) {
351
+ .site-header-top-bordered {
352
+ padding-bottom: 18px;
353
+ }
354
+ }
355
+
356
+ .site-logo {
357
+ display: flex;
358
+ flex: 0 1 auto;
359
+ align-items: center;
360
+ gap: 10px;
361
+ min-width: 0;
362
+ padding: 0.15rem 0;
363
+ font-family: var(--font-site-title);
364
+ font-size: var(--type-subtitle);
365
+ font-weight: var(--fw-regular);
366
+ letter-spacing: -0.02em;
367
+ line-height: 1.15;
368
+ white-space: nowrap;
369
+ overflow: hidden;
370
+ text-overflow: ellipsis;
371
+ color: var(--site-text-primary);
372
+ text-decoration: none;
373
+ }
374
+
375
+ .site-logo:hover,
376
+ .site-logo:focus {
377
+ color: var(--site-text-primary);
378
+ text-decoration: none;
379
+ }
380
+
381
+ .site-logo-avatar {
382
+ width: calc(var(--avatar-size) + 2px);
383
+ height: calc(var(--avatar-size) + 2px);
384
+ border-radius: var(--avatar-radius);
385
+ object-fit: cover;
386
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--site-divider) 82%, transparent);
387
+ flex: none;
388
+ }
389
+
390
+ .site-logo-text {
391
+ min-width: 0;
392
+ overflow: hidden;
393
+ text-overflow: ellipsis;
394
+ }
395
+
396
+ .site-header-nav {
397
+ display: flex;
398
+ align-items: center;
399
+ flex-wrap: nowrap;
400
+ justify-content: flex-end;
401
+ gap: clamp(0.6rem, 2.2vw, 1rem);
402
+ margin-left: auto;
403
+ min-width: 0;
404
+ font-family: var(--font-ui);
405
+ }
406
+
407
+ .site-header-link {
408
+ display: inline-flex;
409
+ flex: none;
410
+ align-items: center;
411
+ position: relative;
412
+ min-height: 2rem;
413
+ padding: 0.15rem 0;
414
+ font-size: var(--type-ui-meta);
415
+ font-weight: var(--fw-medium);
416
+ letter-spacing: 0.01em;
417
+ line-height: 1;
418
+ white-space: nowrap;
419
+ color: color-mix(in srgb, var(--site-text-secondary) 62%, transparent);
420
+ text-decoration: none;
421
+ transition: color 0.15s;
422
+ }
423
+
424
+ .site-header-link:hover,
425
+ .site-header-link:focus {
426
+ color: color-mix(
427
+ in srgb,
428
+ var(--site-text-primary) 84%,
429
+ var(--site-text-secondary)
430
+ );
431
+ text-decoration: none;
432
+ }
433
+
434
+ .site-header-link-active {
435
+ color: color-mix(
436
+ in srgb,
437
+ var(--site-text-primary) 84%,
438
+ var(--site-text-secondary)
439
+ );
440
+ }
441
+
442
+ /* --- "More" dropdown ---------------------------------------------------- */
443
+
444
+ .site-header-more {
445
+ position: relative;
446
+ display: inline-flex;
447
+ align-items: center;
448
+ }
449
+
450
+ .site-header-more-responsive-only {
451
+ display: none;
452
+ }
453
+
454
+ .site-header-more-btn {
455
+ display: inline-flex;
456
+ align-items: center;
457
+ gap: 0.45rem;
458
+ min-height: 2rem;
459
+ padding: 0.15rem 0;
460
+ border: none;
461
+ background: transparent;
462
+ cursor: pointer;
463
+ font-family: var(--font-ui);
464
+ font-size: var(--type-ui-meta);
465
+ font-weight: var(--fw-medium);
466
+ letter-spacing: 0.01em;
467
+ line-height: 1;
468
+ color: color-mix(in srgb, var(--site-text-secondary) 62%, transparent);
469
+ transition: color 0.15s;
470
+ }
471
+
472
+ .site-header-more-btn svg {
473
+ width: 0.82rem;
474
+ height: 0.82rem;
475
+ transition: transform 0.18s ease;
476
+ }
477
+
478
+ .site-header-more-btn:hover,
479
+ .site-header-more-btn[aria-expanded="true"] {
480
+ color: color-mix(
481
+ in srgb,
482
+ var(--site-text-primary) 84%,
483
+ var(--site-text-secondary)
484
+ );
485
+ }
486
+
487
+ .site-header-more-btn[aria-expanded="true"] svg {
488
+ transform: rotate(180deg);
489
+ }
490
+
491
+ .site-header-more-popover {
492
+ display: block;
493
+ position: absolute;
494
+ top: 100%;
495
+ right: 0;
496
+ margin-top: 0.6rem;
497
+ min-width: 12.25rem;
498
+ padding: 0.3rem 0;
499
+ background: var(--site-page-bg);
500
+ border: 0.5px solid color-mix(in srgb, var(--site-divider) 80%, transparent);
501
+ border-radius: 0.4rem;
502
+ box-shadow:
503
+ 0 4px 20px -8px rgba(0, 0, 0, 0.12),
504
+ 0 2px 6px -2px rgba(0, 0, 0, 0.06);
505
+ opacity: 0;
506
+ visibility: hidden;
507
+ pointer-events: none;
508
+ transform: translateY(-6px);
509
+ transform-origin: top right;
510
+ transition:
511
+ opacity 0.18s ease,
512
+ transform 0.18s ease,
513
+ visibility 0s linear 0.18s;
514
+ z-index: 50;
515
+ }
516
+
517
+ .site-header-more-popover[aria-hidden="false"] {
518
+ opacity: 1;
519
+ visibility: visible;
520
+ pointer-events: auto;
521
+ transform: translateY(0);
522
+ transition-delay: 0s;
523
+ }
524
+
525
+ .site-header-more-link {
526
+ position: relative;
527
+ display: flex;
528
+ align-items: center;
529
+ justify-content: space-between;
530
+ gap: 0.35rem;
531
+ padding: 0.45rem 1rem;
532
+ font-family: var(--font-ui);
533
+ font-size: var(--type-ui-meta);
534
+ color: var(--site-text-secondary);
535
+ text-decoration: none;
536
+ transition:
537
+ color 0.15s,
538
+ background-color 0.15s;
539
+ }
540
+
541
+ .site-header-more-link:hover,
542
+ .site-header-more-link:focus {
543
+ color: color-mix(
544
+ in srgb,
545
+ var(--site-text-primary) 84%,
546
+ var(--site-text-secondary)
547
+ );
548
+ background: color-mix(in srgb, var(--site-nav-hover-bg) 58%, transparent);
549
+ text-decoration: none;
550
+ }
551
+
552
+ .site-header-more-link-active {
553
+ color: color-mix(
554
+ in srgb,
555
+ var(--site-text-primary) 84%,
556
+ var(--site-text-secondary)
557
+ );
558
+ }
559
+
560
+ .site-header-more-link-responsive,
561
+ .site-header-more-divider-responsive {
562
+ display: none;
563
+ }
564
+
565
+ .site-header-more-divider {
566
+ height: 0;
567
+ margin: 0.35rem 0.75rem;
568
+ border-top: 0.5px solid
569
+ color-mix(in srgb, var(--site-divider) 60%, transparent);
570
+ }
571
+
572
+ /* --- Tiered responsive collapse ---------------------------------------- *
573
+ *
574
+ * ≤960px — 5th+ inline link collapses into More (tier-lg)
575
+ * ≤780px — also 4th collapses (tier-md)
576
+ * ≤580px — also 3rd collapses (tier-sm)
577
+ * The first two links always stay inline. No hamburger on static export —
578
+ * at very narrow widths 2 inline links + More button is the floor.
579
+ */
580
+
581
+ @media (max-width: 960px) {
582
+ .site-header-link-collapse-lg {
583
+ display: none;
584
+ }
585
+
586
+ .site-header-more-responsive-only.site-header-more-tier-lg {
587
+ display: inline-flex;
588
+ }
589
+
590
+ .site-header-more-link-show-lg {
591
+ display: flex;
592
+ }
593
+
594
+ .site-header-more-divider-responsive {
595
+ display: block;
596
+ }
597
+ }
598
+
599
+ @media (max-width: 780px) {
600
+ .site-header-link-collapse-md {
601
+ display: none;
602
+ }
603
+
604
+ .site-header-more-responsive-only.site-header-more-tier-md {
605
+ display: inline-flex;
606
+ }
607
+
608
+ .site-header-more-link-show-md {
609
+ display: flex;
610
+ }
611
+ }
612
+
613
+ @media (max-width: 580px) {
614
+ .site-header-link-collapse-sm {
615
+ display: none;
616
+ }
617
+
618
+ .site-header-more-responsive-only.site-header-more-tier-sm {
619
+ display: inline-flex;
620
+ }
621
+
622
+ .site-header-more-link-show-sm {
623
+ display: flex;
624
+ }
625
+ }
626
+
627
+ /* -------------------------------------------------------------------------
628
+ * Footer
629
+ * ------------------------------------------------------------------------- */
630
+
631
+ .site-footer {
632
+ margin-top: var(--space-xl);
633
+ padding-bottom: var(--space-xl);
634
+ color: var(--site-text-secondary);
635
+ font-size: var(--type-xs);
636
+ background-color: var(--site-page-bg);
637
+ }
638
+
639
+ .site-footer-inner {
640
+ border-top: 0.5px solid var(--site-divider);
641
+ padding-top: var(--space-xl);
642
+ display: flex;
643
+ flex-direction: column;
644
+ gap: 0.75rem;
645
+ }
646
+
647
+ .site-footer-content {
648
+ color: var(--site-text-secondary);
649
+ }
650
+
651
+ .site-footer-content p {
652
+ margin: 0 0 0.5em;
653
+ }
654
+
655
+ .site-footer-nav-list {
656
+ display: flex;
657
+ flex-wrap: wrap;
658
+ gap: 1rem;
659
+ list-style: none;
660
+ margin: 0;
661
+ padding: 0;
662
+ }
663
+
664
+ .home-branding-credit {
665
+ margin-top: var(--space-xl);
666
+ padding-bottom: var(--space-xl);
667
+ text-align: center;
668
+ color: var(--site-text-secondary);
669
+ font-size: var(--type-base);
670
+ }
671
+
672
+ .home-branding-credit a {
673
+ display: inline-flex;
674
+ align-items: center;
675
+ gap: 0.38rem;
676
+ color: inherit;
677
+ text-decoration: none;
678
+ border-bottom: 0.5px solid
679
+ color-mix(in srgb, var(--site-text-secondary) 45%, transparent);
680
+ transition:
681
+ color 160ms ease,
682
+ border-color 160ms ease;
683
+ }
684
+
685
+ .home-branding-credit a:hover,
686
+ .home-branding-credit a:focus-visible {
687
+ color: var(--site-text-primary);
688
+ border-color: currentColor;
689
+ }
690
+
691
+ /* -------------------------------------------------------------------------
692
+ * Tufte content-width constraint
693
+ *
694
+ * Mirrors the main site's 55% rule: reading text occupies a narrow
695
+ * column inside the Tufte frame, leaving a wide right margin that
696
+ * would host sidenotes on the main site. Media (images, video, audio)
697
+ * is NOT included — galleries intentionally span the full frame so
698
+ * they can breathe.
699
+ *
700
+ * Mobile (<=760px): `--layout-content-width` collapses to 100% via
701
+ * tokens.css. Tablet: cap at 35rem for readability.
702
+ * ------------------------------------------------------------------------- */
703
+
704
+ .section-header,
705
+ .section-body,
706
+ .post-card-title,
707
+ .post-card-summary,
708
+ .post-card-link-domain,
709
+ .post-card-quote-content,
710
+ .post-card-quote-attribution,
711
+ .post-card-quote-commentary,
712
+ .post-card-footer,
713
+ .reply-title,
714
+ .reply-body,
715
+ .reply-link-domain,
716
+ .reply-footer,
717
+ .thread-title,
718
+ .thread-body,
719
+ .thread-link-domain,
720
+ .thread-footer,
721
+ .collection-directory,
722
+ .pagination,
723
+ .empty-state,
724
+ .page-summary {
725
+ width: var(--layout-content-width);
726
+ max-width: 100%;
727
+ }
728
+
729
+ @media (min-width: 761px) and (max-width: 1024px) {
730
+ .section-header,
731
+ .section-body,
732
+ .post-card-title,
733
+ .post-card-summary,
734
+ .post-card-link-domain,
735
+ .post-card-quote-content,
736
+ .post-card-quote-attribution,
737
+ .post-card-quote-commentary,
738
+ .post-card-footer,
739
+ .reply-title,
740
+ .reply-body,
741
+ .reply-link-domain,
742
+ .reply-footer,
743
+ .thread-title,
744
+ .thread-body,
745
+ .thread-link-domain,
746
+ .thread-footer,
747
+ .collection-directory,
748
+ .pagination,
749
+ .empty-state,
750
+ .page-summary {
751
+ width: min(100%, 35rem);
752
+ }
753
+ }
754
+
755
+ /* -------------------------------------------------------------------------
756
+ * Section headers
757
+ * ------------------------------------------------------------------------- */
758
+
759
+ .section-header {
760
+ margin-bottom: var(--space-xl);
761
+ padding-bottom: 1rem;
762
+ border-bottom: 1px solid var(--site-border-light);
763
+ }
764
+
765
+ .section-title {
766
+ margin: 0 0 0.25em;
767
+ }
768
+
769
+ .section-summary {
770
+ margin: 0;
771
+ color: var(--site-reading-meta);
772
+ font-size: var(--type-secondary);
773
+ }
774
+
775
+ .section-meta {
776
+ margin: 0.5em 0 0;
777
+ color: var(--site-reading-meta);
778
+ font-size: var(--type-sm);
779
+ }
780
+
781
+ /* -------------------------------------------------------------------------
782
+ * Post list + post cards
783
+ * ------------------------------------------------------------------------- */
784
+
785
+ .post-list {
786
+ display: flex;
787
+ flex-direction: column;
788
+ gap: calc(var(--space-xl) * 1.25);
789
+ }
790
+
791
+ .post-list-pinned {
792
+ margin-bottom: calc(var(--space-xl) * 1.25);
793
+ padding-bottom: calc(var(--space-xl) * 1.25);
794
+ border-bottom: 1px solid var(--site-border-light);
795
+ }
796
+
797
+ /* Decorative divider between posts in a timeline feed. Mirrors the main
798
+ site's `hr.feed-divider`: a trio of small chevron marks masked from the
799
+ current text color, so it picks up the theme automatically.
800
+ `margin-left` centers the divider within the 55% reading column so it
801
+ visually sits at the middle of the post-card text stack. */
802
+ hr.feed-divider {
803
+ border: none;
804
+ width: 30px;
805
+ height: 9px;
806
+ margin: 0;
807
+ margin-left: calc(var(--layout-content-width) / 2 - 15px);
808
+ color: var(--site-feed-divider-color);
809
+ background-color: currentColor;
810
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 45 13'%3E%3Cpath fill='black' transform='translate(0,0) rotate(90 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='black' transform='translate(16,0) rotate(100 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='black' transform='translate(32,0) rotate(80 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3C/svg%3E");
811
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 45 13'%3E%3Cpath fill='black' transform='translate(0,0) rotate(90 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='black' transform='translate(16,0) rotate(100 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='black' transform='translate(32,0) rotate(80 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3C/svg%3E");
812
+ -webkit-mask-repeat: no-repeat;
813
+ mask-repeat: no-repeat;
814
+ -webkit-mask-position: center;
815
+ mask-position: center;
816
+ -webkit-mask-size: contain;
817
+ mask-size: contain;
818
+ }
819
+
820
+ .post-card {
821
+ position: relative;
822
+ display: flex;
823
+ flex-direction: column;
824
+ gap: 0.75rem;
825
+ }
826
+
827
+ .post-card-title {
828
+ font-family: var(--font-heading);
829
+ font-size: var(--feed-note-title-size);
830
+ font-weight: var(--type-heading-weight);
831
+ line-height: var(--feed-note-title-leading);
832
+ margin: 0;
833
+ color: var(--site-reading-title);
834
+ }
835
+
836
+ .post-card-title a {
837
+ color: inherit;
838
+ text-decoration: none;
839
+ }
840
+
841
+ .post-card-title a:hover,
842
+ .post-card-title a:focus {
843
+ text-decoration: underline;
844
+ text-underline-offset: 0.18em;
845
+ }
846
+
847
+ .post-card-summary {
848
+ margin: 0;
849
+ color: var(--site-reading-body);
850
+ }
851
+
852
+ /* Link card domain row — shown ABOVE the title (matches main site's
853
+ `.feed-link-domain` pattern). Inline flex with icon + host text. */
854
+ .post-card-link-domain,
855
+ .thread-link-domain,
856
+ .reply-link-domain {
857
+ display: inline-flex;
858
+ align-items: center;
859
+ gap: 0.3rem;
860
+ max-width: 100%;
861
+ margin: 0 0 0.4rem 0;
862
+ font-family: var(--font-ui);
863
+ font-size: var(--type-ui-meta);
864
+ font-weight: var(--fw-regular);
865
+ line-height: 1.3;
866
+ color: var(--site-text-secondary);
867
+ text-decoration: none;
868
+ word-break: break-all;
869
+ transition: color 0.18s ease;
870
+ }
871
+
872
+ .post-card-link-domain:hover,
873
+ .post-card-link-domain:focus,
874
+ .thread-link-domain:hover,
875
+ .thread-link-domain:focus,
876
+ .reply-link-domain:hover,
877
+ .reply-link-domain:focus {
878
+ color: var(--site-text-primary);
879
+ }
880
+
881
+ .post-card-link-domain-icon {
882
+ width: 0.72rem;
883
+ height: 0.72rem;
884
+ flex-shrink: 0;
885
+ }
886
+
887
+ /* Slight extra breathing room below link-card titles to match main site. */
888
+ .post-card-link-title,
889
+ .thread-link-title,
890
+ .reply-link-title {
891
+ text-wrap: pretty;
892
+ }
893
+
894
+ .post-card-link-title a,
895
+ .thread-link-title a,
896
+ .reply-link-title a {
897
+ text-decoration: none;
898
+ }
899
+
900
+ .post-card-link-title a:hover,
901
+ .post-card-link-title a:focus,
902
+ .thread-link-title a:hover,
903
+ .thread-link-title a:focus,
904
+ .reply-link-title a:hover,
905
+ .reply-link-title a:focus {
906
+ text-decoration: underline;
907
+ text-underline-offset: 3px;
908
+ }
909
+
910
+ .post-card-media,
911
+ .reply-media,
912
+ .thread-media {
913
+ display: grid;
914
+ grid-template-columns: 1fr;
915
+ gap: 0.75rem;
916
+ }
917
+
918
+ .post-card-figure img,
919
+ .reply-figure img,
920
+ .thread-figure img {
921
+ display: block;
922
+ width: 100%;
923
+ border-radius: var(--media-radius);
924
+ border: 1px solid var(--site-media-outline);
925
+ }
926
+
927
+ .post-card-figure video,
928
+ .reply-figure video,
929
+ .thread-figure video {
930
+ display: block;
931
+ width: 100%;
932
+ height: auto;
933
+ border-radius: var(--media-radius);
934
+ border: 1px solid var(--site-media-outline);
935
+ background: #000;
936
+ }
937
+
938
+ .post-card-figure audio,
939
+ .reply-figure audio,
940
+ .thread-figure audio {
941
+ display: block;
942
+ width: 100%;
943
+ }
944
+
945
+ .post-card-figure-video a {
946
+ position: relative;
947
+ display: block;
948
+ }
949
+
950
+ .post-card-video-badge {
951
+ position: absolute;
952
+ left: 0.5rem;
953
+ bottom: 0.5rem;
954
+ padding: 0.125rem 0.5rem;
955
+ font-size: var(--type-xs);
956
+ color: #fff;
957
+ background: rgba(0, 0, 0, 0.65);
958
+ border-radius: 999px;
959
+ pointer-events: none;
960
+ }
961
+
962
+ .thread-file a,
963
+ .reply-file a {
964
+ color: var(--site-link);
965
+ text-decoration: underline;
966
+ }
967
+
968
+ /* -------------------------------------------------------------------------
969
+ * Quote format — decorative mark, serif body, attribution line
970
+ * ------------------------------------------------------------------------- */
971
+
972
+ .post-card-quote {
973
+ position: static;
974
+ margin: 0;
975
+ padding: 0;
976
+ border: 0;
977
+ border-radius: 0;
978
+ background: transparent;
979
+ color: var(--site-reading-quote);
980
+ font-family: inherit;
981
+ font-style: normal;
982
+ }
983
+
984
+ /* Quote-format posts have their own decorative `.post-card-quote-mark`
985
+ SVG inside the blockquote — suppress the global blockquote icon. */
986
+ .post-card-quote::before {
987
+ content: none;
988
+ }
989
+
990
+ .post-card-quote-mark {
991
+ display: block;
992
+ position: relative;
993
+ width: 1.7rem;
994
+ margin-bottom: -0.1rem;
995
+ margin-left: -0.04rem;
996
+ line-height: 0;
997
+ pointer-events: none;
998
+ color: color-mix(in srgb, var(--site-accent) 14%, var(--site-divider));
999
+ opacity: 0.66;
1000
+ }
1001
+
1002
+ .post-card-quote-mark svg {
1003
+ display: block;
1004
+ width: 100%;
1005
+ height: auto;
1006
+ }
1007
+
1008
+ .post-card-quote-content {
1009
+ font-family: var(--font-serif);
1010
+ color: var(--site-text-primary);
1011
+ font-size: var(--type-content-subtitle);
1012
+ line-height: var(--type-heading-leading);
1013
+ white-space: pre-line;
1014
+ text-wrap: pretty;
1015
+ margin: 0;
1016
+ }
1017
+
1018
+ .post-card-quote-attribution {
1019
+ display: flex;
1020
+ align-items: center;
1021
+ gap: 0.45rem;
1022
+ flex-wrap: wrap;
1023
+ margin-top: 0.95rem;
1024
+ color: var(--site-text-secondary);
1025
+ font-family: var(--font-ui);
1026
+ font-size: var(--type-ui-meta);
1027
+ font-style: normal;
1028
+ line-height: 1.3;
1029
+ }
1030
+
1031
+ .post-card-quote-attribution::before {
1032
+ content: "";
1033
+ width: 0.9rem;
1034
+ height: 1px;
1035
+ background: color-mix(
1036
+ in srgb,
1037
+ var(--site-text-secondary) 38%,
1038
+ var(--site-divider)
1039
+ );
1040
+ }
1041
+
1042
+ .post-card-quote-source {
1043
+ color: inherit;
1044
+ text-decoration: underline;
1045
+ text-decoration-color: color-mix(
1046
+ in srgb,
1047
+ var(--site-text-secondary) 55%,
1048
+ transparent
1049
+ );
1050
+ text-underline-offset: 3px;
1051
+ }
1052
+
1053
+ .post-card-quote-source:hover,
1054
+ .post-card-quote-source:focus {
1055
+ color: var(--site-text-primary);
1056
+ text-decoration-color: currentColor;
1057
+ }
1058
+
1059
+ .post-card-quote-commentary {
1060
+ position: relative;
1061
+ margin-top: 1.1rem;
1062
+ padding-top: 0.95rem;
1063
+ color: color-mix(
1064
+ in srgb,
1065
+ var(--site-text-secondary) 84%,
1066
+ var(--site-text-primary)
1067
+ );
1068
+ text-wrap: pretty;
1069
+ }
1070
+
1071
+ .post-card-quote-commentary::before {
1072
+ content: "";
1073
+ position: absolute;
1074
+ left: 0;
1075
+ right: 0;
1076
+ top: 0;
1077
+ height: 1px;
1078
+ background: linear-gradient(
1079
+ 90deg,
1080
+ transparent 0%,
1081
+ color-mix(in srgb, var(--site-divider) 48%, transparent) 16%,
1082
+ color-mix(in srgb, var(--site-divider) 78%, transparent) 50%,
1083
+ color-mix(in srgb, var(--site-divider) 48%, transparent) 84%,
1084
+ transparent 100%
1085
+ );
1086
+ }
1087
+
1088
+ .post-card-quote-commentary.prose > :first-child {
1089
+ margin-top: 0;
1090
+ }
1091
+
1092
+ .post-card-quote-commentary.prose > :last-child {
1093
+ margin-bottom: 0;
1094
+ }
1095
+
1096
+ .post-card-quote-commentary p {
1097
+ margin: 0;
1098
+ }
1099
+
1100
+ .post-card-quote-commentary p + p,
1101
+ .post-card-quote-commentary ul,
1102
+ .post-card-quote-commentary ol,
1103
+ .post-card-quote-commentary blockquote,
1104
+ .post-card-quote-commentary pre {
1105
+ margin-top: 0.55rem;
1106
+ }
1107
+
1108
+ /* Fade the post meta on quote cards so the quote body stays visually primary. */
1109
+ .post-card-quote ~ .post-card-footer,
1110
+ .post-card-quote-commentary + .post-card-footer {
1111
+ opacity: 0.72;
1112
+ }
1113
+
1114
+ /* -------------------------------------------------------------------------
1115
+ * Post footer — meta (featured, time, external link, collections, pinned)
1116
+ * ------------------------------------------------------------------------- */
1117
+
1118
+ .post-card-footer,
1119
+ .reply-footer {
1120
+ display: flex;
1121
+ justify-content: space-between;
1122
+ align-items: center;
1123
+ gap: 10px;
1124
+ min-height: 2rem;
1125
+ font-size: var(--type-ui-hint);
1126
+ }
1127
+
1128
+ .post-footer-detail {
1129
+ margin-top: 24px;
1130
+ /* Match the feed/reply footer size so the root post's footer doesn't
1131
+ visually dominate. Main site uses a larger size because every post
1132
+ on the detail page is rendered at detail size; here only the root
1133
+ post gets this class, which otherwise creates a mismatch with the
1134
+ replies below. */
1135
+ font-size: var(--type-ui-hint);
1136
+ color: var(--site-text-secondary);
1137
+ }
1138
+
1139
+ .post-footer-meta {
1140
+ display: flex;
1141
+ flex: 1 1 auto;
1142
+ align-items: center;
1143
+ gap: 8px;
1144
+ flex-wrap: wrap;
1145
+ min-width: 0;
1146
+ font-family: var(--font-ui);
1147
+ line-height: 1.35;
1148
+ color: var(--site-text-secondary);
1149
+ }
1150
+
1151
+ .post-footer-meta time {
1152
+ font-size: inherit;
1153
+ color: inherit;
1154
+ }
1155
+
1156
+ .post-footer-featured {
1157
+ display: inline-flex;
1158
+ align-items: center;
1159
+ justify-content: center;
1160
+ color: color-mix(
1161
+ in srgb,
1162
+ var(--search-mark-color) 72%,
1163
+ var(--site-text-secondary)
1164
+ );
1165
+ flex-shrink: 0;
1166
+ }
1167
+
1168
+ .post-footer-featured svg {
1169
+ width: 1rem;
1170
+ height: 1rem;
1171
+ opacity: 0.9;
1172
+ }
1173
+
1174
+ .post-footer-link {
1175
+ color: var(--site-text-secondary);
1176
+ text-decoration: none;
1177
+ white-space: nowrap;
1178
+ flex-shrink: 0;
1179
+ }
1180
+
1181
+ .post-footer-link:hover,
1182
+ .post-footer-link:focus {
1183
+ color: var(--site-text-primary);
1184
+ text-decoration: underline;
1185
+ }
1186
+
1187
+ .post-footer-external-link {
1188
+ display: inline-flex;
1189
+ align-items: center;
1190
+ justify-content: center;
1191
+ width: 1.6rem;
1192
+ height: 1.6rem;
1193
+ border-radius: 0.6rem;
1194
+ color: var(--site-text-secondary);
1195
+ text-decoration: none;
1196
+ transition:
1197
+ color 0.18s ease,
1198
+ background-color 0.16s ease;
1199
+ flex-shrink: 0;
1200
+ }
1201
+
1202
+ .post-footer-external-link:hover,
1203
+ .post-footer-external-link:focus {
1204
+ color: var(--site-text-primary);
1205
+ }
1206
+
1207
+ .post-footer-external-link svg {
1208
+ width: 1rem;
1209
+ height: 1rem;
1210
+ }
1211
+
1212
+ .post-collection-tags {
1213
+ display: inline-flex;
1214
+ align-items: center;
1215
+ gap: 4px;
1216
+ flex-wrap: wrap;
1217
+ min-width: 0;
1218
+ max-width: 100%;
1219
+ color: var(--site-text-secondary);
1220
+ }
1221
+
1222
+ .post-collection-tag {
1223
+ display: inline-flex;
1224
+ align-items: center;
1225
+ gap: 3px;
1226
+ color: inherit;
1227
+ text-decoration: none;
1228
+ min-width: 0;
1229
+ max-width: min(100%, 22ch);
1230
+ }
1231
+
1232
+ .post-collection-tag:hover,
1233
+ .post-collection-tag:focus {
1234
+ color: var(--site-text-primary);
1235
+ text-decoration: underline;
1236
+ text-underline-offset: 0.18em;
1237
+ }
1238
+
1239
+ .post-collection-tag-text {
1240
+ display: block;
1241
+ min-width: 0;
1242
+ overflow: hidden;
1243
+ text-overflow: ellipsis;
1244
+ white-space: nowrap;
1245
+ }
1246
+
1247
+ .post-card-pin {
1248
+ font-size: var(--type-2xs);
1249
+ text-transform: uppercase;
1250
+ letter-spacing: var(--type-label-tracking);
1251
+ color: var(--site-accent);
1252
+ border: 1px solid var(--site-accent);
1253
+ padding: 0.1em 0.5em;
1254
+ border-radius: 999px;
1255
+ flex-shrink: 0;
1256
+ }
1257
+
1258
+ /* -------------------------------------------------------------------------
1259
+ * Thread preview (list pages: root context + hero latest reply)
1260
+ *
1261
+ * Mirrors the main site's `.thread-group.thread-group-preview` layout:
1262
+ * content sits flush-left inside the preview, and the vertical rail +
1263
+ * dot markers are positioned OUTSIDE the content (overflowing into the
1264
+ * container's left gutter) via a negative `left` on the rail/dots.
1265
+ * ------------------------------------------------------------------------- */
1266
+
1267
+ .thread-preview {
1268
+ /* Rail position: negative = overflow outside content. Mirrors
1269
+ `--site-thread-rail-line-left` on the main site. */
1270
+ --thread-rail-left: -27px;
1271
+ --thread-rail-width: 1px;
1272
+ --thread-rail-indent: 0px;
1273
+ --thread-dot-size: 10px;
1274
+ --thread-dot-ring-width: 2px;
1275
+ --thread-dot-border-width: 2px;
1276
+ --thread-hero-dot-size: 14px;
1277
+ --thread-hero-dot-border-width: 3px;
1278
+ --thread-item-spacing: 0.35rem;
1279
+
1280
+ position: relative;
1281
+ display: flex;
1282
+ flex-direction: column;
1283
+ gap: 0.6rem;
1284
+ padding-left: var(--thread-rail-indent);
1285
+ }
1286
+
1287
+ @media (max-width: 760px) {
1288
+ .thread-preview {
1289
+ --thread-rail-left: -11px;
1290
+ --thread-rail-indent: 8px;
1291
+ }
1292
+ }
1293
+
1294
+ /* Continuous vertical rail — subtle gradient so the line fades into
1295
+ whitespace at the top and tail. Sits outside the content via negative
1296
+ `left`. */
1297
+ .thread-preview::before {
1298
+ content: "";
1299
+ position: absolute;
1300
+ left: var(--thread-rail-left);
1301
+ top: 0;
1302
+ bottom: 0;
1303
+ width: var(--thread-rail-width);
1304
+ background: linear-gradient(
1305
+ 180deg,
1306
+ transparent 0,
1307
+ color-mix(in srgb, var(--site-threadline) 85%, transparent) 8%,
1308
+ color-mix(in srgb, var(--site-threadline) 55%, transparent) 100%
1309
+ );
1310
+ pointer-events: none;
1311
+ }
1312
+
1313
+ .thread-preview-context {
1314
+ position: relative;
1315
+ display: flex;
1316
+ flex-direction: column;
1317
+ gap: calc(var(--space-xl) * 1.1);
1318
+ margin: 0;
1319
+ padding: 0;
1320
+ border-left: 0;
1321
+ }
1322
+
1323
+ /* Individual entry in a thread preview — wraps a full `.post-card` so
1324
+ the root, second, and penultimate replies render with their own
1325
+ title/body/footer. Dot marker sits on the rail at the card's
1326
+ vertical midpoint. */
1327
+ .thread-preview .thread-item {
1328
+ position: relative;
1329
+ min-width: 0;
1330
+ max-width: 100%;
1331
+ }
1332
+
1333
+ .thread-preview .thread-item::before {
1334
+ content: "";
1335
+ position: absolute;
1336
+ left: calc(
1337
+ var(--thread-rail-left) + var(--thread-rail-width) / 2 -
1338
+ var(--thread-dot-size) / 2 - var(--thread-rail-indent)
1339
+ );
1340
+ top: 1.4rem;
1341
+ width: var(--thread-dot-size);
1342
+ height: var(--thread-dot-size);
1343
+ border-radius: 50%;
1344
+ background-color: var(--site-threadline);
1345
+ border: var(--thread-dot-border-width) solid var(--site-page-bg);
1346
+ box-shadow: 0 0 0 var(--thread-dot-ring-width) var(--site-thread-dot-ring);
1347
+ z-index: 1;
1348
+ }
1349
+
1350
+ /* Gap "N more posts" row has no card so we place the dot at its
1351
+ vertical midpoint instead of the card's top area. */
1352
+ .thread-preview .thread-item-gap {
1353
+ display: flex;
1354
+ align-items: center;
1355
+ padding: 0.15rem 0 0.35rem;
1356
+ }
1357
+
1358
+ .thread-preview .thread-item-gap::before {
1359
+ top: 50%;
1360
+ transform: translateY(-50%);
1361
+ }
1362
+
1363
+ /* Hidden-posts count — rendered as a rounded dashed pill matching
1364
+ the main site's `.thread-gap-link`. */
1365
+ .thread-preview-gap {
1366
+ display: inline-flex;
1367
+ align-items: center;
1368
+ gap: 0.35rem;
1369
+ align-self: flex-start;
1370
+ margin: 0.15rem 0;
1371
+ padding: 0.3rem 0.72rem;
1372
+ border: 1px dashed var(--site-thread-context-border);
1373
+ border-radius: 999px;
1374
+ background: var(--site-thread-gap-bg);
1375
+ color: var(--site-text-secondary);
1376
+ font-size: var(--type-thread-context-meta);
1377
+ line-height: 1.3;
1378
+ text-decoration: none;
1379
+ transition:
1380
+ border-color 0.18s ease,
1381
+ color 0.18s ease,
1382
+ background-color 0.18s ease;
1383
+ }
1384
+
1385
+ .thread-preview-gap:hover,
1386
+ .thread-preview-gap:focus {
1387
+ border-color: color-mix(in srgb, var(--site-accent) 22%, var(--site-divider));
1388
+ color: var(--site-text-primary);
1389
+ text-decoration: none;
1390
+ }
1391
+
1392
+ /* Hero (latest reply) row: spacing above and below matches the main
1393
+ site's `.thread-item-hero`, and the dot is larger + accent-colored. */
1394
+ .thread-preview-hero {
1395
+ display: flex;
1396
+ flex-direction: column;
1397
+ gap: 0.5rem;
1398
+ padding-top: calc(var(--space-xl) * 1.1);
1399
+ margin-top: 0;
1400
+ }
1401
+
1402
+ .thread-preview .thread-item-hero::before {
1403
+ left: calc(
1404
+ var(--thread-rail-left) + var(--thread-rail-width) / 2 -
1405
+ var(--thread-hero-dot-size) / 2 - var(--thread-rail-indent)
1406
+ );
1407
+ top: calc(var(--space-xl) * 1.1 + 1.4rem);
1408
+ width: var(--thread-hero-dot-size);
1409
+ height: var(--thread-hero-dot-size);
1410
+ background-color: var(--site-accent);
1411
+ border-width: var(--thread-hero-dot-border-width);
1412
+ }
1413
+
1414
+ .thread-preview-thread-link {
1415
+ align-self: flex-start;
1416
+ font-size: var(--type-sm);
1417
+ color: var(--site-reading-meta);
1418
+ text-decoration: none;
1419
+ }
1420
+
1421
+ .thread-preview-thread-link:hover,
1422
+ .thread-preview-thread-link:focus {
1423
+ color: var(--site-text-primary);
1424
+ text-decoration: underline;
1425
+ }
1426
+
1427
+ /* -------------------------------------------------------------------------
1428
+ * Thread (single post page with inline replies)
1429
+ * ------------------------------------------------------------------------- */
1430
+
1431
+ .thread {
1432
+ /* Rail variables match `.thread-preview` so the detail-page rail
1433
+ shares the same visual position. */
1434
+ --thread-rail-left: -27px;
1435
+ --thread-rail-width: 1px;
1436
+ --thread-rail-indent: 0px;
1437
+ --thread-dot-size: 10px;
1438
+ --thread-dot-ring-width: 2px;
1439
+ --thread-dot-border-width: 2px;
1440
+ --thread-hero-dot-size: 14px;
1441
+ --thread-hero-dot-border-width: 3px;
1442
+
1443
+ position: relative;
1444
+ display: flex;
1445
+ flex-direction: column;
1446
+ gap: 1.25rem;
1447
+ padding-left: var(--thread-rail-indent);
1448
+ }
1449
+
1450
+ @media (max-width: 760px) {
1451
+ .thread {
1452
+ --thread-rail-left: -11px;
1453
+ --thread-rail-indent: 8px;
1454
+ }
1455
+ }
1456
+
1457
+ /* Continuous vertical rail spanning the entire thread (root post + replies).
1458
+ Only shown when the root post actually has replies — a lone post should
1459
+ not have a rail or dot. Matches `.thread-preview`. */
1460
+ .thread-has-replies::before {
1461
+ content: "";
1462
+ position: absolute;
1463
+ left: var(--thread-rail-left);
1464
+ top: 0;
1465
+ bottom: 0;
1466
+ width: var(--thread-rail-width);
1467
+ background: linear-gradient(
1468
+ 180deg,
1469
+ transparent 0,
1470
+ color-mix(in srgb, var(--site-threadline) 85%, transparent) 8%,
1471
+ color-mix(in srgb, var(--site-threadline) 55%, transparent) 100%
1472
+ );
1473
+ pointer-events: none;
1474
+ }
1475
+
1476
+ /* Dot marker for each post in the thread (root + replies). Shown only when
1477
+ there are replies so a solo post doesn't get an orphaned dot. */
1478
+ .thread .thread-item {
1479
+ position: relative;
1480
+ min-width: 0;
1481
+ max-width: 100%;
1482
+ }
1483
+
1484
+ .thread-has-replies .thread-item::before {
1485
+ content: "";
1486
+ position: absolute;
1487
+ left: calc(
1488
+ var(--thread-rail-left) + var(--thread-rail-width) / 2 -
1489
+ var(--thread-dot-size) / 2 - var(--thread-rail-indent)
1490
+ );
1491
+ top: 1.4rem;
1492
+ width: var(--thread-dot-size);
1493
+ height: var(--thread-dot-size);
1494
+ border-radius: 50%;
1495
+ background-color: var(--site-threadline);
1496
+ border: var(--thread-dot-border-width) solid var(--site-page-bg);
1497
+ box-shadow: 0 0 0 var(--thread-dot-ring-width) var(--site-thread-dot-ring);
1498
+ z-index: 1;
1499
+ }
1500
+
1501
+ .thread-item-root {
1502
+ display: flex;
1503
+ flex-direction: column;
1504
+ gap: 0.75rem;
1505
+ }
1506
+
1507
+ .thread-header {
1508
+ display: flex;
1509
+ flex-direction: column;
1510
+ gap: 0.5rem;
1511
+ }
1512
+
1513
+ .thread-title {
1514
+ font-family: var(--font-heading);
1515
+ font-size: var(--type-content-display);
1516
+ font-weight: var(--type-display-weight);
1517
+ line-height: var(--type-display-leading);
1518
+ margin: 0;
1519
+ color: var(--site-reading-title);
1520
+ }
1521
+
1522
+ .thread-title a {
1523
+ color: inherit;
1524
+ text-decoration: none;
1525
+ }
1526
+
1527
+ .thread-title a:hover,
1528
+ .thread-title a:focus {
1529
+ text-decoration: underline;
1530
+ text-underline-offset: 0.18em;
1531
+ }
1532
+
1533
+ .thread-body {
1534
+ font-size: var(--type-content-body);
1535
+ line-height: var(--type-body-leading);
1536
+ color: var(--site-reading-body);
1537
+ }
1538
+
1539
+ .thread-body > :first-child {
1540
+ margin-top: 0;
1541
+ }
1542
+
1543
+ .thread-body > :last-child {
1544
+ margin-bottom: 0;
1545
+ }
1546
+
1547
+ .thread-replies {
1548
+ /* Flex container for replies. The rail and dots are provided by
1549
+ `.thread::before` and `.thread-item::before` so replies stay visually
1550
+ connected to the root post. */
1551
+ display: flex;
1552
+ flex-direction: column;
1553
+ gap: var(--space-xl);
1554
+ }
1555
+
1556
+ /* -------------------------------------------------------------------------
1557
+ * Replies
1558
+ * ------------------------------------------------------------------------- */
1559
+
1560
+ .reply {
1561
+ scroll-margin-top: 1.5rem;
1562
+ display: flex;
1563
+ flex-direction: column;
1564
+ gap: 0.6rem;
1565
+ }
1566
+
1567
+ .reply:target {
1568
+ background-color: var(--search-mark-bg);
1569
+ border-radius: 0.25rem;
1570
+ padding: 0.75rem 1rem;
1571
+ margin-left: -1rem;
1572
+ margin-right: -1rem;
1573
+ }
1574
+
1575
+ .reply:target::before {
1576
+ background-color: var(--site-accent);
1577
+ }
1578
+
1579
+ .reply-title {
1580
+ font-family: var(--font-heading);
1581
+ font-size: var(--type-content-subtitle);
1582
+ font-weight: var(--type-heading-weight);
1583
+ line-height: var(--type-heading-leading);
1584
+ margin: 0;
1585
+ color: var(--site-reading-heading);
1586
+ }
1587
+
1588
+ .reply-body {
1589
+ color: var(--site-reading-body);
1590
+ }
1591
+
1592
+ .reply-body > :first-child {
1593
+ margin-top: 0;
1594
+ }
1595
+
1596
+ .reply-body > :last-child {
1597
+ margin-bottom: 0;
1598
+ }
1599
+
1600
+ /* -------------------------------------------------------------------------
1601
+ * Collections page
1602
+ *
1603
+ * Mirrors the main site's authenticated-less collections view
1604
+ * (`ui/pages/CollectionsPage.tsx` + `ui/shared/CollectionDirectory.tsx`):
1605
+ * a page-intro block with count, then a two-column grid per row where a
1606
+ * monospace sequence label sits beside the collection title, description,
1607
+ * and entry/activity meta.
1608
+ * ------------------------------------------------------------------------- */
1609
+
1610
+ .collections-page-shell {
1611
+ position: relative;
1612
+ display: flex;
1613
+ flex-direction: column;
1614
+ width: var(--layout-content-width);
1615
+ max-width: 100%;
1616
+ gap: clamp(1.25rem, 3vw, 1.75rem);
1617
+ }
1618
+
1619
+ @media (min-width: 761px) and (max-width: 1024px) {
1620
+ .collections-page-shell {
1621
+ width: min(100%, 35rem);
1622
+ }
1623
+ }
1624
+
1625
+ @media (max-width: 760px) {
1626
+ .collections-page-shell {
1627
+ width: 100%;
1628
+ }
1629
+ }
1630
+
1631
+ .collections-page-header {
1632
+ position: relative;
1633
+ display: flex;
1634
+ align-items: flex-start;
1635
+ padding-bottom: 0.2rem;
1636
+ }
1637
+
1638
+ .collections-page-heading {
1639
+ min-width: 0;
1640
+ flex: 1 1 18rem;
1641
+ }
1642
+
1643
+ .page-intro {
1644
+ display: flex;
1645
+ flex-direction: column;
1646
+ gap: 1rem;
1647
+ padding-bottom: 0.1rem;
1648
+ }
1649
+
1650
+ .page-intro-title-row {
1651
+ display: flex;
1652
+ flex-wrap: wrap;
1653
+ align-items: baseline;
1654
+ gap: 0.7rem;
1655
+ min-width: 0;
1656
+ }
1657
+
1658
+ .page-intro-title {
1659
+ margin: 0;
1660
+ font-family: var(--font-heading);
1661
+ font-size: var(--type-title, 2rem);
1662
+ font-weight: var(--type-heading-weight);
1663
+ line-height: 1.15;
1664
+ letter-spacing: -0.01em;
1665
+ color: var(--site-text-primary);
1666
+ }
1667
+
1668
+ .page-intro-meta-row {
1669
+ display: flex;
1670
+ flex-wrap: wrap;
1671
+ align-items: center;
1672
+ justify-content: space-between;
1673
+ gap: 0.75rem 1rem;
1674
+ }
1675
+
1676
+ .page-intro-meta,
1677
+ .page-intro-description {
1678
+ margin: 0;
1679
+ color: var(--site-text-secondary);
1680
+ font-family: var(--font-ui);
1681
+ font-size: var(--type-secondary);
1682
+ line-height: 1.3;
1683
+ }
1684
+
1685
+ .collection-directory {
1686
+ position: relative;
1687
+ display: flex;
1688
+ flex-direction: column;
1689
+ gap: 0.15rem;
1690
+ list-style: none;
1691
+ padding: 0;
1692
+ margin: 0;
1693
+ }
1694
+
1695
+ .collection-directory-item {
1696
+ position: relative;
1697
+ display: flex;
1698
+ align-items: flex-start;
1699
+ gap: 0.75rem;
1700
+ padding: 0.95rem 0;
1701
+ background: transparent;
1702
+ text-decoration: none;
1703
+ }
1704
+
1705
+ .collection-directory-main {
1706
+ --collection-directory-sequence-width: 3.5ch;
1707
+ --collection-directory-title-line-height: 1.18;
1708
+ min-width: 0;
1709
+ flex: 1;
1710
+ display: grid;
1711
+ grid-template-columns: var(--collection-directory-sequence-width) minmax(
1712
+ 0,
1713
+ 1fr
1714
+ );
1715
+ align-items: start;
1716
+ column-gap: 0.8rem;
1717
+ row-gap: 0.25rem;
1718
+ }
1719
+
1720
+ .collection-directory-sequence {
1721
+ grid-column: 1;
1722
+ grid-row: 1;
1723
+ display: block;
1724
+ width: var(--collection-directory-sequence-width);
1725
+ padding-top: 0.2rem;
1726
+ font-family: var(--font-mono);
1727
+ font-size: var(--type-xs);
1728
+ font-variant-numeric: tabular-nums;
1729
+ line-height: var(--collection-directory-title-line-height);
1730
+ letter-spacing: 0.14em;
1731
+ color: var(--site-text-secondary);
1732
+ }
1733
+
1734
+ .collection-directory-title-row {
1735
+ grid-column: 2;
1736
+ grid-row: 1;
1737
+ min-width: 0;
1738
+ display: flex;
1739
+ align-items: flex-start;
1740
+ }
1741
+
1742
+ .collection-directory-title-link {
1743
+ color: inherit;
1744
+ text-decoration: none;
1745
+ transition: color 0.15s ease;
1746
+ }
1747
+
1748
+ .collection-directory-title-link:hover,
1749
+ .collection-directory-title-link:focus-visible {
1750
+ color: var(--site-text-primary);
1751
+ }
1752
+
1753
+ .collection-directory-title-link:hover .collection-directory-title,
1754
+ .collection-directory-title-link:focus-visible .collection-directory-title {
1755
+ text-decoration: underline;
1756
+ text-underline-offset: 3px;
1757
+ }
1758
+
1759
+ .collection-directory-title {
1760
+ min-width: 0;
1761
+ display: inline-flex;
1762
+ align-items: center;
1763
+ gap: 0.45rem;
1764
+ font-family: var(--font-heading);
1765
+ font-size: var(--type-content-body);
1766
+ font-weight: var(--type-heading-weight);
1767
+ line-height: var(--collection-directory-title-line-height);
1768
+ letter-spacing: -0.02em;
1769
+ text-wrap: pretty;
1770
+ }
1771
+
1772
+ .collection-directory-title-marker {
1773
+ display: inline-flex;
1774
+ align-items: center;
1775
+ justify-content: center;
1776
+ width: 0.95rem;
1777
+ min-width: 0.95rem;
1778
+ height: 0.95rem;
1779
+ color: var(--site-text-secondary);
1780
+ transition: color 0.15s ease;
1781
+ }
1782
+
1783
+ .collection-directory-title-link:hover .collection-directory-title-marker,
1784
+ .collection-directory-title-link:focus-visible
1785
+ .collection-directory-title-marker {
1786
+ color: var(--site-text-primary);
1787
+ }
1788
+
1789
+ .collection-directory-description {
1790
+ grid-column: 2;
1791
+ grid-row: 2;
1792
+ margin: 0;
1793
+ color: color-mix(in srgb, var(--site-text-secondary) 80%, transparent);
1794
+ font-family: var(--font-body);
1795
+ font-size: var(--type-sm);
1796
+ line-height: 1.45;
1797
+ }
1798
+
1799
+ .collection-directory-description :where(p) {
1800
+ margin-top: 0.25em;
1801
+ margin-bottom: 0.25em;
1802
+ }
1803
+
1804
+ /* Links inside the description inherit the description color so they sit in
1805
+ the same gray tone as the copy around them (matches the main site's
1806
+ `.prose { --tw-prose-links: var(--site-content-link); }` which resolves
1807
+ to `inherit`). The underline stays, drawn in currentColor. */
1808
+ .collection-directory-description :where(a) {
1809
+ color: inherit;
1810
+ text-decoration: underline;
1811
+ text-decoration-color: currentColor;
1812
+ text-underline-offset: 0.15em;
1813
+ }
1814
+
1815
+ .collection-directory-description :where(a:hover),
1816
+ .collection-directory-description :where(a:focus-visible) {
1817
+ color: var(--site-text-primary);
1818
+ }
1819
+
1820
+ .collection-directory-description :where(p:first-child) {
1821
+ margin-top: 0;
1822
+ }
1823
+
1824
+ .collection-directory-description :where(p:last-child) {
1825
+ margin-bottom: 0;
1826
+ }
1827
+
1828
+ .collection-directory-description + .collection-directory-summary {
1829
+ grid-row: 3;
1830
+ }
1831
+
1832
+ .collection-directory-summary {
1833
+ grid-column: 2;
1834
+ grid-row: 2;
1835
+ display: flex;
1836
+ min-width: 0;
1837
+ overflow: hidden;
1838
+ align-items: center;
1839
+ gap: 0.2rem 0.5rem;
1840
+ margin: 0;
1841
+ color: var(--site-reading-meta);
1842
+ font-family: var(--font-ui);
1843
+ font-size: var(--type-sm);
1844
+ line-height: 1.3;
1845
+ white-space: nowrap;
1846
+ }
1847
+
1848
+ .collection-directory-meta {
1849
+ flex: 0 0 auto;
1850
+ color: inherit;
1851
+ }
1852
+
1853
+ .collection-directory-meta-separator {
1854
+ flex: 0 0 auto;
1855
+ color: color-mix(in srgb, var(--site-divider) 88%, transparent);
1856
+ }
1857
+
1858
+ .collection-directory-updated {
1859
+ flex: 0 0 auto;
1860
+ color: inherit;
1861
+ white-space: nowrap;
1862
+ }
1863
+
1864
+ .collection-directory-divider {
1865
+ padding: 1.5rem 0 0.85rem;
1866
+ }
1867
+
1868
+ .collection-directory-divider-row {
1869
+ display: flex;
1870
+ align-items: center;
1871
+ gap: 0.95rem;
1872
+ }
1873
+
1874
+ .collection-directory-divider-text {
1875
+ font-family: var(--font-heading);
1876
+ font-size: var(--type-secondary);
1877
+ letter-spacing: 0;
1878
+ font-style: normal;
1879
+ white-space: nowrap;
1880
+ color: var(--site-text-secondary);
1881
+ }
1882
+
1883
+ .collection-directory-divider-line {
1884
+ flex: 1;
1885
+ height: 1px;
1886
+ border: none;
1887
+ margin: 0;
1888
+ background: linear-gradient(
1889
+ 90deg,
1890
+ color-mix(in srgb, var(--site-divider) 100%, transparent),
1891
+ color-mix(in srgb, var(--site-divider) 54%, transparent) 34%,
1892
+ transparent 86%
1893
+ );
1894
+ }
1895
+
1896
+ /* -------------------------------------------------------------------------
1897
+ * Pagination
1898
+ * ------------------------------------------------------------------------- */
1899
+
1900
+ .pagination {
1901
+ display: flex;
1902
+ align-items: center;
1903
+ justify-content: center;
1904
+ flex-wrap: wrap;
1905
+ gap: 1rem;
1906
+ padding: 1.5rem 0;
1907
+ font-size: var(--type-sm);
1908
+ font-variant-numeric: tabular-nums;
1909
+ }
1910
+
1911
+ .pagination-link {
1912
+ color: var(--site-text-secondary);
1913
+ text-decoration: underline;
1914
+ text-underline-offset: 3px;
1915
+ transition: color 0.15s ease;
1916
+ }
1917
+
1918
+ .pagination-link:hover,
1919
+ .pagination-link:focus {
1920
+ color: var(--site-text-primary);
1921
+ }
1922
+
1923
+ .pagination-link.is-disabled {
1924
+ color: color-mix(in srgb, var(--site-text-secondary) 50%, transparent);
1925
+ cursor: default;
1926
+ text-decoration: none;
1927
+ }
1928
+
1929
+ .pagination-current {
1930
+ color: var(--site-text-primary);
1931
+ font-weight: var(--fw-medium);
1932
+ }
1933
+
1934
+ .pagination-ellipsis {
1935
+ color: var(--site-text-secondary);
1936
+ }
1937
+
1938
+ /* -------------------------------------------------------------------------
1939
+ * Empty states + utility
1940
+ * ------------------------------------------------------------------------- */
1941
+
1942
+ .empty-state {
1943
+ color: var(--site-reading-meta);
1944
+ font-style: italic;
1945
+ text-align: center;
1946
+ padding: var(--space-xl) 0;
1947
+ }
1948
+
1949
+ .page,
1950
+ .section {
1951
+ display: block;
1952
+ }
1953
+
1954
+ .page-summary,
1955
+ .section-summary {
1956
+ font-size: var(--type-secondary);
1957
+ color: var(--site-reading-meta);
1958
+ }
1959
+
1960
+ /* -------------------------------------------------------------------------
1961
+ * Wider viewport refinements
1962
+ * ------------------------------------------------------------------------- */
1963
+
1964
+ @media (min-width: 768px) {
1965
+ .site-main {
1966
+ padding-top: calc(var(--space-xl) * 1.5);
1967
+ padding-bottom: calc(var(--space-xl) * 1.5);
1968
+ }
1969
+
1970
+ .post-card-media,
1971
+ .thread-media,
1972
+ .reply-media {
1973
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1974
+ }
1975
+
1976
+ .post-card-media:has(> :only-child),
1977
+ .thread-media:has(> :only-child),
1978
+ .reply-media:has(> :only-child) {
1979
+ grid-template-columns: 1fr;
1980
+ }
1981
+ }