@dstally/tokens 1.0.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.
package/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # @dstally/tokens
2
+
3
+ ```ts
4
+ import '@dstally/tokens/styles.css'
5
+ ```
6
+
7
+ That one import gives you every `--*` variable, the element baseline (`body`, headings, links, focus rings), the `.tally-num` / `.tally-overline` / `.tally-container` helpers, and the webfonts.
8
+
9
+ Dark is `:root`. Light is `[data-theme="light"]` on any ancestor.
10
+
11
+ ## Files
12
+
13
+ - `tokens/colors.css` — indigo / amber / blue / neutral ramps, Okabe-Ito chart palette, semantic aliases for both themes.
14
+ - `tokens/typography.css` — scale, weights, timer sizes.
15
+ - `tokens/spacing.css` — 4px grid, layout widths, control heights.
16
+ - `tokens/elevation.css` — radii, shadows, blur, scrim.
17
+ - `tokens/motion.css` — durations, easings, reduced-motion.
18
+ - `tokens/fonts.css` — font stacks. Currently loads Instrument Sans + JetBrains Mono from Google Fonts; swap for local `@font-face` when licensed files exist.
19
+ - `tokens/base.css` — element defaults.
20
+ - `assets/` — `logo.svg` (64px+), `logo-small.svg` (16/32), PNG exports 16→1024.
21
+
22
+ ## Rails
23
+
24
+ Copy `styles.css` and `tokens/` into `app/assets/stylesheets/tally/` (or vendor the package via importmap/jsbundling) and include it before application styles. Reports and emails then use the same variables as the apps.
25
+
26
+ ## Rules
27
+
28
+ Use the semantic alias (`--surface-card`, `--text-body`, `--action-primary`), never the base ramp (`--neutral-850`). Charts and project colours use `--chart-1…8` only.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,32 @@
1
+ # Tally — app icon
2
+
3
+ Four white uprights and an amber fifth mark drawn as a growth curve, on a deep indigo
4
+ gradient.
5
+
6
+ ## Files
7
+
8
+ - `tally.svg` — vector master. Use for 64 px and up.
9
+ - `tally-small.svg` — 16 and 32 px artwork. Three uprights instead of four, strokes
10
+ widened 68 → 104. At 16 px the icon shape is only 12.9 px wide, which fits three
11
+ strokes with usable gaps but not four; the full mark turns to grey haze.
12
+ - `png/` — flat exports. 16 and 32 come from `tally-small.svg`.
13
+ - `Tally.iconset/` — the same PNGs under Apple's names. Delete it if your build pipeline
14
+ generates its own.
15
+
16
+ ## Build
17
+
18
+ ```
19
+ iconutil -c icns Tally.iconset -o Tally.icns
20
+ ```
21
+
22
+ ## Specs
23
+
24
+ 1024 × 1024 canvas, icon shape 824 wide and centred, corner radius 181.3 (22%),
25
+ transparent outside the shape, no baked shadow.
26
+
27
+ Background `#4A57D2 → #2C3391 → #151A54`, with a 16% white lift from the top edge.
28
+ Marks `#FFFFFF`. Curve `#F5A524`.
29
+
30
+ The curve is one cubic Bézier with a round cap. Its control points sit symmetrically about
31
+ the chord, which is what keeps the bend even along the whole stroke — if you edit it, keep
32
+ them mirrored or it develops an elbow.
@@ -0,0 +1,15 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024" xmlns:c2pa="http://c2pa.org/manifest"><metadata><c2pa:manifest>AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTpjNjk3NDQ4My0yYTI4LTQ1NjctYjA1Yy0zOWY0NDI3N2Q5Y2UAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaKxhLNdO+z/3SL5VjI6QiKUAAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDowMzA4ZTU1Mi01MTlkLTQyNzQtYTFmZC05ZTNhZjI2NTY4NTFscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNo8RlcpgmHCdRmg8pin7mxPwAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggLQMC+Up3WMiYZeFP+4NkioKnGS4/EcCM9XYlgcwDPGWkZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaGLd3VB9nz48NWno5vB3yccAAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCClVpTG+J3oHO5viktt28rnxSEmYxBWSirDCi92C/VUR2RuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBiaZmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOmM2OTc0NDgzLTJhMjgtNDU2Ny1iMDVjLTM5ZjQ0Mjc3ZDljZS9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOjAxNmRlMTM5LTA4MmQtNDBiNS05MzcyLTg3NjZkZTliZWM0NXJjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCAtAwL5SndYyJhl4U/7g2SKgqcZLj8RwIz1diWBzAM8ZaJjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFggfJxdwa97MJ3XPnmID2fk+wKPsIjCk0BGws8iVWdLSCSiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFggDjRexpit+/ZOgcj4M81MSi8D+KYfhrGhsVQ4W8CWqgp0Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZYQJ/1HIGpfLh9Tv/M39XcWDXgYwig+wqdH3BitHbsSGXhClftsHuJmLNMj9cnzdFfmmy7Omlxi85LsA0xnt9/U+4=</c2pa:manifest></metadata>
2
+ <defs>
3
+ <linearGradient id="bg" x1="0" y1="0" x2="0.35" y2="1"><stop offset="0" stop-color="#4A57D2"></stop><stop offset="0.55" stop-color="#2C3391"></stop><stop offset="1" stop-color="#151A54"></stop></linearGradient>
4
+ <radialGradient id="lift" cx="0.5" cy="0.06" r="0.85"><stop offset="0" stop-color="#FFFFFF" stop-opacity="0.16"></stop><stop offset="1" stop-color="#FFFFFF" stop-opacity="0"></stop></radialGradient>
5
+ <clipPath id="mask"><rect x="100.0" y="100.0" width="824" height="824" rx="181.3" ry="181.3"></rect></clipPath>
6
+ </defs>
7
+ <rect id="icon-shape" x="100.0" y="100.0" width="824" height="824" rx="181.3" ry="181.3" fill="url(#bg)"></rect>
8
+ <rect x="100.0" y="100.0" width="824" height="824" rx="181.3" ry="181.3" fill="url(#lift)"></rect>
9
+ <g clip-path="url(#mask)">
10
+ <line x1="332" y1="300" x2="332" y2="724" stroke="#FFFFFF" stroke-width="104" stroke-linecap="round"></line>
11
+ <line x1="512" y1="300" x2="512" y2="724" stroke="#FFFFFF" stroke-width="104" stroke-linecap="round"></line>
12
+ <line x1="692" y1="300" x2="692" y2="724" stroke="#FFFFFF" stroke-width="104" stroke-linecap="round"></line>
13
+ <path d="M 272 714 C 482.5 611.9, 615.8 497.1, 748 304" fill="none" stroke="#F5A524" stroke-width="110" stroke-linecap="round"></path>
14
+ </g>
15
+ </svg>
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024" xmlns:c2pa="http://c2pa.org/manifest"><metadata><c2pa:manifest>AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTowNWViYjU5OC0yMmRiLTQ3N2EtOTllMS1iYmZiZmZhMWY2MzYAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaPT/BoKeGEBfPoXe9mo1YOEAAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDphMmRmM2U1YS0zYTViLTRiOGUtODQ4OC1hZTgzM2NjOWI1YjFscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNotYysDq3FO8g1zO6WSn3uZQAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggUjIPpTTjVa7TlPX4G1JZ+vw8aTlojdFbTCnkOqySpvWkZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaGLKUChMJy0p4xHd4rRQlmMAAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCDNCxt6mfviPmkodwq+5uqBxQX9yKsVQlogoy8Mgv4KVWRuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBiaZmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOjA1ZWJiNTk4LTIyZGItNDc3YS05OWUxLWJiZmJmZmExZjYzNi9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOmU2MTc4MDc3LWFlZTYtNDhhZS1hZTI0LTdmOThjY2JmNzliN3JjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCBSMg+lNONVrtOU9fgbUln6/DxpOWiN0VtMKeQ6rJKm9aJjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFggEViiyXc2OxHnP/Z+vYs+okLFDQE+j2UXoZE5XY8gUgeiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFggaG7v43NnVsoAj1pYdSumpuxeLcpyjtVo6c5xvUwwb790Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZYQKhzUO/0ELqYYTwk03aTq4qO7liqE5FeQAFVpTfr+aW8NqY861YrBVene3zCw69Y6pn+pCEgS0779TcsFjhN1ts=</c2pa:manifest></metadata>
2
+ <defs>
3
+ <linearGradient id="bg" x1="0" y1="0" x2="0.35" y2="1"><stop offset="0" stop-color="#4A57D2"></stop><stop offset="0.55" stop-color="#2C3391"></stop><stop offset="1" stop-color="#151A54"></stop></linearGradient>
4
+ <radialGradient id="lift" cx="0.5" cy="0.06" r="0.85"><stop offset="0" stop-color="#FFFFFF" stop-opacity="0.16"></stop><stop offset="1" stop-color="#FFFFFF" stop-opacity="0"></stop></radialGradient>
5
+ <clipPath id="mask"><rect x="100.0" y="100.0" width="824" height="824" rx="181.3" ry="181.3"></rect></clipPath>
6
+ </defs>
7
+ <rect id="icon-shape" x="100.0" y="100.0" width="824" height="824" rx="181.3" ry="181.3" fill="url(#bg)"></rect>
8
+ <rect x="100.0" y="100.0" width="824" height="824" rx="181.3" ry="181.3" fill="url(#lift)"></rect>
9
+ <g clip-path="url(#mask)">
10
+ <line x1="308" y1="296" x2="308" y2="728" stroke="#FFFFFF" stroke-width="68" stroke-linecap="round"></line>
11
+ <line x1="444" y1="296" x2="444" y2="728" stroke="#FFFFFF" stroke-width="68" stroke-linecap="round"></line>
12
+ <line x1="580" y1="296" x2="580" y2="728" stroke="#FFFFFF" stroke-width="68" stroke-linecap="round"></line>
13
+ <line x1="716" y1="296" x2="716" y2="728" stroke="#FFFFFF" stroke-width="68" stroke-linecap="round"></line>
14
+ <path d="M 248 716 C 478.0 619.0, 626.4 504.2, 778 306" fill="none" stroke="#F5A524" stroke-width="80" stroke-linecap="round"></path>
15
+ </g>
16
+ </svg>
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@dstally/tokens",
3
+ "version": "1.0.0",
4
+ "description": "Tally design tokens: CSS custom properties, base styles, fonts and brand assets.",
5
+ "license": "MIT",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "files": [
10
+ "styles.css",
11
+ "tokens",
12
+ "assets",
13
+ "README.md"
14
+ ],
15
+ "exports": {
16
+ ".": "./styles.css",
17
+ "./styles.css": "./styles.css",
18
+ "./tokens/*": "./tokens/*",
19
+ "./assets/*": "./assets/*"
20
+ },
21
+ "sideEffects": true,
22
+ "scripts": {
23
+ "build": "node -e \"console.log('@dstally/tokens: nothing to build')\"",
24
+ "typecheck": "node -e \"process.exit(0)\""
25
+ }
26
+ }
package/styles.css ADDED
@@ -0,0 +1,7 @@
1
+ @import url("tokens/fonts.css");
2
+ @import url("tokens/colors.css");
3
+ @import url("tokens/typography.css");
4
+ @import url("tokens/spacing.css");
5
+ @import url("tokens/elevation.css");
6
+ @import url("tokens/motion.css");
7
+ @import url("tokens/base.css");
@@ -0,0 +1,20 @@
1
+ /* Element defaults. Consumers get sane baselines without writing any CSS. */
2
+ *,*::before,*::after{box-sizing:border-box}
3
+ html{-webkit-text-size-adjust:100%}
4
+ body{margin:0;background:var(--surface-page);color:var(--text-body);font-family:var(--font-sans);font-size:var(--text-body);line-height:var(--leading-body);letter-spacing:var(--tracking-body);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
5
+ h1,h2,h3,h4{margin:0;color:var(--text-strong);font-weight:var(--weight-semibold);text-wrap:balance}
6
+ h1{font-size:var(--text-display-2);line-height:var(--leading-display-2);letter-spacing:var(--tracking-display-2)}
7
+ h2{font-size:var(--text-title-1);line-height:var(--leading-title-1);letter-spacing:var(--tracking-title-1)}
8
+ h3{font-size:var(--text-title-2);line-height:var(--leading-title-2);letter-spacing:var(--tracking-title-2)}
9
+ h4{font-size:var(--text-title-3);line-height:var(--leading-title-3);letter-spacing:var(--tracking-title-3)}
10
+ p{margin:0 0 var(--space-5);text-wrap:pretty;max-width:var(--container-prose)}
11
+ a{color:var(--text-link);text-decoration:none;transition:color var(--duration-fast) var(--ease-standard)}
12
+ a:hover{color:var(--text-link-hover)}
13
+ a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}
14
+ small{font-size:var(--text-caption);line-height:var(--leading-caption)}
15
+ code,kbd,samp,pre{font-family:var(--font-mono);font-size:.92em}
16
+ hr{border:0;border-top:1px solid var(--border-subtle);margin:var(--space-8) 0}
17
+ ::selection{background:rgba(245,165,36,.28);color:var(--text-strong)}
18
+ .tally-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-feature-settings:var(--numeric-features)}
19
+ .tally-overline{font-size:var(--text-overline);letter-spacing:var(--tracking-overline);text-transform:uppercase;font-weight:var(--weight-semibold);color:var(--text-muted)}
20
+ .tally-container{max-width:var(--container-max);margin:0 auto;padding:0 var(--gutter)}
@@ -0,0 +1,150 @@
1
+ /* Tally colour system. Base ramps first, then semantic aliases.
2
+ Dark is the canonical theme; :root is dark, [data-theme="light"] overrides. */
3
+ :root{
4
+ /* Brand indigo — sampled from the app-icon gradient #4A57D2 -> #2C3391 -> #151A54 */
5
+ --indigo-100:#E4E7FA;
6
+ --indigo-200:#C3C8F3;
7
+ --indigo-300:#9AA2EA;
8
+ --indigo-400:#6C77DE;
9
+ --indigo-500:#4A57D2;
10
+ --indigo-600:#3A44AF;
11
+ --indigo-700:#2C3391;
12
+ --indigo-800:#1F2470;
13
+ --indigo-900:#151A54;
14
+ --indigo-950:#0E1138;
15
+
16
+ /* Accent amber — the fifth tally stroke */
17
+ --amber-200:#FDE3B4;
18
+ --amber-300:#FBCC7C;
19
+ --amber-400:#F8B547;
20
+ --amber-500:#F5A524;
21
+ --amber-600:#D98C10;
22
+ --amber-700:#A96A08;
23
+
24
+ /* Secondary blue — app UI actions */
25
+ --blue-300:#7FB4EE;
26
+ --blue-400:#3D8BDB;
27
+ --blue-500:#1565C0;
28
+ --blue-600:#0F4E97;
29
+ --blue-700:#0B3A70;
30
+
31
+ /* Cool neutrals */
32
+ --neutral-0:#FFFFFF;
33
+ --neutral-25:#FAFBFD;
34
+ --neutral-50:#F4F6FA;
35
+ --neutral-100:#E8EBF2;
36
+ --neutral-200:#D5DAE6;
37
+ --neutral-300:#B3BAC9;
38
+ --neutral-400:#8B93A5;
39
+ --neutral-500:#697084;
40
+ --neutral-600:#4C5365;
41
+ --neutral-650:#3C4356;
42
+ --neutral-700:#2B3143;
43
+ --neutral-800:#1D2230;
44
+ --neutral-850:#161A26;
45
+ --neutral-900:#10131C;
46
+ --neutral-950:#0A0C13;
47
+
48
+ /* Okabe-Ito — the only palette permitted for charts and parallel-timer tracks */
49
+ --chart-1:#0072B2; /* blue */
50
+ --chart-2:#E69F00; /* orange */
51
+ --chart-3:#009E73; /* bluish green */
52
+ --chart-4:#CC79A7; /* reddish purple */
53
+ --chart-5:#56B4E9; /* sky blue */
54
+ --chart-6:#D55E00; /* vermillion */
55
+ --chart-7:#F0E442; /* yellow */
56
+ --chart-8:#4C5566; /* neutral (replaces Okabe-Ito black on dark ground) */
57
+
58
+ /* Gradients */
59
+ --gradient-brand:linear-gradient(160deg,#4A57D2 0%,#2C3391 52%,#151A54 100%); /* @kind other */
60
+ --gradient-brand-lift:linear-gradient(180deg,rgba(255,255,255,.16) 0%,rgba(255,255,255,0) 46%); /* @kind other */
61
+ --gradient-page:radial-gradient(120% 80% at 50% -10%,#1F2470 0%,#10131C 62%); /* @kind other */
62
+
63
+ /* ---- Semantic: dark (canonical) ---- */
64
+ --surface-page:var(--neutral-900);
65
+ --surface-sunken:var(--neutral-950);
66
+ --surface-card:var(--neutral-850);
67
+ --surface-raised:var(--neutral-800);
68
+ --surface-overlay:rgba(16,19,28,.72);
69
+ --surface-inset:rgba(255,255,255,.04);
70
+ --surface-hover:rgba(255,255,255,.06);
71
+ --surface-active:rgba(255,255,255,.1);
72
+ --surface-brand:var(--indigo-900);
73
+ --surface-brand-subtle:rgba(74,87,210,.16);
74
+ --surface-accent-subtle:rgba(245,165,36,.14);
75
+
76
+ --text-strong:var(--neutral-0);
77
+ --text-body:#DCE1EC;
78
+ --text-muted:var(--neutral-300);
79
+ --text-subtle:var(--neutral-400);
80
+ --text-inverse:var(--neutral-900);
81
+ --text-accent:var(--amber-400);
82
+ --text-link:var(--blue-300);
83
+ --text-link-hover:var(--amber-400);
84
+ --text-on-brand:var(--neutral-0);
85
+
86
+ --border-subtle:rgba(255,255,255,.08);
87
+ --border-default:rgba(255,255,255,.14);
88
+ --border-strong:rgba(255,255,255,.24);
89
+ --border-accent:var(--amber-500);
90
+ --border-focus:var(--amber-400);
91
+
92
+ --action-primary:var(--amber-500);
93
+ --action-primary-hover:var(--amber-400);
94
+ --action-primary-active:var(--amber-600);
95
+ --action-primary-text:#20160A;
96
+ --action-secondary:var(--blue-500);
97
+ --action-secondary-hover:var(--blue-400);
98
+ --action-secondary-active:var(--blue-600);
99
+ --action-secondary-text:var(--neutral-0);
100
+
101
+ --status-running:var(--amber-500);
102
+ --status-paused:var(--neutral-400);
103
+ --status-success:#00B383;
104
+ --status-warning:var(--amber-500);
105
+ --status-danger:#E8663A;
106
+ --status-info:#3D9BE0;
107
+ --status-success-surface:rgba(0,158,115,.16);
108
+ --status-warning-surface:rgba(245,165,36,.16);
109
+ --status-danger-surface:rgba(213,94,0,.18);
110
+ --status-info-surface:rgba(0,114,178,.18);
111
+ }
112
+
113
+ [data-theme="light"]{
114
+ --surface-page:var(--neutral-25);
115
+ --surface-sunken:var(--neutral-50);
116
+ --surface-card:var(--neutral-0);
117
+ --surface-raised:var(--neutral-0);
118
+ --surface-overlay:rgba(16,19,28,.4);
119
+ --surface-inset:var(--neutral-50);
120
+ --surface-hover:rgba(21,26,84,.05);
121
+ --surface-active:rgba(21,26,84,.09);
122
+ --surface-brand:var(--indigo-500);
123
+ --surface-brand-subtle:rgba(74,87,210,.08);
124
+ --surface-accent-subtle:rgba(245,165,36,.16);
125
+
126
+ --text-strong:var(--neutral-900);
127
+ --text-body:var(--neutral-800);
128
+ --text-muted:var(--neutral-500);
129
+ --text-subtle:var(--neutral-400);
130
+ --text-inverse:var(--neutral-0);
131
+ --text-accent:var(--amber-700);
132
+ --text-link:var(--blue-500);
133
+ --text-link-hover:var(--indigo-700);
134
+ --text-on-brand:var(--neutral-0);
135
+
136
+ --border-subtle:var(--neutral-100);
137
+ --border-default:var(--neutral-200);
138
+ --border-strong:var(--neutral-300);
139
+
140
+ --action-primary:var(--amber-500);
141
+ --action-primary-hover:var(--amber-400);
142
+ --action-primary-active:var(--amber-600);
143
+ --action-primary-text:#20160A;
144
+
145
+ --status-success:#007A5A;
146
+ --status-warning:var(--amber-700);
147
+ --status-danger:#C24A12;
148
+ --status-info:var(--blue-500);
149
+ --chart-8:#000000;
150
+ }
@@ -0,0 +1,27 @@
1
+ /* Radii, shadows, blur. Shadows are near-black and low-spread; nothing floats far. */
2
+ :root{
3
+ --radius-xs:4px;
4
+ --radius-sm:6px;
5
+ --radius-md:9px;
6
+ --radius-lg:12px;
7
+ --radius-xl:16px;
8
+ --radius-2xl:22px;
9
+ --radius-pill:999px;
10
+ --radius-icon-ratio:22%; /* app-icon squircle: radius = 22% of side */
11
+
12
+ --shadow-none:none;
13
+ --shadow-xs:0 1px 2px rgba(6,8,16,.32);
14
+ --shadow-sm:0 1px 3px rgba(6,8,16,.36),0 1px 1px rgba(6,8,16,.24);
15
+ --shadow-md:0 6px 16px -4px rgba(6,8,16,.44),0 2px 4px rgba(6,8,16,.28);
16
+ --shadow-lg:0 18px 40px -12px rgba(6,8,16,.55),0 4px 10px rgba(6,8,16,.3);
17
+ --shadow-pill:0 10px 30px -8px rgba(6,8,16,.6),0 0 0 1px rgba(255,255,255,.08) inset;
18
+ --shadow-focus:0 0 0 3px rgba(245,165,36,.34);
19
+ --shadow-inset-hairline:inset 0 1px 0 rgba(255,255,255,.06);
20
+ --glow-amber:0 0 0 1px rgba(245,165,36,.5),0 0 24px -6px rgba(245,165,36,.45);
21
+
22
+ --blur-panel:saturate(140%) blur(20px); /* @kind other */
23
+ --blur-scrim:blur(6px); /* @kind other */
24
+
25
+ /* Protection gradient for text over imagery / gradient */
26
+ --scrim-bottom:linear-gradient(180deg,rgba(10,12,19,0) 0%,rgba(10,12,19,.82) 100%); /* @kind other */
27
+ }
@@ -0,0 +1,12 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&family=JetBrains+Mono:wght@400;500;700&display=swap');
2
+
3
+ /* Tally webfonts are served from Google Fonts (see readme.md — SUBSTITUTION note).
4
+ If licensed brand binaries arrive, replace this @import with local @font-face rules
5
+ pointing at assets/fonts/*.woff2 and keep the family names below unchanged. */
6
+ :root{
7
+ --font-sans:"Instrument Sans","Helvetica Neue",-apple-system,BlinkMacSystemFont,sans-serif;
8
+ --font-mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
9
+ --font-display:var(--font-sans);
10
+ --font-ui:var(--font-sans);
11
+ --font-numeric:var(--font-mono);
12
+ }
@@ -0,0 +1,25 @@
1
+ /* Motion. Short, damped, never bouncy. Time is the subject; nothing should feel slow. */
2
+ :root{
3
+ --duration-instant:80ms; /* @kind other */
4
+ --duration-fast:140ms; /* @kind other */
5
+ --duration-base:200ms; /* @kind other */
6
+ --duration-slow:320ms; /* @kind other */
7
+ --duration-enter:420ms; /* @kind other */
8
+
9
+ --ease-standard:cubic-bezier(.2,0,.2,1); /* @kind other */
10
+ --ease-out:cubic-bezier(.16,1,.3,1); /* @kind other */
11
+ --ease-in:cubic-bezier(.4,0,1,1); /* @kind other */
12
+ --ease-tick:steps(1,end); /* @kind other */ /* second-by-second timer digits never tween */
13
+
14
+ --transition-control:background-color var(--duration-fast) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard),color var(--duration-fast) var(--ease-standard),box-shadow var(--duration-fast) var(--ease-standard); /* @kind other */
15
+ --press-scale:.985; /* @kind other */
16
+ }
17
+ @media (prefers-reduced-motion:reduce){
18
+ :root{
19
+ --duration-fast:0ms; /* @kind other */
20
+ --duration-base:0ms; /* @kind other */
21
+ --duration-slow:0ms; /* @kind other */
22
+ --duration-enter:0ms; /* @kind other */
23
+ --press-scale:1; /* @kind other */
24
+ }
25
+ }
@@ -0,0 +1,30 @@
1
+ /* 4px base grid. Section rhythm on the marketing site uses the -section tokens. */
2
+ :root{
3
+ --space-0:0px;
4
+ --space-1:2px;
5
+ --space-2:4px;
6
+ --space-3:8px;
7
+ --space-4:12px;
8
+ --space-5:16px;
9
+ --space-6:20px;
10
+ --space-7:24px;
11
+ --space-8:32px;
12
+ --space-9:40px;
13
+ --space-10:48px;
14
+ --space-11:64px;
15
+ --space-12:80px;
16
+ --space-13:112px;
17
+ --space-14:160px;
18
+
19
+ --section-y:112px;
20
+ --section-y-tight:72px;
21
+ --container-max:1160px;
22
+ --container-prose:660px;
23
+ --gutter:24px;
24
+
25
+ --control-h-sm:26px;
26
+ --control-h-md:32px;
27
+ --control-h-lg:40px;
28
+ --control-h-xl:48px;
29
+ --row-h:38px;
30
+ }
@@ -0,0 +1,25 @@
1
+ /* Type scale. Display and UI share one family; numerals are always mono + tabular. */
2
+ :root{
3
+ --text-display-1:64px; --leading-display-1:1.02; --tracking-display-1:-.03em;
4
+ --text-display-2:48px; --leading-display-2:1.06; --tracking-display-2:-.025em;
5
+ --text-title-1:34px; --leading-title-1:1.14; --tracking-title-1:-.02em;
6
+ --text-title-2:26px; --leading-title-2:1.2; --tracking-title-2:-.015em;
7
+ --text-title-3:20px; --leading-title-3:1.3; --tracking-title-3:-.01em;
8
+ --text-body-lg:18px; --leading-body-lg:1.6; --tracking-body-lg:-.005em;
9
+ --text-body:16px; --leading-body:1.6; --tracking-body:0em;
10
+ --text-body-sm:14px; --leading-body-sm:1.55; --tracking-body-sm:0em;
11
+ --text-caption:12px; --leading-caption:1.4; --tracking-caption:.005em;
12
+ --text-overline:11px; --leading-overline:1.2; --tracking-overline:.12em;
13
+
14
+ --weight-regular:400;
15
+ --weight-medium:500;
16
+ --weight-semibold:600;
17
+ --weight-bold:700;
18
+
19
+ /* Timer / duration readouts */
20
+ --text-timer-xl:44px;
21
+ --text-timer-lg:28px;
22
+ --text-timer-md:18px;
23
+ --text-timer-sm:13px;
24
+ --numeric-features:"tnum" 1,"cv01" 1; /* @kind other */
25
+ }