jekyll-obsidian-site 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -0
  3. data/website/_includes/website/action-icon.html +12 -0
  4. data/website/_includes/website/archive-card-footer.html +7 -0
  5. data/website/_includes/website/archive-day-ui.html +5 -0
  6. data/website/_includes/website/archive-day.html +18 -0
  7. data/website/_includes/website/archive-export.html +63 -0
  8. data/website/_includes/website/archive-facets.html +16 -0
  9. data/website/_includes/website/archive-pagination.html +14 -0
  10. data/website/_includes/website/archive-timeline.html +15 -3
  11. data/website/_includes/website/blog-ledger.html +8 -3
  12. data/website/_includes/website/dialogs.html +1 -0
  13. data/website/_includes/website/favorite-button.html +6 -0
  14. data/website/_includes/website/favorites-ui.html +13 -0
  15. data/website/_includes/website/head.html +2 -0
  16. data/website/_includes/website/header.html +17 -3
  17. data/website/_includes/website/language-switcher.html +2 -3
  18. data/website/_includes/website/note-facets.html +6 -0
  19. data/website/_includes/website/note-header.html +5 -4
  20. data/website/_includes/website/note-properties.html +27 -0
  21. data/website/_includes/website/note-source.html +1 -0
  22. data/website/_includes/website/page-actions.html +3 -2
  23. data/website/_includes/website/post-cards.html +1 -1
  24. data/website/_includes/website/related-articles.html +1 -1
  25. data/website/_includes/website/system-page.html +11 -2
  26. data/website/_layouts/website-docs.html +1 -1
  27. data/website/_layouts/website-minimal.html +17 -8
  28. data/website/assets/archive-worker-WS545WIE.js +1 -0
  29. data/website/assets/chunks/{abnfDiagram-VCTEODGH-OU4PDJTH.js → abnfDiagram-WEYOIA3C-Z5V7NHNW.js} +1 -1
  30. data/website/assets/chunks/architecture-WOLXFQ4H-BZVX64AA.js +1 -0
  31. data/website/assets/chunks/{architectureDiagram-5GKGNRK7-CT6FS55V.js → architectureDiagram-ZHVYKT53-3Q3V5WBD.js} +1 -1
  32. data/website/assets/chunks/blockDiagram-RJAE7QA3-OAF7LPDQ.js +140 -0
  33. data/website/assets/chunks/c4Diagram-XDPPPE54-EJWLHA47.js +38 -0
  34. data/website/assets/chunks/chunk-25KVF5ZE.js +1 -0
  35. data/website/assets/chunks/{chunk-L555IGF7.js → chunk-4W4OQ3QY.js} +1 -1
  36. data/website/assets/chunks/{chunk-LGUG3SQB.js → chunk-5CCFYMCF.js} +1 -1
  37. data/website/assets/chunks/{chunk-SZDFKH2A.js → chunk-6UFWKTSA.js} +1 -1
  38. data/website/assets/chunks/chunk-76QEHT4T.js +1 -0
  39. data/website/assets/chunks/chunk-7UAUSQAK.js +3 -0
  40. data/website/assets/chunks/chunk-A7665WVC.js +1 -0
  41. data/website/assets/chunks/{chunk-ITQXB6AD.js → chunk-ATQQWCXO.js} +2 -2
  42. data/website/assets/chunks/chunk-BYAY7DUZ.js +213 -0
  43. data/website/assets/chunks/{chunk-ZJL56Z2W.js → chunk-EGQTNACA.js} +1 -1
  44. data/website/assets/chunks/{chunk-2FH2VGIK.js → chunk-ELAEHAWT.js} +1 -1
  45. data/website/assets/chunks/{chunk-URIQ3D3O.js → chunk-FBC3PYSO.js} +1 -1
  46. data/website/assets/chunks/chunk-FBK4QOLY.js +72 -0
  47. data/website/assets/chunks/chunk-FYWMKRRX.js +1 -0
  48. data/website/assets/chunks/chunk-GTVNUHF4.js +129 -0
  49. data/website/assets/chunks/chunk-HIGPS4L2.js +1 -0
  50. data/website/assets/chunks/{chunk-35JADD5X.js → chunk-HP75Y56I.js} +2 -2
  51. data/website/assets/chunks/chunk-IEWJFRV2.js +1 -0
  52. data/website/assets/chunks/{chunk-PWHKWCQI.js → chunk-IFVMCECG.js} +1 -1
  53. data/website/assets/chunks/chunk-JXSDAMOW.js +1 -0
  54. data/website/assets/chunks/{chunk-EYF5ACJS.js → chunk-KIPOWFBM.js} +1 -1
  55. data/website/assets/chunks/chunk-KNYDPLLK.js +1 -0
  56. data/website/assets/chunks/chunk-KOVRICJQ.js +2 -0
  57. data/website/assets/chunks/{chunk-D3WOCELE.js → chunk-KY2Z6HIV.js} +1 -1
  58. data/website/assets/chunks/chunk-L465623K.js +136 -0
  59. data/website/assets/chunks/chunk-MGH5TWGB.js +1 -0
  60. data/website/assets/chunks/chunk-MMD2CHZ4.js +1 -0
  61. data/website/assets/chunks/chunk-ODUIGMTT.js +62 -0
  62. data/website/assets/chunks/chunk-OEBMYWCF.js +1 -0
  63. data/website/assets/chunks/{chunk-K4TOTONK.js → chunk-P2OPVFT2.js} +1 -1
  64. data/website/assets/chunks/chunk-PHKIAKHS.js +1 -0
  65. data/website/assets/chunks/chunk-PHW75MPZ.js +1 -0
  66. data/website/assets/chunks/chunk-QV32QYTD.js +1 -0
  67. data/website/assets/chunks/chunk-R3AIO6OV.js +12 -0
  68. data/website/assets/chunks/{chunk-COIHDRVA.js → chunk-RV7WQMNL.js} +1 -1
  69. data/website/assets/chunks/{chunk-22DRK7VS.js → chunk-STBOPOHX.js} +1 -1
  70. data/website/assets/chunks/{chunk-BAF7ZGRF.js → chunk-T3FZWEYV.js} +1 -1
  71. data/website/assets/chunks/chunk-TMMWB6NQ.js +1 -0
  72. data/website/assets/chunks/{chunk-PQ6FROJI.js → chunk-TPW5CADB.js} +1 -1
  73. data/website/assets/chunks/{chunk-M7VBR5K3.js → chunk-TSOLLCID.js} +1 -1
  74. data/website/assets/chunks/chunk-TWGPYWIY.js +1 -0
  75. data/website/assets/chunks/{chunk-2PPLC5NE.js → chunk-WGMEMLED.js} +1 -1
  76. data/website/assets/chunks/chunk-XPCWLWWI.js +10 -0
  77. data/website/assets/chunks/{chunk-ERWOH47R.js → chunk-YM6ZMZQI.js} +1 -1
  78. data/website/assets/chunks/{chunk-DRG54Y2Z.js → chunk-YPZM5QAW.js} +1 -1
  79. data/website/assets/chunks/classDiagram-v2-4MYWR3UA-TBKN4UUY.js +217 -0
  80. data/website/assets/chunks/{cose-bilkent-JH36ORCC-CBAW64AB.js → cose-bilkent-JH36ORCC-L6EPO3KG.js} +1 -1
  81. data/website/assets/chunks/cynefin-EF2NZ3EQ-ZO5PPXJG.js +1 -0
  82. data/website/assets/chunks/{cynefinDiagram-5FMLGOSQ-GZKFFLZN.js → cynefinDiagram-WF24UDRP-NQI7F564.js} +1 -1
  83. data/website/assets/chunks/dagre-NK4GIZVX-JD2M5C6I.js +4 -0
  84. data/website/assets/chunks/{diagram-VX7I27RA-6WJ53KBV.js → diagram-CBK3MWTC-D4ZSERBO.js} +1 -1
  85. data/website/assets/chunks/diagram-I5XIIV2D-HIOQ6A3G.js +24 -0
  86. data/website/assets/chunks/{diagram-S7CK7UJ4-TCDFSNWA.js → diagram-ODIL2UCW-MSREDQ6B.js} +1 -1
  87. data/website/assets/chunks/diagram-PFBEJUXE-JPKSKRIC.js +3 -0
  88. data/website/assets/chunks/{diagram-UQ7AKVKN-FU734FBG.js → diagram-RJA3I4VV-IQ6632CB.js} +1 -1
  89. data/website/assets/chunks/diagram-TYUNFSNR-P5IKS3A3.js +200 -0
  90. data/website/assets/chunks/{ebnfDiagram-PWID7BFC-EVS7HXMP.js → ebnfDiagram-V4P3TTPT-VCZMC4YS.js} +1 -1
  91. data/website/assets/chunks/elk-QONTBCTQ-7AW4R5PK.js +27 -0
  92. data/website/assets/chunks/erDiagram-KYQIGQAA-V4LOTM3S.js +99 -0
  93. data/website/assets/chunks/eventmodeling-K75KTNOO-3JNV4VSP.js +1 -0
  94. data/website/assets/chunks/flowDiagram-IUGLLWBU-4HYSLWMD.js +1 -0
  95. data/website/assets/chunks/ganttDiagram-R7GPNTJY-AEVHODOA.js +292 -0
  96. data/website/assets/chunks/gitGraph-VSP46ZUC-HSAXKLAG.js +1 -0
  97. data/website/assets/chunks/{gitGraphDiagram-WWUBYQGX-UUT2JAWH.js → gitGraphDiagram-PDYL7XHY-LKBXIKVR.js} +1 -1
  98. data/website/assets/chunks/info-OHQRW6UA-C4R2B34T.js +1 -0
  99. data/website/assets/chunks/infoDiagram-MVDRKAX5-IIV27ROL.js +2 -0
  100. data/website/assets/chunks/{ishikawaDiagram-5VMMS53U-LQCRZM4N.js → ishikawaDiagram-HPEHV2GE-JSVZLZDP.js} +1 -1
  101. data/website/assets/chunks/{journeyDiagram-EYS64GPL-ARGKJZNY.js → journeyDiagram-BOSHW7O7-JVAKMGRK.js} +2 -2
  102. data/website/assets/chunks/{kanban-definition-3QL26DDD-WN2QPMN2.js → kanban-definition-FNSA4HC5-7RQQNTOF.js} +4 -4
  103. data/website/assets/chunks/katex-VDQVCUUS.js +257 -0
  104. data/website/assets/chunks/mindmap-definition-6OY57UG3-NRMVR6UI.js +98 -0
  105. data/website/assets/chunks/packet-JDAUHWVQ-SFUSDIUN.js +1 -0
  106. data/website/assets/chunks/{pegDiagram-XKGWAZYB-I4QEC3KT.js → pegDiagram-ECIUJNBX-BUG53OMT.js} +1 -1
  107. data/website/assets/chunks/pie-XZMESJXO-M76QC4CD.js +1 -0
  108. data/website/assets/chunks/{pieDiagram-E7YTZNPT-G3B6SDV5.js → pieDiagram-GNMPY74T-KK6VNPAE.js} +1 -1
  109. data/website/assets/chunks/{quadrantDiagram-AXDQQJYC-AMN42RJV.js → quadrantDiagram-D57K4MC3-6R7AY2OK.js} +1 -1
  110. data/website/assets/chunks/radar-ABXABTNO-HSBJ6SSD.js +1 -0
  111. data/website/assets/chunks/railroad-I3PHUGI6-4QJMJ7LG.js +1 -0
  112. data/website/assets/chunks/railroad-abnf-LNEFI6M7-ZLNZ5ZRH.js +1 -0
  113. data/website/assets/chunks/railroad-ebnf-DWYD2UWJ-EBV6ZOUW.js +1 -0
  114. data/website/assets/chunks/railroad-peg-JR7BVNR7-X3E47TO7.js +1 -0
  115. data/website/assets/chunks/{railroadDiagram-O6MQD6OU-EZOKVSPX.js → railroadDiagram-Y72NRBL7-G6YI4UOP.js} +1 -1
  116. data/website/assets/chunks/requirementDiagram-EQYSW5RA-FGXZYHEV.js +84 -0
  117. data/website/assets/chunks/{sankeyDiagram-P5KCCOFB-MMUBGJQ6.js → sankeyDiagram-SY24JHO5-7JCOYDKS.js} +1 -1
  118. data/website/assets/chunks/sequenceDiagram-BLEHNHQU-R5TBDEQR.js +169 -0
  119. data/website/assets/chunks/{sizeCapture-X5ZJPWSS-LRN2Q37T.js → sizeCapture-INFHLROL-2GUJIKNX.js} +1 -1
  120. data/website/assets/chunks/stateDiagram-v2-A6IESKWZ-PS2LTOBE.js +291 -0
  121. data/website/assets/chunks/swimlanes-B3ENRKFQ-T4ANUYE5.js +1 -0
  122. data/website/assets/chunks/swimlanesDiagram-AYQRV4AK-CMBJIT6P.js +8 -0
  123. data/website/assets/chunks/timeline-definition-JXYKGLGB-NKTZVLAN.js +120 -0
  124. data/website/assets/chunks/treeView-D4JQ5SDB-3BQHZUCI.js +1 -0
  125. data/website/assets/chunks/treemap-SAJKECNS-6NJPJ5NM.js +1 -0
  126. data/website/assets/chunks/usecaseDiagram-WPOLBNNX-23KYIREC.js +370 -0
  127. data/website/assets/chunks/vennDiagram-Q3Y3IDCW-7K3XRLKC.js +34 -0
  128. data/website/assets/chunks/wardley-7MLQ67FV-ITOM4KQ2.js +1 -0
  129. data/website/assets/chunks/{wardleyDiagram-VM6X3IG4-L2CEA7QT.js → wardleyDiagram-IVAIDKWA-FBDWJFKS.js} +1 -1
  130. data/website/assets/chunks/xychartDiagram-4URNHDU4-OY3ZRRWP.js +7 -0
  131. data/website/assets/docs-4DKXPRKN.css +1 -0
  132. data/website/assets/docs-PANVBLCJ.js +1 -0
  133. data/website/assets/{docs-navigation-75ALFYBA.js → docs-navigation-BBZLZHQB.js} +1 -1
  134. data/website/assets/{graph-QWL54LWD.js → graph-F3JLZWW5.js} +1 -1
  135. data/website/assets/manifest.json +249 -241
  136. data/website/assets/{math-7JTH4OWZ.js → math-OBBMUDQO.js} +1 -1
  137. data/website/assets/mermaid-DLWPGV5J.js +10 -0
  138. data/website/assets/minimal-ERLB42UD.css +1 -0
  139. data/website/assets/minimal-YXGMMLS2.js +1 -0
  140. data/website/assets/{previews-FMHOX7UX.js → previews-MG7MTTYB.js} +1 -1
  141. data/website/assets/{search-BH73JZDU.js → search-7PCXY7J6.js} +1 -1
  142. data/website/assets/{search-worker-SM4IM4J7.js → search-worker-NAOYHDP3.js} +1 -1
  143. data/website/lib/jekyll_obsidian/adapter.rb +31 -7
  144. data/website/lib/jekyll_obsidian/archive_chronology.rb +25 -0
  145. data/website/lib/jekyll_obsidian/built_in_themes.rb +153 -47
  146. data/website/lib/jekyll_obsidian/external_media.rb +36 -2
  147. data/website/lib/jekyll_obsidian/front_matter.rb +46 -22
  148. data/website/lib/jekyll_obsidian/github_markdown.rb +11 -2
  149. data/website/lib/jekyll_obsidian/initializer.rb +2 -2
  150. data/website/lib/jekyll_obsidian/localized_compiler.rb +151 -17
  151. data/website/lib/jekyll_obsidian/note_properties.rb +55 -0
  152. data/website/lib/jekyll_obsidian/paged_archive.rb +166 -0
  153. data/website/lib/jekyll_obsidian/recommendations.rb +38 -0
  154. data/website/lib/jekyll_obsidian/site_compilation.rb +1 -1
  155. data/website/lib/jekyll_obsidian/site_navigation.rb +18 -7
  156. data/website/lib/jekyll_obsidian/template_filters.rb +10 -0
  157. data/website/lib/jekyll_obsidian/value_objects.rb +17 -2
  158. data/website/lib/jekyll_obsidian/vault_compiler.rb +193 -33
  159. data/website/lib/jekyll_obsidian/version.rb +1 -1
  160. data/website/lib/jekyll_obsidian.rb +3 -0
  161. data/website/scripts/audit-site.rb +2 -1
  162. data/website/scripts/verify-site-urls.rb +26 -4
  163. metadata +132 -112
  164. data/website/assets/chunks/architecture-7GRP2DOG-WR4J3MHE.js +0 -1
  165. data/website/assets/chunks/blockDiagram-NRAW4CY4-5CVGAMKU.js +0 -129
  166. data/website/assets/chunks/c4Diagram-UCG6FXSJ-7Y4NF5HE.js +0 -38
  167. data/website/assets/chunks/chunk-2WCXLVGM.js +0 -1
  168. data/website/assets/chunks/chunk-6DHFEWGX.js +0 -1
  169. data/website/assets/chunks/chunk-AIP7LMD7.js +0 -231
  170. data/website/assets/chunks/chunk-AZ6FDGM4.js +0 -72
  171. data/website/assets/chunks/chunk-CFGJEOK2.js +0 -10
  172. data/website/assets/chunks/chunk-FV7Y537P.js +0 -1
  173. data/website/assets/chunks/chunk-HW4P3P4O.js +0 -1
  174. data/website/assets/chunks/chunk-HWSCLZVP.js +0 -1
  175. data/website/assets/chunks/chunk-KFLO3E3A.js +0 -1
  176. data/website/assets/chunks/chunk-M25J4D4B.js +0 -1
  177. data/website/assets/chunks/chunk-NTHIXMIH.js +0 -1
  178. data/website/assets/chunks/chunk-NXJDXKGT.js +0 -127
  179. data/website/assets/chunks/chunk-OH6E2W57.js +0 -206
  180. data/website/assets/chunks/chunk-OITSMTQA.js +0 -1
  181. data/website/assets/chunks/chunk-PNHXFBTK.js +0 -168
  182. data/website/assets/chunks/chunk-PXIZ62XP.js +0 -3
  183. data/website/assets/chunks/chunk-QJN2KBYF.js +0 -161
  184. data/website/assets/chunks/chunk-QQX3GM2R.js +0 -2
  185. data/website/assets/chunks/chunk-SZDMZNUS.js +0 -1
  186. data/website/assets/chunks/chunk-THS5ZMK3.js +0 -62
  187. data/website/assets/chunks/chunk-U3NFKVGZ.js +0 -1
  188. data/website/assets/chunks/chunk-UE533OZ7.js +0 -1
  189. data/website/assets/chunks/chunk-UZNLKM6V.js +0 -1
  190. data/website/assets/chunks/chunk-W2REJJP3.js +0 -1
  191. data/website/assets/chunks/classDiagram-DTDB5LWJ-KRHX3MYA.js +0 -1
  192. data/website/assets/chunks/classDiagram-v2-JRS7N3AN-FNTLF4PW.js +0 -1
  193. data/website/assets/chunks/cynefin-OW5HDTMX-6DAYGPVS.js +0 -1
  194. data/website/assets/chunks/dagre-3AP2YEHR-GFYLDEQN.js +0 -4
  195. data/website/assets/chunks/diagram-VSXAHHWV-PU7IO46N.js +0 -3
  196. data/website/assets/chunks/diagram-Z3DM3KII-CCDRNCWA.js +0 -24
  197. data/website/assets/chunks/erDiagram-SSCWMZ5O-S2RURZGV.js +0 -99
  198. data/website/assets/chunks/eventmodeling-NTZA5JFV-HFG5RFT7.js +0 -1
  199. data/website/assets/chunks/flowDiagram-A5DVABFB-J2SQ43NC.js +0 -1
  200. data/website/assets/chunks/ganttDiagram-EL5Y4UJY-ZAKZHTA4.js +0 -292
  201. data/website/assets/chunks/gitGraph-4MIJSDKK-XWFQLYIG.js +0 -1
  202. data/website/assets/chunks/info-A6RAGUB7-KBMDBELO.js +0 -1
  203. data/website/assets/chunks/infoDiagram-RXCK75RN-7CO2V3PS.js +0 -2
  204. data/website/assets/chunks/katex-F4MQ6FB3.js +0 -257
  205. data/website/assets/chunks/mindmap-definition-FBJOCRG2-MK6C6W2Q.js +0 -96
  206. data/website/assets/chunks/packet-AYTQ26CC-KHVWPOQA.js +0 -1
  207. data/website/assets/chunks/pie-WAS4IAKB-XXFHNSP7.js +0 -1
  208. data/website/assets/chunks/radar-RG4KPBEZ-63DWSAYS.js +0 -1
  209. data/website/assets/chunks/railroad-74A4TZTK-HFEBED3O.js +0 -1
  210. data/website/assets/chunks/railroad-abnf-HS5TGJTU-FOAJXW7P.js +0 -1
  211. data/website/assets/chunks/railroad-ebnf-LZEXJU2U-VWTDRX7F.js +0 -1
  212. data/website/assets/chunks/railroad-peg-WCYAUIDC-3T4MTFYX.js +0 -1
  213. data/website/assets/chunks/requirementDiagram-EFPCY7ZU-LXEG7ZII.js +0 -84
  214. data/website/assets/chunks/sequenceDiagram-WJ2MYXX4-KKEIULGL.js +0 -162
  215. data/website/assets/chunks/stateDiagram-HBIQ2CUA-PEJFE6QD.js +0 -1
  216. data/website/assets/chunks/stateDiagram-v2-4QOOHH4V-JXTFO73D.js +0 -1
  217. data/website/assets/chunks/swimlanes-XN3QIQJK-NVPQ7BHW.js +0 -1
  218. data/website/assets/chunks/swimlanesDiagram-VK2B7HYN-FTJB72QR.js +0 -8
  219. data/website/assets/chunks/timeline-definition-24CTP7MA-JS3ZJC3A.js +0 -120
  220. data/website/assets/chunks/treeView-Q6P3EWNA-Y4PVEKJ7.js +0 -1
  221. data/website/assets/chunks/treemap-WGGIJYW6-F3A3Q7KG.js +0 -1
  222. data/website/assets/chunks/vennDiagram-4TSXK5OY-X5JIA6UD.js +0 -34
  223. data/website/assets/chunks/wardley-WFR3VGLG-ULY27NYD.js +0 -1
  224. data/website/assets/chunks/xychartDiagram-S5SC5T6Z-5FGNXXC2.js +0 -7
  225. data/website/assets/docs-3WBBQT6K.css +0 -1
  226. data/website/assets/docs-6N6MOJWK.js +0 -1
  227. data/website/assets/mermaid-X23HPJFT.js +0 -10
  228. data/website/assets/minimal-CIHTGS3G.js +0 -1
  229. data/website/assets/minimal-E2VATXXS.css +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81413764127f5b6cc8fb2123f4f68bb669062c6511fb77400fa23ee9116b43fb
4
- data.tar.gz: a33023b2844130c939fedde35a14bd631654ffd8e8154ebdb939df1bd98d592f
3
+ metadata.gz: f16353061e7c9dbc1bd8ccc320c4d41394ceaec57021ab1be99d0b4dd6ae9b95
4
+ data.tar.gz: c2c4d7a212662548f7c107066f7208bde3981922b239149c51743c3235251ce4
5
5
  SHA512:
6
- metadata.gz: 8665670ae7ddd964ee0127460fd69d514c8db82f23152eec55cce2631c8c7d448077253719e7a199ba47646e138e0145c6c66077547305fde1d6390c735131e8
7
- data.tar.gz: ccc38e42d5639ad8ce02544496961ecc513ad2ee2faa70343c8e2b818c11d28419cfa52f8e9fb89f2e62cf7985baeef93598f84b8bb85cc6a61a66b14f2d1feb
6
+ metadata.gz: 7a0e7cda9f1a2a3cb4b6532c5b614a163067ca7bd5825413cfefea3477cc477f783ded6304c2d516e911d318ca8a9faa9711c821795ee5d0cb504d4736a29751
7
+ data.tar.gz: 76ae44e9f496c8af5675e6c7c8dd4b2cb4fb3f21c2794798bbf325db906951c5df67c4e8ed6a6665585c17e24fc9fa9d8b11fbfd1f3d9f13e1b514134af68b43
data/README.md CHANGED
@@ -14,6 +14,7 @@ Choose one built-in theme for each build:
14
14
  Both themes enable search, wiki-link reading previews, the page outline, note relations, and an interactive local graph by default. A note participating in a link or embed relation with another public note keeps its local graph at the top of the right-hand context rail; isolated and self-link-only notes omit it. Its two controls open the complete public graph or an expanded view of the current note's neighbourhood. The complete graph still contains every public note, and `/graph/` is not a generated route.
15
15
 
16
16
  Switching themes does not change note URLs.
17
+ Both themes use compact header icons with accessible names and hover hints. Supported local files and HTTPS media embed in notes, including native audio/video, PDFs, YouTube, Bilibili, Vimeo and X. See [Syntax](website/jekyll-obsidian-docs/docs/Syntax.md) for formats and examples. Paged archives show up to five nearby page links and accept a page number for direct navigation.
17
18
  The default build and deployment theme is `minimal`. Both themes can publish locale overlays from `_translations/<locale>/` and attach GitHub Discussions comments to posts. When the corresponding mapping is present and omits `enabled`, localization defaults on only for `docs`, while comments default on only for `minimal`.
18
19
 
19
20
  See [Localization](website/jekyll-obsidian-docs/docs/Localization.md) for locale manifests, which content controls site structure, fallback pages, and SEO behavior.
@@ -128,6 +129,12 @@ Build for another host with `jekyll-obsidian build --url https://example.com --b
128
129
 
129
130
  Contributors can continue with the [Developer Guide](website/jekyll-obsidian-docs/docs/development/index.md).
130
131
 
132
+ Native Windows contributors can use RubyInstaller Ruby+Devkit 4.0.6, Bundler 4.0.16 and Node 26. The Developer Guide includes PowerShell build and archive-test commands. The full Ruby suite runs with `bundle exec rake test`. Directory-link tests use junctions when Windows symbolic-link privileges are unavailable; only file-link tests and filenames unsupported by Windows are skipped, with explicit reasons. Preview tests isolate and stop their own child process.
133
+
134
+ ## Recommendations and collection archives
135
+
136
+ Supply expiring article recommendations through a vault-root `_recommendations.json`, or declare an archive tab with `tab.layout: archive` for scoped dates, topics, and pagination. See [Customization](website/jekyll-obsidian-docs/docs/Customization.md#expiring-recommendations) for the recommendation format and [Custom tabs](website/jekyll-obsidian-docs/docs/Customization.md#custom-tabs) for archive settings.
137
+
131
138
  ## License
132
139
 
133
140
  MIT
@@ -0,0 +1,12 @@
1
+ <svg class="site-action__icon{% if include.class %} {{ include.class }}{% endif %}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
2
+ {% case include.name %}
3
+ {% when 'search' %}<circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 4.5 4.5"/>
4
+ {% when 'export' %}<path d="M12 3v12m-4-4 4 4 4-4M5 15v5h14v-5"/>
5
+ {% when 'language' %}<path d="M3 5h12M9 3v2M6 5c1 5 4 8 8 10M12 5c-1 5-4 8-8 10M13 21l4-10 4 10M14.5 17h5"/>
6
+ {% when 'sun' %}<circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M2 12h2m16 0h2M5 5l1.5 1.5m11 11L19 19M5 19l1.5-1.5m11-11L19 5"/>
7
+ {% when 'moon' %}<path d="M20.5 13A8.5 8.5 0 0 1 11 3.5 8.5 8.5 0 1 0 20.5 13Z"/>
8
+ {% when 'reading' %}<path d="M12 5c-3-2-7-2-10-1v15c3-1 7-1 10 1 3-2 7-2 10-1V4c-3-1-7-1-10 1Zm0 0v15"/><path class="site-action__reading-check" d="m15 11 2 2 3-4"/>
9
+ {% when 'previous' %}<path d="m14 6-6 6 6 6"/>
10
+ {% when 'next' %}<path d="m10 6 6 6-6 6"/>
11
+ {% endcase %}
12
+ </svg>
@@ -0,0 +1,7 @@
1
+ <footer class="archive-card-footer">
2
+ <ul class="blog-ledger__topics" aria-label="{{ ui.sources | default: 'Sources' | escape }} / {{ ui.topics | default: 'Topics' | escape }}">
3
+ {% for tag in include.post.archive_facets %}<li><a href="{{ blog_url | escape }}?{{ tag.facet | url_encode }}={{ tag.id | url_encode }}" data-archive-facet="{{ tag.facet | escape }}" data-archive-value="{{ tag.id | escape }}">{{ tag.name | escape }}</a></li>{% endfor %}
4
+ </ul>
5
+ {% if include.post.source_url %}<a class="archive-source-url" href="{{ include.post.source_url | escape }}" rel="noopener noreferrer">{{ include.post.source_url | escape }}</a>{% endif %}
6
+ {% if include.post.date_basis == 'observed' %}<small>{{ ui.first_observed | default: 'First observed' | escape }}</small>{% endif %}
7
+ </footer>
@@ -0,0 +1,5 @@
1
+ {% capture ledger_date_default %}{month} {day}{% endcapture %}
2
+ {% capture ledger_date_year_default %}{month} {day}, {year}{% endcapture %}
3
+ {% capture ledger_entry_default %}{count} entry{% endcapture %}
4
+ {% capture ledger_entries_default %}{count} entries{% endcapture %}
5
+ <template data-ledger-day-ui data-date="{{ ui.ledger_date | default: ledger_date_default | escape }}" data-date-year="{{ ui.ledger_date_year | default: ledger_date_year_default | escape }}" data-months="{{ ui.ledger_months | default: 'January|February|March|April|May|June|July|August|September|October|November|December' | escape }}" data-weekdays="{{ ui.ledger_weekdays | default: 'Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday' | escape }}" data-entry="{{ ui.ledger_entry | default: ledger_entry_default | escape }}" data-entries="{{ ui.ledger_entries | default: ledger_entries_default | escape }}" data-undated="{{ ui.undated | default: 'Undated' | escape }}"></template>
@@ -0,0 +1,18 @@
1
+ {% assign group = include.group %}
2
+ {% assign day_label = ui.undated | default: 'Undated' %}
3
+ {% if group.day %}
4
+ {% assign months = ui.ledger_months | default: 'January|February|March|April|May|June|July|August|September|October|November|December' | split: '|' %}
5
+ {% assign weekdays = ui.ledger_weekdays | default: 'Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday' | split: '|' %}
6
+ {% assign month_index = group.day.month | minus: 1 %}
7
+ {% assign date_format = ui.ledger_date | default: '{month} {day}' %}
8
+ {% unless group.day.year == page.website.theme_data.ledger_current_year %}{% assign date_format = ui.ledger_date_year | default: '{month} {day}, {year}' %}{% endunless %}
9
+ {% comment %}Insert the month last so localized names remain literal text.{% endcomment %}
10
+ {% assign day_label = date_format | replace: '{year}', group.day.year | replace: '{day}', group.day.day | replace_literal: '{month}', months[month_index] %}
11
+ {% endif %}
12
+ {% assign count_format = ui.ledger_entries | default: '{count} entries' %}
13
+ {% if group.posts.size == 1 %}{% assign count_format = ui.ledger_entry | default: '{count} entry' %}{% endif %}
14
+ {% assign day_count = count_format | replace: '{count}', group.posts.size %}
15
+ <details class="archive-day" data-ledger-day="{{ group.label | escape }}" data-ledger-default-open="{{ group.open }}"{% if group.open %} open{% endif %}>
16
+ <summary><h2>{% if group.day %}<time datetime="{{ group.label | escape }}">{{ day_label | escape }}</time>{% else %}{{ day_label | escape }}{% endif %}</h2><span class="archive-day__arrow" aria-hidden="true"></span><span class="archive-day__meta">{% if group.day %}<span>{{ weekdays[group.day.weekday] | escape }}</span> · {% endif %}<span data-ledger-day-count>{{ day_count | escape }}</span></span></summary>
17
+ {% include website/blog-ledger.html posts=group.posts compact=true filterable=true %}
18
+ </details>
@@ -0,0 +1,63 @@
1
+ {% capture export_limit_default %}Choose no more than {days} days, including both dates.{% endcapture %}
2
+ {% capture export_limit_hint_default %}Up to {days} days, including both dates.{% endcapture %}
3
+ {% capture export_matches_default %}{count} entries to export{% endcapture %}
4
+ {% capture export_progress_default %}Preparing {done} of {count} entries…{% endcapture %}
5
+ {% capture export_failed_default %}{count} entries could not be loaded. Retry to download the complete file.{% endcapture %}
6
+ {% capture export_complete_default %}Downloaded {count} entries.{% endcapture %}
7
+ {% capture export_too_many_default %}{count} matching entries; export up to {limit} at a time. Narrow the dates or filters.{% endcapture %}
8
+ <dialog class="website-dialog archive-export" id="archive-export-dialog" data-dialog="export" aria-labelledby="archive-export-title"
9
+ data-site="{{ site.title | escape }}"
10
+ data-download="{{ ui.export_download | default: 'Download Markdown' | escape }}"
11
+ data-all="{{ ui.all | default: 'All' | escape }}"
12
+ data-sources="{{ ui.sources | default: 'Sources' | escape }}"
13
+ data-topics="{{ ui.topics | default: 'Topics' | escape }}"
14
+ data-dates="{{ ui.export_dates | default: 'Date range' | escape }}"
15
+ data-entries="{{ ui.export_entries | default: 'Entries' | escape }}"
16
+ data-date="{{ ui.export_date | default: 'Date' | escape }}"
17
+ data-original="{{ ui.original | default: 'Original' | escape }}"
18
+ data-article="{{ ui.export_article | default: 'Article' | escape }}"
19
+ data-required="{{ ui.export_required | default: 'Choose a start and end date.' | escape }}"
20
+ data-invalid="{{ ui.export_invalid | default: 'Enter valid dates.' | escape }}"
21
+ data-order="{{ ui.export_order | default: 'The end date must be on or after the start date.' | escape }}"
22
+ data-limit="{{ ui.export_limit | default: export_limit_default | escape }}"
23
+ data-limit-hint="{{ ui.export_limit_hint | default: export_limit_hint_default | escape }}"
24
+ data-calculating="{{ ui.export_calculating | default: 'Finding matching entries…' | escape }}"
25
+ data-matches="{{ ui.export_matches | default: export_matches_default | escape }}"
26
+ data-empty="{{ ui.export_empty | default: 'No matching entries. Adjust the dates or filters.' | escape }}"
27
+ data-unavailable="{{ ui.export_unavailable | default: 'Could not prepare the export. Retry to continue.' | escape }}"
28
+ data-progress="{{ ui.export_progress | default: export_progress_default | escape }}"
29
+ data-loading-cards="{{ ui.export_loading_cards | default: 'Loading entry details…' | escape }}"
30
+ data-too-many="{{ ui.export_too_many | default: export_too_many_default | escape }}"
31
+ data-too-large="{{ ui.export_too_large | default: 'The export is too large. Narrow the dates or filters.' | escape }}"
32
+ data-failed="{{ ui.export_failed | default: export_failed_default | escape }}"
33
+ data-complete="{{ ui.export_complete | default: export_complete_default | escape }}"
34
+ data-cancelled="{{ ui.export_cancelled | default: 'Export cancelled.' | escape }}"
35
+ data-updated="{{ ui.export_updated | default: 'The site changed. Review the updated selection before downloading.' | escape }}">
36
+ <div class="website-dialog__sheet">
37
+ <header class="website-dialog__header">
38
+ <h2 class="website-dialog__title" id="archive-export-title">{{ ui.export_title | default: 'Export Markdown' | escape }}</h2>
39
+ <button class="website-dialog__close" type="button" data-dialog-close aria-label="{{ ui.export_close | default: 'Close export' | escape }}">&times;</button>
40
+ </header>
41
+ <div class="website-dialog__body">
42
+ <p class="archive-export__intro">{{ ui.export_description | default: 'Combine matching entries into one Markdown file.' | escape }}</p>
43
+ <fieldset class="archive-export__fields" data-export-fields disabled>
44
+ <legend class="visually-hidden">{{ ui.export_filters | default: 'Export filters' | escape }}</legend>
45
+ <div class="archive-export__dates">
46
+ <label>{{ ui.export_start | default: 'Start date' | escape }}<input type="date" required data-export-start aria-describedby="archive-export-limit"></label>
47
+ <label>{{ ui.export_end | default: 'End date' | escape }}<input type="date" required data-export-end aria-describedby="archive-export-limit"></label>
48
+ </div>
49
+ <p class="archive-export__hint" id="archive-export-limit" data-export-limit></p>
50
+ <div class="archive-export__facets" data-export-facets></div>
51
+ </fieldset>
52
+ </div>
53
+ <footer class="archive-export__footer">
54
+ <p data-export-status role="status" aria-live="polite"></p>
55
+ <progress data-export-progress hidden aria-label="{{ ui.export_title | default: 'Export Markdown' | escape }}"></progress>
56
+ <div class="archive-export__actions">
57
+ <button type="button" data-export-cancel hidden>{{ ui.export_cancel | default: 'Cancel export' | escape }}</button>
58
+ <button type="button" data-export-retry hidden>{{ ui.retry | default: 'Retry' | escape }}</button>
59
+ <button type="button" data-export-download disabled>{{ ui.export_download | default: 'Download Markdown' | escape }}</button>
60
+ </div>
61
+ </footer>
62
+ </div>
63
+ </dialog>
@@ -0,0 +1,16 @@
1
+ {% assign archive = page.website.theme_data.archive %}
2
+ {% for group in archive.facets %}
3
+ {% if group[1].size == 0 %}{% continue %}{% endif %}
4
+ {% if page.website.theme_data.tab_id and group[0] == 'source' and group[1].size == 1 %}
5
+ {% assign only_source = group[1] | first %}
6
+ {% if only_source.count == archive.total %}{% continue %}{% endif %}
7
+ {% endif %}
8
+ {% assign facet_label = group[0] %}
9
+ {% if group[0] == 'source' %}{% assign facet_label = ui.sources | default: 'Sources' %}{% elsif group[0] == 'topic' %}{% assign facet_label = ui.topics | default: 'Topics' %}{% endif %}
10
+ <nav class="tag-filter archive-facet" aria-label="{{ facet_label | escape }}">
11
+ <h2 class="archive-facet-label">{{ facet_label | escape }}</h2>
12
+ <ul class="tag-filter__list"><li><button class="tag-chip" type="button" data-archive-facet="{{ group[0] | escape }}" data-archive-value="" aria-pressed="true">{{ ui.all | default: 'All' | escape }} <span>{{ archive.total }}</span></button></li>
13
+ {% for option in group[1] %}<li><button class="tag-chip" type="button" data-archive-facet="{{ group[0] | escape }}" data-archive-value="{{ option.id | escape }}" aria-pressed="false">{{ option.name | escape }} <span>{{ option.count }}</span></button></li>{% endfor %}</ul>
14
+ </nav>
15
+ {% endfor %}
16
+ <p class="filter-empty" data-archive-empty hidden>{{ ui.no_matching_entries | default: 'No entries match these filters.' | escape }} <button type="button" data-archive-clear>{{ ui.clear_filters | default: 'Clear filters' | escape }}</button></p>
@@ -0,0 +1,14 @@
1
+ <nav class="archive-pagination" aria-label="{{ ui.pagination | default: 'Pagination' | escape }}" data-archive-pagination data-page-label="{{ ui.page_label | escape }}" data-result-label="{{ ui.archive_results | escape }}" data-number-label="{{ ui.page_number | escape }}" data-jump-error="{{ ui.page_jump_error | escape }}">
2
+ <span data-archive-page-status aria-live="polite" aria-atomic="true"></span>
3
+ <div class="archive-pagination__navigation">
4
+ <button type="button" data-archive-page="prev" aria-label="{{ ui.previous | default: 'Previous' | escape }}" title="{{ ui.previous | default: 'Previous' | escape }}" disabled>{% include website/action-icon.html name='previous' class='archive-pagination__arrow' %}<span>{{ ui.previous | default: 'Previous' | escape }}</span></button>
5
+ <div class="archive-pagination__numbers" data-archive-page-numbers></div>
6
+ <button type="button" data-archive-page="next" aria-label="{{ ui.next | default: 'Next' | escape }}" title="{{ ui.next | default: 'Next' | escape }}"{% if page.website.theme_data.archive.total <= page.website.theme_data.archive.page_size %} disabled{% endif %}>{% include website/action-icon.html name='next' class='archive-pagination__arrow' %}<span>{{ ui.next | default: 'Next' | escape }}</span></button>
7
+ </div>
8
+ <form class="archive-pagination__jump" data-archive-page-jump hidden>
9
+ <label><span class="visually-hidden">{{ ui.page_input | default: 'Page number' | escape }}</span><input type="number" inputmode="numeric" min="1" step="1" required disabled></label>
10
+ <button type="submit">{{ ui.page_go | default: 'Go' | escape }}</button>
11
+ </form>
12
+ </nav>
13
+ <p role="status" aria-live="polite" data-archive-status data-loading="{{ ui.archive_loading | default: 'Loading selected entries…' | escape }}" data-unavailable="{{ ui.archive_unavailable | default: 'Selected entries could not be loaded. Retry or clear the filters.' | escape }}" data-refresh-error="{{ ui.archive_refresh_error | escape }}"></p>
14
+ <button type="button" data-archive-retry hidden>{{ ui.retry | default: 'Retry' | escape }}</button>
@@ -1,8 +1,20 @@
1
- {% if include.timeline and include.timeline.size > 0 %}
1
+ {% if include.timeline and include.timeline.size > 0 or page.website.theme_data.favorites %}
2
2
  {% assign ui = page.website.i18n.messages %}
3
3
  {% if page.website.theme == 'minimal' %}{% assign filter_url = page.website.routes.blog %}{% unless filter_url %}{% assign filter_url = '/blog/' | relative_url %}{% endunless %}{% else %}{% assign filter_url = page.website.routes.tags %}{% unless filter_url %}{% assign filter_url = '/tags/' | relative_url %}{% endunless %}{% endif %}
4
- <nav class="archive-timeline" data-timeline-nav aria-labelledby="archive-timeline-title">
4
+ {% if page.website.theme_data.archive %}{% assign filter_url = page.website.href %}{% endif %}
5
+ <nav class="archive-timeline" data-timeline-nav aria-labelledby="archive-timeline-title"{% if page.website.theme_data.favorites %} hidden{% endif %}>
5
6
  <h2 class="relation-section__title" id="archive-timeline-title">{{ ui.chronology | default: 'Chronology' | escape }}</h2>
6
- {% for group in include.timeline %}<section class="archive-timeline__year"><h3><a href="{{ filter_url | escape }}?year={{ group.year | url_encode }}" data-year-filter-option data-filter-year="{{ group.year | escape }}"><span>{{ group.year | escape }}</span><span class="archive-timeline__count">{{ group.count }}</span></a></h3><ul>{% for month in group.months %}<li><a href="{{ filter_url | escape }}?month={{ month.key | url_encode }}" data-month-filter-option data-filter-month="{{ month.key | escape }}"><span>{{ month.label | escape }}</span><span class="archive-timeline__count">{{ month.count }}</span></a></li>{% endfor %}</ul></section>{% endfor %}
7
+ {% for group in include.timeline %}
8
+ <section class="archive-timeline__year{% if group.days %} archive-timeline__year--days{% endif %}">
9
+ <h3><a href="{{ filter_url | escape }}?year={{ group.year | url_encode }}" data-year-filter-option data-filter-year="{{ group.year | escape }}"><span>{{ group.year | escape }}</span><span class="archive-timeline__count">{{ group.count }}</span></a></h3>
10
+ <ul>
11
+ {% if group.days %}
12
+ {% for day in group.days %}<li><a href="{{ filter_url | escape }}?day={{ day.key | url_encode }}" data-day-filter-option data-filter-day="{{ day.key | escape }}"><span>{{ day.label | escape }}</span><span class="archive-timeline__count">{{ day.count }}</span></a></li>{% endfor %}
13
+ {% else %}
14
+ {% for month in group.months %}<li><a href="{{ filter_url | escape }}?month={{ month.key | url_encode }}" data-month-filter-option data-filter-month="{{ month.key | escape }}"><span>{{ month.label | escape }}</span><span class="archive-timeline__count">{{ month.count }}</span></a></li>{% endfor %}
15
+ {% endif %}
16
+ </ul>
17
+ </section>
18
+ {% endfor %}
7
19
  </nav>
8
20
  {% endif %}
@@ -1,15 +1,20 @@
1
1
  {% if include.posts and include.posts.size > 0 %}
2
2
  {% assign ui = page.website.i18n.messages %}
3
3
  {% assign blog_url = page.website.routes.blog %}{% unless blog_url %}{% assign blog_url = '/blog/' | relative_url %}{% endunless %}
4
+ {% if page.website.theme_data.archive %}{% assign blog_url = page.website.href %}{% endif %}
4
5
  <section class="blog-ledger"{% if include.compact %} aria-label="{{ ui.dated_posts | default: 'Dated posts' | escape }}"{% else %} aria-labelledby="dispatches-title"{% endif %}>
5
6
  {% unless include.compact %}<header class="section-heading"><h2 id="dispatches-title">{{ ui.field_dispatches | default: 'Field dispatches' | escape }}</h2></header>{% endunless %}
6
7
  <ol>
7
8
  {% for post in include.posts %}
8
- <li{% if include.filterable %} data-filter-item data-topic-anchors="{{ post.topic_anchors | join: ' ' | escape }}"{% if post.filter_month %} data-filter-month="{{ post.filter_month | escape }}"{% endif %}{% endif %}>
9
- <div class="blog-ledger__meta"><time datetime="{{ post.published_at | escape }}">{{ post.published_at | date: "%Y-%m-%d" }}</time></div>
9
+ <li{% if include.filterable %} data-filter-item data-topic-anchors="{{ post.topic_anchors | join: ' ' | escape }}"{% if post.filter_month %} data-filter-month="{{ post.filter_month | escape }}"{% endif %}{% if post.filter_day %} data-filter-day="{{ post.filter_day | escape }}"{% endif %}{% endif %}>
10
+ {% unless page.website.theme_data.ledger_group_by == 'day' %}<div class="blog-ledger__meta"><time datetime="{{ post.published_at | escape }}">{% if post.display_date %}{{ post.display_date | escape }}{% else %}{{ post.published_at | date: "%Y-%m-%d" }}{% endif %}</time></div>{% endunless %}
10
11
  <div class="blog-ledger__content">
12
+ {% if page.website.features.favorites %}<div class="blog-ledger__heading">{% endif %}
11
13
  <a class="blog-ledger__main" href="{{ post.url | escape }}"><strong>{{ post.title | escape }}</strong>{% if post.summary and post.summary != '' %}<span class="blog-ledger__description">{{ post.summary | escape }}</span>{% endif %}</a>
12
- {% if post.topics and post.topics.size > 0 %}<ul class="blog-ledger__topics" aria-label="{{ ui.topics | default: 'Topics' | escape }}">{% for topic in post.topics %}<li><a href="{{ blog_url | escape }}?topic={{ topic.anchor | url_encode }}" data-topic-filter-option data-topic-anchor="{{ topic.anchor | escape }}">{{ topic.name | escape }}</a></li>{% endfor %}</ul>{% endif %}
14
+ {% include website/favorite-button.html card=post.favorite_card %}
15
+ {% if page.website.features.favorites %}</div>{% endif %}
16
+ {% if post.archive_facets %}{% include website/archive-card-footer.html post=post %}{% endif %}
17
+ {% unless post.archive_facets %}{% if post.topics and post.topics.size > 0 %}<ul class="blog-ledger__topics" aria-label="{{ ui.topics | default: 'Topics' | escape }}">{% for topic in post.topics %}<li><a href="{{ blog_url | escape }}?topic={{ topic.anchor | url_encode }}" data-topic-filter-option data-topic-anchor="{{ topic.anchor | escape }}">{{ topic.name | escape }}</a></li>{% endfor %}</ul>{% endif %}{% endunless %}
13
18
  </div>
14
19
  </li>
15
20
  {% endfor %}
@@ -1,4 +1,5 @@
1
1
  {% assign ui = page.website.i18n.messages %}
2
+ {% if page.website.theme_data.archive %}{% include website/archive-export.html %}{% endif %}
2
3
  {% if page.website.features.search %}
3
4
  <dialog class="website-dialog" data-dialog="search" aria-labelledby="search-dialog-title"{% if ui.search_loading %} data-search-loading="{{ ui.search_loading | escape }}"{% endif %}{% if ui.search_prompt %} data-search-prompt="{{ ui.search_prompt | escape }}"{% endif %}{% if ui.search_unavailable %} data-search-unavailable="{{ ui.search_unavailable | escape }}"{% endif %}{% if ui.search_no_results %} data-search-no-results="{{ ui.search_no_results | escape }}"{% endif %}{% if ui.search_result_one %} data-search-result-one="{{ ui.search_result_one | escape }}"{% endif %}{% if ui.search_result_many %} data-search-result-many="{{ ui.search_result_many | escape }}"{% endif %}>
4
5
  <div class="website-dialog__sheet">
@@ -0,0 +1,6 @@
1
+ {% assign favorite = include.card %}
2
+ {% if page.website.features.favorites and favorite %}
3
+ <button class="favorite-button" type="button" data-favorite-toggle data-favorite-card="{{ favorite | jsonify | escape }}" data-favorite-id="{{ favorite.id | escape }}" aria-pressed="false" aria-label="{{ ui.favorite_save | default: 'Save' | escape }}: {{ favorite.title | escape }}" hidden>
4
+ <svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 3h10v14l-5-3-5 3z"></path></svg><span data-favorite-label>{{ ui.favorite_save | default: 'Save' | escape }}</span>
5
+ </button>
6
+ {% endif %}
@@ -0,0 +1,13 @@
1
+ {% if page.website.features.favorites %}
2
+ <div data-favorites-ui data-save="{{ ui.favorite_save | default: 'Save' | escape }}" data-remove="{{ ui.favorite_remove | default: 'Remove favorite' | escape }}" data-saved="{{ ui.favorite_saved | default: 'Saved' | escape }}" data-empty="{{ ui.favorites_empty | default: 'No favorites yet. Save an entry to find it here.' | escape }}" data-error="{{ ui.favorite_storage_error | escape }}" data-damaged="{{ ui.favorite_storage_damaged | escape }}" data-unreadable="{{ ui.favorite_storage_unreadable | escape }}" data-unsupported="{{ ui.favorite_storage_unsupported | escape }}" data-quota="{{ ui.favorite_storage_quota | escape }}" data-blocked="{{ ui.favorite_storage_blocked | escape }}" data-removed="{{ ui.favorite_removed_article | escape }}" data-refresh-error="{{ ui.favorites_refresh_error | escape }}" data-undated="{{ ui.undated | default: 'Undated' | escape }}" data-recovery-restored="{{ ui.favorite_recovery_restored | escape }}" data-recovery-cleared="{{ ui.favorite_recovery_cleared | escape }}" data-recovery-required="{{ ui.favorite_recovery_required | escape }}"></div>
3
+ <p class="favorite-status" role="status" aria-live="polite" data-favorite-status></p>
4
+ <details class="favorites-recovery" data-favorites-recovery hidden>
5
+ <summary>{{ ui.favorite_recovery_title | default: 'Recovery copies' | escape }}</summary>
6
+ <p>{{ ui.favorite_recovery_description | escape }}</p>
7
+ <div class="favorites-recovery__actions">
8
+ <button type="button" data-favorite-recovery="download">{{ ui.favorite_recovery_download | default: 'Download original data' | escape }}</button>
9
+ <button type="button" data-favorite-recovery="restore">{{ ui.favorite_recovery_restore | default: 'Restore available favorites' | escape }}</button>
10
+ <button type="button" data-favorite-recovery="clear">{{ ui.favorite_recovery_clear | default: 'Clear recovery copies' | escape }}</button>
11
+ </div>
12
+ </details>
13
+ {% endif %}
@@ -1,6 +1,7 @@
1
1
  <meta charset="utf-8">
2
2
  <meta name="viewport" content="width=device-width, initial-scale=1">
3
3
  <meta name="color-scheme" content="light dark">
4
+ {% if page.website.features.favorites %}<meta name="website:favorites-scope" content="{{ page.website.favorites_scope | escape }}">{% endif %}
4
5
  {% if page.website.comments.load %}
5
6
  <meta http-equiv="Content-Security-Policy" data-page-csp content="default-src 'self'; base-uri 'self'; form-action 'self'; script-src 'self'{% for source in page.website.content_security.script_sources %} {{ source | escape }}{% endfor %} https://giscus.app; style-src 'self' 'unsafe-inline' https://giscus.app; img-src 'self' https:; media-src 'self'{% for source in page.website.content_security.media_sources %} {{ source | escape }}{% endfor %}; object-src 'self'; font-src 'self'; connect-src 'self'{% for source in page.website.content_security.connect_sources %} {{ source | escape }}{% endfor %}; frame-src 'self'{% for source in page.website.content_security.frame_sources %} {{ source | escape }}{% endfor %} https://giscus.app">
6
7
  {% else %}
@@ -27,6 +28,7 @@
27
28
  {% if page.website.features.feed and site.data.website_feed_available %}<link rel="alternate" type="application/atom+xml" title="{{ site.title | escape }} · {{ page.website.i18n.messages.feed | default: 'Feed' | escape }}" href="{% if page.website.resources.feed %}{{ page.website.resources.feed | escape }}{% else %}{{ '/feed.xml' | relative_url }}{% endif %}">{% endif %}
28
29
  {% if page.website.comments.load %}<meta name="giscus:backlink" content="{{ page.website.absolute_url | escape }}" data-page-head>{% endif %}
29
30
  {% assign website_entry = include.entry %}
31
+ {% if website_entry.archive_worker and page.website.theme_data.archive %}{% assign archive_worker = '/assets/website/' | append: website_entry.archive_worker %}<meta name="website:archive-worker" content="{{ archive_worker | relative_url }}">{% endif %}
30
32
  {% if website_entry.color_scheme %}
31
33
  {% assign color_scheme_js = '/assets/website/' | append: website_entry.color_scheme %}
32
34
  <script src="{{ color_scheme_js | relative_url }}"></script>
@@ -21,15 +21,29 @@
21
21
  </nav>
22
22
 
23
23
  <div class="site-actions">
24
+ {% if page.website.theme_data.archive %}
25
+ <button class="site-action archive-reading-switch" type="button" role="switch" aria-checked="false" aria-controls="archive-ledger" aria-label="{{ ui.flat_reading | default: 'Read in full' | escape }}" title="{{ ui.flat_reading_disabled | escape }}" data-enabled="{{ ui.flat_reading_enabled | escape }}" data-disabled="{{ ui.flat_reading_disabled | escape }}" data-archive-reading-toggle hidden data-loading="{{ ui.reading_loading | default: 'Loading article…' | escape }}" data-unavailable="{{ ui.reading_unavailable | default: 'Article could not be loaded.' | escape }}" data-retry="{{ ui.retry | default: 'Retry' | escape }}">
26
+ {% include website/action-icon.html name='reading' %}
27
+ </button>
28
+ {% unless page.website.theme_data.favorites %}<button class="site-action" type="button" data-archive-export-open aria-label="{{ ui.export | default: 'Export' | escape }}" title="{{ ui.export | default: 'Export' | escape }}" aria-haspopup="dialog" aria-controls="archive-export-dialog" hidden>{% include website/action-icon.html name='export' %}</button>{% endunless %}
29
+ {% endif %}
24
30
  {% if page.website.features.search %}
25
- <button class="site-action" type="button" data-search-open aria-label="{{ ui.search | default: 'Search' | escape }}">
26
- <span class="site-action__label">{{ ui.search | default: 'Search' | escape }}</span><kbd class="site-action__shortcut" aria-hidden="true">⌘K</kbd>
31
+ <button class="site-action" type="button" data-search-open aria-label="{{ ui.search | default: 'Search' | escape }}" title="{{ ui.search | default: 'Search' | escape }} (Ctrl/⌘ K)" aria-keyshortcuts="Control+k Meta+k">
32
+ {% include website/action-icon.html name='search' %}
27
33
  </button>
28
34
  {% endif %}
29
35
  {% include website/language-switcher.html %}
30
36
  <button class="site-action" type="button" data-color-scheme-toggle data-scheme-use-light="{{ ui.use_light_scheme | default: 'Use light color scheme' | escape }}" data-scheme-use-dark="{{ ui.use_dark_scheme | default: 'Use dark color scheme' | escape }}" data-scheme-light="{{ ui.light_scheme | default: 'Light' | escape }}" data-scheme-dark="{{ ui.dark_scheme | default: 'Dark' | escape }}" aria-label="{{ ui.toggle_scheme | default: 'Toggle color scheme' | escape }}">
31
- <span data-color-scheme-label>{{ ui.scheme | default: 'Scheme' | escape }}</span>
37
+ {% include website/action-icon.html name='moon' class='site-action__moon' %}
38
+ {% include website/action-icon.html name='sun' class='site-action__sun' %}
39
+ <span class="visually-hidden" data-color-scheme-label>{{ ui.scheme | default: 'Scheme' | escape }}</span>
32
40
  </button>
41
+ {% if page.website.repository_url %}
42
+ {% assign repository_label = ui.open_project_on_github | default: 'Open {title} on GitHub' | replace: '{title}', site.title %}
43
+ <a class="site-action site-action--github" href="{{ page.website.repository_url | escape }}" aria-label="{{ repository_label | escape }}" title="{{ repository_label | escape }}">
44
+ {% include website/github-icon.html %}
45
+ </a>
46
+ {% endif %}
33
47
  </div>
34
48
  </div>
35
49
  </header>
@@ -1,9 +1,8 @@
1
1
  {% if page.website.i18n.localizations and page.website.i18n.localizations.size > 1 %}
2
2
  {% assign ui = page.website.i18n.messages %}
3
3
  <details class="language-switcher" data-language-switcher>
4
- <summary class="site-action" aria-label="{{ ui.language | default: 'Language' | escape }}: {{ page.website.i18n.name | escape }}">
5
- <span>{{ page.website.i18n.name | escape }}</span>
6
- <span aria-hidden="true">⌄</span>
4
+ <summary class="site-action" aria-label="{{ ui.language | default: 'Language' | escape }}: {{ page.website.i18n.name | escape }}" title="{{ ui.language | default: 'Language' | escape }}: {{ page.website.i18n.name | escape }}">
5
+ {% include website/action-icon.html name='language' %}
7
6
  </summary>
8
7
  <nav class="language-switcher__panel" aria-label="{{ ui.language | default: 'Language' | escape }}">
9
8
  <ul>
@@ -0,0 +1,6 @@
1
+ {% if page.website.archive_facets.size > 0 %}
2
+ {% assign blog_url = page.website.routes.blog %}
3
+ <ul class="note-tags" data-note-tags>
4
+ {% for tag in page.website.archive_facets %}<li><a class="tag-chip" href="{{ blog_url | escape }}?{{ tag.facet | url_encode }}={{ tag.id | url_encode }}" data-note-facet="{{ tag.facet | escape }}" data-note-value="{{ tag.id | escape }}">{{ tag.name | escape }}</a></li>{% endfor %}
5
+ </ul>
6
+ {% endif %}
@@ -13,23 +13,24 @@
13
13
  <header class="note-header" lang="{{ page.website.i18n.content_lang | default: page.website.i18n.locale | default: site.lang | default: 'en' | escape }}" dir="{{ page.website.i18n.content_dir | default: page.website.i18n.dir | default: 'ltr' | escape }}">
14
14
  {% if show_note_title %}<h1 class="note-title">{{ page.title | escape }}</h1>{% endif %}
15
15
  {% if page.website.kind == 'note' and page.website.content_type == 'post' and page.website.authors.size > 0 %}<p class="note-byline">{{ ui.posted_by | default: 'Posted by' | escape }} {% for author in page.website.authors %}{% if author.url %}<a href="{{ author.url | escape }}">{{ author.name | escape }}</a>{% else %}{{ author.name | escape }}{% endif %}{% unless forloop.last %}, {% endunless %}{% endfor %}</p>{% endif %}
16
- {% if page.website.subtitle %}<p class="note-subtitle">{{ page.website.subtitle | escape }}</p>{% elsif page.website.kind == 'note' and page.description %}<p class="note-description">{{ page.description | escape }}</p>{% endif %}
16
+ {% if page.website.subtitle %}<p class="note-subtitle">{{ page.website.subtitle | escape }}</p>{% elsif page.website.kind == 'note' and page.description and page.description != page.title and page.website.archive_item != true %}<p class="note-description">{{ page.description | escape }}</p>{% endif %}
17
17
  {% if page.website.theme == 'minimal' %}{% include website/portfolio-topics.html topics=page.website.theme_data.portfolio_topics url=page.website.routes.portfolio %}{% endif %}
18
18
  {% if page.website.kind == 'note' %}
19
19
  <div class="note-meta">
20
- {% if page.website.content_type == 'post' and page.website.published_at %}<time datetime="{{ page.website.published_at | escape }}">{{ ui.published | default: 'Published' | escape }} {{ page.website.published_at | date: "%Y-%m-%d" }}</time>{% endif %}
21
- {% if page.website.theme == 'minimal' and page.website.content_type == 'post' and page.website.features.tags and page.website.topic_links.size > 0 %}
20
+ {% if page.website.content_type == 'post' and page.website.published_at %}<time datetime="{{ page.website.published_at | escape }}">{% if page.website.date_basis == 'observed' %}{{ ui.first_observed | default: 'First observed' | escape }}{% else %}{{ ui.published | default: 'Published' | escape }}{% endif %} {{ page.website.published_at | date: "%Y-%m-%d" }}</time>{% endif %}
21
+ {% if page.website.theme == 'minimal' and page.website.content_type == 'post' and page.website.features.tags and page.website.archive_item != true and page.website.topic_links.size > 0 %}
22
22
  {% assign blog_url = page.website.routes.blog %}{% unless blog_url %}{% assign blog_url = '/blog/' | relative_url %}{% endunless %}
23
23
  <span class="note-meta__topics" aria-label="{{ ui.topics | default: 'Topics' | escape }}" lang="{{ page.website.i18n.locale | default: site.lang | default: 'en' | escape }}" dir="{{ page.website.i18n.dir | default: 'ltr' | escape }}">{% for topic in page.website.topic_links %}<a class="tag-chip" href="{{ blog_url | escape }}?topic={{ topic.anchor | url_encode }}" lang="{{ page.website.i18n.content_lang | default: page.website.i18n.locale | default: site.lang | default: 'en' | escape }}" dir="{{ page.website.i18n.content_dir | default: page.website.i18n.dir | default: 'ltr' | escape }}">{{ topic.name | escape }}</a>{% endfor %}</span>
24
24
  {% endif %}
25
25
  {% if page.website.updated %}<time datetime="{{ page.website.updated | escape }}">{{ ui.updated | default: 'Updated' | escape }} {{ page.website.updated | date: "%Y-%m-%d" }}</time>{% endif %}
26
- {% if page.website.features.tags %}
26
+ {% if page.website.features.tags and page.website.archive_item != true %}
27
27
  {% unless page.website.theme == 'minimal' and page.website.content_type == 'post' %}
28
28
  {% if page.website.theme == 'minimal' %}{% assign tags_url = page.website.routes.blog %}{% unless tags_url %}{% assign tags_url = '/blog/' | relative_url %}{% endunless %}{% else %}{% assign tags_url = page.website.routes.tags %}{% unless tags_url %}{% assign tags_url = '/tags/' | relative_url %}{% endunless %}{% endif %}
29
29
  {% for tag in page.website.tag_links %}<a class="tag-chip" href="{{ tags_url | escape }}{% if page.website.theme == 'docs' %}#{{ tag.anchor | escape }}{% else %}?topic={{ tag.anchor | url_encode }}{% endif %}">{{ tag.name | escape }}</a>{% endfor %}
30
30
  {% endunless %}
31
31
  {% endif %}
32
32
  </div>
33
+ {% include website/note-facets.html %}
33
34
  {% endif %}
34
35
  </header>
35
36
  {% endif %}
@@ -0,0 +1,27 @@
1
+ {% if page.website.display_properties and page.website.display_properties.size > 0 %}
2
+ <dl class="note-properties" data-note-properties lang="{{ page.website.i18n.content_lang | default: page.website.i18n.locale | default: site.lang | default: 'en' | escape }}" dir="{{ page.website.i18n.content_dir | default: page.website.i18n.dir | default: 'ltr' | escape }}">
3
+ {% for property in page.website.display_properties %}
4
+ <div class="note-properties__row" data-property-name="{{ property.name | escape }}">
5
+ <dt>{{ property.name | escape }}</dt>
6
+ <dd>
7
+ {% if property.kind == 'list' and property.values.size == 0 %}
8
+ <span class="note-property-value note-property-value--empty_list">[]</span>
9
+ {% else %}
10
+ {% if property.kind == 'list' %}<ul>{% endif %}
11
+ {% for value in property.values %}
12
+ {% if property.kind == 'list' %}<li>{% endif %}
13
+ {% case value.kind %}
14
+ {% when 'wiki_link' %}<a href="{{ value.url | escape }}">{{ value.text | escape }}</a>
15
+ {% when 'url' %}<a href="{{ value.external_url | escape }}" rel="noopener noreferrer">{{ value.text | escape }}</a>
16
+ {% when 'date' or 'datetime' %}<time datetime="{{ value.datetime | escape }}">{{ value.text | escape }}</time>
17
+ {% else %}<span class="note-property-value note-property-value--{{ value.kind | escape }}">{{ value.text | escape }}</span>
18
+ {% endcase %}
19
+ {% if property.kind == 'list' %}</li>{% endif %}
20
+ {% endfor %}
21
+ {% if property.kind == 'list' %}</ul>{% endif %}
22
+ {% endif %}
23
+ </dd>
24
+ </div>
25
+ {% endfor %}
26
+ </dl>
27
+ {% endif %}
@@ -0,0 +1 @@
1
+ {% if page.website.source_url %}<p class="archive-source-url note-source-url"><a href="{{ page.website.source_url | escape }}" rel="noopener noreferrer">{{ page.website.source_url | escape }}</a></p>{% endif %}
@@ -8,9 +8,10 @@
8
8
  data-copy-error="{{ ui.copy_failed | default: 'Copy failed. Open View as Markdown and copy the text.' | escape }}"
9
9
  >
10
10
  <div class="page-actions__split">
11
- <button class="page-actions__primary" type="button" data-copy-page>
11
+ {% include website/favorite-button.html card=page.website.favorite_card %}
12
+ <button class="page-actions__primary" type="button" data-copy-page title="{{ ui.copy_page | default: 'Copy page' | escape }}">
12
13
  <svg class="page-actions__icon" viewBox="0 0 20 20" aria-hidden="true"><rect x="6" y="5" width="10" height="11" rx="2"></rect><path d="M4 13H3.5A1.5 1.5 0 0 1 2 11.5v-8A1.5 1.5 0 0 1 3.5 2h8A1.5 1.5 0 0 1 13 3.5V4"></path></svg>
13
- <span class="page-actions__primary-label" data-copy-page-label>{{ ui.copy_page | default: 'Copy page' | escape }}</span>
14
+ <span class="page-actions__primary-label visually-hidden" data-copy-page-label>{{ ui.copy_page | default: 'Copy page' | escape }}</span>
14
15
  </button>
15
16
  <details class="page-actions__menu" data-page-actions-menu>
16
17
  <summary aria-label="{{ ui.more_page_actions | default: 'More page actions' | escape }}" title="{{ ui.more_page_actions | default: 'More page actions' | escape }}">
@@ -1,5 +1,5 @@
1
1
  {% for post in include.posts %}
2
- <article class="minimal-post-card{% if post.image or post.image_url %} minimal-post-card--with-image{% endif %}">
2
+ <article class="minimal-post-card{% if post.image or post.image_url %} minimal-post-card--with-image{% endif %}"{% if post.recommendation_expires_at %} data-recommendation-expires-at="{{ post.recommendation_expires_at | escape }}"{% endif %}>
3
3
  {% if post.image or post.image_url %}<div class="minimal-post-card__media"><img src="{{ post.image | default: post.image_url | escape }}" alt="" loading="lazy" decoding="async"></div>{% endif %}
4
4
  <div class="minimal-post-card__body">
5
5
  <h3><a href="{{ post.url | escape }}">{{ post.title | escape }}</a></h3>
@@ -1,6 +1,6 @@
1
1
  {% if page.website.related_articles and page.website.related_articles.size > 0 %}
2
2
  {% assign ui = page.website.i18n.messages %}
3
- <nav class="related-articles minimal-recent" aria-labelledby="related-articles-title">
3
+ <nav class="related-articles minimal-recent" aria-labelledby="related-articles-title"{% if page.website.related_articles.first.recommendation_expires_at %} data-recommendations hidden{% endif %}>
4
4
  <header class="minimal-section-heading"><h2 id="related-articles-title">{{ ui.related_articles | default: 'Related articles' | escape }}</h2></header>
5
5
  <div class="minimal-recent__grid">{% include website/post-cards.html posts=page.website.related_articles %}</div>
6
6
  </nav>
@@ -21,8 +21,17 @@
21
21
  {% when 'portfolio-index' %}
22
22
  {% include website/portfolio-grid.html index=true %}
23
23
  {% when 'blog-index' %}
24
- <h1 class="visually-hidden">{{ page.title | default: ui.blog | default: 'Blog' | escape }}</h1>
25
- {% include website/tag-filter.html summaries=page.website.theme_data.topic_summaries total=page.website.theme_data.topic_filter_count %}
24
+ {% if page.website.theme_data.archive %}
25
+ {% unless page.website.theme_data.tab_id and page.website.has_h1 %}<h1 class="{% if page.title == site.title or page.website.theme_data.favorites or page.website.theme_data.tab_id %}visually-hidden{% else %}archive-title{% endif %}">{{ page.title | escape }}</h1>{% endunless %}
26
+ {% if page.website.theme_data.favorites %}
27
+ <div data-favorites-facets></div>
28
+ <p class="filter-empty" data-archive-empty hidden>{{ ui.no_matching_entries | escape }} <button type="button" data-archive-clear>{{ ui.clear_filters | escape }}</button></p>
29
+ <noscript><p>{{ ui.favorites_requires_js | escape }}</p></noscript>
30
+ {% else %}{% include website/archive-facets.html %}{% endif %}
31
+ {% else %}
32
+ <h1 class="visually-hidden">{{ page.title | default: ui.blog | default: 'Blog' | escape }}</h1>
33
+ {% include website/tag-filter.html summaries=page.website.theme_data.topic_summaries total=page.website.theme_data.topic_filter_count %}
34
+ {% endif %}
26
35
  {% when 'tags' %}
27
36
  <h1>{{ ui.tags | default: 'Tags' | escape }}</h1>
28
37
  {% for group in page.website.theme_data.tag_groups %}<section id="{{ group.anchor | escape }}"><h2>{{ group.name | escape }}</h2><ul>{% for note in group.notes %}<li><a href="{{ note.url | escape }}">{{ note.title | escape }}</a></li>{% endfor %}</ul></section>{% endfor %}
@@ -8,7 +8,7 @@
8
8
  <div class="docs-shell">
9
9
  <aside class="docs-sidebar"><nav class="docs-tree" aria-label="{{ ui.documentation | default: 'Documentation' | escape }}" data-docs-navigation>{% include website/docs-tree.html nodes=page.website.theme_data.docs_tree %}</nav></aside>
10
10
  <main class="docs-main" id="main-content" data-docs-main>
11
- <article class="docs-article{% if page.website.cssclasses %} {{ page.website.cssclasses | join: ' ' }}{% endif %}">{% if page.website.i18n.fallback %}<aside class="translation-fallback" role="status">{{ ui.translation_missing | default: 'This page is not translated yet. The default-language version is shown.' | escape }}</aside>{% endif %}{% unless page.website.has_h1 %}{% include website/page-actions.html %}{% endunless %}{% include website/note-header.html %}{% if page.website.has_h1 %}{% include website/page-actions.html %}{% endif %}<div class="note-content" lang="{{ page.website.i18n.content_lang | default: page.website.i18n.locale | default: site.lang | default: 'en' | escape }}" dir="{{ page.website.i18n.content_dir | default: page.website.i18n.dir | default: 'ltr' | escape }}" data-copy-code-label="{{ ui.copy_code | default: 'Copy code' | escape }}" data-copy-diagram-label="{{ ui.copy_diagram_source | default: 'Copy diagram source' | escape }}" data-expand-diagram-label="{{ ui.expand_diagram | default: 'Expand diagram' | escape }}" data-close-diagram-label="{{ ui.close_diagram | default: 'Close diagram' | escape }}" data-image-label="{{ ui.image | default: 'Image' | escape }}" data-expand-image-label="{{ ui.expand_image | default: 'Expand image' | escape }}" data-close-image-label="{{ ui.close_image | default: 'Close image' | escape }}" data-copy-formula-label="{{ ui.copy_formula_source | default: 'Copy formula source' | escape }}" data-copy-code-success="{{ ui.copied | default: 'Copied' | escape }}" data-copy-code-error="{{ ui.copy_code_failed | default: 'Copy failed' | escape }}">{% if page.website.kind == 'note' %}{{ content }}{% else %}{% include website/system-page.html %}{% endif %}</div>{% if page.website.kind == 'note' and page.website.theme_data.tab_id %}{% include website/tab-collection.html %}{% endif %}{% include website/source-actions.html %}{% include website/related-articles.html %}{% include website/comments.html %}</article>
11
+ <article class="docs-article{% if page.website.cssclasses %} {{ page.website.cssclasses | join: ' ' }}{% endif %}">{% if page.website.i18n.fallback %}<aside class="translation-fallback" role="status">{{ ui.translation_missing | default: 'This page is not translated yet. The default-language version is shown.' | escape }}</aside>{% endif %}{% unless page.website.has_h1 %}{% include website/page-actions.html %}{% endunless %}{% include website/note-header.html %}{% include website/note-source.html %}{% include website/note-properties.html %}{% if page.website.has_h1 %}{% include website/page-actions.html %}{% endif %}<div class="note-content" lang="{{ page.website.i18n.content_lang | default: page.website.i18n.locale | default: site.lang | default: 'en' | escape }}" dir="{{ page.website.i18n.content_dir | default: page.website.i18n.dir | default: 'ltr' | escape }}" data-copy-code-label="{{ ui.copy_code | default: 'Copy code' | escape }}" data-copy-diagram-label="{{ ui.copy_diagram_source | default: 'Copy diagram source' | escape }}" data-expand-diagram-label="{{ ui.expand_diagram | default: 'Expand diagram' | escape }}" data-close-diagram-label="{{ ui.close_diagram | default: 'Close diagram' | escape }}" data-image-label="{{ ui.image | default: 'Image' | escape }}" data-expand-image-label="{{ ui.expand_image | default: 'Expand image' | escape }}" data-close-image-label="{{ ui.close_image | default: 'Close image' | escape }}" data-copy-formula-label="{{ ui.copy_formula_source | default: 'Copy formula source' | escape }}" data-copy-code-success="{{ ui.copied | default: 'Copied' | escape }}" data-copy-code-error="{{ ui.copy_code_failed | default: 'Copy failed' | escape }}">{% if page.website.kind == 'note' %}{{ content }}{% else %}{% include website/system-page.html %}{% endif %}</div>{% if page.website.kind == 'note' and page.website.theme_data.tab_id %}{% include website/tab-collection.html %}{% endif %}{% include website/source-actions.html %}{% include website/related-articles.html %}{% include website/comments.html %}</article>
12
12
  {% include website/docs-navigation.html %}
13
13
  </main>
14
14
  {% if page.website.kind == 'note' and page.website.has_context %}<aside class="docs-context" data-page-context data-context-panel data-dialog-movable="context" aria-label="{{ ui.page_context | default: 'Page context' | escape }}">{% include website/context.html location='rail' %}</aside>{% endif %}
@@ -14,7 +14,7 @@
14
14
  {% assign has_mobile_context = false %}
15
15
  {% if page.website.kind == 'home' %}
16
16
  {% if page.website.theme_data.topic_summaries.size > 0 or page.website.has_context %}{% assign has_mobile_context = true %}{% endif %}
17
- {% elsif page.website.kind == 'blog-index' and page.website.theme_data.timeline.size > 0 %}
17
+ {% elsif page.website.kind == 'blog-index' and page.website.theme_data.timeline.size > 0 or page.website.theme_data.favorites %}
18
18
  {% assign has_mobile_context = true %}
19
19
  {% elsif page.website.kind == 'note' and page.website.has_context %}
20
20
  {% assign has_mobile_context = true %}
@@ -22,8 +22,9 @@
22
22
 
23
23
  <a class="skip-link" href="#main-content">{{ ui.skip_to_content | default: 'Skip to content' | escape }}</a>
24
24
  {% include website/header.html theme='minimal' %}
25
+ {% include website/favorites-ui.html %}
25
26
 
26
- <main class="minimal-shell{% unless page.website.kind == 'note' %} minimal-shell--system{% endunless %}{% if is_authored_home %} minimal-shell--authored-home{% endif %}{% if is_docs_page %} minimal-shell--docs{% endif %}{% if page.website.kind == 'blog-index' %} minimal-shell--blog{% endif %}" id="main-content"{% if page.website.kind == 'blog-index' %} data-filter-page{% endif %}>
27
+ <main class="minimal-shell{% if page.website.archive_item %} minimal-shell--archive-item{% endif %}{% unless page.website.kind == 'note' %} minimal-shell--system{% endunless %}{% if is_authored_home %} minimal-shell--authored-home{% endif %}{% if is_docs_page %} minimal-shell--docs{% endif %}{% if page.website.kind == 'blog-index' %} minimal-shell--blog{% endif %}" id="main-content"{% if page.website.kind == 'blog-index' %} data-ledger-current-year="{{ page.website.theme_data.ledger_current_year }}"{% endif %}{% if page.website.kind == 'blog-index' %} data-ledger-group-by="{{ page.website.theme_data.ledger_group_by | default: 'year' | escape }}"{% endif %}{% if page.website.theme_data.favorites %} data-favorites-page data-sources-label="{{ ui.sources | escape }}" data-topics-label="{{ ui.topics | escape }}" data-all-label="{{ ui.all | escape }}"{% endif %}{% if page.website.kind == 'blog-index' %} data-filter-page{% if page.website.theme_data.archive %} data-paged-archive data-archive-url="{{ page.website.theme_data.archive.url | escape }}" data-archive-current-url="{{ page.website.theme_data.archive.current_url | escape }}" data-observed-label="{{ ui.first_observed | default: 'First observed' | escape }}"{% endif %}{% endif %}>
27
28
  {% if is_docs_page %}
28
29
  <aside class="minimal-docs-sidebar">
29
30
  <nav class="docs-tree" aria-label="{{ ui.documentation | default: 'Documentation' | escape }}" data-docs-navigation>
@@ -33,13 +34,16 @@
33
34
  {% endif %}
34
35
 
35
36
  <div class="minimal-reading-column" data-docs-main>
36
- <article class="minimal-entry{% if page.website.cssclasses %} {{ page.website.cssclasses | join: ' ' }}{% endif %}">
37
+ {% if page.website.kind == 'blog-index' %}{% include website/archive-day-ui.html %}{% endif %}
38
+ <article class="minimal-entry{% if page.website.compact_collection %} minimal-entry--compact-collection{% endif %}{% if page.website.cssclasses %} {{ page.website.cssclasses | join: ' ' }}{% endif %}">
37
39
  {% if page.website.i18n.fallback %}<aside class="translation-fallback" role="status">{{ ui.translation_missing | default: 'This page is not translated yet. The default-language version is shown.' | escape }}</aside>{% endif %}
38
- {% unless page.website.has_h1 %}{% include website/page-actions.html %}{% endunless %}
40
+ {% unless page.website.theme_data.archive %}{% unless page.website.has_h1 %}{% include website/page-actions.html %}{% endunless %}{% endunless %}
39
41
  {% include website/note-header.html %}
40
- {% if page.website.has_h1 %}{% include website/page-actions.html %}{% endif %}
42
+ {% include website/note-source.html %}
43
+ {% include website/note-properties.html %}
44
+ {% unless page.website.theme_data.archive %}{% if page.website.has_h1 %}{% include website/page-actions.html %}{% endif %}{% endunless %}
41
45
  <div class="note-content" lang="{{ page.website.i18n.content_lang | default: page.website.i18n.locale | default: site.lang | default: 'en' | escape }}" dir="{{ page.website.i18n.content_dir | default: page.website.i18n.dir | default: 'ltr' | escape }}" data-copy-code-label="{{ ui.copy_code | default: 'Copy code' | escape }}" data-copy-diagram-label="{{ ui.copy_diagram_source | default: 'Copy diagram source' | escape }}" data-expand-diagram-label="{{ ui.expand_diagram | default: 'Expand diagram' | escape }}" data-close-diagram-label="{{ ui.close_diagram | default: 'Close diagram' | escape }}" data-image-label="{{ ui.image | default: 'Image' | escape }}" data-expand-image-label="{{ ui.expand_image | default: 'Expand image' | escape }}" data-close-image-label="{{ ui.close_image | default: 'Close image' | escape }}" data-copy-formula-label="{{ ui.copy_formula_source | default: 'Copy formula source' | escape }}" data-copy-code-success="{{ ui.copied | default: 'Copied' | escape }}" data-copy-code-error="{{ ui.copy_code_failed | default: 'Copy failed' | escape }}">
42
- {% if page.website.kind == 'note' or page.website.kind == 'home' %}{{ content }}{% endif %}
46
+ {% if page.website.kind == 'note' or page.website.kind == 'home' or page.website.theme_data.tab_id %}{{ content }}{% endif %}
43
47
  {% unless page.website.kind == 'note' %}
44
48
  {% unless is_authored_home %}{% include website/system-page.html %}{% endunless %}
45
49
  {% endunless %}
@@ -56,16 +60,21 @@
56
60
  {% endif %}
57
61
 
58
62
  {% if page.website.kind == 'blog-index' and page.website.theme_data.archive_groups %}
59
- <div class="archive-ledger" data-filter-list>
63
+ <div class="archive-ledger" id="archive-ledger" data-filter-list>
60
64
  {% for group in page.website.theme_data.archive_groups %}
61
65
  <section data-filter-group>
66
+ {% if page.website.theme_data.ledger_group_by == 'day' %}
67
+ {% include website/archive-day.html group=group %}
68
+ {% else %}
62
69
  <h2>{{ group.label | default: group.year | escape }}</h2>
63
70
  {% include website/blog-ledger.html posts=group.posts compact=true filterable=true %}
71
+ {% endif %}
64
72
  </section>
65
73
  {% endfor %}
66
74
  </div>
67
75
  {% endif %}
68
76
 
77
+ {% if page.website.theme_data.archive %}<div class="archive-page-controls">{% include website/archive-pagination.html %}</div>{% endif %}
69
78
  {% if is_docs_page %}{% include website/docs-navigation.html %}{% else %}{% include website/blog-navigation.html %}{% endif %}
70
79
  </div>
71
80
 
@@ -74,7 +83,7 @@
74
83
  {% if page.website.theme_data.topic_summaries.size > 0 %}{% include website/context-tags.html location='rail' summaries=page.website.theme_data.topic_summaries %}{% endif %}
75
84
  {% if page.website.has_context %}{% include website/context.html location='rail' %}{% endif %}
76
85
  </aside>
77
- {% elsif page.website.kind == 'blog-index' and page.website.theme_data.timeline.size > 0 %}
86
+ {% elsif page.website.kind == 'blog-index' and page.website.theme_data.timeline.size > 0 or page.website.theme_data.favorites %}
78
87
  <aside class="minimal-context archive-context" data-page-context data-dialog-movable="context" data-auto-hide-scrollbar aria-label="{{ ui.chronology | default: 'Chronology' | escape }}">{% include website/archive-timeline.html timeline=page.website.theme_data.timeline %}</aside>
79
88
  {% elsif page.website.kind == 'note' and page.website.has_context %}
80
89
  <aside class="minimal-context" data-page-context data-context-panel data-dialog-movable="context" aria-label="{{ ui.page_context | default: 'Page context' | escape }}">{% include website/context.html location='rail' %}</aside>