@ivds/core 0.1.1
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/CHANGELOG.md +45 -0
- package/README.md +215 -0
- package/lib/all.css +6802 -0
- package/lib/all.min.css +1 -0
- package/lib/base/base.css +215 -0
- package/lib/base/base.min.css +1 -0
- package/lib/components/_breadcrumb-mixins.scss +173 -0
- package/lib/components/_button-mixin.scss +120 -0
- package/lib/components/_card-mixin.scss +196 -0
- package/lib/components/_checkbox-mixin.scss +208 -0
- package/lib/components/_footer-mixin.scss +385 -0
- package/lib/components/_header-mixin.scss +275 -0
- package/lib/components/_navigation-mixins.scss +270 -0
- package/lib/components/_notification-mixin.scss +239 -0
- package/lib/components/_pagination-mixins.scss +280 -0
- package/lib/components/_radio-button-mixin.scss +207 -0
- package/lib/components/_tag-mixin.scss +261 -0
- package/lib/components/_text-input-mixin.scss +203 -0
- package/lib/components/all.css +3005 -0
- package/lib/components/all.min.css +1 -0
- package/lib/components/breadcrumb/breadcrumb.css +141 -0
- package/lib/components/breadcrumb/breadcrumb.min.css +1 -0
- package/lib/components/button/button.css +221 -0
- package/lib/components/button/button.min.css +1 -0
- package/lib/components/card/card.css +236 -0
- package/lib/components/card/card.min.css +1 -0
- package/lib/components/checkbox/checkbox.css +305 -0
- package/lib/components/checkbox/checkbox.min.css +1 -0
- package/lib/components/footer/footer.css +466 -0
- package/lib/components/footer/footer.min.css +1 -0
- package/lib/components/header/header.css +274 -0
- package/lib/components/header/header.min.css +1 -0
- package/lib/components/navigation/navigation.css +214 -0
- package/lib/components/navigation/navigation.min.css +1 -0
- package/lib/components/notification/notification.css +253 -0
- package/lib/components/notification/notification.min.css +1 -0
- package/lib/components/pagination/pagination.css +221 -0
- package/lib/components/pagination/pagination.min.css +1 -0
- package/lib/components/radio-button/radio-button.css +326 -0
- package/lib/components/radio-button/radio-button.min.css +1 -0
- package/lib/components/tag/tag.css +367 -0
- package/lib/components/tag/tag.min.css +1 -0
- package/lib/components/text-input/text-input.css +243 -0
- package/lib/components/text-input/text-input.min.css +1 -0
- package/lib/icons/icon-arrow-left.css +139 -0
- package/lib/icons/icon-arrow-left.min.css +1 -0
- package/lib/icons/icon-arrow-right.css +139 -0
- package/lib/icons/icon-arrow-right.min.css +1 -0
- package/lib/icons/icon-check.css +139 -0
- package/lib/icons/icon-check.min.css +1 -0
- package/lib/icons/icon-close.css +140 -0
- package/lib/icons/icon-close.min.css +1 -0
- package/lib/icons/icon-error.css +140 -0
- package/lib/icons/icon-error.min.css +1 -0
- package/lib/icons/icon-info.css +140 -0
- package/lib/icons/icon-info.min.css +1 -0
- package/lib/icons/icon-success.css +139 -0
- package/lib/icons/icon-success.min.css +1 -0
- package/lib/icons/icon-warning.css +139 -0
- package/lib/icons/icon-warning.min.css +1 -0
- package/lib/icons/icons.css +1158 -0
- package/lib/icons/icons.min.css +1 -0
- package/lib/utils/_flex.scss +200 -0
- package/lib/utils/_grid.scss +211 -0
- package/lib/utils/_layout.scss +253 -0
- package/lib/utils/_spacing.scss +260 -0
- package/lib/utils/_typography.scss +111 -0
- package/lib/utils/utils.css +2434 -0
- package/lib/utils/utils.min.css +1 -0
- package/lib/utils-only.css +2801 -0
- package/lib/utils-only.min.css +1 -0
- package/lib/variables/variables.css +2 -0
- package/lib/variables/variables.min.css +0 -0
- package/package.json +194 -0
- package/src/__tests__/example.test.scss +12 -0
- package/src/accessibility.stories.js +416 -0
- package/src/all.scss +9 -0
- package/src/base/_layout.scss +97 -0
- package/src/base/_reset.scss +85 -0
- package/src/base/_typography.scss +105 -0
- package/src/base/base.scss +6 -0
- package/src/components/all.scss +22 -0
- package/src/components/breadcrumb/_breadcrumb-mixins.scss +173 -0
- package/src/components/breadcrumb/breadcrumb.scss +68 -0
- package/src/components/breadcrumb/breadcrumb.stories.js +483 -0
- package/src/components/button/__tests__/button-mixins.test.scss +35 -0
- package/src/components/button/_button-mixin.scss +120 -0
- package/src/components/button/button.scss +126 -0
- package/src/components/button/button.stories.js +364 -0
- package/src/components/card/__tests__/card-mixins.test.scss +36 -0
- package/src/components/card/_card-mixin.scss +196 -0
- package/src/components/card/card.scss +193 -0
- package/src/components/card/card.stories.js +635 -0
- package/src/components/checkbox/_checkbox-mixin.scss +208 -0
- package/src/components/checkbox/checkbox.scss +141 -0
- package/src/components/checkbox/checkbox.stories.js +303 -0
- package/src/components/footer/_footer-mixin.scss +385 -0
- package/src/components/footer/footer.scss +86 -0
- package/src/components/footer/footer.stories.js +740 -0
- package/src/components/header/_header-mixin.scss +275 -0
- package/src/components/header/header.scss +84 -0
- package/src/components/header/header.stories.js +450 -0
- package/src/components/navigation/_navigation-mixins.scss +270 -0
- package/src/components/navigation/navigation.scss +64 -0
- package/src/components/navigation/navigation.stories.js +410 -0
- package/src/components/notification/_notification-mixin.scss +239 -0
- package/src/components/notification/notification.scss +118 -0
- package/src/components/notification/notification.stories.js +378 -0
- package/src/components/overview.stories.js +473 -0
- package/src/components/pagination/_pagination-mixins.scss +280 -0
- package/src/components/pagination/pagination.scss +76 -0
- package/src/components/pagination/pagination.stories.js +729 -0
- package/src/components/radio-button/_radio-button-mixin.scss +207 -0
- package/src/components/radio-button/radio-button.scss +178 -0
- package/src/components/radio-button/radio-button.stories.js +379 -0
- package/src/components/tag/_tag-mixin.scss +261 -0
- package/src/components/tag/tag.scss +244 -0
- package/src/components/tag/tag.stories.js +482 -0
- package/src/components/text-input/_text-input-mixin.scss +203 -0
- package/src/components/text-input/text-input.scss +150 -0
- package/src/components/text-input/text-input.stories.js +723 -0
- package/src/icons/_icon.scss +121 -0
- package/src/icons/icon-arrow-left.scss +23 -0
- package/src/icons/icon-arrow-right.scss +23 -0
- package/src/icons/icon-check.scss +23 -0
- package/src/icons/icon-close.scss +24 -0
- package/src/icons/icon-error.scss +24 -0
- package/src/icons/icon-info.scss +24 -0
- package/src/icons/icon-success.scss +23 -0
- package/src/icons/icon-warning.scss +23 -0
- package/src/icons/icons.scss +12 -0
- package/src/icons/icons.stories.js +249 -0
- package/src/icons/svg/arrow-left.svg +3 -0
- package/src/icons/svg/arrow-right.svg +3 -0
- package/src/icons/svg/check.svg +3 -0
- package/src/icons/svg/close.svg +4 -0
- package/src/icons/svg/error.svg +5 -0
- package/src/icons/svg/info.svg +5 -0
- package/src/icons/svg/success.svg +4 -0
- package/src/icons/svg/warning.svg +5 -0
- package/src/utils/__tests__/utilities.test.scss +37 -0
- package/src/utils/_flex.scss +200 -0
- package/src/utils/_grid.scss +211 -0
- package/src/utils/_layout.scss +253 -0
- package/src/utils/_spacing.scss +260 -0
- package/src/utils/_typography.scss +111 -0
- package/src/utils/utils.scss +8 -0
- package/src/variables/_borders.scss +15 -0
- package/src/variables/_breakpoints.scss +11 -0
- package/src/variables/_colors.scss +97 -0
- package/src/variables/_shadows.scss +14 -0
- package/src/variables/_spacing.scss +24 -0
- package/src/variables/_typography.scss +47 -0
- package/src/variables/variables.scss +9 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
// Navigation component stories for Storybook
|
|
2
|
+
// Showcases navigation patterns and layouts following Helsinki Design System patterns
|
|
3
|
+
|
|
4
|
+
import './navigation.scss';
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
title: 'Core/Navigation',
|
|
8
|
+
decorators: [(storyFn) => `<div style="padding: 1rem;">${storyFn()}</div>`],
|
|
9
|
+
parameters: {
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component: 'CSS-only navigation component using IVDS design tokens with orange primary color. Provides flexible navigation patterns with proper semantic structure and accessibility features, following Helsinki Design System patterns.'
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
a11y: {
|
|
16
|
+
config: {
|
|
17
|
+
rules: [
|
|
18
|
+
{
|
|
19
|
+
id: 'color-contrast',
|
|
20
|
+
enabled: true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 'focus-order-semantics',
|
|
24
|
+
enabled: true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: 'aria-allowed-attr',
|
|
28
|
+
enabled: true
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Primary horizontal navigation
|
|
37
|
+
export const Primary = () => `
|
|
38
|
+
<nav class="ivds-navigation ivds-navigation--horizontal" aria-label="Main navigation">
|
|
39
|
+
<ul class="ivds-navigation__list">
|
|
40
|
+
<li class="ivds-navigation__item">
|
|
41
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">Home</a>
|
|
42
|
+
</li>
|
|
43
|
+
<li class="ivds-navigation__item">
|
|
44
|
+
<a href="#" class="ivds-navigation__link">Products</a>
|
|
45
|
+
</li>
|
|
46
|
+
<li class="ivds-navigation__item">
|
|
47
|
+
<a href="#" class="ivds-navigation__link">Services</a>
|
|
48
|
+
</li>
|
|
49
|
+
<li class="ivds-navigation__item">
|
|
50
|
+
<a href="#" class="ivds-navigation__link">About</a>
|
|
51
|
+
</li>
|
|
52
|
+
<li class="ivds-navigation__item">
|
|
53
|
+
<a href="#" class="ivds-navigation__link">Contact</a>
|
|
54
|
+
</li>
|
|
55
|
+
</ul>
|
|
56
|
+
</nav>
|
|
57
|
+
`;
|
|
58
|
+
|
|
59
|
+
// Size variants
|
|
60
|
+
export const Sizes = () => `
|
|
61
|
+
<div style="display: flex; flex-direction: column; gap: 2rem;">
|
|
62
|
+
<div>
|
|
63
|
+
<h4 style="margin-bottom: 0.5rem; font-size: 0.875rem; color: #6b7280;">Compact</h4>
|
|
64
|
+
<nav class="ivds-navigation ivds-navigation--horizontal ivds-navigation--compact" aria-label="Compact navigation">
|
|
65
|
+
<ul class="ivds-navigation__list">
|
|
66
|
+
<li class="ivds-navigation__item">
|
|
67
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">Home</a>
|
|
68
|
+
</li>
|
|
69
|
+
<li class="ivds-navigation__item">
|
|
70
|
+
<a href="#" class="ivds-navigation__link">Products</a>
|
|
71
|
+
</li>
|
|
72
|
+
<li class="ivds-navigation__item">
|
|
73
|
+
<a href="#" class="ivds-navigation__link">Services</a>
|
|
74
|
+
</li>
|
|
75
|
+
</ul>
|
|
76
|
+
</nav>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<div>
|
|
80
|
+
<h4 style="margin-bottom: 0.5rem; font-size: 0.875rem; color: #6b7280;">Default</h4>
|
|
81
|
+
<nav class="ivds-navigation ivds-navigation--horizontal" aria-label="Default navigation">
|
|
82
|
+
<ul class="ivds-navigation__list">
|
|
83
|
+
<li class="ivds-navigation__item">
|
|
84
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">Home</a>
|
|
85
|
+
</li>
|
|
86
|
+
<li class="ivds-navigation__item">
|
|
87
|
+
<a href="#" class="ivds-navigation__link">Products</a>
|
|
88
|
+
</li>
|
|
89
|
+
<li class="ivds-navigation__item">
|
|
90
|
+
<a href="#" class="ivds-navigation__link">Services</a>
|
|
91
|
+
</li>
|
|
92
|
+
</ul>
|
|
93
|
+
</nav>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div>
|
|
97
|
+
<h4 style="margin-bottom: 0.5rem; font-size: 0.875rem; color: #6b7280;">Spacious</h4>
|
|
98
|
+
<nav class="ivds-navigation ivds-navigation--horizontal ivds-navigation--spacious" aria-label="Spacious navigation">
|
|
99
|
+
<ul class="ivds-navigation__list">
|
|
100
|
+
<li class="ivds-navigation__item">
|
|
101
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">Home</a>
|
|
102
|
+
</li>
|
|
103
|
+
<li class="ivds-navigation__item">
|
|
104
|
+
<a href="#" class="ivds-navigation__link">Products</a>
|
|
105
|
+
</li>
|
|
106
|
+
<li class="ivds-navigation__item">
|
|
107
|
+
<a href="#" class="ivds-navigation__link">Services</a>
|
|
108
|
+
</li>
|
|
109
|
+
</ul>
|
|
110
|
+
</nav>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
`;
|
|
114
|
+
|
|
115
|
+
// Theme variants
|
|
116
|
+
export const Themes = () => `
|
|
117
|
+
<div style="display: flex; flex-direction: column; gap: 2rem;">
|
|
118
|
+
<div>
|
|
119
|
+
<h4 style="margin-bottom: 0.5rem; font-size: 0.875rem; color: #6b7280;">Default Theme</h4>
|
|
120
|
+
<nav class="ivds-navigation ivds-navigation--horizontal" aria-label="Default theme navigation">
|
|
121
|
+
<ul class="ivds-navigation__list">
|
|
122
|
+
<li class="ivds-navigation__item">
|
|
123
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">Home</a>
|
|
124
|
+
</li>
|
|
125
|
+
<li class="ivds-navigation__item">
|
|
126
|
+
<a href="#" class="ivds-navigation__link">Products</a>
|
|
127
|
+
</li>
|
|
128
|
+
<li class="ivds-navigation__item">
|
|
129
|
+
<a href="#" class="ivds-navigation__link">Services</a>
|
|
130
|
+
</li>
|
|
131
|
+
</ul>
|
|
132
|
+
</nav>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<div style="background-color: #1e293b; padding: 1rem; border-radius: 0.5rem;">
|
|
136
|
+
<h4 style="margin-bottom: 0.5rem; font-size: 0.875rem; color: #e2e8f0;">Dark Theme</h4>
|
|
137
|
+
<nav class="ivds-navigation ivds-navigation--horizontal ivds-navigation--theme-dark" aria-label="Dark theme navigation">
|
|
138
|
+
<ul class="ivds-navigation__list">
|
|
139
|
+
<li class="ivds-navigation__item">
|
|
140
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">Home</a>
|
|
141
|
+
</li>
|
|
142
|
+
<li class="ivds-navigation__item">
|
|
143
|
+
<a href="#" class="ivds-navigation__link">Products</a>
|
|
144
|
+
</li>
|
|
145
|
+
<li class="ivds-navigation__item">
|
|
146
|
+
<a href="#" class="ivds-navigation__link">Services</a>
|
|
147
|
+
</li>
|
|
148
|
+
</ul>
|
|
149
|
+
</nav>
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
<div>
|
|
153
|
+
<h4 style="margin-bottom: 0.5rem; font-size: 0.875rem; color: #6b7280;">Minimal Theme</h4>
|
|
154
|
+
<nav class="ivds-navigation ivds-navigation--horizontal ivds-navigation--theme-minimal" aria-label="Minimal theme navigation">
|
|
155
|
+
<ul class="ivds-navigation__list">
|
|
156
|
+
<li class="ivds-navigation__item">
|
|
157
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">Home</a>
|
|
158
|
+
</li>
|
|
159
|
+
<li class="ivds-navigation__item">
|
|
160
|
+
<a href="#" class="ivds-navigation__link">Products</a>
|
|
161
|
+
</li>
|
|
162
|
+
<li class="ivds-navigation__item">
|
|
163
|
+
<a href="#" class="ivds-navigation__link">Services</a>
|
|
164
|
+
</li>
|
|
165
|
+
</ul>
|
|
166
|
+
</nav>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
`;
|
|
170
|
+
|
|
171
|
+
// Vertical navigation
|
|
172
|
+
export const Vertical = () => `
|
|
173
|
+
<nav class="ivds-navigation ivds-navigation--vertical" aria-label="Sidebar navigation" style="width: 250px;">
|
|
174
|
+
<ul class="ivds-navigation__list">
|
|
175
|
+
<li class="ivds-navigation__item">
|
|
176
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">Dashboard</a>
|
|
177
|
+
</li>
|
|
178
|
+
<li class="ivds-navigation__item">
|
|
179
|
+
<a href="#" class="ivds-navigation__link">Projects</a>
|
|
180
|
+
</li>
|
|
181
|
+
<li class="ivds-navigation__item">
|
|
182
|
+
<a href="#" class="ivds-navigation__link">Team Members</a>
|
|
183
|
+
</li>
|
|
184
|
+
<li class="ivds-navigation__item">
|
|
185
|
+
<a href="#" class="ivds-navigation__link">Analytics</a>
|
|
186
|
+
</li>
|
|
187
|
+
<li class="ivds-navigation__item">
|
|
188
|
+
<a href="#" class="ivds-navigation__link">Settings</a>
|
|
189
|
+
</li>
|
|
190
|
+
<li class="ivds-navigation__item">
|
|
191
|
+
<a href="#" class="ivds-navigation__link">Help & Support</a>
|
|
192
|
+
</li>
|
|
193
|
+
</ul>
|
|
194
|
+
</nav>
|
|
195
|
+
`;
|
|
196
|
+
|
|
197
|
+
// Navigation with icons
|
|
198
|
+
export const WithIcons = () => `
|
|
199
|
+
<nav class="ivds-navigation ivds-navigation--vertical ivds-navigation--with-icons" aria-label="Main navigation" style="width: 280px;">
|
|
200
|
+
<ul class="ivds-navigation__list">
|
|
201
|
+
<li class="ivds-navigation__item">
|
|
202
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">
|
|
203
|
+
<svg class="ivds-navigation__icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
204
|
+
<path d="M3 9L12 2L21 9V20A2 2 0 0 1 19 22H5A2 2 0 0 1 3 20V9Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
205
|
+
<polyline points="9,22 9,12 15,12 15,22" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
206
|
+
</svg>
|
|
207
|
+
Dashboard
|
|
208
|
+
</a>
|
|
209
|
+
</li>
|
|
210
|
+
<li class="ivds-navigation__item">
|
|
211
|
+
<a href="#" class="ivds-navigation__link">
|
|
212
|
+
<svg class="ivds-navigation__icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
213
|
+
<rect x="3" y="3" width="18" height="18" rx="2" ry="2" stroke="currentColor" stroke-width="2" fill="none"/>
|
|
214
|
+
<rect x="9" y="9" width="6" height="6" stroke="currentColor" stroke-width="2" fill="none"/>
|
|
215
|
+
</svg>
|
|
216
|
+
Projects
|
|
217
|
+
</a>
|
|
218
|
+
</li>
|
|
219
|
+
<li class="ivds-navigation__item">
|
|
220
|
+
<a href="#" class="ivds-navigation__link">
|
|
221
|
+
<svg class="ivds-navigation__icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
222
|
+
<path d="M17 21V19A4 4 0 0 0 13 15H5A4 4 0 0 0 1 19V21" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
223
|
+
<circle cx="9" cy="7" r="4" stroke="currentColor" stroke-width="2" fill="none"/>
|
|
224
|
+
<path d="M23 21V19A4 4 0 0 0 16.5 15.91" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
225
|
+
<path d="M16 3.13A4 4 0 0 1 16 11.87" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
226
|
+
</svg>
|
|
227
|
+
Team
|
|
228
|
+
</a>
|
|
229
|
+
</li>
|
|
230
|
+
<li class="ivds-navigation__item">
|
|
231
|
+
<a href="#" class="ivds-navigation__link">
|
|
232
|
+
<svg class="ivds-navigation__icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
233
|
+
<polyline points="22,12 18,12 15,21 9,3 6,12 2,12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
234
|
+
</svg>
|
|
235
|
+
Analytics
|
|
236
|
+
</a>
|
|
237
|
+
</li>
|
|
238
|
+
<li class="ivds-navigation__item">
|
|
239
|
+
<a href="#" class="ivds-navigation__link">
|
|
240
|
+
<svg class="ivds-navigation__icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
241
|
+
<circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2" fill="none"/>
|
|
242
|
+
<path d="M19.4 15A1.65 1.65 0 0 0 21 13.09A1.65 1.65 0 0 0 19.4 9M14.5 4.1A1.65 1.65 0 0 0 11.91 3A1.65 1.65 0 0 0 9.5 4.1M9.5 19.9A1.65 1.65 0 0 0 12.09 21A1.65 1.65 0 0 0 14.5 19.9M4.6 15A1.65 1.65 0 0 0 3 13.09A1.65 1.65 0 0 0 4.6 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
243
|
+
</svg>
|
|
244
|
+
Settings
|
|
245
|
+
</a>
|
|
246
|
+
</li>
|
|
247
|
+
</ul>
|
|
248
|
+
</nav>
|
|
249
|
+
`;
|
|
250
|
+
|
|
251
|
+
// Compact horizontal navigation
|
|
252
|
+
export const CompactHorizontal = () => `
|
|
253
|
+
<nav class="ivds-navigation ivds-navigation--horizontal" aria-label="Secondary navigation">
|
|
254
|
+
<ul class="ivds-navigation__list">
|
|
255
|
+
<li class="ivds-navigation__item">
|
|
256
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page" style="padding: 0.5rem 0.75rem;">Overview</a>
|
|
257
|
+
</li>
|
|
258
|
+
<li class="ivds-navigation__item">
|
|
259
|
+
<a href="#" class="ivds-navigation__link" style="padding: 0.5rem 0.75rem;">Details</a>
|
|
260
|
+
</li>
|
|
261
|
+
<li class="ivds-navigation__item">
|
|
262
|
+
<a href="#" class="ivds-navigation__link" style="padding: 0.5rem 0.75rem;">History</a>
|
|
263
|
+
</li>
|
|
264
|
+
<li class="ivds-navigation__item">
|
|
265
|
+
<a href="#" class="ivds-navigation__link" style="padding: 0.5rem 0.75rem;">Settings</a>
|
|
266
|
+
</li>
|
|
267
|
+
</ul>
|
|
268
|
+
</nav>
|
|
269
|
+
`;
|
|
270
|
+
|
|
271
|
+
// Navigation with badges
|
|
272
|
+
export const WithBadges = () => `
|
|
273
|
+
<nav class="ivds-navigation ivds-navigation--vertical" aria-label="Main navigation" style="width: 280px;">
|
|
274
|
+
<ul class="ivds-navigation__list">
|
|
275
|
+
<li class="ivds-navigation__item">
|
|
276
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page">
|
|
277
|
+
<span style="display: flex; align-items: center; justify-content: space-between; width: 100%;">
|
|
278
|
+
<span>
|
|
279
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 0.5rem; vertical-align: middle;">
|
|
280
|
+
<path d="M3 9L12 2L21 9V20A2 2 0 0 1 19 22H5A2 2 0 0 1 3 20V9Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
281
|
+
</svg>
|
|
282
|
+
Dashboard
|
|
283
|
+
</span>
|
|
284
|
+
</span>
|
|
285
|
+
</a>
|
|
286
|
+
</li>
|
|
287
|
+
<li class="ivds-navigation__item">
|
|
288
|
+
<a href="#" class="ivds-navigation__link">
|
|
289
|
+
<span style="display: flex; align-items: center; justify-content: space-between; width: 100%;">
|
|
290
|
+
<span>
|
|
291
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 0.5rem; vertical-align: middle;">
|
|
292
|
+
<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9" stroke="currentColor" stroke-width="2"/>
|
|
293
|
+
</svg>
|
|
294
|
+
Notifications
|
|
295
|
+
</span>
|
|
296
|
+
<span style="background-color: #ef4444; color: white; font-size: 0.75rem; padding: 0.125rem 0.375rem; border-radius: 0.75rem; min-width: 1.25rem; text-align: center;">3</span>
|
|
297
|
+
</span>
|
|
298
|
+
</a>
|
|
299
|
+
</li>
|
|
300
|
+
<li class="ivds-navigation__item">
|
|
301
|
+
<a href="#" class="ivds-navigation__link">
|
|
302
|
+
<span style="display: flex; align-items: center; justify-content: space-between; width: 100%;">
|
|
303
|
+
<span>
|
|
304
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 0.5rem; vertical-align: middle;">
|
|
305
|
+
<path d="M21 15A2 2 0 0 1 19 17H7L4 20V4A2 2 0 0 1 6 2H19A2 2 0 0 1 21 4V15Z" stroke="currentColor" stroke-width="2"/>
|
|
306
|
+
</svg>
|
|
307
|
+
Messages
|
|
308
|
+
</span>
|
|
309
|
+
<span style="background-color: #10b981; color: white; font-size: 0.75rem; padding: 0.125rem 0.375rem; border-radius: 0.75rem; min-width: 1.25rem; text-align: center;">12</span>
|
|
310
|
+
</span>
|
|
311
|
+
</a>
|
|
312
|
+
</li>
|
|
313
|
+
<li class="ivds-navigation__item">
|
|
314
|
+
<a href="#" class="ivds-navigation__link">
|
|
315
|
+
<span style="display: flex; align-items: center; justify-content: space-between; width: 100%;">
|
|
316
|
+
<span>
|
|
317
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 0.5rem; vertical-align: middle;">
|
|
318
|
+
<rect x="3" y="3" width="18" height="18" rx="2" ry="2" stroke="currentColor" stroke-width="2" fill="none"/>
|
|
319
|
+
</svg>
|
|
320
|
+
Tasks
|
|
321
|
+
</span>
|
|
322
|
+
<span style="background-color: #f59e0b; color: white; font-size: 0.75rem; padding: 0.125rem 0.375rem; border-radius: 0.75rem; min-width: 1.25rem; text-align: center;">5</span>
|
|
323
|
+
</span>
|
|
324
|
+
</a>
|
|
325
|
+
</li>
|
|
326
|
+
</ul>
|
|
327
|
+
</nav>
|
|
328
|
+
`;
|
|
329
|
+
|
|
330
|
+
// Breadcrumb-style navigation
|
|
331
|
+
export const BreadcrumbStyle = () => `
|
|
332
|
+
<nav class="ivds-navigation ivds-navigation--horizontal" aria-label="Breadcrumb navigation">
|
|
333
|
+
<ul class="ivds-navigation__list" style="align-items: center;">
|
|
334
|
+
<li class="ivds-navigation__item">
|
|
335
|
+
<a href="#" class="ivds-navigation__link" style="padding: 0.5rem;">Home</a>
|
|
336
|
+
</li>
|
|
337
|
+
<li style="color: #6b7280; margin: 0 0.5rem;">/</li>
|
|
338
|
+
<li class="ivds-navigation__item">
|
|
339
|
+
<a href="#" class="ivds-navigation__link" style="padding: 0.5rem;">Products</a>
|
|
340
|
+
</li>
|
|
341
|
+
<li style="color: #6b7280; margin: 0 0.5rem;">/</li>
|
|
342
|
+
<li class="ivds-navigation__item">
|
|
343
|
+
<a href="#" class="ivds-navigation__link" style="padding: 0.5rem;">Electronics</a>
|
|
344
|
+
</li>
|
|
345
|
+
<li style="color: #6b7280; margin: 0 0.5rem;">/</li>
|
|
346
|
+
<li class="ivds-navigation__item">
|
|
347
|
+
<span class="ivds-navigation__link ivds-navigation__link--active" style="padding: 0.5rem; cursor: default;" aria-current="page">Laptops</span>
|
|
348
|
+
</li>
|
|
349
|
+
</ul>
|
|
350
|
+
</nav>
|
|
351
|
+
`;
|
|
352
|
+
|
|
353
|
+
// Accessibility example
|
|
354
|
+
export const AccessibilityFeatures = () => `
|
|
355
|
+
<div style="display: flex; gap: 2rem;">
|
|
356
|
+
<nav class="ivds-navigation ivds-navigation--vertical" aria-label="Main navigation" role="navigation" style="width: 280px;">
|
|
357
|
+
<ul class="ivds-navigation__list">
|
|
358
|
+
<li class="ivds-navigation__item">
|
|
359
|
+
<a href="#" class="ivds-navigation__link ivds-navigation__link--active" aria-current="page" aria-describedby="nav-help">
|
|
360
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 0.5rem; vertical-align: middle;" aria-hidden="true">
|
|
361
|
+
<path d="M3 9L12 2L21 9V20A2 2 0 0 1 19 22H5A2 2 0 0 1 3 20V9Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
362
|
+
</svg>
|
|
363
|
+
Dashboard
|
|
364
|
+
</a>
|
|
365
|
+
</li>
|
|
366
|
+
<li class="ivds-navigation__item">
|
|
367
|
+
<a href="#" class="ivds-navigation__link" aria-label="View and manage your projects">
|
|
368
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 0.5rem; vertical-align: middle;" aria-hidden="true">
|
|
369
|
+
<rect x="3" y="3" width="18" height="18" rx="2" ry="2" stroke="currentColor" stroke-width="2" fill="none"/>
|
|
370
|
+
</svg>
|
|
371
|
+
Projects
|
|
372
|
+
</a>
|
|
373
|
+
</li>
|
|
374
|
+
<li class="ivds-navigation__item">
|
|
375
|
+
<a href="#" class="ivds-navigation__link" aria-label="Manage team members and permissions">
|
|
376
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 0.5rem; vertical-align: middle;" aria-hidden="true">
|
|
377
|
+
<path d="M17 21V19A4 4 0 0 0 13 15H5A4 4 0 0 0 1 19V21" stroke="currentColor" stroke-width="2"/>
|
|
378
|
+
<circle cx="9" cy="7" r="4" stroke="currentColor" stroke-width="2" fill="none"/>
|
|
379
|
+
</svg>
|
|
380
|
+
Team
|
|
381
|
+
</a>
|
|
382
|
+
</li>
|
|
383
|
+
<li class="ivds-navigation__item">
|
|
384
|
+
<a href="#" class="ivds-navigation__link" aria-label="Configure application settings">
|
|
385
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 0.5rem; vertical-align: middle;" aria-hidden="true">
|
|
386
|
+
<circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2" fill="none"/>
|
|
387
|
+
<path d="M19.4 15A1.65 1.65 0 0 0 21 13.09A1.65 1.65 0 0 0 19.4 9" stroke="currentColor" stroke-width="2"/>
|
|
388
|
+
</svg>
|
|
389
|
+
Settings
|
|
390
|
+
</a>
|
|
391
|
+
</li>
|
|
392
|
+
</ul>
|
|
393
|
+
</nav>
|
|
394
|
+
|
|
395
|
+
<div style="flex: 1; padding: 1rem; background-color: #f8fafc; border-radius: 0.5rem;">
|
|
396
|
+
<h3>Accessibility Features</h3>
|
|
397
|
+
<ul style="margin-top: 1rem; line-height: 1.6;">
|
|
398
|
+
<li><strong>Semantic HTML:</strong> Uses proper nav, ul, li structure</li>
|
|
399
|
+
<li><strong>ARIA Labels:</strong> Descriptive labels for navigation and links</li>
|
|
400
|
+
<li><strong>Current Page:</strong> aria-current="page" indicates active item</li>
|
|
401
|
+
<li><strong>Focus Management:</strong> Proper focus indicators and keyboard navigation</li>
|
|
402
|
+
<li><strong>Screen Reader Support:</strong> aria-hidden for decorative icons</li>
|
|
403
|
+
<li><strong>Role Attributes:</strong> Explicit navigation role</li>
|
|
404
|
+
</ul>
|
|
405
|
+
<p id="nav-help" style="margin-top: 1rem; font-size: 0.875rem; color: #6b7280;">
|
|
406
|
+
Use arrow keys to navigate between menu items, Enter or Space to activate links.
|
|
407
|
+
</p>
|
|
408
|
+
</div>
|
|
409
|
+
</div>
|
|
410
|
+
`;
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
// Notification component mixins and private styles
|
|
2
|
+
// This file contains mixins for notification variants, dismissible functionality, and internal utilities
|
|
3
|
+
|
|
4
|
+
@use '../../variables/variables' as vars;
|
|
5
|
+
|
|
6
|
+
// Base notification mixin with common styles
|
|
7
|
+
@mixin notification-base {
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: flex-start;
|
|
10
|
+
padding: var(--spacing-4, 1rem);
|
|
11
|
+
border-radius: var(--borderRadius-md, 0.375rem);
|
|
12
|
+
border-left: var(--borderWidth-4, 4px) solid;
|
|
13
|
+
box-shadow: var(--shadow-sm, 0 1px 2px 0 rgba(0, 0, 0, 0.05));
|
|
14
|
+
position: relative;
|
|
15
|
+
transition: all 0.15s ease-in-out;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Notification variant mixin
|
|
19
|
+
@mixin notification-variant($bg-color, $border-color, $text-color, $title-color) {
|
|
20
|
+
background-color: $bg-color;
|
|
21
|
+
border-left-color: $border-color;
|
|
22
|
+
|
|
23
|
+
.ivds-notification__title {
|
|
24
|
+
color: $title-color;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.ivds-notification__message {
|
|
28
|
+
color: $text-color;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.ivds-notification__icon {
|
|
32
|
+
color: $border-color;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Notification icon mixin
|
|
37
|
+
@mixin notification-icon {
|
|
38
|
+
flex-shrink: 0;
|
|
39
|
+
margin-right: var(--spacing-3, 0.75rem);
|
|
40
|
+
margin-top: var(--spacing-1, 0.25rem);
|
|
41
|
+
width: 1.25rem;
|
|
42
|
+
height: 1.25rem;
|
|
43
|
+
display: inline-flex;
|
|
44
|
+
align-items: center;
|
|
45
|
+
justify-content: center;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Notification content mixin
|
|
49
|
+
@mixin notification-content {
|
|
50
|
+
flex: 1;
|
|
51
|
+
min-width: 0; // Prevent flex item from overflowing
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Notification title mixin
|
|
55
|
+
@mixin notification-title($font-size: var(--fontSize-base, 1rem), $font-weight: var(--fontWeight-medium, 500)) {
|
|
56
|
+
margin: 0 0 var(--spacing-1, 0.25rem) 0;
|
|
57
|
+
font-size: $font-size;
|
|
58
|
+
font-weight: $font-weight;
|
|
59
|
+
line-height: var(--lineHeight-tight, 1.25);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Notification message mixin
|
|
63
|
+
@mixin notification-message($font-size: var(--fontSize-sm, 0.875rem)) {
|
|
64
|
+
margin: 0;
|
|
65
|
+
font-size: $font-size;
|
|
66
|
+
line-height: var(--lineHeight-relaxed, 1.625);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Dismissible notification mixin
|
|
70
|
+
@mixin notification-dismissible {
|
|
71
|
+
padding-right: var(--spacing-12, 3rem);
|
|
72
|
+
|
|
73
|
+
.ivds-notification__dismiss {
|
|
74
|
+
position: absolute;
|
|
75
|
+
top: var(--spacing-3, 0.75rem);
|
|
76
|
+
right: var(--spacing-3, 0.75rem);
|
|
77
|
+
background: transparent;
|
|
78
|
+
border: none;
|
|
79
|
+
cursor: pointer;
|
|
80
|
+
padding: var(--spacing-1, 0.25rem);
|
|
81
|
+
border-radius: var(--borderRadius-sm, 0.25rem);
|
|
82
|
+
color: inherit;
|
|
83
|
+
opacity: 0.7;
|
|
84
|
+
transition: opacity 0.15s ease-in-out, background-color 0.15s ease-in-out;
|
|
85
|
+
|
|
86
|
+
&:hover {
|
|
87
|
+
opacity: 1;
|
|
88
|
+
background-color: rgba(0, 0, 0, 0.05);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&:focus {
|
|
92
|
+
outline: 2px solid var(--color-brand-primary-500, #0ea5e9);
|
|
93
|
+
outline-offset: 2px;
|
|
94
|
+
opacity: 1;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
&:active {
|
|
98
|
+
transform: scale(0.95);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Notification actions mixin
|
|
104
|
+
@mixin notification-actions {
|
|
105
|
+
display: flex;
|
|
106
|
+
gap: var(--spacing-2, 0.5rem);
|
|
107
|
+
margin-top: var(--spacing-3, 0.75rem);
|
|
108
|
+
align-items: center;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Notification size variants
|
|
112
|
+
@mixin notification-compact {
|
|
113
|
+
padding: var(--spacing-3, 0.75rem);
|
|
114
|
+
|
|
115
|
+
.ivds-notification__icon {
|
|
116
|
+
margin-right: var(--spacing-2, 0.5rem);
|
|
117
|
+
width: 1rem;
|
|
118
|
+
height: 1rem;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.ivds-notification__title {
|
|
122
|
+
@include notification-title(var(--fontSize-sm, 0.875rem));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.ivds-notification__message {
|
|
126
|
+
@include notification-message(var(--fontSize-xs, 0.75rem));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
&.ivds-notification--dismissible {
|
|
130
|
+
padding-right: var(--spacing-10, 2.5rem);
|
|
131
|
+
|
|
132
|
+
.ivds-notification__dismiss {
|
|
133
|
+
top: var(--spacing-2, 0.5rem);
|
|
134
|
+
right: var(--spacing-2, 0.5rem);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@mixin notification-spacious {
|
|
140
|
+
padding: var(--spacing-6, 1.5rem);
|
|
141
|
+
|
|
142
|
+
.ivds-notification__icon {
|
|
143
|
+
margin-right: var(--spacing-4, 1rem);
|
|
144
|
+
width: 1.5rem;
|
|
145
|
+
height: 1.5rem;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.ivds-notification__title {
|
|
149
|
+
@include notification-title(var(--fontSize-lg, 1.125rem), var(--fontWeight-semibold, 600));
|
|
150
|
+
|
|
151
|
+
margin-bottom: var(--spacing-2, 0.5rem);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.ivds-notification__message {
|
|
155
|
+
@include notification-message(var(--fontSize-base, 1rem));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
&.ivds-notification--dismissible {
|
|
159
|
+
padding-right: var(--spacing-14, 3.5rem);
|
|
160
|
+
|
|
161
|
+
.ivds-notification__dismiss {
|
|
162
|
+
top: var(--spacing-4, 1rem);
|
|
163
|
+
right: var(--spacing-4, 1rem);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Notification with actions mixin
|
|
169
|
+
@mixin notification-with-actions {
|
|
170
|
+
.ivds-notification__content {
|
|
171
|
+
padding-bottom: var(--spacing-1, 0.25rem);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Notification animation mixins
|
|
176
|
+
@mixin notification-slide-in {
|
|
177
|
+
animation: ivds-notification-slide-in 0.3s ease-out;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
@mixin notification-slide-out {
|
|
181
|
+
animation: ivds-notification-slide-out 0.2s ease-in forwards;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
@mixin notification-fade-in {
|
|
185
|
+
animation: ivds-notification-fade-in 0.3s ease-out;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
@mixin notification-fade-out {
|
|
189
|
+
animation: ivds-notification-fade-out 0.2s ease-in forwards;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Keyframes for animations
|
|
193
|
+
@keyframes ivds-notification-slide-in {
|
|
194
|
+
from {
|
|
195
|
+
transform: translateX(100%);
|
|
196
|
+
opacity: 0;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
to {
|
|
200
|
+
transform: translateX(0);
|
|
201
|
+
opacity: 1;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
@keyframes ivds-notification-slide-out {
|
|
206
|
+
from {
|
|
207
|
+
transform: translateX(0);
|
|
208
|
+
opacity: 1;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
to {
|
|
212
|
+
transform: translateX(100%);
|
|
213
|
+
opacity: 0;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
@keyframes ivds-notification-fade-in {
|
|
218
|
+
from {
|
|
219
|
+
opacity: 0;
|
|
220
|
+
transform: scale(0.95);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
to {
|
|
224
|
+
opacity: 1;
|
|
225
|
+
transform: scale(1);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
@keyframes ivds-notification-fade-out {
|
|
230
|
+
from {
|
|
231
|
+
opacity: 1;
|
|
232
|
+
transform: scale(1);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
to {
|
|
236
|
+
opacity: 0;
|
|
237
|
+
transform: scale(0.95);
|
|
238
|
+
}
|
|
239
|
+
}
|