klok-cli 1.2.0__tar.gz → 1.2.1__tar.gz
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.
- {klok_cli-1.2.0/klok_cli.egg-info → klok_cli-1.2.1}/PKG-INFO +1 -1
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/__init__.py +1 -1
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/dashboard.html +82 -67
- {klok_cli-1.2.0 → klok_cli-1.2.1/klok_cli.egg-info}/PKG-INFO +1 -1
- {klok_cli-1.2.0 → klok_cli-1.2.1}/pyproject.toml +1 -1
- {klok_cli-1.2.0 → klok_cli-1.2.1}/LICENSE +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/README.md +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/__main__.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/cli.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/config.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/dashboard.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/focus.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/formats.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/insights.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/mindful.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/model.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/pairing.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/report.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/storage.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/timeparse.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/utils.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok_cli.egg-info/SOURCES.txt +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok_cli.egg-info/dependency_links.txt +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok_cli.egg-info/entry_points.txt +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/klok_cli.egg-info/top_level.txt +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/setup.cfg +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_cli.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_insights.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_mindful.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_pairing.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_storage.py +0 -0
- {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_timeparse.py +0 -0
|
@@ -5,82 +5,96 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
6
6
|
<title>Hours & Feelings</title>
|
|
7
7
|
<meta name="description" content="A klok dashboard that shows not just where your time went, but how it felt.">
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
<!-- Offline-first: the whole page is one self-contained file with no network
|
|
9
|
+
fetches. Type is the system font stack (thin Helvetica / system mono), so
|
|
10
|
+
the dashboard opens straight from disk with nothing to load. -->
|
|
11
11
|
|
|
12
12
|
<style>
|
|
13
13
|
/* ---- layout concept: single-column calm instrument panel; one color language (feeling ramp) tints every block of time; serif = feeling, mono = measurement ---- */
|
|
14
14
|
:root{
|
|
15
|
-
/* light — "
|
|
16
|
-
--
|
|
17
|
-
--
|
|
18
|
-
--
|
|
19
|
-
--
|
|
20
|
-
--
|
|
21
|
-
--
|
|
22
|
-
--
|
|
23
|
-
--
|
|
24
|
-
--
|
|
25
|
-
--
|
|
26
|
-
--
|
|
27
|
-
--
|
|
28
|
-
--
|
|
29
|
-
--
|
|
30
|
-
--
|
|
15
|
+
/* light — "Renaissance daylight": parchment + sky, muted & earthy, one magenta pop */
|
|
16
|
+
--paper: #e7e1d3; /* base parchment */
|
|
17
|
+
--sky: #cdd7da; /* upper light wash */
|
|
18
|
+
--land: #c6ccb0; /* lower foliage warmth */
|
|
19
|
+
--plane: #e7e1d3;
|
|
20
|
+
--surface: rgba(250,248,242,.70); /* frosted-glass card */
|
|
21
|
+
--surface-2: rgba(238,235,227,.78); /* inset / track */
|
|
22
|
+
--ink: #26231c; /* primary text (warm near-black) */
|
|
23
|
+
--ink-2: #595345; /* secondary */
|
|
24
|
+
--muted: #6b6452; /* axis / captions (AA on the parchment ground) */
|
|
25
|
+
--line: rgba(92,80,58,.20); /* hairline */
|
|
26
|
+
--line-2: rgba(92,80,58,.32);
|
|
27
|
+
--accent: #cf1d84; /* the magenta pop — chrome / magnitude / highlight */
|
|
28
|
+
--accent-2: #a8166a;
|
|
29
|
+
--clay: #b05a3f; /* stress hue — terracotta */
|
|
30
|
+
--teal: #5f7d53; /* mood hue — sage / olive */
|
|
31
|
+
--tip-bg: #26231c;
|
|
32
|
+
--tip-fg: #faf8f2;
|
|
33
|
+
--shadow: 0 2px 6px rgba(40,35,25,.06), 0 18px 44px rgba(40,35,25,.10);
|
|
31
34
|
color-scheme: light;
|
|
32
35
|
}
|
|
33
36
|
@media (prefers-color-scheme: dark){
|
|
34
37
|
:root:not([data-theme="light"]){
|
|
35
|
-
--
|
|
36
|
-
--
|
|
37
|
-
--
|
|
38
|
-
--
|
|
39
|
-
--
|
|
40
|
-
--
|
|
41
|
-
--
|
|
42
|
-
--
|
|
43
|
-
--
|
|
44
|
-
--
|
|
45
|
-
--
|
|
46
|
-
--
|
|
47
|
-
--
|
|
48
|
-
--
|
|
49
|
-
--
|
|
38
|
+
--paper: #121813;
|
|
39
|
+
--sky: #27313a;
|
|
40
|
+
--land: #182414;
|
|
41
|
+
--plane: #121813;
|
|
42
|
+
--surface: rgba(28,34,26,.52);
|
|
43
|
+
--surface-2: rgba(20,26,19,.62);
|
|
44
|
+
--ink: #ece7da;
|
|
45
|
+
--ink-2: #b6afa0;
|
|
46
|
+
--muted: #85806f;
|
|
47
|
+
--line: rgba(225,215,190,.14);
|
|
48
|
+
--line-2: rgba(225,215,190,.22);
|
|
49
|
+
--accent: #ef4aa6;
|
|
50
|
+
--accent-2: #f472b8;
|
|
51
|
+
--clay: #cf7a5a;
|
|
52
|
+
--teal: #83a271;
|
|
53
|
+
--tip-bg: #ece7da;
|
|
54
|
+
--tip-fg: #141b16;
|
|
55
|
+
--shadow: 0 2px 6px rgba(0,0,0,.35), 0 18px 44px rgba(0,0,0,.45);
|
|
50
56
|
color-scheme: dark;
|
|
51
57
|
}
|
|
52
58
|
}
|
|
53
59
|
:root[data-theme="dark"]{
|
|
54
|
-
--
|
|
55
|
-
--
|
|
56
|
-
--
|
|
57
|
-
--
|
|
58
|
-
--
|
|
59
|
-
--
|
|
60
|
-
--
|
|
61
|
-
--
|
|
62
|
-
--
|
|
63
|
-
--
|
|
64
|
-
--
|
|
65
|
-
--
|
|
66
|
-
--
|
|
67
|
-
--
|
|
68
|
-
--
|
|
60
|
+
--paper: #121813;
|
|
61
|
+
--sky: #27313a;
|
|
62
|
+
--land: #182414;
|
|
63
|
+
--plane: #121813;
|
|
64
|
+
--surface: rgba(28,34,26,.52);
|
|
65
|
+
--surface-2: rgba(20,26,19,.62);
|
|
66
|
+
--ink: #ece7da;
|
|
67
|
+
--ink-2: #b6afa0;
|
|
68
|
+
--muted: #85806f;
|
|
69
|
+
--line: rgba(225,215,190,.14);
|
|
70
|
+
--line-2: rgba(225,215,190,.22);
|
|
71
|
+
--accent: #ef4aa6;
|
|
72
|
+
--accent-2: #f472b8;
|
|
73
|
+
--clay: #cf7a5a;
|
|
74
|
+
--teal: #83a271;
|
|
75
|
+
--tip-bg: #ece7da;
|
|
76
|
+
--tip-fg: #141b16;
|
|
77
|
+
--shadow: 0 2px 6px rgba(0,0,0,.35), 0 18px 44px rgba(0,0,0,.45);
|
|
69
78
|
color-scheme: dark;
|
|
70
79
|
}
|
|
71
80
|
|
|
72
81
|
*{ box-sizing:border-box; }
|
|
73
82
|
body{
|
|
74
|
-
margin:0;
|
|
75
|
-
|
|
76
|
-
|
|
83
|
+
margin:0; color:var(--ink);
|
|
84
|
+
background:
|
|
85
|
+
radial-gradient(135% 95% at 50% -20%, var(--sky) 0%, transparent 56%),
|
|
86
|
+
radial-gradient(110% 75% at 85% 118%, var(--land) 0%, transparent 60%),
|
|
87
|
+
var(--paper);
|
|
88
|
+
background-attachment:fixed;
|
|
89
|
+
font-family:"Helvetica Neue", Helvetica, -apple-system, system-ui, "Segoe UI", "Noto Sans JP", Arial, sans-serif;
|
|
90
|
+
font-size:15px; line-height:1.55; font-weight:380; -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
|
|
77
91
|
}
|
|
78
|
-
.wrap{ max-width:1080px; margin:0 auto; padding-inline:20px; padding-block:0
|
|
92
|
+
.wrap{ max-width:1080px; margin:0 auto; padding-inline:20px; padding-block:0 96px; counter-reset:sec; }
|
|
79
93
|
.mono{ font-family:"IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace; font-variant-numeric:tabular-nums; }
|
|
80
|
-
.serif{ font-family:"
|
|
94
|
+
.serif{ font-family:Georgia,"Iowan Old Style","Palatino Linotype","Times New Roman",serif; }
|
|
81
95
|
|
|
82
96
|
a{ color:var(--accent); }
|
|
83
|
-
h1,h2,h3{ margin:0; text-wrap:balance; font-family:"
|
|
97
|
+
h1,h2,h3{ margin:0; text-wrap:balance; font-family:Georgia,"Iowan Old Style","Palatino Linotype","Times New Roman",serif; font-weight:400; letter-spacing:-.005em; }
|
|
84
98
|
|
|
85
99
|
/* ---------- header ---------- */
|
|
86
100
|
header.top{
|
|
@@ -92,9 +106,9 @@ header.top{
|
|
|
92
106
|
}
|
|
93
107
|
.brand{ display:flex; align-items:baseline; gap:12px; min-width:0; }
|
|
94
108
|
.logo{ font-family:"IBM Plex Mono",monospace; font-weight:600; font-size:19px; letter-spacing:.02em; color:var(--ink); }
|
|
95
|
-
.logo b{ color:var(--
|
|
109
|
+
.logo b{ color:var(--accent); font-weight:600; }
|
|
96
110
|
.brand .cmd{ font-family:"IBM Plex Mono",monospace; font-size:12px; color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
|
|
97
|
-
.brand .cmd .caret{ color:var(--
|
|
111
|
+
.brand .cmd .caret{ color:var(--accent); }
|
|
98
112
|
.controls{ display:flex; align-items:center; gap:8px; flex-shrink:0; }
|
|
99
113
|
.seg{ display:inline-flex; background:var(--surface-2); border:1px solid var(--line); border-radius:999px; padding:3px; }
|
|
100
114
|
.seg button{
|
|
@@ -110,15 +124,15 @@ header.top{
|
|
|
110
124
|
button:focus-visible, a:focus-visible, [tabindex]:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; border-radius:4px; }
|
|
111
125
|
|
|
112
126
|
/* ---------- hero ---------- */
|
|
113
|
-
.hero{ padding:
|
|
114
|
-
.hero h1{ font-size:clamp(
|
|
115
|
-
.hero h1 em{ font-style:italic; color:var(--
|
|
127
|
+
.hero{ padding:40px 0 12px; }
|
|
128
|
+
.hero h1{ font-size:clamp(38px,8vw,84px); line-height:1.0; letter-spacing:-.02em; font-weight:400; }
|
|
129
|
+
.hero h1 em{ font-style:italic; color:var(--accent); }
|
|
116
130
|
.lede{ margin:18px 0 0; max-width:60ch; color:var(--ink-2); font-size:clamp(15px,2.2vw,18px); line-height:1.5; }
|
|
117
131
|
.lede strong{ color:var(--ink); font-weight:600; }
|
|
118
132
|
|
|
119
133
|
/* ---------- stat tiles ---------- */
|
|
120
134
|
.tiles{ display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin-top:26px; }
|
|
121
|
-
.tile{ background:var(--surface); border:1px solid var(--line); border-radius:14px; padding:16px 16px 14px; box-shadow:var(--shadow); min-width:0; }
|
|
135
|
+
.tile{ background:var(--surface); border:1px solid var(--line); border-radius:14px; padding:16px 16px 14px; box-shadow:var(--shadow); min-width:0; backdrop-filter:blur(14px) saturate(1.15); -webkit-backdrop-filter:blur(14px) saturate(1.15); }
|
|
122
136
|
.tile .k{ font-family:"IBM Plex Mono",monospace; font-size:11px; letter-spacing:.06em; text-transform:lowercase; color:var(--muted); }
|
|
123
137
|
.tile .v{ font-family:"IBM Plex Mono",monospace; font-weight:500; font-size:clamp(22px,3.3vw,30px); margin-top:6px; line-height:1; color:var(--ink); }
|
|
124
138
|
.tile .v small{ font-size:.5em; color:var(--muted); font-weight:400; margin-left:3px; }
|
|
@@ -127,11 +141,12 @@ button:focus-visible, a:focus-visible, [tabindex]:focus-visible{ outline:2px sol
|
|
|
127
141
|
|
|
128
142
|
/* ---------- section + cards ---------- */
|
|
129
143
|
section{ margin-top:40px; }
|
|
130
|
-
.sec-head{ display:flex; align-items:flex-end; justify-content:space-between; gap:16px; margin-bottom:14px; }
|
|
131
|
-
.sec-head h2{ font-size:clamp(
|
|
144
|
+
.sec-head{ display:flex; align-items:flex-end; justify-content:space-between; gap:16px; margin-bottom:14px; counter-increment:sec; }
|
|
145
|
+
.sec-head h2{ font-size:clamp(22px,3vw,28px); }
|
|
146
|
+
.sec-head h2::before{ content:counter(sec,upper-roman) "\00a0\00a0"; font-family:"IBM Plex Mono",monospace; font-weight:600; font-size:.5em; letter-spacing:.1em; color:var(--accent-2); vertical-align:.2em; }
|
|
132
147
|
.sec-head p{ margin:4px 0 0; color:var(--ink-2); font-size:13.5px; max-width:52ch; }
|
|
133
148
|
.sec-head .hint{ font-family:"IBM Plex Mono",monospace; font-size:11px; color:var(--muted); white-space:nowrap; }
|
|
134
|
-
.card{ background:var(--surface); border:1px solid var(--line); border-radius:16px; padding:20px; box-shadow:var(--shadow); }
|
|
149
|
+
.card{ background:var(--surface); border:1px solid var(--line); border-radius:16px; padding:20px; box-shadow:var(--shadow); backdrop-filter:blur(14px) saturate(1.15); -webkit-backdrop-filter:blur(14px) saturate(1.15); }
|
|
135
150
|
|
|
136
151
|
/* ---------- bubble (energy–time map) ---------- */
|
|
137
152
|
.map-wrap{ position:relative; }
|
|
@@ -191,7 +206,7 @@ table.feel tr:last-child td{ border-bottom:0; }
|
|
|
191
206
|
.trend-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:14px; }
|
|
192
207
|
.trend{ background:var(--surface); border:1px solid var(--line); border-radius:14px; padding:14px 14px 10px; box-shadow:var(--shadow); min-width:0; }
|
|
193
208
|
.trend .th{ display:flex; align-items:baseline; justify-content:space-between; gap:8px; }
|
|
194
|
-
.trend .th b{ font-family:"
|
|
209
|
+
.trend .th b{ font-family:"Helvetica Neue",Helvetica,-apple-system,system-ui,sans-serif; font-weight:500; font-size:16px; }
|
|
195
210
|
.trend .th .now{ font-family:"IBM Plex Mono",monospace; font-size:17px; font-weight:500; }
|
|
196
211
|
.trend .cap{ font-size:11.5px; color:var(--muted); margin-top:1px; }
|
|
197
212
|
.trend svg{ width:100%; height:auto; display:block; margin-top:8px; }
|
|
@@ -218,7 +233,7 @@ table.feel tr:last-child td{ border-bottom:0; }
|
|
|
218
233
|
background:radial-gradient(circle at 36% 32%, color-mix(in srgb, var(--accent) 48%, #ffffff) 0%, var(--accent) 72%);
|
|
219
234
|
box-shadow:0 0 55px -6px var(--accent); opacity:.94; transform:scale(.66); }
|
|
220
235
|
.b-now{ text-align:center; min-height:34px; }
|
|
221
|
-
.b-now .phase{ font-family:"
|
|
236
|
+
.b-now .phase{ font-family:"Helvetica Neue",Helvetica,-apple-system,system-ui,sans-serif; font-weight:500; font-size:22px; color:var(--ink); }
|
|
222
237
|
.b-now .count{ font-family:"IBM Plex Mono",monospace; font-size:14px; color:var(--muted); margin-left:8px; }
|
|
223
238
|
.breathe-controls{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; justify-content:center; }
|
|
224
239
|
.b-begin{ font-family:"IBM Plex Mono",monospace; font-size:14px; letter-spacing:.02em; background:var(--accent); color:#fff; border:0; border-radius:999px; padding:11px 28px; cursor:pointer; }
|
|
@@ -226,7 +241,7 @@ table.feel tr:last-child td{ border-bottom:0; }
|
|
|
226
241
|
.pattern-seg{ display:inline-flex; background:var(--surface-2); border:1px solid var(--line); border-radius:999px; padding:3px; }
|
|
227
242
|
.pattern-seg button{ font-family:"IBM Plex Mono",monospace; font-size:12px; border:0; background:transparent; color:var(--ink-2); padding:6px 14px; border-radius:999px; cursor:pointer; }
|
|
228
243
|
.pattern-seg button[aria-pressed="true"]{ background:var(--surface); color:var(--ink); box-shadow:0 1px 2px rgba(0,0,0,.08); }
|
|
229
|
-
.breathe-guide{ font-family:"
|
|
244
|
+
.breathe-guide{ font-family:"Helvetica Neue",Helvetica,-apple-system,system-ui,sans-serif; font-style:italic; font-size:16px; line-height:1.5; color:var(--ink-2); text-align:center; max-width:42ch; min-height:24px; }
|
|
230
245
|
@media (prefers-reduced-motion:reduce){ .orb{ transform:scale(.82) !important; } }
|
|
231
246
|
|
|
232
247
|
/* ---------- footer ---------- */
|
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
|
|
7
7
|
# by an unrelated, empty placeholder package. The installed command is
|
|
8
8
|
# still plain `klok` - see [project.scripts] below.
|
|
9
9
|
name = "klok-cli"
|
|
10
|
-
version = "1.2.
|
|
10
|
+
version = "1.2.1"
|
|
11
11
|
description = "A batteries-included command-line time tracker with a plaintext backend."
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
requires-python = ">=3.9"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|