@shohojdhara/atomix 0.5.8 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atomix.css +154 -2568
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +5 -5
- package/dist/atomix.min.css.map +1 -1
- package/dist/atomix.umd.js +1 -1
- package/dist/atomix.umd.js.map +1 -1
- package/dist/atomix.umd.min.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.esm.js +42 -42
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +63 -64
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/index.ts +49 -3
- package/src/styles/02-tools/_tools.background.scss +38 -136
- package/src/styles/05-objects/_objects.masonry-grid.scss +26 -85
package/package.json
CHANGED
package/src/lib/index.ts
CHANGED
|
@@ -13,14 +13,60 @@ export const constants: typeof constantsImport = constantsImport;
|
|
|
13
13
|
export const theme: typeof themeImport = themeImport;
|
|
14
14
|
|
|
15
15
|
// NEW: Export individual modules for direct imports
|
|
16
|
-
export
|
|
16
|
+
// Selectively export to avoid conflicts between modules
|
|
17
|
+
|
|
18
|
+
// Export non-conflicting items
|
|
17
19
|
export * from './constants';
|
|
18
20
|
export * from './constants/cssVariables';
|
|
19
21
|
export * from './types';
|
|
20
22
|
export * from './types/partProps';
|
|
21
23
|
export * from './utils';
|
|
22
24
|
export * from './utils/componentUtils';
|
|
23
|
-
export * from './theme';
|
|
24
25
|
export * from './patterns';
|
|
25
26
|
export * from './hooks';
|
|
26
|
-
|
|
27
|
+
|
|
28
|
+
// Selectively export from composables (avoiding conflicting items)
|
|
29
|
+
export * from './composables/useAccordion';
|
|
30
|
+
export * from './composables/useBadge';
|
|
31
|
+
export * from './composables/useHero';
|
|
32
|
+
export * from './composables/useRiver';
|
|
33
|
+
export * from './composables/useSpinner';
|
|
34
|
+
export * from './composables/useNavbar';
|
|
35
|
+
export * from './composables/useSideMenu';
|
|
36
|
+
export * from './composables/useEdgePanel';
|
|
37
|
+
export * from './composables/useTodo';
|
|
38
|
+
export * from './composables/useForm';
|
|
39
|
+
export * from './composables/useFormGroup';
|
|
40
|
+
export * from './composables/useAtomixGlass';
|
|
41
|
+
export * from './composables/useInput';
|
|
42
|
+
export * from './composables/useRadio';
|
|
43
|
+
export * from './composables/useSelect';
|
|
44
|
+
export * from './composables/useTextarea';
|
|
45
|
+
export * from './composables/useResponsiveGlass';
|
|
46
|
+
export * from './composables/useResponsiveGlass.presets';
|
|
47
|
+
export * from './composables/useChartData';
|
|
48
|
+
export * from './composables/useChartScale';
|
|
49
|
+
export * from './composables/useChartInteraction';
|
|
50
|
+
export * from './composables/useLineChart';
|
|
51
|
+
export * from './composables/useBarChart';
|
|
52
|
+
export * from './composables/usePieChart';
|
|
53
|
+
export * from './composables/useBlock';
|
|
54
|
+
|
|
55
|
+
// Skip usePerformanceMonitor from composables to avoid conflict with theme version
|
|
56
|
+
|
|
57
|
+
// Selectively export from theme (including the conflicting items)
|
|
58
|
+
export * from './theme';
|
|
59
|
+
|
|
60
|
+
// Selectively export from config (excluding ValidationResult to avoid conflict)
|
|
61
|
+
export { validateConfiguration, printConfigReport, loadConfig, validateConfig, loadAtomixConfig, resolveConfigPath } from './config';
|
|
62
|
+
export { defineConfig, type AtomixConfig, type ThemeTokens, type ThemeDefinition,
|
|
63
|
+
type CSSThemeDefinition, type JSThemeDefinition, type ColorScale,
|
|
64
|
+
type PaletteColorOptions, type InteractiveEffectsConfig,
|
|
65
|
+
type OptimizationConfig, type VisualPolishConfig, type BuildConfig,
|
|
66
|
+
type RuntimeConfig, type IntegrationConfig, type PluginConfig,
|
|
67
|
+
type TokenProviderConfig, type TokenEngineConfig, type GeneratorConfig,
|
|
68
|
+
type DesignTokenCategory, type DesignTokenValue } from './config';
|
|
69
|
+
|
|
70
|
+
// Explicitly re-export ValidationResult from config to avoid conflict with theme
|
|
71
|
+
export type { ValidationResult } from './config/validator';
|
|
72
|
+
// But we keep the theme's PerformanceMetrics and usePerformanceMonitor to resolve conflicts
|
|
@@ -1,159 +1,61 @@
|
|
|
1
|
-
@use 'sass:math';
|
|
2
1
|
@use 'sass:color';
|
|
3
|
-
@use 'sass:
|
|
4
|
-
@use 'sass:list';
|
|
2
|
+
@use 'sass:math';
|
|
5
3
|
@use '../01-settings/settings.background' as *;
|
|
6
4
|
@use '../01-settings/settings.colors' as *;
|
|
7
|
-
/* Background utility simplification
|
|
8
|
-
* - Consolidates duplicated glass, mesh, shadow, border, and noise patterns into private helpers.
|
|
9
|
-
* - Replaces magic values with local token aliases backed by existing background settings.
|
|
10
|
-
* - Flattens variant and interaction branching, keeps public mixin signatures intact, and removes old backdrop prefixes.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
$_bg-highlight: $white !default;
|
|
14
|
-
$_bg-shadow: $black !default;
|
|
15
|
-
$_bg-filters: ('glass': blur(12px) saturate(1.4), 'solid': blur(8px), 'mesh': blur(16px)) !default;
|
|
16
|
-
$_bg-motion: ('base': 0.3s, 'press': 0.2s, 'easing': cubic-bezier(0.4, 0, 0.2, 1), 'scale': 0.98) !default;
|
|
17
|
-
$_bg-glass: ('angle': 110deg, 'edge-angle': 180deg, 'edge-stop': 30%, 'ambient-stop': 60%, 'ambient-size': ellipse 120% 80% at 50% 120%) !default;
|
|
18
|
-
$_bg-states: ('base': ('shimmer': (0.08, 0.12, 0.08), 'edge': (0.15, 0.05), 'mix': (0.13, 0, -0.1, 0.03), 'ambient': 0.4), 'hover': ('shimmer': (0.1, 0.15, 0.1), 'edge': (0.18, 0.08), 'mix': (0.16, 0, -0.12, 0.04), 'ambient': 0.5), 'active': ('edge': (0.12, 0.05), 'mix': (0.18, 0, -0.09))) !default;
|
|
19
|
-
$_bg-shadow-ambient: ('base': 0 2px 4px rgba($_bg-shadow, 0.05), 'hover': 0 2px 4px rgba($_bg-shadow, 0.08)) !default;
|
|
20
|
-
|
|
21
|
-
// Changelog: Added a shared color-mix helper so all variants use the same tokenized transparency math.
|
|
22
|
-
@function _bg-mix($color, $weight) { @return color-mix(in srgb, #{$color} #{math.percentage($weight)}, transparent); }
|
|
23
5
|
|
|
24
|
-
|
|
25
|
-
@function _bg-state($state, $group) { @return map.get($_bg-states, $state, $group); }
|
|
26
|
-
@function _bg-surface($state, $transparency) { @return if($state == 'hover', $background-transparency-hover, if($state == 'active', $background-transparency-active, $transparency)); }
|
|
27
|
-
@function _bg-noise-image() { @return url("data:image/svg+xml,%3Csvg viewBox='0 0 #{$background-noise-scale} #{$background-noise-scale}' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' /%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' /%3E%3C/svg%3E"); }
|
|
28
|
-
|
|
29
|
-
// Changelog: Extracted glass background generation so base, hover, and active states reuse one recipe.
|
|
30
|
-
@function _bg-glass($color, $transparency, $state: 'base') {
|
|
31
|
-
$surface: _bg-surface($state, $transparency);
|
|
32
|
-
$edge: _bg-state($state, 'edge');
|
|
33
|
-
$mix: _bg-state($state, 'mix');
|
|
34
|
-
@if $state == 'active' {
|
|
35
|
-
@return linear-gradient(map.get($_bg-glass, 'edge-angle'), rgba($_bg-highlight, list.nth($edge, 1)) 0%, rgba($_bg-highlight, list.nth($edge, 2)) 20%, transparent 40%), linear-gradient($background-gradient-angle, _bg-mix($color, $surface + list.nth($mix, 1)) 0%, _bg-mix($color, $surface + list.nth($mix, 2)) 50%, _bg-mix($color, $surface + list.nth($mix, 3)) 100%);
|
|
36
|
-
}
|
|
37
|
-
$shimmer: _bg-state($state, 'shimmer');
|
|
38
|
-
@return linear-gradient(map.get($_bg-glass, 'angle'), transparent 0%, rgba($_bg-highlight, list.nth($shimmer, 1)) 45%, rgba($_bg-highlight, list.nth($shimmer, 2)) 50%, rgba($_bg-highlight, list.nth($shimmer, 3)) 55%, transparent 100%), linear-gradient(map.get($_bg-glass, 'edge-angle'), rgba($_bg-highlight, list.nth($edge, 1)) 0%, rgba($_bg-highlight, list.nth($edge, 2)) 15%, transparent map.get($_bg-glass, 'edge-stop')), linear-gradient($background-gradient-angle, _bg-mix($color, $surface + list.nth($mix, 1)) 0%, _bg-mix($color, $surface + list.nth($mix, 2)) 40%, _bg-mix($color, $surface + list.nth($mix, 3)) 70%, _bg-mix($color, $surface + list.nth($mix, 4)) 100%), radial-gradient(map.get($_bg-glass, 'ambient-size'), _bg-mix($color, $surface * map.get($_bg-states, $state, 'ambient')) 0%, transparent map.get($_bg-glass, 'ambient-stop'));
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Changelog: Extracted shadow composition so base and hover shadows share one loop and corrected opacity scaling.
|
|
42
|
-
@function _bg-shadows($color, $hover: false) {
|
|
43
|
-
$shadows: (inset 0 1px 0 rgba($_bg-highlight, if($hover, 0.15, 0.1)));
|
|
44
|
-
$multiplier: if($hover, 1.5, 1);
|
|
45
|
-
@for $i from 1 through $background-shadow-layers {
|
|
46
|
-
$blur: $background-shadow-blur-base * $i * $multiplier;
|
|
47
|
-
$opacity: math.div($background-shadow-intensity, $i) * $multiplier;
|
|
48
|
-
$shadows: list.append($shadows, 0 $blur ($blur * 2) if($i == 1, $background-shadow-spread, 0) _bg-mix($color, $opacity), comma);
|
|
49
|
-
}
|
|
50
|
-
@return list.append($shadows, map.get($_bg-shadow-ambient, if($hover, 'hover', 'base')), comma);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Changelog: Extracted a shared overlay scaffold so border, noise, and shimmer pseudo-elements stay aligned.
|
|
54
|
-
@mixin _bg-overlay($z) { content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; z-index: $z; }
|
|
55
|
-
|
|
56
|
-
// Changelog: Moved the glass border effect into a private helper to remove duplicate pseudo-element declarations.
|
|
57
|
-
@mixin _bg-border() {
|
|
58
|
-
&::before { @include _bg-overlay(1); padding: $background-border-width; background: linear-gradient($background-gradient-angle, rgba($_bg-highlight, $background-border-opacity * 1.2) 0%, rgba($_bg-highlight, $background-border-opacity * 0.6) 50%, rgba($_bg-highlight, $background-border-opacity * 0.3) 100%); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Changelog: Moved the noise overlay into a helper so the SVG asset and sizing are defined once.
|
|
62
|
-
@mixin _bg-noise() {
|
|
63
|
-
&::after { @include _bg-overlay(2); opacity: $background-noise-opacity; background-image: _bg-noise-image(); background-size: #{$background-noise-scale}px; mix-blend-mode: overlay; }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Changelog: Moved the shimmer overlay into a helper so the variant branch only selects the effect.
|
|
67
|
-
@mixin _bg-shimmer() {
|
|
68
|
-
overflow: hidden;
|
|
69
|
-
&::before { @include _bg-overlay(1); background: linear-gradient(map.get($_bg-glass, 'angle'), transparent 0%, rgba($_bg-highlight, $background-shimmer-intensity) 50%, transparent 100%); transform: translateX(-100%); animation: shimmer $background-shimmer-duration infinite; }
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Changelog: Rebuilt the main utility mixin around private helpers to preserve the API while removing nesting and redundancy.
|
|
73
|
-
/// Dynamic background mixin with glass morphism effects
|
|
6
|
+
/// Simplified dynamic background mixin - only basic background color features
|
|
74
7
|
/// @param {Color} $color - Base color for the background
|
|
75
|
-
/// @param {Number} $transparency [
|
|
76
|
-
/// @param {Boolean} $enable-transparency [
|
|
77
|
-
/// @param {Boolean} $enable-gradient [
|
|
78
|
-
/// @param {Boolean} $enable-shadow [
|
|
79
|
-
/// @param {Boolean} $enable-border [false] - Enable border gradient
|
|
80
|
-
/// @param {Boolean} $enable-noise [false] - Enable noise texture
|
|
81
|
-
/// @param {String} $variant ['
|
|
8
|
+
/// @param {Number} $transparency [$background-transparency] - Transparency level (0-1)
|
|
9
|
+
/// @param {Boolean} $enable-transparency [$background-transparency-enable] - Enable transparency effects
|
|
10
|
+
/// @param {Boolean} $enable-gradient [false] - Enable gradient overlay (ignored in simplified version)
|
|
11
|
+
/// @param {Boolean} $enable-shadow [false] - Enable shadow layers (ignored)
|
|
12
|
+
/// @param {Boolean} $enable-border [false] - Enable border gradient (ignored)
|
|
13
|
+
/// @param {Boolean} $enable-noise [false] - Enable noise texture (ignored)
|
|
14
|
+
/// @param {String} $variant ['solid'] - Variant type (ignored, all treated as solid)
|
|
82
15
|
@mixin dynamic-background(
|
|
83
16
|
$color,
|
|
84
17
|
$transparency: $background-transparency,
|
|
85
18
|
$enable-transparency: $background-transparency-enable,
|
|
86
|
-
$enable-gradient:
|
|
87
|
-
$enable-shadow:
|
|
19
|
+
$enable-gradient: false,
|
|
20
|
+
$enable-shadow: false,
|
|
88
21
|
$enable-border: false,
|
|
89
|
-
$enable-noise:
|
|
90
|
-
$variant: '
|
|
22
|
+
$enable-noise: false,
|
|
23
|
+
$variant: 'solid'
|
|
91
24
|
) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
backdrop-filter: map.get($_bg-filters, 'glass');
|
|
98
|
-
} @else if $enable-transparency {
|
|
99
|
-
background-color: _bg-mix($color, $transparency);
|
|
100
|
-
backdrop-filter: map.get($_bg-filters, 'solid');
|
|
101
|
-
} @else {
|
|
102
|
-
background-color: $color;
|
|
103
|
-
}
|
|
104
|
-
@if $enable-border { @include _bg-border(); }
|
|
105
|
-
@if $enable-noise { @include _bg-noise(); }
|
|
106
|
-
} @else if $variant == 'solid' {
|
|
107
|
-
background: if($enable-gradient, linear-gradient($background-gradient-angle, color.adjust($color, $lightness: 5%) 0%, $color 50%, color.adjust($color, $lightness: -5%) 100%), $color);
|
|
108
|
-
} @else if $variant == 'mesh' {
|
|
109
|
-
background: radial-gradient(circle at 20% 30%, _bg-mix($color, 0.4) 0%, transparent 50%), radial-gradient(circle at 80% 70%, _bg-mix($color, 0.35) 0%, transparent 50%), radial-gradient(circle at 50% 50%, _bg-mix($color, $transparency) 0%, _bg-mix($color, 0.39) 100%);
|
|
110
|
-
backdrop-filter: map.get($_bg-filters, 'mesh');
|
|
111
|
-
} @else if $variant == 'shimmer' {
|
|
112
|
-
background: _bg-mix($color, 0.75);
|
|
113
|
-
@include _bg-shimmer();
|
|
114
|
-
}
|
|
115
|
-
@if $enable-shadow { box-shadow: _bg-shadows($color); }
|
|
116
|
-
transition: background map.get($_bg-motion, 'base') map.get($_bg-motion, 'easing'), box-shadow map.get($_bg-motion, 'base') map.get($_bg-motion, 'easing');
|
|
117
|
-
@if $background-enable-hover-effects {
|
|
118
|
-
@media (hover: hover) {
|
|
119
|
-
&:hover {
|
|
120
|
-
@if $variant == 'glass' and $enable-transparency { background: _bg-glass($color, $transparency, 'hover'); }
|
|
121
|
-
@if $enable-shadow { box-shadow: _bg-shadows($color, true); }
|
|
122
|
-
}
|
|
123
|
-
}
|
|
25
|
+
// Only support basic background color with optional transparency
|
|
26
|
+
@if $enable-transparency {
|
|
27
|
+
background-color: color-mix(in srgb, #{$color} #{math.percentage($transparency)}, transparent);
|
|
28
|
+
} @else {
|
|
29
|
+
background-color: $color;
|
|
124
30
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Changelog: Kept the public animation name intact while trimming it to the minimal required transform states.
|
|
131
|
-
@keyframes shimmer {
|
|
132
|
-
from { transform: translateX(-100%); }
|
|
133
|
-
to { transform: translateX(200%); }
|
|
31
|
+
|
|
32
|
+
// All other features (gradient, shadow, border, noise, variants) are ignored
|
|
33
|
+
// This keeps the implementation focused purely on background color features
|
|
134
34
|
}
|
|
135
35
|
|
|
136
|
-
|
|
137
|
-
/// Simplified dynamic background for quick usage
|
|
36
|
+
/// Glass background - simplified to basic transparent background
|
|
138
37
|
/// @param {Color} $color - Base color
|
|
139
|
-
/// @param {Number} $transparency [
|
|
38
|
+
/// @param {Number} $transparency [$background-transparency] - Transparency level
|
|
140
39
|
@mixin glass-background($color, $transparency: $background-transparency) {
|
|
141
|
-
@include dynamic-background($color, $transparency, true,
|
|
40
|
+
@include dynamic-background($color, $transparency, true, false, false, false, false, 'solid');
|
|
142
41
|
}
|
|
143
42
|
|
|
144
|
-
|
|
145
|
-
/// Solid background with subtle gradient
|
|
43
|
+
/// Solid background - simplified to basic solid background
|
|
146
44
|
/// @param {Color} $color - Base color
|
|
147
|
-
@mixin solid-background($color) {
|
|
45
|
+
@mixin solid-background($color) {
|
|
46
|
+
@include dynamic-background($color, 0, false, false, false, false, false, 'solid');
|
|
47
|
+
}
|
|
148
48
|
|
|
149
|
-
|
|
150
|
-
/// Mesh gradient background
|
|
49
|
+
/// Mesh background - simplified to basic transparent background
|
|
151
50
|
/// @param {Color} $color - Base color
|
|
152
|
-
/// @param {Number} $transparency [
|
|
153
|
-
@mixin mesh-background($color, $transparency: $background-transparency) {
|
|
51
|
+
/// @param {Number} $transparency [$background-transparency] - Transparency level
|
|
52
|
+
@mixin mesh-background($color, $transparency: $background-transparency) {
|
|
53
|
+
@include dynamic-background($color, $transparency, true, false, false, false, false, 'solid');
|
|
54
|
+
}
|
|
154
55
|
|
|
155
|
-
|
|
156
|
-
/// Shimmer effect background
|
|
56
|
+
/// Shimmer background - simplified to basic transparent background
|
|
157
57
|
/// @param {Color} $color - Base color
|
|
158
|
-
/// @param {Number} $transparency [
|
|
159
|
-
@mixin shimmer-background($color, $transparency: $background-transparency) {
|
|
58
|
+
/// @param {Number} $transparency [$background-transparency] - Transparency level
|
|
59
|
+
@mixin shimmer-background($color, $transparency: $background-transparency) {
|
|
60
|
+
@include dynamic-background($color, $transparency, true, false, false, false, false, 'solid');
|
|
61
|
+
}
|
|
@@ -12,28 +12,31 @@
|
|
|
12
12
|
display: grid;
|
|
13
13
|
gap: masonry.$masonry-grid-gap;
|
|
14
14
|
// Use auto-fit with minmax for responsive columns
|
|
15
|
-
grid-template-columns: repeat(
|
|
16
|
-
|
|
15
|
+
grid-template-columns: repeat(
|
|
16
|
+
auto-fit,
|
|
17
|
+
minmax(var(--atomix-masonry-min-column-width, 250px), 1fr)
|
|
18
|
+
);
|
|
19
|
+
|
|
17
20
|
// Mobile-first responsive adjustments
|
|
18
21
|
@include mq.media-up('sm') {
|
|
19
22
|
gap: masonry.$masonry-grid-gap-sm;
|
|
20
23
|
}
|
|
21
|
-
|
|
24
|
+
|
|
22
25
|
@include mq.media-up('md') {
|
|
23
26
|
gap: masonry.$masonry-grid-gap;
|
|
24
27
|
}
|
|
25
|
-
|
|
28
|
+
|
|
26
29
|
@include mq.media-up('lg') {
|
|
27
30
|
gap: masonry.$masonry-grid-gap-lg;
|
|
28
31
|
}
|
|
29
|
-
|
|
32
|
+
|
|
30
33
|
.o-masonry-grid__item {
|
|
31
34
|
// CSS Grid items don't need position: absolute
|
|
32
35
|
position: static;
|
|
33
36
|
opacity: 1;
|
|
34
37
|
visibility: visible;
|
|
35
38
|
width: 100%;
|
|
36
|
-
|
|
39
|
+
|
|
37
40
|
// Enhanced accessibility for CSS Grid
|
|
38
41
|
&:focus {
|
|
39
42
|
outline: masonry.$masonry-grid-focus-ring-width solid masonry.$masonry-grid-focus-ring-color;
|
|
@@ -64,10 +67,6 @@
|
|
|
64
67
|
&--animate {
|
|
65
68
|
.o-masonry-grid__item {
|
|
66
69
|
transition: masonry.$masonry-grid-item-transition;
|
|
67
|
-
// Modern CSS custom property for fine-grained animation control
|
|
68
|
-
@supports (transition-behavior: allow-discrete) {
|
|
69
|
-
transition-behavior: allow-discrete;
|
|
70
|
-
}
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
72
|
|
|
@@ -77,16 +76,17 @@
|
|
|
77
76
|
width: 100%;
|
|
78
77
|
// Design system color tokens for background
|
|
79
78
|
background-color: var(--#{config.$prefix}body-bg);
|
|
80
|
-
|
|
79
|
+
|
|
81
80
|
// Enhanced focus states with design system tokens
|
|
82
81
|
&:focus {
|
|
83
82
|
outline: masonry.$masonry-grid-focus-ring-width solid masonry.$masonry-grid-focus-ring-color;
|
|
84
83
|
outline-offset: masonry.$masonry-grid-focus-ring-offset;
|
|
85
84
|
z-index: masonry.$masonry-grid-z-index-focus;
|
|
86
|
-
|
|
85
|
+
|
|
87
86
|
// Subtle scale effect for better visual feedback
|
|
88
87
|
transform: scale(1.02);
|
|
89
|
-
transition: transform var(--#{config.$prefix}transition-duration-fast)
|
|
88
|
+
transition: transform var(--#{config.$prefix}transition-duration-fast)
|
|
89
|
+
var(--#{config.$prefix}transition-timing-base);
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
// High contrast mode support
|
|
@@ -100,17 +100,13 @@
|
|
|
100
100
|
&:not([style*='position: absolute']) {
|
|
101
101
|
opacity: 0;
|
|
102
102
|
visibility: hidden;
|
|
103
|
-
// Use CSS Custom Property for progressive enhancement
|
|
104
|
-
@supports (view-transition-name: masonry-item) {
|
|
105
|
-
view-transition-name: masonry-item;
|
|
106
|
-
}
|
|
107
103
|
}
|
|
108
104
|
}
|
|
109
105
|
|
|
110
106
|
// Loading states with modern design system colors
|
|
111
107
|
&__item-loading {
|
|
112
108
|
position: relative;
|
|
113
|
-
|
|
109
|
+
|
|
114
110
|
&::before {
|
|
115
111
|
content: '';
|
|
116
112
|
position: absolute;
|
|
@@ -122,45 +118,24 @@
|
|
|
122
118
|
background: var(--#{config.$prefix}gray-10);
|
|
123
119
|
z-index: masonry.$masonry-grid-z-index-loading;
|
|
124
120
|
border-radius: var(--#{config.$prefix}border-radius-sm);
|
|
125
|
-
|
|
126
|
-
//
|
|
127
|
-
|
|
121
|
+
|
|
122
|
+
// Simple fade-in
|
|
123
|
+
opacity: 0;
|
|
128
124
|
}
|
|
129
125
|
|
|
130
126
|
img {
|
|
131
127
|
opacity: 0;
|
|
132
|
-
// CSS @property for smoother opacity transitions
|
|
133
|
-
@supports (property: opacity) and (animation-timeline: view()) {
|
|
134
|
-
opacity: var(--masonry-img-opacity);
|
|
135
|
-
@property --masonry-img-opacity {
|
|
136
|
-
syntax: '<number>';
|
|
137
|
-
inherits: false;
|
|
138
|
-
initial-value: 0;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
128
|
}
|
|
142
129
|
}
|
|
143
130
|
|
|
144
|
-
//
|
|
131
|
+
// Loaded state
|
|
145
132
|
&__item-loaded {
|
|
146
133
|
img {
|
|
147
|
-
|
|
148
|
-
animation: masonry-item-fade-in masonry.$masonry-grid-item-animation-duration masonry.$masonry-grid-item-animation-timing forwards;
|
|
149
|
-
|
|
150
|
-
// CSS @property for precise opacity control
|
|
151
|
-
@supports (property: opacity) and (animation-timeline: view()) {
|
|
152
|
-
opacity: var(--masonry-img-opacity);
|
|
153
|
-
animation: masonry-item-fade-in-advanced masonry.$masonry-grid-item-animation-duration masonry.$masonry-grid-item-animation-timing forwards;
|
|
154
|
-
@property --masonry-img-opacity {
|
|
155
|
-
syntax: '<number>';
|
|
156
|
-
inherits: false;
|
|
157
|
-
initial-value: 0;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
134
|
+
opacity: 1;
|
|
160
135
|
}
|
|
161
136
|
}
|
|
162
137
|
|
|
163
|
-
//
|
|
138
|
+
// Simple loading indicator
|
|
164
139
|
&--loading-images {
|
|
165
140
|
position: relative;
|
|
166
141
|
|
|
@@ -177,7 +152,7 @@
|
|
|
177
152
|
animation: masonry-spinner 0.8s linear infinite;
|
|
178
153
|
z-index: masonry.$masonry-grid-z-index-loading;
|
|
179
154
|
pointer-events: none;
|
|
180
|
-
|
|
155
|
+
|
|
181
156
|
// Dark mode support
|
|
182
157
|
@media (prefers-color-scheme: dark) {
|
|
183
158
|
border-color: rgba(255, 255, 255, 0.1);
|
|
@@ -190,45 +165,11 @@
|
|
|
190
165
|
@include mq.media-up('md') {
|
|
191
166
|
min-height: masonry.$masonry-grid-min-height-desktop;
|
|
192
167
|
}
|
|
168
|
+
}
|
|
193
169
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
@keyframes masonry-loading-fade-in {
|
|
202
|
-
from {
|
|
203
|
-
opacity: 0;
|
|
204
|
-
transform: scale(0.95);
|
|
205
|
-
}
|
|
206
|
-
to {
|
|
207
|
-
opacity: 1;
|
|
208
|
-
transform: scale(1);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
@keyframes masonry-item-fade-in {
|
|
213
|
-
from {
|
|
214
|
-
opacity: 0;
|
|
215
|
-
transform: translateY(20px);
|
|
216
|
-
}
|
|
217
|
-
to {
|
|
218
|
-
opacity: 1;
|
|
219
|
-
transform: translateY(0);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// Advanced animation with CSS @property for smooth transitions
|
|
224
|
-
@keyframes masonry-item-fade-in-advanced {
|
|
225
|
-
from {
|
|
226
|
-
--masonry-img-opacity: 0;
|
|
227
|
-
transform: translateY(20px) scale(0.95);
|
|
228
|
-
}
|
|
229
|
-
to {
|
|
230
|
-
--masonry-img-opacity: 1;
|
|
231
|
-
transform: translateY(0) scale(1);
|
|
232
|
-
}
|
|
170
|
+
// Simple spinner animation
|
|
171
|
+
@keyframes masonry-spinner {
|
|
172
|
+
to {
|
|
173
|
+
transform: rotate(360deg);
|
|
233
174
|
}
|
|
234
175
|
}
|