merge newui branch

This commit is contained in:
Gani Georgiev
2026-04-18 16:29:34 +03:00
parent 58f605e90c
commit 4c44044c0c
804 changed files with 58660 additions and 56663 deletions

37
ui/src/css/_main.css Normal file
View File

@@ -0,0 +1,37 @@
@import "./fonts.css";
@import "./remixicon.css";
@import "./vars.css";
@import "./animations.css";
@import "./prism.css";
@import "./base.css";
@import "./tooltip.css";
@import "./toast.css";
@import "./list.css";
@import "./grid.css";
@import "./table.css";
@import "./form.css";
@import "./dropdown.css";
@import "./accordion.css";
@import "./bulkbar.css";
@import "./tabs.css";
@import "./modal.css";
@import "./layout.css";
/* --------------------------------------------------------------- */
@import "./ruleField.css";
@import "./ratelimit.css";
@import "./export.css";
@import "./logs.css";
@import "./map.css";
@import "./recordSummary.css";
@import "./recordFilePicker.css";
@import "./recordsPicker.css";
@import "./recordFields.css";
@import "./collectionModal.css";
@import "./providers.css";
@import "./apiPreviewModal.css";
@import "./colorPicker.css";
@import "./collectionsOverview.css";
@import "./erd.css";
@import "./hideControls.css";

163
ui/src/css/accordion.css Normal file
View File

@@ -0,0 +1,163 @@
.accordion {
--siblingSpacing: var(--smSpacing);
--contentPadding: var(--smSpacing);
position: relative;
display: block;
width: 100%;
color: var(--surfaceTxtColor);
border-radius: var(--borderRadius);
background: var(--surfaceAlt1Color);
border: 1px solid var(--surfaceAlt3Color);
transition:
border var(--animationSpeed),
border-radius var(--animationSpeed),
box-shadow var(--animationSpeed),
margin var(--animationSpeed);
summary {
position: relative;
display: flex;
gap: 10px;
width: 100%;
align-items: center;
min-height: var(--lgBtnHeight);
cursor: pointer;
padding: 10px var(--smSpacing);
padding-right: calc(var(--smSpacing) + 30px);
background: var(--surfaceColor);
border-radius: var(--borderRadius);
user-select: none;
transition:
background var(--animationSpeed),
border var(--animationSpeed),
border-radius var(--animationSpeed);
&::marker {
content: "";
display: none;
}
&::before {
position: absolute;
right: calc(var(--smSpacing) - 3px);
top: 50%;
margin-top: -10px;
width: 20px;
height: 20px;
line-height: 20px;
align-content: center;
content: "\EA4E";
display: block;
flex-shrink: 0;
font-size: 1.3rem;
font-weight: normal;
font-family: var(--iconFontFamily);
color: var(--surfaceTxtHintColor);
transition: color var(--animationSpeed);
}
&:not([tabindex="-1"]) {
&:hover,
&:focus-visible {
outline: 0;
background: var(--surfaceAlt1Color);
&::before {
color: var(--surfaceTxtColor);
}
}
}
&[tabindex="-1"] {
outline: 0;
cursor: default;
user-select: auto;
padding-right: var(--smSpacing);
&::before {
content: none;
display: none;
}
}
}
&::details-content {
height: 0;
overflow: clip;
padding: 0 var(--contentPadding);
background: var(--surfaceColor);
border-bottom-left-radius: var(--borderRadius);
border-bottom-right-radius: var(--borderRadius);
transition:
border var(--slideAnimationSpeed) step-end,
height var(--slideAnimationSpeed),
padding var(--slideAnimationSpeed),
content-visibility var(--slideAnimationSpeed),
overflow var(--slideAnimationSpeed) step-start;
transition-behavior: allow-discrete;
}
&:has(+ .accordion) {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
summary {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
}
&:not([open]):has(+ .accordion[open]) {
border-bottom-left-radius: var(--borderRadius);
border-bottom-right-radius: var(--borderRadius);
border-bottom-width: 1px;
summary {
border-bottom-left-radius: var(--borderRadius);
border-bottom-right-radius: var(--borderRadius);
}
}
+ .accordion {
border-top-left-radius: 0;
border-top-right-radius: 0;
border-top-width: 0;
summary {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
}
& + .accordion[open] {
margin-top: var(--siblingSpacing);
}
&[open] {
border-width: 1px;
border-radius: var(--borderRadius);
box-shadow: var(--boxShadow);
summary {
background: var(--surfaceAlt1Color);
border-radius: var(--borderRadius) var(--borderRadius) 0 0;
&::before {
content: "\EA78";
}
}
&::details-content {
border-top: 1px solid var(--surfaceAlt3Color);
padding-top: var(--contentPadding);
padding-bottom: var(--contentPadding);
height: auto;
overflow: visible;
/* same transition but with step-end overflow */
transition:
height var(--slideAnimationSpeed),
padding var(--slideAnimationSpeed),
content-visibility var(--slideAnimationSpeed),
overflow var(--slideAnimationSpeed) step-end;
transition-behavior: allow-discrete;
}
& + .accordion {
border-top-width: 1px;
margin-top: var(--siblingSpacing);
border-top-left-radius: var(--borderRadius);
border-top-right-radius: var(--borderRadius);
summary {
border-top-left-radius: var(--borderRadius);
border-top-right-radius: var(--borderRadius);
}
}
}
&.noanimation {
&::details-content {
transition: none !important;
}
}
}

50
ui/src/css/animations.css Normal file
View File

@@ -0,0 +1,50 @@
@keyframes rotate {
from {
pointer-events: none;
}
to {
pointer-events: none;
transform: rotate(360deg);
}
}
@keyframes halfRotate {
from {
pointer-events: none;
}
to {
pointer-events: none;
transform: rotate(180deg);
}
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes slideTop {
from {
opacity: 0;
transform: translateY(-3px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes scaleIn {
from {
opacity: 0;
transform: scale(0.85);
}
to {
opacity: 1;
transform: scale(1);
}
}

View File

@@ -0,0 +1,128 @@
.api-preview-content {
flex-grow: 1;
overflow: auto;
scrollbar-width: thin;
padding: calc(var(--smSpacing) + 5px) var(--spacing) calc(var(--spacing) - 5px);
padding: calc(var(--spacing) - 5px) var(--spacing) calc(var(--spacing) - 5px);
}
.api-preview-content-header {
display: flex;
width: 100%;
align-items: center;
margin: 0 0 calc(var(--smSpacing) + 5px);
.preview-close-btn {
margin: -10px 0;
}
}
.api-preview-sidebar {
width: 190px;
flex-shrink: 0;
overflow: auto;
scrollbar-width: thin;
background: var(--surfaceAlt1Color);
padding: var(--inputPadding);
border-right: 1px solid var(--surfaceAlt2Color);
}
.api-preview-nav {
display: flex;
flex-direction: column;
gap: 5px;
hr {
margin: var(--inputPadding) 0;
}
.nav-item {
outline: 0;
display: flex;
align-items: center;
gap: 5px;
width: 100%;
padding: 5px var(--inputPadding);
cursor: pointer;
font-size: var(--lgFontSize);
min-height: var(--btnHeight);
border-radius: var(--borderRadius);
color: var(--surfaceTxtHintColor);
transition: color var(--animationSpeed),
background var(--animationSpeed);
&:hover,
&:focus-visible,
&.active {
background: var(--surfaceAlt2Color);
}
&.active {
color: var(--surfaceTxtColor);
}
&:active {
background: var(--surfaceAlt3Color);
transition-duration: var(--activeAnimationSpeed);
}
&[disabled] {
cursor: not-allowed;
color: var(--surfaceTxtDisabledColor);
background: none;
}
}
}
.api-preview-alert {
display: flex;
gap: 10px;
align-items: center;
margin: var(--smSpacing) 0;
.method {
font-weight: bold;
flex-shrink: 0;
}
.path {
flex-grow: 1;
}
.extra {
color: var(--surfaceTxtHintColor);
max-width: 180px;
text-align: right;
margin: -3px 0 -3px auto;
font-size: 0.85em;
}
}
.api-preview-table {
width: 100%;
margin: var(--smSpacing) 0;
}
code.filter-op {
min-width: 30px;
text-align: center;
}
.api-preview-modal {
width: 900px;
max-width: 95%;
.modal-content {
display: flex;
align-items: stretch;
padding: 0;
&::before,
&::after {
content: none;
display: none;
}
}
@media (max-width: 550px) {
.modal-content {
flex-direction: column;
}
.api-preview-content > .content {
min-width: 550px;
}
.api-preview-sidebar {
width: 100%;
max-height: 150px;
border: 0;
border-bottom: 2px solid var(--surfaceAlt3Color);
}
}
}

1283
ui/src/css/base.css Normal file

File diff suppressed because it is too large Load Diff

74
ui/src/css/bulkbar.css Normal file
View File

@@ -0,0 +1,74 @@
.bulkbar {
position: fixed;
z-index: 11;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px;
bottom: var(--spacing);
left: 50%;
transform: translateX(-50%);
opacity: 1;
width: 450px;
max-width: 95%;
padding: 5px var(--smSpacing);
min-height: var(--lgBtnHeight);
background: var(--surfaceColor);
border-radius: 50px;
box-shadow: var(--boxShadow);
border: 1px solid var(--surfaceAlt3Color);
transition-property: opacity, transform, display;
transition-behavior: allow-discrete;
transition-duration: var(--animationSpeed);
transform: translate(-50%, 10px);
@starting-style {
opacity: 0;
transform: translate(-50%, 10px);
}
&[hidden],
&.hidden {
opacity: 0;
transform: translate(-50%, 10px);
}
> .btn:first-child {
margin-left: -5px;
}
> .btn:last-child {
margin-right: -5px;
}
@media (max-width: 480px) {
border-radius: var(--borderRadius);
padding: min(10px, var(--smSpacing)) var(--smSpacing);
> .txt,
> .content {
width: 100%;
}
}
}
.bulkbar-wrapper {
position: sticky;
z-index: 11;
width: 100%;
left: 0;
bottom: var(--smSpacing);
right: 0;
.bulkbar {
position: relative;
bottom: 0;
left: auto;
right: auto;
margin: var(--smSpacing) auto;
transform: translateY(0);
@starting-style {
transform: translateY(10px);
}
&[hidden],
&.hidden {
transform: translateY(10px);
}
}
}

View File

@@ -0,0 +1,95 @@
.collection-upsert-modal {
width: 720px;
.modal-content {
scrollbar-gutter: stable both-edges;
}
.modal-title {
min-height: var(--smBtnHeight);
.collection-name {
max-width: 220px;
}
}
}
.new-collection-field-btn-wrapper {
margin: var(--smSpacing) 0;
}
.field-types-dropdown {
flex-direction: row;
flex-wrap: wrap;
gap: 0;
margin: -5px 0;
border: 2px solid var(--primaryColor);
.dropdown-item {
width: 25%;
padding: 10px;
margin: 2px 0;
}
@media (max-width: 600px) {
.dropdown-item {
width: 50%;
}
}
}
.indexes-list {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.code-editor.collection-index-input {
min-height: 101px;
}
.query-caveats-dropdown {
width: 300px;
padding: 10px;
ul {
margin: 0;
padding-left: 20px;
}
}
.query-state {
position: absolute;
top: 10px;
right: 10px;
}
.collection-changes-list {
margin: 10px 0;
li {
margin: 10px 0;
align-content: center;
line-height: var(--smLineHeight);
i {
display: inline-block;
}
}
.rule-content {
margin: 5px 0;
font-family: var(--monospaceFontFamily);
font-size: var(--smFontSize);
line-height: var(--smLineHeight);
white-space: pre-wrap;
text-align: left;
&.old-rule {
color: var(--surfaceTxtHintColor);
}
&.new-rule {
color: var(--successColor);
}
}
}
.oidc-userinfo-options {
border: 2px solid var(--inputFocusColor);
border-radius: var(--borderRadius);
padding: var(--smSpacing);
}
.view-query-sample code {
max-height: 300px;
background: none;
border: 1px solid var(--surfaceAlt2Color);
}

View File

@@ -0,0 +1,70 @@
.modal.collections-overview-modal {
width: 1500px;
max-width: 90%;
min-height: 90%;
max-height: 90%;
/* note: don't use scale to avoid interfering with the erd sizing */
transform: translateY(3px);
&[data-modal-state="open"] {
transform: translateY(0);
@starting-style {
transform: translateY(3px);
}
}
.modal-header {
padding-top: var(--smSpacing);
}
.modal-content.erd-tab {
padding: 0;
align-items: stretch;
display: flex;
&::before,
&::after {
content: none;
display: none;
}
}
.modal-content.rules-tab {
padding-top: 0;
scrollbar-gutter: stable;
}
.rules-table {
min-width: 700px;
word-break: break-word;
margin-top: calc(var(--spacing) - 5px);
.collection-name {
width: 200px;
overflow: hidden;
text-overflow: ellipsis;
}
thead {
top: -3px;
}
}
.col-rule-btns {
/*padding: 5px;*/
}
.rule-btns {
display: flex;
width: 100%;
gap: 5px;
.btn {
flex: 1 1 0;
padding: 5px;
&.outline {
padding: 3px;
}
}
}
@media (max-width: 700px) {
max-width: 95%;
min-height: 95%;
max-height: 95%;
.rules-table .collection-name {
max-width: 130px;
}
}
}

View File

@@ -0,0 +1,97 @@
.color-picker {
display: flex;
width: 100%;
align-items: stretch;
min-height: 28px;
padding: 0px;
background: none;
border-radius: var(--borderRadius);
padding: 3px;
gap: 3px;
background: var(--surfaceColor);
.predefined-colors-btn {
padding: 0 3px;
}
.color-picker-input-wrapper {
position: relative;
display: block;
flex-grow: 1;
height: auto;
input[type="color"] {
-webkit-appearance: none;
width: 100%;
height: 100%;
padding: 0;
margin: 0;
border: 0;
cursor: cell;
border-radius: var(--borderRadius);
&::-webkit-color-swatch-wrapper {
padding: 0;
}
&::-webkit-color-swatch {
border: none;
border-radius: 0;
}
}
.result {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
padding: 0 2px;
text-align: center;
align-content: center;
line-height: 1;
font-size: 0.85rem;
font-family: var(--monospaceFontFamily);
pointer-events: none;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
}
.predefined-colors-list {
display: flex;
flex-wrap: wrap;
gap: 5px;
user-select: none;
.color {
cursor: pointer;
width: 22px;
height: 22px;
flex-shrink: 0;
border-radius: var(--borderRadius);
transition: opacity var(--animationSpeed);
&:focus-visible {
outline-color: var(--surfaceAlt5Color);
}
&:hover,
&:active {
opacity: 0.8;
}
&:active {
opacity: 0.7;
transition-duration: var(--activeAnimationSpeed);
}
}
}
.predefined-colors-dropdown {
width: auto;
min-width: 25px;
max-width: 170px;
}
.field {
.color-picker {
margin: 4px;
width: auto;
}
label ~ .color-picker {
margin-top: 6px;
}
}

163
ui/src/css/dropdown.css Normal file
View File

@@ -0,0 +1,163 @@
@keyframes popoverHide {
from {
opacity: 1;
}
to {
opacity: 0;
transform: translateY(3px);
}
}
@keyframes popoverShow {
from {
transform: translateY(3px);
opacity: 0;
}
to {
transform: translateY(0px);
opacity: 1;
}
}
.dropdown {
display: inline-flex;
flex-direction: column;
gap: 5px;
width: anchor-size(width);
min-width: 150px;
max-height: 330px;
overflow: auto;
padding: 5px;
margin: 5px 0;
outline: 0;
text-align: left;
font-weight: normal;
font-size: var(--fontSize);
line-height: var(--smLineHeight);
color: var(--surfaceTxtColor);
background: var(--surfaceColor);
box-shadow: var(--boxShadow);
scrollbar-width: thin;
border-radius: var(--borderRadius);
border: 1px solid var(--surfaceAlt3Color);
&[popover] {
display: none;
position-area: bottom span-left;
position-try-fallbacks: flip-block;
transition:
display var(--animationSpeed) allow-discrete,
overlay var(--animationSpeed) allow-discrete;
animation: popoverHide var(--animationSpeed) forwards;
&:popover-open {
animation: popoverShow var(--animationSpeed) forwards;
display: inline-flex;
}
&.left {
position-area: bottom span-right;
}
}
hr {
margin: 0;
}
.dropdown-item {
outline: 0;
cursor: pointer;
display: flex;
width: 100%;
align-items: center;
gap: 8px;
padding: 10px 12px;
user-select: none;
text-decoration: none;
word-break: break-word;
color: inherit;
transition: background var(--animationSpeed);
border-radius: var(--borderRadius);
&:hover {
background: var(--surfaceAlt1Color);
}
&:focus-visible {
outline: 2px dotted var(--surfaceAlt3Color);
}
&:active {
background: var(--surfaceAlt2Color);
transition-duration: var(--activeAnimationSpeed);
}
&.active {
background: var(--surfaceAlt2Color);
transition-duration: var(--activeAnimationSpeed);
&:hover {
background: var(--surfaceAlt3Color);
transition-duration: var(--animationSpeed);
}
}
&[disabled],
&.disabled {
cursor: default;
background: none;
color: var(--surfaceTxtDisabledColor);
}
input[type="checkbox"],
input[type="radio"] {
~ label {
width: 100%;
}
}
}
> .field,
> .fields-group {
margin: 0;
}
.field:has(.search),
.fields-group:has(.search) {
margin: 0;
background: none;
border-bottom: 1px solid var(--surfaceAlt1Color);
.field,
input.search {
background: none;
border-bottom: 0;
}
}
.dropdown-search {
border-bottom: 1px solid var(--surfaceAlt2Color);
.field {
background: none !important;
}
}
&.nowrap,
&.txt-nowrap {
width: auto;
white-space: nowrap;
}
&.sm {
min-width: 100px;
font-size: var(--smFontSize);
.dropdown-item {
gap: 5px;
padding: 7px;
}
}
&.autocomplete {
position: fixed;
z-index: 99999;
max-width: 350px;
max-height: 200px;
padding: 3px;
gap: 3px;
word-break: break-word;
font-size: var(--smFontSize);
.dropdown-item {
padding: 2px 4px;
line-height: 1.2;
}
}
&.history-searchbar-dropdown[popover] {
min-width: 300px;
max-width: 450px;
}
}

183
ui/src/css/erd.css Normal file
View File

@@ -0,0 +1,183 @@
.erd-table-row {
display: flex;
width: 100%;
align-items: center;
gap: 5px;
border: 0;
padding: 2px 5px;
font-weight: normal;
min-height: var(--smBtnHeight);
background: var(--surfaceColor);
color: var(--surfaceTxtColor);
border-top: 1px solid var(--surfaceAlt2Color);
.txt-ellipsis {
min-width: 0;
}
&.header {
color: inherit;
background: inherit;
justify-content: center;
text-align: center;
font-weight: bold;
border: 0;
}
&.type-relation {
background: var(--surfaceAlt1Color);
}
&:first-child,
&.header + .erd-table-row {
border-top: 0;
border-top-left-radius: var(--borderRadius);
border-top-right-radius: var(--borderRadius);
}
&:last-child {
border-bottom-left-radius: var(--borderRadius);
border-bottom-right-radius: var(--borderRadius);
}
i {
font-size: 1em;
}
.field-icon {
color: var(--surfaceTxtHintColor);
}
.field-name {
display: inline-block;
vertical-align: top;
flex-shrink: 1;
min-width: 10px;
max-width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.field-hidden-label {
padding: 3px;
min-height: 0;
line-height: 1;
font-size: 0.78em;
}
.meta {
display: flex;
flex-grow: 0;
flex-shrink: 0;
font-size: 0.9em;
margin-left: auto;
white-space: nowrap;
color: var(--surfaceTxtHintColor);
}
}
.erd-table {
position: relative;
display: block;
z-index: 2;
width: 200px;
text-align: left;
user-select: none;
padding: 2px;
word-break: break-word;
background: var(--surfaceAlt4Color);
color: var(--surfaceTxtHintColor);
border-radius: var(--borderRadius);
font-size: var(--smFontSize);
line-height: var(--smLineHeight);
transition:
opacity var(--animationSpeed),
background var(--animationSpeed),
color var(--animationSpeed),
box-shadow var(--animationSpeed);
&.active {
color: var(--surfaceTxtColor);
background: var(--surfaceAlt5Color);
}
&.system {
color: var(--dangerTxtColor);
background: var(--dangerColor);
}
&.active,
&:hover {
box-shadow: var(--boxShadow);
}
}
.erd {
display: block;
position: relative;
overflow: hidden;
cursor: grab;
width: 100%;
height: auto;
min-height: 300px;
background-image: radial-gradient(var(--surfaceAlt3Color) 1px, transparent 1px);
background-size: 20px 20px;
border-radius: var(--borderRadius);
touch-action: none; /* handled by js */
.erd-area {
position: relative;
left: 0;
top: 0;
user-select: none;
transform-origin: 0 0;
}
.erd-table {
position: absolute;
left: 0;
top: 0;
}
/* svg paths */
.erd-paths {
--pathColor: var(--surfaceAlt2Color);
position: absolute;
z-index: 0;
top: 0;
left: 0;
width: 2000px; /* something large enough to fit the lines */
height: 8000px;
pointer-events: none;
transition: opacity var(--animationSpeed);
}
.paths-group {
fill: none;
stroke-width: 2;
stroke: var(--pathColor);
}
.erd-paths.front {
--pathColor: var(--surfaceAlt5Color);
z-index: 2;
.active-from {
stroke: var(--surfaceTxtHintColor);
}
}
.erd-nav {
position: absolute;
z-index: 3;
right: var(--smSpacing);
bottom: var(--smSpacing);
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
}
/* states */
&.updating {
.erd-paths,
.erd-table {
opacity: 0;
}
}
&.panning {
cursor: grabbing;
}
&.active {
.erd-paths.back {
opacity: 0.3;
}
}
}

156
ui/src/css/export.css Normal file
View File

@@ -0,0 +1,156 @@
.export-panel {
display: flex;
width: 100%;
height: 550px;
align-items: stretch;
background: var(--surfaceAlt1Color);
border-radius: var(--borderRadius);
.export-list {
display: flex;
flex-direction: column;
gap: var(--smSpacing);
width: 230px;
min-height: 0;
flex-shrink: 0;
overflow: auto;
scrollbar-width: thin;
padding: var(--smSpacing);
word-break: break-word;
.list-item {
margin: 0;
width: 100%;
}
}
.export-preview {
position: relative;
flex-grow: 1;
overflow: hidden;
.ctrls {
position: absolute;
display: flex;
align-items: center;
gap: 10px;
right: var(--smSpacing);
top: calc(var(--smSpacing) - 5px);
}
.code-wrapper {
height: 100%;
width: 100%;
code {
height: 100%;
border-radius: 0;
background: none;
white-space: pre;
}
}
}
> * {
border-left: 1px solid var(--surfaceAlt2Color);
}
> :first-child {
border-left: 0;
border-top-left-radius: var(--borderRadius);
border-bottom-left-radius: var(--borderRadius);
}
> :last-child {
border-top-right-radius: var(--borderRadius);
border-bottom-right-radius: var(--borderRadius);
}
@media (max-width: 700px) {
flex-direction: row;
flex-wrap: wrap;
height: auto;
> * {
border: 0;
border-radius: 0;
border-top: 1px solid var(--surfaceAlt2Color);
}
> :first-child {
border-top: 0;
border-top-left-radius: var(--borderRadius);
border-top-right-radius: var(--borderRadius);
}
> :last-child {
border-bottom-left-radius: var(--borderRadius);
border-bottom-right-radius: var(--borderRadius);
}
.export-list {
width: 100%;
max-height: 200px;
}
.export-preview {
max-height: 300px;
}
}
}
.import-change-label {
min-width: 65px;
}
.collections-diff-table-title {
display: flex;
width: 100%;
gap: 10px;
align-items: center;
flex-wrap: wrap;
margin: 0 0 var(--smSpacing);
.import-change-label {
font-weight: bold;
}
}
.collections-diff-table {
color: var(--surfaceTxtHintColor);
border-radius: var(--borderRadius);
tr {
background: none;
}
th,
td {
height: auto;
padding: 2px 10px;
}
th {
padding: 4px 10px;
color: var(--surfaceTxtColor);
}
thead tr {
background: var(--surfaceAlt2Color);
th {
background: none;
}
}
.changed-none-col {
color: var(--surfaceTxtDisabledColor);
background: var(--surfaceAlt1Color);
}
.changed-old-col {
color: var(--surfaceTxtColor);
background: var(--surfaceDangerColor);
}
.changed-new-col {
color: var(--surfaceTxtColor);
background: var(--surfaceSuccessColor);
}
.field-key-col {
padding-left: var(--spacing);
white-space: nowrap;
}
.diff-value {
white-space: break-spaces;
}
tbody th {
background: var(--surfaceAlt1Color);
}
}
.collections-diff-table-wrapper {
& + .collections-diff-table-wrapper {
margin-top: var(--spacing);
}
}

57
ui/src/css/fonts.css Normal file
View File

@@ -0,0 +1,57 @@
@font-face {
font-display: block;
font-family: "remixicon";
src: url("/fonts/remixicon/remixicon.woff2?t=1734404658139") format("woff2");
}
/* ---------------------------------------------------------------- */
@font-face {
font-display: block;
font-family: "IBM Plex Sans";
font-style: normal;
font-weight: 400;
src: url("/fonts/ibm-plex-sans/ibm-plex-sans-v23-cyrillic_latin_latin-ext-regular.woff2") format("woff2");
}
@font-face {
font-display: block;
font-family: "IBM Plex Sans";
font-style: italic;
font-weight: 400;
src: url("/fonts/ibm-plex-sans/ibm-plex-sans-v23-cyrillic_latin_latin-ext-italic.woff2") format("woff2");
}
@font-face {
font-display: block;
font-family: "IBM Plex Sans";
font-style: normal;
font-weight: 600;
src: url("/fonts/ibm-plex-sans/ibm-plex-sans-v23-cyrillic_latin_latin-ext-600.woff2") format("woff2");
}
@font-face {
font-display: block;
font-family: "IBM Plex Sans";
font-style: italic;
font-weight: 600;
src: url("/fonts/ibm-plex-sans/ibm-plex-sans-v23-cyrillic_latin_latin-ext-600italic.woff2") format("woff2");
}
/* ---------------------------------------------------------------- */
@font-face {
font-display: swap;
font-family: "IBM Plex Mono";
font-style: normal;
font-weight: 400;
src: url("/fonts/ibm-plex-mono/ibm-plex-mono-v20-latin-regular.woff2") format("woff2");
}
@font-face {
font-display: swap;
font-family: "IBM Plex Mono";
font-style: normal;
font-weight: 600;
src: url("/fonts/ibm-plex-mono/ibm-plex-mono-v20-latin-600.woff2") format("woff2");
}

1122
ui/src/css/form.css Normal file

File diff suppressed because it is too large Load Diff

184
ui/src/css/grid.css Normal file
View File

@@ -0,0 +1,184 @@
.grid {
--gridGap: var(--spacing);
position: relative;
display: flex;
flex-grow: 1;
flex-wrap: wrap;
row-gap: var(--gridGap);
margin: 0 calc(-0.5 * var(--gridGap));
container-type: inline-size;
&.center {
align-items: center;
}
&.sm {
--gridGap: var(--smSpacing);
}
& > [class^="col-"] {
position: relative;
width: 100%;
min-width: 0;
min-height: 1px;
margin: 0 calc(0.5 * var(--gridGap));
> hr:first-child {
margin-top: 0;
}
> hr:last-child {
margin-bottom: 0;
}
}
.col-12 {
width: calc(100% - var(--gridGap));
}
.col-11 {
width: calc(91.6666666667% - var(--gridGap));
}
.col-10 {
width: calc(83.3333333333% - var(--gridGap));
}
.col-9 {
width: calc(75% - var(--gridGap));
}
.col-8 {
width: calc(66.6666666667% - var(--gridGap));
}
.col-7 {
width: calc(58.3333333333% - var(--gridGap));
}
.col-6 {
width: calc(50% - var(--gridGap));
}
.col-5 {
width: calc(41.6666666667% - var(--gridGap));
}
.col-4 {
width: calc(33.3333333333% - var(--gridGap));
}
.col-3 {
width: calc(25% - var(--gridGap));
}
.col-2 {
width: calc(16.6666666667% - var(--gridGap));
}
.col-1 {
width: calc(8.3333333333% - var(--gridGap));
}
@container (width >= 380px) {
.col-sm-12 {
width: calc(100% - var(--gridGap));
}
.col-sm-11 {
width: calc(91.6666666667% - var(--gridGap));
}
.col-sm-10 {
width: calc(83.3333333333% - var(--gridGap));
}
.col-sm-9 {
width: calc(75% - var(--gridGap));
}
.col-sm-8 {
width: calc(66.6666666667% - var(--gridGap));
}
.col-sm-7 {
width: calc(58.3333333333% - var(--gridGap));
}
.col-sm-6 {
width: calc(50% - var(--gridGap));
}
.col-sm-5 {
width: calc(41.6666666667% - var(--gridGap));
}
.col-sm-4 {
width: calc(33.3333333333% - var(--gridGap));
}
.col-sm-3 {
width: calc(25% - var(--gridGap));
}
.col-sm-2 {
width: calc(16.6666666667% - var(--gridGap));
}
.col-sm-1 {
width: calc(8.3333333333% - var(--gridGap));
}
}
@container (width >= 550px) {
.col-md-12 {
width: calc(100% - var(--gridGap));
}
.col-md-11 {
width: calc(91.6666666667% - var(--gridGap));
}
.col-md-10 {
width: calc(83.3333333333% - var(--gridGap));
}
.col-md-9 {
width: calc(75% - var(--gridGap));
}
.col-md-8 {
width: calc(66.6666666667% - var(--gridGap));
}
.col-md-7 {
width: calc(58.3333333333% - var(--gridGap));
}
.col-md-6 {
width: calc(50% - var(--gridGap));
}
.col-md-5 {
width: calc(41.6666666667% - var(--gridGap));
}
.col-md-4 {
width: calc(33.3333333333% - var(--gridGap));
}
.col-md-3 {
width: calc(25% - var(--gridGap));
}
.col-md-2 {
width: calc(16.6666666667% - var(--gridGap));
}
.col-md-1 {
width: calc(8.3333333333% - var(--gridGap));
}
}
@container (width >= 650px) {
.col-lg-12 {
width: calc(100% - var(--gridGap));
}
.col-lg-11 {
width: calc(91.6666666667% - var(--gridGap));
}
.col-lg-10 {
width: calc(83.3333333333% - var(--gridGap));
}
.col-lg-9 {
width: calc(75% - var(--gridGap));
}
.col-lg-8 {
width: calc(66.6666666667% - var(--gridGap));
}
.col-lg-7 {
width: calc(58.3333333333% - var(--gridGap));
}
.col-lg-6 {
width: calc(50% - var(--gridGap));
}
.col-lg-5 {
width: calc(41.6666666667% - var(--gridGap));
}
.col-lg-4 {
width: calc(33.3333333333% - var(--gridGap));
}
.col-lg-3 {
width: calc(25% - var(--gridGap));
}
.col-lg-2 {
width: calc(16.6666666667% - var(--gridGap));
}
.col-lg-1 {
width: calc(8.3333333333% - var(--gridGap));
}
}
}

View File

@@ -0,0 +1,7 @@
.app.hide-controls {
.btn-collection-settings,
.sidebar-content.new-collection,
.settings-sidebar [data-group="Sync"] {
display: none;
}
}

616
ui/src/css/layout.css Normal file
View File

@@ -0,0 +1,616 @@
.app {
display: flex;
flex-direction: column;
width: 100%;
height: 100%; /* don't use vh because it doesn't account for the mobile url bar */
padding: 0;
&:has(.accent-surface) {
background: var(--accentColor);
color: var(--accentTxtColor);
}
}
.app-header {
--headerItemsGap: var(--inputPadding);
display: flex;
align-items: center;
padding: 2px 10px;
width: 100%;
flex-shrink: 0;
min-height: 38px;
gap: var(--headerItemsGap);
font-size: var(--smFontSize);
line-height: var(--smLineHeight);
/* for when the page is opened in "app" mode */
@media (display-mode: minimal-ui) or (display-mode: standalone) {
border-top: 1px solid var(--accentAlt1Color);
border-bottom: 1px solid transparent;
}
.logo {
display: inline-flex;
vertical-align: top;
align-items: center;
justify-content: center;
gap: 5px;
text-decoration: none;
border-radius: var(--borderRadius);
img {
vertical-align: top;
max-height: 26px;
}
}
@media (max-width: 400px) {
gap: 7px;
padding-left: 5px;
padding-right: 5px;
}
}
.app-main-nav {
position: relative;
display: inline-flex;
align-items: center;
gap: max(var(--headerItemsGap), 5px);
/* responsive */
scrollbar-width: thin;
overflow: auto;
overflow: overlay;
/* overflow clipping workaround */
padding: 3px;
margin: 0 -3px;
/* scroll shadows */
container-type: scroll-state;
&::before,
&::after {
content: "";
position: sticky;
display: block;
align-self: stretch;
z-index: 9;
width: 1px;
height: auto;
margin: 0;
flex-shrink: 0;
opacity: 0;
pointer-events: none;
}
&::before {
left: -5px;
margin-right: calc(-1 * (var(--headerItemsGap) + 1px));
box-shadow: 2px 0px 4px 1px rgba(0, 0, 0, 0.4);
@container scroll-state(scrollable: left) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
&::after {
right: -5px;
margin-left: calc(-1 * (var(--headerItemsGap) + 1px));
box-shadow: -2px 0px 4px 1px rgba(0, 0, 0, 0.4);
@container scroll-state(scrollable: right) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
@media (max-width: 500px) {
--headerItemsGap: 5px;
}
}
.app-header .header-link {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 4px 5px;
font-weight: bold;
user-select: none;
cursor: pointer;
text-decoration: none;
color: var(--accentTxtHintColor);
border-radius: var(--borderRadius);
transition:
color var(--animationSpeed),
background var(--animationSpeed);
&[data-popover-state="true"],
&.active,
&:hover,
&:focus-visible {
color: var(--accentTxtColor);
background: var(--surfaceAlt2Color);
}
&:active {
background: var(--surfaceAlt3Color);
transition-duration: var(--activeAnimationSpeed);
}
}
.app-header .logged-user {
max-width: 300px;
@media (max-width: 600px) {
.superuser-name {
display: none;
}
}
}
/* --------------------------------------------------------------- */
.page {
position: relative;
overflow: auto;
display: flex;
height: 100%;
color: var(--surfaceTxtColor);
background: var(--surfaceColor);
border-radius: var(--lgBorderRadius);
&:first-child {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
&:last-child {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
}
.page-content {
z-index: 0;
width: 100%;
min-width: 0;
flex-grow: 1;
overflow: auto;
padding: var(--spacing);
}
.page-header {
display: flex;
flex-wrap: wrap;
column-gap: var(--smSpacing);
row-gap: calc(var(--smSpacing) - 5px);
width: 100%;
align-items: center;
margin: -5px 0 calc(var(--spacing) - 5px);
.searchbar {
width: auto;
flex-grow: 1;
}
&.compact {
margin-top: -10px;
margin-bottom: calc(var(--spacing) - 10px);
}
.page-header-secondary-btns,
.page-header-primary-btns {
display: inline-flex;
flex-shrink: 0;
justify-content: flex-end;
}
}
.page-header-secondary-btns {
gap: 10px;
@media (max-width: 550px) {
gap: 5px;
}
}
.page-header-primary-btns {
gap: var(--smSpacing);
margin-left: auto;
.btn {
flex-wrap: nowrap;
white-space: nowrap;
}
@media (max-width: 950px) {
gap: 5px;
flex-grow: 1;
.flex-nowrap & {
flex-grow: 0;
}
.btn {
flex-grow: 1;
flex-basis: 0;
padding-left: 10px;
padding-right: 10px;
}
}
@media (max-width: 550px) {
gap: 5px;
flex-grow: 0;
.api-preview-btn {
display: none;
}
.btn:not(.circle) {
padding: 0;
width: auto;
aspect-ratio: 1 / 1;
border-radius: 50%;
i + .txt {
display: none;
}
}
}
}
.page-footer {
display: flex;
flex-wrap: wrap;
align-items: center;
width: auto;
z-index: 10;
color: var(--surfaceTxtHintColor);
font-size: var(--smFontSize);
line-height: var(--smLineHeight);
box-shadow: 0px -1px 0px 0px var(--surfaceAlt2Color); /* not border so that it can overlap */
padding: 10px var(--spacing);
margin: auto calc(-1 * var(--spacing)) calc(-1 * var(--spacing));
a {
text-decoration: none;
transition: color var(--animationSpeed);
border-radius: var(--borderRadius);
&:hover,
&:focus-visible {
color: var(--surfaceTxtColor);
}
}
.credits {
--creditsGap: 20px;
display: inline-flex;
align-items: center;
gap: var(--creditsGap);
margin: 0 0 0 auto;
.credit-item {
position: relative;
display: inline-flex;
align-items: center;
gap: 5px;
color: var(--surfaceTxtDisabledColor);
&::before {
content: "";
position: absolute;
pointer-events: none;
user-select: none;
top: 50%;
left: calc(var(--creditsGap) / -2);
width: 1px;
height: 10px;
margin-top: -5px;
opacity: 0.5;
background: var(--surfaceTxtDisabledColor);
}
&:first-child::before {
content: none;
display: none;
}
&:hover,
&:active,
&:focus-within {
color: var(--surfaceTxtColor);
}
}
}
}
.page-sidebar {
--sidebarSpacing: calc(var(--spacing) / 2);
position: relative;
display: flex;
flex-direction: column;
width: var(--pageSidebarWidth);
min-width: var(--pageSidebarWidth);
max-width: min(400px, 80%);
flex-shrink: 0;
overflow: auto;
background: var(--surfaceAlt1Color);
border-right: 1px solid var(--surfaceAlt2Color);
backface-visibility: hidden; /* helps "smoothing" the clipped edge */
.sidebar-content {
position: relative;
padding: var(--sidebarSpacing);
&.scrollable {
scrollbar-width: thin;
overflow: auto;
/* scroll shadows */
--topShadowOffset: calc(var(--sidebarSpacing) + 1px);
--bottomShadowOffset: calc(var(--sidebarSpacing) + 1px);
container-type: scroll-state;
&::before,
&::after {
content: "";
position: sticky;
display: block;
left: 0;
z-index: 9;
width: auto;
height: 1px;
margin-left: calc(-1 * var(--sidebarSpacing));
margin-right: calc(-1 * var(--sidebarSpacing));
pointer-events: none;
opacity: 0;
}
&::before {
top: calc(100% + var(--bottomShadowOffset));
margin-bottom: calc(-1 * var(--bottomShadowOffset));
margin-top: var(--bottomShadowOffset);
box-shadow: var(--bottomScrollShadow);
@container scroll-state(scrollable: bottom) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
&::after {
top: auto;
bottom: calc(100% + var(--topShadowOffset));
margin-top: calc(-1 * var(--topShadowOffset));
margin-bottom: var(--topShadowOffset);
box-shadow: var(--topScrollShadow);
@container scroll-state(scrollable: top) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
}
}
.sidebar-content:has(+ .sidebar-content) {
padding-bottom: 0;
--bottomShadowOffset: 1px;
}
.sidebar-search {
--inputPadding: var(--sidebarSpacing);
display: flex;
gap: 5px;
align-items: center;
border-bottom: 1px solid var(--surfaceAlt2Color);
min-height: 50px;
--inputColor: var(--surfaceAlt1Color);
--inputFocusColor: var(--surfaceAlt2Color);
--inputBorderColor: var(--surfaceAlt3Color);
.fields {
height: 100%;
}
.field {
border-radius: 0;
height: 100%;
input {
height: 100%;
}
}
}
hr {
margin: var(--sidebarSpacing) 0;
}
.nav-group {
border: 0;
background: none;
box-shadow: none;
border-radius: 0;
padding: 0;
margin: 0 0 var(--sidebarSpacing);
transition: none;
&:last-child {
margin: 0;
}
summary {
display: flex;
align-items: center;
gap: 5px;
border: 0;
margin: 0;
padding: 0;
min-height: 30px;
font-weight: bold;
border-radius: 0;
background: none;
user-select: none;
font-size: var(--smFontSize);
color: var(--surfaceTxtHintColor);
transition: color var(--animationSpeed);
&::marker {
content: "";
display: none;
}
&::before {
content: "\EA4E";
display: block;
width: 20px;
height: 20px;
line-height: 20px;
align-content: center;
flex-shrink: 0;
position: relative;
top: auto;
bottom: auto;
left: auto;
right: auto;
order: 1;
padding: 0;
margin: 0;
font-size: 1em;
font-weight: normal;
font-family: var(--iconFontFamily);
}
.actions {
display: inline-flex;
align-items: center;
order: 100;
gap: 5px;
opacity: 0;
margin: 0 0 0 auto;
transform: translateX(3px);
transition:
transform var(--animationSpeed),
opacity var(--animationSpeed);
&:focus-within {
opacity: 1;
transform: translateX(0);
}
}
&:hover,
&:active,
&:focus-visible {
cursor: pointer;
color: var(--surfaceTxtColor);
.actions {
opacity: 1;
transform: translateX(0);
}
}
&[tabindex="-1"] {
cursor: default;
color: var(--surfaceTxtHintColor);
&::before {
content: none;
display: none;
}
}
&:empty {
display: none;
}
}
&::details-content {
display: flex;
flex-direction: column;
padding: 0;
border: 0;
margin: 0;
gap: 5px;
background: none;
}
&[open] {
summary {
&::before {
content: "\EA78";
}
}
}
.compact &::details-content,
&.compact::details-content {
gap: 2px;
}
.nav-item {
display: flex;
gap: 10px;
outline: 0;
width: 100%;
align-items: center;
padding: 5px 10px;
cursor: pointer;
text-decoration: none;
font-size: var(--lgFontSize);
color: var(--surfaceTxtHintColor);
min-height: var(--btnHeight);
border-radius: var(--borderRadius);
transition:
color var(--animationSpeed),
background var(--animationSpeed);
.txt {
text-overflow: ellipsis;
overflow: hidden;
}
.pin {
font-size: 0.8em;
margin-left: auto;
margin-right: -5px;
padding: 2px;
color: var(--surfaceTxtDisabledColor);
border-radius: var(--borderRadius);
opacity: 0;
transform: translateX(3px);
transition: color var(--animationSpeed),
opacity var(--animationSpeed),
transform var(--animationSpeed);
&:hover,
&:focus-visible {
color: var(--surfaceTxtColor);
}
}
&:hover .pin,
&:focus-visible .pin,
&:active .pin,
.pin:hover,
.pin:focus-visible,
.pin:active,
.pin.active {
opacity: 1;
transform: translateX(0);
}
&:hover,
&:focus-visible,
&:active,
&.active {
background: var(--surfaceAlt2Color);
}
&.active {
color: var(--surfaceTxtColor);
}
&:active {
background: var(--surfaceAlt3Color);
transition-duration: var(--activeAnimationSpeed);
}
}
}
.dragline {
position: absolute;
right: 0;
top: 0;
}
&[data-responsive="true"] {
position: absolute;
z-index: 9;
left: 0;
top: 0;
height: 100%;
opacity: 0;
visibility: hidden;
transform: translateX(-30px);
transition: opacity var(--animationSpeed),
visibility var(--animationSpeed),
transform var(--animationSpeed);
.dragline {
display: none;
}
&.active {
opacity: 1;
visibility: visible;
transform: translateX(0);
box-shadow: 100px 0px 0px 1000px var(--modalOverlayColor);
}
}
}
.btn.responsive-sidebar-btn {
padding: 0 10px;
margin: 0 -5px;
min-height: var(--smBtnHeight);
height: auto;
align-self: stretch;
i {
margin-top: 2px; /* visual alignment */
}
}
.collections-sidebar {
.sidebar-content.collections-list {
--topShadowOffset: 6px;
--bottomShadowOffset: 6px;
padding-top: 5px;
padding-bottom: 5px;
}
}
.page-content.full-height {
display: flex;
flex-direction: column;
align-items: normal;
gap: 0;
}

136
ui/src/css/list.css Normal file
View File

@@ -0,0 +1,136 @@
.list {
--borderColor: var(--surfaceAlt3Color);
position: relative;
display: block;
width: 100%;
overflow: auto;
color: var(--surfaceTxtColor);
background: var(--surfaceColor);
border: 1px solid var(--borderColor);
border-radius: var(--borderRadius);
scrollbar-width: thin;
&:empty {
display: none;
}
.list-item {
word-break: break-word;
position: relative;
display: flex;
align-items: center;
width: 100%;
gap: 10px;
outline: 0;
padding: 10px var(--inputPadding);
min-height: 54px;
box-shadow: 0px -1px 0 0 var(--borderColor);
transition: background var(--animationSpeed);
.content {
display: flex;
width: 100%;
align-items: center;
gap: 5px;
min-width: 0;
max-width: 100%;
user-select: text;
line-height: 1.5;
}
.actions {
gap: 10px;
flex-shrink: 0;
display: inline-flex;
align-items: center;
margin: -1px -5px -1px 0;
&.autohide {
opacity: 0;
transform: translateX(5px);
transition:
transform var(--animationSpeed),
opacity var(--animationSpeed),
visibility var(--animationSpeed);
/* not mouse-pointer interfaces */
@media only screen and (hover: none) {
opacity: 1;
transform: translateX(0);
}
}
}
> .btn.block {
width: 100%;
border-radius: 0;
&.sm {
border-radius: var(--borderRadius);
}
}
&:has(> .btn.block) {
padding: 0;
min-height: 0;
}
&:has(> .btn.sm.block) {
padding: 5px;
}
&:hover,
&:focus-visible,
&:focus-within,
&:active {
.actions.autohide {
opacity: 1;
transform: translateX(0);
}
}
&[data-dragstart="true"],
&.active {
background: var(--surfaceAlt1Color);
}
&[data-dragstart="true"] {
.actions.autohide {
opacity: 0;
}
}
&:not(.disabled).highlight,
&:not(.disabled).handle {
&:hover,
&:focus-visible {
background: var(--surfaceAlt1Color);
}
&:active {
background: var(--surfaceAlt2Color);
transition-duration: var(--activeAnimationSpeed);
}
}
&.handle {
cursor: pointer;
user-select: none;
}
&.deleted {
cursor: default;
.content {
opacity: 0.6;
.txt {
text-decoration: line-through;
}
}
}
&.disabled:not(.active) {
cursor: default;
opacity: 0.6;
}
}
&.sm {
.list-item {
min-height: var(--btnHeight);
padding: 5px 10px;
}
}
}

248
ui/src/css/logs.css Normal file
View File

@@ -0,0 +1,248 @@
.logs-chart {
position: relative;
display: block;
width: 100%;
height: 0;
max-height: 0; /* fallback for interpolate-size */
margin: 0;
flex-shrink: 0;
text-align: center;
align-content: center;
overflow: hidden;
touch-action: none;
transition:
opacity var(--animationSpeed),
max-height var(--slideAnimationSpeed),
height var(--slideAnimationSpeed);
.chart-tooltip {
width:;
position: absolute;
z-index: 3;
padding: 5px;
white-space: nowrap;
text-align: center;
font-size: var(--smFontSize);
line-height: 1;
border-radius: var(--borderRadius);
color: var(--tooltipTxtColor);
background: var(--tooltipSurfaceColor);
pointer-events: none;
box-shadow: var(--boxShadow);
.content-primary {
font-weight: bold;
}
.content-secondary {
opacity: 0.6;
font-size: 0.85em;
margin: 3px 0 1px;
}
}
/* chart inited */
&:has(.uplot) {
height: auto;
max-height: 200px; /* fallback for interpolate-size */
}
.uplot {
padding-bottom: var(--smSpacing);
}
/* states */
&.loading {
opacity: 0.7;
}
&.nodata {
height: 0;
max-height: 0;
}
&.zoomed {
/* x axis pan handle */
.u-over + .u-axis {
cursor: ew-resize;
}
}
}
.logs-reset-zoom-ctrl {
position: absolute;
z-index: 2;
left: 50%;
top: 0px;
transform: translateX(-50%);
display: inline-block;
vertical-align: top;
text-align: center;
gap: 5px;
outline: 0;
cursor: pointer;
opacity: 0.7;
font-weight: bold;
font-size: var(--smFontSize);
line-height: 1;
padding: 5px 8px;
border-radius: var(--borderRadius);
color: var(--surfaceTxtColor);
background: var(--surfaceAlt3Color);
transition: opacity var(--animationSpeed);
.content-secondary {
font-weight: normal;
font-size: 0.85em;
margin-top: 5px;
}
&:hover,
&:active,
&:focus-visible {
opacity: 1;
}
}
.logs-chart-loader {
position: absolute;
z-index: 1;
left: 50%;
top: 50%;
transform: translate(-50%, -80%);
}
.logs-chart-container {
display: block;
width: 100%;
}
.logs-table {
.col-field-name-level {
width: 1px;
white-space: nowrap;
}
.col-field-name-message {
word-break: break-word;
.content-primary {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
overflow: hidden;
}
.content-secondary {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 7px;
}
}
.log-request {
/* requests use the url as message */
.col-field-name-message .content-primary {
word-break: break-all;
}
}
}
.logs-include-superuser-requests {
width: 150px;
.txt {
line-height: 1;
margin-top: -3px;
}
}
.log-level-label {
min-width: 80px;
font-size: 0.8em;
font-weight: bold;
justify-content: center;
&::before {
content: "";
width: 6px;
height: 6px;
border-radius: 6px;
background: var(--surfaceAlt4Color);
}
/* levels */
&.level-0::before {
background: var(--successColor);
}
&.level-4::before {
background: var(--warningColor);
}
&.level-8::before {
background: var(--dangerColor);
}
}
.page-logs {
.page-content {
padding-top: 0;
}
.page-header {
margin: 10px 0;
}
}
@media (max-width: 750px) {
.page-header .logs-searchbar {
order: 99;
width: 100%;
}
}
@media (max-width: 600px) {
.page-table-wrapper .logs-table {
width: 100%;
min-width: 0;
table-layout: fixed;
thead {
display: none;
}
tbody {
tr {
width: 100%;
display: flex;
flex-wrap: wrap;
padding: 10px 0;
border-top: 1px solid var(--surfaceAlt2Color);
}
td {
display: block;
height: auto;
padding: 5px var(--spacing);
border: 0;
width: 100%;
min-height: 0;
white-space: normal;
background: none !important;
&.col-bulk-select {
width: auto;
padding: 0 0 0 var(--spacing);
align-content: center;
}
&.col-field-name-level {
width: auto;
flex-grow: 1;
padding-left: 0;
}
}
}
.log-level-label {
width: 100%;
}
.col-field-name-message .content-secondary {
gap: 5px;
.label {
word-break: break-word;
}
}
.col-meta {
display: none;
}
~ .bulkbar {
position: sticky;
left: 0;
transform: none !important;
margin-left: auto;
margin-right: auto;
}
}
}

41
ui/src/css/map.css Normal file
View File

@@ -0,0 +1,41 @@
.map-container {
position: relative;
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
min-height: 200px;
}
.map-box {
z-index: 1;
height: 100%;
width: 100%;
min-height: 0;
flex-grow: 1;
}
.map-search {
--searchWidth: 400px;
position: absolute;
z-index: 2;
top: 10px;
left: calc((100% - var(--searchWidth)) / 2);
height: auto;
width: var(--searchWidth);
max-width: 90%;
opacity: 0.8;
transition: opacity var(--animationSpeed);
input {
background: inherit;
}
.field {
background: var(--surfaceColor) !important;
box-shadow: var(--boxShadow);
}
.dropdown {
border: 0;
max-height: 180px;
}
&:focus-within {
opacity: 1;
}
}

302
ui/src/css/modal.css Normal file
View File

@@ -0,0 +1,302 @@
.modal {
position: fixed;
z-index: 1000;
display: none;
flex-direction: column;
width: 620px;
max-width: 100%;
height: 100%;
border: 0;
outline: 0;
margin: 0;
top: 0;
right: 0;
opacity: 0;
word-break: break-word;
color: var(--surfaceTxtColor);
background: var(--surfaceColor);
transform: translateX(30px);
backface-visibility: hidden;
transition-property: opacity, transform, width, display;
transition-duration: var(--modalAnimationSpeed);
transition-behavior: allow-discrete;
box-shadow: var(--leftBoxShadow);
overscroll-behavior: none;
&[data-modal-state="open"] {
display: flex;
opacity: 1;
transform: translateX(0);
@starting-style {
opacity: 0;
transform: translateX(30px);
}
}
/* overlays */
&::before {
content: "";
display: block;
position: fixed;
z-index: -2;
left: -100vw;
top: -100vh;
width: 200vw;
height: 200vh;
background: var(--modalOverlayColor);
}
&::after {
content: "";
display: block;
position: absolute;
z-index: -1;
left: 0;
top: 0;
width: 100%;
height: 100%;
border-radius: inherit;
background: inherit;
}
.modal-header,
.modal-content,
.modal-footer {
outline: 0;
padding: var(--spacing);
}
.modal-header,
.modal-footer {
display: flex;
align-items: center;
width: 100%;
gap: var(--smSpacing);
padding-top: calc(var(--spacing) - 10px);
padding-bottom: calc(var(--spacing) - 10px);
}
.modal-footer {
margin-top: auto;
border-top: 1px solid var(--surfaceAlt2Color);
}
.modal-content {
position: relative;
flex-grow: 1;
overflow: auto;
scrollbar-width: thin;
> :first-child {
margin-top: 0;
}
> :last-child {
margin-bottom: 0;
}
}
.modal-header .modal-close-btn.transparent {
margin-right: -10px; /* visually align */
}
.modal-header:not(.isolated) ~ .modal-content {
padding-top: 5px;
}
.modal-header.isolated {
background: var(--surfaceAlt1Color);
border-bottom: 1px solid var(--surfaceAlt2Color);
border-top-left-radius: inherit;
border-top-right-radius: inherit;
}
.modal-title {
align-content: center;
}
/* sizes */
&.sm {
width: 480px;
}
&.lg {
width: 880px;
}
&.full {
width: 100%;
}
&.preview,
&.popup {
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
height: min-content;
max-width: 95%;
max-height: 95%;
box-shadow: var(--boxShadow);
border-radius: var(--lgBorderRadius);
transform: scale(0.98);
&.full {
width: 95%;
}
.modal-header,
.modal-content,
.modal-footer {
border-radius: inherit;
}
.modal-header,
.modal-footer {
padding-top: calc(var(--spacing) - 5px);
padding-bottom: calc(var(--spacing) - 5px);
}
.modal-header:has(~ .modal-content),
.modal-header:has(~ .modal-footer),
.modal-content:has(~ .modal-footer) {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.modal-header ~ .modal-content,
.modal-content ~ .modal-footer,
.modal-header ~ .modal-footer {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.modal-footer {
background: var(--surfaceAlt1Color);
}
&[data-modal-state="open"] {
transform: scale(1);
@starting-style {
transform: scale(0.98);
}
}
}
&.preview {
width: min-content;
min-width: 400px;
min-height: 300px;
.modal-footer {
padding: var(--smSpacing);
}
.modal-content {
display: flex;
text-align: center;
align-items: flex-start;
justify-content: center;
padding: 0;
margin: auto;
width: 100%;
max-width: 100%;
&:has(img) {
width: max-content;
}
&::before,
&::after {
content: none;
}
img {
width: 100%;
margin: auto;
}
object {
width: 100%;
height: 100%;
margin: auto;
}
}
/* non-image preview */
&:has(object) {
width: 75%;
height: 85%;
@media (max-width: 900px) {
width: 90%;
height: 90%;
}
}
&.preview-audio {
width: 500px;
height: 400px;
}
}
}
/* content scroll shadows */
.modal-content {
--topShadowOffset: calc(var(--spacing) + 1px);
--bottomShadowOffset: calc(var(--spacing) + 1px);
min-height: 92px; /* ensure that the content is large enough for the negative shadow margins */
container-type: scroll-state;
&::before,
&::after {
content: "";
position: sticky;
display: block;
left: 0;
z-index: 9;
width: auto;
height: 1px;
margin-left: calc(-1 * var(--spacing));
margin-right: calc(-1 * var(--spacing));
pointer-events: none;
opacity: 0;
}
&::before {
top: calc(100% + var(--bottomShadowOffset));
margin-bottom: calc(-1 * var(--bottomShadowOffset));
margin-top: var(--bottomShadowOffset);
box-shadow: var(--bottomScrollShadow);
@container scroll-state(scrollable: bottom) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
&::after {
top: auto;
bottom: calc(100% + var(--topShadowOffset));
margin-top: calc(-1 * var(--topShadowOffset));
margin-bottom: var(--topShadowOffset);
box-shadow: var(--topScrollShadow);
@container scroll-state(scrollable: top) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
.modal-header:not(.isolated) ~ &::after {
--topShadowOffset: 6px;
}
}
.modal-header .tabs-header {
width: auto;
flex-grow: 1;
.tab-item {
font-size: var(--lgFontSize);
}
/* "merge" with the header bottom */
.modal-header.isolated &:last-child {
padding: 0 var(--spacing);
border-bottom: 0;
margin-left: calc(-1 * var(--spacing));
margin-right: calc(-1 * var(--spacing));
margin-bottom: calc(-1 * var(--spacing) + 9px);
.tab-item {
border: 1px solid transparent;
border-bottom: 0;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
&:hover,
&:focus-visible {
background: var(--surfaceAlt2Color);
}
&:active {
background: var(--surfaceAlt3Color);
}
&.active {
background: var(--surfaceColor);
border-color: var(--surfaceAlt2Color);
}
}
}
.popup .modal-header.isolated &:last-child {
margin-bottom: calc(-1 * var(--spacing) + 4px);
}
}

74
ui/src/css/prism.css Normal file
View File

@@ -0,0 +1,74 @@
/* PrismJS 1.30.0 theme based on prism-solarized-light */
code[class*="language-"],
pre[class*="language-"] {
color: var(--surfaceTxtHintColor);
font-family: var(--monospaceFontFamily);
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
tab-size: 4;
hyphens: none;
}
pre[class*="language-"] {
padding: 1em;
margin: 0.5em 0;
overflow: auto;
}
.token.cdata,
.token.comment,
.token.doctype,
.token.prolog {
color: var(--prismCommentColor);
}
.token.punctuation {
color: var(--prismPunctuationColor);
}
.token.namespace {
opacity: 0.7;
}
.token.constant,
.token.boolean,
.token.number {
color: var(--prismNumberColor);
}
.token.deleted,
.token.property,
.token.symbol,
.token.tag,
.token.tag .token.punctuation {
color: var(--prismPropertyColor);
}
.token.attr-name,
.token.builtin,
.token.char,
.token.inserted,
.token.selector,
.token.string,
.token.url {
color: var(--prismStringColor);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: var(--prismKeywordColor);
}
.token.class-name,
.token.function,
.token.important,
.token.regex,
.token.variable {
color: var(--prismFunctionColor);
}
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

98
ui/src/css/providers.css Normal file
View File

@@ -0,0 +1,98 @@
.provider-logo {
--size: 40px;
display: flex;
flex-shrink: 0;
align-items: center;
text-align: center;
justify-content: center;
width: var(--size);
height: var(--size);
padding: 8px;
line-height: 1;
font-size: var(--fontSize);
color: var(--surfaceTxtDisabledColor);
background: var(--surfaceAlt1Color);
border-radius: var(--borderRadius);
&:empty {
&::before {
content: "\f452";
font-family: var(--iconFontFamily);
}
}
img {
width: 100%;
height: auto;
}
}
.provider-card {
display: flex;
width: 100%;
gap: 10px;
align-items: center;
padding: 5px;
min-height: var(--lgBtnHeight);
border-radius: var(--borderRadius);
border: 1px solid var(--surfaceAlt2Color);
.content {
flex-grow: 1;
word-break: break-word;
font-size: var(--fontSize);
line-height: 1.1;
p {
margin: 5px 0;
&:first-child {
margin-top: 0;
}
&:last-child {
margin-bottom: 0;
}
}
.primary-txt,
.secondary-txt {
display: block;
}
.secondary-txt {
color: var(--surfaceTxtHintColor);
font-size: var(--smFontSize);
margin: 2px 0;
}
}
&.handle {
outline: 0;
cursor: pointer;
user-select: none;
text-decoration: none;
transition: background var(--animationSpeed);
.provider-logo {
transition: background var(--animationSpeed);
}
&:hover,
&:focus-visible {
background: var(--surfaceAlt1Color);
.provider-logo {
background: var(--surfaceAlt2Color);
}
}
&.active,
&:active {
.provider-logo {
transition-duration: var(--activeAnimationSpeed);
background: var(--surfaceAlt3Color);
}
}
}
&.error {
border-color: var(--dangerColor);
background: var(--surfaceDangerColor);
}
}
.btn.add-provider-btn {
font-size: var(--fontSize);
line-height: var(--lineHeight);
height: 100%;
}

91
ui/src/css/ratelimit.css Normal file
View File

@@ -0,0 +1,91 @@
.rate-limit-table {
background: none;
tr,
td,
th {
background: none;
padding: 0;
border: 0;
min-height: 0;
height: auto;
}
th {
padding: 0 0 10px;
font-size: var(--smFontSize);
line-height: var(--smLineHeight);
}
.rate-limit-row {
.fields,
.field,
input,
select,
.input,
.select {
background: none;
height: 100%;
border-radius: 0;
}
td {
background: var(--surfaceAlt2Color);
border-left: 1px solid var(--surfaceAlt3Color);
border-top: 1px solid var(--surfaceAlt3Color);
transition: background var(--animationSpeed);
&:first-child {
border-left: 0px;
}
&:focus-within {
background: var(--surfaceAlt3Color);
}
&:has(.error:not(.hidden)) {
background: var(--surfaceDangerColor);
}
}
&:first-child {
td {
border-top: 0px;
}
td:first-child {
border-top-left-radius: var(--borderRadius);
}
td:last-child {
border-top-right-radius: var(--borderRadius);
}
}
&:last-child {
td:first-child {
border-bottom-left-radius: var(--borderRadius);
}
td:last-child {
border-bottom-right-radius: var(--borderRadius);
}
}
}
.col-label {
width: 60%;
}
.col-requests,
.col-duration {
width: 15%;
}
.col-audience {
width: 1px;
min-width: 130px;
white-space: nowrap;
.selected-container {
flex-wrap: nowrap;
}
}
.col-action {
width: 1px;
min-width: 0;
padding: 0 3px;
}
}
.rate-limit-table-wrapper {
overflow: auto;
.rate-limit-table {
min-width: 550px;
}
}

325
ui/src/css/recordFields.css Normal file
View File

@@ -0,0 +1,325 @@
.accordion.record-field-settings {
--fieldsGap: 10px;
border-color: var(--surfaceAlt4Color);
summary {
display: flex;
align-items: center;
gap: var(--fieldsGap);
padding: 4px;
min-height: 0;
background: var(--inputColor);
container-type: inline-size;
.header-fields {
display: flex;
gap: var(--fieldsGap);
width: 100%;
align-content: center;
align-items: stretch;
.header-select {
max-width: 150px;
}
/* auto delimiter */
> * {
position: relative;
&::before {
content: "";
position: absolute;
top: -4px;
bottom: -4px;
right: -5px;
width: 1px;
height: auto;
min-height: 0;
flex-shrink: 0;
background: var(--surfaceAlt4Color);
}
}
}
.btn {
i.ri-settings-3-line {
transition:
color var(--animationSpeed),
transform var(--animationSpeed);
}
}
.sort-handle {
position: absolute;
z-index: 2;
top: 0;
left: -30px;
width: 30px;
height: 100%;
padding-left: 7px;
align-content: center;
flex-shrink: 0;
text-align: left;
cursor: pointer;
color: var(--surfaceTxtHintColor);
opacity: 0;
transform: translateX(3px);
transition:
color var(--animationSpeed),
opacity var(--animationSpeed),
transform var(--animationSpeed);
&:hover,
&:active {
opacity: 1;
transform: translateX(0);
color: var(--surfaceTxtColor);
}
}
@container (width <= 480px) {
.header-fields {
flex-direction: column;
gap: 5px;
padding: 5px;
border-radius: var(--borderRadius);
background: var(--surfaceColor);
> * {
flex-grow: 1;
max-width: none !important;
&::before {
content: none;
display: none;
}
}
}
}
}
&:hover {
summary .sort-handle {
opacity: 1;
transform: translateX(0);
}
}
.record-field-settings-footer {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--smSpacing);
margin-top: var(--smSpacing);
> .field,
> .fields {
width: auto;
}
}
summary + .record-field-settings-footer {
margin-top: 0;
}
.field-labels {
position: absolute;
z-index: 2;
align-items: center;
display: flex;
top: 2px;
right: 2px;
gap: 2px;
pointer-events: none;
user-select: none;
.label {
min-height: 0;
line-height: 1.2;
font-size: 0.7em;
padding: 2px 3px;
}
}
&[open] {
box-shadow: 0px 0px 0px 1px var(--surfaceAlt3Color);
summary {
outline: 0;
.btn i.ri-settings-3-line {
color: var(--surfaceTxtColor);
transform: rotate(-30deg);
}
}
}
&.deleted {
summary {
background: var(--surfaceAlt1Color);
.field,
.fields {
background: none !important;
}
}
.header-fields {
opacity: 0.7;
> *::after {
background: var(--surfaceAlt2Color);
}
}
}
}
.header-select.field-select-choices-input,
.header-select.collections-select {
min-width: 200px;
}
.record-field-view {
display: block;
vertical-align: top;
align-content: center;
text-align: left;
max-width: 100%;
min-width: 0; /* flex summary ellipsis fix */
&:empty {
display: none !important;
}
.missing-value {
display: inline-block;
vertical-align: top;
color: var(--surfaceTxtDisabledColor);
font-size: var(--smFontSize);
align-content: center;
&::before {
content: "N/A";
}
}
.delimiter {
line-height: 1;
font-size: var(--smFontSize);
color: var(--surfaceTxtDisabledColor);
}
.marker {
line-height: 1;
padding-right: 5px;
align-content: center;
font-size: var(--smFontSize);
color: var(--surfaceTxtHintColor);
}
}
.record-field-input {
.record-summary {
animation: fadeIn var(--animationSpeed);
}
}
.field-type-bool {
&.record-field-view .label {
min-width: 48px;
}
}
.field-type-json {
&.record-field-view {
overflow: auto;
max-height: 400px;
white-space: pre-wrap;
scrollbar-width: thin;
}
.input.code-editor {
min-height: 38px;
}
.json-state {
position: absolute;
top: 10px;
right: 10px;
}
}
.field-type-geoPoint {
&.record-field-view {
white-space: nowrap;
}
}
.field-type-select {
.field-select-choices-input {
> input {
font-size: var(--smFontSize);
}
}
.field-select-choices-dropdown {
max-height: 400px;
textarea {
font-size: var(--smFontSize);
max-height: 300px;
}
}
}
.more-marker {
align-self: flex-end;
color: var(--surfaceTxtHintColor);
}
.field-type-file {
&.record-field-view {
display: inline-flex;
align-items: center;
flex-wrap: wrap;
gap: 5px;
}
}
.field-type-editor {
&.record-field-view {
width: 100%;
}
&.record-field-input {
/* fixed size to minimize flickering */
.field {
min-height: 296px;
}
.loading-textarea {
resize: none
}
.pb-tinymce {
animation: fadeIn var(--animationSpeed);
}
}
}
.field-type-relation {
&.record-field-view {
display: inline-flex;
align-items: stretch;
flex-wrap: wrap;
gap: 10px;
.record-summary & {
gap: 5px;
}
}
}
.hidden-field-blur {
filter: blur(2.5px);
transition: filter var(--animationSpeed);
&:hover,
&:active,
&:focus-within {
filter: none;
transition-delay: 0s;
}
}
/* --------------------------------------------------------------- */
.records-list-columns-dropdown {
max-height: 230px;
}
.record-upsert-modal {
width: 720px;
.modal-title {
min-height: var(--smBtnHeight); /* minimize flickering */
align-content: center;
}
.modal-content {
scrollbar-gutter: stable;
}
}
.record-upsert-modal,
.record-preview-modal {
&:has(.large-modal) {
width: 832px;
}
}

View File

@@ -0,0 +1,56 @@
.record-file-picker-collection-select-btn {
padding-left: var(--smSpacing);
padding-right: calc(var(--smSpacing) - 5px);
width: 27%;
white-space: nowrap;
.collection-name {
max-width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.record-file-picker-thumb-select {
min-width: 170px;
}
.record-file-picker-list {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
grid-gap: var(--smSpacing);
.list-item {
--thumbSize: 100%;
border-width: 2px;
}
@media only screen and (max-width: 700px) {
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
}
@media only screen and (max-width: 450px) {
grid-template-columns: 1fr 1fr 1fr;
}
}
.record-file-picker-modal {
width: var(--wrapperWidth);
@media only screen and (max-width: 550px) {
.modal-header {
flex-wrap: wrap;
}
.record-file-picker-collection-select-btn {
flex-grow: 1;
}
.records-searchbar-wrapper {
flex-grow: 1;
order: 99;
}
.record-file-picker-thumb-select {
min-width: 100px;
}
.modal-footer .btn.expanded,
.modal-footer .btn.expanded-sm,
.modal-footer .btn.expanded-lg {
min-width: 50px;
}
}
}

View File

@@ -0,0 +1,71 @@
.record-summary {
padding: 3px 5px;
flex-shrink: 1;
justify-content: flex-start;
.thumb {
--thumbSize: 28px;
border-width: 1px;
font-size: 75%;
}
i {
font-size: 1em;
}
.record-preview-icon {
padding: 0 5px;
margin: 0 -5px;
height: 100%;
align-content: center;
}
.record-summary {
.thumb {
--thumbSize: 24px;
}
.record-summary .thumb {
--thumbSize: 20px;
}
}
.field-content & {
border-width: 1px;
}
.record-field-view {
display: inline-block;
vertical-align: top;
}
}
/* reduce the max width of common large text fields inside table */
td .record-summary {
.field-type-text,
.field-type-editor,
.field-type-json {
max-width: 250px;
}
}
.record-summary-dropdown {
font-family: var(--monospaceFontFamily);
font-size: var(--smFontSize);
line-height: var(--smLineHeight);
width: 100%;
max-width: 350px;
max-height: 305px;
min-width: anchor-size(width);
user-select: text;
cursor: default;
&[popover] {
position-area: bottom span-right;
position-try-fallbacks: flip-block;
}
.record-header {
display: flex;
width: 100%;
gap: 10px;
padding: 5px;
align-items: center;
font-family: var(--baseFontFamily);
}
.record-json {
overflow: auto;
scrollbar-width: thin;
}
}

View File

@@ -0,0 +1,38 @@
.records-picker-list {
max-height: 400px;
}
.records-picker-selected-list {
display: flex;
max-width: 100%;
align-items: stretch;
flex-wrap: wrap;
gap: 10px;
}
.records-picker-modal {
.modal-header .collection-name {
max-width: 250px;
min-width: 0;
flex-shrink: 0;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
@media only screen and (max-width: 550px) {
.modal-header {
flex-wrap: wrap;
.collection-name {
flex-grow: 1;
flex-shrink: 1;
max-width: 80%;
margin-right: auto;
}
}
.searchbar {
flex-grow: 1;
order: 99;
}
}
}

9185
ui/src/css/remixicon.css Normal file

File diff suppressed because it is too large Load Diff

133
ui/src/css/ruleField.css Normal file
View File

@@ -0,0 +1,133 @@
.rule-field {
min-height: 67px;
.code-editor {
z-index: 0;
min-height: 41px;
.highlight-overlay {
color: var(--surfaceTxtColor);
}
.editor-content,
.highlight-overlay {
white-space: pre-line;
}
.editor-content:empty::before {
font-family: var(--baseFontFamily);
}
}
.superuser-toggle,
.superuser-toggle:last-child:not(.btn) {
border-radius: 0;
border-bottom-left-radius: var(--borderRadius);
border-top-right-radius: var(--borderRadius);
}
.superuser-toggle {
position: absolute;
z-index: 3;
right: 0;
top: 0;
display: inline-flex;
align-items: center;
gap: 5px;
outline: 0;
cursor: pointer;
user-select: none;
font-weight: bold;
line-height: 1;
font-size: var(--smFontSize);
padding: 8px 10px;
color: var(--surfaceTxtHintColor);
background: var(--surfaceAlt4Color);
box-shadow: inset 1px -1px 2px rgba(0,0,0,0.03);
transition:
color var(--animationSpeed),
background var(--animationSpeed);
&:hover,
&:active,
&:focus-visible {
color: var(--successColor);
background: var(--surfaceAlt5Color);
}
&[disabled] {
cursor: not-allowed;
color: var(--surfaceTxtDisabledColor);
background: var(--surfaceAlt4Color);
}
}
label {
position: relative;
z-index: 2;
.superusers-label {
opacity: 1;
visibility: visible;
transform: translateX(0);
transition:
opacity var(--animationSpeed),
visibility var(--animationSpeed),
transform var(--animationSpeed);
&.hidden,
&[hidden] {
display: inline !important;
opacity: 0;
visibility: hidden;
transform: translateX(3px);
}
}
}
.unlock-overlay {
position: absolute;
z-index: 1;
left: 0;
top: 0;
display: flex;
gap: 10px;
align-items: center;
justify-content: flex-end;
width: 100%;
height: 100%;
cursor: pointer;
user-select: none;
font-weight: bold;
font-size: var(--smFontSize);
color: var(--successColor);
padding: 5px var(--smSpacing);
border-radius: var(--borderRadius);
background: var(--surfaceAlt1Color);
border: 2px solid var(--surfaceAlt2Color);
transition: border-color var(--animationSpeed);
.txt {
opacity: 0;
transform: translateX(3px);
transition:
opacity var(--animationSpeed),
transform var(--animationSpeed);
}
i {
font-size: 1.4em;
}
&:hover,
&:active,
&:focus-visible {
border-color: var(--surfaceAlt4Color);
.txt {
opacity: 1;
transform: translateX(0);
}
}
&:active {
border-color: var(--surfaceAlt5Color);
transition-duration: var(--activeAnimationSpeed);
}
&[disabled] {
cursor: not-allowed;
.txt {
display: none;
}
}
}
&.locked {
label {
pointer-events: none;
}
}
}

505
ui/src/css/table.css Normal file
View File

@@ -0,0 +1,505 @@
table {
--tableSpacing: var(--inputPadding);
border-collapse: separate;
border-spacing: 0;
width: 100%;
td,
th {
padding: 10px max(var(--tableSpacing), 10px);
vertical-align: middle;
text-align: left;
height: var(--btnHeight);
background: var(--surfaceColor);
border: 1px solid var(--surfaceAlt2Color);
border-bottom-width: 0;
&:not(:first-child) {
border-left: 0;
}
&:not(:last-child) {
border-right: 0;
}
@media (max-width: 600px) {
padding: 5px;
}
}
> :first-child > tr:first-child {
> :first-child {
border-top-left-radius: var(--borderRadius);
}
> :last-child {
border-top-right-radius: var(--borderRadius);
}
}
> :last-child > tr:last-child {
> :first-child {
border-bottom-left-radius: var(--borderRadius);
}
> :last-child {
border-bottom-right-radius: var(--borderRadius);
}
> td,
> th {
border-width: 1px;
}
}
th {
font-weight: bold;
font-size: 0.98em;
line-height: 1.4;
color: var(--surfaceTxtHintColor);
}
/* special cols */
th.sort-handle {
position: relative;
padding-right: 40px;
outline: 0;
cursor: pointer;
user-select: none;
&.asc,
&.desc {
&::before {
content: "\EA4C";
display: block;
position: absolute;
right: var(--tableSpacing);
top: 50%;
transform: translateY(-50%);
font-weight: normal;
color: inherit;
opacity: 0.5;
font-family: var(--iconFontFamily);
transition: opacity var(--animationSpeed);
}
}
&.desc::before {
content: "\EA76";
}
&:hover,
&:focus-visible {
background: var(--surfaceAlt1Color);
&::before {
opacity: 1;
}
}
&:active {
background: var(--surfaceAlt2Color);
}
}
td,
th {
&.min-width {
width: 1% !important;
min-width: 0 !important;
white-space: nowrap;
}
&.col-bulk-select,
&.col-meta {
position: sticky;
z-index: 2;
word-break: normal;
white-space: nowrap;
}
&.col-bulk-select {
min-width: 62px;
width: 1%;
left: 0;
padding-right: 5px;
.field {
width: auto;
}
.loader {
position: absolute;
top: 10px;
margin-left: -2px;
}
&::after {
content: "";
display: block;
position: absolute;
top: 0;
right: 0;
width: 1px;
height: 100%;
opacity: 0;
pointer-events: none;
box-shadow: var(--leftScrollShadow);
@container scroll-state(scrollable: left) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
@media (max-width: 600px) {
padding-right: 0;
min-width: 50px;
}
}
&.col-meta {
width: 1%;
right: 0;
text-align: right;
padding-left: 10px;
padding-top: 4px;
padding-bottom: 5px;
&::before {
content: "";
display: block;
position: absolute;
top: 0;
left: 0;
width: 1px;
height: 100%;
opacity: 0;
pointer-events: none;
box-shadow: var(--rightScrollShadow);
@container scroll-state(scrollable: right) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
> i {
display: inline-block;
vertical-align: top;
color: var(--surfaceTxtDisabledColor);
transition:
color var(--animationSpeed),
transform var(--animationSpeed);
will-change: transform, color;
}
@media (max-width: 600px) {
padding-left: 5px;
}
}
&.col-field-type-date,
&.col-field-type-autodate,
&.col-field-type-geopoint {
width: 1%;
white-space: nowrap;
}
&.col-field-type-relation {
min-width: 190px;
max-width: 500px;
}
&.col-field-type-text {
max-width: 300px;
}
&.col-field-type-editor {
min-width: 400px;
}
&.col-field-type-select {
min-width: 180px;
}
&.col-field-type-email {
min-width: 120px;
white-space: nowrap;
}
&.col-field-type-number {
white-space: nowrap;
}
&.col-field-type-file {
min-width: 120px;
}
&.col-field-type-json {
max-width: 300px;
}
&.col-field-name-id {
width: 190px;
white-space: nowrap;
}
}
.col-copy {
padding-left: 0;
.copy-to-clipboard {
opacity: 0;
transform: translateX(3px);
transition:
color var(--animationSpeed),
opacity var(--animationSpeed),
transform var(--animationSpeed);
}
}
tr:hover .col-copy {
.copy-to-clipboard {
opacity: 1;
transform: translateX(0px);
}
}
thead th {
background: var(--surfaceAlt1Color);
}
thead.sticky {
position: sticky;
z-index: 3;
top: 0;
&:after {
content: "";
display: block;
position: absolute;
z-index: -1;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
opacity: 0;
pointer-events: none;
box-shadow: var(--topScrollShadow);
@container scroll-state(scrollable: top) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
}
tr.handle {
outline: 0;
cursor: pointer;
td,
th {
transition: background var(--animationSpeed);
will-change: background;
}
&:hover,
&:focus-within {
td,
th {
background: var(--surfaceAlt1Color);
}
.col-meta > i {
color: var(--surfaceTxtColor);
transform: translateX(3px);
}
}
&.active {
td,
th {
background: var(--surfaceAlt2Color);
}
}
}
/* performance optimizations for large tables */
&.optimize {
td,
th,
.col-bulk-select label::before,
.col-bulk-select label::after,
.col-meta i {
transition: none !important;
}
.col-meta i {
transform: none !important;
}
}
}
.page-table-wrapper {
display: block;
width: auto;
overflow: auto;
margin-left: calc(-1 * var(--spacing));
margin-right: calc(-1 * var(--spacing));
container-type: inline-size scroll-state;
.load-more-btn,
.sticky-content {
position: sticky;
z-index: 3;
width: 100%;
left: var(--spacing);
right: var(--spacing);
max-width: calc(100cqw - (2 * var(--spacing)));
}
table {
min-width: 1000px;
border-radius: 0;
}
tr {
animation: fadeIn var(--animationSpeed);
}
td,
th {
border: 0;
border-radius: 0;
border-bottom: 1px solid var(--surfaceAlt2Color);
&:first-child {
padding-left: var(--spacing);
}
&:last-child {
padding-right: var(--spacing);
}
}
th {
background: var(--surfaceColor);
}
th.sort-handle {
border-radius: var(--borderRadius) var(--borderRadius) 0 0;
}
tbody {
td,
th {
height: 59px;
}
}
/* content shadow */
&::before,
&::after {
content: "";
position: sticky;
display: block;
left: 0;
z-index: 9;
width: 100%;
height: 1px;
opacity: 0;
pointer-events: none;
}
&::before {
top: 0;
box-shadow: var(--topScrollShadow);
@container scroll-state(scrollable: top) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
&::after {
bottom: 0;
margin-top: -1px;
box-shadow: var(--bottomScrollShadow);
@container scroll-state(scrollable: bottom) {
opacity: 1;
transition: opacity var(--animationSpeed);
}
}
&:has(thead.sticky) {
&::before {
content: none;
display: none;
}
}
}
@media (max-width: 600px) {
table.responsive-table {
min-width: 0;
border-collapse: collapse;
table-layout: fixed;
tr {
width: 100%;
display: flex;
flex-wrap: wrap;
flex-direction: row;
gap: 5px;
padding: 10px;
border: 1px solid var(--surfaceAlt2Color);
~ tr {
border-top: 0;
}
}
.col-copy {
display: none;
}
.label {
word-break: break-word;
}
td,
th {
display: block;
height: auto;
min-height: 0;
padding: 0;
margin: 0;
word-break: break-word;
white-space: normal !important;
border: 0 !important;
width: 100% !important;
max-width: none !important;
min-width: 0 !important;
background: none !important;
&::before {
content: attr(data-name);
display: block;
width: 100%;
font-weight: bold;
color: var(--surfaceTxtHintColor);
font-size: var(--smFontSize);
line-height: var(--lineHeight);
}
&.col-bulk-select {
padding: 0;
margin-top: 0;
align-content: center;
}
&.col-meta {
display: none;
}
&.col-bulk-select,
&.col-meta {
&::before,
&::after {
display: none;
}
}
.formatted-date.short {
display: inline-flex;
align-items: center;
gap: 5px;
.secondary-date,
.primary-date {
width: auto;
margin: 0;
}
}
.record-field-view {
text-align: left;
}
}
td.col-bulk-select {
width: auto !important;
}
td.col-field-name-id {
width: auto !important;
flex-grow: 1;
&::before {
display: none;
}
.label {
width: 100%;
font-weight: bold;
}
}
thead tr {
flex-direction: row;
background: var(--surfaceColor);
border: 0;
padding-top: 0;
}
thead th {
display: none;
&.col-meta,
&.col-bulk-select {
width: auto !important;
margin: 0;
display: inline-block;
}
&.col-meta {
padding: 0;
margin-left: auto;
}
}
}
.page-table-wrapper .responsive-table {
border: 0;
tr {
border-left: 0;
border-right: 0;
padding-left: var(--spacing);
padding-right: var(--spacing);
}
}
}

58
ui/src/css/tabs.css Normal file
View File

@@ -0,0 +1,58 @@
.tabs-header {
position: relative;
z-index: 0;
display: flex;
width: 100%;
gap: 10px;
align-items: center;
border-bottom: 2px solid var(--surfaceAlt2Color);
.tab-item {
outline: 0;
cursor: pointer;
display: inline-flex;
align-items: center;
text-align: center;
justify-content: center;
gap: 5px;
min-width: 0;
user-select: none;
min-height: var(--btnHeight);
padding: 5px var(--smSpacing);
border-top-left-radius: var(--borderRadius);
border-top-right-radius: var(--borderRadius);
color: var(--surfaceTxtHintColor);
transition:
color var(--animationSpeed),
background var(--animationSpeed);
&:hover,
&:focus-visible {
color: var(--surfaceTxtColor);
background: var(--surfaceAlt1Color);
}
&.active,
&:active {
color: var(--surfaceTxtColor);
background: var(--surfaceAlt2Color);
transition-duration: var(--activeAnimationSpeed);
}
}
&.equal-width {
.tab-item {
padding: 5px;
flex-grow: 1;
flex-shrink: 0;
flex-basis: 0;
}
}
}
.code-block-tabs-content {
position: relative;
z-index: 1;
margin-top: calc(-1 * (var(--borderRadius)));
code.block {
padding: max(10px, calc(var(--smSpacing) - 5px)) max(10px, var(--smSpacing));
}
}

0
ui/src/css/tinymce.css Normal file
View File

114
ui/src/css/toast.css Normal file
View File

@@ -0,0 +1,114 @@
@keyframes toastEntrance {
0% {
opacity: 0;
transform: translateY(10px);
}
100% {
opacity: 1;
transform: translateY(0px);
}
}
@keyframes toastContentEntrance {
0% {
overflow: hidden;
}
}
.toast {
--toastWidth: 420px;
--toastSurfaceColor: var(--surfaceInfoColor);
--toastSurfaceTxtColor: var(--surfaceTxtColor);
--toastAccentColor: var(--infoColor);
position: sticky;
top: 0;
display: grid;
grid-template-rows: 1fr;
width: var(--toastWidth);
max-width: 95%;
margin: 0 0 var(--smSpacing);
animation: toastEntrance var(--animationSpeed);
.toast-container {
display: flex;
width: 100%;
align-items: stretch;
border-radius: var(--borderRadius);
line-height: var(--lineHeight);
color: var(--toastSurfaceTxtColor);
background: var(--toastSurfaceColor);
box-shadow: var(--boxShadow);
animation: toastContentEntrance var(--animationSpeed);
}
.toast-content {
display: flex;
width: 100%;
gap: 10px;
align-items: center;
text-align: left;
word-break: break-word;
min-height: var(--lgBtnHeight);
padding: max(5px, calc(var(--inputPadding) - 5px)) var(--inputPadding);
}
.toast-icon {
align-content: center;
font-size: 1.2em;
min-height: 0;
padding: 5px 10px;
margin-left: -1px;
color: var(--toastAccentColor);
border-top-left-radius: var(--borderRadius);
border-bottom-left-radius: var(--borderRadius);
border-right: 1px solid color-mix(in srgb, var(--toastAccentColor), transparent 90%);
&::before {
content: "\F414";
font-family: var(--iconFontFamily);
}
}
.toast-remove {
margin: -5px -10px -5px 0;
}
/* variants */
&.success {
--toastSurfaceColor: var(--surfaceSuccessColor);
--toastAccentColor: var(--successColor);
.toast-icon::before {
content: "\EB7B";
}
}
&.error {
--toastSurfaceColor: var(--surfaceDangerColor);
--toastAccentColor: var(--dangerColor);
.toast-icon::before {
content: "\EA20";
}
}
&.removing {
transition:
opacity var(--animationSpeed),
margin var(--animationSpeed),
grid-template-rows var(--animationSpeed);
opacity: 0;
margin: 0;
grid-template-rows: 0fr;
.toast-container {
overflow: hidden;
}
}
}
.toasts-container {
display: block;
position: fixed;
z-index: 9999;
bottom: var(--spacing);
left: 0;
width: 100%;
pointer-events: none !important;
.toast {
pointer-events: auto;
margin-left: auto;
margin-right: auto;
}
}

30
ui/src/css/tooltip.css Normal file
View File

@@ -0,0 +1,30 @@
.pb-tooltip {
position: fixed;
z-index: 99999;
max-width: 300px;
min-width: 30px;
text-align: center;
white-space: pre-line;
word-break: break-word;
background: var(--tooltipSurfaceColor);
border-radius: var(--borderRadius);
color: var(--tooltipTxtColor);
font-weight: normal;
font-size: var(--smFontSize);
line-height: var(--smLineHeight);
font-family: var(--baseFontFamily);
margin: 3px;
padding: 3px 5px;
pointer-events: none;
opacity: 0;
transition:
opacity var(--animationSpeed),
display var(--animationSpeed) allow-discrete;
&:popover-open {
display: block;
opacity: 1;
@starting-style {
opacity: 0;
}
}
}

246
ui/src/css/vars.css Normal file
View File

@@ -0,0 +1,246 @@
:root,
.dropdown,
.base-surface {
--baseFontFamily: "IBM Plex Sans", system-ui, sans-serif, emoji;
--monospaceFontFamily: "IBM Plex Mono", ui-monospace, monospace, emoji;
--iconFontFamily: "remixicon";
--primaryColor: #25272d;
--primaryAlt1Color: color-mix(in srgb, var(--primaryColor), white 8%);
--primaryAlt2Color: color-mix(in srgb, var(--primaryColor), white 13%);
--primaryTxtColor: #fff;
--primaryTxtHintColor: color-mix(in srgb, var(--primaryTxtColor), transparent 35%);
--primaryTxtDisabledColor: color-mix(in srgb, var(--primaryTxtColor), transparent 50%);
--secondaryColor: #e8eaee;
--secondaryAlt1Color: #dcdfe5;
--secondaryAlt2Color: #c4cbd4;
--secondaryTxtColor: var(--primaryColor);
--secondaryTxtHintColor: color-mix(in srgb, var(--secondaryTxtColor), transparent 35%);
--secondaryTxtDisabledColor: color-mix(in srgb, var(--secondaryTxtColor), transparent 50%);
--infoColor: #3376e5;
--infoAlt1Color: color-mix(in srgb, var(--infoColor), white 10%);
--infoAlt2Color: color-mix(in srgb, var(--infoColor), white 15%);
--infoTxtColor: var(--primaryTxtColor);
--infoTxtHintColor: var(--primaryTxtHintColor);
--infoTxtDisabledColor: var(--primaryTxtDisabledColor);
--successColor: #22a96d;
--successAlt1Color: color-mix(in srgb, var(--successColor), white 10%);
--successAlt2Color: color-mix(in srgb, var(--successColor), white 15%);
--successTxtColor: var(--primaryTxtColor);
--successTxtHintColor: var(--primaryTxtHintColor);
--successTxtDisabledColor: var(--primaryTxtDisabledColor);
--warningColor: #e57534;
--warningAlt1Color: color-mix(in srgb, var(--warningColor), white 10%);
--warningAlt2Color: color-mix(in srgb, var(--warningColor), white 15%);
--warningTxtColor: var(--primaryTxtColor);
--warningTxtHintColor: var(--primaryTxtHintColor);
--warningTxtDisabledColor: var(--primaryTxtDisabledColor);
--dangerColor: #c33751;
--dangerAlt1Color: color-mix(in srgb, var(--dangerColor), white 10%);
--dangerAlt2Color: color-mix(in srgb, var(--dangerColor), white 15%);
--dangerTxtColor: var(--primaryTxtColor);
--dangerTxtHintColor: var(--primaryTxtHintColor);
--dangerTxtDisabledColor: var(--primaryTxtDisabledColor);
--accentColor: #1055c9;
--accentAlt1Color: color-mix(in srgb, var(--accentColor), white 10%);
--accentAlt2Color: color-mix(in srgb, var(--accentColor), white 15%);
--accentTxtColor: #fff;
--accentTxtHintColor: color-mix(in srgb, var(--accentTxtColor), transparent 40%);
--accentTxtDisabledColor: color-mix(in srgb, var(--accentTxtColor), transparent 50%);
--surfaceColor: #fff;
--surfaceAlt1Color: #f6f7f9;
--surfaceAlt2Color: #e8eaee;
--surfaceAlt3Color: #dfe2e7;
--surfaceAlt4Color: #d9dde2;
--surfaceAlt5Color: #d1d6dc;
--surfaceTxtColor: #25272d;
--surfaceTxtHintColor: #6b747b;
--surfaceTxtDisabledColor: #abaeba;
--surfaceAccentColor: color-mix(in srgb, var(--accentColor), white 80%);
--surfaceInfoColor: color-mix(in srgb, var(--infoColor), white 80%);
--surfaceSuccessColor: color-mix(in srgb, var(--successColor), white 80%);
--surfaceWarningColor: color-mix(in srgb, var(--warningColor), white 80%);
--surfaceDangerColor: color-mix(in srgb, var(--dangerColor), white 80%);
--selectionColor: var(--surfaceAlt3Color);
--inputColor: var(--surfaceAlt2Color);
--inputFocusColor: var(--surfaceAlt3Color);
--inputBorderColor: var(--surfaceAlt4Color);
scrollbar-color: var(--surfaceAlt4Color) transparent;
--prismFunctionColor: #7c00aa;
--prismStringColor: #116b00;
--prismNumberColor: #246f86;
--prismPropertyColor: #246f86;
--prismKeywordColor: #a04900;
--prismCommentColor: var(--surfaceTxtHintColor);
--prismPunctuationColor: var(--surfaceTxtColor);
/* ---------------- */
--modalAnimationSpeed: 200ms;
--modalOverlayColor: rgba(34, 36, 42, 0.22);
--tooltipTxtColor: #fff;
--tooltipSurfaceColor: rgba(34, 36, 36, 0.9);
--boxShadow: 0px 8px 5px -5px rgba(34, 36, 36, 0.1);
--leftBoxShadow: -1px 0px 5px 0 rgba(34, 36, 36, 0.1);
--rightBoxShadow: 1px 0px 5px 0 rgba(34, 36, 36, 0.1);
--topScrollShadow: 0px 2px 8px 1px rgba(34, 36, 36, 0.15);
--bottomScrollShadow: 0px -2px 8px 1px rgba(34, 36, 36, 0.15);
--leftScrollShadow: 3px 0px 5px 0px rgba(34, 36, 36, 0.2);
--rightScrollShadow: -3px 0px 5px 0px rgba(34, 36, 36, 0.2);
--fontSize: 14px;
--smFontSize: 13px;
--lgFontSize: 15px;
--lineHeight: 22px;
--smLineHeight: 16px;
--lgLineHeight: 24px;
--btnHeight: 45px;
--smBtnHeight: 35px;
--lgBtnHeight: 52px;
--spacing: 30px;
--smSpacing: 20px;
--inputPadding: 13px;
--inputBorderRadius: var(--borderRadius);
--borderRadius: 5px;
--lgBorderRadius: 15px;
--pageSidebarWidth: 240px;
--wrapperWidth: 840px;
--smWrapperWidth: 430px;
--lgWrapperWidth: 1150px;
--loaderIcon: "\eec4";
--loaderAnimationSpeed: 1.2s;
--animationSpeed: 150ms;
--activeAnimationSpeed: 70ms;
--slideAnimationSpeed: 200ms;
accent-color: var(--primaryColor);
}
/* dark */
[data-color-scheme="dark"],
[data-color-scheme="dark"] .dropdown {
--surfaceColor: #282828;
--surfaceAlt1Color: color-mix(in srgb, var(--surfaceColor), white 2%);
--surfaceAlt2Color: color-mix(in srgb, var(--surfaceColor), white 4%);
--surfaceAlt3Color: color-mix(in srgb, var(--surfaceColor), white 6%);
--surfaceAlt4Color: color-mix(in srgb, var(--surfaceColor), white 9%);
--surfaceAlt5Color: color-mix(in srgb, var(--surfaceColor), white 12%);
--surfaceTxtColor: #dedede;
--tooltipTxtColor: var(--surfaceTxtColor);
--surfaceTxtHintColor: color-mix(in srgb, var(--surfaceTxtColor), transparent 45%);
--surfaceTxtDisabledColor: color-mix(in srgb, var(--surfaceTxtColor), transparent 65%);
--secondaryColor: var(--surfaceAlt3Color);
--secondaryTxtColor: var(--surfaceTxtColor);
--secondaryTxtColor: var(--surfaceTxtColor);
--secondaryAlt1Color: var(--surfaceAlt4Color);
--secondaryAlt2Color: var(--surfaceAlt5Color);
--primaryColor: #1e1e1e;
--primaryTxtColor: var(--surfaceTxtColor);
--primaryAlt1Color: color-mix(in srgb, var(--primaryColor), black 8%);
--primaryAlt2Color: color-mix(in srgb, var(--primaryColor), black 16%);
--primaryTxtHintColor: color-mix(in srgb, var(--primaryTxtColor), transparent 35%);
--primaryTxtDisabledColor: color-mix(in srgb, var(--primaryTxtColor), transparent 50%);
--infoColor: #4273bd;
--infoTxtColor: var(--surfaceTxtColor);
--infoAlt1Color: color-mix(in srgb, var(--infoColor), black 10%);
--infoAlt2Color: color-mix(in srgb, var(--infoColor), black 15%);
--surfaceInfoColor: color-mix(in srgb, var(--infoColor), var(--surfaceColor) 45%);
--successColor: #257e58;
--successTxtColor: var(--surfaceTxtColor);
--successAlt1Color: color-mix(in srgb, var(--successColor), black 10%);
--successAlt2Color: color-mix(in srgb, var(--successColor), black 15%);
--surfaceSuccessColor: color-mix(in srgb, var(--successColor), var(--surfaceColor) 45%);
--warningColor: #ae4d0e;
--warningTxtColor: var(--surfaceTxtColor);
--warningAlt1Color: color-mix(in srgb, var(--warningColor), black 10%);
--warningAlt2Color: color-mix(in srgb, var(--warningColor), black 15%);
--surfaceWarningColor: color-mix(in srgb, var(--warningColor), var(--surfaceColor) 45%);
--dangerColor: #b6354c;
--dangerTxtColor: var(--surfaceTxtColor);
--dangerAlt1Color: color-mix(in srgb, var(--dangerColor), black 10%);
--dangerAlt2Color: color-mix(in srgb, var(--dangerColor), black 15%);
--surfaceDangerColor: color-mix(in srgb, var(--dangerColor), var(--surfaceColor) 45%);
--inputColor: var(--surfaceAlt2Color);
--inputFocusColor: var(--surfaceAlt3Color);
--inputBorderColor: var(--surfaceAlt4Color);
scrollbar-color: var(--surfaceAlt5Color) transparent;
--modalOverlayColor: rgb(0,0,0,0.5);
--boxShadow: 0px 8px 5px -5px rgba(0,0,0, 0.3);
--leftBoxShadow: -1px 0px 5px 0 rgba(0,0,0, 0.3);
--rightBoxShadow: 1px 0px 5px 0 rgba(0,0,0, 0.3);
--topScrollShadow: 0px 2px 8px 1px rgba(0,0,0, 0.45);
--bottomScrollShadow: 0px -2px 8px 1px rgba(0,0,0, 0.45);
--leftScrollShadow: 3px 0px 5px 0px rgba(0,0,0, 0.4);
--rightScrollShadow: -3px 0px 5px 0px rgba(0,0,0, 0.4);
--prismFunctionColor: #ab7abd;
--prismStringColor: #87b47e;
--prismNumberColor: #86b9bb;
--prismPropertyColor: #90c2d1;
--prismKeywordColor: #b3703d;
--prismCommentColor: var(--surfaceTxtHintColor);
--prismPunctuationColor: var(--surfaceTxtColor);
}
html .accent-surface {
--surfaceColor: var(--accentColor);
--surfaceAlt1Color: color-mix(in srgb, var(--surfaceColor), white 5%);
--surfaceAlt2Color: color-mix(in srgb, var(--surfaceColor), white 10%);
--surfaceAlt3Color: color-mix(in srgb, var(--surfaceColor), white 20%);
--surfaceAlt4Color: color-mix(in srgb, var(--surfaceColor), white 30%);
--surfaceAlt5Color: color-mix(in srgb, var(--surfaceColor), white 40%);
--surfaceTxtColor: #fff;
--surfaceTxtHintColor: color-mix(in srgb, var(--surfaceTxtColor), transparent 35%);
--surfaceTxtDisabledColor: color-mix(in srgb, var(--surfaceTxtColor), transparent 60%);
--surfaceAccentColor: color-mix(in srgb, var(--surfaceColor), white 20%);
--surfaceInfoColor: color-mix(in srgb, var(--infoColor), transparent 40%);
--surfaceSuccessColor: color-mix(in srgb, var(--successColor), transparent 40%);
--surfaceWarningColor: color-mix(in srgb, var(--warningColor), transparent 40%);
--surfaceDangerColor: color-mix(in srgb, var(--dangerColor), transparent 40%);
--inputColor: var(--surfaceAlt3Color);
--inputFocusColor: var(--surfaceAlt4Color);
--inputBorderColor: var(--surfaceAlt5Color);
--selectionColor: var(--surfaceAccentColor);
scrollbar-color: var(--surfaceAlt4Color) transparent;
}
@media (max-width: 900px) {
:root,
.dropdown,
.base-surface {
--spacing: 20px;
--smSpacing: 15px;
--btnHeight: 40px;
--smBtnHeight: 30px;
--lgBtnHeight: 47px;
}
}