@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.
Files changed (154) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +215 -0
  3. package/lib/all.css +6802 -0
  4. package/lib/all.min.css +1 -0
  5. package/lib/base/base.css +215 -0
  6. package/lib/base/base.min.css +1 -0
  7. package/lib/components/_breadcrumb-mixins.scss +173 -0
  8. package/lib/components/_button-mixin.scss +120 -0
  9. package/lib/components/_card-mixin.scss +196 -0
  10. package/lib/components/_checkbox-mixin.scss +208 -0
  11. package/lib/components/_footer-mixin.scss +385 -0
  12. package/lib/components/_header-mixin.scss +275 -0
  13. package/lib/components/_navigation-mixins.scss +270 -0
  14. package/lib/components/_notification-mixin.scss +239 -0
  15. package/lib/components/_pagination-mixins.scss +280 -0
  16. package/lib/components/_radio-button-mixin.scss +207 -0
  17. package/lib/components/_tag-mixin.scss +261 -0
  18. package/lib/components/_text-input-mixin.scss +203 -0
  19. package/lib/components/all.css +3005 -0
  20. package/lib/components/all.min.css +1 -0
  21. package/lib/components/breadcrumb/breadcrumb.css +141 -0
  22. package/lib/components/breadcrumb/breadcrumb.min.css +1 -0
  23. package/lib/components/button/button.css +221 -0
  24. package/lib/components/button/button.min.css +1 -0
  25. package/lib/components/card/card.css +236 -0
  26. package/lib/components/card/card.min.css +1 -0
  27. package/lib/components/checkbox/checkbox.css +305 -0
  28. package/lib/components/checkbox/checkbox.min.css +1 -0
  29. package/lib/components/footer/footer.css +466 -0
  30. package/lib/components/footer/footer.min.css +1 -0
  31. package/lib/components/header/header.css +274 -0
  32. package/lib/components/header/header.min.css +1 -0
  33. package/lib/components/navigation/navigation.css +214 -0
  34. package/lib/components/navigation/navigation.min.css +1 -0
  35. package/lib/components/notification/notification.css +253 -0
  36. package/lib/components/notification/notification.min.css +1 -0
  37. package/lib/components/pagination/pagination.css +221 -0
  38. package/lib/components/pagination/pagination.min.css +1 -0
  39. package/lib/components/radio-button/radio-button.css +326 -0
  40. package/lib/components/radio-button/radio-button.min.css +1 -0
  41. package/lib/components/tag/tag.css +367 -0
  42. package/lib/components/tag/tag.min.css +1 -0
  43. package/lib/components/text-input/text-input.css +243 -0
  44. package/lib/components/text-input/text-input.min.css +1 -0
  45. package/lib/icons/icon-arrow-left.css +139 -0
  46. package/lib/icons/icon-arrow-left.min.css +1 -0
  47. package/lib/icons/icon-arrow-right.css +139 -0
  48. package/lib/icons/icon-arrow-right.min.css +1 -0
  49. package/lib/icons/icon-check.css +139 -0
  50. package/lib/icons/icon-check.min.css +1 -0
  51. package/lib/icons/icon-close.css +140 -0
  52. package/lib/icons/icon-close.min.css +1 -0
  53. package/lib/icons/icon-error.css +140 -0
  54. package/lib/icons/icon-error.min.css +1 -0
  55. package/lib/icons/icon-info.css +140 -0
  56. package/lib/icons/icon-info.min.css +1 -0
  57. package/lib/icons/icon-success.css +139 -0
  58. package/lib/icons/icon-success.min.css +1 -0
  59. package/lib/icons/icon-warning.css +139 -0
  60. package/lib/icons/icon-warning.min.css +1 -0
  61. package/lib/icons/icons.css +1158 -0
  62. package/lib/icons/icons.min.css +1 -0
  63. package/lib/utils/_flex.scss +200 -0
  64. package/lib/utils/_grid.scss +211 -0
  65. package/lib/utils/_layout.scss +253 -0
  66. package/lib/utils/_spacing.scss +260 -0
  67. package/lib/utils/_typography.scss +111 -0
  68. package/lib/utils/utils.css +2434 -0
  69. package/lib/utils/utils.min.css +1 -0
  70. package/lib/utils-only.css +2801 -0
  71. package/lib/utils-only.min.css +1 -0
  72. package/lib/variables/variables.css +2 -0
  73. package/lib/variables/variables.min.css +0 -0
  74. package/package.json +194 -0
  75. package/src/__tests__/example.test.scss +12 -0
  76. package/src/accessibility.stories.js +416 -0
  77. package/src/all.scss +9 -0
  78. package/src/base/_layout.scss +97 -0
  79. package/src/base/_reset.scss +85 -0
  80. package/src/base/_typography.scss +105 -0
  81. package/src/base/base.scss +6 -0
  82. package/src/components/all.scss +22 -0
  83. package/src/components/breadcrumb/_breadcrumb-mixins.scss +173 -0
  84. package/src/components/breadcrumb/breadcrumb.scss +68 -0
  85. package/src/components/breadcrumb/breadcrumb.stories.js +483 -0
  86. package/src/components/button/__tests__/button-mixins.test.scss +35 -0
  87. package/src/components/button/_button-mixin.scss +120 -0
  88. package/src/components/button/button.scss +126 -0
  89. package/src/components/button/button.stories.js +364 -0
  90. package/src/components/card/__tests__/card-mixins.test.scss +36 -0
  91. package/src/components/card/_card-mixin.scss +196 -0
  92. package/src/components/card/card.scss +193 -0
  93. package/src/components/card/card.stories.js +635 -0
  94. package/src/components/checkbox/_checkbox-mixin.scss +208 -0
  95. package/src/components/checkbox/checkbox.scss +141 -0
  96. package/src/components/checkbox/checkbox.stories.js +303 -0
  97. package/src/components/footer/_footer-mixin.scss +385 -0
  98. package/src/components/footer/footer.scss +86 -0
  99. package/src/components/footer/footer.stories.js +740 -0
  100. package/src/components/header/_header-mixin.scss +275 -0
  101. package/src/components/header/header.scss +84 -0
  102. package/src/components/header/header.stories.js +450 -0
  103. package/src/components/navigation/_navigation-mixins.scss +270 -0
  104. package/src/components/navigation/navigation.scss +64 -0
  105. package/src/components/navigation/navigation.stories.js +410 -0
  106. package/src/components/notification/_notification-mixin.scss +239 -0
  107. package/src/components/notification/notification.scss +118 -0
  108. package/src/components/notification/notification.stories.js +378 -0
  109. package/src/components/overview.stories.js +473 -0
  110. package/src/components/pagination/_pagination-mixins.scss +280 -0
  111. package/src/components/pagination/pagination.scss +76 -0
  112. package/src/components/pagination/pagination.stories.js +729 -0
  113. package/src/components/radio-button/_radio-button-mixin.scss +207 -0
  114. package/src/components/radio-button/radio-button.scss +178 -0
  115. package/src/components/radio-button/radio-button.stories.js +379 -0
  116. package/src/components/tag/_tag-mixin.scss +261 -0
  117. package/src/components/tag/tag.scss +244 -0
  118. package/src/components/tag/tag.stories.js +482 -0
  119. package/src/components/text-input/_text-input-mixin.scss +203 -0
  120. package/src/components/text-input/text-input.scss +150 -0
  121. package/src/components/text-input/text-input.stories.js +723 -0
  122. package/src/icons/_icon.scss +121 -0
  123. package/src/icons/icon-arrow-left.scss +23 -0
  124. package/src/icons/icon-arrow-right.scss +23 -0
  125. package/src/icons/icon-check.scss +23 -0
  126. package/src/icons/icon-close.scss +24 -0
  127. package/src/icons/icon-error.scss +24 -0
  128. package/src/icons/icon-info.scss +24 -0
  129. package/src/icons/icon-success.scss +23 -0
  130. package/src/icons/icon-warning.scss +23 -0
  131. package/src/icons/icons.scss +12 -0
  132. package/src/icons/icons.stories.js +249 -0
  133. package/src/icons/svg/arrow-left.svg +3 -0
  134. package/src/icons/svg/arrow-right.svg +3 -0
  135. package/src/icons/svg/check.svg +3 -0
  136. package/src/icons/svg/close.svg +4 -0
  137. package/src/icons/svg/error.svg +5 -0
  138. package/src/icons/svg/info.svg +5 -0
  139. package/src/icons/svg/success.svg +4 -0
  140. package/src/icons/svg/warning.svg +5 -0
  141. package/src/utils/__tests__/utilities.test.scss +37 -0
  142. package/src/utils/_flex.scss +200 -0
  143. package/src/utils/_grid.scss +211 -0
  144. package/src/utils/_layout.scss +253 -0
  145. package/src/utils/_spacing.scss +260 -0
  146. package/src/utils/_typography.scss +111 -0
  147. package/src/utils/utils.scss +8 -0
  148. package/src/variables/_borders.scss +15 -0
  149. package/src/variables/_breakpoints.scss +11 -0
  150. package/src/variables/_colors.scss +97 -0
  151. package/src/variables/_shadows.scss +14 -0
  152. package/src/variables/_spacing.scss +24 -0
  153. package/src/variables/_typography.scss +47 -0
  154. 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
+ }