@geekity/cms 0.41.0 → 0.42.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin/components/blocks.njk +15 -1
- package/admin/pages/documents/editor.njk +1 -0
- package/admin/pages/settings/reading.njk +14 -0
- package/admin/pages/users/writing-goals.njk +64 -0
- package/admin/static/admin.css +5 -1
- package/admin/static/editor.js +21 -18
- package/dist/access-log.d.ts +3 -0
- package/dist/access-log.d.ts.map +1 -1
- package/dist/access-log.js +13 -9
- package/dist/access-log.js.map +1 -1
- package/dist/admin/autosave.d.ts +1 -0
- package/dist/admin/autosave.d.ts.map +1 -1
- package/dist/admin/autosave.js +20 -4
- package/dist/admin/autosave.js.map +1 -1
- package/dist/admin/blocks.d.ts +13 -1
- package/dist/admin/blocks.d.ts.map +1 -1
- package/dist/admin/blocks.js +40 -5
- package/dist/admin/blocks.js.map +1 -1
- package/dist/admin/core-widgets.d.ts.map +1 -1
- package/dist/admin/core-widgets.js +2 -0
- package/dist/admin/core-widgets.js.map +1 -1
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +18 -0
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/editor-word-counter.d.ts +8 -0
- package/dist/admin/editor-word-counter.d.ts.map +1 -0
- package/dist/admin/editor-word-counter.js +27 -0
- package/dist/admin/editor-word-counter.js.map +1 -0
- package/dist/admin/editor-words.d.ts +7 -0
- package/dist/admin/editor-words.d.ts.map +1 -0
- package/dist/admin/editor-words.js +9 -0
- package/dist/admin/editor-words.js.map +1 -0
- package/dist/admin/focus-mode.d.ts +0 -2
- package/dist/admin/focus-mode.d.ts.map +1 -1
- package/dist/admin/focus-mode.js +0 -10
- package/dist/admin/focus-mode.js.map +1 -1
- package/dist/admin/menu.d.ts.map +1 -1
- package/dist/admin/menu.js +2 -0
- package/dist/admin/menu.js.map +1 -1
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +2 -0
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/settings-fields.d.ts.map +1 -1
- package/dist/admin/settings-fields.js +1 -0
- package/dist/admin/settings-fields.js.map +1 -1
- package/dist/admin/settings-reading.d.ts.map +1 -1
- package/dist/admin/settings-reading.js +7 -1
- package/dist/admin/settings-reading.js.map +1 -1
- package/dist/admin/templates.d.ts +1 -0
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +1 -0
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/users.d.ts.map +1 -1
- package/dist/admin/users.js +2 -0
- package/dist/admin/users.js.map +1 -1
- package/dist/admin/widget-writing.d.ts +3 -0
- package/dist/admin/widget-writing.d.ts.map +1 -0
- package/dist/admin/widget-writing.js +102 -0
- package/dist/admin/widget-writing.js.map +1 -0
- package/dist/admin/widgets.d.ts +4 -1
- package/dist/admin/widgets.d.ts.map +1 -1
- package/dist/admin/widgets.js +19 -8
- package/dist/admin/widgets.js.map +1 -1
- package/dist/admin/writing-goals.d.ts +33 -0
- package/dist/admin/writing-goals.d.ts.map +1 -0
- package/dist/admin/writing-goals.js +149 -0
- package/dist/admin/writing-goals.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +64 -3
- package/dist/cli.js.map +1 -1
- package/dist/cms/create.d.ts +5 -2
- package/dist/cms/create.d.ts.map +1 -1
- package/dist/cms/create.js +60 -2
- package/dist/cms/create.js.map +1 -1
- package/dist/cms/server-error.d.ts.map +1 -1
- package/dist/cms/server-error.js +1 -0
- package/dist/cms/server-error.js.map +1 -1
- package/dist/cms/services.d.ts.map +1 -1
- package/dist/cms/services.js +5 -0
- package/dist/cms/services.js.map +1 -1
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -2
- package/dist/config.js.map +1 -1
- package/dist/content/words.d.ts +3 -0
- package/dist/content/words.d.ts.map +1 -0
- package/dist/content/words.js +120 -0
- package/dist/content/words.js.map +1 -0
- package/dist/files/data-files.d.ts +3 -0
- package/dist/files/data-files.d.ts.map +1 -1
- package/dist/files/data-files.js +18 -0
- package/dist/files/data-files.js.map +1 -1
- package/dist/gemini/capsule.d.ts +4 -0
- package/dist/gemini/capsule.d.ts.map +1 -0
- package/dist/gemini/capsule.js +9 -0
- package/dist/gemini/capsule.js.map +1 -0
- package/dist/gemini/certificate.d.ts +34 -0
- package/dist/gemini/certificate.d.ts.map +1 -0
- package/dist/gemini/certificate.js +255 -0
- package/dist/gemini/certificate.js.map +1 -0
- package/dist/gemini/site-certificate.d.ts +8 -0
- package/dist/gemini/site-certificate.d.ts.map +1 -0
- package/dist/gemini/site-certificate.js +17 -0
- package/dist/gemini/site-certificate.js.map +1 -0
- package/dist/micropub/endpoint.d.ts.map +1 -1
- package/dist/micropub/endpoint.js +12 -0
- package/dist/micropub/endpoint.js.map +1 -1
- package/dist/plugin.d.ts +14 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/site/namespace.d.ts +1 -0
- package/dist/site/namespace.d.ts.map +1 -1
- package/dist/site/namespace.js +6 -0
- package/dist/site/namespace.js.map +1 -1
- package/dist/site/users.d.ts +7 -0
- package/dist/site/users.d.ts.map +1 -1
- package/dist/site/users.js +7 -0
- package/dist/site/users.js.map +1 -1
- package/dist/site/writing-goals.d.ts +22 -0
- package/dist/site/writing-goals.d.ts.map +1 -0
- package/dist/site/writing-goals.js +42 -0
- package/dist/site/writing-goals.js.map +1 -0
- package/dist/util/public-address.d.ts +1 -0
- package/dist/util/public-address.d.ts.map +1 -1
- package/dist/util/public-address.js +38 -30
- package/dist/util/public-address.js.map +1 -1
- package/dist/web/access-line.d.ts +2 -0
- package/dist/web/access-line.d.ts.map +1 -0
- package/dist/web/access-line.js +6 -0
- package/dist/web/access-line.js.map +1 -0
- package/dist/web/document-page.d.ts.map +1 -1
- package/dist/web/document-page.js +3 -4
- package/dist/web/document-page.js.map +1 -1
- package/dist/web/feed-routes.d.ts.map +1 -1
- package/dist/web/feed-routes.js +4 -4
- package/dist/web/feed-routes.js.map +1 -1
- package/dist/web/gemini-listener.d.ts +30 -0
- package/dist/web/gemini-listener.d.ts.map +1 -0
- package/dist/web/gemini-listener.js +186 -0
- package/dist/web/gemini-listener.js.map +1 -0
- package/dist/web/gemini-request.d.ts +23 -0
- package/dist/web/gemini-request.d.ts.map +1 -0
- package/dist/web/gemini-request.js +127 -0
- package/dist/web/gemini-request.js.map +1 -0
- package/dist/web/listing-pages.d.ts.map +1 -1
- package/dist/web/listing-pages.js +7 -5
- package/dist/web/listing-pages.js.map +1 -1
- package/dist/web/llms.d.ts +1 -0
- package/dist/web/llms.d.ts.map +1 -1
- package/dist/web/llms.js +3 -0
- package/dist/web/llms.js.map +1 -1
- package/dist/web/maintenance.js +1 -0
- package/dist/web/maintenance.js.map +1 -1
- package/dist/web/markdown-representation.d.ts +11 -20
- package/dist/web/markdown-representation.d.ts.map +1 -1
- package/dist/web/markdown-representation.js +57 -58
- package/dist/web/markdown-representation.js.map +1 -1
- package/dist/web/negotiate.d.ts +8 -17
- package/dist/web/negotiate.d.ts.map +1 -1
- package/dist/web/negotiate.js +37 -28
- package/dist/web/negotiate.js.map +1 -1
- package/dist/web/proxy-protocol.d.ts +13 -0
- package/dist/web/proxy-protocol.d.ts.map +1 -0
- package/dist/web/proxy-protocol.js +79 -0
- package/dist/web/proxy-protocol.js.map +1 -0
- package/dist/web/render.d.ts +33 -20
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +64 -27
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +4 -8
- package/dist/web/routes.js.map +1 -1
- package/dist/web/site-index.d.ts.map +1 -1
- package/dist/web/site-index.js +6 -2
- package/dist/web/site-index.js.map +1 -1
- package/dist/web/status-pages.d.ts +2 -3
- package/dist/web/status-pages.d.ts.map +1 -1
- package/dist/web/status-pages.js +14 -11
- package/dist/web/status-pages.js.map +1 -1
- package/dist/web/throttle.d.ts +9 -0
- package/dist/web/throttle.d.ts.map +1 -1
- package/dist/web/throttle.js +17 -0
- package/dist/web/throttle.js.map +1 -1
- package/dist/writing/ledger.d.ts +15 -0
- package/dist/writing/ledger.d.ts.map +1 -0
- package/dist/writing/ledger.js +70 -0
- package/dist/writing/ledger.js.map +1 -0
- package/dist/writing/progress.d.ts +25 -0
- package/dist/writing/progress.d.ts.map +1 -0
- package/dist/writing/progress.js +83 -0
- package/dist/writing/progress.js.map +1 -0
- package/package.json +2 -1
- package/themes/default/layouts/404.gmi.njk +10 -0
- package/themes/default/layouts/410.gmi.njk +8 -0
- package/themes/default/layouts/500.gmi.njk +9 -0
- package/themes/default/layouts/503.gmi.njk +9 -0
- package/themes/default/layouts/base.njk +3 -0
- package/themes/default/partials/markdown-footer.md.njk +9 -1
|
@@ -166,7 +166,7 @@
|
|
|
166
166
|
<text class="fill-base-content/70" x="24" y="{{ day.y }}" text-anchor="end" font-size="9">{{ day.label }}</text>
|
|
167
167
|
{% endfor %}
|
|
168
168
|
{% for cell in view.cells %}
|
|
169
|
-
<rect class="{% if cell.level == 0 %}fill-base-content/10{% elif cell.level == 1 %}fill-primary/25{% elif cell.level == 2 %}fill-primary/50{% elif cell.level == 3 %}fill-primary/75{% else %}fill-primary{% endif %}" x="{{ cell.x }}" y="{{ cell.y }}" width="{{ view.cell }}" height="{{ view.cell }}" rx="2"><title>{{ cell.title }}</title></rect>
|
|
169
|
+
<rect class="{% if cell.level == 0 %}fill-base-content/10{% elif cell.level == 1 %}fill-primary/25{% elif cell.level == 2 %}fill-primary/50{% elif cell.level == 3 %}fill-primary/75{% else %}fill-primary{% endif %}{% if cell.marked %} stroke-base-content{% endif %}"{% if cell.marked %} stroke-width="1.5"{% endif %} x="{{ cell.x }}" y="{{ cell.y }}" width="{{ view.cell }}" height="{{ view.cell }}" rx="2"><title>{{ cell.title }}</title></rect>
|
|
170
170
|
{% endfor %}
|
|
171
171
|
</svg>
|
|
172
172
|
</div>
|
|
@@ -180,6 +180,12 @@
|
|
|
180
180
|
<rect class="fill-primary" x="56" y="0" width="12" height="12" rx="2" />
|
|
181
181
|
</svg>
|
|
182
182
|
<span>More</span>
|
|
183
|
+
{% if view.mark %}
|
|
184
|
+
<svg class="ml-3 size-3" viewBox="0 0 12 12">
|
|
185
|
+
<rect class="fill-base-content/10 stroke-base-content" stroke-width="1.5" x="0.75" y="0.75" width="10.5" height="10.5" rx="2" />
|
|
186
|
+
</svg>
|
|
187
|
+
<span>{{ view.mark }}</span>
|
|
188
|
+
{% endif %}
|
|
183
189
|
</div>
|
|
184
190
|
{{ numbers(view) }}
|
|
185
191
|
</div>
|
|
@@ -243,6 +249,14 @@
|
|
|
243
249
|
{{ bars(view) }}
|
|
244
250
|
{% elif view.kind == 'calendar' %}
|
|
245
251
|
{{ calendar(view) }}
|
|
252
|
+
{% elif view.kind == 'progress' %}
|
|
253
|
+
<div class="grid gap-1">
|
|
254
|
+
<div class="flex flex-wrap justify-between gap-x-3 text-sm">
|
|
255
|
+
<span>{{ view.label }}</span>
|
|
256
|
+
<span class="tabular-nums">{{ view.value }} of {{ view.max }} · <span class="font-semibold">{{ view.percent }}</span></span>
|
|
257
|
+
</div>
|
|
258
|
+
<progress class="progress progress-primary w-full" value="{{ view.filled }}" max="{{ view.limit }}" aria-label="{{ view.label }}">{{ view.percent }}</progress>
|
|
259
|
+
</div>
|
|
246
260
|
{% else %}
|
|
247
261
|
{% if view.caption %}<p class="text-sm font-semibold">{{ view.caption }}</p>{% endif %}
|
|
248
262
|
<p class="text-sm text-base-content/70">No data to show.</p>
|
|
@@ -502,6 +502,7 @@
|
|
|
502
502
|
{% endif %}
|
|
503
503
|
|
|
504
504
|
{{ field.textarea('editor-body', 'body', (editorKind.body if editorKind else 'Body'), value=form.body, rows=(8 if editorKind and editorKind.sections | length else 20)) }}
|
|
505
|
+
<p id="editor-words" class="text-sm text-base-content/70 tabular-nums"{% if words.today is defined %} data-words-today="{{ words.today }}"{% endif %}>{{ words.label }}</p>
|
|
505
506
|
|
|
506
507
|
{# Everything the editor's own script needs, on the element it hangs
|
|
507
508
|
off. With JavaScript off this is one button that posts the form to
|
|
@@ -161,4 +161,18 @@
|
|
|
161
161
|
{% endset %}
|
|
162
162
|
{{ field.checkbox('settings-index-now', fields.index_now, 'Submit changes to IndexNow',
|
|
163
163
|
checked=form.index_now, hintHtml=indexNowHint) }}
|
|
164
|
+
|
|
165
|
+
{% set geminiHint %}
|
|
166
|
+
Serves the site as a Gemini capsule at <code>gemini://</code> with a self-signed
|
|
167
|
+
certificate the site generates once and keeps. Gemini clients remember the
|
|
168
|
+
certificate on their first visit, so a new one makes every visitor's client warn.
|
|
169
|
+
{% if geminiCertificate and geminiCertificate.ok %}
|
|
170
|
+
<span class="block mt-1">SHA-256 fingerprint:
|
|
171
|
+
<code class="break-all">{{ geminiCertificate.certificate.fingerprint256 }}</code></span>
|
|
172
|
+
{% elif geminiCertificate %}
|
|
173
|
+
<span class="block mt-1 text-error">{{ geminiCertificate.problem }}</span>
|
|
174
|
+
{% endif %}
|
|
175
|
+
{% endset %}
|
|
176
|
+
{{ field.checkbox('settings-gemini', fields.gemini, 'Serve over Gemini',
|
|
177
|
+
checked=form.gemini, hintHtml=geminiHint) }}
|
|
164
178
|
{% endblock %}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{% extends "layouts/shell.njk" %}
|
|
2
|
+
{% import "components/fields.njk" as field %}
|
|
3
|
+
{% from "components/button.njk" import button %}
|
|
4
|
+
{% from "components/card.njk" import card %}
|
|
5
|
+
|
|
6
|
+
{% block title %}Writing goals{% endblock %}
|
|
7
|
+
|
|
8
|
+
{% block content %}
|
|
9
|
+
<h1 class="mb-6 text-2xl font-bold">Writing goals</h1>
|
|
10
|
+
|
|
11
|
+
<div class="flex max-w-2xl flex-col gap-6">
|
|
12
|
+
{% if hasProblems %}
|
|
13
|
+
{% call field.summary('Nothing was saved. Fix the fields marked below and save again.') %}
|
|
14
|
+
{{ field.problem('goal-words', problems.words) }}
|
|
15
|
+
{{ field.problem('goal-period', problems.period) }}
|
|
16
|
+
{{ field.problem('streak-daily-words', problems.dailyWords) }}
|
|
17
|
+
{{ field.problem('streak-misses-allowed', problems.missesAllowed) }}
|
|
18
|
+
{% endcall %}
|
|
19
|
+
{% endif %}
|
|
20
|
+
|
|
21
|
+
{% call card() %}
|
|
22
|
+
<form method="post" action="{{ formUrl }}">
|
|
23
|
+
<input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
|
|
24
|
+
|
|
25
|
+
<p class="text-sm">
|
|
26
|
+
The site counts the words you write in the editor whether or not you
|
|
27
|
+
track a goal. Tracking shows your progress and your streak on the
|
|
28
|
+
dashboard. Turning it off keeps your goal for when you turn it on again.
|
|
29
|
+
</p>
|
|
30
|
+
|
|
31
|
+
{{ field.checkbox('writing-tracking', fields.tracking, 'Track writing goals', checked=form.tracking,
|
|
32
|
+
hint=('Save to set your goal.' if not form.tracking else '')) }}
|
|
33
|
+
|
|
34
|
+
{% if form.tracking or hasProblems %}
|
|
35
|
+
<h2 class="mt-4 font-semibold">Goal</h2>
|
|
36
|
+
{{ field.text('goal-words', fields.words, 'Words', form.words, type='number', min='1', step='1',
|
|
37
|
+
inputmode='numeric', error=problems.words) }}
|
|
38
|
+
{% call field.select('goal-period', fields.period, 'Every', error=problems.period) %}
|
|
39
|
+
{% for period in periods %}
|
|
40
|
+
<option value="{{ period.value }}"{% if period.chosen %} selected{% endif %}>{{ period.label }}</option>
|
|
41
|
+
{% endfor %}
|
|
42
|
+
{% endcall %}
|
|
43
|
+
|
|
44
|
+
<h2 class="mt-4 font-semibold">Streak</h2>
|
|
45
|
+
{% set dailyHint %}
|
|
46
|
+
A day keeps your streak when you write at least this many words. Leave
|
|
47
|
+
it empty to use your goal's daily pace{% if paceWords %} ({{ paceWords }} words){% endif %}.
|
|
48
|
+
{% endset %}
|
|
49
|
+
{{ field.text('streak-daily-words', fields.dailyWords, 'Words a day', form.dailyWords, type='number',
|
|
50
|
+
min='1', step='1', inputmode='numeric', error=problems.dailyWords, hintHtml=dailyHint) }}
|
|
51
|
+
{% set missesHint %}
|
|
52
|
+
How many missed days in a row your streak survives, from 0 to {{ maxMissesAllowed }}.
|
|
53
|
+
With 1, missing a day is fine and missing two in a row ends it.
|
|
54
|
+
{% endset %}
|
|
55
|
+
{{ field.text('streak-misses-allowed', fields.missesAllowed, 'Missed days allowed', form.missesAllowed,
|
|
56
|
+
type='number', min='0', step='1', inputmode='numeric', error=problems.missesAllowed,
|
|
57
|
+
hintHtml=missesHint) }}
|
|
58
|
+
{% endif %}
|
|
59
|
+
|
|
60
|
+
<div class="mt-4">{{ button('Save writing goals', type='submit', color='primary') }}</div>
|
|
61
|
+
</form>
|
|
62
|
+
{% endcall %}
|
|
63
|
+
</div>
|
|
64
|
+
{% endblock %}
|
package/admin/static/admin.css
CHANGED
|
@@ -7275,6 +7275,10 @@
|
|
|
7275
7275
|
margin-bottom: calc(var(--spacing) * 10);
|
|
7276
7276
|
}
|
|
7277
7277
|
|
|
7278
|
+
.ml-3 {
|
|
7279
|
+
margin-left: calc(var(--spacing) * 3);
|
|
7280
|
+
}
|
|
7281
|
+
|
|
7278
7282
|
.box-content {
|
|
7279
7283
|
box-sizing: content-box;
|
|
7280
7284
|
}
|
|
@@ -7884,7 +7888,7 @@
|
|
|
7884
7888
|
stroke: var(--color-base-100);
|
|
7885
7889
|
}
|
|
7886
7890
|
|
|
7887
|
-
.stroke-base-content\/10 {
|
|
7891
|
+
.stroke-base-content, .stroke-base-content\/10 {
|
|
7888
7892
|
stroke: var(--color-base-content);
|
|
7889
7893
|
}
|
|
7890
7894
|
|