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.
Files changed (32) hide show
  1. {klok_cli-1.2.0/klok_cli.egg-info → klok_cli-1.2.1}/PKG-INFO +1 -1
  2. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/__init__.py +1 -1
  3. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/dashboard.html +82 -67
  4. {klok_cli-1.2.0 → klok_cli-1.2.1/klok_cli.egg-info}/PKG-INFO +1 -1
  5. {klok_cli-1.2.0 → klok_cli-1.2.1}/pyproject.toml +1 -1
  6. {klok_cli-1.2.0 → klok_cli-1.2.1}/LICENSE +0 -0
  7. {klok_cli-1.2.0 → klok_cli-1.2.1}/README.md +0 -0
  8. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/__main__.py +0 -0
  9. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/cli.py +0 -0
  10. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/config.py +0 -0
  11. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/dashboard.py +0 -0
  12. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/focus.py +0 -0
  13. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/formats.py +0 -0
  14. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/insights.py +0 -0
  15. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/mindful.py +0 -0
  16. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/model.py +0 -0
  17. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/pairing.py +0 -0
  18. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/report.py +0 -0
  19. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/storage.py +0 -0
  20. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/timeparse.py +0 -0
  21. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok/utils.py +0 -0
  22. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok_cli.egg-info/SOURCES.txt +0 -0
  23. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok_cli.egg-info/dependency_links.txt +0 -0
  24. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok_cli.egg-info/entry_points.txt +0 -0
  25. {klok_cli-1.2.0 → klok_cli-1.2.1}/klok_cli.egg-info/top_level.txt +0 -0
  26. {klok_cli-1.2.0 → klok_cli-1.2.1}/setup.cfg +0 -0
  27. {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_cli.py +0 -0
  28. {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_insights.py +0 -0
  29. {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_mindful.py +0 -0
  30. {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_pairing.py +0 -0
  31. {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_storage.py +0 -0
  32. {klok_cli-1.2.0 → klok_cli-1.2.1}/tests/test_timeparse.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: klok-cli
3
- Version: 1.2.0
3
+ Version: 1.2.1
4
4
  Summary: A batteries-included command-line time tracker with a plaintext backend.
5
5
  Author: Rajat Singh
6
6
  License: MIT
@@ -1,3 +1,3 @@
1
1
  """klok - a command-line time tracker with a plaintext backend."""
2
2
 
3
- __version__ = "1.2.0"
3
+ __version__ = "1.2.1"
@@ -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
- <link rel="preconnect" href="https://fonts.googleapis.com">
9
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,500;0,9..144,600;1,9..144,400&family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600&display=swap">
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 — "day paper" */
16
- --plane: #efede7; /* page plane */
17
- --surface: #faf9f5; /* card surface */
18
- --surface-2: #f3f1ea; /* inset / track */
19
- --ink: #201e19; /* primary text (warm near-black) */
20
- --ink-2: #57544c; /* secondary */
21
- --muted: #8d8a80; /* axis / captions */
22
- --line: #e2dfd4; /* hairline */
23
- --line-2: #d6d2c5;
24
- --accent: #3a567f; /* instrument accent — hours / magnitude / chrome */
25
- --accent-2: #2d4568;
26
- --clay: #b8473a; /* stress hue */
27
- --teal: #2f8f6b; /* mood hue */
28
- --tip-bg: #201e19;
29
- --tip-fg: #faf9f5;
30
- --shadow: 0 1px 2px rgba(32,30,25,.05), 0 8px 28px rgba(32,30,25,.06);
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
- --plane: #100f0d;
36
- --surface: #1a1917;
37
- --surface-2: #232220;
38
- --ink: #f0eee7;
39
- --ink-2: #bbb6aa;
40
- --muted: #8f8c82;
41
- --line: #2b2a27;
42
- --line-2: #35332f;
43
- --accent: #8aa6d6;
44
- --accent-2: #a7bde3;
45
- --clay: #d9685a;
46
- --teal: #46a885;
47
- --tip-bg: #f0eee7;
48
- --tip-fg: #1a1917;
49
- --shadow: 0 1px 2px rgba(0,0,0,.3), 0 10px 32px rgba(0,0,0,.4);
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
- --plane: #100f0d;
55
- --surface: #1a1917;
56
- --surface-2: #232220;
57
- --ink: #f0eee7;
58
- --ink-2: #bbb6aa;
59
- --muted: #8f8c82;
60
- --line: #2b2a27;
61
- --line-2: #35332f;
62
- --accent: #8aa6d6;
63
- --accent-2: #a7bde3;
64
- --clay: #d9685a;
65
- --teal: #46a885;
66
- --tip-bg: #f0eee7;
67
- --tip-fg: #1a1917;
68
- --shadow: 0 1px 2px rgba(0,0,0,.3), 0 10px 32px rgba(0,0,0,.4);
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; background:var(--plane); color:var(--ink);
75
- font-family:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
76
- font-size:15px; line-height:1.55; -webkit-font-smoothing:antialiased;
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 72px; }
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:"Fraunces", Georgia, "Times New Roman", serif; }
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:"Fraunces", Georgia, serif; font-weight:500; letter-spacing:-.01em; }
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(--teal); font-weight:600; }
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(--teal); }
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:26px 0 8px; }
114
- .hero h1{ font-size:clamp(30px,6vw,52px); line-height:1.04; letter-spacing:-.02em; }
115
- .hero h1 em{ font-style:italic; color:var(--teal); }
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(20px,3vw,26px); }
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:"Fraunces",serif; font-weight:500; font-size:16px; }
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:"Fraunces",serif; font-weight:500; font-size:22px; color:var(--ink); }
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:"Fraunces",serif; font-style:italic; font-size:16px; line-height:1.5; color:var(--ink-2); text-align:center; max-width:42ch; min-height:24px; }
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 ---------- */
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: klok-cli
3
- Version: 1.2.0
3
+ Version: 1.2.1
4
4
  Summary: A batteries-included command-line time tracker with a plaintext backend.
5
5
  Author: Rajat Singh
6
6
  License: MIT
@@ -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.0"
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