@geekity/cms 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 (238) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +870 -0
  3. package/admin/layouts/_flash.njk +5 -0
  4. package/admin/layouts/base.njk +27 -0
  5. package/admin/layouts/dashboard.njk +78 -0
  6. package/admin/layouts/document-conflict.njk +49 -0
  7. package/admin/layouts/document-editor.njk +167 -0
  8. package/admin/layouts/document-list.njk +92 -0
  9. package/admin/layouts/federation.njk +145 -0
  10. package/admin/layouts/login.njk +23 -0
  11. package/admin/layouts/placeholder.njk +10 -0
  12. package/admin/layouts/settings.njk +116 -0
  13. package/admin/layouts/setup.njk +27 -0
  14. package/admin/layouts/shell.njk +37 -0
  15. package/admin/layouts/users.njk +91 -0
  16. package/admin/static/admin.css +726 -0
  17. package/admin/static/editor.js +30 -0
  18. package/dist/admin/assets.d.ts +26 -0
  19. package/dist/admin/assets.d.ts.map +1 -0
  20. package/dist/admin/assets.js +38 -0
  21. package/dist/admin/assets.js.map +1 -0
  22. package/dist/admin/credentials.d.ts +28 -0
  23. package/dist/admin/credentials.d.ts.map +1 -0
  24. package/dist/admin/credentials.js +39 -0
  25. package/dist/admin/credentials.js.map +1 -0
  26. package/dist/admin/documents.d.ts +134 -0
  27. package/dist/admin/documents.d.ts.map +1 -0
  28. package/dist/admin/documents.js +613 -0
  29. package/dist/admin/documents.js.map +1 -0
  30. package/dist/admin/federation.d.ts +194 -0
  31. package/dist/admin/federation.d.ts.map +1 -0
  32. package/dist/admin/federation.js +299 -0
  33. package/dist/admin/federation.js.map +1 -0
  34. package/dist/admin/flash.d.ts +24 -0
  35. package/dist/admin/flash.d.ts.map +1 -0
  36. package/dist/admin/flash.js +31 -0
  37. package/dist/admin/flash.js.map +1 -0
  38. package/dist/admin/index.d.ts +23 -0
  39. package/dist/admin/index.d.ts.map +1 -0
  40. package/dist/admin/index.js +15 -0
  41. package/dist/admin/index.js.map +1 -0
  42. package/dist/admin/passwords.d.ts +49 -0
  43. package/dist/admin/passwords.d.ts.map +1 -0
  44. package/dist/admin/passwords.js +122 -0
  45. package/dist/admin/passwords.js.map +1 -0
  46. package/dist/admin/preview.d.ts +18 -0
  47. package/dist/admin/preview.d.ts.map +1 -0
  48. package/dist/admin/preview.js +83 -0
  49. package/dist/admin/preview.js.map +1 -0
  50. package/dist/admin/routes.d.ts +54 -0
  51. package/dist/admin/routes.d.ts.map +1 -0
  52. package/dist/admin/routes.js +383 -0
  53. package/dist/admin/routes.js.map +1 -0
  54. package/dist/admin/session.d.ts +44 -0
  55. package/dist/admin/session.d.ts.map +1 -0
  56. package/dist/admin/session.js +69 -0
  57. package/dist/admin/session.js.map +1 -0
  58. package/dist/admin/settings.d.ts +194 -0
  59. package/dist/admin/settings.d.ts.map +1 -0
  60. package/dist/admin/settings.js +470 -0
  61. package/dist/admin/settings.js.map +1 -0
  62. package/dist/admin/store.d.ts +407 -0
  63. package/dist/admin/store.d.ts.map +1 -0
  64. package/dist/admin/store.js +704 -0
  65. package/dist/admin/store.js.map +1 -0
  66. package/dist/admin/templates.d.ts +36 -0
  67. package/dist/admin/templates.d.ts.map +1 -0
  68. package/dist/admin/templates.js +43 -0
  69. package/dist/admin/templates.js.map +1 -0
  70. package/dist/admin/uploads.d.ts +96 -0
  71. package/dist/admin/uploads.d.ts.map +1 -0
  72. package/dist/admin/uploads.js +179 -0
  73. package/dist/admin/uploads.js.map +1 -0
  74. package/dist/admin/users.d.ts +95 -0
  75. package/dist/admin/users.d.ts.map +1 -0
  76. package/dist/admin/users.js +233 -0
  77. package/dist/admin/users.js.map +1 -0
  78. package/dist/cli.d.ts +85 -0
  79. package/dist/cli.d.ts.map +1 -0
  80. package/dist/cli.js +424 -0
  81. package/dist/cli.js.map +1 -0
  82. package/dist/config.d.ts +172 -0
  83. package/dist/config.d.ts.map +1 -0
  84. package/dist/config.js +184 -0
  85. package/dist/config.js.map +1 -0
  86. package/dist/content/document.d.ts +66 -0
  87. package/dist/content/document.d.ts.map +1 -0
  88. package/dist/content/document.js +13 -0
  89. package/dist/content/document.js.map +1 -0
  90. package/dist/content/index.d.ts +17 -0
  91. package/dist/content/index.d.ts.map +1 -0
  92. package/dist/content/index.js +10 -0
  93. package/dist/content/index.js.map +1 -0
  94. package/dist/content/markdown.d.ts +3 -0
  95. package/dist/content/markdown.d.ts.map +1 -0
  96. package/dist/content/markdown.js +39 -0
  97. package/dist/content/markdown.js.map +1 -0
  98. package/dist/content/media.d.ts +65 -0
  99. package/dist/content/media.d.ts.map +1 -0
  100. package/dist/content/media.js +143 -0
  101. package/dist/content/media.js.map +1 -0
  102. package/dist/content/parser.d.ts +24 -0
  103. package/dist/content/parser.d.ts.map +1 -0
  104. package/dist/content/parser.js +165 -0
  105. package/dist/content/parser.js.map +1 -0
  106. package/dist/content/save.d.ts +60 -0
  107. package/dist/content/save.d.ts.map +1 -0
  108. package/dist/content/save.js +103 -0
  109. package/dist/content/save.js.map +1 -0
  110. package/dist/content/slug.d.ts +25 -0
  111. package/dist/content/slug.d.ts.map +1 -0
  112. package/dist/content/slug.js +75 -0
  113. package/dist/content/slug.js.map +1 -0
  114. package/dist/content/store.d.ts +133 -0
  115. package/dist/content/store.d.ts.map +1 -0
  116. package/dist/content/store.js +411 -0
  117. package/dist/content/store.js.map +1 -0
  118. package/dist/content/sync.d.ts +146 -0
  119. package/dist/content/sync.d.ts.map +1 -0
  120. package/dist/content/sync.js +421 -0
  121. package/dist/content/sync.js.map +1 -0
  122. package/dist/content/writer.d.ts +37 -0
  123. package/dist/content/writer.d.ts.map +1 -0
  124. package/dist/content/writer.js +97 -0
  125. package/dist/content/writer.js.map +1 -0
  126. package/dist/env.d.ts +48 -0
  127. package/dist/env.d.ts.map +1 -0
  128. package/dist/env.js +2 -0
  129. package/dist/env.js.map +1 -0
  130. package/dist/federation/actor.d.ts +55 -0
  131. package/dist/federation/actor.d.ts.map +1 -0
  132. package/dist/federation/actor.js +101 -0
  133. package/dist/federation/actor.js.map +1 -0
  134. package/dist/federation/article.d.ts +83 -0
  135. package/dist/federation/article.d.ts.map +1 -0
  136. package/dist/federation/article.js +169 -0
  137. package/dist/federation/article.js.map +1 -0
  138. package/dist/federation/delivery.d.ts +90 -0
  139. package/dist/federation/delivery.d.ts.map +1 -0
  140. package/dist/federation/delivery.js +289 -0
  141. package/dist/federation/delivery.js.map +1 -0
  142. package/dist/federation/federation.d.ts +75 -0
  143. package/dist/federation/federation.d.ts.map +1 -0
  144. package/dist/federation/federation.js +190 -0
  145. package/dist/federation/federation.js.map +1 -0
  146. package/dist/federation/followers.d.ts +43 -0
  147. package/dist/federation/followers.d.ts.map +1 -0
  148. package/dist/federation/followers.js +69 -0
  149. package/dist/federation/followers.js.map +1 -0
  150. package/dist/federation/inbox.d.ts +68 -0
  151. package/dist/federation/inbox.d.ts.map +1 -0
  152. package/dist/federation/inbox.js +171 -0
  153. package/dist/federation/inbox.js.map +1 -0
  154. package/dist/federation/index.d.ts +14 -0
  155. package/dist/federation/index.d.ts.map +1 -0
  156. package/dist/federation/index.js +10 -0
  157. package/dist/federation/index.js.map +1 -0
  158. package/dist/federation/keys.d.ts +27 -0
  159. package/dist/federation/keys.d.ts.map +1 -0
  160. package/dist/federation/keys.js +60 -0
  161. package/dist/federation/keys.js.map +1 -0
  162. package/dist/federation/mount.d.ts +23 -0
  163. package/dist/federation/mount.d.ts.map +1 -0
  164. package/dist/federation/mount.js +71 -0
  165. package/dist/federation/mount.js.map +1 -0
  166. package/dist/federation/paths.d.ts +85 -0
  167. package/dist/federation/paths.d.ts.map +1 -0
  168. package/dist/federation/paths.js +97 -0
  169. package/dist/federation/paths.js.map +1 -0
  170. package/dist/index.d.ts +106 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +148 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/init.d.ts +71 -0
  175. package/dist/init.d.ts.map +1 -0
  176. package/dist/init.js +125 -0
  177. package/dist/init.js.map +1 -0
  178. package/dist/web/assets.d.ts +65 -0
  179. package/dist/web/assets.d.ts.map +1 -0
  180. package/dist/web/assets.js +152 -0
  181. package/dist/web/assets.js.map +1 -0
  182. package/dist/web/context.d.ts +121 -0
  183. package/dist/web/context.d.ts.map +1 -0
  184. package/dist/web/context.js +112 -0
  185. package/dist/web/context.js.map +1 -0
  186. package/dist/web/documents.d.ts +28 -0
  187. package/dist/web/documents.d.ts.map +1 -0
  188. package/dist/web/documents.js +39 -0
  189. package/dist/web/documents.js.map +1 -0
  190. package/dist/web/feeds.d.ts +122 -0
  191. package/dist/web/feeds.d.ts.map +1 -0
  192. package/dist/web/feeds.js +229 -0
  193. package/dist/web/feeds.js.map +1 -0
  194. package/dist/web/index.d.ts +17 -0
  195. package/dist/web/index.d.ts.map +1 -0
  196. package/dist/web/index.js +10 -0
  197. package/dist/web/index.js.map +1 -0
  198. package/dist/web/negotiate.d.ts +219 -0
  199. package/dist/web/negotiate.d.ts.map +1 -0
  200. package/dist/web/negotiate.js +409 -0
  201. package/dist/web/negotiate.js.map +1 -0
  202. package/dist/web/pagination.d.ts +48 -0
  203. package/dist/web/pagination.d.ts.map +1 -0
  204. package/dist/web/pagination.js +30 -0
  205. package/dist/web/pagination.js.map +1 -0
  206. package/dist/web/render.d.ts +72 -0
  207. package/dist/web/render.d.ts.map +1 -0
  208. package/dist/web/render.js +73 -0
  209. package/dist/web/render.js.map +1 -0
  210. package/dist/web/routes.d.ts +31 -0
  211. package/dist/web/routes.d.ts.map +1 -0
  212. package/dist/web/routes.js +366 -0
  213. package/dist/web/routes.js.map +1 -0
  214. package/dist/web/templates.d.ts +34 -0
  215. package/dist/web/templates.d.ts.map +1 -0
  216. package/dist/web/templates.js +106 -0
  217. package/dist/web/templates.js.map +1 -0
  218. package/package.json +68 -0
  219. package/templates/site/content/_data/site.json +8 -0
  220. package/templates/site/content/pages/about.md +11 -0
  221. package/templates/site/content/pages/pages.json +3 -0
  222. package/templates/site/content/posts/2026-01-01-hello-world.md +34 -0
  223. package/templates/site/content/posts/posts.json +4 -0
  224. package/templates/site/geekity.config.ts +11 -0
  225. package/templates/site/gitignore +3 -0
  226. package/templates/site/server.ts +20 -0
  227. package/templates/site/tsconfig.json +18 -0
  228. package/themes/default/README.md +148 -0
  229. package/themes/default/layouts/404.njk +9 -0
  230. package/themes/default/layouts/base.njk +59 -0
  231. package/themes/default/layouts/home.njk +9 -0
  232. package/themes/default/layouts/page.njk +13 -0
  233. package/themes/default/layouts/post.njk +30 -0
  234. package/themes/default/layouts/tag.njk +19 -0
  235. package/themes/default/partials/pagination.njk +14 -0
  236. package/themes/default/partials/post-list.njk +24 -0
  237. package/themes/default/partials/tags.njk +12 -0
  238. package/themes/default/static/style.css +327 -0
@@ -0,0 +1,30 @@
1
+ {% extends "layouts/base.njk" %}
2
+ {% import "partials/tags.njk" as taxonomy %}
3
+
4
+ {% block content %}
5
+ <article class="post h-entry">
6
+ <header class="post-header">
7
+ <h1 class="post-title p-name">{{ title }}</h1>
8
+ {% if date %}
9
+ <p class="post-meta">
10
+ Published
11
+ <time class="dt-published" datetime="{{ date | date("iso") }}">{{ date | date }}</time>
12
+ {% if updated %}
13
+ &middot; updated
14
+ <time class="dt-updated" datetime="{{ updated | date("iso") }}">{{ updated | date }}</time>
15
+ {% endif %}
16
+ </p>
17
+ {% endif %}
18
+ </header>
19
+
20
+ <div class="post-body e-content">
21
+ {{ content | safe }}
22
+ </div>
23
+
24
+ {% if tags.length %}
25
+ <footer class="post-footer">
26
+ {{ taxonomy.list(tags) }}
27
+ </footer>
28
+ {% endif %}
29
+ </article>
30
+ {% endblock %}
@@ -0,0 +1,19 @@
1
+ {% extends "layouts/base.njk" %}
2
+
3
+ {% block title %}Tagged &ldquo;{{ tag }}&rdquo;{% if pagination.pageNumber > 0 %}, page {{ pagination.pageNumber + 1 }}{% endif %} &middot; {{ site.title }}{% endblock %}
4
+
5
+ {% set tagRoot = "/tags/" + (tag | urlencode) + "/" %}
6
+ {% block alternates %}
7
+ {{ super() }}
8
+ <link rel="alternate" type="application/atom+xml" title="{{ site.title }}: {{ tag }}" href="{{ (tagRoot + "feed.xml") | url }}">
9
+ <link rel="alternate" type="application/feed+json" title="{{ site.title }}: {{ tag }}" href="{{ (tagRoot + "feed.json") | url }}">
10
+ {% endblock %}
11
+
12
+ {% block content %}
13
+ <h1 class="page-title">Tagged &ldquo;{{ tag }}&rdquo;</h1>
14
+ <p class="tag-count">
15
+ {{ pagination.total }} {% if pagination.total == 1 %}entry{% else %}entries{% endif %}.
16
+ </p>
17
+ {% include "partials/post-list.njk" %}
18
+ {% include "partials/pagination.njk" %}
19
+ {% endblock %}
@@ -0,0 +1,14 @@
1
+ {# Previous/next pager. Expects `pagination`. Renders nothing on a one-page listing. #}
2
+ {% if pagination.totalPages > 1 %}
3
+ <nav class="pagination" aria-label="Pagination">
4
+ {% if pagination.href.previous %}
5
+ <a class="pagination-previous" rel="prev" href="{{ pagination.href.previous | url }}">Newer</a>
6
+ {% endif %}
7
+ <span class="pagination-position">
8
+ Page {{ pagination.pageNumber + 1 }} of {{ pagination.totalPages }}
9
+ </span>
10
+ {% if pagination.href.next %}
11
+ <a class="pagination-next" rel="next" href="{{ pagination.href.next | url }}">Older</a>
12
+ {% endif %}
13
+ </nav>
14
+ {% endif %}
@@ -0,0 +1,24 @@
1
+ {# A list of documents, newest first. Expects `posts`. #}
2
+ {% import "partials/tags.njk" as taxonomy %}
3
+ {% if posts.length %}
4
+ <ol class="post-list">
5
+ {% for post in posts %}
6
+ <li class="post-list-item">
7
+ <article class="post-summary">
8
+ <h2 class="post-summary-title"><a href="{{ post.url | url }}">{{ post.title }}</a></h2>
9
+ {% if post.date %}
10
+ <p class="post-meta">
11
+ <time datetime="{{ post.date | date("html") }}">{{ post.date | date }}</time>
12
+ </p>
13
+ {% endif %}
14
+ {% if post.description %}
15
+ <p class="post-summary-description">{{ post.description }}</p>
16
+ {% endif %}
17
+ {{ taxonomy.list(post.tags) }}
18
+ </article>
19
+ </li>
20
+ {% endfor %}
21
+ </ol>
22
+ {% else %}
23
+ <p class="empty">Nothing published yet.</p>
24
+ {% endif %}
@@ -0,0 +1,12 @@
1
+ {# Macros for taxonomy links. Import as `{% import "partials/tags.njk" as taxonomy %}`. #}
2
+
3
+ {# A list of tag links. Renders nothing when the list is empty. #}
4
+ {% macro list(tags) %}
5
+ {% if tags and tags.length %}
6
+ <ul class="tag-list">
7
+ {% for tag in tags %}
8
+ <li><a class="tag" href="{{ ("/tags/" + (tag | urlencode) + "/") | url }}">{{ tag }}</a></li>
9
+ {% endfor %}
10
+ </ul>
11
+ {% endif %}
12
+ {% endmacro %}
@@ -0,0 +1,327 @@
1
+ /*
2
+ * The default theme's only stylesheet. Plain CSS, no build step, no
3
+ * dependencies: a site that wants something else drops its own
4
+ * `theme/static/style.css` in and this file is never read again.
5
+ */
6
+
7
+ :root {
8
+ color-scheme: light dark;
9
+
10
+ --measure: 38rem;
11
+ --gutter: 1.25rem;
12
+
13
+ --ink: #17181c;
14
+ --ink-muted: #5b6070;
15
+ --paper: #fdfdfc;
16
+ --paper-sunk: #f2f2ef;
17
+ --rule: #dcdcd6;
18
+ --accent: #1c4fd8;
19
+ --accent-visited: #6b3fb8;
20
+ }
21
+
22
+ @media (prefers-color-scheme: dark) {
23
+ :root {
24
+ --ink: #e8e8ea;
25
+ --ink-muted: #a0a4b2;
26
+ --paper: #16171a;
27
+ --paper-sunk: #1e2024;
28
+ --rule: #32343a;
29
+ --accent: #86aaff;
30
+ --accent-visited: #c3a8f5;
31
+ }
32
+ }
33
+
34
+ *,
35
+ *::before,
36
+ *::after {
37
+ box-sizing: border-box;
38
+ }
39
+
40
+ html {
41
+ -webkit-text-size-adjust: 100%;
42
+ }
43
+
44
+ body {
45
+ margin: 0;
46
+ padding: 0 var(--gutter);
47
+ background: var(--paper);
48
+ color: var(--ink);
49
+ font:
50
+ 1rem/1.6 system-ui,
51
+ -apple-system,
52
+ 'Segoe UI',
53
+ Roboto,
54
+ sans-serif;
55
+ text-rendering: optimizeLegibility;
56
+ }
57
+
58
+ a {
59
+ color: var(--accent);
60
+ text-decoration-thickness: 1px;
61
+ text-underline-offset: 0.15em;
62
+ }
63
+
64
+ a:visited {
65
+ color: var(--accent-visited);
66
+ }
67
+
68
+ .skip-link {
69
+ position: absolute;
70
+ left: -9999px;
71
+ }
72
+
73
+ .skip-link:focus {
74
+ position: static;
75
+ display: inline-block;
76
+ padding: 0.5rem;
77
+ }
78
+
79
+ /* Header and footer */
80
+
81
+ .site-header,
82
+ .site-footer,
83
+ .site-main {
84
+ max-width: var(--measure);
85
+ margin-inline: auto;
86
+ }
87
+
88
+ .site-header {
89
+ padding: 2.5rem 0 1.5rem;
90
+ border-bottom: 1px solid var(--rule);
91
+ }
92
+
93
+ .site-title {
94
+ margin: 0;
95
+ font-size: 1.35rem;
96
+ font-weight: 700;
97
+ letter-spacing: -0.01em;
98
+ }
99
+
100
+ .site-title a {
101
+ color: inherit;
102
+ text-decoration: none;
103
+ }
104
+
105
+ .site-tagline {
106
+ margin: 0.35rem 0 0;
107
+ color: var(--ink-muted);
108
+ }
109
+
110
+ .site-main {
111
+ padding: 2rem 0 3rem;
112
+ }
113
+
114
+ .site-footer {
115
+ padding: 1.5rem 0 3rem;
116
+ border-top: 1px solid var(--rule);
117
+ color: var(--ink-muted);
118
+ font-size: 0.9rem;
119
+ }
120
+
121
+ .site-colophon {
122
+ display: inline-block;
123
+ }
124
+
125
+ /* Titles */
126
+
127
+ .page-title,
128
+ .post-title {
129
+ margin: 0 0 0.35rem;
130
+ font-size: 1.9rem;
131
+ line-height: 1.2;
132
+ letter-spacing: -0.02em;
133
+ }
134
+
135
+ .post-meta {
136
+ margin: 0 0 1.75rem;
137
+ color: var(--ink-muted);
138
+ font-size: 0.9rem;
139
+ }
140
+
141
+ /* Listings */
142
+
143
+ .post-list {
144
+ margin: 0;
145
+ padding: 0;
146
+ list-style: none;
147
+ }
148
+
149
+ .post-list-item + .post-list-item {
150
+ margin-top: 2.25rem;
151
+ padding-top: 2.25rem;
152
+ border-top: 1px solid var(--rule);
153
+ }
154
+
155
+ .post-summary-title {
156
+ margin: 0 0 0.3rem;
157
+ font-size: 1.3rem;
158
+ line-height: 1.3;
159
+ }
160
+
161
+ .post-summary-title a {
162
+ color: inherit;
163
+ text-decoration: none;
164
+ }
165
+
166
+ .post-summary-title a:hover,
167
+ .post-summary-title a:focus {
168
+ text-decoration: underline;
169
+ }
170
+
171
+ .post-summary .post-meta {
172
+ margin-bottom: 0.5rem;
173
+ }
174
+
175
+ .post-summary-description {
176
+ margin: 0 0 0.5rem;
177
+ }
178
+
179
+ .empty,
180
+ .tag-count {
181
+ color: var(--ink-muted);
182
+ }
183
+
184
+ /* Tags */
185
+
186
+ .tag-list {
187
+ display: flex;
188
+ flex-wrap: wrap;
189
+ gap: 0.4rem;
190
+ margin: 0.75rem 0 0;
191
+ padding: 0;
192
+ list-style: none;
193
+ }
194
+
195
+ .tag {
196
+ display: inline-block;
197
+ padding: 0.1rem 0.5rem;
198
+ border: 1px solid var(--rule);
199
+ border-radius: 999px;
200
+ background: var(--paper-sunk);
201
+ color: var(--ink-muted);
202
+ font-size: 0.8rem;
203
+ text-decoration: none;
204
+ }
205
+
206
+ .tag:hover,
207
+ .tag:focus {
208
+ color: var(--ink);
209
+ }
210
+
211
+ /* Pagination */
212
+
213
+ .pagination {
214
+ display: flex;
215
+ gap: 1rem;
216
+ align-items: baseline;
217
+ justify-content: space-between;
218
+ margin-top: 3rem;
219
+ padding-top: 1.25rem;
220
+ border-top: 1px solid var(--rule);
221
+ font-size: 0.9rem;
222
+ }
223
+
224
+ .pagination-position {
225
+ color: var(--ink-muted);
226
+ }
227
+
228
+ .pagination-previous {
229
+ margin-inline-end: auto;
230
+ }
231
+
232
+ .pagination-next {
233
+ margin-inline-start: auto;
234
+ }
235
+
236
+ /* Body copy */
237
+
238
+ .post-body,
239
+ .page-body {
240
+ overflow-wrap: break-word;
241
+ }
242
+
243
+ .post-body > :first-child,
244
+ .page-body > :first-child {
245
+ margin-top: 0;
246
+ }
247
+
248
+ .post-body h2,
249
+ .page-body h2 {
250
+ margin-top: 2.25rem;
251
+ font-size: 1.35rem;
252
+ line-height: 1.3;
253
+ }
254
+
255
+ .post-body h3,
256
+ .page-body h3 {
257
+ margin-top: 1.75rem;
258
+ font-size: 1.1rem;
259
+ }
260
+
261
+ .post-body img,
262
+ .page-body img {
263
+ max-width: 100%;
264
+ height: auto;
265
+ }
266
+
267
+ .post-body blockquote,
268
+ .page-body blockquote {
269
+ margin-inline: 0;
270
+ padding-inline-start: 1rem;
271
+ border-inline-start: 3px solid var(--rule);
272
+ color: var(--ink-muted);
273
+ }
274
+
275
+ .post-body pre,
276
+ .page-body pre {
277
+ overflow-x: auto;
278
+ padding: 0.9rem 1rem;
279
+ border-radius: 6px;
280
+ background: var(--paper-sunk);
281
+ font-size: 0.875rem;
282
+ line-height: 1.5;
283
+ }
284
+
285
+ .post-body code,
286
+ .page-body code {
287
+ padding: 0.1em 0.3em;
288
+ border-radius: 4px;
289
+ background: var(--paper-sunk);
290
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
291
+ font-size: 0.9em;
292
+ }
293
+
294
+ .post-body pre code,
295
+ .page-body pre code {
296
+ padding: 0;
297
+ background: none;
298
+ font-size: inherit;
299
+ }
300
+
301
+ .post-body table,
302
+ .page-body table {
303
+ display: block;
304
+ overflow-x: auto;
305
+ border-collapse: collapse;
306
+ }
307
+
308
+ .post-body th,
309
+ .post-body td,
310
+ .page-body th,
311
+ .page-body td {
312
+ padding: 0.4rem 0.75rem;
313
+ border: 1px solid var(--rule);
314
+ text-align: start;
315
+ }
316
+
317
+ .footnotes {
318
+ margin-top: 2.5rem;
319
+ padding-top: 1rem;
320
+ border-top: 1px solid var(--rule);
321
+ color: var(--ink-muted);
322
+ font-size: 0.9rem;
323
+ }
324
+
325
+ .post-footer {
326
+ margin-top: 2.5rem;
327
+ }