diff --git a/.changeset/scss-review-fixes.md b/.changeset/scss-review-fixes.md
new file mode 100644
index 000000000..49b63b7a9
--- /dev/null
+++ b/.changeset/scss-review-fixes.md
@@ -0,0 +1,5 @@
+---
+'@tabler/core': patch
+---
+
+Fixed `.navbar-expand`, `.btn-link:hover`, `--*-darken`, `.ribbon` fold colors, `.avatar-brand` z-index and dark mode literals.
diff --git a/.changeset/theme-islands-dark-selectors.md b/.changeset/theme-islands-dark-selectors.md
new file mode 100644
index 000000000..239975171
--- /dev/null
+++ b/.changeset/theme-islands-dark-selectors.md
@@ -0,0 +1,5 @@
+---
+'@tabler/core': patch
+---
+
+Fixed light theme islands losing `data-bs-theme-primary` and radius, and added `.theme-dark` to the dark mode selectors.
diff --git a/core/scss/_props.scss b/core/scss/_props.scss
index a0d4c6831..3a089b8f7 100644
--- a/core/scss/_props.scss
+++ b/core/scss/_props.scss
@@ -45,7 +45,7 @@
@each $name, $color in map.merge($theme-colors, $social-colors) {
--#{$name}: #{$color};
--#{$name}-fg: #{if(sass(contrast-ratio($color) > $min-contrast-ratio): var(--light); else: var(--dark))};
- --#{$name}-darken: color-mix(in oklab, var(--#{$name}), transparent 20%);
+ --#{$name}-darken: #{adjust-lightness-css(var(--#{$name}), -6%)};
--#{$name}-lt: color-mix(in oklab, var(--#{$name}) 10%, transparent);
--#{$name}-200: color-mix(in oklab, var(--#{$name}) 20%, transparent);
}
@@ -94,7 +94,7 @@
/** Backdrops */
--backdrop-opacity: #{$backdrop-opacity};
- --backdrop-bg: var(--bg-surface-dark);
+ --backdrop-bg: #{$backdrop-bg};
@each $name, $value in $backdrops {
--backdrop-bg#{if(sass($name): '-#{$name}'; else: '')}: #{$value};
}
diff --git a/core/scss/_variables.scss b/core/scss/_variables.scss
index 3a9e7e660..b59006e48 100644
--- a/core/scss/_variables.scss
+++ b/core/scss/_variables.scss
@@ -505,7 +505,7 @@ $lead-font-weight: var(--font-weight-normal) !default;
$blockquote-margin-y: $spacer !default;
$blockquote-font-size: $font-size-base !default;
-$blockquote-footer-color: $gray-600 !default;
+$blockquote-footer-color: light-dark(var(--gray-600), var(--gray-400)) !default;
$blockquote-footer-font-size: $small-font-size !default;
$initialism-font-size: $small-font-size !default;
@@ -727,6 +727,8 @@ $border-radiuses: (
sm: $border-radius-sm,
md: $border-radius,
lg: $border-radius-lg,
+ xl: $border-radius-xl,
+ xxl: $border-radius-xxl,
pill: $border-radius-pill,
null: var(--border-radius-md),
) !default;
@@ -1093,7 +1095,7 @@ $btn-active-box-shadow: inset 0 3px 5px color-transparent(var(--black), 0.125) !
$btn-link-color: var(--link-color) !default;
$btn-link-hover-color: var(--link-hover-color) !default;
-$btn-link-disabled-color: $gray-600 !default;
+$btn-link-disabled-color: light-dark(var(--gray-600), var(--gray-400)) !default;
$btn-border-radius: var(--border-radius) !default;
$btn-border-radius-sm: var(--border-radius-sm) !default;
@@ -1395,7 +1397,7 @@ $dropdown-link-disabled-color: var(--tertiary-color) !default;
$dropdown-item-padding-y: 0.5rem !default;
$dropdown-item-padding-x: 0.75rem !default;
-$dropdown-header-color: $gray-600 !default;
+$dropdown-header-color: light-dark(var(--gray-600), var(--gray-400)) !default;
$dropdown-header-padding-x: $dropdown-item-padding-x !default;
$dropdown-header-padding-y: $dropdown-padding-y !default;
@@ -1804,8 +1806,8 @@ $table-variants: (
) !default;
$table-sort-bg-image: url("data:image/svg+xml,") !default;
-$table-sort-asc-bg-image: url("data:image/svg+xml,") !default;
-$table-sort-desc-bg-image: url("data:image/svg+xml,") !default;
+$table-sort-asc-bg-image: url("data:image/svg+xml,") !default;
+$table-sort-desc-bg-image: url("data:image/svg+xml,") !default;
$table-sort-icon-size: 1rem !default;
$table-sort-icon-margin-start: 0.25rem !default;
// scss-docs-end table-variables
@@ -2051,7 +2053,7 @@ $form-floating-input-padding-b: 0.625rem !default;
$form-floating-label-height: 1.5em !default;
$form-floating-label-opacity: 0.65 !default;
$form-floating-label-transform: scale(0.85) translateY(-0.5rem) translateX(calc(var(--dir) * 0.15rem)) #{'/*rtl:ignore*/'} !default;
-$form-floating-label-disabled-color: $gray-600 !default;
+$form-floating-label-disabled-color: light-dark(var(--gray-600), var(--gray-400)) !default;
$form-floating-transition:
opacity 0.1s ease-in-out,
transform 0.1s ease-in-out !default;
@@ -2078,16 +2080,8 @@ $form-feedback-font-style: $form-text-font-style !default;
$form-feedback-valid-color: $success !default;
$form-feedback-invalid-color: $danger !default;
-$form-feedback-icon-valid: str-replace(
- url("data:image/svg+xml,"),
- '#',
- '%23'
-) !default;
-$form-feedback-icon-invalid: str-replace(
- url("data:image/svg+xml,"),
- '#',
- '%23'
-) !default;
+$form-feedback-icon-valid: url("data:image/svg+xml,") !default;
+$form-feedback-icon-invalid: url("data:image/svg+xml,") !default;
// Form validation states
// scss-docs-start form-validation-variables
$form-validation-states: (
diff --git a/core/scss/bootstrap/_buttons.scss b/core/scss/bootstrap/_buttons.scss
index 6304c4d95..43a0422fb 100644
--- a/core/scss/bootstrap/_buttons.scss
+++ b/core/scss/bootstrap/_buttons.scss
@@ -17,6 +17,8 @@
--btn-border-width: #{$btn-border-width};
--btn-border-color: transparent;
--btn-border-radius: #{$btn-border-radius};
+ --btn-hover-color: var(--btn-color);
+ --btn-active-color: var(--btn-color);
--btn-hover-border-color: transparent;
--btn-box-shadow: #{$btn-box-shadow};
--btn-disabled-opacity: #{$btn-disabled-opacity};
diff --git a/core/scss/bootstrap/_root.scss b/core/scss/bootstrap/_root.scss
index 2f16d313b..a2946123e 100644
--- a/core/scss/bootstrap/_root.scss
+++ b/core/scss/bootstrap/_root.scss
@@ -3,9 +3,7 @@
@use '../config' as *;
-:root,
-[data-bs-theme='light'],
-[data-theme='light'] {
+:root {
// Note: Custom variable values only support SassScript inside `#{}`.
// Colors
@@ -82,10 +80,6 @@
--tertiary-bg: light-dark(#{$body-tertiary-bg}, #{$body-tertiary-bg-dark});
// scss-docs-end root-body-variables
- // $headings-color is itself light-dark(gray-900, white); the dark-mode block below
- // overrides it to `inherit`, which can't be expressed as a light-dark() branch.
- --heading-color: #{$headings-color};
-
--link-color: light-dark(#{$link-color}, #{$link-color-dark});
--link-decoration: #{$link-decoration};
@@ -139,6 +133,12 @@
// scss-docs-end root-form-validation-variables
}
+:root,
+[data-bs-theme='light'],
+[data-theme='light'] {
+ --heading-color: #{$headings-color};
+}
+
@if $enable-dark-mode {
@include color-mode(dark, true) {
// scss-docs-start root-dark-mode-vars
diff --git a/core/scss/layout/_navbar.scss b/core/scss/layout/_navbar.scss
index 3ba8ff669..dd39172f1 100644
--- a/core/scss/layout/_navbar.scss
+++ b/core/scss/layout/_navbar.scss
@@ -377,35 +377,37 @@ Navbar
$infix: breakpoint-infix($next, $grid-breakpoints);
{$infix} {
- @include media-breakpoint-down(breakpoint-next($breakpoint)) {
- @include navbar-vertical-nav();
+ @if $next {
+ @include media-breakpoint-down($next) {
+ @include navbar-vertical-nav();
- // Below the breakpoint the vertical navbar is a top bar row: toggler,
- // brand, and whatever trails them (a user block, or nothing). Auto
- // margins keep the brand centered either way — space-between alone
- // would push it to the far edge when nothing follows it.
- &.navbar-vertical .navbar-brand {
- margin-inline: auto;
- }
-
- // In the stacked mobile menu nothing pins the trailing group to the
- // bottom, so a small gap marks it as a separate part of the menu.
- &.navbar-vertical .navbar-side {
- margin-top: $sidebar-inset;
- }
-
- // Below the breakpoint the navbar-footer sits in the top bar row:
- // the avatar alone, with its menu dropping down instead of up.
- .navbar-footer {
- .nav-link-title {
- display: none;
+ // Below the breakpoint the vertical navbar is a top bar row: toggler,
+ // brand, and whatever trails them (a user block, or nothing). Auto
+ // margins keep the brand centered either way — space-between alone
+ // would push it to the far edge when nothing follows it.
+ &.navbar-vertical .navbar-brand {
+ margin-inline: auto;
}
- .dropup .dropdown-menu {
- inset-inline-start: auto;
- inset-inline-end: 0;
- top: 100%;
- bottom: auto;
+ // In the stacked mobile menu nothing pins the trailing group to the
+ // bottom, so a small gap marks it as a separate part of the menu.
+ &.navbar-vertical .navbar-side {
+ margin-top: $sidebar-inset;
+ }
+
+ // Below the breakpoint the navbar-footer sits in the top bar row:
+ // the avatar alone, with its menu dropping down instead of up.
+ .navbar-footer {
+ .nav-link-title {
+ display: none;
+ }
+
+ .dropup .dropdown-menu {
+ inset-inline-start: auto;
+ inset-inline-end: 0;
+ top: 100%;
+ bottom: auto;
+ }
}
}
}
diff --git a/core/scss/mixins/bootstrap/_color-mode.scss b/core/scss/mixins/bootstrap/_color-mode.scss
index b8888180c..22fde050c 100644
--- a/core/scss/mixins/bootstrap/_color-mode.scss
+++ b/core/scss/mixins/bootstrap/_color-mode.scss
@@ -15,6 +15,12 @@
@content;
}
}
+ } @else if $mode == dark {
+ .theme-dark,
+ [data-bs-theme='dark'],
+ [data-theme='dark'] {
+ @content;
+ }
} @else {
[data-bs-theme='#{$mode}'],
[data-theme='#{$mode}'] {
diff --git a/core/scss/tests/_color-mode.test.scss b/core/scss/tests/_color-mode.test.scss
index dc3d5d269..4ea5dca08 100644
--- a/core/scss/tests/_color-mode.test.scss
+++ b/core/scss/tests/_color-mode.test.scss
@@ -8,7 +8,7 @@
@use '../mixins/bootstrap/color-mode' as *;
@include describe('color-mode') {
- @include it('scopes content under the theme attribute selectors') {
+ @include it('scopes dark content under the theme class and attribute selectors') {
@include assert() {
@include output() {
@include color-mode(dark) {
@@ -18,6 +18,7 @@
}
}
@include expect() {
+ .theme-dark .x,
[data-bs-theme='dark'] .x,
[data-theme='dark'] .x {
color: red;
@@ -25,4 +26,22 @@
}
}
}
+
+ @include it('scopes light content under the theme attribute selectors only') {
+ @include assert() {
+ @include output() {
+ @include color-mode(light) {
+ .x {
+ color: red;
+ }
+ }
+ }
+ @include expect() {
+ [data-bs-theme='light'] .x,
+ [data-theme='light'] .x {
+ color: red;
+ }
+ }
+ }
+ }
}
diff --git a/core/scss/ui/_alerts.scss b/core/scss/ui/_alerts.scss
index 88175aad6..8a1517129 100644
--- a/core/scss/ui/_alerts.scss
+++ b/core/scss/ui/_alerts.scss
@@ -68,8 +68,8 @@
.btn-close {
position: absolute;
- inset-inline-end: calc(var(--alert-padding-y) / 2 - 1px);
- top: calc(var(--alert-padding-x) / 2 - 1px);
+ inset-inline-end: calc(var(--alert-padding-x) / 2 - 1px);
+ top: calc(var(--alert-padding-y) / 2 - 1px);
z-index: 1;
padding: calc(var(--alert-padding-y) * 1.25) var(--alert-padding-x);
}
diff --git a/core/scss/ui/_avatars.scss b/core/scss/ui/_avatars.scss
index b122fddc7..111c5ab08 100644
--- a/core/scss/ui/_avatars.scss
+++ b/core/scss/ui/_avatars.scss
@@ -163,7 +163,7 @@
position: absolute;
inset-inline-end: var(--avatar-brand-offset);
bottom: var(--avatar-brand-offset);
- z-index: 1000;
+ z-index: 1;
width: var(--avatar-brand-size);
height: var(--avatar-brand-size);
background: var(--bg-surface);
diff --git a/core/scss/ui/_buttons.scss b/core/scss/ui/_buttons.scss
index 0dd72794c..fc060feea 100644
--- a/core/scss/ui/_buttons.scss
+++ b/core/scss/ui/_buttons.scss
@@ -76,7 +76,7 @@
}
&:hover {
- color: $link-hover-color;
+ color: #{$btn-link-hover-color};
border-color: transparent;
}
}
diff --git a/core/scss/ui/_calendars.scss b/core/scss/ui/_calendars.scss
index bfbe8b841..c7f5e2b35 100644
--- a/core/scss/ui/_calendars.scss
+++ b/core/scss/ui/_calendars.scss
@@ -50,7 +50,7 @@
width: var(--calendar-date-size);
height: var(--calendar-date-size);
line-height: var(--calendar-date-size);
- color: #66758c;
+ color: var(--secondary-color);
text-align: center;
text-decoration: none;
white-space: nowrap;
@@ -65,7 +65,7 @@
&:hover {
color: var(--primary);
text-decoration: none;
- background: #fefeff;
+ background: var(--bg-surface);
border-color: var(--border-color);
}
diff --git a/core/scss/ui/_cards.scss b/core/scss/ui/_cards.scss
index 96f18cb30..46118773d 100644
--- a/core/scss/ui/_cards.scss
+++ b/core/scss/ui/_cards.scss
@@ -623,7 +623,7 @@ Card list group
}
&.active {
- color: $headings-color;
+ color: var(--heading-color, var(--emphasis-color));
background: var(--card-bg, var(--bg-surface));
border-bottom-color: transparent;
}
@@ -697,8 +697,8 @@ Card list group
Card note
*/
.card-note {
- --card-bg: #fff7dd;
- --card-border-color: #fff1c9;
+ --card-bg: #{mix-color-css(var(--yellow), var(--bg-surface), 12%)};
+ --card-border-color: #{mix-color-css(var(--yellow), var(--bg-surface), 20%)};
}
/**
diff --git a/core/scss/ui/_forms.scss b/core/scss/ui/_forms.scss
index b19f2c66d..626977e30 100644
--- a/core/scss/ui/_forms.scss
+++ b/core/scss/ui/_forms.scss
@@ -221,17 +221,6 @@ Upload files
border-inline-start: 0;
}
-/**
-Floating inputs
- */
-// Fix for the bug in twbs/bootstrap v5.3.3. Issue #39080. Should be fixed in v5.3.4
-label[for='floating-input'] {
- max-width: 100%;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
/**
Forms on mobile devices
*/
diff --git a/core/scss/ui/_modals.scss b/core/scss/ui/_modals.scss
index f30aca481..bb1ae182b 100644
--- a/core/scss/ui/_modals.scss
+++ b/core/scss/ui/_modals.scss
@@ -49,7 +49,7 @@
font-size: $h3-font-size;
font-weight: $headings-font-weight;
line-height: $line-height-base;
- color: $headings-color;
+ color: var(--heading-color, var(--emphasis-color));
}
.modal-footer {
diff --git a/core/scss/ui/_nav.scss b/core/scss/ui/_nav.scss
index 7464b5273..4705eae6b 100644
--- a/core/scss/ui/_nav.scss
+++ b/core/scss/ui/_nav.scss
@@ -113,7 +113,7 @@
}
.nav-link:hover & {
- color: var(--nav-link-hover-icon-color);
+ color: var(--nav-link-hover-icon-color, #{$nav-link-hover-icon-color});
}
}
diff --git a/core/scss/ui/_ribbons.scss b/core/scss/ui/_ribbons.scss
index b84881fdb..0476c6a3e 100644
--- a/core/scss/ui/_ribbons.scss
+++ b/core/scss/ui/_ribbons.scss
@@ -1,5 +1,7 @@
// stylelint-disable declaration-no-important
+@use 'sass:map';
+
@use '../config' as *;
.ribbon {
@@ -50,8 +52,8 @@
border-top-color: transparent;
}
- @if $enable-extra-colors {
- @each $color, $value in $extra-colors {
+ @each $color, $value in $theme-colors {
+ @if $enable-extra-colors or not map.has-key($extra-colors, $color) {
&.bg-#{$color} {
border-color: var(--#{$color});
}
diff --git a/core/scss/ui/_tables.scss b/core/scss/ui/_tables.scss
index f518bc33c..dfe8d50bd 100644
--- a/core/scss/ui/_tables.scss
+++ b/core/scss/ui/_tables.scss
@@ -91,7 +91,7 @@
td {
display: block;
- padding: $table-cell-padding-x $table-cell-padding-y !important;
+ padding: $table-cell-padding-y $table-cell-padding-x !important;
color: var(--body-color) !important;
border: none;
@@ -154,11 +154,11 @@ Table sort
}
&.asc::after {
- mask-image: $table-sort-desc-bg-image;
+ mask-image: $table-sort-asc-bg-image;
}
&.desc::after {
- mask-image: $table-sort-asc-bg-image;
+ mask-image: $table-sort-desc-bg-image;
}
}
diff --git a/core/scss/ui/forms/_form-custom.scss b/core/scss/ui/forms/_form-custom.scss
index c01c81929..5b72608f7 100644
--- a/core/scss/ui/forms/_form-custom.scss
+++ b/core/scss/ui/forms/_form-custom.scss
@@ -15,16 +15,3 @@ Remove the cancel buttons in Chrome and Safari on macOS.
[type='search']::-webkit-search-cancel-button {
appearance: none;
}
-
-/**
-Form control dark theme fix
- */
-.form-control {
- &::file-selector-button {
- background-color: var(--btn-color, #{$form-file-button-bg});
- }
-
- &:hover:not(:disabled):not([readonly])::file-selector-button {
- background-color: var(--btn-color, #{$form-file-button-hover-bg});
- }
-}
diff --git a/core/scss/ui/forms/_form-selectgroup.scss b/core/scss/ui/forms/_form-selectgroup.scss
index 7527e76d9..4a49c5809 100644
--- a/core/scss/ui/forms/_form-selectgroup.scss
+++ b/core/scss/ui/forms/_form-selectgroup.scss
@@ -118,7 +118,7 @@ Alternate version of form select group
*/
.form-selectgroup-boxes {
.form-selectgroup-label {
- padding: $card-spacer-x $card-spacer-y;
+ padding: $card-spacer-y $card-spacer-x;
color: inherit;
text-align: start;
}
diff --git a/core/scss/vendor/_tom-select.scss b/core/scss/vendor/_tom-select.scss
index 2a1e25cc8..82a61ec63 100644
--- a/core/scss/vendor/_tom-select.scss
+++ b/core/scss/vendor/_tom-select.scss
@@ -1,8 +1,6 @@
@use 'sass:map';
@use '../config' as *;
-$input-border-width: 1px;
-
:root {
--ts-pr-clear-button: 0rem;
--ts-pr-caret: 0rem;