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);
}