diff --git a/.changeset/sixty-papayas-march.md b/.changeset/sixty-papayas-march.md new file mode 100644 index 0000000000..bf512c5608 --- /dev/null +++ b/.changeset/sixty-papayas-march.md @@ -0,0 +1,7 @@ +--- +'@directus/themes': minor +'docs': minor +'@directus/app': minor +--- + +Added support for configurable borders diff --git a/app/src/components/v-avatar.vue b/app/src/components/v-avatar.vue index 54f1ea66bc..6256634206 100644 --- a/app/src/components/v-avatar.vue +++ b/app/src/components/v-avatar.vue @@ -47,7 +47,7 @@ body { white-space: nowrap; text-overflow: ellipsis; background-color: var(--v-avatar-color); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); } .tile { diff --git a/app/src/components/v-button.vue b/app/src/components/v-button.vue index 53c3000468..603cc3c492 100644 --- a/app/src/components/v-button.vue +++ b/app/src/components/v-button.vue @@ -279,8 +279,8 @@ async function onClick(event: MouseEvent) { line-height: var(--v-button-line-height); text-decoration: none; background-color: var(--v-button-background-color); - border: var(--border-width) solid var(--v-button-background-color); - border-radius: var(--border-radius); + border: var(--theme--border-width) solid var(--v-button-background-color); + border-radius: var(--theme--border-radius); cursor: pointer; transition: var(--fast) var(--transition); transition-property: background-color border; @@ -312,7 +312,7 @@ async function onClick(event: MouseEvent) { .button:disabled { color: var(--v-button-color-disabled); background-color: var(--v-button-background-color-disabled); - border: var(--border-width) solid var(--v-button-background-color-disabled); + border: var(--theme--border-width) solid var(--v-button-background-color-disabled); cursor: not-allowed; } @@ -351,7 +351,6 @@ async function onClick(event: MouseEvent) { --v-button-font-size: 12px; --v-button-font-weight: 600; --v-button-min-width: 60px; - --border-radius: 4px; padding: 0 12px; } diff --git a/app/src/components/v-card.vue b/app/src/components/v-card.vue index 0a60a2b60a..6d24936c58 100644 --- a/app/src/components/v-card.vue +++ b/app/src/components/v-card.vue @@ -32,7 +32,6 @@ body { @@ -48,7 +48,7 @@ body { margin-top: 8px; border: solid; border-color: var(--v-divider-color); - border-width: var(--border-width) 0 0 0; + border-width: var(--theme--border-width) 0 0 0; } span.wrapper { @@ -98,7 +98,7 @@ body { hr { width: 0px; max-width: 0px; - border-width: 0 var(--border-width) 0 0; + border-width: 0 var(--theme--border-width) 0 0; } span.wrapper { diff --git a/app/src/components/v-drawer.vue b/app/src/components/v-drawer.vue index f2befd0f19..f4ffa73cd1 100644 --- a/app/src/components/v-drawer.vue +++ b/app/src/components/v-drawer.vue @@ -170,7 +170,6 @@ body { } .content { - --border-radius: 6px; --input-height: 60px; --input-padding: 16px; /* (60 - 4 - 24) / 2 */ --form-vertical-gap: 52px; @@ -247,7 +246,7 @@ body { nav { background-color: var(--background-subdued); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); } @media (min-width: 960px) { diff --git a/app/src/components/v-error.vue b/app/src/components/v-error.vue index a8b5239fcf..9a41463d3f 100644 --- a/app/src/components/v-error.vue +++ b/app/src/components/v-error.vue @@ -65,7 +65,7 @@ async function copyError() { color: var(--theme--danger); font-family: var(--theme--font-family-monospace); background-color: var(--danger-alt); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); .copy-error { margin-left: 12px; diff --git a/app/src/components/v-fancy-select.vue b/app/src/components/v-fancy-select.vue index 5bec209e49..95c2d97a2d 100644 --- a/app/src/components/v-fancy-select.vue +++ b/app/src/components/v-fancy-select.vue @@ -99,7 +99,7 @@ function toggle(item: Record) { margin-bottom: 8px; padding: 12px; background-color: var(--background-normal); - border: 2px solid var(--background-normal); + border: var(--theme--border-width) solid var(--background-normal); border-radius: 6px; backface-visibility: hidden; cursor: pointer; @@ -138,14 +138,14 @@ function toggle(item: Record) { z-index: 2; color: var(--theme--primary); background-color: var(--theme--primary-background); - border-color: var(--theme--primary); + border-color: var(--theme--form--field--input--border-color-focus); .v-icon { --v-icon-color: var(--theme--primary); } &:hover { - border-color: var(--theme--primary); + border-color: var(--theme--form--field--input--border-color-focus); } } } diff --git a/app/src/components/v-field-template/v-field-template.vue b/app/src/components/v-field-template/v-field-template.vue index 5e5847bc25..bcb02cbcf9 100644 --- a/app/src/components/v-field-template/v-field-template.vue +++ b/app/src/components/v-field-template/v-field-template.vue @@ -321,7 +321,7 @@ function setContent() { padding: 2px 4px 0; color: var(--theme--primary); background-color: var(--theme--primary-background); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); transition: var(--fast) var(--transition); transition-property: background-color, color; user-select: none; diff --git a/app/src/components/v-form/form-field.vue b/app/src/components/v-form/form-field.vue index 9575b4b016..1455582b8d 100644 --- a/app/src/components/v-form/form-field.vue +++ b/app/src/components/v-form/form-field.vue @@ -241,7 +241,7 @@ function useComputedValues() { margin: -12px; padding: 12px; background-color: var(--danger-alt); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); transition: var(--medium) var(--transition); transition-property: background-color, padding, margin; } diff --git a/app/src/components/v-input.vue b/app/src/components/v-input.vue index fe4bcfe071..5c843c9b98 100644 --- a/app/src/components/v-input.vue +++ b/app/src/components/v-input.vue @@ -283,14 +283,16 @@ function stepDown() { :global(body) { --v-input-font-family: var(--theme--font-family-sans-serif); --v-input-placeholder-color: var(--theme--foreground-subdued); - --v-input-box-shadow-color-focus: var(--theme--primary); --v-input-color: var(--theme--foreground); --v-input-background-color: var(--theme--form--field--input--background); - --v-input-border-color-focus: var(--theme--primary); + --v-input-border-color: var(--theme--form--field--input--border-color); + --v-input-border-color-hover: var(--theme--form--field--input--border-color-hover); + --v-input-border-color-focus: var(--theme--form--field--input--border-color-focus); + --v-input-border-radius: var(--theme--border-radius); } .v-input { - --arrow-color: var(--border-normal); + --arrow-color: var(--theme--form--field--input--border-color); --v-icon-color: var(--theme--foreground-subdued); display: flex; @@ -314,9 +316,11 @@ function stepDown() { color: var(--v-input-color); font-family: var(--v-input-font-family); background-color: var(--v-input-background-color); - border: var(--border-width) solid var(--border-normal); - border-radius: var(--border-radius); - transition: border-color var(--fast) var(--transition); + border: var(--theme--border-width) solid var(--v-input-border-color); + border-radius: var(--v-input-border-radius); + transition: var(--fast) var(--transition); + transition-property: border-color, box-shadow; + box-shadow: var(--theme--form--field--input--box-shadow); .prepend { margin-right: 8px; @@ -345,36 +349,37 @@ function stepDown() { } &.disabled { - --arrow-color: var(--border-normal); + --arrow-color: var(--v-input-border-color); cursor: auto; } } &:hover { - --arrow-color: var(--border-normal-alt); + --arrow-color: var(--v-input-border-color-hover); color: var(--v-input-color); background-color: var(--theme--form--field--input--background); - border-color: var(--border-normal-alt); + border-color: var(--v-input-border-color-hover); + box-shadow: var(--theme--form--field--input--box-shadow-hover); } &:focus-within, &.active { - --arrow-color: var(--border-normal-alt); + --arrow-color: var(--v-input-border-color-hover); color: var(--v-input-color); background-color: var(--theme--form--field--input--background); border-color: var(--v-input-border-color-focus); - box-shadow: 0 0 16px -8px var(--v-input-box-shadow-color-focus); + box-shadow: var(--theme--form--field--input--box-shadow-focus); } &.disabled { - --arrow-color: var(--border-normal); + --arrow-color: var(--v-input-border-color); color: var(--theme--foreground-subdued); background-color: var(--background-subdued); - border-color: var(--border-normal); + border-color: var(--v-input-border-color); } .prefix, diff --git a/app/src/components/v-list-item.vue b/app/src/components/v-list-item.vue index dabdb96903..ca0b0a9afb 100644 --- a/app/src/components/v-list-item.vue +++ b/app/src/components/v-list-item.vue @@ -143,9 +143,9 @@ body { --v-list-item-min-height-nav: 36px; --v-list-item-min-height: 32px; --v-list-item-max-height: auto; - --v-list-item-border-radius: var(--border-radius); + --v-list-item-border-radius: var(--theme--border-radius); --v-list-item-border-color: var(--border-subdued); - --v-list-item-border-color-hover: var(--border-normal-alt); + --v-list-item-border-color-hover: var(--theme--form--field--input--border-color-hover); --v-list-item-color: var(--v-list-color, var(--theme--foreground)); --v-list-item-color-hover: var(--v-list-color-hover, var(--theme--foreground)); --v-list-item-color-active: var(--v-list-color-active, var(--theme--foreground)); @@ -185,7 +185,7 @@ body { left: 0; width: calc(100% - 4px); height: calc(100% - 4px); - border: 2px dashed var(--border-normal); + border: 2px dashed var(--theme--form--field--input--border-color); content: ''; pointer-events: none; } @@ -252,8 +252,8 @@ body { margin: 0; padding: 8px var(--input-padding); background-color: var(--v-list-item-background-color); - border: var(--border-width) solid var(--v-list-item-border-color); - border-radius: var(--border-radius); + border: var(--theme--border-width) solid var(--v-list-item-border-color); + border-radius: var(--theme--border-radius); transition: border-color var(--fast) var(--transition); :slotted(.drag-handle) { @@ -274,11 +274,11 @@ body { &.clickable:hover { background-color: var(--v-list-item-background-color-hover); - border: var(--border-width) solid var(--v-list-item-border-color-hover); + border: var(--theme--border-width) solid var(--v-list-item-border-color-hover); } &.sortable-chosen { - border: var(--border-width) solid var(--theme--primary) !important; + border: var(--theme--border-width) solid var(--theme--primary) !important; } &.sortable-ghost { diff --git a/app/src/components/v-list.vue b/app/src/components/v-list.vue index e89e0cb062..29a7e3d7ad 100644 --- a/app/src/components/v-list.vue +++ b/app/src/components/v-list.vue @@ -57,7 +57,7 @@ useGroupableParent( diff --git a/app/src/components/v-radio.vue b/app/src/components/v-radio.vue index cc4d051ed0..b91005713d 100644 --- a/app/src/components/v-radio.vue +++ b/app/src/components/v-radio.vue @@ -103,9 +103,9 @@ body { position: relative; width: 100%; height: var(--input-height); - padding: 10px; // 14 - 4 (border) - border: 2px solid var(--background-subdued); - border-radius: var(--border-radius); + padding: calc(14px - 2 * var(--theme--border-width)); + border: var(--theme--border-width) solid var(--background-subdued); + border-radius: var(--theme--border-radius); &::before { position: absolute; @@ -114,7 +114,7 @@ body { width: 100%; height: 100%; background-color: var(--background-subdued); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); content: ''; } diff --git a/app/src/components/v-select/v-select.vue b/app/src/components/v-select/v-select.vue index 79b7230c26..82711b1c61 100644 --- a/app/src/components/v-select/v-select.vue +++ b/app/src/components/v-select/v-select.vue @@ -418,7 +418,7 @@ function useDisplayValue() { padding-right: 26px; color: var(--theme--foreground-subdued); background-color: var(--background-subdued); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); transition: color var(--fast) var(--transition); &:hover, diff --git a/app/src/components/v-sheet.vue b/app/src/components/v-sheet.vue index ef0db684eb..82ae1b8193 100644 --- a/app/src/components/v-sheet.vue +++ b/app/src/components/v-sheet.vue @@ -26,6 +26,6 @@ padding: var(--v-sheet-padding); overflow: auto; background-color: var(--v-sheet-background-color); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); } diff --git a/app/src/components/v-skeleton-loader.vue b/app/src/components/v-skeleton-loader.vue index 131fdddac0..712298052d 100644 --- a/app/src/components/v-skeleton-loader.vue +++ b/app/src/components/v-skeleton-loader.vue @@ -62,8 +62,8 @@ body { .input-tall { width: 100%; height: var(--input-height); - border: var(--border-width) solid var(--v-skeleton-loader-background-color); - border-radius: var(--border-radius); + border: var(--theme--border-width) solid var(--v-skeleton-loader-background-color); + border-radius: var(--theme--border-radius); @include loader; } @@ -75,7 +75,7 @@ body { .block-list-item { width: 100%; height: var(--input-height); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); @include loader; @@ -87,7 +87,7 @@ body { .block-list-item-dense { width: 100%; height: 44px; - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); @include loader; diff --git a/app/src/components/v-slider.vue b/app/src/components/v-slider.vue index 02091709f9..64b5328c1c 100644 --- a/app/src/components/v-slider.vue +++ b/app/src/components/v-slider.vue @@ -88,7 +88,7 @@ function onInput(event: Event) { diff --git a/app/src/components/v-workspace.vue b/app/src/components/v-workspace.vue index 093cdfac9a..e6898113ae 100644 --- a/app/src/components/v-workspace.vue +++ b/app/src/components/v-workspace.vue @@ -157,7 +157,7 @@ const workspaceBoxSize = computed(() => { display: block; width: calc(100% + 8px); height: calc(100% + 8px); - background-image: radial-gradient(var(--border-normal) 10%, transparent 10%); + background-image: radial-gradient(var(--theme--form--field--input--border-color) 10%, transparent 10%); background-position: -6px -6px; background-size: 20px 20px; opacity: 0; diff --git a/app/src/displays/color/color.vue b/app/src/displays/color/color.vue index 0e47a49865..2c04742899 100644 --- a/app/src/displays/color/color.vue +++ b/app/src/displays/color/color.vue @@ -32,7 +32,8 @@ const styles = computed(() => { const pageColorRGB = Color(pageColorString); const colorRGB = value === null ? Color(defaultColor) : Color(value); - if (colorRGB.contrast(pageColorRGB) < 1.1) style['border'] = '1px solid var(--border-normal)'; + if (colorRGB.contrast(pageColorRGB) < 1.1) + style['border'] = '1px solid var(--theme--form--field--input--border-color)'; return style; }); diff --git a/app/src/displays/file/file.vue b/app/src/displays/file/file.vue index 2a4e947d82..3bf1fcf3cd 100644 --- a/app/src/displays/file/file.vue +++ b/app/src/displays/file/file.vue @@ -54,7 +54,7 @@ const imageThumbnail = computed(() => { img { height: 100%; object-fit: cover; - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); aspect-ratio: 1; } @@ -68,7 +68,7 @@ img { height: 100%; overflow: hidden; background-color: var(--background-normal); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); aspect-ratio: 1; &.has-file { diff --git a/app/src/displays/image/image.vue b/app/src/displays/image/image.vue index 83d0160583..73e808caee 100644 --- a/app/src/displays/image/image.vue +++ b/app/src/displays/image/image.vue @@ -39,7 +39,7 @@ img { width: auto; height: 100%; vertical-align: -30%; - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); &.circle { border-radius: 100%; diff --git a/app/src/displays/rating/rating.vue b/app/src/displays/rating/rating.vue index 0352dd9bb7..cb6a3e4099 100644 --- a/app/src/displays/rating/rating.vue +++ b/app/src/displays/rating/rating.vue @@ -54,7 +54,7 @@ const ratingPercentage = computed(() => ({ color: #ffc107; font-weight: 600; background-color: rgb(255 193 7 / 0.15); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); .v-icon { margin-right: 4px; diff --git a/app/src/displays/related-values/related-values.vue b/app/src/displays/related-values/related-values.vue index 95885e739e..f789ca5e48 100644 --- a/app/src/displays/related-values/related-values.vue +++ b/app/src/displays/related-values/related-values.vue @@ -119,7 +119,7 @@ function getLinkForItem(item: any) { width: calc(100% + 12px); height: calc(100% + 12px); background-color: var(--background-normal); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); opacity: 0; transition: opacity var(--fast) var(--transition); content: ''; diff --git a/app/src/displays/translations/translations.vue b/app/src/displays/translations/translations.vue index 08fcb5179e..2a2cb6021f 100644 --- a/app/src/displays/translations/translations.vue +++ b/app/src/displays/translations/translations.vue @@ -176,7 +176,7 @@ const translations = computed(() => { .v-list-item:not(:first-child) { .header { padding-top: 8px; - border-top: var(--border-width) solid var(--border-subdued); + border-top: var(--theme--border-width) solid var(--border-subdued); } } diff --git a/app/src/interfaces/_system/system-display-options/system-display-options.vue b/app/src/interfaces/_system/system-display-options/system-display-options.vue index 8e936ea3e1..e2de068c78 100644 --- a/app/src/interfaces/_system/system-display-options/system-display-options.vue +++ b/app/src/interfaces/_system/system-display-options/system-display-options.vue @@ -119,8 +119,8 @@ const optionsFields = computed(() => { --form-vertical-gap: 24px; padding: 12px; - border: var(--border-width) solid var(--border-normal); - border-radius: var(--border-radius); + border: var(--theme--border-width) solid var(--theme--form--field--input--border-color); + border-radius: var(--theme--border-radius); :deep(.type-label) { font-size: 1rem; diff --git a/app/src/interfaces/_system/system-field-tree/system-field-tree.vue b/app/src/interfaces/_system/system-field-tree/system-field-tree.vue index 394192d0e9..20a4b56f50 100644 --- a/app/src/interfaces/_system/system-field-tree/system-field-tree.vue +++ b/app/src/interfaces/_system/system-field-tree/system-field-tree.vue @@ -48,7 +48,7 @@ const { treeList, loadFieldRelations } = useFieldTree(chosenCollection); diff --git a/app/src/interfaces/_system/system-fields/system-fields.vue b/app/src/interfaces/_system/system-fields/system-fields.vue index 736fa4fefc..6976fa31c1 100644 --- a/app/src/interfaces/_system/system-fields/system-fields.vue +++ b/app/src/interfaces/_system/system-fields/system-fields.vue @@ -139,7 +139,7 @@ const removeField = (field: string) => { .v-notice.no-fields { background-color: var(--theme--background); - border: var(--border-width) solid var(--v-list-item-border-color); + border: var(--theme--border-width) solid var(--v-list-item-border-color); &::after { display: none; diff --git a/app/src/interfaces/_system/system-filter/nodes.vue b/app/src/interfaces/_system/system-filter/nodes.vue index e2bec18996..0e44fd031c 100644 --- a/app/src/interfaces/_system/system-filter/nodes.vue +++ b/app/src/interfaces/_system/system-filter/nodes.vue @@ -385,7 +385,7 @@ function isExistingField(node: Record): boolean { padding: 2px 6px; padding-right: 8px; background-color: var(--theme--background); - border: var(--border-width) solid var(--border-subdued); + border: var(--theme--border-width) solid var(--border-subdued); border-radius: 100px; transition: border-color var(--fast) var(--transition); @@ -490,7 +490,7 @@ function isExistingField(node: Record): boolean { } &:hover { - border-color: var(--border-normal); + border-color: var(--theme--form--field--input--border-color); .delete, &:hover { @@ -532,7 +532,7 @@ function isExistingField(node: Record): boolean { .group :deep(.sortable-ghost) { .node .header { background-color: var(--theme--primary-background); - border-color: var(--theme--primary); + border-color: var(--theme--form--field--input--border-color-focus); > * { opacity: 0; diff --git a/app/src/interfaces/_system/system-filter/system-filter.vue b/app/src/interfaces/_system/system-filter/system-filter.vue index 19a404af31..5d3a759b40 100644 --- a/app/src/interfaces/_system/system-filter/system-filter.vue +++ b/app/src/interfaces/_system/system-filter/system-filter.vue @@ -247,14 +247,14 @@ function addKeyAsNode() { :deep(.group) { margin-left: 18px; padding-left: 10px; - border-left: var(--border-width) solid var(--border-subdued); + border-left: var(--theme--border-width) solid var(--border-subdued); } .v-list { min-width: auto; margin: 0px 0px 10px; padding: 20px 20px 12px; - border: var(--border-width) solid var(--border-subdued); + border: var(--theme--border-width) solid var(--border-subdued); & > :deep(.group) { margin-left: 0px; @@ -311,12 +311,12 @@ function addKeyAsNode() { padding: 0; color: var(--theme--form--field--input--foreground-subdued); background-color: var(--theme--background); - border: var(--border-width) solid var(--border-subdued); + border: var(--theme--border-width) solid var(--border-subdued); border-radius: 100px; transition: border-color var(--fast) var(--transition); &:hover, &.active { - border-color: var(--border-normal); + border-color: var(--theme--form--field--input--border-color); } &.active { .expand_more { diff --git a/app/src/interfaces/_system/system-input-translated-string/custom-translations-tooltip.vue b/app/src/interfaces/_system/system-input-translated-string/custom-translations-tooltip.vue index 3ee8884bfa..95af6e8a62 100644 --- a/app/src/interfaces/_system/system-input-translated-string/custom-translations-tooltip.vue +++ b/app/src/interfaces/_system/system-input-translated-string/custom-translations-tooltip.vue @@ -154,7 +154,7 @@ const clicked = (toggleTooltip: () => void) => { .v-list-item:not(:first-child) { .header { padding-top: 8px; - border-top: var(--border-width) solid var(--border-subdued); + border-top: var(--theme--border-width) solid var(--border-subdued); } } diff --git a/app/src/interfaces/_system/system-input-translated-string/input-translated-string.vue b/app/src/interfaces/_system/system-input-translated-string/input-translated-string.vue index a6d50aadd8..58c47fb904 100644 --- a/app/src/interfaces/_system/system-input-translated-string/input-translated-string.vue +++ b/app/src/interfaces/_system/system-input-translated-string/input-translated-string.vue @@ -217,7 +217,7 @@ function openNewCustomTranslationDrawer() { padding: 2px 8px 0; color: var(--theme--primary); background-color: var(--theme--primary-background); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); transition: var(--fast) var(--transition); transition-property: background-color, color; user-select: none; diff --git a/app/src/interfaces/_system/system-interface-options/system-interface-options.vue b/app/src/interfaces/_system/system-interface-options/system-interface-options.vue index d940ead3be..93497b0783 100644 --- a/app/src/interfaces/_system/system-interface-options/system-interface-options.vue +++ b/app/src/interfaces/_system/system-interface-options/system-interface-options.vue @@ -119,8 +119,8 @@ const optionsFields = computed(() => { --form-vertical-gap: 24px; padding: 12px; - border: var(--border-width) solid var(--border-normal); - border-radius: var(--border-radius); + border: var(--theme--border-width) solid var(--theme--form--field--input--border-color); + border-radius: var(--theme--border-radius); :deep(.type-label) { font-size: 1rem; diff --git a/app/src/interfaces/_system/system-modules/system-modules.vue b/app/src/interfaces/_system/system-modules/system-modules.vue index 312990b1f3..e5891ac971 100644 --- a/app/src/interfaces/_system/system-modules/system-modules.vue +++ b/app/src/interfaces/_system/system-modules/system-modules.vue @@ -274,7 +274,7 @@ function remove(id: string) { } .v-list-item.enabled { - --v-list-item-border-color: var(--theme--primary); + --v-list-item-border-color: var(--theme--form--field--input--border-color-focus); --v-list-item-color: var(--theme--primary-accent); --v-list-item-background-color: var(--theme--primary-background); --v-list-item-border-color-hover: var(--theme--primary-accent); diff --git a/app/src/interfaces/_system/system-raw-editor/system-raw-editor.vue b/app/src/interfaces/_system/system-raw-editor/system-raw-editor.vue index a27c9b2531..a27f54dc32 100644 --- a/app/src/interfaces/_system/system-raw-editor/system-raw-editor.vue +++ b/app/src/interfaces/_system/system-raw-editor/system-raw-editor.vue @@ -145,7 +145,7 @@ watch( position: relative; height: var(--input-height); min-height: var(--input-height); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); :deep(.CodeMirror) { width: 100%; diff --git a/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides-group.vue b/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides-group.vue index d007f78742..e1f9982ea0 100644 --- a/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides-group.vue +++ b/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides-group.vue @@ -95,7 +95,7 @@ const collapsed = ref(true); &:hover { background-color: var(--background-subdued); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); } .icon { diff --git a/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides-rule.vue b/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides-rule.vue index 56490540fb..c4ef3cd01e 100644 --- a/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides-rule.vue +++ b/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides-rule.vue @@ -83,7 +83,7 @@ const valueLength = computed(() => String(props.value ?? props.defaultValue).len .value { margin-right: 1ch; border: none; - border-bottom: 1px solid var(--border-normal); + border-bottom: 1px solid var(--theme--form--field--input--border-color); min-width: 5ch; width: v-bind(valueLength); max-width: 100%; diff --git a/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides.vue b/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides.vue index c130b683bb..0c871d631c 100644 --- a/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides.vue +++ b/app/src/interfaces/_system/system-theme-overrides/system-theme-overrides.vue @@ -50,11 +50,24 @@ const { theme } = useTheme(darkMode, themeLight, themeDark, {}, {}); diff --git a/app/src/interfaces/file-image/file-image.vue b/app/src/interfaces/file-image/file-image.vue index 79fb88d197..438dd88cf9 100644 --- a/app/src/interfaces/file-image/file-image.vue +++ b/app/src/interfaces/file-image/file-image.vue @@ -226,7 +226,7 @@ const { createAllowed, updateAllowed } = useRelationPermissionsM2O(relationInfo) height: var(--input-height-tall); overflow: hidden; background-color: var(--background-normal-alt); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); } img { @@ -383,6 +383,6 @@ img { align-items: center; justify-content: center; height: var(--input-height-tall); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); } diff --git a/app/src/interfaces/file/file.vue b/app/src/interfaces/file/file.vue index 4f16b7d182..114970d8cb 100644 --- a/app/src/interfaces/file/file.vue +++ b/app/src/interfaces/file/file.vue @@ -290,7 +290,7 @@ function useURLImport() { margin-left: -8px; overflow: hidden; background-color: var(--background-normal); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); img { width: 100%; diff --git a/app/src/interfaces/group-accordion/accordion-section.vue b/app/src/interfaces/group-accordion/accordion-section.vue index 27062c9ba4..6f49342b64 100644 --- a/app/src/interfaces/group-accordion/accordion-section.vue +++ b/app/src/interfaces/group-accordion/accordion-section.vue @@ -128,10 +128,10 @@ function getFieldsForGroup(group: null | string, passed: string[] = []): Field[] diff --git a/app/src/interfaces/select-color/select-color.vue b/app/src/interfaces/select-color/select-color.vue index 1c8c6ae33a..ee543e2849 100644 --- a/app/src/interfaces/select-color/select-color.vue +++ b/app/src/interfaces/select-color/select-color.vue @@ -246,7 +246,10 @@ function useColor() { icon :style="{ '--v-button-background-color': isValidColor ? hex : 'transparent', - border: lowContrast === false ? 'none' : 'var(--border-width) solid var(--border-normal)', + border: + lowContrast === false + ? 'none' + : 'var(--theme--border-width) solid var(--theme--form--field--input--border-color)', }" @click="activateColorPicker" > @@ -391,7 +394,7 @@ function useColor() { width: calc(var(--input-height) - 20px); max-height: calc(var(--input-height) - 20px); overflow: hidden; - border-radius: calc(var(--border-radius) + 2px); + border-radius: calc(var(--theme--border-radius) + 2px); cursor: pointer; } @@ -413,7 +416,7 @@ function useColor() { &.low-contrast { --v-button-height: 18px; --v-button-width: 18px; - border: 1px solid var(--border-normal-alt); + border: 1px solid var(--theme--form--field--input--border-color-hover); } } @@ -441,7 +444,7 @@ function useColor() { } .color-data-inputs .color-data-input { - --border-radius: 0px; + --v-input-border-radius: 0px; } .color-data-inputs .color-data-input :deep(.input:focus-within), @@ -457,36 +460,36 @@ function useColor() { } .color-data-inputs .color-data-input:not(:first-child) :deep(.input) { - margin-left: calc(-1 * var(--border-width)); + margin-left: calc(-1 * var(--theme--border-width)); } .color-data-inputs .color-data-input:first-child { - --border-radius: 4px 0px 0px 4px; + --v-input-border-radius: var(--theme--border-radius) 0px 0px var(--theme--border-radius); } .color-data-inputs .color-data-input:last-child { - --border-radius: 0px 4px 4px 0px; + --v-input-border-radius: 0px var(--theme--border-radius) var(--theme--border-radius) 0px; } .color-data-inputs.stacked .color-data-input:not(:first-child) :deep(.input) { - margin-top: calc(-2 * var(--border-width)); + margin-top: calc(-2 * var(--theme--border-width)); margin-left: initial; } .color-data-inputs.stacked .color-data-input:not(:first-child):not(:nth-child(2)) :deep(.input) { - margin-left: calc(-1 * var(--border-width)); + margin-left: calc(-1 * var(--theme--border-width)); } .color-data-inputs.stacked .color-data-input:first-child { - --border-radius: 4px 4px 0px 0px; + --v-input-border-radius: var(--theme--border-radius) var(--theme--border-radius) 0px 0px; } .color-data-inputs.stacked .color-data-input:nth-child(2) { - --border-radius: 0px 0px 0px 4px; + --v-input-border-radius: 0px 0px 0px var(--theme--border-radius); } .color-data-inputs.stacked .color-data-input:last-child { - --border-radius: 0px 0px 4px 0px; + --v-input-border-radius: 0px 0px var(--theme--border-radius) 0px; } .color-data-alphas { diff --git a/app/src/interfaces/select-multiple-checkbox-tree/select-multiple-checkbox-tree.vue b/app/src/interfaces/select-multiple-checkbox-tree/select-multiple-checkbox-tree.vue index 62b10b8b1f..4698b60d3a 100644 --- a/app/src/interfaces/select-multiple-checkbox-tree/select-multiple-checkbox-tree.vue +++ b/app/src/interfaces/select-multiple-checkbox-tree/select-multiple-checkbox-tree.vue @@ -84,8 +84,8 @@ const searchDebounced = ref(''); max-height: var(--input-height-max); overflow: auto; background-color: var(--theme--background); - border: var(--border-width) solid var(--border-normal); - border-radius: var(--border-radius); + border: var(--theme--border-width) solid var(--theme--form--field--input--border-color); + border-radius: var(--theme--border-radius); } .search { @@ -110,7 +110,7 @@ const searchDebounced = ref(''); padding: 4px 8px; text-align: right; background-color: var(--theme--background); - border-top-left-radius: var(--border-radius); + border-top-left-radius: var(--theme--border-radius); } .footer > button { diff --git a/app/src/interfaces/select-multiple-checkbox/select-multiple-checkbox.vue b/app/src/interfaces/select-multiple-checkbox/select-multiple-checkbox.vue index 42f43dec43..c79a1d858d 100644 --- a/app/src/interfaces/select-multiple-checkbox/select-multiple-checkbox.vue +++ b/app/src/interfaces/select-multiple-checkbox/select-multiple-checkbox.vue @@ -194,8 +194,8 @@ const { otherValues, addOtherValue, setOtherValue } = useCustomSelectionMultiple width: 100%; height: var(--input-height); padding: 10px; - border: 2px dashed var(--border-normal); - border-radius: var(--border-radius); + border: 2px dashed var(--theme--form--field--input--border-color); + border-radius: var(--theme--border-radius); input { display: block; diff --git a/app/src/interfaces/select-radio/select-radio.vue b/app/src/interfaces/select-radio/select-radio.vue index 212a0310ff..0b51796a1c 100644 --- a/app/src/interfaces/select-radio/select-radio.vue +++ b/app/src/interfaces/select-radio/select-radio.vue @@ -138,8 +138,8 @@ const customIcon = computed(() => { width: 100%; height: var(--input-height); padding: 10px; - border: 2px dashed var(--border-normal); - border-radius: var(--border-radius); + border: 2px dashed var(--theme--form--field--input--border-color); + border-radius: var(--theme--border-radius); input { display: block; diff --git a/app/src/interfaces/translations/language-select.vue b/app/src/interfaces/translations/language-select.vue index 392bbfc929..1f110f83a6 100644 --- a/app/src/interfaces/translations/language-select.vue +++ b/app/src/interfaces/translations/language-select.vue @@ -63,7 +63,7 @@ const displayValue = computed(() => { color: var(--theme--primary); text-align: left; background-color: var(--theme--primary-background); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); .display-value { flex-grow: 1; diff --git a/app/src/layouts/cards/components/card.vue b/app/src/layouts/cards/components/card.vue index 401fb607e4..ccb8b39693 100644 --- a/app/src/layouts/cards/components/card.vue +++ b/app/src/layouts/cards/components/card.vue @@ -149,7 +149,7 @@ function handleClick() { border-color: var(--theme--primary-subdued); border-style: solid; border-width: 0px; - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); transition: border-width var(--fast) var(--transition); &::after { diff --git a/app/src/layouts/cards/components/header.vue b/app/src/layouts/cards/components/header.vue index 0603758b69..183fd68c69 100644 --- a/app/src/layouts/cards/components/header.vue +++ b/app/src/layouts/cards/components/header.vue @@ -127,8 +127,8 @@ function toggleDescending() { margin-bottom: 36px; padding: 0 8px; background-color: var(--theme--background); - border-top: var(--border-width) solid var(--border-subdued); - border-bottom: var(--border-width) solid var(--border-subdued); + border-top: var(--theme--border-width) solid var(--border-subdued); + border-bottom: var(--theme--border-width) solid var(--border-subdued); box-shadow: 0 0 0 2px var(--theme--background); } diff --git a/app/src/layouts/kanban/kanban.vue b/app/src/layouts/kanban/kanban.vue index 15e4c06ad5..926e0539fb 100644 --- a/app/src/layouts/kanban/kanban.vue +++ b/app/src/layouts/kanban/kanban.vue @@ -220,13 +220,13 @@ const textFieldConfiguration = computed(() => { width: 320px; padding: 8px 0; background-color: var(--background-normal); - border: var(--border-width) solid var(--border-normal); - border-radius: var(--border-radius); + border: var(--theme--border-width) solid var(--theme--form--field--input--border-color); + border-radius: var(--theme--border-radius); margin-right: 20px; transition: border-color var(--transition) var(--fast); &:active { - border-color: var(--border-normal-alt); + border-color: var(--theme--form--field--input--border-color-hover); cursor: move; } @@ -261,7 +261,7 @@ const textFieldConfiguration = computed(() => { font-size: 12px; line-height: 20px; background-color: var(--background-normal-alt); - border-radius: 12px; //var(--border-radius); + border-radius: 12px; //var(--theme--border-radius); } .actions { @@ -288,7 +288,7 @@ const textFieldConfiguration = computed(() => { margin: 2px 16px 6px 16px; padding: 12px 16px; background-color: var(--theme--background); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); box-shadow: 0px 2px 4px 0px rgba(var(--card-shadow-color), 0.1); &:hover .title { @@ -317,7 +317,7 @@ const textFieldConfiguration = computed(() => { .image { width: 100%; margin-top: 10px; - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); margin-top: 4px; max-height: 300px; } @@ -385,8 +385,8 @@ const textFieldConfiguration = computed(() => { .add-group { cursor: pointer; padding: 8px 8px; - border: var(--border-width) dashed var(--border-subdued); - border-radius: var(--border-radius); + border: var(--theme--border-width) dashed var(--border-subdued); + border-radius: var(--theme--border-radius); transition: border-color var(--transition) var(--fast); .v-icon { diff --git a/app/src/layouts/map/map.vue b/app/src/layouts/map/map.vue index e7f8a1e4af..db3cac8489 100644 --- a/app/src/layouts/map/map.vue +++ b/app/src/layouts/map/map.vue @@ -137,7 +137,7 @@ limitWritable.value = selectedSize; .v-info { padding: 40px; background-color: var(--theme--background); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); box-shadow: var(--card-shadow); pointer-events: none; } @@ -189,7 +189,7 @@ limitWritable.value = selectedSize; font-size: 14px; font-family: var(--theme--font-family-sans-serif); background-color: var(--theme--background); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); box-shadow: var(--card-shadow); transform: translate(-50%, -140%); pointer-events: none; @@ -207,8 +207,8 @@ limitWritable.value = selectedSize; padding: 10px; color: var(--theme--foreground-subdued); background-color: var(--theme--background); - border: var(--border-width) solid var(--theme--background); - border-radius: var(--border-radius); + border: var(--theme--border-width) solid var(--theme--background); + border-radius: var(--theme--border-radius); box-shadow: 0 0 3px 1px rgba(0, 0, 0, 0.1); span { diff --git a/app/src/modules/content/components/version-promote-drawer.vue b/app/src/modules/content/components/version-promote-drawer.vue index 81410ffe57..74ff1d076a 100644 --- a/app/src/modules/content/components/version-promote-drawer.vue +++ b/app/src/modules/content/components/version-promote-drawer.vue @@ -283,7 +283,7 @@ function useTab() { } &.main { - border-radius: var(--border-radius) var(--border-radius) 0 0; + border-radius: var(--theme--border-radius) var(--theme--border-radius) 0 0; &.active { color: var(--theme--secondary); background-color: var(--secondary-alt); @@ -297,7 +297,7 @@ function useTab() { } &.current { - border-radius: 0 0 var(--border-radius) var(--border-radius); + border-radius: 0 0 var(--theme--border-radius) var(--theme--border-radius); &.active { color: var(--theme--primary); background-color: var(--theme--primary-background); diff --git a/app/src/modules/insights/routes/overview.vue b/app/src/modules/insights/routes/overview.vue index ef3d7f4ff4..437a1f45e3 100644 --- a/app/src/modules/insights/routes/overview.vue +++ b/app/src/modules/insights/routes/overview.vue @@ -421,8 +421,8 @@ async function batchDelete() { diff --git a/app/src/modules/settings/routes/roles/item/components/permissions-overview.vue b/app/src/modules/settings/routes/roles/item/components/permissions-overview.vue index 14b2849aef..b83a950417 100644 --- a/app/src/modules/settings/routes/roles/item/components/permissions-overview.vue +++ b/app/src/modules/settings/routes/roles/item/components/permissions-overview.vue @@ -210,8 +210,8 @@ function useReset() { .table { max-width: 792px; background-color: var(--theme--form--field--input--background); - border: var(--border-width) solid var(--border-normal); - border-radius: var(--border-radius); + border: var(--theme--border-width) solid var(--theme--form--field--input--border-color); + border-radius: var(--theme--border-radius); } .system-toggle { diff --git a/app/src/modules/settings/routes/roles/permissions-detail/components/fields.vue b/app/src/modules/settings/routes/roles/permissions-detail/components/fields.vue index f90480928c..e8a86af27d 100644 --- a/app/src/modules/settings/routes/roles/permissions-detail/components/fields.vue +++ b/app/src/modules/settings/routes/roles/permissions-detail/components/fields.vue @@ -109,7 +109,7 @@ const fields = computed({ padding: 16px; font-family: var(--theme--font-family-monospace); background-color: var(--background-subdued); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); } } diff --git a/app/src/modules/settings/routes/roles/permissions-detail/components/permissions.vue b/app/src/modules/settings/routes/roles/permissions-detail/components/permissions.vue index 27daf1a346..6d983c1a58 100644 --- a/app/src/modules/settings/routes/roles/permissions-detail/components/permissions.vue +++ b/app/src/modules/settings/routes/roles/permissions-detail/components/permissions.vue @@ -71,7 +71,7 @@ const fields = computed(() => [ padding: 16px; font-family: var(--theme--font-family-monospace); background-color: var(--background-subdued); - border-radius: var(--border-radius); + border-radius: var(--theme--border-radius); } } diff --git a/app/src/modules/users/routes/item.vue b/app/src/modules/users/routes/item.vue index d31aa5c0ab..de724341b7 100644 --- a/app/src/modules/users/routes/item.vue +++ b/app/src/modules/users/routes/item.vue @@ -460,7 +460,7 @@ function revert(values: Record) { margin-bottom: var(--form-vertical-gap); padding: 20px; background-color: var(--background-normal); - border-radius: calc(var(--border-radius) + 4px); + border-radius: calc(var(--theme--border-radius) + 4px); .avatar { --v-icon-color: var(--theme--foreground-subdued); diff --git a/app/src/panels/bar-chart/panel-bar-chart.vue b/app/src/panels/bar-chart/panel-bar-chart.vue index 03b8e5a396..7196de4efb 100644 --- a/app/src/panels/bar-chart/panel-bar-chart.vue +++ b/app/src/panels/bar-chart/panel-bar-chart.vue @@ -337,11 +337,11 @@ function setUpChart() { diff --git a/app/src/panels/metric-list/panel-metric-list.vue b/app/src/panels/metric-list/panel-metric-list.vue index a66f84739f..d12cea755c 100644 --- a/app/src/panels/metric-list/panel-metric-list.vue +++ b/app/src/panels/metric-list/panel-metric-list.vue @@ -199,7 +199,7 @@ function getColor(input) { } .metric-list-item { height: 36px; - border-bottom: var(--border-width) solid var(--border-subdued); + border-bottom: var(--theme--border-width) solid var(--border-subdued); } .metric-list-item:last-child { diff --git a/app/src/panels/pie-chart/panel-pie-chart.vue b/app/src/panels/pie-chart/panel-pie-chart.vue index 233dd67255..ef2915e58e 100644 --- a/app/src/panels/pie-chart/panel-pie-chart.vue +++ b/app/src/panels/pie-chart/panel-pie-chart.vue @@ -283,11 +283,11 @@ function checkMatchingConditionalFill( diff --git a/app/src/views/private/private-view.vue b/app/src/views/private/private-view.vue index 92e1cb0c0c..34bc1d1d8a 100644 --- a/app/src/views/private/private-view.vue +++ b/app/src/views/private/private-view.vue @@ -387,6 +387,7 @@ function getWidth(input: unknown, fallback: number): number { transform: translateX(-100%); transition: transform var(--slow) var(--transition); font-family: var(--theme--navigation--list--font-family); + border-right: var(--theme--navigation--border-width) solid var(--theme--navigation--border-color); &.is-open { transform: translateX(0); @@ -427,7 +428,6 @@ function getWidth(input: unknown, fallback: number): number { } #main-content { - --border-radius: 6px; --input-height: 60px; --input-padding: 16px; /* (60 - 4 - 24) / 2 */ @@ -502,6 +502,10 @@ function getWidth(input: unknown, fallback: number): number { transform: translateX(100%); transition: transform var(--slow) var(--transition); font-family: var(--theme--sidebar--font-family); + border-left: var(--theme--sidebar--border-width) solid var(--theme--sidebar--border-color); + + /* Explicitly render the border outside of the width of the bar itself */ + box-sizing: content-box; .spacer { flex-grow: 1; @@ -522,7 +526,7 @@ function getWidth(input: unknown, fallback: number): number { } @media (min-width: 960px) { - transform: translateX(calc(100% - 60px)); + transform: translateX(calc(100% - 60px - var(--theme--sidebar--border-width))); } @media (min-width: 1260px) { diff --git a/app/src/views/public/public-view.vue b/app/src/views/public/public-view.vue index 5b5f80eb7a..1814c6349d 100644 --- a/app/src/views/public/public-view.vue +++ b/app/src/views/public/public-view.vue @@ -1,7 +1,7 @@