* {
@@ -37,11 +37,7 @@
/* Active states */
.ox-tab[data-state='active'] {
- @apply text-accent border-accent;
-}
-
-.ox-tabs-list .ox-tab[data-state='active']:hover > * {
- @apply bg-accent-secondary;
+ @apply text-accent border-accent light:border-green-800 light:text-raise;
}
/* Badge styles */
@@ -54,7 +50,7 @@
}
.ox-tab[data-state='active'] > .ox-badge {
- @apply bg-accent-secondary-hover;
+ @apply bg-accent;
}
/* Full width variants */
@@ -82,16 +78,12 @@
}
.ox-side-tabs-list .ox-tab[data-state='active'] {
- @apply text-accent bg-accent-secondary;
+ @apply text-accent bg-accent;
border: none;
}
-.ox-side-tabs .ox-tabs-panel {
- @apply mx-0 ml-4;
-}
-
.ox-side-tabs-list .ox-tab[data-state='active']:hover {
- @apply bg-accent-secondary-hover;
+ @apply bg-accent-hover;
}
.ox-side-tabs-list .ox-tab:not([data-state='active']):hover {
diff --git a/app/ui/styles/components/button.css b/app/ui/styles/components/button.css
index 5fc6fe2852..2ab0c0e81b 100644
--- a/app/ui/styles/components/button.css
+++ b/app/ui/styles/components/button.css
@@ -8,43 +8,57 @@
.ox-button {
@apply relative;
-}
-.active-clicked:active:not(.visually-disabled) {
- @apply motion-safe:translate-y-px;
-}
-.ox-button:after {
- content: '';
- @apply absolute top-0 right-0 bottom-0 left-0 rounded-md border border-current opacity-[0.05];
-}
-.btn-primary {
- @apply text-accent bg-accent-secondary hover:bg-accent-secondary-hover disabled:text-accent-disabled disabled:bg-accent-secondary;
-}
-.btn-primary:disabled > .spinner,
-.btn-primary.visually-disabled > .spinner {
- @apply text-accent;
-}
-.btn-secondary {
- @apply text-default bg-secondary hover:bg-hover disabled:text-disabled disabled:bg-secondary;
-}
-.btn-secondary:disabled > .spinner,
-.btn-secondary.visually-disabled > .spinner {
- @apply text-default;
-}
+ &:after {
+ content: '';
+ @apply absolute top-0 right-0 bottom-0 left-0 rounded-md border border-current/5;
+ }
+ &.btn-primary {
+ @apply text-accent bg-accent hover:bg-accent-hover disabled:text-accent/35 disabled:bg-accent;
+ }
+ &.btn-primary:disabled > .spinner,
+ &.btn-primary.visually-disabled > .spinner {
+ @apply text-accent;
+ }
-.btn-danger {
- @apply text-destructive bg-destructive-secondary hover:bg-destructive-secondary-hover disabled:text-destructive-disabled disabled:bg-destructive-secondary;
-}
-.btn-danger:disabled > .spinner,
-.btn-danger.visually-disabled > .spinner {
- @apply text-destructive;
-}
+ &.btn-secondary {
+ @apply text-secondary bg-secondary hover:bg-hover disabled:text-secondary/35 disabled:bg-secondary;
+ }
+ &.btn-secondary:disabled > .spinner,
+ &.btn-secondary.visually-disabled > .spinner {
+ @apply text-secondary;
+ }
-.btn-ghost {
- @apply text-default border-default hover:bg-hover disabled:text-disabled border disabled:bg-transparent;
-}
-.btn-ghost:after {
- @apply hidden;
+ &.btn-danger {
+ @apply text-destructive bg-destructive hover:bg-destructive-hover disabled:text-destructive/35 disabled:bg-destructive;
+ }
+ &.btn-danger:disabled > .spinner,
+ &.btn-danger.visually-disabled > .spinner {
+ @apply text-destructive;
+ }
+
+ &.btn-ghost {
+ @apply text-secondary hover:bg-hover disabled:text-secondary/35 disabled:bg-transparent;
+ }
+ &.btn-ghost:after {
+ @apply border-current/20;
+ }
+
+ &.btn-accent-ghost {
+ @apply text-accent border-accent-secondary hover:bg-accent-hover border;
+ }
+
+ &.btn-accent-ghost:after {
+ @apply hidden;
+ }
+
+ &.btn-accent-solid {
+ @apply text-inverse bg-(--theme-accent-800);
+ }
+
+ &.btn-accent-solid:after {
+ @apply hidden;
+ }
}
/**
diff --git a/app/ui/styles/components/menu-button.css b/app/ui/styles/components/menu-button.css
index c7ad40e8a7..a818f2d109 100644
--- a/app/ui/styles/components/menu-button.css
+++ b/app/ui/styles/components/menu-button.css
@@ -8,7 +8,7 @@
.dropdown-menu-content {
/* we want menu popover to be on top of top bar and pagination bar too */
- @apply bg-raise border-secondary z-(--z-top-bar-dropdown) min-w-36 rounded-md border p-0;
+ @apply bg-raise light:bg-default z-(--z-top-bar-dropdown) min-w-36 rounded-md p-0;
& .DropdownMenuItem {
@apply text-sans-md text-default border-secondary flex w-full cursor-pointer items-center border-b py-2 pr-6 pl-3 text-left select-none last:border-b-0;
@@ -25,7 +25,7 @@
@apply text-destructive-disabled;
}
- &[data-focus] {
+ &[data-highlighted] {
outline: none;
@apply bg-tertiary;
}
diff --git a/app/ui/styles/components/menu-list.css b/app/ui/styles/components/menu-list.css
index 8975447ee1..4745547e68 100644
--- a/app/ui/styles/components/menu-list.css
+++ b/app/ui/styles/components/menu-list.css
@@ -7,7 +7,7 @@
*/
.ox-menu {
- @apply bg-raise border-secondary elevation-2 !max-h-[17.5rem] overflow-y-auto rounded-md border;
+ @apply bg-raise !max-h-[17.5rem] rounded-md p-px;
}
.ox-menu-item {
@@ -19,15 +19,15 @@
}
.ox-menu-item.is-highlighted.is-selected {
- @apply bg-accent-secondary-hover;
+ @apply bg-accent-hover;
}
.ox-menu-item.is-selected[data-highlighted] {
- @apply bg-accent-secondary-hover;
+ @apply bg-accent-hover;
}
.ox-menu-item.is-selected {
- @apply text-accent bg-accent-secondary hover:bg-accent-secondary-hover border-0;
+ @apply text-accent bg-accent hover:bg-accent-hover;
.ox-badge {
@apply text-inverse bg-accent ring-0;
}
@@ -36,5 +36,5 @@
/* beautiful ring */
.ox-menu-item.is-selected:after {
content: '';
- @apply border-accent absolute top-0 right-0 bottom-0 left-0 block rounded-md border;
+ @apply ring-accent absolute inset-0 z-10 block rounded-sm ring;
}
diff --git a/app/ui/styles/components/mini-table.css b/app/ui/styles/components/mini-table.css
index a34ec314b3..8627454313 100644
--- a/app/ui/styles/components/mini-table.css
+++ b/app/ui/styles/components/mini-table.css
@@ -43,12 +43,12 @@
/* first cell's div */
& td:first-child > div {
- @apply ml-2 rounded-l border-l;
+ @apply ml-2 rounded-l-md border-l;
}
/* second-to-last cell's div */
& td:nth-last-child(2) > div {
- @apply rounded-r border-r;
+ @apply rounded-r-md border-r;
}
/* last cell's div (the div for the delete button) */
diff --git a/app/ui/styles/components/spinner.css b/app/ui/styles/components/spinner.css
index f07f28dce9..060beb4169 100644
--- a/app/ui/styles/components/spinner.css
+++ b/app/ui/styles/components/spinner.css
@@ -83,7 +83,7 @@
}
.metrics-loading-indicator span {
- @apply block h-1 w-[3px] rounded-[1px] bg-[--theme-accent-500];
+ @apply block h-1 w-[3px] rounded-[1px] bg-(--theme-accent-500);
animation: stretch 1.8s infinite both;
}
diff --git a/app/ui/styles/components/table.css b/app/ui/styles/components/table.css
index 231f6ae6b0..1b2b85daf6 100644
--- a/app/ui/styles/components/table.css
+++ b/app/ui/styles/components/table.css
@@ -55,6 +55,17 @@ table.ox-table {
@apply bg-default sticky left-0 z-10;
}
+ /* Border between sticky first column and second column:
+ first column owns the right border, second column drops its left border */
+ & td:first-of-type > div,
+ & th:first-of-type > div {
+ @apply border-r;
+ }
+ & td:nth-of-type(2) > div,
+ & th:nth-of-type(2) > div {
+ @apply border-l-0;
+ }
+
/*
Last column is sticky if it
is a more actions cell
@@ -306,30 +317,42 @@ table.ox-table {
Drop shadow appears if content is below a sticky
cell and the table is overflowing
*/
+td:first-of-type,
+th:first-of-type,
+td:last-of-type.action-col,
+th:last-of-type.action-col {
+ transition-property: box-shadow;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 250ms;
+}
+
.scrolled td:first-of-type,
-.scrolled th:first-of-type,
+.scrolled th:first-of-type {
+ box-shadow: 6px 0 8px -2px oklch(0 0 0 / 0.2);
+}
.overflowing td:last-of-type.action-col,
.overflowing th:last-of-type.action-col {
- @apply elevation-2;
+ box-shadow: -6px 0 8px -2px oklch(0 0 0 / 0.2);
+}
+.light .scrolled td:first-of-type,
+.light .scrolled th:first-of-type {
+ box-shadow: 6px 0 8px -2px oklch(0 0 0 / 0.05);
+}
+.light .overflowing td:last-of-type.action-col,
+.light .overflowing th:last-of-type.action-col {
+ box-shadow: -6px 0 8px -2px oklch(0 0 0 / 0.05);
}
/*
Stops shadow from overflowing below
- -1px helps with a visual glitch when a bit
- underneath shows through
*/
.scrolled td:first-of-type,
.scrolled th:first-of-type {
- clip-path: inset(0px -40px 0px -1px);
+ clip-path: inset(0px -40px 0px 0px);
}
.overflowing td:last-of-type.action-col,
.overflowing th:last-of-type.action-col {
- clip-path: inset(0px -1px 0px -40px);
-}
-
-.scrolled td:first-of-type:before,
-.scrolled th:first-of-type:before {
- @apply border-r-secondary absolute top-0 right-0 bottom-0 border-r content-[''];
+ clip-path: inset(0px 0px 0px -40px);
}
.simplebar-scrollbar {
diff --git a/app/ui/styles/components/tooltip.css b/app/ui/styles/components/tooltip.css
index ebaa86e5de..ad13b7b8b9 100644
--- a/app/ui/styles/components/tooltip.css
+++ b/app/ui/styles/components/tooltip.css
@@ -7,7 +7,7 @@
*/
.ox-tooltip {
- @apply text-sans-md text-default bg-raise border-secondary elevation-2 rounded-md border p-2;
+ @apply text-sans-md text-default bg-raise shadow-tooltip rounded-md p-2;
}
.ox-tooltip-arrow {
diff --git a/app/ui/styles/index.css b/app/ui/styles/index.css
index 6c39b7811d..66e93a470a 100644
--- a/app/ui/styles/index.css
+++ b/app/ui/styles/index.css
@@ -47,6 +47,7 @@
@import '@xterm/xterm/css/xterm.css' layer(components);
@source '../../../node_modules/@oxide/design-system/dist';
+@custom-variant light (&:where([data-theme=light], [data-theme=light] *));
@theme {
--animate-spin-slow: spin 5s linear infinite;
diff --git a/index.html b/index.html
index 0e190e3691..1f7576208b 100644
--- a/index.html
+++ b/index.html
@@ -13,10 +13,23 @@
Oxide Console
-
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
index 9a68ecd67d..192324395f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,9 +10,10 @@
"hasInstallScript": true,
"license": "MPL-2.0",
"dependencies": {
+ "@base-ui/react": "^1.1.0",
"@floating-ui/react": "^0.26.23",
"@headlessui/react": "^2.2.9",
- "@oxide/design-system": "^4.1.0",
+ "@oxide/design-system": "^5.0.0--canary.163.21985709465.0",
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-tabs": "^1.1.0",
@@ -262,13 +263,10 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
- "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
@@ -321,6 +319,60 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@base-ui/react": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.1.0.tgz",
+ "integrity": "sha512-ikcJRNj1mOiF2HZ5jQHrXoVoHcNHdBU5ejJljcBl+VTLoYXR6FidjTN86GjO6hyshi6TZFuNvv0dEOgaOFv6Lw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.4",
+ "@base-ui/utils": "0.2.4",
+ "@floating-ui/react-dom": "^2.1.6",
+ "@floating-ui/utils": "^0.2.10",
+ "reselect": "^5.1.1",
+ "tabbable": "^6.4.0",
+ "use-sync-external-store": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17 || ^18 || ^19",
+ "react": "^17 || ^18 || ^19",
+ "react-dom": "^17 || ^18 || ^19"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@base-ui/utils": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.4.tgz",
+ "integrity": "sha512-smZwpMhjO29v+jrZusBSc5T+IJ3vBb9cjIiBjtKcvWmRj9Z4DWGVR3efr1eHR56/bqY5a4qyY9ElkOY5ljo3ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.4",
+ "@floating-ui/utils": "^0.2.10",
+ "reselect": "^5.1.1",
+ "use-sync-external-store": "^1.6.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^17 || ^18 || ^19",
+ "react": "^17 || ^18 || ^19",
+ "react-dom": "^17 || ^18 || ^19"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@bundled-es-modules/cookie": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz",
@@ -1565,9 +1617,9 @@
"license": "MIT"
},
"node_modules/@oxide/design-system": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@oxide/design-system/-/design-system-4.1.0.tgz",
- "integrity": "sha512-sFNgDf8B8Yial+3uYTfrBaQOT+2BNUlzBgubsHM88m5MMMhjNfPktGZTYy7PtGdYjzkLKSFXWYEjq248l/1MQg==",
+ "version": "5.0.0--canary.163.21985709465.0",
+ "resolved": "https://registry.npmjs.org/@oxide/design-system/-/design-system-5.0.0--canary.163.21985709465.0.tgz",
+ "integrity": "sha512-KGXXMmw5V1B6VQdrDB0ughO74lWd73KmyLd1KMDFd1niodPB1LVBnocCD1nK9wA1+lyed0a1eUMZGBgIRyA4fg==",
"license": "MPL 2.0",
"dependencies": {
"@floating-ui/react": "^0.27.16",
@@ -11720,12 +11772,6 @@
"node": ">=8"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
- "license": "MIT"
- },
"node_modules/regex": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz",
@@ -11804,6 +11850,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/reselect": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
+ "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
+ "license": "MIT"
+ },
"node_modules/resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
@@ -12406,9 +12458,9 @@
"license": "MIT"
},
"node_modules/tabbable": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
- "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz",
+ "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==",
"license": "MIT"
},
"node_modules/tagged-tag": {
diff --git a/package.json b/package.json
index 5df46b5fe6..6bcceeb51c 100644
--- a/package.json
+++ b/package.json
@@ -35,9 +35,10 @@
},
"private": true,
"dependencies": {
+ "@base-ui/react": "^1.1.0",
"@floating-ui/react": "^0.26.23",
"@headlessui/react": "^2.2.9",
- "@oxide/design-system": "^4.1.0",
+ "@oxide/design-system": "^5.0.0--canary.163.21985709465.0",
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-tabs": "^1.1.0",