@jant/core 0.3.38 → 0.3.40
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.
- package/LICENSE +189 -189
- package/README.md +6 -4
- package/bin/commands/assets/prepare.js +55 -0
- package/bin/commands/db/execute-file.js +113 -0
- package/bin/commands/db/export.js +5 -0
- package/bin/commands/db/rehearse.js +65 -0
- package/bin/commands/deploy.js +162 -0
- package/bin/commands/export.js +73 -75
- package/bin/commands/import-site.js +1531 -267
- package/bin/commands/migrate.js +79 -0
- package/bin/commands/reset-password.js +80 -7
- package/bin/commands/site/export.js +415 -0
- package/bin/commands/site/import.js +5 -0
- package/bin/commands/site/localize-media.js +118 -0
- package/bin/commands/site/snapshot/export.js +357 -0
- package/bin/commands/site/snapshot/import.js +363 -0
- package/bin/commands/start.js +46 -0
- package/bin/commands/uploads/cleanup.js +119 -0
- package/bin/jant.js +55 -15
- package/bin/lib/cli-api-token.js +6 -0
- package/bin/lib/d1-query.js +194 -0
- package/bin/lib/load-node-runtime.js +10 -0
- package/bin/lib/migration-artifacts.js +99 -0
- package/bin/lib/migration-rehearsal.js +438 -0
- package/bin/lib/migration-runner.js +311 -0
- package/bin/lib/node-database.js +48 -0
- package/bin/lib/node-sqlite.js +158 -0
- package/bin/lib/public-assets.js +66 -0
- package/bin/lib/r2-query.js +170 -0
- package/bin/lib/runtime-target.js +33 -0
- package/bin/lib/site-localize-media.js +427 -0
- package/bin/lib/site-media-parser.js +1150 -0
- package/bin/lib/site-selection.js +222 -0
- package/bin/lib/site-snapshot.js +484 -0
- package/bin/lib/site-url.js +84 -0
- package/bin/lib/sql-export.js +194 -0
- package/bin/lib/wrangler-cli.js +41 -0
- package/bin/lib/wrangler-config.js +86 -0
- package/dist/app-CAtsuLLh.js +30644 -0
- package/dist/client/_assets/chunks/0041f681602cc834bb5c55ced0155b8e-BNpHLJgt.woff2 +0 -0
- package/dist/client/_assets/chunks/008ea9091e332c639ceb18874eacd60c-CygB704Q.woff2 +0 -0
- package/dist/client/_assets/chunks/00c9ac960d866ffaf8a866e5939024e2-CqRrlxSi.woff2 +0 -0
- package/dist/client/_assets/chunks/02629e5d0a9860b7fe32ec1f0563213a-YvgSIv_V.woff2 +0 -0
- package/dist/client/_assets/chunks/02e48e353415a00e0f556608cab33a43-YFgu4zi3.woff2 +0 -0
- package/dist/client/_assets/chunks/02faf6bb0ab4d56ada037c0bbaf9b9f7-DUuUM2eo.woff2 +0 -0
- package/dist/client/_assets/chunks/031089da45fbfb7dc18ac827bef4c56e-D4ahCOTO.woff2 +0 -0
- package/dist/client/_assets/chunks/03ac785139320b7b13bac9c150bf72bf-BG7zubxs.woff2 +0 -0
- package/dist/client/_assets/chunks/053bd3d7aec0040d0cc50c261a1f4e3e-BdG4yI0n.woff2 +0 -0
- package/dist/client/_assets/chunks/057a3d44d7fc606f113d863376d0ecf0-BsEMbuKV.woff2 +0 -0
- package/dist/client/_assets/chunks/0713613227cc4c686c45a279f8bdc166-BzLoJcLo.woff2 +0 -0
- package/dist/client/_assets/chunks/0b1f83a3c7e715560a55ad9eb0fb1c94-asGrAhxW.woff2 +0 -0
- package/dist/client/_assets/chunks/0c055db157e7a13f3103cc2a6b67fec3-1T6huY_I.woff2 +0 -0
- package/dist/client/_assets/chunks/0d3f5cc265cb6c439c517f2c4cebbddf-CmkfpVHX.woff2 +0 -0
- package/dist/client/_assets/chunks/0e97f44ebc65384c346fe19bcc52fa20-BJTzmZzt.woff2 +0 -0
- package/dist/client/_assets/chunks/10f2b44b3711d3f5bdcc30d373b543d1-BRTxD_6-.woff2 +0 -0
- package/dist/client/_assets/chunks/1139d32ae2bdeb26c0c8f31330aa9a9f-B7k4Da0E.woff2 +0 -0
- package/dist/client/_assets/chunks/1259e5825b314fe2b8bb96d6e8069ee5-Ba8VoZCg.woff2 +0 -0
- package/dist/client/_assets/chunks/12c518ebfe62818af550c08947e359e7-B7eDp07N.woff2 +0 -0
- package/dist/client/_assets/chunks/145831a59caa06d894022fe60212ed21-B3xSIk4b.woff2 +0 -0
- package/dist/client/_assets/chunks/14b040a2dda256936bc7b3470e548394-CF7zgNWs.woff2 +0 -0
- package/dist/client/_assets/chunks/14c1506106d92621bafb11016735194e-cbk_paoP.woff2 +0 -0
- package/dist/client/_assets/chunks/154a2c266902003bd8b7449386b10776-CYgd0apt.woff2 +0 -0
- package/dist/client/_assets/chunks/15f8c0df47fd639d1b0d9bd5cf507c9b-B11bYwtn.woff2 +0 -0
- package/dist/client/_assets/chunks/1668bd859ffe15bed7d5563117d8d5fb-DJotYU-j.woff2 +0 -0
- package/dist/client/_assets/chunks/169a096e61d38a773216f51d1ec2cc06-CzS4CZjy.woff2 +0 -0
- package/dist/client/_assets/chunks/1884a2b22d314c7d57707f03aec348e0-BdBJ4_JO.woff2 +0 -0
- package/dist/client/_assets/chunks/189f272ea2600c74d576b7b15c014922-CylwUmhO.woff2 +0 -0
- package/dist/client/_assets/chunks/190e3f8632494e7c095117f26b1c811e-DT09KhZe.woff2 +0 -0
- package/dist/client/_assets/chunks/19ad151c22ce1befe0a9ea643fbee570-BOjbPzxL.woff2 +0 -0
- package/dist/client/_assets/chunks/19e39850472250bfdbce654d30859879-Db8MVQ-5.woff2 +0 -0
- package/dist/client/_assets/chunks/1b5d0d740450fb996749464c9b882025-BG0yepI2.woff2 +0 -0
- package/dist/client/_assets/chunks/1bca0a2a8840ad0ee9414940593db144-CfiRZ0Fs.woff2 +0 -0
- package/dist/client/_assets/chunks/1c820b5295868008ca7c78afa5b7655d-rGkaVY0Z.woff2 +0 -0
- package/dist/client/_assets/chunks/1cda27dcaab977ae4ef5d5ab2a10ae03-3n1CbajX.woff2 +0 -0
- package/dist/client/_assets/chunks/1e2640116bbba817f43c43cc69371cf1-BLnekPNy.woff2 +0 -0
- package/dist/client/_assets/chunks/1f4bc38a1c50f55f335f5411cae47696-3J1JFXeu.woff2 +0 -0
- package/dist/client/_assets/chunks/1fbccc182322b513f57cd156a9a491b0-bRVH28a5.woff2 +0 -0
- package/dist/client/_assets/chunks/1fbe225742c69f4ba9ea5f74922f0ca1-BHRIiKDB.woff2 +0 -0
- package/dist/client/_assets/chunks/2022cf097cb952d9fe75b53b4587d2c3-Btdq5ZEB.woff2 +0 -0
- package/dist/client/_assets/chunks/21e0a71d86be7b8a9e812e7af09dd061-SSZaQU5Z.woff2 +0 -0
- package/dist/client/_assets/chunks/2240a3c43ca5ef59ae3c348c7884792f-DQgT8QLe.woff2 +0 -0
- package/dist/client/_assets/chunks/2573703213da30d3ba18925b100b2c2b-D61uHyrJ.woff2 +0 -0
- package/dist/client/_assets/chunks/265e048cc9f2f8a711ba585a534d5351-geHDzSNf.woff2 +0 -0
- package/dist/client/_assets/chunks/26839c0e47c73514b8d8f660d24d6b19-D2gmzZl-.woff2 +0 -0
- package/dist/client/_assets/chunks/280e3d2b58e9ad3501816072e01b0c13-Dx5yDwjz.woff2 +0 -0
- package/dist/client/_assets/chunks/2874d07e228da9583b0e73646dacd498-26mUURU-.woff2 +0 -0
- package/dist/client/_assets/chunks/29d49891713a2785a3a383001cf58c59-DVb6JpZh.woff2 +0 -0
- package/dist/client/_assets/chunks/2a22e14a9ad53f2abb3c7e85017b7d12-CU_4APNf.woff2 +0 -0
- package/dist/client/_assets/chunks/2a7cedfcd6e4c7cec36f4fd7b0f329c2-BUp7BYdq.woff2 +0 -0
- package/dist/client/_assets/chunks/2acea04a920f6af31e7db97052f563c6-KdL2n7-Y.woff2 +0 -0
- package/dist/client/_assets/chunks/2ae2ca951489c9d50cde5b36a2a5515b-CWV12jwD.woff2 +0 -0
- package/dist/client/_assets/chunks/2b3e8c5703b91f39f6027f43f0da6f4b-FHYDvFqX.woff2 +0 -0
- package/dist/client/_assets/chunks/2ba802b14f21a58fc61606c88fa93373-BmrW6szo.woff2 +0 -0
- package/dist/client/_assets/chunks/2d81eb6ab0ebbc0cabfb3a3341ba8800-Ds2YcMj0.woff2 +0 -0
- package/dist/client/_assets/chunks/2deb444546774c3a3ab38c75eb69cdfb-Dm9USQXk.woff2 +0 -0
- package/dist/client/_assets/chunks/2e98b666924b8e0a09d1aeeefd24bdd2-Cmh3DrKG.woff2 +0 -0
- package/dist/client/_assets/chunks/2f27ee4fb2cf6a280e110e09c18ef73e-D_yYWYMZ.woff2 +0 -0
- package/dist/client/_assets/chunks/2fbccf9a3853eb59db1a825e044515fd-CiShE3Wo.woff2 +0 -0
- package/dist/client/_assets/chunks/2fd3fceb6faed5e3db768e88d7614dca-D74stxc-.woff2 +0 -0
- package/dist/client/_assets/chunks/2ff009fa8701505d7f3dc6c83763f019-nkOuUfA-.woff2 +0 -0
- package/dist/client/_assets/chunks/31342cebfa5ea7fac06b4ea372d96bc5-DdIH_TkU.woff2 +0 -0
- package/dist/client/_assets/chunks/31424fe5d54692e7c8b38021ccb8597c-CfNu45zJ.woff2 +0 -0
- package/dist/client/_assets/chunks/3179006d1c7ebfa50d27482a2859d9a0-e7PNUH9y.woff2 +0 -0
- package/dist/client/_assets/chunks/34c2edb3c37f71258f5c4a31091f0c6c-Cyr8VjPf.woff2 +0 -0
- package/dist/client/_assets/chunks/35cf5dd04315e0b906e1a413d7905a2f-A-QPUrVX.woff2 +0 -0
- package/dist/client/_assets/chunks/360c190344c26278bbc50e2f4d6a2b3f-B7OhzvgR.woff2 +0 -0
- package/dist/client/_assets/chunks/375329ba0b50b94b35006498e555867c-CDc5XB7_.woff2 +0 -0
- package/dist/client/_assets/chunks/387c811226f303af62f1e21aae6f5c83-BmPYUAdb.woff2 +0 -0
- package/dist/client/_assets/chunks/389a950f2a1211946d294716e679e381-Diuxk8JN.woff2 +0 -0
- package/dist/client/_assets/chunks/39b0bbc910af9d2d6dcd8bd4abd6387d-NhvZf71d.woff2 +0 -0
- package/dist/client/_assets/chunks/3adc8f6350cf5067bcb6dc5e44c45d41-DIO3oy0b.woff2 +0 -0
- package/dist/client/_assets/chunks/3b41385fc27419c19822060daa0b5cb3-Dh5JVnsu.woff2 +0 -0
- package/dist/client/_assets/chunks/3bed5bd57de8f738e53cddaea88983d9-BAGVbLtM.woff2 +0 -0
- package/dist/client/_assets/chunks/3c201fd8d1bb20abe7d06b940e83a4d9-Bz0dCLvM.woff2 +0 -0
- package/dist/client/_assets/chunks/3cbe4a697fd595ef42c899de7d3e5445-zWwFRRI_.woff2 +0 -0
- package/dist/client/_assets/chunks/3d385ea0880df7204258e290648ec012-BQqoFH8R.woff2 +0 -0
- package/dist/client/_assets/chunks/3d83dacbbec3d8532ae9afede21f3aab-BH06SEJj.woff2 +0 -0
- package/dist/client/_assets/chunks/3dc1a4f0d7af59e16b5162a2b077a442-CkXZW3CY.woff2 +0 -0
- package/dist/client/_assets/chunks/3dc68e473fe23bd076dd46785cd23583-Cv6HZ0Dr.woff2 +0 -0
- package/dist/client/_assets/chunks/427577dcb707d1d35eebd155b4222aa7-D7-mHA6o.woff2 +0 -0
- package/dist/client/_assets/chunks/42a74b6a625bbf0a9616ed4db3152c88-CQ58KTMS.woff2 +0 -0
- package/dist/client/_assets/chunks/435b7dca567809813fcb395a27ed83a0-C6E3YXBr.woff2 +0 -0
- package/dist/client/_assets/chunks/43693195e775d515689fa035394067fd-DLMrklI6.woff2 +0 -0
- package/dist/client/_assets/chunks/43fb49e5b79ee7e553869d84e6e08b1e-BgOVrd59.woff2 +0 -0
- package/dist/client/_assets/chunks/44dcbbc3cc8f22e613b342d691511ab6-dRyYwGGi.woff2 +0 -0
- package/dist/client/_assets/chunks/450a5b53be0a8a778bb0b623e86b652f-qwII2gXW.woff2 +0 -0
- package/dist/client/_assets/chunks/457485e72835364662dfead6281638c1-Mv279UyL.woff2 +0 -0
- package/dist/client/_assets/chunks/47479c470fae70f10b7c964a7ecbf274-D9VNBclD.woff2 +0 -0
- package/dist/client/_assets/chunks/474fac21b12b7efd71f7c321578878b0-BJRz_Yd3.woff2 +0 -0
- package/dist/client/_assets/chunks/477866c8396474a17317dcac3e7a014f-e90LWIFy.woff2 +0 -0
- package/dist/client/_assets/chunks/478ebdaadda7775c391c5dcab4e697df-RfXJJ1gl.woff2 +0 -0
- package/dist/client/_assets/chunks/488846410760fe128dae939836ca5423-D0YbXQOX.woff2 +0 -0
- package/dist/client/_assets/chunks/48d6a97a185c799be4fe67aaf7edf213-CqLkiJik.woff2 +0 -0
- package/dist/client/_assets/chunks/48eb0a91e50c7f026e248c64145e72af-D8LB2Dye.woff2 +0 -0
- package/dist/client/_assets/chunks/490edb9fc8a4356aea556eed32287464-Bxk-XtyT.woff2 +0 -0
- package/dist/client/_assets/chunks/4a23fe6e82fd496b5eb20401b6164efe-CfhsfLd6.woff2 +0 -0
- package/dist/client/_assets/chunks/4b0e79ba18b2ce424fa93e84996d7cba-B0dS4UvF.woff2 +0 -0
- package/dist/client/_assets/chunks/4bc743968cf1c3ce5711de67ef1ccc4d-Dmn20LlT.woff2 +0 -0
- package/dist/client/_assets/chunks/4c4bdd0b3f3a52e28f3b643c1c5d43be-BLqyuzyK.woff2 +0 -0
- package/dist/client/_assets/chunks/4c96411f3693a9a8657a9c1190f82bce-BhP7AS2j.woff2 +0 -0
- package/dist/client/_assets/chunks/4c9aa12aba2a6a57410eacaff7427916-CLDZgzM7.woff2 +0 -0
- package/dist/client/_assets/chunks/4cca7233bf8ce5dec2e5d146b993d626-Bf7OgJe6.woff2 +0 -0
- package/dist/client/_assets/chunks/4cf0f292f3358bd2f73b1cf4ec1476f3-CIfjw85D.woff2 +0 -0
- package/dist/client/_assets/chunks/4d0a9128d06ea857f203bf5d007b1ab9-BZ-BuqS9.woff2 +0 -0
- package/dist/client/_assets/chunks/4dc0728df0f2ba70796f45f05654c7ba-DGd3NDaT.woff2 +0 -0
- package/dist/client/_assets/chunks/4dc2bc2c55b47f57d13b63aa6b1c8bd4-g3WbclK2.woff2 +0 -0
- package/dist/client/_assets/chunks/4e1cc6aafb411b572c8d3511e925ecf1-BUf15jYj.woff2 +0 -0
- package/dist/client/_assets/chunks/4e5384920bbb155d9d8d74887b09ea5b-2KLteQXT.woff2 +0 -0
- package/dist/client/_assets/chunks/501f66f24bce8234441954de1b568403-CIe4N6pO.woff2 +0 -0
- package/dist/client/_assets/chunks/50cfd672bfa62512ba090420acf35c87-CibXrwCT.woff2 +0 -0
- package/dist/client/_assets/chunks/5227dbe9933760a48baff21ebd13fc98-v8CBITMX.woff2 +0 -0
- package/dist/client/_assets/chunks/526b263e72c189f4b065738aaa6d423a-Dj5Ns6Ev.woff2 +0 -0
- package/dist/client/_assets/chunks/53a88404451448cd2e620a0ca0e45a20-CI0P5NCv.woff2 +0 -0
- package/dist/client/_assets/chunks/54da934819a917f561b439bfd10f88b6-CpoNRhz7.woff2 +0 -0
- package/dist/client/_assets/chunks/54e301f412730f391225db59dae1c8d5-CxTAz9F1.woff2 +0 -0
- package/dist/client/_assets/chunks/551b1d7a0b80c8d42af09863cdca7f01-BIGKH8GS.woff2 +0 -0
- package/dist/client/_assets/chunks/555d990ab3fd7d3d66c6d1fa9a82fec5-BndAe6f2.woff2 +0 -0
- package/dist/client/_assets/chunks/557cd00c5d6827e13d72a0c71b23587b-C6gpr-g-.woff2 +0 -0
- package/dist/client/_assets/chunks/563fa31542d553f25abab65cf7f81e1d-Cl_1me5X.woff2 +0 -0
- package/dist/client/_assets/chunks/56e1c4734bbbb38af2fbc262bf6e98f2-DZ32amUx.woff2 +0 -0
- package/dist/client/_assets/chunks/5947f5da5da9a352a2b534ee64bfc29a-DT0Fj-SL.woff2 +0 -0
- package/dist/client/_assets/chunks/5979c33a7eb5963bf8e83e46931b5fb5--4f9yv1z.woff2 +0 -0
- package/dist/client/_assets/chunks/597d69d0710e0178b162afb0a0c20401-CpThXFdo.woff2 +0 -0
- package/dist/client/_assets/chunks/59966ee0b069b577510fe68c350da0ee-Bs_HDvyP.woff2 +0 -0
- package/dist/client/_assets/chunks/5a10741e41259e235841440394c0763d-uCZGOg0A.woff2 +0 -0
- package/dist/client/_assets/chunks/5bfc7a121c35ae42623ef804fb525e0e-mS7vyFFz.woff2 +0 -0
- package/dist/client/_assets/chunks/5cc23a76e122d0ad2f7cede41bc35b27-4T1ZVQJu.woff2 +0 -0
- package/dist/client/_assets/chunks/5d48855bed5f3554eff91b573d7376ac-CPzsdNDF.woff2 +0 -0
- package/dist/client/_assets/chunks/5ddcbe564b29ef08632e1aeb33455435-CQzDKa-z.woff2 +0 -0
- package/dist/client/_assets/chunks/5f90024544c2907c6c0203c6210c50be-C_1uxIky.woff2 +0 -0
- package/dist/client/_assets/chunks/605667a998e91e2b6a4a3cd7c31fe5a9-Co2lOjER.woff2 +0 -0
- package/dist/client/_assets/chunks/60a14064ed334f0155795d795e926abe-C2HuVyw5.woff2 +0 -0
- package/dist/client/_assets/chunks/60d8b0805a0a8c54a6cca216004beff5-CV1GX5br.woff2 +0 -0
- package/dist/client/_assets/chunks/611b62d5fd9698d9b5ce495ba6f14c93-CPi2xRKF.woff2 +0 -0
- package/dist/client/_assets/chunks/61bf4287453da4025d03fa6b2dba66ca-CMh4XzzB.woff2 +0 -0
- package/dist/client/_assets/chunks/638369541268ed5a10af97ad77498c73-DrpvGu-L.woff2 +0 -0
- package/dist/client/_assets/chunks/649b12d7cee7bb981842946e4547e6ca-EACt8KkC.woff2 +0 -0
- package/dist/client/_assets/chunks/653bef2ed891ae48d8ed712283080649-C3d1ZTAc.woff2 +0 -0
- package/dist/client/_assets/chunks/67d2a81f06ba352f17fbdc3a5e6ea59e-DC8Iostn.woff2 +0 -0
- package/dist/client/_assets/chunks/67f32ceea9e78e5109f87724ad886010-C_3-9sSn.woff2 +0 -0
- package/dist/client/_assets/chunks/68304f3229cf763465f044fccb5892c0-CTvPlN8c.woff2 +0 -0
- package/dist/client/_assets/chunks/687d0f0f90a9b23e40102e16ad8e9836-Bzlx1W-7.woff2 +0 -0
- package/dist/client/_assets/chunks/688a88911e4da17b609196a959b8b930-BgwP4zIQ.woff2 +0 -0
- package/dist/client/_assets/chunks/68f2fab82ec8e9291f08c3145111549c-CXqagiiH.woff2 +0 -0
- package/dist/client/_assets/chunks/69519ada3f3f74ca20aacb8af48ab6b4-DncDOElk.woff2 +0 -0
- package/dist/client/_assets/chunks/6a6e884fb2b65ec5b4a3d5ecd0d01a6a-DBNJo4jq.woff2 +0 -0
- package/dist/client/_assets/chunks/6db6ddf72c38a78ce44c1327701152e1-CFUWMaQQ.woff2 +0 -0
- package/dist/client/_assets/chunks/6e1a8b45b01939088c3a8cfcf8c10681-BemqZSaI.woff2 +0 -0
- package/dist/client/_assets/chunks/6e2164fad867d166de2e5b274f04a563-_YD_QMym.woff2 +0 -0
- package/dist/client/_assets/chunks/6e83fe0b6e708eaf1c3003d6dee11488-CRqY8z2g.woff2 +0 -0
- package/dist/client/_assets/chunks/6eefc9d430171c1e1e4034ecadee31c8-d3VCnQ01.woff2 +0 -0
- package/dist/client/_assets/chunks/70861376e5d4f92f8aa7aa1b2749b617-BqwxmSo2.woff2 +0 -0
- package/dist/client/_assets/chunks/70adaf50c56d5ff859c64d35e0f1e34e-BCmTRExx.woff2 +0 -0
- package/dist/client/_assets/chunks/7124d150570d39ced8d45507dc11ca1e-Co_mUkqP.woff2 +0 -0
- package/dist/client/_assets/chunks/71eafb8fbe3a734283517e230ad8b6db-CFmZ-qAS.woff2 +0 -0
- package/dist/client/_assets/chunks/72ee453ac0e19bd2c631c8921c44e3de-CEidyyfI.woff2 +0 -0
- package/dist/client/_assets/chunks/751f54dbb115140d5b645a6ba4aff5d3-DY-S96zI.woff2 +0 -0
- package/dist/client/_assets/chunks/753b5f6fb254bacb6618ace25af3df60-uBG6c32o.woff2 +0 -0
- package/dist/client/_assets/chunks/7609e7e74dd4d916a7abc7ecc7d95f7e-CzrNhght.woff2 +0 -0
- package/dist/client/_assets/chunks/76b9d6fe838ae4151d95ce7200aa2bf6-BfQWDykU.woff2 +0 -0
- package/dist/client/_assets/chunks/76d4244186d118eea245d1385a4de2ec-CEoql1pw.woff2 +0 -0
- package/dist/client/_assets/chunks/77a7533bd21ccd33192d142a93555aa8-BzSb8ker.woff2 +0 -0
- package/dist/client/_assets/chunks/78ce29fed872e44fc9014d94875d2aac-D1BDuJXp.woff2 +0 -0
- package/dist/client/_assets/chunks/79a7fdf7d9c722b5723ae25e6ff8e203-5rPAnIr7.woff2 +0 -0
- package/dist/client/_assets/chunks/79a85a253e9b3f12d2e2cb15e16b3003-DTjWGv2X.woff2 +0 -0
- package/dist/client/_assets/chunks/7a86b155111ba20f3e87306ff6beac77-DchSNxJ1.woff2 +0 -0
- package/dist/client/_assets/chunks/7b1e76975b0984e6f83e3f9f8069e784-OB_rGzsR.woff2 +0 -0
- package/dist/client/_assets/chunks/7b6c60131822a0e4d36d980d52509d4e-8dQVuUiW.woff2 +0 -0
- package/dist/client/_assets/chunks/7caa14a095a6bc313aab780fe4ff7999-BJ-80Ois.woff2 +0 -0
- package/dist/client/_assets/chunks/7cbda564cb2dd4799ab9e89d51286aa7-MlT7YRSz.woff2 +0 -0
- package/dist/client/_assets/chunks/7d138084cf03c14116b11297fce0e3e3-CdWCcyam.woff2 +0 -0
- package/dist/client/_assets/chunks/7d65a3d6a65050eb5e6eca43398aeba4-CYB359u-.woff2 +0 -0
- package/dist/client/_assets/chunks/7dfc711962c8771f97e7c8898a6bcb65-Yv69yrg4.woff2 +0 -0
- package/dist/client/_assets/chunks/7ef123b62d530fcba73974fa265e0aae-CD7IMlBc.woff2 +0 -0
- package/dist/client/_assets/chunks/7f60eefa15956d6f06dd92404887d58c-LqioDjlc.woff2 +0 -0
- package/dist/client/_assets/chunks/7f8c15e0ecb102738981d9fa4cb6b921-8qiw7Fmn.woff2 +0 -0
- package/dist/client/_assets/chunks/80466082a896fd328f30a78593c7c568-BMAVDyAy.woff2 +0 -0
- package/dist/client/_assets/chunks/812b5a4b87f3a7b4afc1cfebc864f413-B4_mWnLK.woff2 +0 -0
- package/dist/client/_assets/chunks/812dfb7f8144d01b3cc9d5ce0b472f40-DxhfKDhh.woff2 +0 -0
- package/dist/client/_assets/chunks/84742b1ede4f0bb6d27131298eba21b4-4_QYQ-wj.woff2 +0 -0
- package/dist/client/_assets/chunks/8555f0285e3d28e95e2fc0ccccd9caff-CEnfoaRy.woff2 +0 -0
- package/dist/client/_assets/chunks/880162ae92cd9e120eb4e4e11fae459d-Cj61LKOn.woff2 +0 -0
- package/dist/client/_assets/chunks/8a3c84b0df36f851f5fea75ee8757951-CfHrA-x8.woff2 +0 -0
- package/dist/client/_assets/chunks/8b0c8c9f8cfa9fa090d97c5a5efb1f4c-DZc3EGF4.woff2 +0 -0
- package/dist/client/_assets/chunks/8c8393bc875f1ee36697a2113f4421ea-CnBugeCf.woff2 +0 -0
- package/dist/client/_assets/chunks/8dc035a34c76e6515ca203e2df182588-B1reQPCB.woff2 +0 -0
- package/dist/client/_assets/chunks/8e04e64c8f68d292a18d4160fbde8671-DkT7v-sd.woff2 +0 -0
- package/dist/client/_assets/chunks/8e6c9bb43afb8cbbff7cf1055e67c9bd-c7wzPI7v.woff2 +0 -0
- package/dist/client/_assets/chunks/8eb06109812cb80be44f47b8179c2709-DOaU0xD8.woff2 +0 -0
- package/dist/client/_assets/chunks/8f2b960c2823670e94f5b08aa65657e6-CHT-Gunr.woff2 +0 -0
- package/dist/client/_assets/chunks/8f89f57230d184f92a36e241874229d7-D6P0FMCn.woff2 +0 -0
- package/dist/client/_assets/chunks/904324af375d5fd370af1054355a050e-CHiXmgO7.woff2 +0 -0
- package/dist/client/_assets/chunks/90ac4f9d2aa02afdace2843b49fc18bb-CWArmWzF.woff2 +0 -0
- package/dist/client/_assets/chunks/90b6f57d77847f512fd11db74fa912f1-DzYbq8hW.woff2 +0 -0
- package/dist/client/_assets/chunks/911a2092d64d6d6494b254d819af2b91-C0xmZ-Cu.woff2 +0 -0
- package/dist/client/_assets/chunks/913759e6690f9fc0746a20b96f4bdcb4-B0k9hqx0.woff2 +0 -0
- package/dist/client/_assets/chunks/9154e26efe532a85a27d80902f5a2d6c-DJQmzPmB.woff2 +0 -0
- package/dist/client/_assets/chunks/9180de34b48b325200a97e267befff32-ClJx20hD.woff2 +0 -0
- package/dist/client/_assets/chunks/94e7ed67f1557b76fead6b6e456a0415-CjAhhvRn.woff2 +0 -0
- package/dist/client/_assets/chunks/95127a92346c04fec1fa81d6295b0a28-DNbeXPGm.woff2 +0 -0
- package/dist/client/_assets/chunks/958efb9b2fa2ea0008ffef009885f9f8-CNOwBDS1.woff2 +0 -0
- package/dist/client/_assets/chunks/95df3b9f681d9df411c30aea5b24f2e0-Dv7GHFVj.woff2 +0 -0
- package/dist/client/_assets/chunks/975af5a496e8d87d821910aa9fe4d598-CG5KDMOI.woff2 +0 -0
- package/dist/client/_assets/chunks/97a874bbf55ce89a4ab7cd27c7e938b1-fhost-bL.woff2 +0 -0
- package/dist/client/_assets/chunks/9ca9b71010a5faeee7047ef97aeee13b-K6NP7P3o.woff2 +0 -0
- package/dist/client/_assets/chunks/9cd0b77920b9d6c64eb686493123fc76-Db6wX5BE.woff2 +0 -0
- package/dist/client/_assets/chunks/9de02d745b8e25c6411fb152fb067748-CGxZtq8G.woff2 +0 -0
- package/dist/client/_assets/chunks/9eb33a430058d839ebbe2af4b2e0daa9-Cjd-WSds.woff2 +0 -0
- package/dist/client/_assets/chunks/9ebd27835ffcbd794e67151ab046ce68-DmxtZVr5.woff2 +0 -0
- package/dist/client/_assets/chunks/9f5a73aa8ba417688019d628f334db07-P03uxox_.woff2 +0 -0
- package/dist/client/_assets/chunks/9fbc06b2e3ff16b9d705c76db563ef17-XDHSv5Te.woff2 +0 -0
- package/dist/client/_assets/chunks/9fd53607094e329fa8e5c785b3ff0f1a-B-9qgOdM.woff2 +0 -0
- package/dist/client/_assets/chunks/a077f51cfb5cffb4ff4d8e229c0e9e79-BaPgyZ5H.woff2 +0 -0
- package/dist/client/_assets/chunks/a0f0c06d5c7a3ffa97706178cce212a8-DN_NE4Ic.woff2 +0 -0
- package/dist/client/_assets/chunks/a38c1830367f784181b6f544b0b11bbd-BmPGDXn1.woff2 +0 -0
- package/dist/client/_assets/chunks/a397997b579d3945c9c70a979c17a8ad-DXa54wGz.woff2 +0 -0
- package/dist/client/_assets/chunks/a3b929542e6c5a0644b73a7c8a8b6c03-B5i2p-Hj.woff2 +0 -0
- package/dist/client/_assets/chunks/a578742770fcd2226e3c45b5b6efdcb0-C1QhQdHg.woff2 +0 -0
- package/dist/client/_assets/chunks/a68d9d5027803832bb28e78cdcd04949-D_bwWhwg.woff2 +0 -0
- package/dist/client/_assets/chunks/a8857f5d478f101c053ba02d2f223e90-CHOaRPpq.woff2 +0 -0
- package/dist/client/_assets/chunks/a904b05966368bcf90b632c7c2e5f76b-BbTXYQVh.woff2 +0 -0
- package/dist/client/_assets/chunks/a9cf85e27428c14351d30eac8cbc8d91-DMaVc3-8.woff2 +0 -0
- package/dist/client/_assets/chunks/aa0ce6740f301351761a0615cc8b2e99-4RL3pitV.woff2 +0 -0
- package/dist/client/_assets/chunks/aa218a2c45f3749537ce876201e5152b-DndHqA-p.woff2 +0 -0
- package/dist/client/_assets/chunks/aa28db16818f9eaa8c817f289e1c3270-Drm1Jwhe.woff2 +0 -0
- package/dist/client/_assets/chunks/aa64c9953af43ca65832f413895bb433-CR32RteD.woff2 +0 -0
- package/dist/client/_assets/chunks/aa96d698491c2540e2dcf7009c65c456-BXlPVR0v.woff2 +0 -0
- package/dist/client/_assets/chunks/ada8f0241244c60ec8d3d59ad37f20a5-BFQsznEm.woff2 +0 -0
- package/dist/client/_assets/chunks/ae25c41034ddc1a9e0b41f5034c9aa4b-COQJkHOc.woff2 +0 -0
- package/dist/client/_assets/chunks/ae289ae3f8cdb54a3a6c07174517afec-DFGIoTY6.woff2 +0 -0
- package/dist/client/_assets/chunks/ae401fb4db80d5ff5cd3f8d9bc811070-Byt9AwoT.woff2 +0 -0
- package/dist/client/_assets/chunks/b02dfa2aa52cbdb1b2f11a9f44335469-DVWsuPSL.woff2 +0 -0
- package/dist/client/_assets/chunks/b0ab3a7f319ce6dd3c9a4de2674e7c72-CksmA6Hr.woff2 +0 -0
- package/dist/client/_assets/chunks/b159deb135e9946eea0572d52778170b-BZrtOTn0.woff2 +0 -0
- package/dist/client/_assets/chunks/b2e326f7f9b807451bf9c745df747efe-BvlONCPB.woff2 +0 -0
- package/dist/client/_assets/chunks/b341de0bc0bfe194a6c28dcfb566029e-DJAj3r6U.woff2 +0 -0
- package/dist/client/_assets/chunks/b846c293981ca5429eabaa967f222f26-GS-TAaO6.woff2 +0 -0
- package/dist/client/_assets/chunks/b91450304d9ac44f5c6e0da0792e055d-vS0S7kl0.woff2 +0 -0
- package/dist/client/_assets/chunks/baa325551b381c5e035ef143e56d4abe-DJg3GhKJ.woff2 +0 -0
- package/dist/client/_assets/chunks/bc3f0cb8b55ee11d32b94ca488976f8d-Dp5KZMSD.woff2 +0 -0
- package/dist/client/_assets/chunks/bcb3307527d6d0033bf0f17660b91e71-BMgRW_eW.woff2 +0 -0
- package/dist/client/_assets/chunks/be64f9379412876e00fd3a0bfa6b6fe9-BJ3FMWFM.woff2 +0 -0
- package/dist/client/_assets/chunks/befed8a4fa817773fa7109db6fe07f56-3sAmDsOO.woff2 +0 -0
- package/dist/client/_assets/chunks/bf1acc86e17b4229c548828a9d6f455d-JNuPCGDM.woff2 +0 -0
- package/dist/client/_assets/chunks/c09ee2b219982f8d46ad9968b7e6e0ba-qVb8yJHb.woff2 +0 -0
- package/dist/client/_assets/chunks/c0c7836749e585cee24ab2f8457c5b01-Ds0003oT.woff2 +0 -0
- package/dist/client/_assets/chunks/c2ac4ef1860812036ca2b8c4e4089bdc-DsziO8Du.woff2 +0 -0
- package/dist/client/_assets/chunks/c31019c08bd22464f7a88f090281404c-CUC0jMW1.woff2 +0 -0
- package/dist/client/_assets/chunks/c33c59feccf391f0c5f1f5d24e36d1fe-BXTVggad.woff2 +0 -0
- package/dist/client/_assets/chunks/c39ec937c6a8d124e8b68cf829ea5ad4-CarrkdmQ.woff2 +0 -0
- package/dist/client/_assets/chunks/c3fbc1f2557c343863a10698f8c966a2-BiOC1yo2.woff2 +0 -0
- package/dist/client/_assets/chunks/c3fd21315345ae541f6e98067059fa19-rHtO7vK5.woff2 +0 -0
- package/dist/client/_assets/chunks/c568a16e3168ceb1f191b70022c492ea-BpAiyU80.woff2 +0 -0
- package/dist/client/_assets/chunks/c57ee3b49b7e45b995539a6b2c51f138-IHDXeVRU.woff2 +0 -0
- package/dist/client/_assets/chunks/c5c1c0be944ea39a3f50a02d32f5b759-DAwbrvTL.woff2 +0 -0
- package/dist/client/_assets/chunks/c5e66d60be3375835bbd8d6b797f6eac-DWp4tpvN.woff2 +0 -0
- package/dist/client/_assets/chunks/c5f1075caf6d1344ee720de85114a521-DTTbeLhd.woff2 +0 -0
- package/dist/client/_assets/chunks/c82fd9456d7465b5e5bd3659e9b14c55-Cs6h6hE6.woff2 +0 -0
- package/dist/client/_assets/chunks/c90b7b65d2b9696fbf3a506738f94d68-DsvgiuQQ.woff2 +0 -0
- package/dist/client/_assets/chunks/cae29b3f8951eaf20d2f61c2206e28d9-CoHXmhmG.woff2 +0 -0
- package/dist/client/_assets/chunks/cba6ad3981cb7861428d4be169ee8124-CBdFsPAF.woff2 +0 -0
- package/dist/client/_assets/chunks/cc26525aa2af1f0b929af32ce50a7fba-D55LVtW9.woff2 +0 -0
- package/dist/client/_assets/chunks/cd0e7b51eddb22a77a09b025c0281434-ByI_TSTq.woff2 +0 -0
- package/dist/client/_assets/chunks/cd10a3af2133805d8c92104d1ee6ff18-Dtr5mBXe.woff2 +0 -0
- package/dist/client/_assets/chunks/cd6d074f3957d58bac58437fc97e5e33-CrVZuSbw.woff2 +0 -0
- package/dist/client/_assets/chunks/cd75ca47da9ae4c0899e37d4c543319b-DXU1s4Ja.woff2 +0 -0
- package/dist/client/_assets/chunks/cef249b6d013fb0cc0d574176bc23811-BL7WfNHA.woff2 +0 -0
- package/dist/client/_assets/chunks/d043b8d7a48bb0ac59ee1f1477d88eee-d5CwY2I8.woff2 +0 -0
- package/dist/client/_assets/chunks/d0bd387fda28e58d3c9b3efa2468dd8a-CjDFowFS.woff2 +0 -0
- package/dist/client/_assets/chunks/d12ce1d8445213317f9163283e58a05d-4RtGQnak.woff2 +0 -0
- package/dist/client/_assets/chunks/d15a3317942b7d31978a759fbf2222c8-DQ9QFQdS.woff2 +0 -0
- package/dist/client/_assets/chunks/d28fb13acf9ced9f0657fd4012c81cd2-D8Bgk6sd.woff2 +0 -0
- package/dist/client/_assets/chunks/d320b000b5978c7251148a6a154741b8-CcGZjeFx.woff2 +0 -0
- package/dist/client/_assets/chunks/d3714e6b90de8e2085dfb2514464dd6a-8LsVAcmb.woff2 +0 -0
- package/dist/client/_assets/chunks/d3beff96216c8af1aa79246476b6a323-hQysoMK3.woff2 +0 -0
- package/dist/client/_assets/chunks/d3e311f30c811dc339c262a79a51877e-CkUTbS74.woff2 +0 -0
- package/dist/client/_assets/chunks/d51f4cdc83711e510f5d25f03235597e-BY3VAGvr.woff2 +0 -0
- package/dist/client/_assets/chunks/d5df4a8dfd4328c67d933b3912c6ad0f-A2fccswC.woff2 +0 -0
- package/dist/client/_assets/chunks/d740dc2e854aaa7b3dcdd3ed25455eeb-Cw8LrB06.woff2 +0 -0
- package/dist/client/_assets/chunks/d8325ba7ae651bc30440905bd67b95f1-Dg8M_ijr.woff2 +0 -0
- package/dist/client/_assets/chunks/da13b136efb1d1e4c76575af8f79a698-BbfzLGVB.woff2 +0 -0
- package/dist/client/_assets/chunks/da2cf0ec56bf69374ee37764c7e3ea3d-fyVBKE2g.woff2 +0 -0
- package/dist/client/_assets/chunks/da93ae099ff3b7aae27b3f674d3fc721-BDG5ywtd.woff2 +0 -0
- package/dist/client/_assets/chunks/daf62255dd60679946f28c442ca62533-BnIjYSn3.woff2 +0 -0
- package/dist/client/_assets/chunks/dccda6a2e2db3b530788bdfa2acd1979-ByL7eZcn.woff2 +0 -0
- package/dist/client/_assets/chunks/dd01a1035345f6921a48525b8ce08f06-vkP6t4fC.woff2 +0 -0
- package/dist/client/_assets/chunks/e2204cf85edcb96c5de5c3dcf240da9d-Ch3zKjD-.woff2 +0 -0
- package/dist/client/_assets/chunks/e264213b9e102dabc603adb6e4fda5e6-CyxmQBHB.woff2 +0 -0
- package/dist/client/_assets/chunks/e3e913e145ddcd9323b2a0972967feb6-3sjEdzck.woff2 +0 -0
- package/dist/client/_assets/chunks/e4fb59479cedc87ba79785590bf861ca-sx7RZ8Vu.woff2 +0 -0
- package/dist/client/_assets/chunks/e5d00355f73293d40b61299459d17ca5-D8Vt3D-z.woff2 +0 -0
- package/dist/client/_assets/chunks/e647b8d2efc501c0cc0e407249cc7135-BrSW9DU4.woff2 +0 -0
- package/dist/client/_assets/chunks/e6e60ffb2ebd1828628764b507060aea-Dqyf48QC.woff2 +0 -0
- package/dist/client/_assets/chunks/e7c7ef3669ae48c0a736f06ca471e1d7-DNCebEB-.woff2 +0 -0
- package/dist/client/_assets/chunks/e81a742cacef744130c40de1b90837d8-DtAIFBk_.woff2 +0 -0
- package/dist/client/_assets/chunks/e8b755172122d1d0a5dd453e96b0ff24-BNTSyPYU.woff2 +0 -0
- package/dist/client/_assets/chunks/e99280299c305402eaa5271a3e36c49b-BpqXwl7U.woff2 +0 -0
- package/dist/client/_assets/chunks/e9c66b085052ece66bfadf45f711d3e1-DVza3Uob.woff2 +0 -0
- package/dist/client/_assets/chunks/ed7c6dafaa6d8bcf015ef0ca574837df-C7bcndJl.woff2 +0 -0
- package/dist/client/_assets/chunks/f00eb499abb94fa7b799d6d8c9b050e9-D_XvVTI9.woff2 +0 -0
- package/dist/client/_assets/chunks/f2900a1d30c3a33129f4e2225669bd0e-in84LilX.woff2 +0 -0
- package/dist/client/_assets/chunks/f2fb1f1fbf7e44afb53c672ec286a22e-tFk0sTQc.woff2 +0 -0
- package/dist/client/_assets/chunks/f372129c60aaece937cf7b91ee75c9b8-DiP_JYOt.woff2 +0 -0
- package/dist/client/_assets/chunks/f5237486197aeff59341a1ff38b8eff8-D_uuqrNZ.woff2 +0 -0
- package/dist/client/_assets/chunks/f553d54ef931066712d8f3f0ce018e1b-D8K983U5.woff2 +0 -0
- package/dist/client/_assets/chunks/f5d7487963d43c89da63aaf10f2e6fb7-B7GIrfPU.woff2 +0 -0
- package/dist/client/_assets/chunks/f649cba8e14c33d6bf2265483b14b895-Nm5wSov8.woff2 +0 -0
- package/dist/client/_assets/chunks/f6839df1bf7cb4dc8d27e5ea55bbe633-BIjWKN84.woff2 +0 -0
- package/dist/client/_assets/chunks/f6b7304e028980f77a7f7007bb540abd-CIlBt6sf.woff2 +0 -0
- package/dist/client/_assets/chunks/f75496953a40ff241178240209f56990-MOSKd67d.woff2 +0 -0
- package/dist/client/_assets/chunks/f7d36ffff7a75c9c6216d576a57dd00d-CaXQA5A8.woff2 +0 -0
- package/dist/client/_assets/chunks/f7f3f63e7a149cd89eccab3b52171d05-oNOOSdDV.woff2 +0 -0
- package/dist/client/_assets/chunks/f8db8bef0a6e1178835d350ae0d384a1-ZAiKM369.woff2 +0 -0
- package/dist/client/_assets/chunks/f92d74d1d217d21b39075ff23f79f7fd-BlTe0_IX.woff2 +0 -0
- package/dist/client/_assets/chunks/f9d6d981d8b87b3e469027277f585741-DQqIv77a.woff2 +0 -0
- package/dist/client/_assets/chunks/fa7d3b99744d7f2dc9e00864a97a62d6-Pfww07DK.woff2 +0 -0
- package/dist/client/_assets/chunks/fa8ed469ef290bfeb571418fe0abb628-D5v-Z7kY.woff2 +0 -0
- package/dist/client/_assets/chunks/fb0e90665980954719c2eb685b130bc0-CiWRvo58.woff2 +0 -0
- package/dist/client/_assets/chunks/fb4649a82c50620773d79820e2e5ff13-dw14czgx.woff2 +0 -0
- package/dist/client/_assets/chunks/fb61b690208eff56e6d8432951270901-CUAnVvWa.woff2 +0 -0
- package/dist/client/_assets/chunks/fb9402d6c6357a825affc402f14d5a7e-CIp4G53L.woff2 +0 -0
- package/dist/client/_assets/chunks/fcc41f6a067ddd658bba5c9dff234a32-BtZTNo2r.woff2 +0 -0
- package/dist/client/_assets/chunks/fd6ad889fcf3583bd9b0b6db53aad434-DqiKyYmz.woff2 +0 -0
- package/dist/client/_assets/chunks/ff0937ad63cda71ff420945ead55ab4d-CXGPdnOz.woff2 +0 -0
- package/dist/client/_assets/chunks/heic-to-XcUDQvtx.js +1 -0
- package/dist/client/_assets/chunks/literata-cyrillic-ext-wght-normal-CGKlZYBf.woff2 +0 -0
- package/dist/client/_assets/chunks/literata-cyrillic-wght-normal-DLqwHbi6.woff2 +0 -0
- package/dist/client/_assets/chunks/literata-greek-ext-wght-normal-e3e57Shi.woff2 +0 -0
- package/dist/client/_assets/chunks/literata-greek-wght-normal-CO1l-giJ.woff2 +0 -0
- package/dist/client/_assets/chunks/literata-latin-ext-wght-normal-BnEbWgdZ.woff2 +0 -0
- package/dist/client/_assets/chunks/literata-latin-wght-normal-DLxlUchJ.woff2 +0 -0
- package/dist/client/_assets/chunks/literata-vietnamese-wght-normal-LcSrhZ7T.woff2 +0 -0
- package/dist/client/_assets/chunks/module-ChVQstFd.js +716 -0
- package/dist/client/_assets/chunks/native-CR5HLOyf.js +1 -0
- package/dist/client/_assets/chunks/news-cycle-cyrillic-400-normal-9BSXki1I.woff +0 -0
- package/dist/client/_assets/chunks/news-cycle-cyrillic-400-normal-CUYmhJri.woff2 +0 -0
- package/dist/client/_assets/chunks/news-cycle-cyrillic-ext-400-normal-CKyb9yaQ.woff2 +0 -0
- package/dist/client/_assets/chunks/news-cycle-cyrillic-ext-400-normal-Llxpm7uO.woff +0 -0
- package/dist/client/_assets/chunks/news-cycle-greek-400-normal-BiAZ91Zl.woff2 +0 -0
- package/dist/client/_assets/chunks/news-cycle-greek-400-normal-D88oNngQ.woff +0 -0
- package/dist/client/_assets/chunks/news-cycle-greek-ext-400-normal-Ckclqjrc.woff2 +0 -0
- package/dist/client/_assets/chunks/news-cycle-greek-ext-400-normal-oz-bBDWj.woff +0 -0
- package/dist/client/_assets/chunks/news-cycle-latin-400-normal-BLgpQ3uo.woff +0 -0
- package/dist/client/_assets/chunks/news-cycle-latin-400-normal-BgW97ttO.woff2 +0 -0
- package/dist/client/_assets/chunks/news-cycle-latin-ext-400-normal-DmDltzLi.woff2 +0 -0
- package/dist/client/_assets/chunks/news-cycle-latin-ext-400-normal-lewDoXxP.woff +0 -0
- package/dist/client/_assets/chunks/news-cycle-vietnamese-400-normal-QPSuG-pc.woff +0 -0
- package/dist/client/_assets/chunks/news-cycle-vietnamese-400-normal-t2mxI9x9.woff2 +0 -0
- package/dist/client/_assets/chunks/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- package/dist/client/_assets/chunks/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- package/dist/client/_assets/chunks/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- package/dist/client/_assets/chunks/source-sans-3-cyrillic-ext-wght-normal-DzyfIafT.woff2 +0 -0
- package/dist/client/_assets/chunks/source-sans-3-cyrillic-wght-normal-BMDVbyM7.woff2 +0 -0
- package/dist/client/_assets/chunks/source-sans-3-greek-ext-wght-normal-BWSLJLk6.woff2 +0 -0
- package/dist/client/_assets/chunks/source-sans-3-greek-wght-normal-C9H9m1vD.woff2 +0 -0
- package/dist/client/_assets/chunks/source-sans-3-latin-ext-wght-normal-C8iNium2.woff2 +0 -0
- package/dist/client/_assets/chunks/source-sans-3-latin-wght-normal-BqRLTx4X.woff2 +0 -0
- package/dist/client/_assets/chunks/source-sans-3-vietnamese-wght-normal-C1uRvKPU.woff2 +0 -0
- package/dist/client/_assets/chunks/url-CG0eolsk.js +1 -0
- package/dist/client/_assets/client-auth.js +3260 -0
- package/dist/client/_assets/client-cjk-tc.css +1 -0
- package/dist/client/_assets/client-cjk.css +1 -0
- package/dist/client/_assets/client.css +2 -0
- package/dist/client/_assets/client.js +380 -0
- package/dist/index.js +2 -20359
- package/dist/node.js +479 -0
- package/package.json +67 -40
- package/src/__tests__/bin/uploads-cleanup.test.ts +77 -0
- package/src/__tests__/export-service.test.ts +550 -0
- package/src/__tests__/helpers/app.ts +60 -27
- package/src/__tests__/helpers/db.ts +14 -24
- package/src/__tests__/helpers/lingui-core-macro-mock.ts +15 -2
- package/src/__tests__/import-site-command.test.ts +406 -0
- package/src/__tests__/site-localize-media.test.ts +150 -0
- package/src/__tests__/site-media-parser.test.ts +216 -0
- package/src/app.tsx +277 -175
- package/src/assets/branding/generated/README.txt +15 -0
- package/src/assets/branding/generated/jant-apple-touch-icon.png +0 -0
- package/src/assets/branding/generated/jant-brand-assets.zip +0 -0
- package/src/assets/branding/generated/jant-brand-tile-512.png +0 -0
- package/src/assets/branding/generated/jant-brand-tile.svg +1 -0
- package/src/assets/branding/generated/jant-circle-tile-512.png +0 -0
- package/src/assets/branding/generated/jant-circle-tile.svg +1 -0
- package/src/assets/branding/generated/jant-favicon.ico +0 -0
- package/src/assets/branding/generated/jant-logo-negative.svg +1 -0
- package/src/assets/branding/generated/jant-logo-positive-512.png +0 -0
- package/src/assets/branding/generated/jant-logo-positive.svg +1 -0
- package/src/assets/branding/generated/jant-social-preview.png +0 -0
- package/src/assets/branding/generated/jant-square-tile-512.png +0 -0
- package/src/assets/branding/generated/jant-square-tile.svg +1 -0
- package/src/assets/branding/jant-logo-positive.svg +3 -0
- package/src/auth.ts +47 -6
- package/src/client/__tests__/avatar-upload.test.ts +186 -0
- package/src/client/__tests__/collection-form-bridge.test.ts +127 -0
- package/src/client/__tests__/collection-page-actions.test.ts +112 -0
- package/src/client/__tests__/collection-sort-menu.test.ts +78 -0
- package/src/client/__tests__/compose-bridge.test.ts +260 -0
- package/src/client/__tests__/compose-discovery.test.ts +155 -0
- package/src/client/__tests__/compose-shortcuts.test.ts +133 -0
- package/src/client/__tests__/confirm.test.ts +98 -0
- package/src/client/__tests__/custom-url-menu.test.ts +104 -0
- package/src/client/__tests__/form-enter-submit.test.ts +110 -0
- package/src/client/__tests__/post-form-bridge.test.ts +82 -0
- package/src/client/__tests__/sortable-list.test.ts +91 -0
- package/src/client/__tests__/toast.test.ts +46 -0
- package/src/client/archive-nav.js +1 -3
- package/src/client/avatar-upload.ts +66 -25
- package/src/client/collection-form-bridge.ts +32 -15
- package/src/client/collection-page-actions.ts +160 -0
- package/src/client/collection-sort-menu.ts +105 -0
- package/src/client/components/__tests__/jant-collection-form.test.ts +199 -51
- package/src/client/components/__tests__/jant-collection-sidebar.test.ts +306 -0
- package/src/client/components/__tests__/jant-compose-dialog.test.ts +2507 -342
- package/src/client/components/__tests__/jant-compose-editor.test.ts +484 -20
- package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +298 -0
- package/src/client/components/__tests__/jant-post-form.test.ts +9 -8
- package/src/client/components/__tests__/jant-post-menu.test.ts +325 -0
- package/src/client/components/__tests__/jant-settings-avatar.test.ts +27 -3
- package/src/client/components/__tests__/jant-settings-general.test.ts +312 -84
- package/src/client/components/collection-manager-types.ts +51 -0
- package/src/client/components/collection-types.ts +12 -10
- package/src/client/components/compose-types.ts +80 -13
- package/src/client/components/jant-collection-form.ts +340 -509
- package/src/client/components/jant-collection-sidebar.ts +474 -463
- package/src/client/components/jant-compose-dialog.ts +1566 -479
- package/src/client/components/jant-compose-editor.ts +531 -276
- package/src/client/components/jant-compose-fullscreen.ts +184 -112
- package/src/client/components/jant-confirm-dialog.ts +249 -0
- package/src/client/components/jant-nav-manager.ts +79 -103
- package/src/client/components/jant-post-form.ts +4 -1
- package/src/client/components/jant-post-menu.ts +583 -306
- package/src/client/components/jant-settings-avatar.ts +15 -9
- package/src/client/components/jant-settings-general.ts +444 -137
- package/src/client/components/nav-manager-types.ts +6 -3
- package/src/client/components/post-form-template.ts +2 -9
- package/src/client/components/post-form-types.ts +2 -4
- package/src/client/components/settings-types.ts +34 -2
- package/src/client/compose-bridge.ts +297 -171
- package/src/client/compose-discovery-bridge.ts +9 -0
- package/src/client/compose-discovery.ts +254 -0
- package/src/client/compose-launch.ts +98 -0
- package/src/client/compose-shortcuts.ts +61 -0
- package/src/client/confirm.ts +40 -0
- package/src/client/custom-url-menu.ts +128 -0
- package/src/client/form-enter-submit.ts +87 -0
- package/src/client/json.ts +37 -0
- package/src/client/multipart-upload.ts +51 -18
- package/src/client/post-form-bridge.ts +20 -14
- package/src/client/runtime-paths.ts +72 -0
- package/src/client/settings-bridge.ts +54 -10
- package/src/client/site-header-nav.js +84 -0
- package/src/client/sortable-list.ts +152 -0
- package/src/client/thread-context.ts +11 -5
- package/src/client/tiptap/__tests__/floating-position.test.ts +74 -0
- package/src/client/tiptap/__tests__/link-toolbar.test.ts +94 -0
- package/src/client/tiptap/__tests__/paste-media.test.ts +39 -0
- package/src/client/tiptap/bubble-menu.ts +98 -13
- package/src/client/tiptap/create-editor.ts +6 -0
- package/src/client/tiptap/extensions.ts +15 -4
- package/src/client/tiptap/floating-position.ts +167 -0
- package/src/client/tiptap/inline-image-upload.ts +73 -0
- package/src/client/tiptap/link-input-rules.ts +56 -0
- package/src/client/tiptap/link-toolbar.ts +60 -14
- package/src/client/tiptap/paste-media.ts +120 -0
- package/src/client/tiptap/slash-commands.ts +205 -52
- package/src/client/tiptap/toolbar-mode.ts +31 -0
- package/src/client/toast.ts +136 -16
- package/src/client/types/sortablejs.d.ts +4 -4
- package/src/client/upload-session.ts +270 -0
- package/src/client/upload-with-metadata.ts +10 -17
- package/src/client-auth.ts +38 -0
- package/src/client.ts +10 -29
- package/src/db/__tests__/d1-query.test.ts +84 -0
- package/src/db/__tests__/demo-canonical-snapshot.test.ts +78 -0
- package/src/db/__tests__/demo-env-loader.test.ts +114 -0
- package/src/db/__tests__/dialect.test.ts +42 -0
- package/src/db/__tests__/migration-artifacts.test.ts +82 -0
- package/src/db/__tests__/migration-rehearsal.test.ts +73 -0
- package/src/db/__tests__/migration-runner.test.ts +72 -0
- package/src/db/__tests__/migrations.test.ts +293 -8
- package/src/db/__tests__/r2-query.test.ts +102 -0
- package/src/db/__tests__/wrangler-config.test.ts +86 -0
- package/src/db/backfills/0000_normalize_legacy_time_zone_values.sql +38 -0
- package/src/db/backfills/README.md +11 -0
- package/src/db/dialect.ts +71 -0
- package/src/db/index.ts +84 -2
- package/src/db/migrations/0000_baseline.sql +35 -57
- package/src/db/migrations/0002_site_aware_core.sql +354 -0
- package/src/db/migrations/0003_fts_site_aware.sql +38 -0
- package/src/db/migrations/0004_perpetual_eternity.sql +29 -0
- package/src/db/migrations/meta/0000_snapshot.json +134 -138
- package/src/db/migrations/meta/0001_snapshot.json +135 -139
- package/src/db/migrations/meta/0002_snapshot.json +1717 -0
- package/src/db/migrations/meta/0003_snapshot.json +1717 -0
- package/src/db/migrations/meta/0004_snapshot.json +1897 -0
- package/src/db/migrations/meta/_journal.json +23 -2
- package/src/db/migrations/pg/0000_pg_site_aware_baseline.sql +306 -0
- package/src/db/migrations/pg/0001_pg_search_support.sql +8 -0
- package/src/db/migrations/pg/0002_breezy_lockjaw.sql +29 -0
- package/src/db/migrations/pg/README.md +8 -0
- package/src/db/migrations/pg/meta/0000_snapshot.json +2195 -0
- package/src/db/migrations/pg/meta/0001_snapshot.json +2248 -0
- package/src/db/migrations/pg/meta/0002_snapshot.json +2476 -0
- package/src/db/migrations/pg/meta/_journal.json +27 -0
- package/src/db/pg/__tests__/node.test.ts +58 -0
- package/src/db/pg/node.ts +151 -0
- package/src/db/pg/schema.ts +739 -0
- package/src/db/raw-query.ts +15 -0
- package/src/db/rehearsal-fixtures/demo-current.json +25 -0
- package/src/db/rehearsal-fixtures/demo-current.sql +142 -0
- package/src/db/schema-bundle.ts +12 -0
- package/src/db/schema.ts +309 -128
- package/src/db/sqlite/schema.ts +1 -0
- package/src/i18n/__tests__/context.test.tsx +35 -0
- package/src/i18n/context.tsx +10 -2
- package/src/i18n/locales/en.po +1792 -231
- package/src/i18n/locales/en.ts +1 -1
- package/src/i18n/locales/glossary.zh-Hans.yml +116 -0
- package/src/i18n/locales/glossary.zh-Hant.yml +116 -0
- package/src/i18n/locales/zh-Hans.po +1831 -270
- package/src/i18n/locales/zh-Hans.ts +1 -1
- package/src/i18n/locales/zh-Hant.po +1835 -274
- package/src/i18n/locales/zh-Hant.ts +1 -1
- package/src/index.ts +4 -0
- package/src/lib/__tests__/asset-path.test.ts +54 -0
- package/src/lib/__tests__/blurhash-placeholder.test.ts +25 -1
- package/src/lib/__tests__/collection-groups.test.ts +63 -0
- package/src/lib/__tests__/collection-sort.test.ts +45 -0
- package/src/lib/__tests__/constants.test.ts +24 -1
- package/src/lib/__tests__/favicon.test.ts +1 -1
- package/src/lib/__tests__/feed.test.ts +147 -0
- package/src/lib/__tests__/hosted-control-plane.test.ts +106 -0
- package/src/lib/__tests__/hosted-domain.test.ts +78 -0
- package/src/lib/__tests__/hosted-signin.test.ts +103 -0
- package/src/lib/__tests__/icons.test.ts +14 -172
- package/src/lib/__tests__/image.test.ts +23 -4
- package/src/lib/__tests__/jant-branding.test.ts +160 -0
- package/src/lib/__tests__/markdown-to-tiptap.test.ts +27 -0
- package/src/lib/__tests__/page-title.test.ts +20 -0
- package/src/lib/__tests__/password.test.ts +60 -0
- package/src/lib/__tests__/post-display.test.ts +99 -0
- package/src/lib/__tests__/post-meta.test.ts +126 -0
- package/src/lib/__tests__/public-storage.test.ts +75 -0
- package/src/lib/__tests__/resolve-config.test.ts +156 -28
- package/src/lib/__tests__/schemas.test.ts +286 -22
- package/src/lib/__tests__/search-snippet.test.ts +43 -0
- package/src/lib/__tests__/site-resolution.test.ts +39 -0
- package/src/lib/__tests__/slug-format.test.ts +54 -0
- package/src/lib/__tests__/startup-config.test.ts +87 -0
- package/src/lib/__tests__/storage.test.ts +218 -1
- package/src/lib/__tests__/theme.test.ts +50 -13
- package/src/lib/__tests__/time.test.ts +44 -0
- package/src/lib/__tests__/timeline.test.ts +492 -4
- package/src/lib/__tests__/timezones.test.ts +51 -18
- package/src/lib/__tests__/tiptap-to-markdown.test.ts +23 -0
- package/src/lib/__tests__/url.test.ts +79 -1
- package/src/lib/__tests__/view.test.ts +74 -13
- package/src/lib/asset-path.ts +87 -0
- package/src/lib/blurhash-placeholder.ts +56 -1
- package/src/lib/collection-groups.ts +69 -0
- package/src/lib/collection-sort.ts +61 -0
- package/src/lib/confirm.ts +37 -0
- package/src/lib/constants.ts +20 -3
- package/src/lib/crypto.ts +47 -0
- package/src/lib/env.ts +245 -0
- package/src/lib/errors.ts +25 -9
- package/src/lib/favicon.ts +2 -1
- package/src/lib/featured-icons.ts +33 -0
- package/src/lib/feed.ts +73 -24
- package/src/lib/hosted-control-plane-sync.ts +27 -0
- package/src/lib/hosted-control-plane.ts +99 -0
- package/src/lib/hosted-domain-check.ts +98 -0
- package/src/lib/hosted-domain.ts +61 -0
- package/src/lib/hosted-signin.ts +115 -0
- package/src/lib/hosted-sso.ts +110 -0
- package/src/lib/icons.ts +10 -175
- package/src/lib/ids.ts +54 -0
- package/src/lib/image.ts +18 -7
- package/src/lib/jant-branding-generated.ts +947 -0
- package/src/lib/jant-branding.ts +520 -0
- package/src/lib/markdown-to-tiptap.ts +57 -0
- package/src/lib/media-helpers.ts +6 -2
- package/src/lib/navigation.ts +9 -2
- package/src/lib/page-title.ts +23 -0
- package/src/lib/pagination.ts +34 -0
- package/src/lib/password.ts +164 -0
- package/src/lib/post-display.ts +162 -0
- package/src/lib/post-meta.ts +95 -0
- package/src/lib/public-storage.ts +57 -0
- package/src/lib/render.tsx +22 -0
- package/src/lib/resolve-config.ts +78 -27
- package/src/lib/schemas.ts +271 -73
- package/src/lib/search-snippet.ts +110 -8
- package/src/lib/site-resolution.ts +28 -0
- package/src/lib/slug-format.ts +92 -0
- package/src/lib/slug.ts +1 -1
- package/src/lib/startup-config.ts +244 -0
- package/src/lib/storage.ts +722 -28
- package/src/lib/theme.ts +13 -6
- package/src/lib/time.ts +59 -15
- package/src/lib/timeline.ts +394 -63
- package/src/lib/timezones.ts +120 -50
- package/src/lib/tiptap-render.ts +1 -3
- package/src/lib/tiptap-to-markdown.ts +49 -0
- package/src/lib/upload.ts +216 -11
- package/src/lib/url.ts +210 -0
- package/src/lib/view.ts +87 -31
- package/src/middleware/__tests__/auth.test.ts +216 -14
- package/src/middleware/__tests__/error-handler.test.ts +37 -0
- package/src/middleware/__tests__/onboarding.test.ts +9 -0
- package/src/middleware/__tests__/secure-headers.test.ts +111 -0
- package/src/middleware/auth.ts +156 -28
- package/src/middleware/config.ts +29 -9
- package/src/middleware/error-handler.ts +16 -1
- package/src/middleware/onboarding.ts +15 -6
- package/src/middleware/secure-headers.ts +136 -25
- package/src/node/__tests__/cli-db-execute-file.test.ts +109 -0
- package/src/node/__tests__/cli-deploy.test.ts +124 -0
- package/src/node/__tests__/cli-export.test.ts +66 -0
- package/src/node/__tests__/cli-reset-password.test.ts +91 -0
- package/src/node/__tests__/cli-runtime-target.test.ts +37 -0
- package/src/node/__tests__/cli-site-selection.test.ts +133 -0
- package/src/node/__tests__/cli-site-snapshot.test.ts +636 -0
- package/src/node/__tests__/cli-site-token-env.test.ts +137 -0
- package/src/node/__tests__/runtime.test.ts +346 -0
- package/src/node/index.ts +18 -0
- package/src/node/request-handler.ts +668 -0
- package/src/node/runtime.ts +88 -0
- package/src/preset.css +73 -16
- package/src/routes/__tests__/compose.test.ts +77 -4
- package/src/routes/api/__tests__/attachments.test.ts +92 -0
- package/src/routes/api/__tests__/collections.test.ts +138 -24
- package/src/routes/api/__tests__/nav-items.test.ts +81 -20
- package/src/routes/api/__tests__/posts.test.ts +315 -57
- package/src/routes/api/__tests__/search.test.ts +25 -1
- package/src/routes/api/__tests__/settings.test.ts +380 -2
- package/src/routes/api/__tests__/upload-multipart.test.ts +216 -26
- package/src/routes/api/__tests__/uploads.test.ts +420 -0
- package/src/routes/api/attachments.ts +24 -0
- package/src/routes/api/collections.ts +59 -28
- package/src/routes/api/custom-urls.ts +6 -5
- package/src/routes/api/export.ts +37 -7
- package/src/routes/api/internal/__tests__/api-tokens.test.ts +55 -0
- package/src/routes/api/internal/__tests__/sites.test.ts +472 -0
- package/src/routes/api/internal/__tests__/uploads.test.ts +131 -0
- package/src/routes/api/internal/api-tokens.ts +17 -0
- package/src/routes/api/internal/sites.ts +241 -0
- package/src/routes/api/internal/uploads.ts +37 -0
- package/src/routes/api/nav-items.ts +24 -15
- package/src/routes/api/posts.ts +222 -74
- package/src/routes/api/search.ts +50 -9
- package/src/routes/api/settings.ts +141 -7
- package/src/routes/api/upload-multipart.ts +105 -16
- package/src/routes/api/upload.ts +90 -21
- package/src/routes/api/uploads.ts +247 -0
- package/src/routes/auth/__tests__/dev.test.ts +135 -0
- package/src/routes/auth/__tests__/hosted-sso.test.ts +136 -0
- package/src/routes/auth/__tests__/setup.test.ts +73 -49
- package/src/routes/auth/dev.ts +72 -0
- package/src/routes/auth/hosted-sso.ts +64 -0
- package/src/routes/auth/reset.tsx +41 -7
- package/src/routes/auth/setup.tsx +37 -38
- package/src/routes/auth/signin.tsx +36 -6
- package/src/routes/compose.tsx +25 -38
- package/src/routes/dash/__tests__/font-theme.test.ts +45 -34
- package/src/routes/dash/__tests__/settings-avatar.test.ts +24 -11
- package/src/routes/dash/custom-urls.tsx +245 -67
- package/src/routes/dash/settings.tsx +530 -139
- package/src/routes/feed/__tests__/rss.test.ts +200 -51
- package/src/routes/feed/__tests__/sitemap.test.ts +64 -0
- package/src/routes/feed/rss.ts +112 -48
- package/src/routes/feed/sitemap.ts +16 -6
- package/src/routes/hosted/__tests__/domain-check.test.ts +94 -0
- package/src/routes/hosted/domain-check.ts +39 -0
- package/src/routes/pages/__tests__/collections.test.ts +27 -21
- package/src/routes/pages/__tests__/featured.test.ts +9 -2
- package/src/routes/pages/archive.tsx +79 -33
- package/src/routes/pages/brand.tsx +119 -0
- package/src/routes/pages/collection.tsx +201 -65
- package/src/routes/pages/collections.tsx +46 -20
- package/src/routes/pages/featured.tsx +31 -39
- package/src/routes/pages/home.tsx +50 -25
- package/src/routes/pages/latest.tsx +20 -4
- package/src/routes/pages/new.tsx +10 -6
- package/src/routes/pages/page.tsx +27 -53
- package/src/routes/pages/partials.tsx +83 -0
- package/src/routes/pages/search.tsx +11 -9
- package/src/routes/pages/theme-sample.tsx +98 -0
- package/src/runtime/__tests__/node.test.ts +258 -0
- package/src/runtime/__tests__/readiness.test.ts +89 -0
- package/src/runtime/cloudflare.ts +102 -0
- package/src/runtime/index.ts +14 -0
- package/src/runtime/node.ts +187 -0
- package/src/runtime/readiness.ts +129 -0
- package/src/runtime/site.ts +169 -0
- package/src/services/__tests__/api-token.test.ts +5 -2
- package/src/services/__tests__/auth.test.ts +348 -0
- package/src/services/__tests__/collection.test.ts +199 -16
- package/src/services/__tests__/custom-url.test.ts +10 -3
- package/src/services/__tests__/hosted-handoff.test.ts +123 -0
- package/src/services/__tests__/media.test.ts +256 -33
- package/src/services/__tests__/navigation.test.ts +89 -4
- package/src/services/__tests__/post-timeline.test.ts +169 -2
- package/src/services/__tests__/post.test.ts +498 -39
- package/src/services/__tests__/search.test.ts +145 -14
- package/src/services/__tests__/settings.test.ts +162 -2
- package/src/services/__tests__/site-admin.test.ts +48 -0
- package/src/services/__tests__/site-profile.test.ts +175 -0
- package/src/services/api-token.ts +44 -11
- package/src/services/auth.ts +211 -9
- package/src/services/bootstrap.ts +68 -0
- package/src/services/collection.ts +556 -100
- package/src/services/custom-url.ts +42 -12
- package/src/services/export.ts +2269 -320
- package/src/services/hosted-handoff.ts +184 -0
- package/src/services/index.ts +110 -12
- package/src/services/media.ts +309 -39
- package/src/services/navigation.ts +141 -20
- package/src/services/path.ts +45 -9
- package/src/services/post.ts +1640 -248
- package/src/services/search.ts +222 -29
- package/src/services/settings.ts +202 -48
- package/src/services/site-admin.ts +825 -0
- package/src/services/site-member.ts +74 -0
- package/src/services/site-profile.ts +52 -0
- package/src/services/site.ts +250 -0
- package/src/services/upload-session.ts +707 -0
- package/src/style-cjk-tc.css +3 -0
- package/src/style-cjk.css +3 -0
- package/src/styles/components.css +647 -16
- package/src/styles/fonts/latin.css +4 -0
- package/src/styles/fonts/noto-serif-sc/400/02629e5d0a9860b7fe32ec1f0563213a.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/031089da45fbfb7dc18ac827bef4c56e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/03ac785139320b7b13bac9c150bf72bf.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/0b1f83a3c7e715560a55ad9eb0fb1c94.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/14b040a2dda256936bc7b3470e548394.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/189f272ea2600c74d576b7b15c014922.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/1fbccc182322b513f57cd156a9a491b0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/21e0a71d86be7b8a9e812e7af09dd061.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/265e048cc9f2f8a711ba585a534d5351.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/2ae2ca951489c9d50cde5b36a2a5515b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/2ba802b14f21a58fc61606c88fa93373.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/2deb444546774c3a3ab38c75eb69cdfb.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/2fbccf9a3853eb59db1a825e044515fd.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/2ff009fa8701505d7f3dc6c83763f019.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/31424fe5d54692e7c8b38021ccb8597c.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/360c190344c26278bbc50e2f4d6a2b3f.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/39b0bbc910af9d2d6dcd8bd4abd6387d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/3adc8f6350cf5067bcb6dc5e44c45d41.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/3bed5bd57de8f738e53cddaea88983d9.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/3c201fd8d1bb20abe7d06b940e83a4d9.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/3d385ea0880df7204258e290648ec012.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/3dc1a4f0d7af59e16b5162a2b077a442.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/3dc68e473fe23bd076dd46785cd23583.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/435b7dca567809813fcb395a27ed83a0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/43693195e775d515689fa035394067fd.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/43fb49e5b79ee7e553869d84e6e08b1e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/44dcbbc3cc8f22e613b342d691511ab6.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/474fac21b12b7efd71f7c321578878b0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/4a23fe6e82fd496b5eb20401b6164efe.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/4bc743968cf1c3ce5711de67ef1ccc4d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/4cf0f292f3358bd2f73b1cf4ec1476f3.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/501f66f24bce8234441954de1b568403.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/53a88404451448cd2e620a0ca0e45a20.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/557cd00c5d6827e13d72a0c71b23587b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/563fa31542d553f25abab65cf7f81e1d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/56e1c4734bbbb38af2fbc262bf6e98f2.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/5947f5da5da9a352a2b534ee64bfc29a.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/5a10741e41259e235841440394c0763d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/60d8b0805a0a8c54a6cca216004beff5.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/61bf4287453da4025d03fa6b2dba66ca.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/638369541268ed5a10af97ad77498c73.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/687d0f0f90a9b23e40102e16ad8e9836.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/6e2164fad867d166de2e5b274f04a563.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/6eefc9d430171c1e1e4034ecadee31c8.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/71eafb8fbe3a734283517e230ad8b6db.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/751f54dbb115140d5b645a6ba4aff5d3.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/7609e7e74dd4d916a7abc7ecc7d95f7e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/76b9d6fe838ae4151d95ce7200aa2bf6.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/78ce29fed872e44fc9014d94875d2aac.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/79a85a253e9b3f12d2e2cb15e16b3003.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/7caa14a095a6bc313aab780fe4ff7999.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/7d138084cf03c14116b11297fce0e3e3.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/880162ae92cd9e120eb4e4e11fae459d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/8f2b960c2823670e94f5b08aa65657e6.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/8f89f57230d184f92a36e241874229d7.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/9180de34b48b325200a97e267befff32.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/95df3b9f681d9df411c30aea5b24f2e0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/975af5a496e8d87d821910aa9fe4d598.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/97a874bbf55ce89a4ab7cd27c7e938b1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/9fd53607094e329fa8e5c785b3ff0f1a.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/a578742770fcd2226e3c45b5b6efdcb0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/ae401fb4db80d5ff5cd3f8d9bc811070.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/b0ab3a7f319ce6dd3c9a4de2674e7c72.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/b159deb135e9946eea0572d52778170b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/b91450304d9ac44f5c6e0da0792e055d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/baa325551b381c5e035ef143e56d4abe.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/c0c7836749e585cee24ab2f8457c5b01.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/c2ac4ef1860812036ca2b8c4e4089bdc.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/c31019c08bd22464f7a88f090281404c.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/c57ee3b49b7e45b995539a6b2c51f138.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/cd75ca47da9ae4c0899e37d4c543319b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/d12ce1d8445213317f9163283e58a05d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/d28fb13acf9ced9f0657fd4012c81cd2.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/d3714e6b90de8e2085dfb2514464dd6a.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/d3beff96216c8af1aa79246476b6a323.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/d3e311f30c811dc339c262a79a51877e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/d51f4cdc83711e510f5d25f03235597e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/d5df4a8dfd4328c67d933b3912c6ad0f.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/dccda6a2e2db3b530788bdfa2acd1979.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/f5237486197aeff59341a1ff38b8eff8.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/f553d54ef931066712d8f3f0ce018e1b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/f649cba8e14c33d6bf2265483b14b895.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/f6839df1bf7cb4dc8d27e5ea55bbe633.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/f6b7304e028980f77a7f7007bb540abd.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/f8db8bef0a6e1178835d350ae0d384a1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/fb4649a82c50620773d79820e2e5ff13.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/400/fb9402d6c6357a825affc402f14d5a7e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/0041f681602cc834bb5c55ced0155b8e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/00c9ac960d866ffaf8a866e5939024e2.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/02e48e353415a00e0f556608cab33a43.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/02faf6bb0ab4d56ada037c0bbaf9b9f7.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/057a3d44d7fc606f113d863376d0ecf0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/10f2b44b3711d3f5bdcc30d373b543d1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/14c1506106d92621bafb11016735194e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/154a2c266902003bd8b7449386b10776.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/19e39850472250bfdbce654d30859879.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/1b5d0d740450fb996749464c9b882025.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/1bca0a2a8840ad0ee9414940593db144.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/1cda27dcaab977ae4ef5d5ab2a10ae03.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/1f4bc38a1c50f55f335f5411cae47696.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/2022cf097cb952d9fe75b53b4587d2c3.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/2240a3c43ca5ef59ae3c348c7884792f.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/280e3d2b58e9ad3501816072e01b0c13.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/2874d07e228da9583b0e73646dacd498.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/29d49891713a2785a3a383001cf58c59.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/2d81eb6ab0ebbc0cabfb3a3341ba8800.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/3179006d1c7ebfa50d27482a2859d9a0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/34c2edb3c37f71258f5c4a31091f0c6c.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/389a950f2a1211946d294716e679e381.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/42a74b6a625bbf0a9616ed4db3152c88.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/457485e72835364662dfead6281638c1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/488846410760fe128dae939836ca5423.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/48eb0a91e50c7f026e248c64145e72af.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/4b0e79ba18b2ce424fa93e84996d7cba.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/54e301f412730f391225db59dae1c8d5.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/597d69d0710e0178b162afb0a0c20401.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/5cc23a76e122d0ad2f7cede41bc35b27.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/5d48855bed5f3554eff91b573d7376ac.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/5ddcbe564b29ef08632e1aeb33455435.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/605667a998e91e2b6a4a3cd7c31fe5a9.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/67f32ceea9e78e5109f87724ad886010.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/68f2fab82ec8e9291f08c3145111549c.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/69519ada3f3f74ca20aacb8af48ab6b4.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/6a6e884fb2b65ec5b4a3d5ecd0d01a6a.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/6e1a8b45b01939088c3a8cfcf8c10681.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/70adaf50c56d5ff859c64d35e0f1e34e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/72ee453ac0e19bd2c631c8921c44e3de.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/753b5f6fb254bacb6618ace25af3df60.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/76d4244186d118eea245d1385a4de2ec.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/7a86b155111ba20f3e87306ff6beac77.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/7b1e76975b0984e6f83e3f9f8069e784.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/7b6c60131822a0e4d36d980d52509d4e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/7cbda564cb2dd4799ab9e89d51286aa7.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/7f60eefa15956d6f06dd92404887d58c.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/7f8c15e0ecb102738981d9fa4cb6b921.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/812b5a4b87f3a7b4afc1cfebc864f413.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/812dfb7f8144d01b3cc9d5ce0b472f40.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/84742b1ede4f0bb6d27131298eba21b4.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/8555f0285e3d28e95e2fc0ccccd9caff.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/8e04e64c8f68d292a18d4160fbde8671.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/958efb9b2fa2ea0008ffef009885f9f8.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/9ca9b71010a5faeee7047ef97aeee13b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/9cd0b77920b9d6c64eb686493123fc76.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/9ebd27835ffcbd794e67151ab046ce68.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/a077f51cfb5cffb4ff4d8e229c0e9e79.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/a397997b579d3945c9c70a979c17a8ad.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/a68d9d5027803832bb28e78cdcd04949.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/a904b05966368bcf90b632c7c2e5f76b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/aa218a2c45f3749537ce876201e5152b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/aa28db16818f9eaa8c817f289e1c3270.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/aa96d698491c2540e2dcf7009c65c456.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/ae25c41034ddc1a9e0b41f5034c9aa4b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/ae289ae3f8cdb54a3a6c07174517afec.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/b02dfa2aa52cbdb1b2f11a9f44335469.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/b2e326f7f9b807451bf9c745df747efe.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/c33c59feccf391f0c5f1f5d24e36d1fe.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/c82fd9456d7465b5e5bd3659e9b14c55.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/c90b7b65d2b9696fbf3a506738f94d68.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/cba6ad3981cb7861428d4be169ee8124.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/cc26525aa2af1f0b929af32ce50a7fba.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/cd0e7b51eddb22a77a09b025c0281434.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/cd6d074f3957d58bac58437fc97e5e33.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/cef249b6d013fb0cc0d574176bc23811.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/d0bd387fda28e58d3c9b3efa2468dd8a.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/da93ae099ff3b7aae27b3f674d3fc721.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/e264213b9e102dabc603adb6e4fda5e6.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/e7c7ef3669ae48c0a736f06ca471e1d7.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/e81a742cacef744130c40de1b90837d8.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/e8b755172122d1d0a5dd453e96b0ff24.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/e99280299c305402eaa5271a3e36c49b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/e9c66b085052ece66bfadf45f711d3e1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/ed7c6dafaa6d8bcf015ef0ca574837df.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/f2900a1d30c3a33129f4e2225669bd0e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/fa7d3b99744d7f2dc9e00864a97a62d6.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/700/fb0e90665980954719c2eb685b130bc0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-sc/noto-serif-sc.css +3615 -0
- package/src/styles/fonts/noto-serif-tc/400/008ea9091e332c639ceb18874eacd60c.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/053bd3d7aec0040d0cc50c261a1f4e3e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/0713613227cc4c686c45a279f8bdc166.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/0e97f44ebc65384c346fe19bcc52fa20.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/1139d32ae2bdeb26c0c8f31330aa9a9f.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/15f8c0df47fd639d1b0d9bd5cf507c9b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/1668bd859ffe15bed7d5563117d8d5fb.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/190e3f8632494e7c095117f26b1c811e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/19ad151c22ce1befe0a9ea643fbee570.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/1c820b5295868008ca7c78afa5b7655d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/1fbe225742c69f4ba9ea5f74922f0ca1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/2a7cedfcd6e4c7cec36f4fd7b0f329c2.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/2acea04a920f6af31e7db97052f563c6.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/2e98b666924b8e0a09d1aeeefd24bdd2.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/2fd3fceb6faed5e3db768e88d7614dca.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/35cf5dd04315e0b906e1a413d7905a2f.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/387c811226f303af62f1e21aae6f5c83.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/3b41385fc27419c19822060daa0b5cb3.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/3cbe4a697fd595ef42c899de7d3e5445.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/3d83dacbbec3d8532ae9afede21f3aab.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/47479c470fae70f10b7c964a7ecbf274.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/4dc0728df0f2ba70796f45f05654c7ba.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/4dc2bc2c55b47f57d13b63aa6b1c8bd4.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/4e1cc6aafb411b572c8d3511e925ecf1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/5227dbe9933760a48baff21ebd13fc98.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/526b263e72c189f4b065738aaa6d423a.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/54da934819a917f561b439bfd10f88b6.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/5bfc7a121c35ae42623ef804fb525e0e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/5f90024544c2907c6c0203c6210c50be.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/649b12d7cee7bb981842946e4547e6ca.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/653bef2ed891ae48d8ed712283080649.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/67d2a81f06ba352f17fbdc3a5e6ea59e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/68304f3229cf763465f044fccb5892c0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/688a88911e4da17b609196a959b8b930.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/6db6ddf72c38a78ce44c1327701152e1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/77a7533bd21ccd33192d142a93555aa8.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/7d65a3d6a65050eb5e6eca43398aeba4.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/7dfc711962c8771f97e7c8898a6bcb65.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/7ef123b62d530fcba73974fa265e0aae.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/80466082a896fd328f30a78593c7c568.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/8a3c84b0df36f851f5fea75ee8757951.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/8b0c8c9f8cfa9fa090d97c5a5efb1f4c.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/8dc035a34c76e6515ca203e2df182588.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/8eb06109812cb80be44f47b8179c2709.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/904324af375d5fd370af1054355a050e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/911a2092d64d6d6494b254d819af2b91.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/9de02d745b8e25c6411fb152fb067748.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/9eb33a430058d839ebbe2af4b2e0daa9.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/9f5a73aa8ba417688019d628f334db07.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/a0f0c06d5c7a3ffa97706178cce212a8.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/a38c1830367f784181b6f544b0b11bbd.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/a9cf85e27428c14351d30eac8cbc8d91.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/aa0ce6740f301351761a0615cc8b2e99.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/bc3f0cb8b55ee11d32b94ca488976f8d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/bcb3307527d6d0033bf0f17660b91e71.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/bf1acc86e17b4229c548828a9d6f455d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/c3fbc1f2557c343863a10698f8c966a2.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/c5c1c0be944ea39a3f50a02d32f5b759.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/c5f1075caf6d1344ee720de85114a521.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/cae29b3f8951eaf20d2f61c2206e28d9.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/d043b8d7a48bb0ac59ee1f1477d88eee.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/d320b000b5978c7251148a6a154741b8.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/da13b136efb1d1e4c76575af8f79a698.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/da2cf0ec56bf69374ee37764c7e3ea3d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/daf62255dd60679946f28c442ca62533.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/dd01a1035345f6921a48525b8ce08f06.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/e4fb59479cedc87ba79785590bf861ca.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/e5d00355f73293d40b61299459d17ca5.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/e647b8d2efc501c0cc0e407249cc7135.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/e6e60ffb2ebd1828628764b507060aea.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/f00eb499abb94fa7b799d6d8c9b050e9.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/f7d36ffff7a75c9c6216d576a57dd00d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/f7f3f63e7a149cd89eccab3b52171d05.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/fcc41f6a067ddd658bba5c9dff234a32.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/400/fd6ad889fcf3583bd9b0b6db53aad434.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/0c055db157e7a13f3103cc2a6b67fec3.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/0d3f5cc265cb6c439c517f2c4cebbddf.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/1259e5825b314fe2b8bb96d6e8069ee5.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/12c518ebfe62818af550c08947e359e7.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/145831a59caa06d894022fe60212ed21.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/169a096e61d38a773216f51d1ec2cc06.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/1884a2b22d314c7d57707f03aec348e0.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/1e2640116bbba817f43c43cc69371cf1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/2573703213da30d3ba18925b100b2c2b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/26839c0e47c73514b8d8f660d24d6b19.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/2a22e14a9ad53f2abb3c7e85017b7d12.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/2b3e8c5703b91f39f6027f43f0da6f4b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/2f27ee4fb2cf6a280e110e09c18ef73e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/31342cebfa5ea7fac06b4ea372d96bc5.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/375329ba0b50b94b35006498e555867c.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/427577dcb707d1d35eebd155b4222aa7.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/450a5b53be0a8a778bb0b623e86b652f.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/477866c8396474a17317dcac3e7a014f.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/478ebdaadda7775c391c5dcab4e697df.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/48d6a97a185c799be4fe67aaf7edf213.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/490edb9fc8a4356aea556eed32287464.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/4c4bdd0b3f3a52e28f3b643c1c5d43be.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/4c96411f3693a9a8657a9c1190f82bce.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/4c9aa12aba2a6a57410eacaff7427916.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/4cca7233bf8ce5dec2e5d146b993d626.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/4d0a9128d06ea857f203bf5d007b1ab9.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/4e5384920bbb155d9d8d74887b09ea5b.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/50cfd672bfa62512ba090420acf35c87.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/551b1d7a0b80c8d42af09863cdca7f01.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/555d990ab3fd7d3d66c6d1fa9a82fec5.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/5979c33a7eb5963bf8e83e46931b5fb5.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/59966ee0b069b577510fe68c350da0ee.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/60a14064ed334f0155795d795e926abe.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/611b62d5fd9698d9b5ce495ba6f14c93.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/6e83fe0b6e708eaf1c3003d6dee11488.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/70861376e5d4f92f8aa7aa1b2749b617.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/7124d150570d39ced8d45507dc11ca1e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/79a7fdf7d9c722b5723ae25e6ff8e203.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/8c8393bc875f1ee36697a2113f4421ea.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/8e6c9bb43afb8cbbff7cf1055e67c9bd.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/90ac4f9d2aa02afdace2843b49fc18bb.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/90b6f57d77847f512fd11db74fa912f1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/913759e6690f9fc0746a20b96f4bdcb4.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/9154e26efe532a85a27d80902f5a2d6c.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/94e7ed67f1557b76fead6b6e456a0415.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/95127a92346c04fec1fa81d6295b0a28.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/9fbc06b2e3ff16b9d705c76db563ef17.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/a3b929542e6c5a0644b73a7c8a8b6c03.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/a8857f5d478f101c053ba02d2f223e90.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/aa64c9953af43ca65832f413895bb433.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/ada8f0241244c60ec8d3d59ad37f20a5.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/b341de0bc0bfe194a6c28dcfb566029e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/b846c293981ca5429eabaa967f222f26.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/be64f9379412876e00fd3a0bfa6b6fe9.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/befed8a4fa817773fa7109db6fe07f56.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/c09ee2b219982f8d46ad9968b7e6e0ba.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/c39ec937c6a8d124e8b68cf829ea5ad4.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/c3fd21315345ae541f6e98067059fa19.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/c568a16e3168ceb1f191b70022c492ea.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/c5e66d60be3375835bbd8d6b797f6eac.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/cd10a3af2133805d8c92104d1ee6ff18.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/d15a3317942b7d31978a759fbf2222c8.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/d740dc2e854aaa7b3dcdd3ed25455eeb.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/d8325ba7ae651bc30440905bd67b95f1.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/e2204cf85edcb96c5de5c3dcf240da9d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/e3e913e145ddcd9323b2a0972967feb6.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/f2fb1f1fbf7e44afb53c672ec286a22e.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/f372129c60aaece937cf7b91ee75c9b8.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/f5d7487963d43c89da63aaf10f2e6fb7.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/f75496953a40ff241178240209f56990.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/f92d74d1d217d21b39075ff23f79f7fd.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/f9d6d981d8b87b3e469027277f585741.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/fa8ed469ef290bfeb571418fe0abb628.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/fb61b690208eff56e6d8432951270901.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/700/ff0937ad63cda71ff420945ead55ab4d.woff2 +0 -0
- package/src/styles/fonts/noto-serif-tc/noto-serif-tc.css +3104 -0
- package/src/styles/tokens.css +42 -7
- package/src/styles/ui.css +7597 -3395
- package/src/types/app-context.ts +7 -0
- package/src/types/bindings.ts +77 -27
- package/src/types/config.ts +104 -4
- package/src/types/constants.ts +43 -4
- package/src/types/entities.ts +63 -4
- package/src/types/operations.ts +45 -15
- package/src/types/props.ts +48 -10
- package/src/types/views.ts +51 -8
- package/src/ui/__tests__/color-themes.test.ts +81 -0
- package/src/ui/__tests__/font-themes.test.ts +76 -7
- package/src/ui/color-themes.ts +424 -238
- package/src/ui/compose/ComposeDialog.tsx +149 -91
- package/src/ui/compose/ComposePrompt.tsx +20 -3
- package/src/ui/dash/ActionButtons.tsx +16 -2
- package/src/ui/dash/DangerZone.tsx +10 -1
- package/src/ui/dash/StatusBadge.tsx +3 -3
- package/src/ui/dash/appearance/AdvancedContent.tsx +9 -2
- package/src/ui/dash/appearance/ColorThemeContent.tsx +326 -63
- package/src/ui/dash/appearance/FontThemeContent.tsx +75 -17
- package/src/ui/dash/appearance/NavigationContent.tsx +48 -21
- package/src/ui/dash/settings/AccountContent.tsx +7 -2
- package/src/ui/dash/settings/AccountMenuContent.tsx +242 -111
- package/src/ui/dash/settings/ApiTokensContent.tsx +38 -8
- package/src/ui/dash/settings/AvatarContent.tsx +1 -1
- package/src/ui/dash/settings/DeleteAccountContent.tsx +300 -0
- package/src/ui/dash/settings/GeneralContent.tsx +120 -6
- package/src/ui/dash/settings/SessionsContent.tsx +23 -5
- package/src/ui/dash/settings/SettingsDirectory.tsx +99 -0
- package/src/ui/dash/settings/SettingsRootContent.tsx +176 -221
- package/src/ui/feed/CuratedThreadPreview.tsx +73 -0
- package/src/ui/feed/LinkCard.tsx +52 -36
- package/src/ui/feed/NoteCard.tsx +10 -4
- package/src/ui/feed/PostStatusBadges.tsx +4 -21
- package/src/ui/feed/QuoteCard.tsx +11 -3
- package/src/ui/feed/ThreadPreview.tsx +11 -5
- package/src/ui/feed/TimelineFeed.tsx +53 -15
- package/src/ui/feed/__tests__/timeline-cards.test.ts +172 -0
- package/src/ui/feed/thread-preview-state.ts +2 -4
- package/src/ui/font-themes.ts +211 -43
- package/src/ui/layouts/BaseLayout.tsx +161 -30
- package/src/ui/layouts/SiteLayout.tsx +51 -18
- package/src/ui/layouts/__tests__/BaseLayout.test.tsx +169 -0
- package/src/ui/pages/ArchivePage.tsx +320 -120
- package/src/ui/pages/BrandPage.tsx +927 -0
- package/src/ui/pages/CollectionEditorPage.tsx +155 -0
- package/src/ui/pages/CollectionPage.tsx +482 -23
- package/src/ui/pages/CollectionsPage.tsx +57 -57
- package/src/ui/pages/FeaturedPage.tsx +24 -3
- package/src/ui/pages/HomePage.tsx +13 -0
- package/src/ui/pages/PostPage.tsx +13 -4
- package/src/ui/pages/SearchPage.tsx +12 -2
- package/src/ui/pages/ThemeSamplePage.tsx +1160 -0
- package/src/ui/shared/AdminBreadcrumb.tsx +22 -6
- package/src/ui/shared/CollectionDirectory.tsx +131 -0
- package/src/ui/shared/CollectionsManager.tsx +277 -0
- package/src/ui/shared/DecorativeQuoteMark.tsx +32 -0
- package/src/ui/shared/HomePageBranding.tsx +22 -0
- package/src/ui/shared/JantBrandMark.tsx +35 -0
- package/src/ui/shared/MediaGallery.tsx +106 -36
- package/src/ui/shared/PaginatedPageHeader.tsx +49 -0
- package/src/ui/shared/Pagination.tsx +2 -6
- package/src/ui/shared/PostFooter.tsx +130 -67
- package/src/ui/shared/__tests__/home-page-branding.test.tsx +14 -0
- package/src/ui/shared/__tests__/media-gallery.test.ts +82 -0
- package/src/ui/shared/__tests__/navigation-labels.test.ts +103 -0
- package/src/ui/shared/__tests__/pagination.test.ts +18 -1
- package/src/ui/shared/__tests__/post-footer.test.ts +122 -0
- package/src/ui/shared/collection-management-labels.ts +161 -0
- package/src/ui/shared/navigation-labels.ts +126 -0
- package/src/vendor/datastar.js +1955 -7
- package/dist/client/assets/heic-to-DIRPI3VF.js +0 -1
- package/dist/client/assets/module-RjUF93sV.js +0 -716
- package/dist/client/assets/native-48B9X9Wg.js +0 -1
- package/dist/client/assets/url-FWFqPJPb.js +0 -1
- package/dist/client/client.css +0 -1
- package/dist/client/client.js +0 -33565
- package/src/client/components/collection-sidebar-types.ts +0 -43
- package/src/client/tiptap/paste-image.ts +0 -129
- package/src/lib/emoji-catalog.ts +0 -963
- package/src/lib/icon-catalog.ts +0 -5213
- package/src/ui/shared/CollectionsSidebar.tsx +0 -294
package/src/services/export.ts
CHANGED
|
@@ -9,9 +9,30 @@
|
|
|
9
9
|
import type { PostService } from "./post.js";
|
|
10
10
|
import type { PathService } from "./path.js";
|
|
11
11
|
import type { CollectionService } from "./collection.js";
|
|
12
|
+
import type { MediaService } from "./media.js";
|
|
13
|
+
import {
|
|
14
|
+
buildJantLogoSvgMarkup,
|
|
15
|
+
getDefaultJantAppleTouchIconBytes,
|
|
16
|
+
getDefaultJantFaviconIcoBytes,
|
|
17
|
+
HOME_BRANDING_LINK_LABEL,
|
|
18
|
+
HOME_BRANDING_PREFIX,
|
|
19
|
+
JANT_REPO_URL,
|
|
20
|
+
} from "../lib/jant-branding.js";
|
|
12
21
|
import { tiptapJsonToMarkdown } from "../lib/tiptap-to-markdown.js";
|
|
22
|
+
import { getMediaUrl, getPublicUrlForProvider } from "../lib/image.js";
|
|
23
|
+
import { FEATURED_SPARKLE_PATH } from "../lib/featured-icons.js";
|
|
24
|
+
import { escapeHtml } from "../lib/html.js";
|
|
25
|
+
import { render as renderMarkdown } from "../lib/markdown.js";
|
|
13
26
|
import { toISOString } from "../lib/time.js";
|
|
14
|
-
import type {
|
|
27
|
+
import type { StorageDriver } from "../lib/storage.js";
|
|
28
|
+
import { base64ToUint8Array } from "../lib/favicon.js";
|
|
29
|
+
import type {
|
|
30
|
+
Post,
|
|
31
|
+
Collection,
|
|
32
|
+
Media,
|
|
33
|
+
NavItem,
|
|
34
|
+
TextAttachmentContent,
|
|
35
|
+
} from "../types.js";
|
|
15
36
|
|
|
16
37
|
export interface ExportService {
|
|
17
38
|
generateZolaSite(): Promise<Uint8Array>;
|
|
@@ -22,6 +43,59 @@ interface SiteConfig {
|
|
|
22
43
|
siteUrl: string;
|
|
23
44
|
siteDescription: string;
|
|
24
45
|
siteLanguage: string;
|
|
46
|
+
showJantBrandingOnHome: boolean;
|
|
47
|
+
homeDefaultView: string;
|
|
48
|
+
headerNavMaxVisible: number;
|
|
49
|
+
siteFooter: string;
|
|
50
|
+
showHeaderAvatar: boolean;
|
|
51
|
+
siteAvatarUrl: string;
|
|
52
|
+
faviconIcoBase64?: string;
|
|
53
|
+
appleTouchIconStorageKey?: string;
|
|
54
|
+
faviconVersion?: string;
|
|
55
|
+
themeId: string;
|
|
56
|
+
defaultThemeId: string;
|
|
57
|
+
fontThemeId: string;
|
|
58
|
+
themeMode: string;
|
|
59
|
+
noindex: boolean;
|
|
60
|
+
themeCss?: string;
|
|
61
|
+
customCss?: string;
|
|
62
|
+
r2PublicUrl?: string;
|
|
63
|
+
s3PublicUrl?: string;
|
|
64
|
+
localPublicUrl?: string;
|
|
65
|
+
imageTransformUrl?: string;
|
|
66
|
+
sitePathPrefix?: string;
|
|
67
|
+
navItems: Pick<
|
|
68
|
+
NavItem,
|
|
69
|
+
"type" | "systemKey" | "label" | "url" | "position"
|
|
70
|
+
>[];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface AttachmentExportMeta {
|
|
74
|
+
kind: Media["mediaKind"];
|
|
75
|
+
src?: string;
|
|
76
|
+
poster?: string | null;
|
|
77
|
+
mimeType: string;
|
|
78
|
+
originalName: string;
|
|
79
|
+
size: number;
|
|
80
|
+
width: number | null;
|
|
81
|
+
height: number | null;
|
|
82
|
+
alt: string | null;
|
|
83
|
+
position: string;
|
|
84
|
+
blurhash: string | null;
|
|
85
|
+
waveform: string | null;
|
|
86
|
+
summary: string | null;
|
|
87
|
+
chars: number | null;
|
|
88
|
+
contentFormat?: TextAttachmentContent["contentFormat"];
|
|
89
|
+
content?: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
type IconExportMode = "default" | "custom";
|
|
93
|
+
|
|
94
|
+
interface SiteIconAssets {
|
|
95
|
+
faviconBytes: Uint8Array;
|
|
96
|
+
faviconMode: IconExportMode;
|
|
97
|
+
appleTouchBytes: Uint8Array;
|
|
98
|
+
appleTouchMode: IconExportMode;
|
|
25
99
|
}
|
|
26
100
|
|
|
27
101
|
export function createExportService(
|
|
@@ -29,8 +103,10 @@ export function createExportService(
|
|
|
29
103
|
posts: PostService;
|
|
30
104
|
paths: PathService;
|
|
31
105
|
collections: CollectionService;
|
|
106
|
+
media: MediaService;
|
|
32
107
|
},
|
|
33
108
|
siteConfig: SiteConfig,
|
|
109
|
+
deps: { storage?: StorageDriver | null } = {},
|
|
34
110
|
): ExportService {
|
|
35
111
|
return {
|
|
36
112
|
async generateZolaSite() {
|
|
@@ -48,13 +124,25 @@ export function createExportService(
|
|
|
48
124
|
const replies = allPosts.filter((p) => p.replyToId !== null);
|
|
49
125
|
const rootPostIds = roots.map((p) => p.id);
|
|
50
126
|
|
|
51
|
-
const [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
127
|
+
const [
|
|
128
|
+
collectionsByPost,
|
|
129
|
+
rawMediaByPost,
|
|
130
|
+
slugMap,
|
|
131
|
+
aliasMap,
|
|
132
|
+
collectionSlugMap,
|
|
133
|
+
] = await Promise.all([
|
|
134
|
+
services.collections.getCollectionsByPostIds(allPostIds),
|
|
135
|
+
services.media.getByPostIds(allPostIds),
|
|
136
|
+
services.paths.getPostSlugMap(allPostIds),
|
|
137
|
+
services.paths.getPostAliases(rootPostIds),
|
|
138
|
+
services.paths.getCollectionSlugMap(allCollections.map((c) => c.id)),
|
|
139
|
+
]);
|
|
140
|
+
const textAttachmentContents = await buildTextAttachmentContentMap(
|
|
141
|
+
rawMediaByPost,
|
|
142
|
+
services.media,
|
|
143
|
+
deps.storage,
|
|
144
|
+
);
|
|
145
|
+
const iconAssets = await buildSiteIconAssets(siteConfig, deps.storage);
|
|
58
146
|
|
|
59
147
|
// 2. Group replies by threadId
|
|
60
148
|
const repliesByThread = new Map<string, Post[]>();
|
|
@@ -77,32 +165,53 @@ export function createExportService(
|
|
|
77
165
|
const slug = slugMap.get(root.id) ?? root.slug;
|
|
78
166
|
const threadReplies = repliesByThread.get(root.id) ?? [];
|
|
79
167
|
const postCollections = collectionsByPost.get(root.id) ?? [];
|
|
80
|
-
const
|
|
168
|
+
const rootAliases = [...(aliasMap.get(root.id) ?? [])];
|
|
169
|
+
const zolaAliases = [...rootAliases];
|
|
170
|
+
const rootMedia = rawMediaByPost.get(root.id) ?? [];
|
|
81
171
|
|
|
82
|
-
//
|
|
172
|
+
// Reply URLs must resolve back to the merged thread page in Zola, but
|
|
173
|
+
// they are not root aliases when round-tripping into Jant.
|
|
83
174
|
for (const reply of threadReplies) {
|
|
84
175
|
const replySlug = slugMap.get(reply.id) ?? reply.slug;
|
|
85
|
-
|
|
176
|
+
zolaAliases.push(`/${replySlug}`);
|
|
86
177
|
}
|
|
87
178
|
|
|
88
179
|
const markdown = buildPostMarkdown(
|
|
89
180
|
root,
|
|
90
181
|
threadReplies,
|
|
91
182
|
postCollections,
|
|
92
|
-
|
|
183
|
+
{ rootAliases, zolaAliases },
|
|
93
184
|
slugMap,
|
|
94
185
|
collectionSlugMap,
|
|
186
|
+
rootMedia,
|
|
187
|
+
rawMediaByPost,
|
|
188
|
+
siteConfig,
|
|
189
|
+
textAttachmentContents,
|
|
95
190
|
);
|
|
96
191
|
|
|
97
192
|
files[`content/${slug}/index.md`] = new TextEncoder().encode(markdown);
|
|
98
193
|
}
|
|
99
194
|
|
|
195
|
+
for (const collection of allCollections) {
|
|
196
|
+
const slug = collectionSlugMap.get(collection.id) ?? collection.slug;
|
|
197
|
+
const section = buildCollectionSection(collection);
|
|
198
|
+
files[`content/c/${slug}/_index.md`] = new TextEncoder().encode(
|
|
199
|
+
section,
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
100
203
|
// Generate scaffold
|
|
101
204
|
files["config.toml"] = new TextEncoder().encode(
|
|
102
|
-
buildConfigToml(siteConfig),
|
|
205
|
+
buildConfigToml(siteConfig, iconAssets),
|
|
103
206
|
);
|
|
104
207
|
files["content/_index.md"] = new TextEncoder().encode(buildRootSection());
|
|
208
|
+
files["content/archive/_index.md"] = new TextEncoder().encode(
|
|
209
|
+
buildArchiveSection(),
|
|
210
|
+
);
|
|
105
211
|
files["templates/base.html"] = new TextEncoder().encode(TEMPLATE_BASE);
|
|
212
|
+
files["templates/archive.html"] = new TextEncoder().encode(
|
|
213
|
+
TEMPLATE_ARCHIVE,
|
|
214
|
+
);
|
|
106
215
|
files["templates/index.html"] = new TextEncoder().encode(TEMPLATE_INDEX);
|
|
107
216
|
files["templates/page.html"] = new TextEncoder().encode(TEMPLATE_PAGE);
|
|
108
217
|
files["templates/section.html"] = new TextEncoder().encode(
|
|
@@ -114,23 +223,95 @@ export function createExportService(
|
|
|
114
223
|
files["templates/taxonomy_single.html"] = new TextEncoder().encode(
|
|
115
224
|
TEMPLATE_TAXONOMY_SINGLE,
|
|
116
225
|
);
|
|
226
|
+
files["templates/atom.xml"] = new TextEncoder().encode(TEMPLATE_ATOM);
|
|
117
227
|
files["templates/macros.html"] = new TextEncoder().encode(
|
|
118
228
|
TEMPLATE_MACROS,
|
|
119
229
|
);
|
|
120
230
|
files["static/style.css"] = new TextEncoder().encode(STYLE_CSS);
|
|
231
|
+
files["static/theme.css"] = new TextEncoder().encode(
|
|
232
|
+
siteConfig.themeCss ?? "",
|
|
233
|
+
);
|
|
234
|
+
files["static/custom.css"] = new TextEncoder().encode(
|
|
235
|
+
siteConfig.customCss ?? "",
|
|
236
|
+
);
|
|
237
|
+
files["static/favicon.ico"] = iconAssets.faviconBytes;
|
|
238
|
+
files["static/apple-touch-icon.png"] = iconAssets.appleTouchBytes;
|
|
239
|
+
files["README.md"] = new TextEncoder().encode(
|
|
240
|
+
buildReadme(siteConfig.siteName),
|
|
241
|
+
);
|
|
121
242
|
|
|
122
243
|
return zipSync(files);
|
|
123
244
|
},
|
|
124
245
|
};
|
|
125
246
|
}
|
|
126
247
|
|
|
248
|
+
async function readStorageObjectBytes(
|
|
249
|
+
storage: StorageDriver,
|
|
250
|
+
storageKey: string,
|
|
251
|
+
): Promise<Uint8Array | null> {
|
|
252
|
+
const object = await storage.get(storageKey);
|
|
253
|
+
if (!object?.body) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return new Uint8Array(await new Response(object.body).arrayBuffer());
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async function buildSiteIconAssets(
|
|
261
|
+
config: SiteConfig,
|
|
262
|
+
storage?: StorageDriver | null,
|
|
263
|
+
): Promise<SiteIconAssets> {
|
|
264
|
+
const faviconMode: IconExportMode = config.faviconIcoBase64
|
|
265
|
+
? "custom"
|
|
266
|
+
: "default";
|
|
267
|
+
const faviconBytes = config.faviconIcoBase64
|
|
268
|
+
? base64ToUint8Array(config.faviconIcoBase64)
|
|
269
|
+
: getDefaultJantFaviconIcoBytes();
|
|
270
|
+
|
|
271
|
+
if (!config.appleTouchIconStorageKey) {
|
|
272
|
+
return {
|
|
273
|
+
faviconBytes,
|
|
274
|
+
faviconMode,
|
|
275
|
+
appleTouchBytes: getDefaultJantAppleTouchIconBytes(),
|
|
276
|
+
appleTouchMode: "default",
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (!storage) {
|
|
281
|
+
throw new Error(
|
|
282
|
+
"Custom apple-touch icon is configured but no storage driver is available for export",
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const appleTouchBytes = await readStorageObjectBytes(
|
|
287
|
+
storage,
|
|
288
|
+
config.appleTouchIconStorageKey,
|
|
289
|
+
);
|
|
290
|
+
if (!appleTouchBytes) {
|
|
291
|
+
throw new Error(
|
|
292
|
+
`Custom apple-touch icon "${config.appleTouchIconStorageKey}" is unavailable for export`,
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return {
|
|
297
|
+
faviconBytes,
|
|
298
|
+
faviconMode,
|
|
299
|
+
appleTouchBytes,
|
|
300
|
+
appleTouchMode: "custom",
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
127
304
|
// ---------------------------------------------------------------------------
|
|
128
305
|
// Markdown generation
|
|
129
306
|
// ---------------------------------------------------------------------------
|
|
130
307
|
|
|
131
308
|
/** Escape a string for use inside a TOML double-quoted value */
|
|
132
309
|
function escapeToml(value: string): string {
|
|
133
|
-
return value
|
|
310
|
+
return value
|
|
311
|
+
.replace(/\\/g, "\\\\")
|
|
312
|
+
.replace(/"/g, '\\"')
|
|
313
|
+
.replace(/\r/g, "\\r")
|
|
314
|
+
.replace(/\n/g, "\\n");
|
|
134
315
|
}
|
|
135
316
|
|
|
136
317
|
/** Escape a string for use in YAML (wrap in quotes if needed) */
|
|
@@ -154,15 +335,22 @@ function buildPostMarkdown(
|
|
|
154
335
|
root: Post,
|
|
155
336
|
threadReplies: Post[],
|
|
156
337
|
postCollections: Collection[],
|
|
157
|
-
|
|
338
|
+
aliasData: {
|
|
339
|
+
rootAliases: string[];
|
|
340
|
+
zolaAliases: string[];
|
|
341
|
+
},
|
|
158
342
|
slugMap: Map<string, string>,
|
|
159
343
|
collectionSlugMap: Map<string, string>,
|
|
344
|
+
rootMedia: Media[],
|
|
345
|
+
mediaByPost: Map<string, Media[]>,
|
|
346
|
+
siteConfig: SiteConfig,
|
|
347
|
+
textAttachmentContents: Map<string, TextAttachmentContent>,
|
|
160
348
|
): string {
|
|
161
349
|
const parts: string[] = [];
|
|
162
350
|
|
|
163
351
|
// Front matter (YAML)
|
|
164
352
|
parts.push("---");
|
|
165
|
-
if (root.title) {
|
|
353
|
+
if (root.title && root.format !== "quote") {
|
|
166
354
|
parts.push(`title: ${yamlString(root.title)}`);
|
|
167
355
|
}
|
|
168
356
|
const date = root.publishedAt ?? root.createdAt;
|
|
@@ -172,16 +360,16 @@ function buildPostMarkdown(
|
|
|
172
360
|
if (root.updatedAt && root.updatedAt !== root.publishedAt) {
|
|
173
361
|
parts.push(`updated: ${toISOString(root.updatedAt)}`);
|
|
174
362
|
}
|
|
175
|
-
if (root.status === "draft") {
|
|
363
|
+
if (root.status === "draft" || root.visibility === "private") {
|
|
176
364
|
parts.push("draft: true");
|
|
177
365
|
}
|
|
178
366
|
|
|
179
367
|
const slug = slugMap.get(root.id) ?? root.slug;
|
|
180
368
|
parts.push(`slug: ${yamlString(slug)}`);
|
|
181
369
|
|
|
182
|
-
if (
|
|
370
|
+
if (aliasData.zolaAliases.length > 0) {
|
|
183
371
|
parts.push("aliases:");
|
|
184
|
-
for (const a of
|
|
372
|
+
for (const a of aliasData.zolaAliases) {
|
|
185
373
|
parts.push(` - ${yamlString(a)}`);
|
|
186
374
|
}
|
|
187
375
|
}
|
|
@@ -199,9 +387,21 @@ function buildPostMarkdown(
|
|
|
199
387
|
// Extra metadata
|
|
200
388
|
parts.push("extra:");
|
|
201
389
|
parts.push(` format: ${root.format}`);
|
|
202
|
-
|
|
390
|
+
parts.push(` status: ${root.status}`);
|
|
391
|
+
parts.push(` visibility: ${root.visibility}`);
|
|
392
|
+
const summaryText = getArchiveSummaryText(root);
|
|
393
|
+
if (summaryText) {
|
|
394
|
+
parts.push(` summary_text: ${yamlString(summaryText)}`);
|
|
395
|
+
}
|
|
396
|
+
if (root.format === "link" && root.url) {
|
|
203
397
|
parts.push(` link_url: ${yamlString(root.url)}`);
|
|
204
398
|
}
|
|
399
|
+
if (root.format === "quote" && root.title) {
|
|
400
|
+
parts.push(` source_name: ${yamlString(root.title)}`);
|
|
401
|
+
}
|
|
402
|
+
if (root.format === "quote" && root.url) {
|
|
403
|
+
parts.push(` source_url: ${yamlString(root.url)}`);
|
|
404
|
+
}
|
|
205
405
|
if (root.quoteText) {
|
|
206
406
|
parts.push(` quote_text: ${yamlString(root.quoteText)}`);
|
|
207
407
|
}
|
|
@@ -214,13 +414,24 @@ function buildPostMarkdown(
|
|
|
214
414
|
if (root.featuredAt !== null) {
|
|
215
415
|
parts.push(" featured: true");
|
|
216
416
|
}
|
|
417
|
+
if (aliasData.rootAliases.length > 0) {
|
|
418
|
+
parts.push(" jant:");
|
|
419
|
+
parts.push(" root_aliases:");
|
|
420
|
+
for (const alias of aliasData.rootAliases) {
|
|
421
|
+
parts.push(` - ${yamlString(alias)}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
217
424
|
|
|
218
425
|
parts.push("---");
|
|
219
426
|
parts.push("");
|
|
220
427
|
|
|
221
428
|
// Root body
|
|
222
|
-
|
|
223
|
-
|
|
429
|
+
const rootBlocks = [
|
|
430
|
+
root.body ? tiptapJsonToMarkdown(root.body) : "",
|
|
431
|
+
buildAttachmentBlock(rootMedia, siteConfig, textAttachmentContents),
|
|
432
|
+
].filter(Boolean);
|
|
433
|
+
if (rootBlocks.length > 0) {
|
|
434
|
+
parts.push(rootBlocks.join("\n\n"));
|
|
224
435
|
}
|
|
225
436
|
|
|
226
437
|
// Thread replies
|
|
@@ -229,9 +440,8 @@ function buildPostMarkdown(
|
|
|
229
440
|
|
|
230
441
|
// Reply marker comment
|
|
231
442
|
const replySlug = slugMap.get(reply.id) ?? reply.slug;
|
|
232
|
-
const esc =
|
|
233
|
-
|
|
234
|
-
let marker = `<!-- jant:reply date="${reply.publishedAt ? toISOString(reply.publishedAt) : ""}" slug="${esc(replySlug)}" format="${reply.format}"`;
|
|
443
|
+
const esc = escapeCommentAttribute;
|
|
444
|
+
let marker = `<!-- jant:reply date="${reply.publishedAt ? toISOString(reply.publishedAt) : ""}" slug="${esc(replySlug)}" format="${reply.format}" status="${reply.status}" visibility="${reply.visibility}"`;
|
|
235
445
|
|
|
236
446
|
if (reply.format === "link" && reply.url) {
|
|
237
447
|
marker += ` url="${esc(reply.url)}"`;
|
|
@@ -239,10 +449,16 @@ function buildPostMarkdown(
|
|
|
239
449
|
if (reply.format === "quote" && reply.quoteText) {
|
|
240
450
|
marker += ` quote_text="${encodeURIComponent(reply.quoteText)}"`;
|
|
241
451
|
}
|
|
452
|
+
if (reply.format === "quote" && reply.title) {
|
|
453
|
+
marker += ` source_name="${esc(reply.title)}"`;
|
|
454
|
+
}
|
|
455
|
+
if (reply.format === "quote" && reply.url) {
|
|
456
|
+
marker += ` source_url="${esc(reply.url)}"`;
|
|
457
|
+
}
|
|
242
458
|
if (reply.rating !== null) {
|
|
243
459
|
marker += ` rating="${reply.rating}"`;
|
|
244
460
|
}
|
|
245
|
-
if (reply.title) {
|
|
461
|
+
if (reply.title && reply.format !== "quote") {
|
|
246
462
|
marker += ` title="${esc(reply.title)}"`;
|
|
247
463
|
}
|
|
248
464
|
marker += " -->";
|
|
@@ -250,31 +466,337 @@ function buildPostMarkdown(
|
|
|
250
466
|
parts.push(marker);
|
|
251
467
|
parts.push("");
|
|
252
468
|
|
|
253
|
-
|
|
254
|
-
|
|
469
|
+
const replyBlocks = [
|
|
470
|
+
reply.body ? tiptapJsonToMarkdown(reply.body) : "",
|
|
471
|
+
buildAttachmentBlock(
|
|
472
|
+
mediaByPost.get(reply.id) ?? [],
|
|
473
|
+
siteConfig,
|
|
474
|
+
textAttachmentContents,
|
|
475
|
+
),
|
|
476
|
+
].filter(Boolean);
|
|
477
|
+
if (replyBlocks.length > 0) {
|
|
478
|
+
parts.push(replyBlocks.join("\n\n"));
|
|
255
479
|
}
|
|
256
480
|
}
|
|
257
481
|
|
|
258
482
|
return parts.join("\n");
|
|
259
483
|
}
|
|
260
484
|
|
|
261
|
-
function
|
|
262
|
-
|
|
263
|
-
title = "${escapeToml(
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
485
|
+
function buildCollectionSection(collection: Collection): string {
|
|
486
|
+
const parts: string[] = ["+++"];
|
|
487
|
+
parts.push(`title = "${escapeToml(collection.title)}"`);
|
|
488
|
+
parts.push("render = false");
|
|
489
|
+
if (collection.description) {
|
|
490
|
+
parts.push(`description = "${escapeToml(collection.description)}"`);
|
|
491
|
+
}
|
|
492
|
+
parts.push("[extra]");
|
|
493
|
+
parts.push(`sort_order = "${escapeToml(collection.sortOrder)}"`);
|
|
494
|
+
parts.push("jant_collection = true");
|
|
495
|
+
parts.push("+++");
|
|
496
|
+
parts.push("");
|
|
497
|
+
return parts.join("\n");
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
function normalizeArchiveText(text: string | null | undefined): string {
|
|
501
|
+
return (text ?? "").replace(/\s+/g, " ").trim();
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
function getArchiveSummaryText(post: Post): string | null {
|
|
505
|
+
const candidates =
|
|
506
|
+
post.format === "quote"
|
|
507
|
+
? [post.summary, post.quoteText, post.bodyText, post.url]
|
|
508
|
+
: [post.summary, post.bodyText, post.quoteText, post.url];
|
|
509
|
+
|
|
510
|
+
for (const candidate of candidates) {
|
|
511
|
+
const normalized = normalizeArchiveText(candidate);
|
|
512
|
+
if (normalized) return normalized;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
return null;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
function buildAttachmentBlock(
|
|
519
|
+
mediaList: Media[],
|
|
520
|
+
siteConfig: SiteConfig,
|
|
521
|
+
textAttachmentContents: Map<string, TextAttachmentContent>,
|
|
522
|
+
): string {
|
|
523
|
+
if (mediaList.length === 0) return "";
|
|
524
|
+
|
|
525
|
+
const figures = mediaList
|
|
526
|
+
.map((media) =>
|
|
527
|
+
buildAttachmentFigure(media, siteConfig, textAttachmentContents),
|
|
528
|
+
)
|
|
529
|
+
.join("\n");
|
|
530
|
+
|
|
531
|
+
return `<div data-jant-node="attachments">\n${figures}\n</div>`;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
function buildAttachmentFigure(
|
|
535
|
+
media: Media,
|
|
536
|
+
siteConfig: SiteConfig,
|
|
537
|
+
textAttachmentContents: Map<string, TextAttachmentContent>,
|
|
538
|
+
): string {
|
|
539
|
+
const meta = buildAttachmentMeta(
|
|
540
|
+
media,
|
|
541
|
+
siteConfig,
|
|
542
|
+
textAttachmentContents.get(media.id),
|
|
543
|
+
);
|
|
544
|
+
const metaJson = safeJsonForHtml(meta);
|
|
545
|
+
const name = escapeHtml(meta.originalName);
|
|
546
|
+
const caption =
|
|
547
|
+
media.summary && media.summary !== media.originalName
|
|
548
|
+
? `<figcaption>${escapeHtml(media.summary)}</figcaption>`
|
|
549
|
+
: "";
|
|
550
|
+
|
|
551
|
+
if (
|
|
552
|
+
meta.kind === "text" &&
|
|
553
|
+
meta.contentFormat === "markdown" &&
|
|
554
|
+
typeof meta.content === "string"
|
|
555
|
+
) {
|
|
556
|
+
const summaryLabel = escapeHtml(
|
|
557
|
+
media.summary?.trim() || meta.originalName || "Text attachment",
|
|
558
|
+
);
|
|
559
|
+
return `<figure data-jant-node="attachment" data-jant-kind="text">
|
|
560
|
+
<script type="application/json" data-jant-meta>${metaJson}</script>
|
|
561
|
+
<details>
|
|
562
|
+
<summary>${summaryLabel}</summary>
|
|
563
|
+
<div class="prose jant-attachment-text-preview">${renderMarkdown(meta.content)}</div>
|
|
564
|
+
</details>
|
|
565
|
+
</figure>`;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
const src = meta.src;
|
|
569
|
+
if (!src) {
|
|
570
|
+
throw new Error(`Attachment ${media.id} is missing an export URL`);
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
if (meta.kind === "image") {
|
|
574
|
+
const alt = media.alt ? ` alt="${escapeHtml(media.alt)}"` : ' alt=""';
|
|
575
|
+
return `<figure data-jant-node="attachment" data-jant-kind="image">
|
|
576
|
+
<script type="application/json" data-jant-meta>${metaJson}</script>
|
|
577
|
+
<img src="${escapeHtml(src)}"${alt}>
|
|
578
|
+
${caption}
|
|
579
|
+
</figure>`;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
if (meta.kind === "video") {
|
|
583
|
+
const posterAttr = meta.poster
|
|
584
|
+
? ` poster="${escapeHtml(meta.poster)}"`
|
|
585
|
+
: "";
|
|
586
|
+
return `<figure data-jant-node="attachment" data-jant-kind="video">
|
|
587
|
+
<script type="application/json" data-jant-meta>${metaJson}</script>
|
|
588
|
+
<video controls preload="metadata"${posterAttr}>
|
|
589
|
+
<source src="${escapeHtml(src)}" type="${escapeHtml(meta.mimeType)}">
|
|
590
|
+
</video>
|
|
591
|
+
${caption}
|
|
592
|
+
</figure>`;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
if (meta.kind === "audio") {
|
|
596
|
+
return `<figure data-jant-node="attachment" data-jant-kind="audio">
|
|
597
|
+
<script type="application/json" data-jant-meta>${metaJson}</script>
|
|
598
|
+
<audio controls preload="metadata" src="${escapeHtml(src)}"></audio>
|
|
599
|
+
${caption}
|
|
600
|
+
</figure>`;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
const description = buildAttachmentTextDescription(media);
|
|
604
|
+
const figcaption = description
|
|
605
|
+
? `<figcaption>${escapeHtml(description)}</figcaption>`
|
|
606
|
+
: "";
|
|
607
|
+
return `<figure data-jant-node="attachment" data-jant-kind="${escapeHtml(meta.kind)}">
|
|
608
|
+
<script type="application/json" data-jant-meta>${metaJson}</script>
|
|
609
|
+
<a href="${escapeHtml(src)}">${name}</a>
|
|
610
|
+
${figcaption}
|
|
611
|
+
</figure>`;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
function buildAttachmentTextDescription(media: Media): string {
|
|
615
|
+
if (media.mediaKind === "text") {
|
|
616
|
+
const summary = media.summary?.trim();
|
|
617
|
+
if (summary) return summary;
|
|
618
|
+
if (media.chars) return `${media.chars} chars`;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
if (media.summary?.trim()) {
|
|
622
|
+
return media.summary.trim();
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
return media.mimeType;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
function buildAttachmentMeta(
|
|
629
|
+
media: Media,
|
|
630
|
+
siteConfig: SiteConfig,
|
|
631
|
+
textAttachmentContent?: TextAttachmentContent,
|
|
632
|
+
): AttachmentExportMeta {
|
|
633
|
+
if (media.mimeType === "text/x-tiptap+json") {
|
|
634
|
+
if (!textAttachmentContent) {
|
|
635
|
+
throw new Error(
|
|
636
|
+
`Text attachment ${media.id} content is unavailable for export`,
|
|
637
|
+
);
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
return {
|
|
641
|
+
kind: media.mediaKind,
|
|
642
|
+
mimeType: media.mimeType,
|
|
643
|
+
originalName: media.originalName,
|
|
644
|
+
size: media.size,
|
|
645
|
+
width: media.width,
|
|
646
|
+
height: media.height,
|
|
647
|
+
alt: media.alt,
|
|
648
|
+
position: media.position,
|
|
649
|
+
blurhash: media.blurhash,
|
|
650
|
+
waveform: media.waveform,
|
|
651
|
+
summary: media.summary,
|
|
652
|
+
chars: media.chars,
|
|
653
|
+
contentFormat: textAttachmentContent.contentFormat,
|
|
654
|
+
content: textAttachmentContent.content,
|
|
655
|
+
};
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
const publicUrl = getPublicUrlForProvider(
|
|
659
|
+
media.provider,
|
|
660
|
+
siteConfig.r2PublicUrl,
|
|
661
|
+
siteConfig.s3PublicUrl,
|
|
662
|
+
siteConfig.localPublicUrl,
|
|
663
|
+
);
|
|
664
|
+
|
|
665
|
+
return {
|
|
666
|
+
kind: media.mediaKind,
|
|
667
|
+
src: getMediaUrl(media.storageKey, publicUrl, siteConfig.sitePathPrefix),
|
|
668
|
+
poster: media.posterKey
|
|
669
|
+
? getMediaUrl(media.posterKey, publicUrl, siteConfig.sitePathPrefix)
|
|
670
|
+
: null,
|
|
671
|
+
mimeType: media.mimeType,
|
|
672
|
+
originalName: media.originalName,
|
|
673
|
+
size: media.size,
|
|
674
|
+
width: media.width,
|
|
675
|
+
height: media.height,
|
|
676
|
+
alt: media.alt,
|
|
677
|
+
position: media.position,
|
|
678
|
+
blurhash: media.blurhash,
|
|
679
|
+
waveform: media.waveform,
|
|
680
|
+
summary: media.summary,
|
|
681
|
+
chars: media.chars,
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
async function buildTextAttachmentContentMap(
|
|
686
|
+
mediaByPost: Map<string, Media[]>,
|
|
687
|
+
mediaService: Pick<MediaService, "getTextAttachmentContent">,
|
|
688
|
+
storage?: StorageDriver | null,
|
|
689
|
+
): Promise<Map<string, TextAttachmentContent>> {
|
|
690
|
+
const textAttachments = [...mediaByPost.values()]
|
|
691
|
+
.flat()
|
|
692
|
+
.filter((media) => media.mimeType === "text/x-tiptap+json");
|
|
693
|
+
|
|
694
|
+
if (textAttachments.length === 0) {
|
|
695
|
+
return new Map();
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
const contents = await Promise.all(
|
|
699
|
+
textAttachments.map(async (media) => {
|
|
700
|
+
const content = await mediaService.getTextAttachmentContent(
|
|
701
|
+
media.id,
|
|
702
|
+
storage,
|
|
703
|
+
);
|
|
704
|
+
if (!content) {
|
|
705
|
+
throw new Error(
|
|
706
|
+
`Text attachment ${media.id} content is unavailable for export`,
|
|
707
|
+
);
|
|
708
|
+
}
|
|
709
|
+
return [media.id, content] as const;
|
|
710
|
+
}),
|
|
711
|
+
);
|
|
712
|
+
|
|
713
|
+
return new Map(contents);
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
function escapeCommentAttribute(value: string): string {
|
|
717
|
+
return value
|
|
718
|
+
.replace(/\\/g, "\\\\")
|
|
719
|
+
.replace(/"/g, '\\"')
|
|
720
|
+
.replace(/\n/g, "\\n");
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
function safeJsonForHtml(value: unknown): string {
|
|
724
|
+
return JSON.stringify(value)
|
|
725
|
+
.replace(/</g, "\\u003c")
|
|
726
|
+
.replace(/>/g, "\\u003e")
|
|
727
|
+
.replace(/&/g, "\\u0026");
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
function buildConfigToml(
|
|
731
|
+
config: SiteConfig,
|
|
732
|
+
iconAssets: SiteIconAssets,
|
|
733
|
+
): string {
|
|
734
|
+
const footerHtml = config.siteFooter ? renderMarkdown(config.siteFooter) : "";
|
|
735
|
+
const parts = [
|
|
736
|
+
`base_url = "${escapeToml(config.siteUrl || "https://example.com")}"`,
|
|
737
|
+
`title = "${escapeToml(config.siteName)}"`,
|
|
738
|
+
`description = "${escapeToml(config.siteDescription)}"`,
|
|
739
|
+
`default_language = "${escapeToml(config.siteLanguage)}"`,
|
|
740
|
+
"generate_feeds = true",
|
|
741
|
+
"compile_sass = false",
|
|
742
|
+
"",
|
|
743
|
+
'feed_filenames = ["atom.xml"]',
|
|
744
|
+
"",
|
|
745
|
+
"[extra.jant_export]",
|
|
746
|
+
'format = "jant-site"',
|
|
747
|
+
"version = 1",
|
|
748
|
+
`generated_at = "${escapeToml(toISOString(Math.floor(Date.now() / 1000)))}"`,
|
|
749
|
+
"",
|
|
750
|
+
"[extra.jant]",
|
|
751
|
+
`home_default_view = "${escapeToml(config.homeDefaultView)}"`,
|
|
752
|
+
`header_nav_max_visible = ${config.headerNavMaxVisible}`,
|
|
753
|
+
`show_jant_branding_on_home = ${config.showJantBrandingOnHome}`,
|
|
754
|
+
`show_header_avatar = ${config.showHeaderAvatar}`,
|
|
755
|
+
`noindex = ${config.noindex}`,
|
|
756
|
+
`site_avatar_mode = "${config.siteAvatarUrl ? "custom" : "none"}"`,
|
|
757
|
+
`favicon_mode = "${iconAssets.faviconMode}"`,
|
|
758
|
+
`apple_touch_mode = "${iconAssets.appleTouchMode}"`,
|
|
759
|
+
"nav_exported = true",
|
|
760
|
+
`theme_id = "${escapeToml(config.themeId || config.defaultThemeId)}"`,
|
|
761
|
+
`default_theme_id = "${escapeToml(config.defaultThemeId)}"`,
|
|
762
|
+
`font_theme_id = "${escapeToml(config.fontThemeId)}"`,
|
|
763
|
+
`theme_mode = "${escapeToml(config.themeMode)}"`,
|
|
764
|
+
];
|
|
765
|
+
|
|
766
|
+
if (config.siteAvatarUrl) {
|
|
767
|
+
parts.push(`site_avatar_url = "${escapeToml(config.siteAvatarUrl)}"`);
|
|
768
|
+
}
|
|
769
|
+
if (config.faviconVersion) {
|
|
770
|
+
parts.push(`favicon_version = "${escapeToml(config.faviconVersion)}"`);
|
|
771
|
+
}
|
|
772
|
+
if (footerHtml) {
|
|
773
|
+
parts.push(`site_footer_html = "${escapeToml(footerHtml)}"`);
|
|
774
|
+
}
|
|
775
|
+
if (config.siteFooter) {
|
|
776
|
+
parts.push(`site_footer_markdown = "${escapeToml(config.siteFooter)}"`);
|
|
777
|
+
}
|
|
268
778
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
779
|
+
for (const item of config.navItems) {
|
|
780
|
+
parts.push("");
|
|
781
|
+
parts.push("[[extra.jant.nav]]");
|
|
782
|
+
parts.push(`type = "${escapeToml(item.type)}"`);
|
|
783
|
+
parts.push(`label = "${escapeToml(item.label)}"`);
|
|
784
|
+
parts.push(`url = "${escapeToml(item.url)}"`);
|
|
785
|
+
if (item.systemKey) {
|
|
786
|
+
parts.push(`system_key = "${escapeToml(item.systemKey)}"`);
|
|
787
|
+
}
|
|
788
|
+
}
|
|
272
789
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
790
|
+
parts.push("");
|
|
791
|
+
parts.push("[[taxonomies]]");
|
|
792
|
+
parts.push('name = "c"');
|
|
793
|
+
parts.push("feed = true");
|
|
794
|
+
parts.push("");
|
|
795
|
+
parts.push("[markdown]");
|
|
796
|
+
parts.push("highlight_code = true");
|
|
797
|
+
parts.push('highlight_theme = "css"');
|
|
276
798
|
|
|
277
|
-
|
|
799
|
+
return `${parts.join("\n")}
|
|
278
800
|
`;
|
|
279
801
|
}
|
|
280
802
|
|
|
@@ -286,34 +808,185 @@ paginate_by = 20
|
|
|
286
808
|
`;
|
|
287
809
|
}
|
|
288
810
|
|
|
811
|
+
function buildArchiveSection(): string {
|
|
812
|
+
return `+++
|
|
813
|
+
title = "Archive"
|
|
814
|
+
template = "archive.html"
|
|
815
|
+
+++
|
|
816
|
+
`;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
function buildReadme(siteName: string): string {
|
|
820
|
+
return `# ${siteName} — Zola Export
|
|
821
|
+
|
|
822
|
+
This is a static site exported from [Jant](https://github.com/jant-me/jant), ready to build with [Zola](https://www.getzola.org/).
|
|
823
|
+
|
|
824
|
+
## Install Zola
|
|
825
|
+
|
|
826
|
+
**macOS (Homebrew):**
|
|
827
|
+
|
|
828
|
+
\`\`\`sh
|
|
829
|
+
brew install zola
|
|
830
|
+
\`\`\`
|
|
831
|
+
|
|
832
|
+
**Windows (Scoop):**
|
|
833
|
+
|
|
834
|
+
\`\`\`sh
|
|
835
|
+
scoop install zola
|
|
836
|
+
\`\`\`
|
|
837
|
+
|
|
838
|
+
**Linux (Snap):**
|
|
839
|
+
|
|
840
|
+
\`\`\`sh
|
|
841
|
+
snap install zola --edge
|
|
842
|
+
\`\`\`
|
|
843
|
+
|
|
844
|
+
Or download a binary from <https://github.com/getzola/zola/releases>.
|
|
845
|
+
|
|
846
|
+
See the [Zola installation docs](https://www.getzola.org/documentation/getting-started/installation/) for more options.
|
|
847
|
+
|
|
848
|
+
## Quick start
|
|
849
|
+
|
|
850
|
+
Preview locally:
|
|
851
|
+
|
|
852
|
+
\`\`\`sh
|
|
853
|
+
zola serve
|
|
854
|
+
\`\`\`
|
|
855
|
+
|
|
856
|
+
Then open <http://127.0.0.1:1111> in your browser.
|
|
857
|
+
|
|
858
|
+
Build the site for deployment:
|
|
859
|
+
|
|
860
|
+
\`\`\`sh
|
|
861
|
+
zola build
|
|
862
|
+
\`\`\`
|
|
863
|
+
|
|
864
|
+
The output goes to the \`public/\` directory. Upload it to any static host (Netlify, Vercel, Cloudflare Pages, GitHub Pages, etc.).
|
|
865
|
+
|
|
866
|
+
## Project structure
|
|
867
|
+
|
|
868
|
+
\`\`\`
|
|
869
|
+
config.toml — Site configuration (title, URL, language)
|
|
870
|
+
content/
|
|
871
|
+
_index.md — Root section (homepage settings)
|
|
872
|
+
{slug}/index.md — Individual posts (threads are merged into one page)
|
|
873
|
+
c/{slug}/_index.md — Collection display metadata for taxonomy pages and round-trip import
|
|
874
|
+
templates/ — Tera templates (Zola's template engine)
|
|
875
|
+
static/
|
|
876
|
+
style.css — Base exported stylesheet
|
|
877
|
+
theme.css — Resolved Jant theme variables
|
|
878
|
+
custom.css — Exported custom CSS overrides
|
|
879
|
+
favicon.ico — Exported site favicon (custom or default fallback)
|
|
880
|
+
apple-touch-icon.png — Exported Apple touch icon (custom or default fallback)
|
|
881
|
+
\`\`\`
|
|
882
|
+
|
|
883
|
+
## Customizing
|
|
884
|
+
|
|
885
|
+
- **Site settings** — edit \`config.toml\` to change the title, URL, or language.
|
|
886
|
+
- **Jant metadata** — \`config.toml\` stores \`[extra.jant_export]\` and \`[extra.jant]\` for round-trip import.
|
|
887
|
+
- **Styles** — edit \`static/style.css\`. The theme supports light and dark modes via \`prefers-color-scheme\`.
|
|
888
|
+
- **Templates** — edit files in \`templates/\`. Zola uses the [Tera](https://keats.github.io/tera/) template engine.
|
|
889
|
+
- **Debugging** — export to a directory with \`jant site export --directory ./my-site\`, then run \`cd my-site && zola serve\`.
|
|
890
|
+
- **Collections** — posts are tagged with collections via the \`c\` taxonomy. Browse them at \`/c/\`.
|
|
891
|
+
|
|
892
|
+
## Notes
|
|
893
|
+
|
|
894
|
+
- The raw export API only writes content files. The CLI localizes media by default unless you pass \`--no-localize-media\`.
|
|
895
|
+
- Thread replies are merged into the root post as a single page. Reply metadata is preserved in HTML comments (\`<!-- jant:reply ... -->\`).
|
|
896
|
+
- Attachments are preserved as Jant HTML blocks (\`data-jant-node="attachments"\`). Text attachments embed canonical Markdown in the block metadata, while the rendered preview is display-only and ignored by \`jant site import\`.
|
|
897
|
+
- Posts with \`draft: true\` in front matter are only built when you pass the \`--drafts\` flag to \`zola build\` or \`zola serve\`.
|
|
898
|
+
`;
|
|
899
|
+
}
|
|
900
|
+
|
|
289
901
|
// ---------------------------------------------------------------------------
|
|
290
902
|
// Zola theme templates
|
|
291
903
|
// ---------------------------------------------------------------------------
|
|
292
904
|
|
|
905
|
+
const DECORATIVE_QUOTE_MARK_SVG = `<span class="decorative-quote-mark feed-quote-mark" aria-hidden="true">
|
|
906
|
+
<svg viewBox="0 0 96 96" role="presentation" focusable="false">
|
|
907
|
+
<path fill="currentColor" 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" />
|
|
908
|
+
<path fill="currentColor" 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" />
|
|
909
|
+
</svg>
|
|
910
|
+
</span>`;
|
|
911
|
+
|
|
293
912
|
const TEMPLATE_BASE = `<!DOCTYPE html>
|
|
294
|
-
<html lang="{{ config.default_language }}">
|
|
913
|
+
<html lang="{{ config.default_language }}" data-theme-mode="{{ config.extra.jant.theme_mode | default(value='auto') }}">
|
|
295
914
|
<head>
|
|
296
915
|
<meta charset="utf-8">
|
|
297
916
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
298
917
|
<title>{% block title %}{{ config.title }}{% endblock %}</title>
|
|
918
|
+
{% if config.description %}
|
|
299
919
|
<meta name="description" content="{{ config.description }}">
|
|
920
|
+
{% endif %}
|
|
921
|
+
{% if config.extra.jant.noindex %}
|
|
922
|
+
<meta name="robots" content="noindex, nofollow">
|
|
923
|
+
{% endif %}
|
|
924
|
+
{% set favicon_href = get_url(path='favicon.ico') %}
|
|
925
|
+
{% set apple_touch_href = get_url(path='apple-touch-icon.png') %}
|
|
926
|
+
{% if config.extra.jant.favicon_version %}
|
|
927
|
+
<link rel="icon" href="{{ favicon_href }}?v={{ config.extra.jant.favicon_version }}" sizes="16x16 32x32">
|
|
928
|
+
<link rel="apple-touch-icon" href="{{ apple_touch_href }}?v={{ config.extra.jant.favicon_version }}">
|
|
929
|
+
{% else %}
|
|
930
|
+
<link rel="icon" href="{{ favicon_href }}" sizes="16x16 32x32">
|
|
931
|
+
<link rel="apple-touch-icon" href="{{ apple_touch_href }}">
|
|
932
|
+
{% endif %}
|
|
300
933
|
<link rel="stylesheet" href="{{ get_url(path='style.css') }}">
|
|
934
|
+
<link rel="stylesheet" href="{{ get_url(path='theme.css') }}">
|
|
935
|
+
<link rel="stylesheet" href="{{ get_url(path='custom.css') }}">
|
|
301
936
|
<link rel="alternate" type="application/atom+xml" title="{{ config.title }}" href="{{ get_url(path='atom.xml') }}">
|
|
302
937
|
</head>
|
|
303
938
|
<body>
|
|
304
|
-
<
|
|
305
|
-
<
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
939
|
+
<div class="site-page">
|
|
940
|
+
<header class="site-header">
|
|
941
|
+
<div class="site-header-inner">
|
|
942
|
+
<div class="{% block header_top_class %}site-header-top site-header-top-bordered{% endblock %}">
|
|
943
|
+
<a href="{{ config.base_url }}" class="site-logo">
|
|
944
|
+
{% if config.extra.jant.show_header_avatar and config.extra.jant.site_avatar_url %}
|
|
945
|
+
<img src="{{ config.extra.jant.site_avatar_url }}" class="site-logo-avatar" alt="">
|
|
946
|
+
{% endif %}
|
|
947
|
+
<span>{{ config.title }}</span>
|
|
948
|
+
</a>
|
|
949
|
+
<div class="site-header-right">
|
|
950
|
+
<nav class="site-header-nav" aria-label="Primary">
|
|
951
|
+
{% if config.extra.jant.nav and config.extra.jant.nav | length > 0 %}
|
|
952
|
+
{% for item in config.extra.jant.nav %}
|
|
953
|
+
{% if item.system_key == "settings" %}
|
|
954
|
+
{% elif item.system_key == "collections" %}
|
|
955
|
+
<a href="{{ get_url(path='c') }}" class="site-header-link">{{ item.label }}</a>
|
|
956
|
+
{% elif item.system_key == "rss" %}
|
|
957
|
+
<a href="{{ get_url(path='atom.xml') }}" class="site-header-link">{{ item.label }}</a>
|
|
958
|
+
{% elif item.system_key == "archive" %}
|
|
959
|
+
<a href="{{ get_url(path='archive') }}" class="site-header-link">{{ item.label }}</a>
|
|
960
|
+
{% else %}
|
|
961
|
+
<a href="{{ item.url }}" class="site-header-link">{{ item.label }}</a>
|
|
962
|
+
{% endif %}
|
|
963
|
+
{% endfor %}
|
|
964
|
+
{% else %}
|
|
965
|
+
<a href="{{ config.base_url }}/c/" class="site-header-link">Collections</a>
|
|
966
|
+
<a href="{{ get_url(path='atom.xml') }}" class="site-header-link">RSS</a>
|
|
967
|
+
{% endif %}
|
|
968
|
+
</nav>
|
|
969
|
+
</div>
|
|
970
|
+
</div>
|
|
971
|
+
</div>
|
|
972
|
+
</header>
|
|
973
|
+
|
|
974
|
+
<main class="site-main">
|
|
975
|
+
<div class="site-container">
|
|
976
|
+
<div class="{% block site_content_class %}site-content{% endblock %}">
|
|
977
|
+
{% block content %}{% endblock %}
|
|
978
|
+
</div>
|
|
979
|
+
</div>
|
|
980
|
+
</main>
|
|
981
|
+
|
|
982
|
+
{% if config.extra.jant.site_footer_html %}
|
|
983
|
+
<footer class="site-footer" data-footer>
|
|
984
|
+
<div class="site-container">
|
|
985
|
+
<div class="prose">{{ config.extra.jant.site_footer_html | safe }}</div>
|
|
986
|
+
</div>
|
|
987
|
+
</footer>
|
|
988
|
+
{% endif %}
|
|
989
|
+
</div>
|
|
317
990
|
</body>
|
|
318
991
|
</html>
|
|
319
992
|
`;
|
|
@@ -322,20 +995,59 @@ const TEMPLATE_INDEX = `{% extends "base.html" %}
|
|
|
322
995
|
{% import "macros.html" as macros %}
|
|
323
996
|
|
|
324
997
|
{% block title %}{{ config.title }}{% endblock %}
|
|
998
|
+
{% block header_top_class %}site-header-top site-header-top-bordered site-header-top-home{% endblock %}
|
|
999
|
+
{% block site_content_class %}site-content site-content-home{% endblock %}
|
|
325
1000
|
|
|
326
1001
|
{% block content %}
|
|
327
|
-
<div
|
|
328
|
-
{%
|
|
329
|
-
|
|
330
|
-
{%
|
|
331
|
-
|
|
1002
|
+
<div data-page="home">
|
|
1003
|
+
{% if paginator.current_index > 1 %}
|
|
1004
|
+
<p class="page-context-label">Page {{ paginator.current_index }}</p>
|
|
1005
|
+
{% endif %}
|
|
1006
|
+
<div data-feed>
|
|
1007
|
+
<div id="timeline-feed">
|
|
1008
|
+
<div id="timeline-items">
|
|
1009
|
+
{% for page in paginator.pages %}
|
|
1010
|
+
{% if page.extra.visibility | default(value="public") != "latest_hidden" %}
|
|
1011
|
+
<div class="feed-item" data-timeline-item data-timeline-item-content>
|
|
1012
|
+
{% if not loop.first %}<hr class="feed-divider">{% endif %}
|
|
1013
|
+
{{ macros::post_card(page=page) }}
|
|
1014
|
+
</div>
|
|
1015
|
+
{% endif %}
|
|
1016
|
+
{% endfor %}
|
|
1017
|
+
</div>
|
|
1018
|
+
</div>
|
|
1019
|
+
</div>
|
|
332
1020
|
|
|
333
|
-
{% if paginator.previous or paginator.next %}
|
|
334
|
-
<nav class="pagination">
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
</
|
|
338
|
-
{% endif %}
|
|
1021
|
+
{% if paginator.previous or paginator.next %}
|
|
1022
|
+
<nav class="pagination" aria-label="Pagination">
|
|
1023
|
+
<div class="pagination-side">
|
|
1024
|
+
{% if paginator.previous %}
|
|
1025
|
+
<a href="{{ paginator.previous }}" class="pagination-link">← Previous</a>
|
|
1026
|
+
{% endif %}
|
|
1027
|
+
</div>
|
|
1028
|
+
<div class="pagination-center">
|
|
1029
|
+
{% if paginator.number_pagers > 1 %}
|
|
1030
|
+
<span class="pagination-label">Page {{ paginator.current_index }} of {{ paginator.number_pagers }}</span>
|
|
1031
|
+
{% endif %}
|
|
1032
|
+
</div>
|
|
1033
|
+
<div class="pagination-side pagination-side-end">
|
|
1034
|
+
{% if paginator.next %}
|
|
1035
|
+
<a href="{{ paginator.next }}" class="pagination-link">Next →</a>
|
|
1036
|
+
{% endif %}
|
|
1037
|
+
</div>
|
|
1038
|
+
</nav>
|
|
1039
|
+
{% endif %}
|
|
1040
|
+
|
|
1041
|
+
{% if config.extra.jant.show_jant_branding_on_home %}
|
|
1042
|
+
<footer class="home-branding-credit">
|
|
1043
|
+
${HOME_BRANDING_PREFIX}
|
|
1044
|
+
<a href="${JANT_REPO_URL}" target="_blank" rel="noopener noreferrer">
|
|
1045
|
+
${buildJantLogoSvgMarkup("positive")}
|
|
1046
|
+
<span>${HOME_BRANDING_LINK_LABEL}</span>
|
|
1047
|
+
</a>
|
|
1048
|
+
</footer>
|
|
1049
|
+
{% endif %}
|
|
1050
|
+
</div>
|
|
339
1051
|
{% endblock %}
|
|
340
1052
|
`;
|
|
341
1053
|
|
|
@@ -345,7 +1057,9 @@ const TEMPLATE_PAGE = `{% extends "base.html" %}
|
|
|
345
1057
|
{% block title %}{% if page.title %}{{ page.title }} — {% endif %}{{ config.title }}{% endblock %}
|
|
346
1058
|
|
|
347
1059
|
{% block content %}
|
|
348
|
-
|
|
1060
|
+
<div data-page="post">
|
|
1061
|
+
{{ macros::post_card(page=page, detail=true) }}
|
|
1062
|
+
</div>
|
|
349
1063
|
{% endblock %}
|
|
350
1064
|
`;
|
|
351
1065
|
|
|
@@ -355,15 +1069,84 @@ const TEMPLATE_SECTION = `{% extends "base.html" %}
|
|
|
355
1069
|
{% block title %}{{ section.title }} — {{ config.title }}{% endblock %}
|
|
356
1070
|
|
|
357
1071
|
{% block content %}
|
|
358
|
-
<
|
|
359
|
-
|
|
360
|
-
<
|
|
361
|
-
{%
|
|
1072
|
+
<div class="section-shell">
|
|
1073
|
+
<header class="section-header">
|
|
1074
|
+
<h1 class="section-title">{{ section.title }}</h1>
|
|
1075
|
+
{% if section.description %}
|
|
1076
|
+
<p class="section-description">{{ section.description }}</p>
|
|
1077
|
+
{% endif %}
|
|
1078
|
+
</header>
|
|
362
1079
|
|
|
363
|
-
<div
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
1080
|
+
<div data-feed>
|
|
1081
|
+
<div id="timeline-feed">
|
|
1082
|
+
<div id="timeline-items">
|
|
1083
|
+
{% for page in section.pages %}
|
|
1084
|
+
{% if page.extra.visibility | default(value="public") != "latest_hidden" %}
|
|
1085
|
+
<div class="feed-item" data-timeline-item data-timeline-item-content>
|
|
1086
|
+
{% if not loop.first %}<hr class="feed-divider">{% endif %}
|
|
1087
|
+
{{ macros::post_card(page=page) }}
|
|
1088
|
+
</div>
|
|
1089
|
+
{% endif %}
|
|
1090
|
+
{% endfor %}
|
|
1091
|
+
</div>
|
|
1092
|
+
</div>
|
|
1093
|
+
</div>
|
|
1094
|
+
</div>
|
|
1095
|
+
{% endblock %}
|
|
1096
|
+
`;
|
|
1097
|
+
|
|
1098
|
+
const TEMPLATE_ARCHIVE = `{% extends "base.html" %}
|
|
1099
|
+
|
|
1100
|
+
{% block title %}Archive — {{ config.title }}{% endblock %}
|
|
1101
|
+
|
|
1102
|
+
{% block content %}
|
|
1103
|
+
{% set root = get_section(path="_index.md") %}
|
|
1104
|
+
<div class="section-shell archive-shell">
|
|
1105
|
+
<header class="section-header">
|
|
1106
|
+
<h1 class="section-title">Archive</h1>
|
|
1107
|
+
<p class="section-description">Every exported post in one chronological list.</p>
|
|
1108
|
+
</header>
|
|
1109
|
+
|
|
1110
|
+
<div class="archive-list">
|
|
1111
|
+
{% for year, year_pages in root.pages | group_by(attribute="year") %}
|
|
1112
|
+
{% for month, month_pages in year_pages | group_by(attribute="month") %}
|
|
1113
|
+
<section class="archive-month-group">
|
|
1114
|
+
<header class="archive-month-heading">
|
|
1115
|
+
{{ month_pages[0].date | date(format="%B %Y") }}
|
|
1116
|
+
</header>
|
|
1117
|
+
{% for page in month_pages %}
|
|
1118
|
+
{% if page.extra.visibility | default(value="public") == "public" %}
|
|
1119
|
+
{% set archive_title = page.title | default(value="") %}
|
|
1120
|
+
{% if archive_title == "" %}
|
|
1121
|
+
{% set archive_title = page.extra.summary_text | default(value="") %}
|
|
1122
|
+
{% endif %}
|
|
1123
|
+
{% if archive_title == "" %}
|
|
1124
|
+
{% set archive_title = page.summary | default(value=page.content) | striptags | trim %}
|
|
1125
|
+
{% endif %}
|
|
1126
|
+
<article class="archive-entry">
|
|
1127
|
+
<time class="archive-entry-date" datetime="{{ page.date }}">
|
|
1128
|
+
{{ page.date | date(format="%b %e, %Y") }}
|
|
1129
|
+
</time>
|
|
1130
|
+
<div class="archive-entry-main">
|
|
1131
|
+
<a href="{{ page.permalink }}" class="archive-entry-title">
|
|
1132
|
+
{{ archive_title | default(value="Untitled") | truncate(length=92) }}
|
|
1133
|
+
</a>
|
|
1134
|
+
<div class="archive-entry-meta">
|
|
1135
|
+
<span class="archive-entry-format">{{ page.extra.format | default(value="note") }}</span>
|
|
1136
|
+
{% set collections = page.taxonomies.c | default(value=[]) %}
|
|
1137
|
+
{% for col in collections %}
|
|
1138
|
+
{% set col_meta = get_section(path='c/' ~ col ~ '/_index.md') %}
|
|
1139
|
+
<a href="{{ get_taxonomy_url(kind='c', name=col) }}" class="archive-entry-tag">{{ col_meta.title | default(value=col) }}</a>
|
|
1140
|
+
{% endfor %}
|
|
1141
|
+
</div>
|
|
1142
|
+
</div>
|
|
1143
|
+
</article>
|
|
1144
|
+
{% endif %}
|
|
1145
|
+
{% endfor %}
|
|
1146
|
+
</section>
|
|
1147
|
+
{% endfor %}
|
|
1148
|
+
{% endfor %}
|
|
1149
|
+
</div>
|
|
367
1150
|
</div>
|
|
368
1151
|
{% endblock %}
|
|
369
1152
|
`;
|
|
@@ -373,133 +1156,447 @@ const TEMPLATE_TAXONOMY_LIST = `{% extends "base.html" %}
|
|
|
373
1156
|
{% block title %}Collections — {{ config.title }}{% endblock %}
|
|
374
1157
|
|
|
375
1158
|
{% block content %}
|
|
376
|
-
<
|
|
377
|
-
<
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
1159
|
+
<div class="section-shell">
|
|
1160
|
+
<header class="section-header">
|
|
1161
|
+
<h1 class="section-title">Collections</h1>
|
|
1162
|
+
<p class="section-description">Browse exported posts by collection.</p>
|
|
1163
|
+
</header>
|
|
1164
|
+
<ol class="collection-list">
|
|
1165
|
+
{% for term in terms %}
|
|
1166
|
+
{% set term_meta = get_section(path='c/' ~ term.name ~ '/_index.md') %}
|
|
1167
|
+
{% set latest_page = term.pages | first %}
|
|
1168
|
+
<li class="collection-list-item">
|
|
1169
|
+
<a href="{{ term.permalink }}" class="collection-list-link">
|
|
1170
|
+
<span class="collection-list-sequence" aria-hidden="true"></span>
|
|
1171
|
+
<span class="collection-list-content">
|
|
1172
|
+
<span class="collection-list-title">{{ term_meta.title | default(value=term.name) }}</span>
|
|
1173
|
+
<span class="collection-list-meta">
|
|
1174
|
+
<span>{{ term.pages | length }} entries</span>
|
|
1175
|
+
{% if latest_page %}
|
|
1176
|
+
<span>Updated {{ latest_page.updated | default(value=latest_page.date) | date(format="%Y-%m-%d") }}</span>
|
|
1177
|
+
{% endif %}
|
|
1178
|
+
</span>
|
|
1179
|
+
</span>
|
|
1180
|
+
</a>
|
|
1181
|
+
</li>
|
|
1182
|
+
{% endfor %}
|
|
1183
|
+
</ol>
|
|
1184
|
+
</div>
|
|
385
1185
|
{% endblock %}
|
|
386
1186
|
`;
|
|
387
1187
|
|
|
388
1188
|
const TEMPLATE_TAXONOMY_SINGLE = `{% extends "base.html" %}
|
|
389
1189
|
{% import "macros.html" as macros %}
|
|
390
1190
|
|
|
391
|
-
{% block title %}{{ term.name }} — {{ config.title }}{% endblock %}
|
|
1191
|
+
{% block title %}{% set term_meta = get_section(path='c/' ~ term.name ~ '/_index.md') %}{{ term_meta.title | default(value=term.name) }} — {{ config.title }}{% endblock %}
|
|
392
1192
|
|
|
393
1193
|
{% block content %}
|
|
394
|
-
|
|
395
|
-
<div class="
|
|
396
|
-
|
|
397
|
-
{{
|
|
398
|
-
|
|
1194
|
+
{% set term_meta = get_section(path='c/' ~ term.name ~ '/_index.md') %}
|
|
1195
|
+
<div class="section-shell">
|
|
1196
|
+
<header class="section-header">
|
|
1197
|
+
<h1 class="section-title">{{ term_meta.title | default(value=term.name) }}</h1>
|
|
1198
|
+
{% if term_meta.description %}
|
|
1199
|
+
<p class="section-description">{{ term_meta.description }}</p>
|
|
1200
|
+
{% endif %}
|
|
1201
|
+
</header>
|
|
1202
|
+
<div data-feed>
|
|
1203
|
+
<div id="timeline-feed">
|
|
1204
|
+
<div id="timeline-items">
|
|
1205
|
+
{% for page in term.pages %}
|
|
1206
|
+
{% if page.extra.visibility | default(value="public") != "latest_hidden" %}
|
|
1207
|
+
<div class="feed-item" data-timeline-item data-timeline-item-content>
|
|
1208
|
+
{% if not loop.first %}<hr class="feed-divider">{% endif %}
|
|
1209
|
+
{{ macros::post_card(page=page) }}
|
|
1210
|
+
</div>
|
|
1211
|
+
{% endif %}
|
|
1212
|
+
{% endfor %}
|
|
1213
|
+
</div>
|
|
1214
|
+
</div>
|
|
1215
|
+
</div>
|
|
399
1216
|
</div>
|
|
400
1217
|
{% endblock %}
|
|
401
1218
|
`;
|
|
402
1219
|
|
|
1220
|
+
const TEMPLATE_ATOM = `<?xml version="1.0" encoding="utf-8"?>
|
|
1221
|
+
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="{{ lang }}">
|
|
1222
|
+
<title>{% if section is defined and section.title %}{{ section.title }} · {% elif term is defined and taxonomy.name == "c" %}{% set term_meta = get_section(path='c/' ~ term.name ~ '/_index.md') %}{{ term_meta.title | default(value=term.name) }} · {% elif term is defined and term.name %}{{ term.name }} · {% endif %}{{ config.title }}</title>
|
|
1223
|
+
{% if config.description %}
|
|
1224
|
+
<subtitle>{{ config.description }}</subtitle>
|
|
1225
|
+
{% endif %}
|
|
1226
|
+
<link rel="self" type="application/atom+xml" href="{{ feed_url | safe }}" />
|
|
1227
|
+
<link rel="alternate" type="text/html" href="{% if section is defined %}{{ section.permalink }}{% elif term is defined %}{{ term.permalink }}{% else %}{{ config.base_url }}{% endif %}" />
|
|
1228
|
+
<id>{{ feed_url | safe }}</id>
|
|
1229
|
+
{% if last_updated is defined %}
|
|
1230
|
+
<updated>{{ last_updated | date(format="%+") }}</updated>
|
|
1231
|
+
{% else %}
|
|
1232
|
+
<updated>{{ config.extra.jant_export.generated_at | default(value="1970-01-01T00:00:00Z") }}</updated>
|
|
1233
|
+
{% endif %}
|
|
1234
|
+
{% set author_name = config.author | default(value="") %}
|
|
1235
|
+
{% if author_name %}
|
|
1236
|
+
<author><name>{{ author_name }}</name></author>
|
|
1237
|
+
{% endif %}
|
|
1238
|
+
{% for page in pages %}
|
|
1239
|
+
{% if page.extra.visibility | default(value="public") == "public" %}
|
|
1240
|
+
<entry>
|
|
1241
|
+
{% set entry_title = page.title | default(value="") %}
|
|
1242
|
+
{% set entry_summary = page.extra.summary_text | default(value="") %}
|
|
1243
|
+
{% if entry_summary == "" %}
|
|
1244
|
+
{% set entry_summary = page.summary | default(value=page.content) | striptags | trim %}
|
|
1245
|
+
{% endif %}
|
|
1246
|
+
{% if entry_summary == "" %}
|
|
1247
|
+
{% set entry_summary = page.permalink %}
|
|
1248
|
+
{% endif %}
|
|
1249
|
+
<title>{{ entry_title }}</title>
|
|
1250
|
+
<link rel="alternate" type="text/html" href="{{ page.permalink | safe }}" />
|
|
1251
|
+
<published>{{ page.date | date(format="%+") }}</published>
|
|
1252
|
+
<updated>{{ page.updated | default(value=page.date) | date(format="%+") }}</updated>
|
|
1253
|
+
<id>{{ page.permalink | safe }}</id>
|
|
1254
|
+
<summary type="text">{{ entry_summary }}</summary>
|
|
1255
|
+
<content type="html"><p>{{ entry_summary }}</p></content>
|
|
1256
|
+
</entry>
|
|
1257
|
+
{% endif %}
|
|
1258
|
+
{% endfor %}
|
|
1259
|
+
</feed>
|
|
1260
|
+
`;
|
|
1261
|
+
|
|
403
1262
|
// ---------------------------------------------------------------------------
|
|
404
1263
|
// Shared macro — single post card used by all list/detail templates
|
|
405
1264
|
// ---------------------------------------------------------------------------
|
|
406
1265
|
|
|
407
|
-
const TEMPLATE_MACROS = `{% macro
|
|
408
|
-
<
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
1266
|
+
const TEMPLATE_MACROS = `{% macro post_status_badges() %}
|
|
1267
|
+
<div class="post-status-badges">
|
|
1268
|
+
<span class="post-status-badge post-status-pinned">
|
|
1269
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
|
|
1270
|
+
<line x1="12" x2="12" y1="17" y2="22" />
|
|
1271
|
+
<path d="M5 17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4h1v4.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24Z" />
|
|
1272
|
+
</svg>
|
|
1273
|
+
Pinned
|
|
1274
|
+
</span>
|
|
1275
|
+
<span class="post-status-badge post-status-private">
|
|
1276
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
|
|
1277
|
+
<path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49" />
|
|
1278
|
+
<path d="M14.084 14.158a3 3 0 0 1-4.242-4.242" />
|
|
1279
|
+
<path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143" />
|
|
1280
|
+
<path d="m2 2 20 20" />
|
|
1281
|
+
</svg>
|
|
1282
|
+
Private
|
|
1283
|
+
</span>
|
|
1284
|
+
</div>
|
|
1285
|
+
{% endmacro %}
|
|
1286
|
+
|
|
1287
|
+
{% macro post_rating(page) %}
|
|
1288
|
+
{% if page.extra.rating %}
|
|
1289
|
+
<div class="post-rating" aria-label="{{ page.extra.rating }} out of 5">
|
|
1290
|
+
{% for i in range(end=5) %}
|
|
1291
|
+
<span class="{% if i < page.extra.rating %}post-star-filled{% else %}post-star-empty{% endif %}">★</span>
|
|
1292
|
+
{% endfor %}
|
|
1293
|
+
</div>
|
|
1294
|
+
{% endif %}
|
|
1295
|
+
{% endmacro %}
|
|
1296
|
+
|
|
1297
|
+
{% macro post_footer(page, detail=false) %}
|
|
1298
|
+
{% set collections = page.taxonomies.c | default(value=[]) %}
|
|
1299
|
+
<footer class="post-menu-footer{% if detail %} post-footer-detail{% endif %}" data-post-meta>
|
|
1300
|
+
<div class="post-footer-meta">
|
|
1301
|
+
<span class="post-footer-featured" title="Featured">
|
|
1302
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.35" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
1303
|
+
<path d="${FEATURED_SPARKLE_PATH}" />
|
|
1304
|
+
</svg>
|
|
1305
|
+
<span class="sr-only">Featured</span>
|
|
1306
|
+
</span>
|
|
1307
|
+
<a href="{{ page.permalink }}" class="u-url post-date-link">
|
|
1308
|
+
<time class="dt-published" datetime="{{ page.date }}" title="{{ page.date }}">
|
|
1309
|
+
{{ page.date | date(format="%b %e, %Y") }}
|
|
1310
|
+
</time>
|
|
1311
|
+
</a>
|
|
1312
|
+
{% if page.extra.format == "link" and page.extra.link_url %}
|
|
1313
|
+
<a href="{{ page.extra.link_url }}" class="post-footer-external-link" target="_blank" rel="noopener noreferrer" aria-label="Open external link">
|
|
1314
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1315
|
+
<path d="M7 17 17 7" />
|
|
1316
|
+
<path d="M9 7h8v8" />
|
|
1317
|
+
</svg>
|
|
1318
|
+
</a>
|
|
1319
|
+
{% endif %}
|
|
1320
|
+
{% if collections | length > 0 %}
|
|
1321
|
+
{% set first_collection = collections | first %}
|
|
1322
|
+
{% set first_collection_meta = get_section(path='c/' ~ first_collection ~ '/_index.md') %}
|
|
1323
|
+
{% set hidden_collection_count = collections | length %}
|
|
1324
|
+
<span class="post-collection-tags">
|
|
1325
|
+
<span class="post-collection-sep" aria-hidden="true">·</span>
|
|
1326
|
+
<a href="{{ get_taxonomy_url(kind='c', name=first_collection) }}" class="post-collection-tag">{{ first_collection_meta.title | default(value=first_collection) }}</a>
|
|
1327
|
+
{% if hidden_collection_count > 1 %}
|
|
1328
|
+
<span class="post-collection-more-wrap">
|
|
1329
|
+
<button type="button" class="post-collection-more" aria-haspopup="menu" data-collection-popover-trigger>
|
|
1330
|
+
and {{ hidden_collection_count - 1 }} more
|
|
1331
|
+
</button>
|
|
1332
|
+
<span class="post-collection-popover" role="menu" data-collection-popover>
|
|
1333
|
+
{% for col in collections %}
|
|
1334
|
+
{% if not loop.first %}
|
|
1335
|
+
{% set col_meta = get_section(path='c/' ~ col ~ '/_index.md') %}
|
|
1336
|
+
<a href="{{ get_taxonomy_url(kind='c', name=col) }}" class="post-collection-popover-item" role="menuitem">{{ col_meta.title | default(value=col) }}</a>
|
|
1337
|
+
{% endif %}
|
|
1338
|
+
{% endfor %}
|
|
1339
|
+
</span>
|
|
1340
|
+
</span>
|
|
1341
|
+
{% endif %}
|
|
1342
|
+
</span>
|
|
1343
|
+
{% endif %}
|
|
412
1344
|
</div>
|
|
413
|
-
|
|
1345
|
+
</footer>
|
|
1346
|
+
{% endmacro %}
|
|
414
1347
|
|
|
1348
|
+
{% macro note_card(page, detail=false) %}
|
|
1349
|
+
<article
|
|
1350
|
+
class="h-entry post-menu-target {% if detail %}post-detail-shell{% else %}post-card-shell{% endif %}"
|
|
1351
|
+
{% if detail %}data-page="post"{% endif %}
|
|
1352
|
+
data-post
|
|
1353
|
+
data-format="note"
|
|
1354
|
+
data-post-permalink="{{ page.permalink }}"
|
|
1355
|
+
{% if page.title %}data-post-has-title{% endif %}
|
|
1356
|
+
{% if page.extra.pinned %}data-post-pinned{% endif %}
|
|
1357
|
+
{% if page.extra.featured %}data-post-featured{% endif %}
|
|
1358
|
+
data-post-visibility="{{ page.extra.visibility | default(value='public') }}"
|
|
1359
|
+
>
|
|
1360
|
+
{{ self::post_status_badges() }}
|
|
415
1361
|
{% if page.title %}
|
|
416
1362
|
{% if detail %}
|
|
417
|
-
<
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
{{ page.title }}
|
|
422
|
-
{% endif %}
|
|
423
|
-
</h1>
|
|
1363
|
+
<div class="post-header-block">
|
|
1364
|
+
<h1 class="p-name detail-title">{{ page.title }}</h1>
|
|
1365
|
+
{{ self::post_rating(page=page) }}
|
|
1366
|
+
</div>
|
|
424
1367
|
{% else %}
|
|
425
|
-
<h2 class="
|
|
426
|
-
{
|
|
427
|
-
<a href="{{ page.extra.link_url }}" rel="noopener noreferrer" target="_blank">{{ page.title }}</a>
|
|
428
|
-
{% else %}
|
|
429
|
-
<a href="{{ page.permalink }}">{{ page.title }}</a>
|
|
430
|
-
{% endif %}
|
|
1368
|
+
<h2 class="p-name feed-note-title">
|
|
1369
|
+
<a href="{{ page.permalink }}" class="u-url post-title-link">{{ page.title }}</a>
|
|
431
1370
|
</h2>
|
|
432
1371
|
{% endif %}
|
|
433
1372
|
{% endif %}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
1373
|
+
{% if detail and page.content %}
|
|
1374
|
+
<div class="e-content prose" data-post-body>{{ page.content | safe }}</div>
|
|
1375
|
+
{% elif not detail and page.summary %}
|
|
1376
|
+
<div class="e-content prose {% if page.title %}post-body-summary{% endif %}" data-post-body>{{ page.summary | safe }}</div>
|
|
1377
|
+
{% elif page.content %}
|
|
1378
|
+
<div class="e-content prose {% if page.title and not detail %}post-body-summary{% endif %}" data-post-body>{{ page.content | safe }}</div>
|
|
1379
|
+
{% endif %}
|
|
1380
|
+
{% if not detail or not page.title %}
|
|
1381
|
+
{{ self::post_rating(page=page) }}
|
|
439
1382
|
{% endif %}
|
|
1383
|
+
{{ self::post_footer(page=page, detail=detail) }}
|
|
1384
|
+
</article>
|
|
1385
|
+
{% endmacro %}
|
|
440
1386
|
|
|
441
|
-
|
|
442
|
-
|
|
1387
|
+
{% macro link_card(page, detail=false) %}
|
|
1388
|
+
<article
|
|
1389
|
+
class="h-entry post-menu-target {% if detail %}post-detail-shell post-detail-link{% else %}feed-link-post{% endif %}"
|
|
1390
|
+
{% if detail %}data-page="post"{% endif %}
|
|
1391
|
+
data-post
|
|
1392
|
+
data-format="link"
|
|
1393
|
+
data-post-permalink="{{ page.permalink }}"
|
|
1394
|
+
{% if page.title %}data-post-has-title{% endif %}
|
|
1395
|
+
{% if page.extra.pinned %}data-post-pinned{% endif %}
|
|
1396
|
+
{% if page.extra.featured %}data-post-featured{% endif %}
|
|
1397
|
+
data-post-visibility="{{ page.extra.visibility | default(value='public') }}"
|
|
1398
|
+
>
|
|
1399
|
+
{% if not detail %}
|
|
1400
|
+
<div class="feed-card feed-card-link">
|
|
1401
|
+
{% endif %}
|
|
1402
|
+
{{ self::post_status_badges() }}
|
|
1403
|
+
{% if page.extra.link_url %}
|
|
1404
|
+
<a href="{{ page.extra.link_url }}" class="feed-link-domain" rel="noopener noreferrer" target="_blank">
|
|
1405
|
+
<svg class="feed-link-domain-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
1406
|
+
<path d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25" />
|
|
1407
|
+
</svg>
|
|
1408
|
+
<span>{{ page.extra.link_url | split(pat='//') | nth(n=1) | split(pat='/') | first }}</span>
|
|
1409
|
+
</a>
|
|
1410
|
+
{% endif %}
|
|
1411
|
+
{% if page.title %}
|
|
1412
|
+
{% if detail %}
|
|
1413
|
+
<div class="post-header-block">
|
|
1414
|
+
<h1 class="p-name detail-title feed-link-title">
|
|
1415
|
+
<a href="{{ page.extra.link_url | default(value=page.permalink) }}" class="u-url feed-link-title-link" {% if page.extra.link_url %}target="_blank" rel="noopener noreferrer"{% endif %}>{{ page.title }}</a>
|
|
1416
|
+
</h1>
|
|
1417
|
+
{{ self::post_rating(page=page) }}
|
|
1418
|
+
</div>
|
|
1419
|
+
{% else %}
|
|
1420
|
+
<h2 class="p-name feed-link-title">
|
|
1421
|
+
<a href="{{ page.extra.link_url | default(value=page.permalink) }}" class="u-url feed-link-title-link" {% if page.extra.link_url %}target="_blank" rel="noopener noreferrer"{% endif %}>{{ page.title }}</a>
|
|
1422
|
+
</h2>
|
|
1423
|
+
{% endif %}
|
|
1424
|
+
{% endif %}
|
|
1425
|
+
{% if detail and page.content %}
|
|
1426
|
+
<div class="e-content prose feed-link-summary" data-post-body>{{ page.content | safe }}</div>
|
|
1427
|
+
{% elif not detail and page.summary %}
|
|
1428
|
+
<div class="e-content prose feed-link-summary" data-post-body>{{ page.summary | safe }}</div>
|
|
443
1429
|
{% elif page.content %}
|
|
444
|
-
<div class="
|
|
1430
|
+
<div class="e-content prose feed-link-summary" data-post-body>{{ page.content | safe }}</div>
|
|
445
1431
|
{% endif %}
|
|
446
|
-
|
|
447
|
-
{
|
|
448
|
-
|
|
449
|
-
|
|
1432
|
+
{% if not detail or not page.title %}
|
|
1433
|
+
{{ self::post_rating(page=page) }}
|
|
1434
|
+
{% endif %}
|
|
1435
|
+
{% if not detail %}
|
|
450
1436
|
</div>
|
|
451
1437
|
{% endif %}
|
|
1438
|
+
{{ self::post_footer(page=page, detail=detail) }}
|
|
1439
|
+
</article>
|
|
1440
|
+
{% endmacro %}
|
|
452
1441
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
1442
|
+
{% macro quote_card(page, detail=false) %}
|
|
1443
|
+
<article
|
|
1444
|
+
class="h-entry post-menu-target feed-quote-post {% if detail %}post-detail-shell{% endif %}"
|
|
1445
|
+
{% if detail %}data-page="post"{% endif %}
|
|
1446
|
+
data-post
|
|
1447
|
+
data-format="quote"
|
|
1448
|
+
data-post-permalink="{{ page.permalink }}"
|
|
1449
|
+
{% if page.extra.pinned %}data-post-pinned{% endif %}
|
|
1450
|
+
{% if page.extra.featured %}data-post-featured{% endif %}
|
|
1451
|
+
data-post-visibility="{{ page.extra.visibility | default(value='public') }}"
|
|
1452
|
+
>
|
|
1453
|
+
{{ self::post_status_badges() }}
|
|
1454
|
+
{% if page.extra.quote_text %}
|
|
1455
|
+
<blockquote class="feed-quote feed-quote-card">
|
|
1456
|
+
${DECORATIVE_QUOTE_MARK_SVG}
|
|
1457
|
+
<div class="e-content feed-quote-content">{{ page.extra.quote_text }}</div>
|
|
1458
|
+
</blockquote>
|
|
1459
|
+
{% endif %}
|
|
1460
|
+
{% if page.extra.source_name or page.extra.source_url %}
|
|
1461
|
+
<div class="feed-quote-attribution">
|
|
1462
|
+
{% if page.extra.source_url %}
|
|
1463
|
+
<a href="{{ page.extra.source_url }}" class="feed-quote-source" target="_blank" rel="noopener noreferrer">
|
|
1464
|
+
{{ page.extra.source_name | default(value=page.extra.source_url | split(pat='//') | nth(n=1) | split(pat='/') | first) }}
|
|
1465
|
+
</a>
|
|
1466
|
+
{% else %}
|
|
1467
|
+
<span>{{ page.extra.source_name }}</span>
|
|
461
1468
|
{% endif %}
|
|
462
|
-
</
|
|
1469
|
+
</div>
|
|
1470
|
+
{% endif %}
|
|
1471
|
+
{% if detail and page.content %}
|
|
1472
|
+
<div class="feed-quote-commentary prose" data-post-body>{{ page.content | safe }}</div>
|
|
1473
|
+
{% elif not detail and page.summary %}
|
|
1474
|
+
<div class="feed-quote-commentary prose" data-post-body>{{ page.summary | safe }}</div>
|
|
1475
|
+
{% elif page.content %}
|
|
1476
|
+
<div class="feed-quote-commentary prose" data-post-body>{{ page.content | safe }}</div>
|
|
1477
|
+
{% endif %}
|
|
1478
|
+
{{ self::post_rating(page=page) }}
|
|
1479
|
+
{{ self::post_footer(page=page, detail=detail) }}
|
|
463
1480
|
</article>
|
|
464
1481
|
{% endmacro %}
|
|
1482
|
+
|
|
1483
|
+
{% macro post_card(page, detail=false) %}
|
|
1484
|
+
{% if page.extra.format == "link" %}
|
|
1485
|
+
{{ self::link_card(page=page, detail=detail) }}
|
|
1486
|
+
{% elif page.extra.format == "quote" %}
|
|
1487
|
+
{{ self::quote_card(page=page, detail=detail) }}
|
|
1488
|
+
{% else %}
|
|
1489
|
+
{{ self::note_card(page=page, detail=detail) }}
|
|
1490
|
+
{% endif %}
|
|
1491
|
+
{% endmacro %}
|
|
465
1492
|
`;
|
|
466
1493
|
|
|
467
1494
|
// ---------------------------------------------------------------------------
|
|
468
1495
|
// CSS — Jant "Organic Minimalism" approximation
|
|
469
1496
|
// ---------------------------------------------------------------------------
|
|
470
1497
|
|
|
471
|
-
const STYLE_CSS = `/* Jant Export Theme
|
|
1498
|
+
const STYLE_CSS = `/* Jant Export Theme */
|
|
472
1499
|
|
|
473
1500
|
:root {
|
|
1501
|
+
color-scheme: light;
|
|
474
1502
|
--site-width: 500px;
|
|
475
|
-
--font-
|
|
476
|
-
"
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
--
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
--
|
|
488
|
-
|
|
1503
|
+
--font-cjk-serif-fallback:
|
|
1504
|
+
"Songti SC", STSong, SimSun, "Songti TC", PMingLiU, MingLiU,
|
|
1505
|
+
"Noto Serif SC", "Noto Serif CJK SC", "Noto Serif TC", "Noto Serif CJK TC";
|
|
1506
|
+
--font-body:
|
|
1507
|
+
system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
|
1508
|
+
"Helvetica Neue", Helvetica, Arial, "PingFang TC", "PingFang SC",
|
|
1509
|
+
"Hiragino Sans CNS", "Hiragino Sans GB", "Microsoft JhengHei",
|
|
1510
|
+
"Microsoft YaHei", "Noto Sans CJK TC", "Noto Sans CJK SC", sans-serif;
|
|
1511
|
+
--font-heading:
|
|
1512
|
+
"New York Small", "New York", "Iowan Old Style", Charter,
|
|
1513
|
+
"Bitstream Charter", "Source Serif 4", Cambria, "Sitka Text", Georgia,
|
|
1514
|
+
var(--font-cjk-serif-fallback), ui-serif, serif;
|
|
1515
|
+
--font-site-title:
|
|
1516
|
+
"New York Small", "New York", "Iowan Old Style", Charter,
|
|
1517
|
+
"Bitstream Charter", "Source Serif 4", Cambria, "Sitka Text", Georgia,
|
|
1518
|
+
var(--font-cjk-serif-fallback), ui-serif, serif;
|
|
1519
|
+
--font-serif:
|
|
1520
|
+
var(--font-cjk-serif-fallback), ui-serif, "New York Small", "New York",
|
|
1521
|
+
"Iowan Old Style", Charter, Georgia, "Times New Roman", Times, serif;
|
|
1522
|
+
--font-mono:
|
|
1523
|
+
ui-monospace, Menlo, Monaco, Consolas, "Cascadia Code", "Courier New",
|
|
1524
|
+
monospace;
|
|
1525
|
+
--fw-regular: 400;
|
|
1526
|
+
--fw-medium: 500;
|
|
1527
|
+
--fw-semibold: 600;
|
|
1528
|
+
--text-sm: 0.8125rem;
|
|
1529
|
+
--text-base: 0.9375rem;
|
|
1530
|
+
--feed-note-title-size: 1.25rem;
|
|
1531
|
+
--feed-note-title-leading: 1.3;
|
|
1532
|
+
--type-body-size: var(--text-base);
|
|
1533
|
+
--type-body-leading: 1.66;
|
|
1534
|
+
--type-body-tracking: 0.002em;
|
|
1535
|
+
--type-heading-weight: var(--fw-medium);
|
|
1536
|
+
--type-heading-leading: 1.26;
|
|
1537
|
+
--type-heading-tracking: -0.02em;
|
|
1538
|
+
--type-display-leading: 1.04;
|
|
1539
|
+
--type-label-weight: var(--fw-medium);
|
|
1540
|
+
--type-label-tracking: 0.08em;
|
|
1541
|
+
--site-padding: 1.5rem;
|
|
1542
|
+
--content-gap: 1rem;
|
|
1543
|
+
--space-xl: 2rem;
|
|
1544
|
+
--avatar-size: 28px;
|
|
1545
|
+
--avatar-radius: 50%;
|
|
1546
|
+
--media-radius: 0.5rem;
|
|
1547
|
+
--background: oklch(0.975 0.015 92);
|
|
1548
|
+
--foreground: oklch(0.29 0.01 70);
|
|
1549
|
+
--card: oklch(0.975 0.015 92);
|
|
1550
|
+
--primary: oklch(0.3633 0.0697 159.95);
|
|
1551
|
+
--primary-foreground: oklch(0.985 0.008 92);
|
|
1552
|
+
--muted: oklch(0.942 0.014 96);
|
|
1553
|
+
--muted-foreground: oklch(0.52 0.008 70);
|
|
1554
|
+
--accent: oklch(0.942 0.014 96);
|
|
1555
|
+
--border: oklch(0.892 0.014 98);
|
|
1556
|
+
--site-accent: oklch(0.4406 0.0568 159.95);
|
|
1557
|
+
--site-accent-text: var(--primary-foreground);
|
|
1558
|
+
--site-page-bg: var(--background);
|
|
1559
|
+
--site-elevated-bg: var(--background);
|
|
1560
|
+
--site-nav-hover-bg: var(--accent);
|
|
1561
|
+
--site-text-primary: var(--foreground);
|
|
1562
|
+
--site-text-secondary: var(--muted-foreground);
|
|
1563
|
+
--site-text-placeholder: oklch(from var(--muted-foreground) l c h / 0.5);
|
|
1564
|
+
--site-divider: var(--border);
|
|
1565
|
+
--site-feed-card-bg: color-mix(
|
|
1566
|
+
in srgb,
|
|
1567
|
+
var(--site-elevated-bg) 88%,
|
|
1568
|
+
var(--site-nav-hover-bg)
|
|
1569
|
+
);
|
|
1570
|
+
--site-feed-card-border: color-mix(
|
|
1571
|
+
in srgb,
|
|
1572
|
+
var(--site-divider) 78%,
|
|
1573
|
+
transparent
|
|
1574
|
+
);
|
|
1575
|
+
--site-feed-card-shadow: color-mix(
|
|
1576
|
+
in srgb,
|
|
1577
|
+
var(--site-text-primary) 12%,
|
|
1578
|
+
transparent
|
|
1579
|
+
);
|
|
1580
|
+
--site-feed-divider-color: color-mix(
|
|
1581
|
+
in srgb,
|
|
1582
|
+
var(--site-text-secondary) 30%,
|
|
1583
|
+
transparent
|
|
1584
|
+
);
|
|
489
1585
|
}
|
|
490
1586
|
|
|
491
1587
|
@media (prefers-color-scheme: dark) {
|
|
492
|
-
:root {
|
|
493
|
-
|
|
494
|
-
--
|
|
495
|
-
--
|
|
496
|
-
--
|
|
497
|
-
--
|
|
498
|
-
--
|
|
499
|
-
--
|
|
500
|
-
--
|
|
501
|
-
--
|
|
502
|
-
--
|
|
1588
|
+
:root:not([data-theme-mode="light"]) {
|
|
1589
|
+
color-scheme: dark;
|
|
1590
|
+
--background: oklch(0.182 0.003 95);
|
|
1591
|
+
--foreground: oklch(0.895 0.006 88);
|
|
1592
|
+
--card: oklch(0.182 0.003 95);
|
|
1593
|
+
--primary: oklch(0.6966 0.0528 159.95);
|
|
1594
|
+
--primary-foreground: oklch(0.17 0.003 95);
|
|
1595
|
+
--muted: oklch(0.238 0.003 95);
|
|
1596
|
+
--muted-foreground: oklch(0.67 0.005 88);
|
|
1597
|
+
--accent: oklch(0.238 0.003 95);
|
|
1598
|
+
--border: oklch(0.305 0.003 95);
|
|
1599
|
+
--site-accent: oklch(0.7306 0.0478 159.95);
|
|
503
1600
|
}
|
|
504
1601
|
}
|
|
505
1602
|
|
|
@@ -507,296 +1604,1148 @@ const STYLE_CSS = `/* Jant Export Theme — Organic Minimalism */
|
|
|
507
1604
|
*::before,
|
|
508
1605
|
*::after {
|
|
509
1606
|
box-sizing: border-box;
|
|
510
|
-
margin: 0;
|
|
511
|
-
padding: 0;
|
|
512
1607
|
}
|
|
513
1608
|
|
|
514
1609
|
html {
|
|
515
|
-
font-size:
|
|
516
|
-
|
|
1610
|
+
font-size: 16px;
|
|
1611
|
+
background-color: var(--site-page-bg);
|
|
1612
|
+
color: var(--site-text-primary);
|
|
517
1613
|
}
|
|
518
1614
|
|
|
519
1615
|
body {
|
|
1616
|
+
margin: 0;
|
|
520
1617
|
font-family: var(--font-body);
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
1618
|
+
font-size: var(--type-body-size);
|
|
1619
|
+
line-height: var(--type-body-leading);
|
|
1620
|
+
letter-spacing: var(--type-body-tracking);
|
|
1621
|
+
color: var(--site-text-primary);
|
|
1622
|
+
background: var(--site-page-bg);
|
|
1623
|
+
text-rendering: optimizeLegibility;
|
|
1624
|
+
-webkit-font-smoothing: antialiased;
|
|
526
1625
|
}
|
|
527
1626
|
|
|
528
1627
|
a {
|
|
529
|
-
color:
|
|
1628
|
+
color: inherit;
|
|
530
1629
|
text-decoration-thickness: 1px;
|
|
531
|
-
text-underline-offset:
|
|
1630
|
+
text-underline-offset: 3px;
|
|
532
1631
|
}
|
|
533
1632
|
|
|
534
|
-
|
|
535
|
-
|
|
1633
|
+
img,
|
|
1634
|
+
svg,
|
|
1635
|
+
video {
|
|
1636
|
+
display: block;
|
|
1637
|
+
max-width: 100%;
|
|
536
1638
|
}
|
|
537
1639
|
|
|
538
|
-
|
|
539
|
-
|
|
1640
|
+
img {
|
|
1641
|
+
height: auto;
|
|
1642
|
+
}
|
|
1643
|
+
|
|
1644
|
+
.site-page {
|
|
1645
|
+
min-height: 100vh;
|
|
1646
|
+
min-height: 100dvh;
|
|
1647
|
+
background-color: var(--site-page-bg);
|
|
1648
|
+
}
|
|
1649
|
+
|
|
1650
|
+
.site-header {
|
|
1651
|
+
max-width: var(--site-width);
|
|
1652
|
+
margin: 0 auto;
|
|
1653
|
+
padding: 24px var(--site-padding) 0;
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1656
|
+
.site-header-inner {
|
|
1657
|
+
display: flex;
|
|
1658
|
+
flex-direction: column;
|
|
1659
|
+
align-items: flex-start;
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1662
|
+
.site-header-top {
|
|
540
1663
|
display: flex;
|
|
541
1664
|
align-items: center;
|
|
542
1665
|
justify-content: space-between;
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
1666
|
+
gap: 0.85rem;
|
|
1667
|
+
flex-wrap: wrap;
|
|
1668
|
+
min-height: 2.5rem;
|
|
1669
|
+
width: 100%;
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
.site-header-top-bordered {
|
|
1673
|
+
padding-bottom: 15px;
|
|
1674
|
+
border-bottom: 0.5px solid
|
|
1675
|
+
color-mix(in srgb, var(--site-divider) 72%, transparent);
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
.site-header-top-home {
|
|
1679
|
+
border-bottom-color: color-mix(in srgb, var(--site-divider) 72%, transparent);
|
|
1680
|
+
padding-bottom: 14px;
|
|
1681
|
+
}
|
|
1682
|
+
|
|
1683
|
+
.site-header-right {
|
|
1684
|
+
display: flex;
|
|
1685
|
+
align-items: center;
|
|
1686
|
+
gap: 0.55rem;
|
|
1687
|
+
margin-left: auto;
|
|
1688
|
+
min-width: 0;
|
|
546
1689
|
}
|
|
547
1690
|
|
|
548
|
-
.site-
|
|
549
|
-
|
|
550
|
-
|
|
1691
|
+
.site-logo {
|
|
1692
|
+
display: inline-flex;
|
|
1693
|
+
align-items: center;
|
|
1694
|
+
gap: 10px;
|
|
1695
|
+
padding: 0.15rem 0;
|
|
1696
|
+
font-size: clamp(1.18rem, 1.08rem + 0.45vw, 1.34rem);
|
|
1697
|
+
font-weight: var(--fw-medium);
|
|
1698
|
+
font-family: var(--font-site-title);
|
|
1699
|
+
letter-spacing: -0.03em;
|
|
1700
|
+
color: var(--site-text-primary);
|
|
551
1701
|
text-decoration: none;
|
|
552
|
-
|
|
1702
|
+
line-height: var(--type-display-leading);
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
.site-logo-avatar {
|
|
1706
|
+
width: calc(var(--avatar-size) + 2px);
|
|
1707
|
+
height: calc(var(--avatar-size) + 2px);
|
|
1708
|
+
border-radius: var(--avatar-radius);
|
|
1709
|
+
object-fit: cover;
|
|
1710
|
+
box-shadow: 0 0 0 1px color-mix(in srgb, var(--site-divider) 82%, transparent);
|
|
553
1711
|
}
|
|
554
1712
|
|
|
555
|
-
.site-header
|
|
1713
|
+
.site-header-nav {
|
|
556
1714
|
display: flex;
|
|
1715
|
+
align-items: center;
|
|
1716
|
+
flex-wrap: wrap;
|
|
1717
|
+
justify-content: flex-end;
|
|
557
1718
|
gap: 1rem;
|
|
558
1719
|
}
|
|
559
1720
|
|
|
560
|
-
.site-header
|
|
561
|
-
|
|
1721
|
+
.site-header-link {
|
|
1722
|
+
display: inline-flex;
|
|
1723
|
+
align-items: center;
|
|
1724
|
+
position: relative;
|
|
1725
|
+
min-height: 2rem;
|
|
1726
|
+
padding: 0.2rem 0 0.5rem;
|
|
1727
|
+
cursor: pointer;
|
|
1728
|
+
font-size: 0.84rem;
|
|
1729
|
+
line-height: 1;
|
|
1730
|
+
letter-spacing: 0.01em;
|
|
1731
|
+
color: var(--site-text-secondary);
|
|
562
1732
|
text-decoration: none;
|
|
563
|
-
|
|
1733
|
+
transition:
|
|
1734
|
+
color 0.15s,
|
|
1735
|
+
opacity 0.15s;
|
|
1736
|
+
}
|
|
1737
|
+
|
|
1738
|
+
.site-header-link::after {
|
|
1739
|
+
content: "";
|
|
1740
|
+
position: absolute;
|
|
1741
|
+
right: 0;
|
|
1742
|
+
bottom: 0;
|
|
1743
|
+
left: 0;
|
|
1744
|
+
height: 1.5px;
|
|
1745
|
+
border-radius: 999px;
|
|
1746
|
+
background: color-mix(in srgb, var(--site-accent) 62%, var(--site-divider));
|
|
1747
|
+
opacity: 0;
|
|
1748
|
+
transform: scaleX(0.52);
|
|
1749
|
+
transform-origin: center;
|
|
1750
|
+
transition:
|
|
1751
|
+
opacity 0.18s ease,
|
|
1752
|
+
transform 0.18s ease;
|
|
1753
|
+
}
|
|
1754
|
+
|
|
1755
|
+
.site-header-link:hover {
|
|
1756
|
+
color: var(--site-text-primary);
|
|
1757
|
+
opacity: 1;
|
|
1758
|
+
}
|
|
1759
|
+
|
|
1760
|
+
.site-header-link:hover::after {
|
|
1761
|
+
opacity: 0.42;
|
|
1762
|
+
transform: scaleX(0.82);
|
|
1763
|
+
}
|
|
1764
|
+
|
|
1765
|
+
.site-container {
|
|
1766
|
+
max-width: var(--site-width);
|
|
1767
|
+
margin: 0 auto;
|
|
564
1768
|
}
|
|
565
1769
|
|
|
566
|
-
.site-
|
|
567
|
-
color: var(--
|
|
1770
|
+
.site-content {
|
|
1771
|
+
background-color: var(--site-elevated-bg);
|
|
1772
|
+
padding: 1rem var(--site-padding) var(--space-xl);
|
|
568
1773
|
}
|
|
569
1774
|
|
|
570
|
-
|
|
571
|
-
|
|
1775
|
+
.site-content-home {
|
|
1776
|
+
padding-top: 0.75rem;
|
|
1777
|
+
padding-bottom: calc(var(--space-xl) - 0.25rem);
|
|
1778
|
+
border-bottom: 0.5px solid
|
|
1779
|
+
color-mix(in srgb, var(--site-divider) 84%, transparent);
|
|
1780
|
+
}
|
|
1781
|
+
|
|
1782
|
+
.site-home-header {
|
|
572
1783
|
display: flex;
|
|
573
1784
|
flex-direction: column;
|
|
1785
|
+
gap: 0.15rem;
|
|
1786
|
+
margin-bottom: var(--space-xl);
|
|
574
1787
|
}
|
|
575
1788
|
|
|
576
|
-
.
|
|
577
|
-
|
|
578
|
-
|
|
1789
|
+
.site-browse-nav {
|
|
1790
|
+
display: flex;
|
|
1791
|
+
align-items: baseline;
|
|
1792
|
+
flex-wrap: wrap;
|
|
1793
|
+
gap: 0.55rem;
|
|
1794
|
+
padding: 14px 0 4px;
|
|
579
1795
|
}
|
|
580
1796
|
|
|
581
|
-
.
|
|
582
|
-
|
|
1797
|
+
.site-browse-link {
|
|
1798
|
+
font-size: var(--text-base);
|
|
1799
|
+
font-weight: var(--fw-regular);
|
|
1800
|
+
color: var(--site-text-primary);
|
|
1801
|
+
opacity: 0.42;
|
|
583
1802
|
}
|
|
584
1803
|
|
|
585
|
-
.
|
|
586
|
-
|
|
587
|
-
font-weight:
|
|
588
|
-
|
|
589
|
-
|
|
1804
|
+
.site-browse-link-active {
|
|
1805
|
+
opacity: 1;
|
|
1806
|
+
font-weight: var(--fw-medium);
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
.page-context-label {
|
|
1810
|
+
margin: 0 0 1rem;
|
|
1811
|
+
color: var(--site-text-secondary);
|
|
1812
|
+
font-size: var(--text-sm);
|
|
590
1813
|
}
|
|
591
1814
|
|
|
592
|
-
.
|
|
1815
|
+
.feed-item {
|
|
1816
|
+
position: relative;
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
.site-content hr.feed-divider {
|
|
1820
|
+
border: none;
|
|
1821
|
+
width: 30px;
|
|
1822
|
+
height: 9px;
|
|
1823
|
+
margin: 2.5rem auto;
|
|
1824
|
+
color: var(--site-feed-divider-color);
|
|
1825
|
+
background-color: currentColor;
|
|
1826
|
+
-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");
|
|
1827
|
+
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");
|
|
1828
|
+
-webkit-mask-repeat: no-repeat;
|
|
1829
|
+
mask-repeat: no-repeat;
|
|
1830
|
+
-webkit-mask-position: center;
|
|
1831
|
+
mask-position: center;
|
|
1832
|
+
-webkit-mask-size: contain;
|
|
1833
|
+
mask-size: contain;
|
|
1834
|
+
}
|
|
1835
|
+
|
|
1836
|
+
.post-menu-target {
|
|
1837
|
+
position: relative;
|
|
1838
|
+
}
|
|
1839
|
+
|
|
1840
|
+
.post-card-shell,
|
|
1841
|
+
.post-detail-shell {
|
|
1842
|
+
position: relative;
|
|
1843
|
+
padding: 0.45rem 0 0.35rem;
|
|
1844
|
+
}
|
|
1845
|
+
|
|
1846
|
+
.feed-card {
|
|
1847
|
+
position: relative;
|
|
1848
|
+
padding: 1rem 1.1rem 0.95rem;
|
|
1849
|
+
border: 1px solid color-mix(in srgb, var(--site-divider) 78%, transparent);
|
|
1850
|
+
border-radius: 18px;
|
|
1851
|
+
background:
|
|
1852
|
+
linear-gradient(
|
|
1853
|
+
180deg,
|
|
1854
|
+
color-mix(in srgb, var(--site-accent) 4%, transparent),
|
|
1855
|
+
transparent 58%
|
|
1856
|
+
),
|
|
1857
|
+
color-mix(in srgb, var(--site-elevated-bg) 88%, var(--site-nav-hover-bg));
|
|
1858
|
+
box-shadow: 0 20px 40px -36px var(--site-feed-card-shadow);
|
|
1859
|
+
}
|
|
1860
|
+
|
|
1861
|
+
.feed-card-link {
|
|
1862
|
+
border-radius: 14px;
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1865
|
+
.feed-link-post {
|
|
1866
|
+
--feed-link-post-footer-inset: 0.65rem;
|
|
1867
|
+
display: flex;
|
|
1868
|
+
flex-direction: column;
|
|
1869
|
+
}
|
|
1870
|
+
|
|
1871
|
+
.feed-link-post > .post-menu-footer {
|
|
1872
|
+
margin-top: 0.5rem;
|
|
1873
|
+
padding-inline: 0;
|
|
1874
|
+
padding-inline-start: var(--feed-link-post-footer-inset);
|
|
1875
|
+
padding-inline-end: 0.15rem;
|
|
1876
|
+
}
|
|
1877
|
+
|
|
1878
|
+
.feed-link-domain {
|
|
1879
|
+
display: inline-flex;
|
|
1880
|
+
align-items: center;
|
|
1881
|
+
gap: 0.25rem;
|
|
1882
|
+
max-width: 100%;
|
|
1883
|
+
margin-bottom: 0.65rem;
|
|
1884
|
+
color: var(--site-text-secondary);
|
|
1885
|
+
font-size: 0.75rem;
|
|
1886
|
+
font-weight: var(--type-label-weight);
|
|
1887
|
+
line-height: 1;
|
|
1888
|
+
letter-spacing: var(--type-label-tracking);
|
|
593
1889
|
text-decoration: none;
|
|
594
|
-
color: var(--fg);
|
|
595
1890
|
}
|
|
596
1891
|
|
|
597
|
-
.
|
|
598
|
-
|
|
1892
|
+
.feed-link-domain-icon {
|
|
1893
|
+
width: 0.72rem;
|
|
1894
|
+
height: 0.72rem;
|
|
1895
|
+
flex-shrink: 0;
|
|
599
1896
|
}
|
|
600
1897
|
|
|
601
|
-
|
|
602
|
-
.
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
1898
|
+
.feed-link-title,
|
|
1899
|
+
.feed-note-title,
|
|
1900
|
+
.detail-title,
|
|
1901
|
+
.section-title,
|
|
1902
|
+
.p-name {
|
|
1903
|
+
font-family: var(--font-heading);
|
|
606
1904
|
}
|
|
607
1905
|
|
|
608
|
-
.link-
|
|
609
|
-
|
|
1906
|
+
.feed-link-title {
|
|
1907
|
+
margin: 0;
|
|
1908
|
+
font-size: 0.98rem;
|
|
1909
|
+
font-weight: var(--type-heading-weight);
|
|
1910
|
+
line-height: var(--type-heading-leading);
|
|
1911
|
+
letter-spacing: var(--type-heading-tracking);
|
|
1912
|
+
}
|
|
1913
|
+
|
|
1914
|
+
.feed-link-title-link,
|
|
1915
|
+
.post-title-link {
|
|
1916
|
+
color: inherit;
|
|
610
1917
|
text-decoration: none;
|
|
611
1918
|
}
|
|
612
1919
|
|
|
613
|
-
|
|
1920
|
+
.feed-link-title-link:hover,
|
|
1921
|
+
.post-title-link:hover {
|
|
1922
|
+
text-decoration: underline;
|
|
1923
|
+
}
|
|
1924
|
+
|
|
1925
|
+
.feed-note-title {
|
|
1926
|
+
margin: 0 0 0.48rem;
|
|
1927
|
+
font-size: var(--feed-note-title-size);
|
|
1928
|
+
line-height: var(--feed-note-title-leading);
|
|
1929
|
+
letter-spacing: var(--type-heading-tracking);
|
|
1930
|
+
text-wrap: pretty;
|
|
1931
|
+
}
|
|
1932
|
+
|
|
1933
|
+
.post-header-block {
|
|
1934
|
+
margin-bottom: 1rem;
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1937
|
+
.post-header-block .feed-link-title,
|
|
1938
|
+
.post-header-block .feed-note-title,
|
|
1939
|
+
.post-header-block .detail-title {
|
|
1940
|
+
margin-bottom: 0;
|
|
1941
|
+
}
|
|
1942
|
+
|
|
1943
|
+
.post-header-block .post-rating {
|
|
1944
|
+
margin-top: 0.45rem;
|
|
1945
|
+
}
|
|
1946
|
+
|
|
1947
|
+
.detail-title {
|
|
1948
|
+
margin: 0 0 1rem;
|
|
1949
|
+
font-size: clamp(1.56rem, 1.34rem + 1vw, 2.02rem);
|
|
1950
|
+
font-weight: var(--fw-medium);
|
|
1951
|
+
line-height: 1.08;
|
|
1952
|
+
letter-spacing: -0.03em;
|
|
1953
|
+
text-wrap: balance;
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
.feed-quote-post {
|
|
1957
|
+
position: relative;
|
|
1958
|
+
padding: 0.45rem 0 0.35rem;
|
|
1959
|
+
}
|
|
1960
|
+
|
|
614
1961
|
.feed-quote {
|
|
615
|
-
|
|
616
|
-
padding-left: 1rem;
|
|
617
|
-
margin: 0.5rem 0;
|
|
618
|
-
font-style: italic;
|
|
619
|
-
color: var(--fg);
|
|
1962
|
+
margin: 0;
|
|
620
1963
|
}
|
|
621
1964
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
line-height: 1.6;
|
|
626
|
-
color: var(--fg);
|
|
1965
|
+
.feed-quote-card {
|
|
1966
|
+
padding-left: 0;
|
|
1967
|
+
border-left: none;
|
|
627
1968
|
}
|
|
628
1969
|
|
|
629
|
-
.
|
|
630
|
-
|
|
1970
|
+
.decorative-quote-mark {
|
|
1971
|
+
display: block;
|
|
1972
|
+
line-height: 0;
|
|
631
1973
|
}
|
|
632
1974
|
|
|
633
|
-
.
|
|
1975
|
+
.decorative-quote-mark svg {
|
|
1976
|
+
display: block;
|
|
1977
|
+
width: 100%;
|
|
1978
|
+
height: auto;
|
|
1979
|
+
}
|
|
1980
|
+
|
|
1981
|
+
.feed-quote-mark {
|
|
1982
|
+
width: clamp(1.46rem, 1.38rem + 0.36vw, 1.76rem);
|
|
1983
|
+
margin-bottom: -0.1rem;
|
|
1984
|
+
margin-left: -0.04rem;
|
|
1985
|
+
color: color-mix(in srgb, var(--site-accent) 14%, var(--site-divider));
|
|
1986
|
+
opacity: 0.66;
|
|
1987
|
+
}
|
|
1988
|
+
|
|
1989
|
+
.feed-quote-content {
|
|
1990
|
+
font-family: var(--font-serif);
|
|
1991
|
+
color: var(--site-text-primary);
|
|
1992
|
+
font-size: clamp(1.34rem, 1.23rem + 0.44vw, 1.58rem);
|
|
1993
|
+
line-height: 1.36;
|
|
1994
|
+
letter-spacing: -0.02em;
|
|
1995
|
+
text-wrap: pretty;
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1998
|
+
.feed-quote-attribution {
|
|
1999
|
+
display: flex;
|
|
2000
|
+
align-items: center;
|
|
2001
|
+
gap: 0.45rem;
|
|
2002
|
+
flex-wrap: wrap;
|
|
2003
|
+
margin-top: 0.95rem;
|
|
2004
|
+
color: var(--site-text-secondary);
|
|
2005
|
+
font-size: 0.75rem;
|
|
2006
|
+
letter-spacing: 0.08em;
|
|
2007
|
+
line-height: 1.4;
|
|
2008
|
+
}
|
|
2009
|
+
|
|
2010
|
+
.feed-quote-attribution::before {
|
|
2011
|
+
content: "";
|
|
2012
|
+
width: 0.9rem;
|
|
2013
|
+
height: 1px;
|
|
2014
|
+
background: color-mix(in srgb, var(--site-text-secondary) 38%, var(--site-divider));
|
|
2015
|
+
}
|
|
2016
|
+
|
|
2017
|
+
.feed-quote-source {
|
|
2018
|
+
color: inherit;
|
|
2019
|
+
text-decoration: underline;
|
|
2020
|
+
text-decoration-color: color-mix(in srgb, var(--site-text-secondary) 55%, transparent);
|
|
2021
|
+
}
|
|
2022
|
+
|
|
2023
|
+
.feed-quote-commentary {
|
|
2024
|
+
position: relative;
|
|
2025
|
+
max-width: 34rem;
|
|
2026
|
+
margin-top: 1.1rem;
|
|
2027
|
+
padding-top: 0.95rem;
|
|
2028
|
+
color: color-mix(in srgb, var(--site-text-secondary) 84%, var(--site-text-primary));
|
|
2029
|
+
}
|
|
2030
|
+
|
|
2031
|
+
.feed-quote-commentary::before {
|
|
2032
|
+
content: "";
|
|
2033
|
+
position: absolute;
|
|
2034
|
+
left: 0;
|
|
2035
|
+
right: 0;
|
|
2036
|
+
top: 0;
|
|
2037
|
+
height: 1px;
|
|
2038
|
+
background: linear-gradient(
|
|
2039
|
+
90deg,
|
|
2040
|
+
transparent 0%,
|
|
2041
|
+
color-mix(in srgb, var(--site-divider) 48%, transparent) 16%,
|
|
2042
|
+
color-mix(in srgb, var(--site-divider) 78%, transparent) 50%,
|
|
2043
|
+
color-mix(in srgb, var(--site-divider) 48%, transparent) 84%,
|
|
2044
|
+
transparent 100%
|
|
2045
|
+
);
|
|
2046
|
+
}
|
|
2047
|
+
|
|
2048
|
+
.post-status-badges {
|
|
2049
|
+
display: none;
|
|
2050
|
+
align-items: center;
|
|
2051
|
+
gap: 6px;
|
|
2052
|
+
margin-bottom: 4px;
|
|
2053
|
+
font-size: 11px;
|
|
2054
|
+
font-weight: 500;
|
|
2055
|
+
letter-spacing: 0.05em;
|
|
2056
|
+
text-transform: uppercase;
|
|
2057
|
+
color: var(--site-text-placeholder);
|
|
2058
|
+
}
|
|
2059
|
+
|
|
2060
|
+
article[data-post-pinned] .post-status-badges,
|
|
2061
|
+
article[data-post-visibility="private"] .post-status-badges {
|
|
2062
|
+
display: flex;
|
|
2063
|
+
}
|
|
2064
|
+
|
|
2065
|
+
.post-status-badge {
|
|
2066
|
+
display: none;
|
|
2067
|
+
align-items: center;
|
|
2068
|
+
gap: 4px;
|
|
2069
|
+
}
|
|
2070
|
+
|
|
2071
|
+
article[data-post-pinned] .post-status-pinned,
|
|
2072
|
+
article[data-post-visibility="private"] .post-status-private {
|
|
2073
|
+
display: inline-flex;
|
|
2074
|
+
}
|
|
2075
|
+
|
|
2076
|
+
.post-status-badge svg {
|
|
2077
|
+
width: 12px;
|
|
2078
|
+
height: 12px;
|
|
2079
|
+
}
|
|
2080
|
+
|
|
2081
|
+
.post-footer-featured {
|
|
2082
|
+
display: none;
|
|
2083
|
+
align-items: center;
|
|
2084
|
+
justify-content: center;
|
|
2085
|
+
color: color-mix(in srgb, var(--search-mark-color) 72%, var(--site-text-secondary));
|
|
2086
|
+
--icon-stroke: 1.35;
|
|
2087
|
+
flex-shrink: 0;
|
|
2088
|
+
}
|
|
2089
|
+
|
|
2090
|
+
article[data-post-featured] .post-footer-featured {
|
|
2091
|
+
display: inline-flex;
|
|
2092
|
+
}
|
|
2093
|
+
|
|
2094
|
+
.post-footer-featured svg {
|
|
2095
|
+
width: 1.12rem;
|
|
2096
|
+
height: 1.12rem;
|
|
2097
|
+
opacity: 0.88;
|
|
2098
|
+
}
|
|
2099
|
+
|
|
2100
|
+
[data-page="featured"] article[data-post-featured] .post-footer-featured {
|
|
2101
|
+
display: none;
|
|
2102
|
+
}
|
|
2103
|
+
|
|
2104
|
+
.sr-only {
|
|
2105
|
+
position: absolute;
|
|
2106
|
+
width: 1px;
|
|
2107
|
+
height: 1px;
|
|
2108
|
+
padding: 0;
|
|
2109
|
+
margin: -1px;
|
|
2110
|
+
overflow: hidden;
|
|
2111
|
+
clip: rect(0, 0, 0, 0);
|
|
2112
|
+
white-space: nowrap;
|
|
2113
|
+
border: 0;
|
|
2114
|
+
}
|
|
2115
|
+
|
|
2116
|
+
.prose {
|
|
2117
|
+
max-width: 35rem;
|
|
2118
|
+
font-size: var(--type-body-size);
|
|
2119
|
+
line-height: var(--type-body-leading);
|
|
2120
|
+
letter-spacing: var(--type-body-tracking);
|
|
2121
|
+
color: var(--site-text-primary);
|
|
2122
|
+
}
|
|
2123
|
+
|
|
2124
|
+
.post-body-summary {
|
|
2125
|
+
color: color-mix(in srgb, var(--site-text-secondary) 88%, var(--site-text-primary));
|
|
2126
|
+
}
|
|
2127
|
+
|
|
2128
|
+
.prose > :first-child {
|
|
634
2129
|
margin-top: 0;
|
|
635
2130
|
}
|
|
636
2131
|
|
|
637
|
-
.
|
|
638
|
-
|
|
639
|
-
height: auto;
|
|
640
|
-
border-radius: 0.5rem;
|
|
2132
|
+
.prose > :last-child {
|
|
2133
|
+
margin-bottom: 0;
|
|
641
2134
|
}
|
|
642
2135
|
|
|
643
|
-
.
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
2136
|
+
.prose p {
|
|
2137
|
+
margin: 0;
|
|
2138
|
+
}
|
|
2139
|
+
|
|
2140
|
+
.prose p + p,
|
|
2141
|
+
.prose ul,
|
|
2142
|
+
.prose ol,
|
|
2143
|
+
.prose blockquote,
|
|
2144
|
+
.prose pre,
|
|
2145
|
+
.prose table,
|
|
2146
|
+
.prose figure {
|
|
2147
|
+
margin-top: 1.05rem;
|
|
2148
|
+
}
|
|
2149
|
+
|
|
2150
|
+
.prose :is(h1, h2, h3, h4) {
|
|
2151
|
+
margin: 1.25rem 0 0.35rem;
|
|
2152
|
+
font-family: var(--font-heading);
|
|
2153
|
+
font-weight: var(--type-heading-weight);
|
|
2154
|
+
line-height: var(--type-heading-leading);
|
|
2155
|
+
letter-spacing: var(--type-heading-tracking);
|
|
652
2156
|
}
|
|
653
2157
|
|
|
654
|
-
.
|
|
2158
|
+
.prose ul,
|
|
2159
|
+
.prose ol {
|
|
2160
|
+
padding-left: 1.3rem;
|
|
2161
|
+
}
|
|
2162
|
+
|
|
2163
|
+
.prose li {
|
|
2164
|
+
margin: 0.2rem 0;
|
|
2165
|
+
}
|
|
2166
|
+
|
|
2167
|
+
.prose blockquote {
|
|
2168
|
+
padding-left: 0.95rem;
|
|
2169
|
+
border-left: 2px solid color-mix(in srgb, var(--site-divider) 75%, transparent);
|
|
2170
|
+
color: var(--site-text-secondary);
|
|
2171
|
+
}
|
|
2172
|
+
|
|
2173
|
+
.prose code {
|
|
655
2174
|
font-family: var(--font-mono);
|
|
656
2175
|
font-size: 0.875em;
|
|
657
|
-
background: var(--
|
|
658
|
-
padding: 0.
|
|
659
|
-
border-radius: 0.
|
|
2176
|
+
background: color-mix(in srgb, var(--site-nav-hover-bg) 80%, transparent);
|
|
2177
|
+
padding: 0.1rem 0.35rem;
|
|
2178
|
+
border-radius: 0.32rem;
|
|
660
2179
|
}
|
|
661
2180
|
|
|
662
|
-
.
|
|
663
|
-
|
|
2181
|
+
.prose pre {
|
|
2182
|
+
overflow-x: auto;
|
|
2183
|
+
padding: 0.9rem 1rem;
|
|
2184
|
+
border-radius: 14px;
|
|
2185
|
+
border: 1px solid color-mix(in srgb, var(--site-divider) 82%, transparent);
|
|
2186
|
+
background: color-mix(in srgb, var(--site-nav-hover-bg) 78%, transparent);
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
.prose pre code {
|
|
2190
|
+
background: transparent;
|
|
664
2191
|
padding: 0;
|
|
665
2192
|
}
|
|
666
2193
|
|
|
667
|
-
.
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
margin: 0.75rem 0;
|
|
2194
|
+
.prose table {
|
|
2195
|
+
width: 100%;
|
|
2196
|
+
border-collapse: collapse;
|
|
2197
|
+
font-size: var(--text-sm);
|
|
672
2198
|
}
|
|
673
2199
|
|
|
674
|
-
.
|
|
675
|
-
.
|
|
676
|
-
|
|
677
|
-
|
|
2200
|
+
.prose th,
|
|
2201
|
+
.prose td {
|
|
2202
|
+
border: 1px solid color-mix(in srgb, var(--site-divider) 86%, transparent);
|
|
2203
|
+
padding: 0.45rem 0.7rem;
|
|
2204
|
+
text-align: left;
|
|
678
2205
|
}
|
|
679
2206
|
|
|
680
|
-
.
|
|
681
|
-
|
|
682
|
-
margin: 0.75rem 0;
|
|
2207
|
+
.prose th {
|
|
2208
|
+
background: color-mix(in srgb, var(--site-nav-hover-bg) 74%, transparent);
|
|
683
2209
|
}
|
|
684
2210
|
|
|
685
|
-
.
|
|
2211
|
+
.prose img,
|
|
2212
|
+
.prose video {
|
|
686
2213
|
width: 100%;
|
|
687
|
-
border-
|
|
688
|
-
margin: 0.75rem 0;
|
|
689
|
-
font-size: 0.875rem;
|
|
2214
|
+
border-radius: var(--media-radius);
|
|
690
2215
|
}
|
|
691
2216
|
|
|
692
|
-
.
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
2217
|
+
.prose figure[data-jant-node="image"] {
|
|
2218
|
+
margin-inline: 0;
|
|
2219
|
+
}
|
|
2220
|
+
|
|
2221
|
+
.prose figcaption {
|
|
2222
|
+
margin-top: 0.55rem;
|
|
2223
|
+
color: var(--site-text-secondary);
|
|
2224
|
+
font-size: var(--text-sm);
|
|
2225
|
+
}
|
|
2226
|
+
|
|
2227
|
+
[data-jant-node="attachments"] {
|
|
2228
|
+
display: grid;
|
|
2229
|
+
gap: 0.85rem;
|
|
2230
|
+
margin-top: 1rem;
|
|
696
2231
|
}
|
|
697
2232
|
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
2233
|
+
[data-jant-node="attachment"] {
|
|
2234
|
+
margin: 0;
|
|
2235
|
+
padding: 0.95rem;
|
|
2236
|
+
border: 1px solid color-mix(in srgb, var(--site-divider) 84%, transparent);
|
|
2237
|
+
border-radius: 16px;
|
|
2238
|
+
background: color-mix(in srgb, var(--site-nav-hover-bg) 66%, transparent);
|
|
2239
|
+
}
|
|
2240
|
+
|
|
2241
|
+
[data-jant-node="attachment"] > script[data-jant-meta] {
|
|
2242
|
+
display: none;
|
|
701
2243
|
}
|
|
702
2244
|
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
2245
|
+
[data-jant-node="attachment"][data-jant-kind="image"] {
|
|
2246
|
+
padding: 0;
|
|
2247
|
+
overflow: hidden;
|
|
2248
|
+
background: transparent;
|
|
707
2249
|
}
|
|
708
2250
|
|
|
709
|
-
|
|
710
|
-
|
|
2251
|
+
[data-jant-node="attachment"] audio,
|
|
2252
|
+
[data-jant-node="attachment"] video {
|
|
2253
|
+
width: 100%;
|
|
2254
|
+
}
|
|
2255
|
+
|
|
2256
|
+
[data-jant-node="attachment"] > a {
|
|
2257
|
+
display: inline-flex;
|
|
2258
|
+
font-weight: var(--fw-medium);
|
|
2259
|
+
text-decoration: none;
|
|
2260
|
+
}
|
|
2261
|
+
|
|
2262
|
+
[data-jant-node="attachment"][data-jant-kind="text"] details {
|
|
2263
|
+
width: 100%;
|
|
711
2264
|
}
|
|
712
2265
|
|
|
713
|
-
|
|
714
|
-
|
|
2266
|
+
[data-jant-node="attachment"][data-jant-kind="text"] summary {
|
|
2267
|
+
cursor: pointer;
|
|
2268
|
+
font-weight: var(--fw-medium);
|
|
715
2269
|
}
|
|
716
2270
|
|
|
717
|
-
|
|
718
|
-
|
|
2271
|
+
.jant-attachment-text-preview {
|
|
2272
|
+
margin-top: 0.85rem;
|
|
2273
|
+
}
|
|
2274
|
+
|
|
2275
|
+
.jant-attachment-text-preview > :first-child {
|
|
2276
|
+
margin-top: 0;
|
|
2277
|
+
}
|
|
2278
|
+
|
|
2279
|
+
.jant-attachment-text-preview > :last-child {
|
|
2280
|
+
margin-bottom: 0;
|
|
2281
|
+
}
|
|
2282
|
+
|
|
2283
|
+
.post-rating {
|
|
719
2284
|
display: flex;
|
|
2285
|
+
gap: 1px;
|
|
2286
|
+
margin-top: 8px;
|
|
2287
|
+
font-size: 14px;
|
|
2288
|
+
line-height: 1;
|
|
2289
|
+
}
|
|
2290
|
+
|
|
2291
|
+
.post-star-filled {
|
|
2292
|
+
color: oklch(0.75 0.15 70);
|
|
2293
|
+
}
|
|
2294
|
+
|
|
2295
|
+
.post-star-empty {
|
|
2296
|
+
color: var(--site-divider);
|
|
2297
|
+
}
|
|
2298
|
+
|
|
2299
|
+
.post-menu-footer {
|
|
2300
|
+
display: flex;
|
|
2301
|
+
justify-content: flex-start;
|
|
720
2302
|
align-items: center;
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
2303
|
+
margin-top: 0.9rem;
|
|
2304
|
+
}
|
|
2305
|
+
|
|
2306
|
+
.post-footer-detail {
|
|
2307
|
+
margin-top: 1.35rem;
|
|
2308
|
+
padding-top: 1rem;
|
|
2309
|
+
border-top: 1px solid color-mix(in srgb, var(--site-divider) 86%, transparent);
|
|
725
2310
|
}
|
|
726
2311
|
|
|
727
|
-
.post-
|
|
728
|
-
|
|
2312
|
+
.post-footer-meta {
|
|
2313
|
+
display: flex;
|
|
2314
|
+
align-items: center;
|
|
2315
|
+
gap: 5px;
|
|
2316
|
+
flex-wrap: wrap;
|
|
2317
|
+
line-height: 1.35;
|
|
2318
|
+
min-width: 0;
|
|
2319
|
+
}
|
|
2320
|
+
|
|
2321
|
+
.post-date-link {
|
|
2322
|
+
color: var(--site-text-secondary);
|
|
729
2323
|
text-decoration: none;
|
|
2324
|
+
font-size: 13px;
|
|
2325
|
+
white-space: nowrap;
|
|
2326
|
+
flex-shrink: 0;
|
|
730
2327
|
}
|
|
731
2328
|
|
|
732
|
-
.post-date:hover {
|
|
733
|
-
color: var(--
|
|
2329
|
+
.post-date-link:hover {
|
|
2330
|
+
color: var(--site-text-primary);
|
|
2331
|
+
text-decoration: underline;
|
|
734
2332
|
}
|
|
735
2333
|
|
|
736
|
-
.
|
|
737
|
-
|
|
2334
|
+
.post-footer-detail .post-date-link {
|
|
2335
|
+
font-size: inherit;
|
|
2336
|
+
}
|
|
2337
|
+
|
|
2338
|
+
.post-footer-external-link {
|
|
2339
|
+
display: inline-flex;
|
|
2340
|
+
align-items: center;
|
|
2341
|
+
justify-content: center;
|
|
2342
|
+
width: 0.9rem;
|
|
2343
|
+
height: 0.9rem;
|
|
2344
|
+
color: var(--site-text-secondary);
|
|
2345
|
+
flex-shrink: 0;
|
|
2346
|
+
}
|
|
2347
|
+
|
|
2348
|
+
.post-footer-external-link svg {
|
|
2349
|
+
width: 0.82rem;
|
|
2350
|
+
height: 0.82rem;
|
|
2351
|
+
}
|
|
2352
|
+
|
|
2353
|
+
.post-collection-tags {
|
|
2354
|
+
display: inline-flex;
|
|
2355
|
+
align-items: center;
|
|
2356
|
+
gap: 4px;
|
|
2357
|
+
font-size: 13px;
|
|
2358
|
+
min-width: 0;
|
|
2359
|
+
max-width: 100%;
|
|
2360
|
+
flex: 1 1 auto;
|
|
2361
|
+
}
|
|
2362
|
+
|
|
2363
|
+
.post-collection-sep {
|
|
2364
|
+
color: var(--site-text-secondary);
|
|
2365
|
+
}
|
|
2366
|
+
|
|
2367
|
+
.post-collection-tag {
|
|
2368
|
+
display: inline-block;
|
|
2369
|
+
color: var(--site-text-secondary);
|
|
738
2370
|
text-decoration: none;
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
2371
|
+
min-width: 0;
|
|
2372
|
+
max-width: min(100%, 22ch);
|
|
2373
|
+
overflow: hidden;
|
|
2374
|
+
text-overflow: ellipsis;
|
|
2375
|
+
white-space: nowrap;
|
|
743
2376
|
}
|
|
744
2377
|
|
|
745
|
-
.collection-tag:hover {
|
|
746
|
-
color: var(--
|
|
747
|
-
|
|
2378
|
+
.post-collection-tag:hover {
|
|
2379
|
+
color: var(--site-text-primary);
|
|
2380
|
+
text-decoration: underline;
|
|
748
2381
|
}
|
|
749
2382
|
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
2383
|
+
.post-collection-more-wrap {
|
|
2384
|
+
position: relative;
|
|
2385
|
+
display: inline-flex;
|
|
2386
|
+
align-items: center;
|
|
2387
|
+
flex-shrink: 0;
|
|
753
2388
|
}
|
|
754
2389
|
|
|
755
|
-
.post-
|
|
756
|
-
|
|
757
|
-
|
|
2390
|
+
.post-collection-more-wrap::after {
|
|
2391
|
+
content: "";
|
|
2392
|
+
position: absolute;
|
|
2393
|
+
top: 100%;
|
|
2394
|
+
left: -6px;
|
|
2395
|
+
right: -6px;
|
|
2396
|
+
height: 10px;
|
|
758
2397
|
}
|
|
759
2398
|
|
|
760
|
-
.post-
|
|
761
|
-
|
|
2399
|
+
.post-collection-more {
|
|
2400
|
+
display: inline-flex;
|
|
2401
|
+
align-items: center;
|
|
2402
|
+
background: none;
|
|
2403
|
+
border: none;
|
|
2404
|
+
padding: 0;
|
|
2405
|
+
font: inherit;
|
|
2406
|
+
font-size: inherit;
|
|
2407
|
+
color: var(--site-text-secondary);
|
|
2408
|
+
text-decoration: underline dotted;
|
|
2409
|
+
text-underline-offset: 2px;
|
|
2410
|
+
cursor: pointer;
|
|
2411
|
+
}
|
|
2412
|
+
|
|
2413
|
+
.post-collection-more-wrap:hover .post-collection-more,
|
|
2414
|
+
.post-collection-more-wrap:focus-within .post-collection-more {
|
|
2415
|
+
color: var(--site-text-primary);
|
|
2416
|
+
}
|
|
2417
|
+
|
|
2418
|
+
.post-collection-popover {
|
|
2419
|
+
display: none;
|
|
2420
|
+
position: absolute;
|
|
2421
|
+
top: calc(100% + 4px);
|
|
2422
|
+
left: 0;
|
|
2423
|
+
z-index: 50;
|
|
2424
|
+
flex-direction: column;
|
|
2425
|
+
min-width: 160px;
|
|
2426
|
+
padding: 4px;
|
|
2427
|
+
border-radius: 6px;
|
|
2428
|
+
background: var(--site-elevated-bg);
|
|
2429
|
+
border: 1px solid var(--site-divider);
|
|
2430
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2433
|
+
.post-collection-more-wrap:hover .post-collection-popover,
|
|
2434
|
+
.post-collection-more-wrap:focus-within .post-collection-popover {
|
|
2435
|
+
display: flex;
|
|
2436
|
+
}
|
|
2437
|
+
|
|
2438
|
+
.post-collection-popover-item {
|
|
2439
|
+
display: flex;
|
|
2440
|
+
align-items: center;
|
|
2441
|
+
gap: 6px;
|
|
2442
|
+
padding: 6px 8px;
|
|
2443
|
+
border-radius: 4px;
|
|
2444
|
+
font-size: 12px;
|
|
2445
|
+
color: var(--site-text-secondary);
|
|
2446
|
+
text-decoration: none;
|
|
2447
|
+
}
|
|
2448
|
+
|
|
2449
|
+
.post-collection-popover-item:hover {
|
|
2450
|
+
background: var(--site-nav-hover-bg);
|
|
2451
|
+
color: var(--site-text-primary);
|
|
2452
|
+
}
|
|
2453
|
+
|
|
2454
|
+
.section-shell {
|
|
2455
|
+
display: flex;
|
|
2456
|
+
flex-direction: column;
|
|
2457
|
+
gap: 1.15rem;
|
|
2458
|
+
}
|
|
2459
|
+
|
|
2460
|
+
.section-header {
|
|
2461
|
+
display: flex;
|
|
2462
|
+
flex-direction: column;
|
|
2463
|
+
gap: 0.45rem;
|
|
2464
|
+
}
|
|
2465
|
+
|
|
2466
|
+
.section-title {
|
|
2467
|
+
margin: 0;
|
|
2468
|
+
font-size: clamp(1.45rem, 1.3rem + 0.5vw, 1.85rem);
|
|
2469
|
+
font-weight: var(--fw-medium);
|
|
2470
|
+
line-height: 1.12;
|
|
2471
|
+
letter-spacing: -0.03em;
|
|
762
2472
|
}
|
|
763
2473
|
|
|
764
|
-
/* Section / Collection */
|
|
765
2474
|
.section-description {
|
|
766
|
-
|
|
767
|
-
|
|
2475
|
+
margin: 0;
|
|
2476
|
+
max-width: 38rem;
|
|
2477
|
+
color: var(--site-text-secondary);
|
|
768
2478
|
}
|
|
769
2479
|
|
|
770
2480
|
.collection-list {
|
|
771
|
-
|
|
2481
|
+
margin: 0;
|
|
772
2482
|
padding: 0;
|
|
2483
|
+
list-style: none;
|
|
2484
|
+
counter-reset: collection-list;
|
|
773
2485
|
}
|
|
774
2486
|
|
|
775
|
-
.collection-list
|
|
776
|
-
|
|
777
|
-
border-
|
|
2487
|
+
.collection-list-item {
|
|
2488
|
+
counter-increment: collection-list;
|
|
2489
|
+
border-top: 1px solid color-mix(in srgb, var(--site-divider) 84%, transparent);
|
|
778
2490
|
}
|
|
779
2491
|
|
|
780
|
-
.collection-list
|
|
781
|
-
|
|
782
|
-
|
|
2492
|
+
.collection-list-link {
|
|
2493
|
+
display: grid;
|
|
2494
|
+
grid-template-columns: 3.5ch minmax(0, 1fr);
|
|
2495
|
+
gap: 0.8rem;
|
|
2496
|
+
align-items: start;
|
|
2497
|
+
padding: 0.95rem 0;
|
|
2498
|
+
text-decoration: none;
|
|
783
2499
|
}
|
|
784
2500
|
|
|
785
|
-
|
|
786
|
-
|
|
2501
|
+
.collection-list-link:hover .collection-list-title {
|
|
2502
|
+
text-decoration: underline;
|
|
2503
|
+
}
|
|
2504
|
+
|
|
2505
|
+
.collection-list-link:hover .collection-list-sequence {
|
|
2506
|
+
color: var(--site-text-primary);
|
|
2507
|
+
}
|
|
2508
|
+
|
|
2509
|
+
.collection-list-sequence {
|
|
2510
|
+
display: block;
|
|
2511
|
+
width: 3.5ch;
|
|
2512
|
+
padding-top: 0.2rem;
|
|
2513
|
+
font-family: var(--font-mono);
|
|
2514
|
+
font-size: 0.68rem;
|
|
2515
|
+
font-variant-numeric: tabular-nums;
|
|
2516
|
+
line-height: 1.18;
|
|
2517
|
+
letter-spacing: 0.14em;
|
|
2518
|
+
color: var(--site-text-secondary);
|
|
2519
|
+
transition: color 0.15s ease;
|
|
2520
|
+
}
|
|
2521
|
+
|
|
2522
|
+
.collection-list-sequence::before {
|
|
2523
|
+
content: counter(collection-list, decimal-leading-zero);
|
|
2524
|
+
}
|
|
2525
|
+
|
|
2526
|
+
.collection-list-content {
|
|
2527
|
+
min-width: 0;
|
|
787
2528
|
display: flex;
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
2529
|
+
flex-direction: column;
|
|
2530
|
+
gap: 0.28rem;
|
|
2531
|
+
}
|
|
2532
|
+
|
|
2533
|
+
.collection-list-title {
|
|
2534
|
+
min-width: 0;
|
|
2535
|
+
display: inline-flex;
|
|
2536
|
+
align-items: center;
|
|
2537
|
+
gap: 0.45rem;
|
|
2538
|
+
font-family: var(--font-heading);
|
|
2539
|
+
font-size: clamp(1rem, 1.5vw, 1.12rem);
|
|
2540
|
+
font-weight: var(--fw-medium);
|
|
2541
|
+
line-height: 1.18;
|
|
2542
|
+
letter-spacing: -0.01em;
|
|
2543
|
+
}
|
|
2544
|
+
|
|
2545
|
+
.collection-list-meta {
|
|
2546
|
+
display: flex;
|
|
2547
|
+
flex-wrap: wrap;
|
|
2548
|
+
gap: 0.5rem 1rem;
|
|
2549
|
+
color: var(--site-text-secondary);
|
|
2550
|
+
font-size: var(--text-sm);
|
|
2551
|
+
}
|
|
2552
|
+
|
|
2553
|
+
.archive-shell {
|
|
2554
|
+
gap: 1.35rem;
|
|
2555
|
+
}
|
|
2556
|
+
|
|
2557
|
+
.archive-list {
|
|
2558
|
+
display: grid;
|
|
2559
|
+
gap: 0;
|
|
2560
|
+
}
|
|
2561
|
+
|
|
2562
|
+
.archive-month-group + .archive-month-group {
|
|
2563
|
+
margin-top: 1.35rem;
|
|
2564
|
+
}
|
|
2565
|
+
|
|
2566
|
+
.archive-month-heading {
|
|
2567
|
+
margin: 0 0 0.45rem;
|
|
2568
|
+
color: var(--site-text-secondary);
|
|
2569
|
+
font-size: 0.82rem;
|
|
2570
|
+
font-weight: var(--fw-medium);
|
|
2571
|
+
letter-spacing: 0.08em;
|
|
2572
|
+
text-transform: uppercase;
|
|
2573
|
+
}
|
|
2574
|
+
|
|
2575
|
+
.archive-entry {
|
|
2576
|
+
display: grid;
|
|
2577
|
+
grid-template-columns: minmax(6.75rem, auto) minmax(0, 1fr);
|
|
2578
|
+
gap: 0.9rem 1.25rem;
|
|
2579
|
+
align-items: start;
|
|
2580
|
+
padding: 0.9rem 0;
|
|
2581
|
+
border-top: 1px solid color-mix(in srgb, var(--site-divider) 84%, transparent);
|
|
2582
|
+
}
|
|
2583
|
+
|
|
2584
|
+
.archive-entry:first-child {
|
|
2585
|
+
border-top: none;
|
|
2586
|
+
padding-top: 0;
|
|
2587
|
+
}
|
|
2588
|
+
|
|
2589
|
+
.archive-entry-date {
|
|
2590
|
+
color: var(--site-text-secondary);
|
|
2591
|
+
font-size: var(--text-sm);
|
|
2592
|
+
line-height: 1.5;
|
|
2593
|
+
text-decoration: none;
|
|
2594
|
+
}
|
|
2595
|
+
|
|
2596
|
+
.archive-entry-main {
|
|
2597
|
+
min-width: 0;
|
|
2598
|
+
}
|
|
2599
|
+
|
|
2600
|
+
.archive-entry-title {
|
|
2601
|
+
display: inline-block;
|
|
2602
|
+
color: var(--site-text-primary);
|
|
2603
|
+
font-family: var(--font-heading);
|
|
2604
|
+
font-size: 1.03rem;
|
|
2605
|
+
font-weight: var(--type-heading-weight);
|
|
2606
|
+
line-height: 1.34;
|
|
2607
|
+
letter-spacing: var(--type-heading-tracking);
|
|
2608
|
+
text-decoration: none;
|
|
2609
|
+
text-wrap: pretty;
|
|
2610
|
+
}
|
|
2611
|
+
|
|
2612
|
+
.archive-entry-title:hover {
|
|
2613
|
+
text-decoration: underline;
|
|
2614
|
+
}
|
|
2615
|
+
|
|
2616
|
+
.archive-entry-meta {
|
|
2617
|
+
display: flex;
|
|
2618
|
+
align-items: center;
|
|
2619
|
+
gap: 0.45rem;
|
|
2620
|
+
flex-wrap: wrap;
|
|
2621
|
+
margin-top: 0.38rem;
|
|
2622
|
+
color: var(--site-text-secondary);
|
|
2623
|
+
font-size: 0.72rem;
|
|
2624
|
+
line-height: 1.45;
|
|
2625
|
+
letter-spacing: 0.06em;
|
|
2626
|
+
text-transform: uppercase;
|
|
2627
|
+
}
|
|
2628
|
+
|
|
2629
|
+
.archive-entry-format {
|
|
2630
|
+
opacity: 0.7;
|
|
2631
|
+
}
|
|
2632
|
+
|
|
2633
|
+
.archive-entry-tag {
|
|
2634
|
+
color: inherit;
|
|
2635
|
+
text-decoration: none;
|
|
2636
|
+
border-bottom: 0.5px solid color-mix(in srgb, var(--site-divider) 82%, transparent);
|
|
2637
|
+
}
|
|
2638
|
+
|
|
2639
|
+
.archive-entry-tag:hover {
|
|
2640
|
+
color: var(--site-text-primary);
|
|
2641
|
+
border-bottom-color: currentColor;
|
|
2642
|
+
}
|
|
2643
|
+
|
|
2644
|
+
.pagination {
|
|
2645
|
+
display: grid;
|
|
2646
|
+
grid-template-columns: 1fr auto 1fr;
|
|
2647
|
+
align-items: center;
|
|
2648
|
+
gap: 1rem;
|
|
2649
|
+
padding: 2rem 0 0.5rem;
|
|
2650
|
+
}
|
|
2651
|
+
|
|
2652
|
+
.pagination-side-end {
|
|
2653
|
+
text-align: right;
|
|
2654
|
+
}
|
|
2655
|
+
|
|
2656
|
+
.pagination-center {
|
|
2657
|
+
text-align: center;
|
|
2658
|
+
}
|
|
2659
|
+
|
|
2660
|
+
.pagination-link {
|
|
2661
|
+
color: var(--site-text-secondary);
|
|
2662
|
+
text-decoration: underline;
|
|
2663
|
+
}
|
|
2664
|
+
|
|
2665
|
+
.pagination-link:hover {
|
|
2666
|
+
color: var(--site-text-primary);
|
|
2667
|
+
}
|
|
2668
|
+
|
|
2669
|
+
.pagination-label {
|
|
2670
|
+
color: var(--site-text-secondary);
|
|
2671
|
+
font-size: var(--text-sm);
|
|
791
2672
|
}
|
|
792
2673
|
|
|
793
|
-
/* Footer */
|
|
794
2674
|
.site-footer {
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
2675
|
+
max-width: var(--site-width);
|
|
2676
|
+
margin: var(--space-xl) auto 0;
|
|
2677
|
+
padding: 0 var(--site-padding) var(--space-xl);
|
|
2678
|
+
color: var(--site-text-secondary);
|
|
2679
|
+
font-size: var(--text-sm);
|
|
2680
|
+
}
|
|
2681
|
+
|
|
2682
|
+
.site-footer > .site-container {
|
|
2683
|
+
border-top: 0.5px solid var(--site-divider);
|
|
2684
|
+
padding-top: var(--content-gap);
|
|
2685
|
+
}
|
|
2686
|
+
|
|
2687
|
+
.home-branding-credit {
|
|
2688
|
+
margin-top: var(--space-xl);
|
|
798
2689
|
text-align: center;
|
|
799
|
-
|
|
800
|
-
|
|
2690
|
+
color: var(--site-text-secondary);
|
|
2691
|
+
font-size: var(--text-sm);
|
|
2692
|
+
}
|
|
2693
|
+
|
|
2694
|
+
.home-branding-credit a {
|
|
2695
|
+
display: inline-flex;
|
|
2696
|
+
align-items: center;
|
|
2697
|
+
gap: 0.38rem;
|
|
2698
|
+
color: inherit;
|
|
2699
|
+
text-decoration: none;
|
|
2700
|
+
border-bottom: 0.5px solid
|
|
2701
|
+
color-mix(in srgb, var(--site-text-secondary) 45%, transparent);
|
|
2702
|
+
}
|
|
2703
|
+
|
|
2704
|
+
.home-branding-credit a svg {
|
|
2705
|
+
width: 1rem;
|
|
2706
|
+
height: 1rem;
|
|
2707
|
+
flex: none;
|
|
2708
|
+
}
|
|
2709
|
+
|
|
2710
|
+
@media (min-width: 700px) {
|
|
2711
|
+
.site-header {
|
|
2712
|
+
padding-top: 30px;
|
|
2713
|
+
}
|
|
2714
|
+
|
|
2715
|
+
.site-header-top-bordered {
|
|
2716
|
+
padding-bottom: 18px;
|
|
2717
|
+
}
|
|
2718
|
+
}
|
|
2719
|
+
|
|
2720
|
+
@media (max-width: 699px) {
|
|
2721
|
+
:root {
|
|
2722
|
+
--site-padding: 1.875rem;
|
|
2723
|
+
}
|
|
2724
|
+
|
|
2725
|
+
.site-header-right {
|
|
2726
|
+
width: 100%;
|
|
2727
|
+
justify-content: flex-start;
|
|
2728
|
+
}
|
|
2729
|
+
|
|
2730
|
+
.site-header-nav {
|
|
2731
|
+
justify-content: flex-start;
|
|
2732
|
+
}
|
|
2733
|
+
}
|
|
2734
|
+
|
|
2735
|
+
@media (max-width: 640px) {
|
|
2736
|
+
.archive-entry {
|
|
2737
|
+
grid-template-columns: 1fr;
|
|
2738
|
+
gap: 0.3rem;
|
|
2739
|
+
}
|
|
2740
|
+
|
|
2741
|
+
.pagination {
|
|
2742
|
+
grid-template-columns: 1fr;
|
|
2743
|
+
gap: 0.55rem;
|
|
2744
|
+
}
|
|
2745
|
+
|
|
2746
|
+
.pagination-side-end,
|
|
2747
|
+
.pagination-center {
|
|
2748
|
+
text-align: left;
|
|
2749
|
+
}
|
|
801
2750
|
}
|
|
802
2751
|
`;
|