diff --git a/docs/design.md b/docs/design.md index c4ecb70b..bda6ccc1 100644 --- a/docs/design.md +++ b/docs/design.md @@ -6,10 +6,18 @@ guidance in [CONTRIBUTING](../CONTRIBUTING.md). ## Tokens and appearance -The current owners are `packages/core/src/theme/presentation.ts`, -`desktop/src/styles/global.css` and `mobile/src/theme/index.ts`. Inspect current -source before changing them. Keep neutral light/dark surfaces and the restrained -blue accent; preserve semantic statuses and user-selected calendar/tag colors. +The current owners are `web/src/ui/tokens.css` for the rebuilt web app, +`packages/core/src/theme/presentation.ts`, `desktop/src/styles/global.css` and +`mobile/src/theme/index.ts`. Inspect current source before changing them. + +The web app uses the Orbyn house style shared with Orbyn Engineering (owner decision, +November 2026): Geist for text and JetBrains Mono for code, served from +`web/public/fonts`; Light, Dark and Dim themes; headings at medium weight, never +bold. At most three colours appear in the interface: ink for everything, including +live and selected states; amber (`--warn`) when the person must act; red +(`--danger`) for failures and removals. Done, working and selected states are ink. +Calendar, list, tag, project and booking-page colours are content the person chose +and keep their own colour. There is no 3D calendar view. | Text role | Base size | Use | | --------- | --------- | ---------------------------------------------------- | @@ -69,8 +77,8 @@ acceptance. Record checks of changed flows under [verification](verification.md) - Keep one clear action per outcome. Remove duplicate controls, competing toolbars and explanations of obvious actions. Put rare management actions in the existing overflow menu. Icon-only controls need accessible names and keyboard focus. -- Use the current accent, neutral surfaces, text roles and spacing tokens. Do not - introduce a new palette or shrink text to hide layout problems. Filled/bordered +- Use the house-style tokens, text roles and spacing tokens. Do not add colours + beyond ink, amber and red, or shrink text to hide layout problems. Filled/bordered controls need padding and consistent heights; mobile touch targets remain usable. - Respond to the actual pane width. Preserve user-selected sidebar widths; opening another pane must not reset them. Align pane/tab headers and avoid duplicate diff --git a/web/index.html b/web/index.html index 6a0c6086..5770d6cf 100644 --- a/web/index.html +++ b/web/index.html @@ -5,9 +5,9 @@ Orbyn - - - + + +
diff --git a/web/public/fonts/README.md b/web/public/fonts/README.md index 5e8b9c4f..783ecfac 100644 --- a/web/public/fonts/README.md +++ b/web/public/fonts/README.md @@ -1,24 +1,23 @@ # Web typefaces -Orbyn serves DM Sans and Manrope from this directory. No font stylesheet or font -binary is requested from Google while the application runs. The existing family -names, system fallbacks and text roles remain in `src/ui/tokens.css`. +Orbyn serves Geist and JetBrains Mono from this directory. No font stylesheet or font +binary is requested from Google while the application runs. Family names, system +fallbacks and text roles live in `src/ui/tokens.css`. -These are unmodified WOFF2 variable-font subsets distributed by Google Fonts: -DM Sans v17, weight 100–1000 and optical size 9–40; Manrope v23, weight 200–800. -The local stylesheet retains their published Unicode ranges and `font-display: -swap`. Latin faces are preloaded; additional script subsets load on demand. -Content hashes in filenames change when the font bytes change. +These are unmodified WOFF2 variable-font subsets distributed by Google Fonts: Geist, +weight 100–900, and JetBrains Mono, weight 100–800. The local stylesheet keeps their +published Unicode ranges and `font-display: swap`. Latin faces are preloaded; +additional script subsets load on demand. Content hashes in filenames change when the +font bytes change. Both families use the SIL Open Font License 1.1. Keep the complete copyright and licence notices with the distributed fonts: -- [DM Sans licence](dm-sans-OFL.txt), from the - [Google Fonts DM Sans directory](https://github.com/google/fonts/tree/main/ofl/dmsans). -- [Manrope licence](manrope-OFL.txt), from the - [Google Fonts Manrope directory](https://github.com/google/fonts/tree/main/ofl/manrope). +- [Geist licence](geist-OFL.txt), from the + [Google Fonts Geist directory](https://github.com/google/fonts/tree/main/ofl/geist). +- [JetBrains Mono licence](jetbrains-mono-OFL.txt), from the + [Google Fonts JetBrains Mono directory](https://github.com/google/fonts/tree/main/ofl/jetbrainsmono). [sources.json](sources.json) records the exact official stylesheet request, font -URLs, byte counts and SHA-256 hashes. Licence bytes were checked against the listed -Git blob identities. No font has been renamed internally, subsetted or converted -by Orbyn. Unsupported glyphs continue to use the declared system fallback. +URLs, byte counts and SHA-256 hashes. No font has been renamed internally, subsetted +or converted by Orbyn. Unsupported glyphs continue to use the declared system fallback. diff --git a/web/public/fonts/dm-sans-latin-ca72d2bcea8f.woff2 b/web/public/fonts/dm-sans-latin-ca72d2bcea8f.woff2 deleted file mode 100644 index c75f7bf1..00000000 Binary files a/web/public/fonts/dm-sans-latin-ca72d2bcea8f.woff2 and /dev/null differ diff --git a/web/public/fonts/dm-sans-latin-ext-5d18d31d23ad.woff2 b/web/public/fonts/dm-sans-latin-ext-5d18d31d23ad.woff2 deleted file mode 100644 index 6e84cba1..00000000 Binary files a/web/public/fonts/dm-sans-latin-ext-5d18d31d23ad.woff2 and /dev/null differ diff --git a/web/public/fonts/fonts-3822d62d9e34.css b/web/public/fonts/fonts-3822d62d9e34.css new file mode 100644 index 00000000..b79843e5 --- /dev/null +++ b/web/public/fonts/fonts-3822d62d9e34.css @@ -0,0 +1,99 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/fonts/geist-cyrillic-ext-b7a545bbb082.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/fonts/geist-cyrillic-6129fc8571c3.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/fonts/geist-vietnamese-f689f638f29f.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/fonts/geist-latin-ext-58a6b173d5ca.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/fonts/geist-latin-9b6f5ff45b27.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 100 800; + font-display: swap; + src: url(/fonts/jetbrains-mono-cyrillic-ext-992eea2f7021.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 100 800; + font-display: swap; + src: url(/fonts/jetbrains-mono-cyrillic-af7486955880.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 100 800; + font-display: swap; + src: url(/fonts/jetbrains-mono-greek-3edf363dbf9d.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 100 800; + font-display: swap; + src: url(/fonts/jetbrains-mono-vietnamese-1390e86cc282.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 100 800; + font-display: swap; + src: url(/fonts/jetbrains-mono-latin-ext-7db7affbce1f.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 100 800; + font-display: swap; + src: url(/fonts/jetbrains-mono-latin-1e06740a02a4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/web/public/fonts/fonts-5d9f0bf2e309.css b/web/public/fonts/fonts-5d9f0bf2e309.css deleted file mode 100644 index afbf32cd..00000000 --- a/web/public/fonts/fonts-5d9f0bf2e309.css +++ /dev/null @@ -1,80 +0,0 @@ -/* Self-hosted Google Fonts. Font licences and source hashes are in README.md. */ -/* latin-ext */ -@font-face { - font-family: 'DM Sans'; - font-style: normal; - font-weight: 100 1000; - font-display: swap; - src: url(/fonts/dm-sans-latin-ext-5d18d31d23ad.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; -} - -/* latin */ -@font-face { - font-family: 'DM Sans'; - font-style: normal; - font-weight: 100 1000; - font-display: swap; - src: url(/fonts/dm-sans-latin-ca72d2bcea8f.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} - -/* cyrillic-ext */ -@font-face { - font-family: 'Manrope'; - font-style: normal; - font-weight: 200 800; - font-display: swap; - src: url(/fonts/manrope-cyrillic-ext-3c09135e88bb.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} - -/* cyrillic */ -@font-face { - font-family: 'Manrope'; - font-style: normal; - font-weight: 200 800; - font-display: swap; - src: url(/fonts/manrope-cyrillic-447c49583b1b.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} - -/* greek */ -@font-face { - font-family: 'Manrope'; - font-style: normal; - font-weight: 200 800; - font-display: swap; - src: url(/fonts/manrope-greek-e507c109c317.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} - -/* vietnamese */ -@font-face { - font-family: 'Manrope'; - font-style: normal; - font-weight: 200 800; - font-display: swap; - src: url(/fonts/manrope-vietnamese-dbf64d973b39.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} - -/* latin-ext */ -@font-face { - font-family: 'Manrope'; - font-style: normal; - font-weight: 200 800; - font-display: swap; - src: url(/fonts/manrope-latin-ext-2f7335119075.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; -} - -/* latin */ -@font-face { - font-family: 'Manrope'; - font-style: normal; - font-weight: 200 800; - font-display: swap; - src: url(/fonts/manrope-latin-8c2def024c1b.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/web/public/fonts/dm-sans-OFL.txt b/web/public/fonts/geist-OFL.txt similarity index 94% rename from web/public/fonts/dm-sans-OFL.txt rename to web/public/fonts/geist-OFL.txt index 4430b85a..61f6f4b7 100644 --- a/web/public/fonts/dm-sans-OFL.txt +++ b/web/public/fonts/geist-OFL.txt @@ -1,93 +1,93 @@ -Copyright 2014 The DM Sans Project Authors (https://github.com/googlefonts/dm-fonts) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -https://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. +Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font.git) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/web/public/fonts/geist-cyrillic-6129fc8571c3.woff2 b/web/public/fonts/geist-cyrillic-6129fc8571c3.woff2 new file mode 100644 index 00000000..f385e23a Binary files /dev/null and b/web/public/fonts/geist-cyrillic-6129fc8571c3.woff2 differ diff --git a/web/public/fonts/geist-cyrillic-ext-b7a545bbb082.woff2 b/web/public/fonts/geist-cyrillic-ext-b7a545bbb082.woff2 new file mode 100644 index 00000000..7ab581f7 Binary files /dev/null and b/web/public/fonts/geist-cyrillic-ext-b7a545bbb082.woff2 differ diff --git a/web/public/fonts/geist-latin-9b6f5ff45b27.woff2 b/web/public/fonts/geist-latin-9b6f5ff45b27.woff2 new file mode 100644 index 00000000..8f01e763 Binary files /dev/null and b/web/public/fonts/geist-latin-9b6f5ff45b27.woff2 differ diff --git a/web/public/fonts/geist-latin-ext-58a6b173d5ca.woff2 b/web/public/fonts/geist-latin-ext-58a6b173d5ca.woff2 new file mode 100644 index 00000000..8a1d3df6 Binary files /dev/null and b/web/public/fonts/geist-latin-ext-58a6b173d5ca.woff2 differ diff --git a/web/public/fonts/geist-vietnamese-f689f638f29f.woff2 b/web/public/fonts/geist-vietnamese-f689f638f29f.woff2 new file mode 100644 index 00000000..0bcca1b2 Binary files /dev/null and b/web/public/fonts/geist-vietnamese-f689f638f29f.woff2 differ diff --git a/web/public/fonts/manrope-OFL.txt b/web/public/fonts/jetbrains-mono-OFL.txt similarity index 97% rename from web/public/fonts/manrope-OFL.txt rename to web/public/fonts/jetbrains-mono-OFL.txt index e271172a..821a3dac 100644 --- a/web/public/fonts/manrope-OFL.txt +++ b/web/public/fonts/jetbrains-mono-OFL.txt @@ -1,8 +1,8 @@ -Copyright 2018 The Manrope Project Authors (https://github.com/googlefonts/manrope) +Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono) This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL + +This license is copied below, and is also available with a FAQ at: https://scripts.sil.org/OFL ----------------------------------------------------------- @@ -18,7 +18,7 @@ with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, +fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The diff --git a/web/public/fonts/jetbrains-mono-cyrillic-af7486955880.woff2 b/web/public/fonts/jetbrains-mono-cyrillic-af7486955880.woff2 new file mode 100644 index 00000000..8d79fc58 Binary files /dev/null and b/web/public/fonts/jetbrains-mono-cyrillic-af7486955880.woff2 differ diff --git a/web/public/fonts/jetbrains-mono-cyrillic-ext-992eea2f7021.woff2 b/web/public/fonts/jetbrains-mono-cyrillic-ext-992eea2f7021.woff2 new file mode 100644 index 00000000..0bb8709d Binary files /dev/null and b/web/public/fonts/jetbrains-mono-cyrillic-ext-992eea2f7021.woff2 differ diff --git a/web/public/fonts/jetbrains-mono-greek-3edf363dbf9d.woff2 b/web/public/fonts/jetbrains-mono-greek-3edf363dbf9d.woff2 new file mode 100644 index 00000000..74791bbc Binary files /dev/null and b/web/public/fonts/jetbrains-mono-greek-3edf363dbf9d.woff2 differ diff --git a/web/public/fonts/jetbrains-mono-latin-1e06740a02a4.woff2 b/web/public/fonts/jetbrains-mono-latin-1e06740a02a4.woff2 new file mode 100644 index 00000000..c3f0666e Binary files /dev/null and b/web/public/fonts/jetbrains-mono-latin-1e06740a02a4.woff2 differ diff --git a/web/public/fonts/jetbrains-mono-latin-ext-7db7affbce1f.woff2 b/web/public/fonts/jetbrains-mono-latin-ext-7db7affbce1f.woff2 new file mode 100644 index 00000000..b1f58042 Binary files /dev/null and b/web/public/fonts/jetbrains-mono-latin-ext-7db7affbce1f.woff2 differ diff --git a/web/public/fonts/jetbrains-mono-vietnamese-1390e86cc282.woff2 b/web/public/fonts/jetbrains-mono-vietnamese-1390e86cc282.woff2 new file mode 100644 index 00000000..7bb40116 Binary files /dev/null and b/web/public/fonts/jetbrains-mono-vietnamese-1390e86cc282.woff2 differ diff --git a/web/public/fonts/manrope-cyrillic-447c49583b1b.woff2 b/web/public/fonts/manrope-cyrillic-447c49583b1b.woff2 deleted file mode 100644 index 18973fb4..00000000 Binary files a/web/public/fonts/manrope-cyrillic-447c49583b1b.woff2 and /dev/null differ diff --git a/web/public/fonts/manrope-cyrillic-ext-3c09135e88bb.woff2 b/web/public/fonts/manrope-cyrillic-ext-3c09135e88bb.woff2 deleted file mode 100644 index 97657520..00000000 Binary files a/web/public/fonts/manrope-cyrillic-ext-3c09135e88bb.woff2 and /dev/null differ diff --git a/web/public/fonts/manrope-greek-e507c109c317.woff2 b/web/public/fonts/manrope-greek-e507c109c317.woff2 deleted file mode 100644 index 11b3486a..00000000 Binary files a/web/public/fonts/manrope-greek-e507c109c317.woff2 and /dev/null differ diff --git a/web/public/fonts/manrope-latin-8c2def024c1b.woff2 b/web/public/fonts/manrope-latin-8c2def024c1b.woff2 deleted file mode 100644 index f3122c17..00000000 Binary files a/web/public/fonts/manrope-latin-8c2def024c1b.woff2 and /dev/null differ diff --git a/web/public/fonts/manrope-latin-ext-2f7335119075.woff2 b/web/public/fonts/manrope-latin-ext-2f7335119075.woff2 deleted file mode 100644 index e756446c..00000000 Binary files a/web/public/fonts/manrope-latin-ext-2f7335119075.woff2 and /dev/null differ diff --git a/web/public/fonts/manrope-vietnamese-dbf64d973b39.woff2 b/web/public/fonts/manrope-vietnamese-dbf64d973b39.woff2 deleted file mode 100644 index fed7e710..00000000 Binary files a/web/public/fonts/manrope-vietnamese-dbf64d973b39.woff2 and /dev/null differ diff --git a/web/public/fonts/sources.json b/web/public/fonts/sources.json index 9a7e6c69..cdd0f01b 100644 --- a/web/public/fonts/sources.json +++ b/web/public/fonts/sources.json @@ -1,85 +1,95 @@ { - "cssSource": "https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,100..1000&family=Manrope:wght@200..800&display=swap", - "cssSourceSha256": "82bc38a42b211fe97895a2c66a82a58bb40226dc369c96a138f76e0588d87619", - "stylesheet": "fonts-5d9f0bf2e309.css", + "cssSource": "https://fonts.googleapis.com/css2?family=Geist:wght@100..900&family=JetBrains+Mono:wght@100..800&display=swap", + "cssSourceSha256": "bcd51f8c9b5bda526750e81f557df5c22836494d901ee56a67f0604e9466de64", + "stylesheet": "fonts-3822d62d9e34.css", "files": [ { - "family": "DM Sans", + "family": "Geist", + "subset": "cyrillic-ext", + "url": "https://fonts.gstatic.com/s/geist/v5/gyByhwUxId8gMEwRGFWNOITddY4.woff2", + "file": "geist-cyrillic-ext-b7a545bbb082.woff2", + "bytes": 7252, + "sha256": "b7a545bbb08256bd809f11cfe66d88da3e22d169ea4407737b1ef0ec1ed3d791" + }, + { + "family": "Geist", + "subset": "cyrillic", + "url": "https://fonts.gstatic.com/s/geist/v5/gyByhwUxId8gMEwYGFWNOITddY4.woff2", + "file": "geist-cyrillic-6129fc8571c3.woff2", + "bytes": 14900, + "sha256": "6129fc8571c3e0cb0a4c41f5160c974a843b055009dc4ad8858bd808e18a2d86" + }, + { + "family": "Geist", + "subset": "vietnamese", + "url": "https://fonts.gstatic.com/s/geist/v5/gyByhwUxId8gMEwTGFWNOITddY4.woff2", + "file": "geist-vietnamese-f689f638f29f.woff2", + "bytes": 7968, + "sha256": "f689f638f29fff460a2d5749edb5d5c38d7bef0389f32032d871f23fc6ebb008" + }, + { + "family": "Geist", "subset": "latin-ext", - "url": "https://fonts.gstatic.com/s/dmsans/v17/rP2Hp2ywxg089UriCZ2IHSeH.woff2", - "file": "dm-sans-latin-ext-5d18d31d23ad.woff2", - "bytes": 31292, - "sha256": "5d18d31d23ada61ebee1d589b11d5da30db9e158f589d5e35221ba2b1a45de54" + "url": "https://fonts.gstatic.com/s/geist/v5/gyByhwUxId8gMEwSGFWNOITddY4.woff2", + "file": "geist-latin-ext-58a6b173d5ca.woff2", + "bytes": 16540, + "sha256": "58a6b173d5ca1dec92166ea3c6cb1a84a4144556d10928ac14e8e6b40e4787bd" }, { - "family": "DM Sans", + "family": "Geist", "subset": "latin", - "url": "https://fonts.gstatic.com/s/dmsans/v17/rP2Hp2ywxg089UriCZOIHQ.woff2", - "file": "dm-sans-latin-ca72d2bcea8f.woff2", - "bytes": 62724, - "sha256": "ca72d2bcea8f4daa783dbdfa2d9b46068c3ce38168e05918fb867aa453b4f890" + "url": "https://fonts.gstatic.com/s/geist/v5/gyByhwUxId8gMEwcGFWNOITd.woff2", + "file": "geist-latin-9b6f5ff45b27.woff2", + "bytes": 29288, + "sha256": "9b6f5ff45b278c744b5f379a2c4ecbaf858a842b8eaf82ac8d21b699ca16c608" }, { - "family": "Manrope", + "family": "JetBrains Mono", "subset": "cyrillic-ext", - "url": "https://fonts.gstatic.com/s/manrope/v23/xn7gYHE41ni1AdIRggqxSuXd.woff2", - "file": "manrope-cyrillic-ext-3c09135e88bb.woff2", - "bytes": 2588, - "sha256": "3c09135e88bbfcd848e99be137710afbb615a8d9a73c5c48e6cb0245a162af1d" + "url": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD2OwGtT0rU3BE.woff2", + "file": "jetbrains-mono-cyrillic-ext-992eea2f7021.woff2", + "bytes": 2020, + "sha256": "992eea2f70210457ddd1196de4df3240919ffe068ad188c79d985fba4565d3bf" }, { - "family": "Manrope", + "family": "JetBrains Mono", "subset": "cyrillic", - "url": "https://fonts.gstatic.com/s/manrope/v23/xn7gYHE41ni1AdIRggOxSuXd.woff2", - "file": "manrope-cyrillic-447c49583b1b.woff2", - "bytes": 14352, - "sha256": "447c49583b1b735cc6f566151db1d24354cec41076c55dd98455cfbde9e806c1" + "url": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD_OwGtT0rU3BE.woff2", + "file": "jetbrains-mono-cyrillic-af7486955880.woff2", + "bytes": 12064, + "sha256": "af7486955880be1c2b972e9c766acffb776768d669b6576ed9a0919ce72e7ca6" }, { - "family": "Manrope", + "family": "JetBrains Mono", "subset": "greek", - "url": "https://fonts.gstatic.com/s/manrope/v23/xn7gYHE41ni1AdIRggSxSuXd.woff2", - "file": "manrope-greek-e507c109c317.woff2", - "bytes": 9268, - "sha256": "e507c109c31789b33994646b457ee288639324516357250607c9b1398186e069" + "url": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD4OwGtT0rU3BE.woff2", + "file": "jetbrains-mono-greek-3edf363dbf9d.woff2", + "bytes": 9084, + "sha256": "3edf363dbf9d5fa0cdc784ae2b431a8a4152f4055a8a8858028c0bd668808273" }, { - "family": "Manrope", + "family": "JetBrains Mono", "subset": "vietnamese", - "url": "https://fonts.gstatic.com/s/manrope/v23/xn7gYHE41ni1AdIRggixSuXd.woff2", - "file": "manrope-vietnamese-dbf64d973b39.woff2", - "bytes": 8388, - "sha256": "dbf64d973b3987844df30992c93f47d24ac8935ee8c9b1e320942aeb1b367703" + "url": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD0OwGtT0rU3BE.woff2", + "file": "jetbrains-mono-vietnamese-1390e86cc282.woff2", + "bytes": 7468, + "sha256": "1390e86cc2823e759358918c01c4fcc1b6e4f01bca915bdbeb6d68eb5c244405" }, { - "family": "Manrope", + "family": "JetBrains Mono", "subset": "latin-ext", - "url": "https://fonts.gstatic.com/s/manrope/v23/xn7gYHE41ni1AdIRggmxSuXd.woff2", - "file": "manrope-latin-ext-2f7335119075.woff2", - "bytes": 15160, - "sha256": "2f7335119075b2079f1d882530bbc18728461612bf90743203d73a74a48f4d9b" + "url": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD1OwGtT0rU3BE.woff2", + "file": "jetbrains-mono-latin-ext-7db7affbce1f.woff2", + "bytes": 15204, + "sha256": "7db7affbce1fdee69c1ffc2641bbca289b049867f524c9d861fe35ab6670bf29" }, { - "family": "Manrope", + "family": "JetBrains Mono", "subset": "latin", - "url": "https://fonts.gstatic.com/s/manrope/v23/xn7gYHE41ni1AdIRggexSg.woff2", - "file": "manrope-latin-8c2def024c1b.woff2", - "bytes": 24532, - "sha256": "8c2def024c1bf31aacf3624ae3c4d701269b4ec3dc765c04830839f0d36b2d9e" - } - ], - "licences": [ - { - "file": "dm-sans-OFL.txt", - "gitBlobSha": "4430b85ac62998e2edb914360f9ebdfe43f4deaa", - "sha256": "9af36190332437f5ecd09974de43c1f7c77a310a996cdd8ceb25628b458840e1", - "url": "https://raw.githubusercontent.com/google/fonts/main/ofl/dmsans/OFL.txt" - }, - { - "file": "manrope-OFL.txt", - "gitBlobSha": "e271172a9ed0cddc895aabb6509f1c7d880b492d", - "sha256": "58172e0c0fac2cda8a37b348164bb55e44b0e69051e557e92b1d3f6910141f7b", - "url": "https://raw.githubusercontent.com/google/fonts/main/ofl/manrope/OFL.txt" + "url": "https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD7OwGtT0rU.woff2", + "file": "jetbrains-mono-latin-1e06740a02a4.woff2", + "bytes": 40480, + "sha256": "1e06740a02a443fb7f3eeda8fcaa685a0f6c620e3f01e6666e847295469ce3ad" } ] -} +} \ No newline at end of file diff --git a/web/src/app/Shell.tsx b/web/src/app/Shell.tsx index b955572b..00acdb5f 100644 --- a/web/src/app/Shell.tsx +++ b/web/src/app/Shell.tsx @@ -50,7 +50,7 @@ import { useNavigate, usePath, } from "../lib/router"; -import { useTheme } from "../lib/theme"; +import { isDarkTheme, useTheme } from "../lib/theme"; import { Button, ErrorNotice, IconButton, Menu, useToast } from "../ui/kit"; import { TaskHost, useTasks, useItems, nextUp } from "../screens/shared-task"; import { useAccount } from "./account"; @@ -754,10 +754,10 @@ export function Shell({ - {theme === "dark" ? : } + {isDarkTheme(theme) ? : } + THEMES.includes(value as Theme); +/** Dark and Dim are both dark schemes. */ +export const isDarkTheme = (value: Theme) => value !== "light"; /** The same key the old client uses, so the choice carries over. */ const KEY = "orbyn-theme"; @@ -8,7 +14,7 @@ const KEY = "orbyn-theme"; function initial(): Theme { try { const saved = localStorage.getItem(KEY); - if (saved === "light" || saved === "dark") return saved; + if (isTheme(saved)) return saved; } catch { // Fall back to the system preference. } @@ -42,10 +48,7 @@ function apply(next: Theme, persist: boolean) { apply(theme, true); window.addEventListener("storage", (event) => { - if ( - event.key === KEY && - (event.newValue === "light" || event.newValue === "dark") - ) + if (event.key === KEY && isTheme(event.newValue)) apply(event.newValue, false); }); const subscribe = (listener: () => void) => { @@ -53,7 +56,7 @@ const subscribe = (listener: () => void) => { return () => void listeners.delete(listener); }; export const setTheme = (next: Theme) => apply(next, true); -const toggle = () => setTheme(theme === "dark" ? "light" : "dark"); +const toggle = () => setTheme(isDarkTheme(theme) ? "light" : "dark"); export function useTheme() { const value = useSyncExternalStore(subscribe, () => theme); diff --git a/web/src/screens/agents-shared/agents-shared.css b/web/src/screens/agents-shared/agents-shared.css index b490b65c..3f3421ca 100644 --- a/web/src/screens/agents-shared/agents-shared.css +++ b/web/src/screens/agents-shared/agents-shared.css @@ -195,7 +195,7 @@ } .agents-table th { background: var(--sunken); - font-weight: 600; + font-weight: 500; } .agents-changes > li > label, .agents-check { @@ -284,7 +284,7 @@ gap: 4px; } .agents-fieldset > legend { - font-weight: 600; + font-weight: 500; font-size: 13px; color: var(--text-soft); } diff --git a/web/src/screens/assistant/assistant.css b/web/src/screens/assistant/assistant.css index 34df1ece..429a4bc6 100644 --- a/web/src/screens/assistant/assistant.css +++ b/web/src/screens/assistant/assistant.css @@ -22,7 +22,7 @@ justify-content: space-between; gap: 8px; padding: 12px 8px 8px 16px; - font-weight: 600; + font-weight: 500; font-size: 13px; } .assistant-rail-head .btn { @@ -208,7 +208,8 @@ background: var(--accent); color: var(--on-ink, #fff); } -:root[data-theme="dark"] .assistant-message-user { +:root[data-theme="dark"] .assistant-message-user, +:root[data-theme="dim"] .assistant-message-user { color: #0d0e10; } .assistant-message-user .agents-reply > :first-child { @@ -240,7 +241,7 @@ } .assistant-update-label { font-size: 13px; - font-weight: 600; + font-weight: 500; } .assistant-actions { display: flex; diff --git a/web/src/screens/booking/booking.css b/web/src/screens/booking/booking.css index 7a9bc5ab..076675f4 100644 --- a/web/src/screens/booking/booking.css +++ b/web/src/screens/booking/booking.css @@ -107,7 +107,7 @@ cursor: pointer; min-height: var(--control); align-content: center; - font-weight: 600; + font-weight: 500; overflow-wrap: anywhere; } .booking-web-workspace summary + *, @@ -127,7 +127,7 @@ .booking-web-metrics dd { font-size: 24px; margin: 8px 0; - font-weight: 600; + font-weight: 500; } .booking-web-rows, .booking-web-page-list, diff --git a/web/src/screens/calendar/calendar.css b/web/src/screens/calendar/calendar.css index 4d3e9c07..98754a93 100644 --- a/web/src/screens/calendar/calendar.css +++ b/web/src/screens/calendar/calendar.css @@ -302,7 +302,7 @@ .calendar-daychoice button[aria-pressed="true"] { background: var(--accent-soft); color: var(--accent-text); - font-weight: 600; + font-weight: 500; } .calendar-tags { display: flex; @@ -401,7 +401,7 @@ .calendar-flags h4 { margin: 0; font-size: 13px; - font-weight: 600; + font-weight: 500; } .calendar-lanes { display: flex; @@ -435,7 +435,7 @@ cursor: grab; } .calendar-lane-row.is-pinned .row-title { - font-weight: 600; + font-weight: 500; } .calendar-flags { display: flex; @@ -1340,7 +1340,7 @@ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - font-weight: 600; + font-weight: 500; } .calendar-page .calendar-tile svg { display: inline; @@ -1555,7 +1555,7 @@ height: 20px; border-radius: 10px; font-size: 11px; - font-weight: 600; + font-weight: 500; } .calendar-month-cell.is-today .calendar-month-date { background: var(--accent); diff --git a/web/src/screens/library/library.css b/web/src/screens/library/library.css index 79f2de2e..7a6f90f8 100644 --- a/web/src/screens/library/library.css +++ b/web/src/screens/library/library.css @@ -1047,7 +1047,7 @@ button.lib-twist:disabled { } .doc-editing[data-type="heading"] .doc-input { font-family: var(--head); - font-weight: 700; + font-weight: 500; letter-spacing: -0.012em; } .doc-editing[data-level="1"] .doc-input { @@ -1343,7 +1343,7 @@ button.lib-twist:disabled { } .doc-table th { background: var(--sunken); - font-weight: 600; + font-weight: 500; } .doc-table span { display: block; diff --git a/web/src/screens/projects/projects.css b/web/src/screens/projects/projects.css index e5c7ebfc..f1df9312 100644 --- a/web/src/screens/projects/projects.css +++ b/web/src/screens/projects/projects.css @@ -67,7 +67,7 @@ align-items: center; gap: 6px; min-height: 36px; - font-weight: 600; + font-weight: 500; font-size: 13px; } .pj-promises > button svg { @@ -141,7 +141,7 @@ } .pj-name { color: var(--text); - font-weight: 600; + font-weight: 500; overflow-wrap: anywhere; } .pj-name:hover, @@ -479,7 +479,7 @@ border-radius: 50%; background: var(--chip); font-size: 11px; - font-weight: 600; + font-weight: 500; } .pj-aliases { display: flex; diff --git a/web/src/screens/public/PublicFrame.tsx b/web/src/screens/public/PublicFrame.tsx index 95cd60b2..dcfe6e08 100644 --- a/web/src/screens/public/PublicFrame.tsx +++ b/web/src/screens/public/PublicFrame.tsx @@ -2,7 +2,7 @@ import { ArrowUpRight, Moon, Orbit, Sun } from "lucide-react"; import type { MouseEvent, ReactNode } from "react"; import { useAccount } from "../../app/account"; import { navigate, useSearch } from "../../lib/router"; -import { useTheme } from "../../lib/theme"; +import { isDarkTheme, useTheme } from "../../lib/theme"; import { IconButton } from "../../ui/kit"; import "./public.css"; import { @@ -54,10 +54,10 @@ export function PublicFrame({
{nav}
- {theme === "dark" ? : } + {isDarkTheme(theme) ? : } {token ? ( legend { font-size: 18px; - font-weight: 600; + font-weight: 500; padding-block: 8px 16px; } .connect-choices > section { diff --git a/web/src/screens/review/review.css b/web/src/screens/review/review.css index 5ac60a3b..f509be30 100644 --- a/web/src/screens/review/review.css +++ b/web/src/screens/review/review.css @@ -72,7 +72,7 @@ .review-row-copy strong { font-size: 15px; line-height: 22px; - font-weight: 600; + font-weight: 500; } .review-row-status, .review-kicker, @@ -107,7 +107,7 @@ .review-choice { font-size: 15px; line-height: 22px; - font-weight: 600; + font-weight: 500; overflow-wrap: anywhere; } .review-changes > li > header > div { diff --git a/web/src/screens/settings/account/Preferences.tsx b/web/src/screens/settings/account/Preferences.tsx index d9593073..91c6848d 100644 --- a/web/src/screens/settings/account/Preferences.tsx +++ b/web/src/screens/settings/account/Preferences.tsx @@ -319,13 +319,15 @@ export function Preferences() { if ( owner() && (event.target.value === "light" || - event.target.value === "dark") + event.target.value === "dark" || + event.target.value === "dim") ) setTheme(event.target.value); }} > +

Saved on this device.

diff --git a/web/src/screens/shared-task/shared-task.css b/web/src/screens/shared-task/shared-task.css index 8998ab00..4db34855 100644 --- a/web/src/screens/shared-task/shared-task.css +++ b/web/src/screens/shared-task/shared-task.css @@ -202,7 +202,7 @@ .st-status button[aria-checked="true"] { background: var(--accent-soft); color: var(--accent-text); - font-weight: 600; + font-weight: 500; } .st-status button.is-done[aria-checked="true"] { background: var(--ok-soft); @@ -264,7 +264,7 @@ .st-section-head h3 { font-size: 13px; font-family: var(--sans); - font-weight: 600; + font-weight: 500; letter-spacing: 0; } .st-count { @@ -424,7 +424,7 @@ border-radius: 50%; background: var(--chip); font-size: 11px; - font-weight: 600; + font-weight: 500; } .st-timeline-head { display: flex; @@ -676,7 +676,7 @@ .st-days button[aria-pressed="true"] { background: var(--accent-soft); color: var(--accent-text); - font-weight: 600; + font-weight: 500; } .st-parsed { display: flex; @@ -878,7 +878,7 @@ button.st-fold:hover { background: var(--chip); color: var(--text-soft); font-size: 11px; - font-weight: 600; + font-weight: 500; } .st-row-due { flex: none; diff --git a/web/src/screens/today/today.css b/web/src/screens/today/today.css index 2371652c..af0ee60f 100644 --- a/web/src/screens/today/today.css +++ b/web/src/screens/today/today.css @@ -33,7 +33,7 @@ } .today-when strong { color: var(--text-soft); - font-weight: 600; + font-weight: 500; font-variant-numeric: tabular-nums; } .today-quote { @@ -427,7 +427,7 @@ } .today-run-main strong { overflow-wrap: anywhere; - font-weight: 600; + font-weight: 500; } .today-run-main p, .today-run-main li { @@ -573,7 +573,7 @@ } .today-week button.is-today { color: var(--text); - font-weight: 600; + font-weight: 500; } .today-week-bar { display: flex; @@ -919,7 +919,7 @@ overflow-wrap: anywhere; } .today-change-main strong { - font-weight: 600; + font-weight: 500; } .today-change-main small { display: block; @@ -991,7 +991,7 @@ flex-wrap: wrap; justify-content: space-between; gap: 8px; - font-weight: 600; + font-weight: 500; cursor: pointer; } .today-release summary small { diff --git a/web/src/screens/views/views.css b/web/src/screens/views/views.css index 2456a381..491dbfe9 100644 --- a/web/src/screens/views/views.css +++ b/web/src/screens/views/views.css @@ -322,7 +322,7 @@ .vw-board header { padding: 2px 4px; font-size: 13px; - font-weight: 600; + font-weight: 500; overflow-wrap: anywhere; } .vw-card { @@ -368,7 +368,7 @@ } .vw-day.is-today > span { color: var(--accent-text); - font-weight: 700; + font-weight: 500; } .vw-day.is-over { box-shadow: inset 0 0 0 2px var(--accent); diff --git a/web/src/screens/work/work.css b/web/src/screens/work/work.css index a643ec92..66a72ea9 100644 --- a/web/src/screens/work/work.css +++ b/web/src/screens/work/work.css @@ -88,7 +88,7 @@ .work-chips button[aria-pressed="true"] { background: var(--chip); color: var(--text); - font-weight: 600; + font-weight: 500; } .work-chips span { color: var(--text-muted); @@ -238,7 +238,7 @@ } .work-bulk-count { font-size: 13px; - font-weight: 600; + font-weight: 500; white-space: nowrap; } @@ -286,7 +286,7 @@ padding: 0 6px 0 2px; border-radius: var(--r-sm); font-size: 13px; - font-weight: 600; + font-weight: 500; } .work-column-head button:first-child:hover { background: var(--hover); diff --git a/web/src/ui/kit.css b/web/src/ui/kit.css index a3b6d5c8..beb6a222 100644 --- a/web/src/ui/kit.css +++ b/web/src/ui/kit.css @@ -24,7 +24,7 @@ .btn-primary { background: var(--ink); color: var(--on-ink); - font-weight: 600; + font-weight: 500; } .btn-primary:hover:not(:disabled) { background: var(--ink-hover); @@ -127,7 +127,7 @@ textarea.input { background: var(--chip); color: var(--text-soft); font-size: 11px; - font-weight: 600; + font-weight: 500; white-space: nowrap; } .pill-blue { diff --git a/web/src/ui/tokens.css b/web/src/ui/tokens.css index 5eaec54a..e11d539e 100644 --- a/web/src/ui/tokens.css +++ b/web/src/ui/tokens.css @@ -1,5 +1,8 @@ -/* Orbyn's design tokens. Neutrals carry structure, ink is the primary action, - blue means live or selected, and edges come from light, not borders. */ +/* Orbyn's design tokens: the Orbyn house style, shared with Orbyn Engineering. + Three colours only: ink for everything (including live and selected), + warn (amber) when the person must act, danger (red) for failures and + removals. Calendar, list, tag and project colours are the person's own. + Light, Dark and Dim; edges come from fills, not borders. */ :root[data-theme-changing] *, :root[data-theme-changing] *::before, :root[data-theme-changing] *::after { @@ -8,29 +11,29 @@ :root { color-scheme: light; - --canvas: #f4f4f3; + --canvas: #f6f6f6; --surface: #ffffff; - --sunken: #f7f7f6; - --hover: rgba(20, 20, 24, 0.05); - --chip: rgba(20, 20, 24, 0.06); - --line: rgba(20, 20, 24, 0.09); - --line-soft: rgba(20, 20, 24, 0.06); - --ink: #17181b; + --sunken: #f3f3f3; + --hover: rgba(0, 0, 0, 0.045); + --chip: rgba(0, 0, 0, 0.05); + --line: rgba(0, 0, 0, 0.08); + --line-soft: rgba(0, 0, 0, 0.06); + --ink: #111111; --on-ink: #ffffff; - --ink-hover: #33343a; - --text: #17181b; - --text-soft: #4a4b52; - --text-muted: #66676e; - --accent: #2563eb; - --accent-text: #1d4ed8; - --accent-soft: #eff6ff; - --dot: #60a5fa; - --danger: #b42318; - --danger-soft: #fff1f0; - --warn: #92400e; - --warn-soft: #fef3e2; - --ok: #166534; - --ok-soft: #e9f6ee; + --ink-hover: #2b2b2b; + --text: #171717; + --text-soft: #3d3d3d; + --text-muted: #6e6e6e; + --accent: #171717; + --accent-text: #171717; + --accent-soft: rgba(0, 0, 0, 0.06); + --dot: #171717; + --danger: #c62828; + --danger-soft: rgba(220, 38, 38, 0.07); + --warn: #b45309; + --warn-soft: rgba(245, 158, 11, 0.09); + --ok: #404040; + --ok-soft: rgba(0, 0, 0, 0.05); --event: #ffffff; --raised: 0 0 0 1px rgba(20, 20, 24, 0.06), 0 1px 2px rgba(20, 20, 24, 0.04); --float: 0 0 0 1px rgba(20, 20, 24, 0.07), 0 12px 32px rgba(20, 20, 24, 0.14); @@ -40,8 +43,9 @@ --r-md: 10px; --r-lg: 16px; --r-xl: 24px; - --sans: "DM Sans", system-ui, sans-serif; - --head: Manrope, "DM Sans", system-ui, sans-serif; + --mono: "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace; + --sans: "Geist", system-ui, -apple-system, "Segoe UI", sans-serif; + --head: "Geist", system-ui, -apple-system, "Segoe UI", sans-serif; --control: 36px; --action-fs: 13px; --action-line: 20px; @@ -49,31 +53,32 @@ --base: 200ms; --ease: cubic-bezier(0.2, 0.8, 0.2, 1); } -:root[data-theme="dark"] { +:root[data-theme="dark"], +:root[data-theme="dim"] { color-scheme: dark; - --canvas: #0d0e10; - --surface: #16171a; - --sunken: #121316; + --canvas: #000000; + --surface: #0a0a0a; + --sunken: #111111; --hover: rgba(255, 255, 255, 0.06); --chip: rgba(255, 255, 255, 0.08); - --line: rgba(255, 255, 255, 0.09); + --line: rgba(255, 255, 255, 0.08); --line-soft: rgba(255, 255, 255, 0.06); - --ink: #f2f2f3; - --on-ink: #0d0e10; - --ink-hover: #d8d9dc; - --text: #f2f2f3; - --text-soft: #cdced2; - --text-muted: #a2a3aa; - --accent: #93c5fd; - --accent-text: #bfdbfe; - --accent-soft: #1c2a40; - --danger: #fda29b; - --danger-soft: #402522; - --warn: #fdba74; - --warn-soft: #3a2710; - --ok: #86efac; - --ok-soft: #173023; - --event: #2c2e33; + --ink: #ffffff; + --on-ink: #000000; + --ink-hover: #e3e3e3; + --text: #f2f2f2; + --text-soft: #cfcfcf; + --text-muted: #9a9a9a; + --accent: #f2f2f2; + --accent-text: #f2f2f2; + --accent-soft: rgba(255, 255, 255, 0.08); + --danger: #f05252; + --danger-soft: rgba(239, 68, 68, 0.12); + --warn: #fbbf24; + --warn-soft: rgba(245, 158, 11, 0.1); + --ok: #c4c4c4; + --ok-soft: rgba(255, 255, 255, 0.06); + --event: #161616; --raised: inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 0 0 1px rgba(255, 255, 255, 0.05); --float: @@ -82,6 +87,25 @@ --shade: rgba(0, 0, 0, 0.55); --scrim: rgba(0, 0, 0, 0.6); } + +/* Dim: a neutral #101010 dark theme. Same three colours, softer contrast. */ +:root[data-theme="dim"] { + --canvas: #101010; + --surface: #161616; + --sunken: #1a1a1a; + --event: #1f1f1f; + --ink: #f2f2f2; + --on-ink: #101010; + --text: #ebebeb; + --text-soft: #cfcfcf; + --text-muted: #a3a3a3; + --accent: #ebebeb; + --accent-text: #ebebeb; + --danger: hsl(4 82% 67%); + --danger-soft: hsl(4 72% 54% / 0.16); + --warn: hsl(40 78% 63%); + --warn-soft: hsl(40 72% 50% / 0.14); +} @media (max-width: 800px), (pointer: coarse) { :root { --control: 44px; @@ -115,7 +139,7 @@ h1, h2, h3 { font-family: var(--head); - font-weight: 700; + font-weight: 500; letter-spacing: -0.015em; } h1 {