diff --git a/src/app/_auth/login_signup.module.css b/src/app/_auth/login_signup.module.css index 2b14bb9..c637ba7 100644 --- a/src/app/_auth/login_signup.module.css +++ b/src/app/_auth/login_signup.module.css @@ -1,20 +1,18 @@ -@value gridBaseline from "ui/base/metrics/metrics.module.css"; - .loginSignup { display: flex; - gap: gridBaseline; + gap: var(--gridBaseline); margin: auto; flex-direction: column; justify-content: center; height: 100%; - width: calc(gridBaseline * 35); + width: calc(var(--gridBaseline) * 35); max-width: 90%; } .submitContainer { display: flex; width: 100%; - margin-top: gridBaseline; + margin-top: var(--gridBaseline); align-items: center; justify-content: space-between; } diff --git a/src/app/globals.css b/src/app/globals.css index d900104..210e566 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,3 +1,5 @@ +@import '../ui/base/design_system/design_system.css'; + @font-face { font-family: 'Futura Book'; src: url('/futura-book.otf') format('opentype'); diff --git a/src/app/instructions/page.module.css b/src/app/instructions/page.module.css index baaaa90..768ba40 100644 --- a/src/app/instructions/page.module.css +++ b/src/app/instructions/page.module.css @@ -1,16 +1,13 @@ -@value gridBaseline from "ui/base/metrics/metrics.module.css"; -@value colorPurple, colorGreyA5 from "ui/base/colors/colors.module.css"; - .instructions { margin: auto; display: flex; flex-direction: column; justify-content: center; - max-width: calc(gridBaseline * 120); + max-width: calc(var(--gridBaseline) * 120); } .section { - margin: calc(gridBaseline * 2) 0; + margin: calc(var(--gridBaseline) * 2) 0; } .instructionList li::marker { diff --git a/src/app/layout.module.css b/src/app/layout.module.css index 30ed0a7..79cd8a2 100644 --- a/src/app/layout.module.css +++ b/src/app/layout.module.css @@ -1,5 +1,3 @@ -@value gridBaseline from "ui/base/metrics/metrics.module.css"; - .skeleton { width: 100vw; height: 100vh; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 1a49467..91cb216 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,7 +2,7 @@ import { ApiProvider } from 'app/api/api_provider'; import type { Metadata } from 'next'; import { getFlags } from 'services/server_context'; import { SessionProvider } from 'session/session_provider'; -import colorStyles from 'ui/base/colors/colors.module.css'; +import { colors } from 'ui/base/design_system/design_tokens'; import { NavBar } from 'ui/nav_bar/nav_bar'; import './globals.css'; import styles from './layout.module.css'; @@ -14,7 +14,7 @@ export const metadata: Metadata = { }; export const viewport = { - themeColor: colorStyles.colorPurple, + themeColor: colors.purple, }; export const dynamic = 'force-dynamic'; diff --git a/src/app/maintenance_banner.tsx b/src/app/maintenance_banner.tsx index f63cfa7..117e313 100644 --- a/src/app/maintenance_banner.tsx +++ b/src/app/maintenance_banner.tsx @@ -1,15 +1,14 @@ import React from 'react'; -import colorStyles from 'ui/base/colors/colors.module.css'; -import { gridBaseline } from 'ui/base/metrics/metrics'; +import { colors, metrics } from 'ui/base/design_system/design_tokens'; export const MaintenanceBanner = (props: { message: string }) => { return (
{ { content: Favorites, sortLabel: 'favorites', - style: { width: `calc(${metrics.gridBaseline} * 15)` }, + style: { width: `${metrics.gridBaseline * 15}px` }, }, { content: Downloads, sortLabel: 'downloadCount', - style: { width: `calc(${metrics.gridBaseline} * 15)` }, + style: { width: `${metrics.gridBaseline * 15}px` }, }, { content: Upload date, sortLabel: 'submissionDate', - style: { width: `calc(${metrics.gridBaseline} * 20)` }, + style: { width: `${metrics.gridBaseline * 20}px` }, }, ], 6, diff --git a/src/app/settings/page.module.css b/src/app/settings/page.module.css index 7cb08e2..269aca0 100644 --- a/src/app/settings/page.module.css +++ b/src/app/settings/page.module.css @@ -1,9 +1,7 @@ -@value gridBaseline from "ui/base/metrics/metrics.module.css"; - .settings { - max-width: calc(gridBaseline * 80); - margin: calc(gridBaseline * 10) auto auto auto; + max-width: calc(var(--gridBaseline) * 80); + margin: calc(var(--gridBaseline) * 10) auto auto auto; display: flex; flex-direction: column; - gap: calc(gridBaseline * 2); + gap: calc(var(--gridBaseline) * 2); } diff --git a/src/ui/base/button/button.module.css b/src/ui/base/button/button.module.css index 142ff18..ee3ab74 100644 --- a/src/ui/base/button/button.module.css +++ b/src/ui/base/button/button.module.css @@ -1,9 +1,8 @@ -@value colorWhite, colorPurple, colorGreen, colorGrey, colorRed from "ui/base/colors/colors.module.css"; -@value gridBaseline from "ui/base/metrics/metrics.module.css"; - -@value regularColor: colorPurple; -@value errorColor: colorRed; -@value successColor: colorGreen; +:root { + --regularColor: var(--colorPurple); + --errorColor: var(--colorRed); + --successColor: var(--colorGreen); +} .a { text-decoration: none; @@ -14,48 +13,48 @@ display: inline-flex; align-items: center; justify-content: center; - gap: gridBaseline; + gap: var(--gridBaseline); color: inherit; - padding: gridBaseline calc(gridBaseline * 2); + padding: var(--gridBaseline) calc(var(--gridBaseline) * 2); text-decoration: none; - background: colorWhite; + background: var(--colorWhite); transition: background 0.15s ease, color 0.15s ease; cursor: pointer; - border: 1px solid regularColor; + border: 1px solid var(--regularColor); } .button:hover:not(.disabled) { - color: colorWhite; + color: var(--colorWhite); } .regular.button { - color: regularColor; + color: var(--regularColor); } .regular.button:hover:not(.disabled) { - background: regularColor; + background: var(--regularColor); } .active { - background: regularColor; + background: var(--regularColor); color: white; } .error.button { - border-color: errorColor; - color: errorColor; + border-color: var(--errorColor); + color: var(--errorColor); } .error.button:hover:not(.disabled) { - background: errorColor; + background: var(--errorColor); } .success.button { position: relative; - border-color: successColor; - background: successColor; - color: colorWhite; + border-color: var(--successColor); + background: var(--successColor); + color: var(--colorWhite); } .success.button:hover:not(.disabled) { margin: -1px; @@ -63,11 +62,11 @@ } .button.disabled { - border-color: colorGrey; - color: colorGrey; + border-color: var(--colorGrey); + color: var(--colorGrey); cursor: not-allowed; } .trailingIcon { - margin-left: gridBaseline; + margin-left: var(--gridBaseline); } diff --git a/src/ui/base/colors/colors.module.css b/src/ui/base/colors/colors.module.css deleted file mode 100644 index 0eb0be2..0000000 --- a/src/ui/base/colors/colors.module.css +++ /dev/null @@ -1,13 +0,0 @@ -@value colorBlack: #000; -@value colorWhite: #fff; - -@value colorDarkGrey: #292929; -@value colorGrey: #666; -/* TODO: move to using css-in-js or figure out how to use color-mod in next */ -@value colorGreyA30: rgba(102, 102, 102, 0.3); -@value colorGreyA15: rgba(102, 102, 102, 0.15); -@value colorGreyA5: rgba(102, 102, 102, 0.05); - -@value colorGreen: #4c4; -@value colorRed: #f00; -@value colorPurple: #9b15f1; diff --git a/src/ui/base/design_system/design_system.css b/src/ui/base/design_system/design_system.css new file mode 100644 index 0000000..0457d43 --- /dev/null +++ b/src/ui/base/design_system/design_system.css @@ -0,0 +1,16 @@ +:root { + /* Colors */ + --colorBlack: #000; + --colorWhite: #fff; + --colorDarkGrey: #292929; + --colorGrey: #666; + --colorGreyA30: rgba(102, 102, 102, 0.3); + --colorGreyA15: rgba(102, 102, 102, 0.15); + --colorGreyA5: rgba(102, 102, 102, 0.05); + --colorGreen: #4c4; + --colorRed: #f00; + --colorPurple: #9b15f1; + + /* Metrics */ + --gridBaseline: 8px; +} diff --git a/src/ui/base/design_system/design_tokens.ts b/src/ui/base/design_system/design_tokens.ts new file mode 100644 index 0000000..e13d1dd --- /dev/null +++ b/src/ui/base/design_system/design_tokens.ts @@ -0,0 +1,19 @@ +// Keep this file in sync with design_system.css +// This provides TypeScript access to design system values defined in CSS custom properties + +export const colors = { + black: '#000', + white: '#fff', + darkGrey: '#292929', + grey: '#666', + greyA30: 'rgba(102, 102, 102, 0.3)', + greyA15: 'rgba(102, 102, 102, 0.15)', + greyA5: 'rgba(102, 102, 102, 0.05)', + green: '#4c4', + red: '#f00', + purple: '#9b15f1', +} as const; + +export const metrics = { + gridBaseline: 8, // in px +} as const; diff --git a/src/ui/base/dialog/dialog.module.css b/src/ui/base/dialog/dialog.module.css index cc6ab8d..9d52116 100644 --- a/src/ui/base/dialog/dialog.module.css +++ b/src/ui/base/dialog/dialog.module.css @@ -1,6 +1,3 @@ -@value colorBlack, colorWhite from "ui/base/colors/colors.module.css"; -@value gridBaseline from "ui/base/metrics/metrics.module.css"; - .dialogContainer { position: fixed; top: 0; @@ -16,24 +13,24 @@ .dialog { position: relative; - background-color: colorWhite; - padding: calc(gridBaseline * 2); - border: 1px dotted colorBlack; + background-color: var(--colorWhite); + padding: calc(var(--gridBaseline) * 2); + border: 1px dotted var(--colorBlack); } .close { position: absolute; - top: calc(gridBaseline * -4); - right: calc(gridBaseline * -4); + top: calc(var(--gridBaseline) * -4); + right: calc(var(--gridBaseline) * -4); - width: calc(gridBaseline * 4); - height: calc(gridBaseline * 4); - line-height: calc(gridBaseline * 4); + width: calc(var(--gridBaseline) * 4); + height: calc(var(--gridBaseline) * 4); + line-height: calc(var(--gridBaseline) * 4); background: rgba(0, 0, 0, 0.4); - color: colorWhite; + color: var(--colorWhite); border-radius: 50%; border: none; cursor: pointer; - font-size: calc(gridBaseline * 2); + font-size: calc(var(--gridBaseline) * 2); } diff --git a/src/ui/base/form/form_error.module.css b/src/ui/base/form/form_error.module.css index 6899b81..58723bf 100644 --- a/src/ui/base/form/form_error.module.css +++ b/src/ui/base/form/form_error.module.css @@ -1,5 +1,3 @@ -@value gridBaseline from "ui/base/metrics/metrics.module.css"; - .formError { - margin-top: calc(gridBaseline * 2); + margin-top: calc(var(--gridBaseline) * 2); } diff --git a/src/ui/base/metrics/metrics.module.css b/src/ui/base/metrics/metrics.module.css deleted file mode 100644 index 1c8b26b..0000000 --- a/src/ui/base/metrics/metrics.module.css +++ /dev/null @@ -1 +0,0 @@ -@value gridBaseline: 8px; diff --git a/src/ui/base/numeric/numeric.module.css b/src/ui/base/numeric/numeric.module.css index 9b0f692..9a56a90 100644 --- a/src/ui/base/numeric/numeric.module.css +++ b/src/ui/base/numeric/numeric.module.css @@ -1,22 +1,19 @@ -@value colorRed, colorGrey from "ui/base/colors/colors.module.css"; -@value gridBaseline from "ui/base/metrics/metrics.module.css"; - .container { - margin-top: gridBaseline; + margin-top: var(--gridBaseline); display: flex; flex-direction: column; } .label { font-size: 16px; - margin-bottom: calc(gridBaseline * 0.5); + margin-bottom: calc(var(--gridBaseline) * 0.5); } .numeric { outline: none; - border: 1px solid colorGrey; - padding: calc(gridBaseline * 0.5) gridBaseline; + border: 1px solid var(--colorGrey); + padding: calc(var(--gridBaseline) * 0.5) var(--gridBaseline); font-family: 'Futura Light'; font-size: 20px; @@ -25,5 +22,5 @@ } .errorContainer .numeric { - border: 1px solid colorRed; + border: 1px solid var(--colorRed); } diff --git a/src/ui/base/table/table.module.css b/src/ui/base/table/table.module.css index cd2368f..412c58d 100644 --- a/src/ui/base/table/table.module.css +++ b/src/ui/base/table/table.module.css @@ -1,8 +1,6 @@ -@value gridBaseline from "ui/base/metrics/metrics.module.css"; - .table { width: 100%; - border-spacing: 0 gridBaseline; + border-spacing: 0 var(--gridBaseline); } .header .cell.sortable { diff --git a/src/ui/base/text/link.module.css b/src/ui/base/text/link.module.css index b838da8..5ffc83a 100644 --- a/src/ui/base/text/link.module.css +++ b/src/ui/base/text/link.module.css @@ -1,5 +1,3 @@ -@value colorPurple from "ui/base/colors/colors.module.css"; - .link { cursor: pointer; color: inherit; @@ -7,5 +5,5 @@ } .link:hover { - color: colorPurple; + color: var(--colorPurple); } diff --git a/src/ui/base/text/text.module.css b/src/ui/base/text/text.module.css index c273334..7e373ca 100644 --- a/src/ui/base/text/text.module.css +++ b/src/ui/base/text/text.module.css @@ -1,6 +1,6 @@ -@value colorBlack, colorGreyA5, colorRed, colorWhite, colorGrey, colorPurple from "ui/base/colors/colors.module.css"; -@value weightValueSemibold: 600; -@value gridBaseline from "ui/base/metrics/metrics.module.css"; +:root { + --weightValueSemibold: 600; +} .text { margin: 0; @@ -20,16 +20,16 @@ .styleCode { font-family: 'Courier Prime', monospace; letter-spacing: -0.03em; - background-color: colorGreyA5; - border: 1px solid colorPurple; - border-radius: calc(gridBaseline / 2); + background-color: var(--colorGreyA5); + border: 1px solid var(--colorPurple); + border-radius: calc(var(--gridBaseline) / 2); } .weightRegular { font-weight: 400; } .weightSemibold { - font-weight: weightValueSemibold; + font-weight: var(--weightValueSemibold); } .weightBold { font-weight: 700; @@ -63,28 +63,28 @@ } .textColorBlack { - color: colorBlack; + color: var(--colorBlack); } .textColorRed { - color: colorRed; + color: var(--colorRed); } .textColorWhite { - color: colorWhite; + color: var(--colorWhite); } .textColorGrey { - color: colorGrey; + color: var(--colorGrey); } .textColorPurple { - color: colorPurple; + color: var(--colorPurple); } .displayInline.styleCode { - padding: calc(gridBaseline / 6) calc(gridBaseline); + padding: calc(var(--gridBaseline) / 6) calc(var(--gridBaseline)); } .displayBlock.styleCode { white-space: pre; - padding: calc(gridBaseline); - margin: calc(gridBaseline) 0; + padding: calc(var(--gridBaseline)); + margin: calc(var(--gridBaseline)) 0; } .custom { diff --git a/src/ui/base/textbox/textbox.module.css b/src/ui/base/textbox/textbox.module.css index 6326369..2836d2f 100644 --- a/src/ui/base/textbox/textbox.module.css +++ b/src/ui/base/textbox/textbox.module.css @@ -1,6 +1,3 @@ -@value colorRed, colorGrey, colorGreyA15, colorPurple from "ui/base/colors/colors.module.css"; -@value gridBaseline from "ui/base/metrics/metrics.module.css"; - .container { display: flex; flex-direction: column; @@ -10,25 +7,25 @@ border-style: solid; display: flex; align-items: center; - padding: gridBaseline; + padding: var(--gridBaseline); } .borderGrey { - border-color: colorGrey; + border-color: var(--colorGrey); } .borderPurple { - border-color: colorPurple; + border-color: var(--colorPurple); } .readOnly { - background-color: colorGreyA15; + background-color: var(--colorGreyA15); } .textbox { flex: 1; border: none; outline: none; - padding: calc(gridBaseline * 0.5) gridBaseline; + padding: calc(var(--gridBaseline) * 0.5) var(--gridBaseline); font-family: 'Futura Light'; font-size: 20px; @@ -41,5 +38,5 @@ } .errorContainer .textboxBorder { - border-color: colorRed; + border-color: var(--colorRed); } diff --git a/src/ui/nav_bar/nav_bar.module.css b/src/ui/nav_bar/nav_bar.module.css index 8ae5f97..8b45375 100644 --- a/src/ui/nav_bar/nav_bar.module.css +++ b/src/ui/nav_bar/nav_bar.module.css @@ -1,26 +1,23 @@ -@value gridBaseline from 'ui/base/metrics/metrics.module.css'; -@value colorDarkGrey, colorPurple, colorWhite from 'ui/base/colors/colors.module.css'; - .navbar { display: flex; - min-height: calc(gridBaseline * 7); - background: colorDarkGrey; - color: colorWhite; + min-height: calc(var(--gridBaseline) * 7); + background: var(--colorDarkGrey); + color: var(--colorWhite); align-items: center; justify-content: space-between; } .logo { color: inherit; - margin-left: calc(gridBaseline * 2.5); + margin-left: calc(var(--gridBaseline) * 2.5); text-decoration: none; transition: color 0.1s ease; } .userStatus { - margin-right: calc(gridBaseline * 3); + margin-right: calc(var(--gridBaseline) * 3); } .menuItem { - margin: 0 gridBaseline; + margin: 0 var(--gridBaseline); }