mtrl 0.5.2 → 0.5.4
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/components/checkbox/api.d.ts +1 -1
- package/dist/components/checkbox/types.d.ts +17 -6
- package/dist/components/chips/api.d.ts +5 -2
- package/dist/components/chips/chip/api.d.ts +1 -1
- package/dist/components/chips/config.d.ts +5 -1
- package/dist/components/chips/types.d.ts +14 -3
- package/dist/components/index.d.ts +1 -0
- package/dist/components/select/types.d.ts +21 -3
- package/dist/components/switch/types.d.ts +8 -4
- package/dist/index.cjs +14 -14
- package/dist/index.cjs.map +13 -13
- package/dist/index.js +14 -14
- package/dist/index.js.map +13 -13
- package/dist/package.json +1 -1
- package/dist/styles.css +2 -2
- package/package.json +4 -2
- package/src/styles/abstract/_base.scss +2 -0
- package/src/styles/abstract/_config.scss +28 -0
- package/src/styles/abstract/_functions.scss +124 -0
- package/src/styles/abstract/_mixins.scss +401 -0
- package/src/styles/abstract/_theme.scss +269 -0
- package/src/styles/abstract/_variables.scss +338 -0
- package/src/styles/base/_reset.scss +86 -0
- package/src/styles/base/_typography.scss +155 -0
- package/src/styles/components/_badge.scss +183 -0
- package/src/styles/components/_bottom-app-bar.scss +103 -0
- package/src/styles/components/_button.scss +756 -0
- package/src/styles/components/_card.scss +401 -0
- package/src/styles/components/_carousel.scss +645 -0
- package/src/styles/components/_checkbox.scss +231 -0
- package/src/styles/components/_chips.scss +643 -0
- package/src/styles/components/_datepicker.scss +358 -0
- package/src/styles/components/_dialog.scss +259 -0
- package/src/styles/components/_divider.scss +57 -0
- package/src/styles/components/_extended-fab.scss +309 -0
- package/src/styles/components/_fab.scss +244 -0
- package/src/styles/components/_list.scss +774 -0
- package/src/styles/components/_menu.scss +245 -0
- package/src/styles/components/_navigation-mobile.scss +244 -0
- package/src/styles/components/_navigation-system.scss +151 -0
- package/src/styles/components/_navigation.scss +407 -0
- package/src/styles/components/_progress.scss +101 -0
- package/src/styles/components/_radios.scss +187 -0
- package/src/styles/components/_search.scss +306 -0
- package/src/styles/components/_segmented-button.scss +227 -0
- package/src/styles/components/_select.scss +274 -0
- package/src/styles/components/_sheet.scss +236 -0
- package/src/styles/components/_slider.scss +264 -0
- package/src/styles/components/_snackbar.scss +211 -0
- package/src/styles/components/_switch.scss +305 -0
- package/src/styles/components/_tabs.scss +421 -0
- package/src/styles/components/_textfield.scss +1035 -0
- package/src/styles/components/_timepicker.scss +451 -0
- package/src/styles/components/_tooltip.scss +241 -0
- package/src/styles/components/_top-app-bar.scss +225 -0
- package/src/styles/main.scss +129 -0
- package/src/styles/themes/_autumn.scss +105 -0
- package/src/styles/themes/_base-theme.scss +85 -0
- package/src/styles/themes/_baseline.scss +173 -0
- package/src/styles/themes/_bluekhaki.scss +125 -0
- package/src/styles/themes/_brownbeige.scss +125 -0
- package/src/styles/themes/_browngreen.scss +125 -0
- package/src/styles/themes/_forest.scss +77 -0
- package/src/styles/themes/_greenbeige.scss +125 -0
- package/src/styles/themes/_index.scss +19 -0
- package/src/styles/themes/_material.scss +125 -0
- package/src/styles/themes/_ocean.scss +77 -0
- package/src/styles/themes/_sageivory.scss +125 -0
- package/src/styles/themes/_spring.scss +77 -0
- package/src/styles/themes/_summer.scss +87 -0
- package/src/styles/themes/_sunset.scss +60 -0
- package/src/styles/themes/_tealcaramel.scss +125 -0
- package/src/styles/themes/_winter.scss +77 -0
- package/src/styles/utilities/_colors.scss +154 -0
- package/src/styles/utilities/_flexbox.scss +194 -0
- package/src/styles/utilities/_layout.scss +665 -0
- package/src/styles/utilities/_ripple.scss +79 -0
- package/src/styles/utilities/_spacing.scss +139 -0
- package/src/styles/utilities/_typography.scss +178 -0
- package/src/styles/utilities/_visibility.scss +142 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// src/styles/components/_menu.scss
|
|
2
|
+
@use '../../styles/abstract/base' as base;
|
|
3
|
+
@use '../../styles/abstract/variables' as v;
|
|
4
|
+
@use '../../styles/abstract/mixins' as m;
|
|
5
|
+
@use '../../styles/abstract/functions' as f;
|
|
6
|
+
@use '../../styles/abstract/theme' as t;
|
|
7
|
+
|
|
8
|
+
$prefix: base.$prefix;
|
|
9
|
+
|
|
10
|
+
$component: '#{$prefix}-menu';
|
|
11
|
+
|
|
12
|
+
.#{$component} {
|
|
13
|
+
// Base styles
|
|
14
|
+
@include m.typography('body-medium');
|
|
15
|
+
@include m.shape('extra-small');
|
|
16
|
+
|
|
17
|
+
position: fixed;
|
|
18
|
+
z-index: f.get-z-index('menu');
|
|
19
|
+
min-width: 112px;
|
|
20
|
+
max-width: 280px;
|
|
21
|
+
padding: 8px 0; // Keep padding consistent
|
|
22
|
+
background-color: t.color('surface-container');
|
|
23
|
+
color: t.color('on-surface');
|
|
24
|
+
@include m.elevation(2);
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
|
|
27
|
+
// Initial state - hidden with proper transform origin
|
|
28
|
+
display: block;
|
|
29
|
+
opacity: 0;
|
|
30
|
+
transform-origin: top center; // Default transform origin
|
|
31
|
+
transform: scaleY(0);
|
|
32
|
+
pointer-events: none;
|
|
33
|
+
|
|
34
|
+
// Material Design 3 standard animation curve for menus
|
|
35
|
+
transition:
|
|
36
|
+
transform v.motion('duration-medium1') v.motion('easing-emphasized'),
|
|
37
|
+
opacity v.motion('duration-medium1') v.motion('easing-emphasized');
|
|
38
|
+
|
|
39
|
+
// Visible state
|
|
40
|
+
&--visible {
|
|
41
|
+
opacity: 1;
|
|
42
|
+
transform: scaleY(1);
|
|
43
|
+
pointer-events: auto;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Position variations with appropriate transform origins
|
|
47
|
+
&--position-top,
|
|
48
|
+
&--position-top-start,
|
|
49
|
+
&--position-top-end {
|
|
50
|
+
transform-origin: bottom center;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Submenu styling
|
|
54
|
+
&--submenu {
|
|
55
|
+
position: absolute;
|
|
56
|
+
z-index: f.get-z-index('menu') + 1;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// List container
|
|
60
|
+
&-list {
|
|
61
|
+
margin: 0;
|
|
62
|
+
padding: 0;
|
|
63
|
+
list-style: none;
|
|
64
|
+
overflow-y: auto;
|
|
65
|
+
max-height: calc(100vh - 96px);
|
|
66
|
+
@include m.scrollbar;
|
|
67
|
+
width: 100%;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Menu items
|
|
71
|
+
&-item {
|
|
72
|
+
@include m.typography('body-large');
|
|
73
|
+
@include m.flex-row;
|
|
74
|
+
|
|
75
|
+
position: relative;
|
|
76
|
+
min-height: 48px;
|
|
77
|
+
padding: 12px 16px;
|
|
78
|
+
padding-right: 42px;
|
|
79
|
+
cursor: pointer;
|
|
80
|
+
user-select: none;
|
|
81
|
+
color: t.color('on-surface');
|
|
82
|
+
white-space: nowrap;
|
|
83
|
+
text-overflow: ellipsis;
|
|
84
|
+
overflow: hidden;
|
|
85
|
+
width: 100%;
|
|
86
|
+
box-sizing: border-box;
|
|
87
|
+
|
|
88
|
+
// State layer effects
|
|
89
|
+
&:hover {
|
|
90
|
+
@include m.state-layer(t.color('on-surface'), 'hover');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&:focus {
|
|
94
|
+
@include m.state-layer(t.color('on-surface'), 'focus');
|
|
95
|
+
outline: none;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
&:active {
|
|
99
|
+
@include m.state-layer(t.color('on-surface'), 'pressed');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Submenu indicator
|
|
103
|
+
&--submenu {
|
|
104
|
+
padding-right: 48px;
|
|
105
|
+
|
|
106
|
+
&::after {
|
|
107
|
+
content: '';
|
|
108
|
+
position: absolute;
|
|
109
|
+
right: 12px;
|
|
110
|
+
top: 50%;
|
|
111
|
+
transform: translateY(-50%);
|
|
112
|
+
width: 24px;
|
|
113
|
+
height: 24px;
|
|
114
|
+
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M10 17l5-5-5-5v10z'/%3E%3C/svg%3E") center / contain no-repeat;
|
|
115
|
+
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M10 17l5-5-5-5v10z'/%3E%3C/svg%3E") center / contain no-repeat;
|
|
116
|
+
background-color: currentColor;
|
|
117
|
+
opacity: 0.87;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
&[aria-expanded="true"] {
|
|
121
|
+
@include m.state-layer(t.color('on-surface'), 'hover');
|
|
122
|
+
|
|
123
|
+
&::after {
|
|
124
|
+
opacity: 1;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Disabled state
|
|
130
|
+
&--disabled {
|
|
131
|
+
pointer-events: none;
|
|
132
|
+
color: t.alpha('on-surface', 0.38);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Selected state for select component
|
|
136
|
+
&--selected {
|
|
137
|
+
color: t.color('primary');
|
|
138
|
+
|
|
139
|
+
&::after {
|
|
140
|
+
content: "";
|
|
141
|
+
position: absolute;
|
|
142
|
+
right: 12px;
|
|
143
|
+
top: 50%;
|
|
144
|
+
transform: translateY(-50%);
|
|
145
|
+
width: 18px;
|
|
146
|
+
height: 18px;
|
|
147
|
+
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpolyline points='20 6 9 17 4 12' stroke='white' stroke-width='2' fill='none'/%3E%3C/svg%3E") center / contain no-repeat;
|
|
148
|
+
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpolyline points='20 6 9 17 4 12' stroke='white' stroke-width='2' fill='none'/%3E%3C/svg%3E") center / contain no-repeat;
|
|
149
|
+
background-color: currentColor;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Content containers inside menu items
|
|
154
|
+
&-content {
|
|
155
|
+
display: flex;
|
|
156
|
+
align-items: center;
|
|
157
|
+
width: 100%;
|
|
158
|
+
overflow: hidden;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
&-icon {
|
|
162
|
+
margin-right: 12px;
|
|
163
|
+
display: flex;
|
|
164
|
+
align-items: center;
|
|
165
|
+
justify-content: center;
|
|
166
|
+
flex-shrink: 0;
|
|
167
|
+
|
|
168
|
+
svg {
|
|
169
|
+
width: 20px;
|
|
170
|
+
height: 20px;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
&-text {
|
|
175
|
+
flex: 1;
|
|
176
|
+
white-space: nowrap;
|
|
177
|
+
overflow: hidden;
|
|
178
|
+
text-overflow: ellipsis;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
&-shortcut {
|
|
182
|
+
margin-left: 12px;
|
|
183
|
+
color: t.color('on-surface-variant');
|
|
184
|
+
flex-shrink: 0;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Divider
|
|
189
|
+
&-divider {
|
|
190
|
+
height: 1px;
|
|
191
|
+
margin: 8px 0;
|
|
192
|
+
background-color: t.color('outline-variant');
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Accessibility
|
|
196
|
+
@include m.focus-ring('.#{$component}-item:focus-visible');
|
|
197
|
+
|
|
198
|
+
// Reduced motion preference support
|
|
199
|
+
@include m.reduced-motion {
|
|
200
|
+
transition: opacity 0.1s linear;
|
|
201
|
+
transform: none !important;
|
|
202
|
+
|
|
203
|
+
&--visible {
|
|
204
|
+
transform: none !important;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// High contrast mode
|
|
209
|
+
@include m.high-contrast {
|
|
210
|
+
border: 1px solid CurrentColor;
|
|
211
|
+
|
|
212
|
+
.#{$component}-divider {
|
|
213
|
+
background-color: CurrentColor;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.#{$component}-item--disabled {
|
|
217
|
+
opacity: 1;
|
|
218
|
+
color: GrayText;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// RTL Support
|
|
223
|
+
@include m.rtl {
|
|
224
|
+
transform-origin: top right;
|
|
225
|
+
|
|
226
|
+
&--position-top,
|
|
227
|
+
&--position-top-start,
|
|
228
|
+
&--position-top-end {
|
|
229
|
+
transform-origin: bottom right;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.#{$component}-item {
|
|
233
|
+
&--submenu {
|
|
234
|
+
padding-right: 16px;
|
|
235
|
+
padding-left: 48px;
|
|
236
|
+
|
|
237
|
+
&::after {
|
|
238
|
+
right: auto;
|
|
239
|
+
left: 16px;
|
|
240
|
+
transform: translateY(-50%) rotate(180deg);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// src/components/navigation/_mobile.scss
|
|
2
|
+
@use '../../styles/abstract/variables' as v;
|
|
3
|
+
@use '../../styles/abstract/mixins' as m;
|
|
4
|
+
@use '../../styles/abstract/base' as base;
|
|
5
|
+
@use '../../styles/abstract/theme' as t;
|
|
6
|
+
|
|
7
|
+
$prefix: base.$prefix;
|
|
8
|
+
|
|
9
|
+
// Mobile navigation overlay
|
|
10
|
+
.#{$prefix}-nav-overlay {
|
|
11
|
+
position: fixed;
|
|
12
|
+
top: 0;
|
|
13
|
+
left: 0;
|
|
14
|
+
right: 0;
|
|
15
|
+
bottom: 0;
|
|
16
|
+
background-color: t.alpha('shadow', 0.5);
|
|
17
|
+
z-index: v.z-index('modal') - 1; // Just below modal level but above most content
|
|
18
|
+
opacity: 0;
|
|
19
|
+
visibility: hidden;
|
|
20
|
+
transition: opacity 0.3s v.motion('easing-standard'), visibility 0.3s v.motion('easing-standard');
|
|
21
|
+
|
|
22
|
+
// Add backdrop blur for a modern effect where supported
|
|
23
|
+
@supports (backdrop-filter: blur(4px)) {
|
|
24
|
+
backdrop-filter: blur(4px);
|
|
25
|
+
background-color: t.alpha('shadow', 0.4);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
&.active {
|
|
29
|
+
opacity: 1;
|
|
30
|
+
visibility: visible;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Close button for mobile drawer
|
|
35
|
+
.#{$prefix}-nav-close-btn {
|
|
36
|
+
position: absolute;
|
|
37
|
+
top: 12px;
|
|
38
|
+
right: 12px;
|
|
39
|
+
width: 40px;
|
|
40
|
+
height: 40px;
|
|
41
|
+
border-radius: 50%;
|
|
42
|
+
background-color: transparent;
|
|
43
|
+
border: none;
|
|
44
|
+
cursor: pointer;
|
|
45
|
+
display: none; // Hidden by default, shown on mobile
|
|
46
|
+
align-items: center;
|
|
47
|
+
justify-content: center;
|
|
48
|
+
color: t.color('on-surface');
|
|
49
|
+
z-index: 1;
|
|
50
|
+
-webkit-tap-highlight-color: transparent; // Removes default mobile tap highlight
|
|
51
|
+
|
|
52
|
+
&:hover {
|
|
53
|
+
background-color: t.alpha('on-surface', 0.05);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Touch feedback state
|
|
57
|
+
&.active {
|
|
58
|
+
background-color: t.alpha('on-surface', 0.12);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
&:focus-visible {
|
|
62
|
+
outline: 2px solid t.color('primary');
|
|
63
|
+
outline-offset: 2px;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
svg {
|
|
67
|
+
width: 24px;
|
|
68
|
+
height: 24px;
|
|
69
|
+
stroke: currentColor;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Ensure WCAG-compliant touch target size
|
|
73
|
+
@media (pointer: coarse) {
|
|
74
|
+
min-width: 48px;
|
|
75
|
+
min-height: 48px;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Body class to prevent scrolling when drawer is open
|
|
80
|
+
.#{$prefix}-body-drawer-open {
|
|
81
|
+
overflow: hidden;
|
|
82
|
+
|
|
83
|
+
// On iOS we need to handle the body position differently
|
|
84
|
+
@supports (-webkit-overflow-scrolling: touch) {
|
|
85
|
+
position: fixed;
|
|
86
|
+
width: 100%;
|
|
87
|
+
height: 100%;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Responsive behavior for navigation system - apply to small screens or touch devices
|
|
92
|
+
@media (max-width: 960px), (pointer: coarse) {
|
|
93
|
+
// Rail navigation
|
|
94
|
+
.#{$prefix}-nav--rail {
|
|
95
|
+
width: 56px;
|
|
96
|
+
z-index: v.z-index('modal') - 1;
|
|
97
|
+
border-right: 1px solid t.color('outline-variant');
|
|
98
|
+
|
|
99
|
+
// Hide labels on mobile
|
|
100
|
+
.#{$prefix}-nav-label {
|
|
101
|
+
display: none;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Center align items
|
|
105
|
+
.#{$prefix}-nav-item {
|
|
106
|
+
justify-content: center;
|
|
107
|
+
height: 56px;
|
|
108
|
+
-webkit-tap-highlight-color: transparent; // Remove default mobile highlight
|
|
109
|
+
|
|
110
|
+
// Increase touch targets for better accessibility
|
|
111
|
+
@media (pointer: coarse) {
|
|
112
|
+
min-height: 48px;
|
|
113
|
+
padding: 12px 8px;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Touch-friendly active state
|
|
117
|
+
&:active {
|
|
118
|
+
background-color: t.alpha('on-surface', 0.12);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Larger icons on mobile
|
|
123
|
+
.#{$prefix}-nav-icon {
|
|
124
|
+
font-size: 1.25rem;
|
|
125
|
+
|
|
126
|
+
// Ensure icon touch target meets WCAG requirements
|
|
127
|
+
@media (pointer: coarse) {
|
|
128
|
+
min-width: 44px;
|
|
129
|
+
min-height: 44px;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Drawer navigation
|
|
135
|
+
.#{$prefix}-nav--drawer {
|
|
136
|
+
position: fixed;
|
|
137
|
+
top: 0;
|
|
138
|
+
bottom: 0;
|
|
139
|
+
left: 0;
|
|
140
|
+
width: 280px;
|
|
141
|
+
max-width: 85vw;
|
|
142
|
+
z-index: v.z-index('modal');
|
|
143
|
+
background-color: t.color('surface');
|
|
144
|
+
box-shadow: v.elevation('level-3');
|
|
145
|
+
transform: translateX(-100%);
|
|
146
|
+
transition: transform 0.3s v.motion('easing-standard');
|
|
147
|
+
overflow-y: auto;
|
|
148
|
+
-webkit-overflow-scrolling: touch; // Smooth scrolling on iOS
|
|
149
|
+
|
|
150
|
+
&:not(.#{$prefix}-nav--hidden) {
|
|
151
|
+
transform: translateX(0);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Optimize drawer items for touch
|
|
155
|
+
.#{$prefix}-nav-item {
|
|
156
|
+
-webkit-tap-highlight-color: transparent;
|
|
157
|
+
|
|
158
|
+
@media (pointer: coarse) {
|
|
159
|
+
min-height: 48px;
|
|
160
|
+
padding: 12px 16px;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Touch feedback
|
|
164
|
+
&:active {
|
|
165
|
+
background-color: t.alpha('on-surface', 0.12);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Support RTL languages
|
|
170
|
+
@include m.rtl {
|
|
171
|
+
left: auto;
|
|
172
|
+
right: 0;
|
|
173
|
+
transform: translateX(100%);
|
|
174
|
+
|
|
175
|
+
&:not(.#{$prefix}-nav--hidden) {
|
|
176
|
+
transform: translateX(0);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Desktop behavior
|
|
183
|
+
@media (min-width: 961px) {
|
|
184
|
+
.#{$prefix}-nav--drawer {
|
|
185
|
+
// For desktop, transition by width instead of transform
|
|
186
|
+
transition: width 0.3s v.motion('easing-standard'), opacity 0.3s v.motion('easing-standard');
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.#{$prefix}-nav-close-btn {
|
|
190
|
+
display: none !important; // Always hidden on desktop
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Hide overlay on desktop
|
|
194
|
+
.#{$prefix}-nav-overlay.active {
|
|
195
|
+
opacity: 0;
|
|
196
|
+
visibility: hidden;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Safe area insets for notched devices like iPhone X and newer
|
|
201
|
+
@supports (padding-bottom: env(safe-area-inset-bottom)) {
|
|
202
|
+
.#{$prefix}-nav--drawer {
|
|
203
|
+
padding-top: env(safe-area-inset-top);
|
|
204
|
+
padding-bottom: env(safe-area-inset-bottom);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.#{$prefix}-nav--rail {
|
|
208
|
+
padding-top: env(safe-area-inset-top);
|
|
209
|
+
padding-bottom: env(safe-area-inset-bottom);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.#{$prefix}-nav--bar {
|
|
213
|
+
// For bottom navigation bars
|
|
214
|
+
&.#{$prefix}-nav--bottom {
|
|
215
|
+
padding-bottom: env(safe-area-inset-bottom);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Gesture hints for touch interfaces
|
|
221
|
+
@media (pointer: coarse) {
|
|
222
|
+
// Add visual affordance for swipe gesture
|
|
223
|
+
.#{$prefix}-nav--drawer:not(.#{$prefix}-nav--hidden) {
|
|
224
|
+
&::after {
|
|
225
|
+
content: '';
|
|
226
|
+
position: absolute;
|
|
227
|
+
top: 50%;
|
|
228
|
+
right: 0;
|
|
229
|
+
width: 4px;
|
|
230
|
+
height: 40px;
|
|
231
|
+
border-radius: 4px 0 0 4px;
|
|
232
|
+
background-color: t.alpha('on-surface', 0.1);
|
|
233
|
+
transform: translateY(-50%);
|
|
234
|
+
opacity: 0.5;
|
|
235
|
+
// Hide after interaction to avoid cognitive load
|
|
236
|
+
animation: fadeOutAfterDelay 4s forwards;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
@keyframes fadeOutAfterDelay {
|
|
241
|
+
0%, 50% { opacity: 0.5; }
|
|
242
|
+
100% { opacity: 0; }
|
|
243
|
+
}
|
|
244
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// src/components/navigation/system.scss
|
|
2
|
+
|
|
3
|
+
// Navigation system specific styles
|
|
4
|
+
// These complement the existing navigation component styles
|
|
5
|
+
|
|
6
|
+
$nav-animation-duration: 0.2s;
|
|
7
|
+
$nav-animation-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
8
|
+
|
|
9
|
+
// Drawer animation states
|
|
10
|
+
.mtrl-nav--drawer {
|
|
11
|
+
transition: transform $nav-animation-duration $nav-animation-function,
|
|
12
|
+
opacity $nav-animation-duration $nav-animation-function;
|
|
13
|
+
|
|
14
|
+
// Hidden state (transform off-screen)
|
|
15
|
+
&.mtrl-nav--hidden {
|
|
16
|
+
transform: translateX(-100%);
|
|
17
|
+
opacity: 0;
|
|
18
|
+
pointer-events: none;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Right positioned drawer
|
|
22
|
+
&.mtrl-nav--right {
|
|
23
|
+
&.mtrl-nav--hidden {
|
|
24
|
+
transform: translateX(100%);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Animation classes
|
|
29
|
+
&.mtrl-nav--animate-in {
|
|
30
|
+
animation: nav-drawer-in $nav-animation-duration $nav-animation-function;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
&.mtrl-nav--animate-out {
|
|
34
|
+
animation: nav-drawer-out $nav-animation-duration $nav-animation-function;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Navigation system container (optional - for wrapping rail + drawer)
|
|
39
|
+
.mtrl-nav-system {
|
|
40
|
+
display: flex;
|
|
41
|
+
position: relative;
|
|
42
|
+
|
|
43
|
+
// Rail is fixed width
|
|
44
|
+
.mtrl-nav--rail {
|
|
45
|
+
flex: 0 0 auto;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Drawer expands
|
|
49
|
+
.mtrl-nav--drawer {
|
|
50
|
+
flex: 1 0 auto;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Drawer entry animation
|
|
55
|
+
@keyframes nav-drawer-in {
|
|
56
|
+
0% {
|
|
57
|
+
transform: translateX(-20px);
|
|
58
|
+
opacity: 0;
|
|
59
|
+
}
|
|
60
|
+
100% {
|
|
61
|
+
transform: translateX(0);
|
|
62
|
+
opacity: 1;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Drawer exit animation
|
|
67
|
+
@keyframes nav-drawer-out {
|
|
68
|
+
0% {
|
|
69
|
+
transform: translateX(0);
|
|
70
|
+
opacity: 1;
|
|
71
|
+
}
|
|
72
|
+
100% {
|
|
73
|
+
transform: translateX(-20px);
|
|
74
|
+
opacity: 0;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Right-side drawer animations
|
|
79
|
+
.mtrl-nav--drawer.mtrl-nav--right {
|
|
80
|
+
&.mtrl-nav--animate-in {
|
|
81
|
+
animation: nav-drawer-right-in $nav-animation-duration $nav-animation-function;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
&.mtrl-nav--animate-out {
|
|
85
|
+
animation: nav-drawer-right-out $nav-animation-duration $nav-animation-function;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
@keyframes nav-drawer-right-in {
|
|
90
|
+
0% {
|
|
91
|
+
transform: translateX(20px);
|
|
92
|
+
opacity: 0;
|
|
93
|
+
}
|
|
94
|
+
100% {
|
|
95
|
+
transform: translateX(0);
|
|
96
|
+
opacity: 1;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@keyframes nav-drawer-right-out {
|
|
101
|
+
0% {
|
|
102
|
+
transform: translateX(0);
|
|
103
|
+
opacity: 1;
|
|
104
|
+
}
|
|
105
|
+
100% {
|
|
106
|
+
transform: translateX(20px);
|
|
107
|
+
opacity: 0;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Mobile optimizations
|
|
112
|
+
@media (max-width: 960px) {
|
|
113
|
+
.mtrl-nav-system {
|
|
114
|
+
flex-direction: column;
|
|
115
|
+
|
|
116
|
+
.mtrl-nav--rail {
|
|
117
|
+
// Mobile rail can be top or bottom
|
|
118
|
+
&.mtrl-nav--top, &.mtrl-nav--bottom {
|
|
119
|
+
width: 100%;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.mtrl-nav--drawer {
|
|
124
|
+
// Mobile drawer takes full width
|
|
125
|
+
width: 100%;
|
|
126
|
+
max-width: 100%;
|
|
127
|
+
|
|
128
|
+
&.mtrl-nav--hidden {
|
|
129
|
+
transform: translateY(-100%);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
&.mtrl-nav--bottom {
|
|
133
|
+
&.mtrl-nav--hidden {
|
|
134
|
+
transform: translateY(100%);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Focus and accessibility enhancements
|
|
142
|
+
.mtrl-nav-system {
|
|
143
|
+
[role="navigation"] {
|
|
144
|
+
&:focus-within {
|
|
145
|
+
outline: 2px solid var(--mtrl-primary-color, #6200ee);
|
|
146
|
+
outline-offset: -2px;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
@use 'navigation-mobile'
|