zenkit-css 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +182 -0
  2. package/dist/zenkit.css +33721 -0
  3. package/dist/zenkit.css.map +1 -0
  4. package/dist/zenkit.min.css +1 -0
  5. package/dist/zenkit.min.css.map +1 -0
  6. package/package.json +41 -0
  7. package/scss/abstracts/_functions.scss +174 -0
  8. package/scss/abstracts/_mixins.scss +272 -0
  9. package/scss/abstracts/_variables.scss +216 -0
  10. package/scss/base/_reset.scss +130 -0
  11. package/scss/base/_root.scss +194 -0
  12. package/scss/base/_typography.scss +271 -0
  13. package/scss/components/_accordion.scss +200 -0
  14. package/scss/components/_affix.scss +278 -0
  15. package/scss/components/_alerts.scss +175 -0
  16. package/scss/components/_anchor.scss +438 -0
  17. package/scss/components/_autocomplete.scss +530 -0
  18. package/scss/components/_avatar.scss +256 -0
  19. package/scss/components/_backtop.scss +329 -0
  20. package/scss/components/_badges.scss +266 -0
  21. package/scss/components/_breadcrumb.scss +102 -0
  22. package/scss/components/_buttons.scss +340 -0
  23. package/scss/components/_calendar.scss +787 -0
  24. package/scss/components/_cards.scss +265 -0
  25. package/scss/components/_carousel.scss +306 -0
  26. package/scss/components/_cascader.scss +510 -0
  27. package/scss/components/_close-button.scss +106 -0
  28. package/scss/components/_colorpicker.scss +593 -0
  29. package/scss/components/_datepicker.scss +625 -0
  30. package/scss/components/_descriptions.scss +453 -0
  31. package/scss/components/_divider.scss +253 -0
  32. package/scss/components/_drawer.scss +485 -0
  33. package/scss/components/_dropdown.scss +323 -0
  34. package/scss/components/_empty.scss +321 -0
  35. package/scss/components/_floatbutton.scss +400 -0
  36. package/scss/components/_forms.scss +753 -0
  37. package/scss/components/_image.scss +497 -0
  38. package/scss/components/_inputnumber.scss +475 -0
  39. package/scss/components/_layout.scss +538 -0
  40. package/scss/components/_list-group.scss +227 -0
  41. package/scss/components/_list.scss +528 -0
  42. package/scss/components/_mentions.scss +479 -0
  43. package/scss/components/_menu.scss +510 -0
  44. package/scss/components/_message.scss +412 -0
  45. package/scss/components/_modal.scss +304 -0
  46. package/scss/components/_navbar.scss +329 -0
  47. package/scss/components/_notification.scss +499 -0
  48. package/scss/components/_offcanvas.scss +274 -0
  49. package/scss/components/_pagination.scss +176 -0
  50. package/scss/components/_placeholder.scss +237 -0
  51. package/scss/components/_popconfirm.scss +393 -0
  52. package/scss/components/_popover.scss +298 -0
  53. package/scss/components/_progress.scss +225 -0
  54. package/scss/components/_rating.scss +314 -0
  55. package/scss/components/_result.scss +383 -0
  56. package/scss/components/_segmented.scss +441 -0
  57. package/scss/components/_select.scss +412 -0
  58. package/scss/components/_spinners.scss +229 -0
  59. package/scss/components/_statistic.scss +336 -0
  60. package/scss/components/_steps.scss +343 -0
  61. package/scss/components/_tabs.scss +239 -0
  62. package/scss/components/_tag.scss +317 -0
  63. package/scss/components/_timeline.scss +341 -0
  64. package/scss/components/_timepicker.scss +468 -0
  65. package/scss/components/_toast.scss +279 -0
  66. package/scss/components/_tooltip.scss +305 -0
  67. package/scss/components/_tour.scss +488 -0
  68. package/scss/components/_transfer.scss +556 -0
  69. package/scss/components/_tree.scss +518 -0
  70. package/scss/components/_treeselect.scss +531 -0
  71. package/scss/components/_upload.scss +510 -0
  72. package/scss/components/_watermark.scss +314 -0
  73. package/scss/content/_figures.scss +38 -0
  74. package/scss/content/_images.scss +138 -0
  75. package/scss/content/_tables.scss +232 -0
  76. package/scss/layout/_container.scss +71 -0
  77. package/scss/layout/_grid.scss +258 -0
  78. package/scss/utilities/_animations.scss +494 -0
  79. package/scss/utilities/_borders.scss +246 -0
  80. package/scss/utilities/_colors.scss +194 -0
  81. package/scss/utilities/_display.scss +263 -0
  82. package/scss/utilities/_filters.scss +328 -0
  83. package/scss/utilities/_flex.scss +178 -0
  84. package/scss/utilities/_float.scss +70 -0
  85. package/scss/utilities/_grid-utils.scss +151 -0
  86. package/scss/utilities/_helpers.scss +479 -0
  87. package/scss/utilities/_interactions.scss +249 -0
  88. package/scss/utilities/_overflow.scss +204 -0
  89. package/scss/utilities/_position.scss +245 -0
  90. package/scss/utilities/_shadows.scss +67 -0
  91. package/scss/utilities/_sizing.scss +217 -0
  92. package/scss/utilities/_spacing.scss +207 -0
  93. package/scss/utilities/_text.scss +237 -0
  94. package/scss/utilities/_transforms.scss +368 -0
  95. package/scss/utilities/_visibility.scss +251 -0
  96. package/scss/zenkit.scss +121 -0
@@ -0,0 +1,151 @@
1
+ // ========================================
2
+ // ZenKit - CSS Grid Utilities
3
+ // ========================================
4
+
5
+ @use '../abstracts/variables' as *;
6
+ @use '../abstracts/mixins' as *;
7
+
8
+ // ----------------------------------------
9
+ // Grid Template Columns
10
+ // ----------------------------------------
11
+ .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
12
+ .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
13
+ .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
14
+ .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
15
+ .grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
16
+ .grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
17
+ .grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)); }
18
+ .grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)); }
19
+ .grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)); }
20
+ .grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)); }
21
+ .grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)); }
22
+ .grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
23
+ .grid-cols-none { grid-template-columns: none; }
24
+
25
+ // ----------------------------------------
26
+ // Grid Template Rows
27
+ // ----------------------------------------
28
+ .grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)); }
29
+ .grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)); }
30
+ .grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)); }
31
+ .grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)); }
32
+ .grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)); }
33
+ .grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)); }
34
+ .grid-rows-none { grid-template-rows: none; }
35
+
36
+ // ----------------------------------------
37
+ // Grid Column Span
38
+ // ----------------------------------------
39
+ .col-span-1 { grid-column: span 1 / span 1; }
40
+ .col-span-2 { grid-column: span 2 / span 2; }
41
+ .col-span-3 { grid-column: span 3 / span 3; }
42
+ .col-span-4 { grid-column: span 4 / span 4; }
43
+ .col-span-5 { grid-column: span 5 / span 5; }
44
+ .col-span-6 { grid-column: span 6 / span 6; }
45
+ .col-span-7 { grid-column: span 7 / span 7; }
46
+ .col-span-8 { grid-column: span 8 / span 8; }
47
+ .col-span-9 { grid-column: span 9 / span 9; }
48
+ .col-span-10 { grid-column: span 10 / span 10; }
49
+ .col-span-11 { grid-column: span 11 / span 11; }
50
+ .col-span-12 { grid-column: span 12 / span 12; }
51
+ .col-span-full { grid-column: 1 / -1; }
52
+ .col-auto { grid-column: auto; }
53
+
54
+ // ----------------------------------------
55
+ // Grid Row Span
56
+ // ----------------------------------------
57
+ .row-span-1 { grid-row: span 1 / span 1; }
58
+ .row-span-2 { grid-row: span 2 / span 2; }
59
+ .row-span-3 { grid-row: span 3 / span 3; }
60
+ .row-span-4 { grid-row: span 4 / span 4; }
61
+ .row-span-5 { grid-row: span 5 / span 5; }
62
+ .row-span-6 { grid-row: span 6 / span 6; }
63
+ .row-span-full { grid-row: 1 / -1; }
64
+ .row-auto { grid-row: auto; }
65
+
66
+ // ----------------------------------------
67
+ // Grid Column Start/End
68
+ // ----------------------------------------
69
+ .col-start-1 { grid-column-start: 1; }
70
+ .col-start-2 { grid-column-start: 2; }
71
+ .col-start-3 { grid-column-start: 3; }
72
+ .col-start-4 { grid-column-start: 4; }
73
+ .col-start-5 { grid-column-start: 5; }
74
+ .col-start-6 { grid-column-start: 6; }
75
+ .col-start-7 { grid-column-start: 7; }
76
+ .col-start-auto { grid-column-start: auto; }
77
+
78
+ .col-end-1 { grid-column-end: 1; }
79
+ .col-end-2 { grid-column-end: 2; }
80
+ .col-end-3 { grid-column-end: 3; }
81
+ .col-end-4 { grid-column-end: 4; }
82
+ .col-end-5 { grid-column-end: 5; }
83
+ .col-end-6 { grid-column-end: 6; }
84
+ .col-end-7 { grid-column-end: 7; }
85
+ .col-end-auto { grid-column-end: auto; }
86
+
87
+ // ----------------------------------------
88
+ // Grid Auto Flow
89
+ // ----------------------------------------
90
+ .grid-flow-row { grid-auto-flow: row; }
91
+ .grid-flow-col { grid-auto-flow: column; }
92
+ .grid-flow-row-dense { grid-auto-flow: row dense; }
93
+ .grid-flow-col-dense { grid-auto-flow: column dense; }
94
+
95
+ // ----------------------------------------
96
+ // Grid Auto Columns
97
+ // ----------------------------------------
98
+ .auto-cols-auto { grid-auto-columns: auto; }
99
+ .auto-cols-min { grid-auto-columns: min-content; }
100
+ .auto-cols-max { grid-auto-columns: max-content; }
101
+ .auto-cols-fr { grid-auto-columns: minmax(0, 1fr); }
102
+
103
+ // ----------------------------------------
104
+ // Grid Auto Rows
105
+ // ----------------------------------------
106
+ .auto-rows-auto { grid-auto-rows: auto; }
107
+ .auto-rows-min { grid-auto-rows: min-content; }
108
+ .auto-rows-max { grid-auto-rows: max-content; }
109
+ .auto-rows-fr { grid-auto-rows: minmax(0, 1fr); }
110
+
111
+ // ----------------------------------------
112
+ // Responsive Grid
113
+ // ----------------------------------------
114
+ @include sm {
115
+ .sm\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
116
+ .sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
117
+ .sm\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
118
+ .sm\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
119
+ .sm\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
120
+ .sm\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
121
+ }
122
+
123
+ @include md {
124
+ .md\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
125
+ .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
126
+ .md\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
127
+ .md\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
128
+ .md\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
129
+ .md\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
130
+ .md\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
131
+ }
132
+
133
+ @include lg {
134
+ .lg\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
135
+ .lg\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
136
+ .lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
137
+ .lg\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
138
+ .lg\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
139
+ .lg\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
140
+ .lg\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
141
+ }
142
+
143
+ @include xl {
144
+ .xl\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
145
+ .xl\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
146
+ .xl\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
147
+ .xl\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
148
+ .xl\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
149
+ .xl\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
150
+ .xl\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
151
+ }
@@ -0,0 +1,479 @@
1
+ // ========================================
2
+ // ZenKit - Helper Utilities
3
+ // Object Fit, Ratio, Stacks, Interactions, etc.
4
+ // ========================================
5
+
6
+ @use '../abstracts/variables' as *;
7
+ @use '../abstracts/mixins' as *;
8
+
9
+ // ----------------------------------------
10
+ // Object Fit
11
+ // ----------------------------------------
12
+ .object-contain { object-fit: contain; }
13
+ .object-cover { object-fit: cover; }
14
+ .object-fill { object-fit: fill; }
15
+ .object-none { object-fit: none; }
16
+ .object-scale-down { object-fit: scale-down; }
17
+
18
+ // Object Position
19
+ .object-bottom { object-position: bottom; }
20
+ .object-center { object-position: center; }
21
+ .object-left { object-position: left; }
22
+ .object-left-bottom { object-position: left bottom; }
23
+ .object-left-top { object-position: left top; }
24
+ .object-right { object-position: right; }
25
+ .object-right-bottom { object-position: right bottom; }
26
+ .object-right-top { object-position: right top; }
27
+ .object-top { object-position: top; }
28
+
29
+ // Responsive Object Fit
30
+ @include sm {
31
+ .sm\:object-contain { object-fit: contain; }
32
+ .sm\:object-cover { object-fit: cover; }
33
+ .sm\:object-fill { object-fit: fill; }
34
+ .sm\:object-none { object-fit: none; }
35
+ }
36
+
37
+ @include md {
38
+ .md\:object-contain { object-fit: contain; }
39
+ .md\:object-cover { object-fit: cover; }
40
+ .md\:object-fill { object-fit: fill; }
41
+ .md\:object-none { object-fit: none; }
42
+ }
43
+
44
+ @include lg {
45
+ .lg\:object-contain { object-fit: contain; }
46
+ .lg\:object-cover { object-fit: cover; }
47
+ .lg\:object-fill { object-fit: fill; }
48
+ .lg\:object-none { object-fit: none; }
49
+ }
50
+
51
+ // ----------------------------------------
52
+ // Aspect Ratio
53
+ // ----------------------------------------
54
+ .ratio {
55
+ position: relative;
56
+ width: 100%;
57
+
58
+ &::before {
59
+ display: block;
60
+ padding-top: var(--aspect-ratio);
61
+ content: "";
62
+ }
63
+
64
+ > * {
65
+ position: absolute;
66
+ top: 0;
67
+ left: 0;
68
+ width: 100%;
69
+ height: 100%;
70
+ }
71
+ }
72
+
73
+ .ratio-1x1 { --aspect-ratio: 100%; }
74
+ .ratio-4x3 { --aspect-ratio: 75%; }
75
+ .ratio-16x9 { --aspect-ratio: 56.25%; }
76
+ .ratio-21x9 { --aspect-ratio: 42.857143%; }
77
+
78
+ // Custom aspect ratios
79
+ .aspect-auto { aspect-ratio: auto; }
80
+ .aspect-square { aspect-ratio: 1 / 1; }
81
+ .aspect-video { aspect-ratio: 16 / 9; }
82
+ .aspect-4\/3 { aspect-ratio: 4 / 3; }
83
+ .aspect-3\/2 { aspect-ratio: 3 / 2; }
84
+ .aspect-2\/1 { aspect-ratio: 2 / 1; }
85
+
86
+ // ----------------------------------------
87
+ // Stacks (Flexbox Shortcuts)
88
+ // ----------------------------------------
89
+ .vstack {
90
+ display: flex;
91
+ flex: 1 1 auto;
92
+ flex-direction: column;
93
+ align-self: stretch;
94
+ }
95
+
96
+ .hstack {
97
+ display: flex;
98
+ flex-direction: row;
99
+ align-items: center;
100
+ align-self: stretch;
101
+ }
102
+
103
+ // ----------------------------------------
104
+ // Vertical Rule
105
+ // ----------------------------------------
106
+ .vr {
107
+ display: inline-block;
108
+ align-self: stretch;
109
+ width: 1px;
110
+ min-height: 1em;
111
+ background-color: currentColor;
112
+ opacity: 0.25;
113
+ }
114
+
115
+ // ----------------------------------------
116
+ // Stretched Link
117
+ // ----------------------------------------
118
+ .stretched-link::after {
119
+ position: absolute;
120
+ top: 0;
121
+ right: 0;
122
+ bottom: 0;
123
+ left: 0;
124
+ z-index: 1;
125
+ content: "";
126
+ }
127
+
128
+ // ----------------------------------------
129
+ // Interactions
130
+ // ----------------------------------------
131
+
132
+ // User Select
133
+ .user-select-all { user-select: all; }
134
+ .user-select-auto { user-select: auto; }
135
+ .user-select-none { user-select: none; }
136
+
137
+ // Pointer Events
138
+ .pe-none { pointer-events: none; }
139
+ .pe-auto { pointer-events: auto; }
140
+
141
+ // Cursor
142
+ .cursor-auto { cursor: auto; }
143
+ .cursor-default { cursor: default; }
144
+ .cursor-pointer { cursor: pointer; }
145
+ .cursor-wait { cursor: wait; }
146
+ .cursor-text { cursor: text; }
147
+ .cursor-move { cursor: move; }
148
+ .cursor-help { cursor: help; }
149
+ .cursor-not-allowed { cursor: not-allowed; }
150
+ .cursor-none { cursor: none; }
151
+ .cursor-grab { cursor: grab; }
152
+ .cursor-grabbing { cursor: grabbing; }
153
+
154
+ // ----------------------------------------
155
+ // Link Utilities
156
+ // ----------------------------------------
157
+ .link-primary {
158
+ color: var(--primary);
159
+
160
+ &:hover, &:focus {
161
+ color: var(--primary-700);
162
+ }
163
+ }
164
+
165
+ .link-secondary {
166
+ color: var(--gray-600);
167
+
168
+ &:hover, &:focus {
169
+ color: var(--gray-800);
170
+ }
171
+ }
172
+
173
+ .link-success {
174
+ color: var(--success);
175
+
176
+ &:hover, &:focus {
177
+ color: var(--success-dark);
178
+ }
179
+ }
180
+
181
+ .link-danger {
182
+ color: var(--danger);
183
+
184
+ &:hover, &:focus {
185
+ color: var(--danger-dark);
186
+ }
187
+ }
188
+
189
+ .link-warning {
190
+ color: var(--warning);
191
+
192
+ &:hover, &:focus {
193
+ color: var(--warning-dark);
194
+ }
195
+ }
196
+
197
+ .link-info {
198
+ color: var(--info);
199
+
200
+ &:hover, &:focus {
201
+ color: var(--info-dark);
202
+ }
203
+ }
204
+
205
+ .link-body-emphasis {
206
+ color: var(--text);
207
+
208
+ &:hover, &:focus {
209
+ color: var(--text);
210
+ }
211
+ }
212
+
213
+ // Link Underline
214
+ .link-underline { text-decoration: underline; }
215
+ .link-underline-primary { text-decoration-color: var(--primary); }
216
+ .link-underline-secondary { text-decoration-color: var(--gray-600); }
217
+ .link-underline-success { text-decoration-color: var(--success); }
218
+ .link-underline-danger { text-decoration-color: var(--danger); }
219
+ .link-underline-warning { text-decoration-color: var(--warning); }
220
+ .link-underline-info { text-decoration-color: var(--info); }
221
+
222
+ // Link Offset
223
+ .link-offset-1 { text-underline-offset: 0.125em; }
224
+ .link-offset-2 { text-underline-offset: 0.25em; }
225
+ .link-offset-3 { text-underline-offset: 0.375em; }
226
+
227
+ // Link Opacity
228
+ .link-opacity-10 { --link-opacity: 0.1; }
229
+ .link-opacity-25 { --link-opacity: 0.25; }
230
+ .link-opacity-50 { --link-opacity: 0.5; }
231
+ .link-opacity-75 { --link-opacity: 0.75; }
232
+ .link-opacity-100 { --link-opacity: 1; }
233
+
234
+ // ----------------------------------------
235
+ // Focus Ring
236
+ // ----------------------------------------
237
+ .focus-ring:focus {
238
+ outline: 0;
239
+ box-shadow: 0 0 0 0.25rem rgba($primary, 0.25);
240
+ }
241
+
242
+ .focus-ring-primary:focus {
243
+ box-shadow: 0 0 0 0.25rem rgba($primary, 0.25);
244
+ }
245
+
246
+ .focus-ring-secondary:focus {
247
+ box-shadow: 0 0 0 0.25rem rgba($gray-600, 0.25);
248
+ }
249
+
250
+ .focus-ring-success:focus {
251
+ box-shadow: 0 0 0 0.25rem rgba($success, 0.25);
252
+ }
253
+
254
+ .focus-ring-danger:focus {
255
+ box-shadow: 0 0 0 0.25rem rgba($danger, 0.25);
256
+ }
257
+
258
+ .focus-ring-warning:focus {
259
+ box-shadow: 0 0 0 0.25rem rgba($warning, 0.25);
260
+ }
261
+
262
+ .focus-ring-info:focus {
263
+ box-shadow: 0 0 0 0.25rem rgba($info, 0.25);
264
+ }
265
+
266
+ // ----------------------------------------
267
+ // Text Selection
268
+ // ----------------------------------------
269
+ .text-selection-primary::selection {
270
+ background-color: var(--primary);
271
+ color: var(--white);
272
+ }
273
+
274
+ // ----------------------------------------
275
+ // Touch Action
276
+ // ----------------------------------------
277
+ .touch-none { touch-action: none; }
278
+ .touch-pan-x { touch-action: pan-x; }
279
+ .touch-pan-y { touch-action: pan-y; }
280
+ .touch-manipulation { touch-action: manipulation; }
281
+
282
+ // ----------------------------------------
283
+ // Scroll Behavior
284
+ // ----------------------------------------
285
+ .scroll-auto { scroll-behavior: auto; }
286
+ .scroll-smooth { scroll-behavior: smooth; }
287
+
288
+ // ----------------------------------------
289
+ // Scroll Snap
290
+ // ----------------------------------------
291
+ .snap-start { scroll-snap-align: start; }
292
+ .snap-end { scroll-snap-align: end; }
293
+ .snap-center { scroll-snap-align: center; }
294
+ .snap-align-none { scroll-snap-align: none; }
295
+
296
+ .snap-normal { scroll-snap-stop: normal; }
297
+ .snap-always { scroll-snap-stop: always; }
298
+
299
+ .snap-none { scroll-snap-type: none; }
300
+ .snap-x { scroll-snap-type: x var(--scroll-snap-strictness, mandatory); }
301
+ .snap-y { scroll-snap-type: y var(--scroll-snap-strictness, mandatory); }
302
+ .snap-both { scroll-snap-type: both var(--scroll-snap-strictness, mandatory); }
303
+
304
+ .snap-mandatory { --scroll-snap-strictness: mandatory; }
305
+ .snap-proximity { --scroll-snap-strictness: proximity; }
306
+
307
+ // ----------------------------------------
308
+ // Resize
309
+ // ----------------------------------------
310
+ .resize-none { resize: none; }
311
+ .resize-y { resize: vertical; }
312
+ .resize-x { resize: horizontal; }
313
+ .resize { resize: both; }
314
+
315
+ // ----------------------------------------
316
+ // Appearance
317
+ // ----------------------------------------
318
+ .appearance-none { appearance: none; }
319
+ .appearance-auto { appearance: auto; }
320
+
321
+ // ----------------------------------------
322
+ // Will Change (Performance)
323
+ // ----------------------------------------
324
+ .will-change-auto { will-change: auto; }
325
+ .will-change-scroll { will-change: scroll-position; }
326
+ .will-change-contents { will-change: contents; }
327
+ .will-change-transform { will-change: transform; }
328
+
329
+ // ----------------------------------------
330
+ // Content Visibility (Performance)
331
+ // ----------------------------------------
332
+ .content-auto { content-visibility: auto; }
333
+ .content-hidden { content-visibility: hidden; }
334
+ .content-visible { content-visibility: visible; }
335
+
336
+ // ----------------------------------------
337
+ // Bootstrap Aliases
338
+ // ----------------------------------------
339
+
340
+ // Visually Hidden (alias for .sr-only)
341
+ .visually-hidden {
342
+ position: absolute;
343
+ width: 1px;
344
+ height: 1px;
345
+ padding: 0;
346
+ margin: -1px;
347
+ overflow: hidden;
348
+ clip: rect(0, 0, 0, 0);
349
+ white-space: nowrap;
350
+ border: 0;
351
+ }
352
+
353
+ .visually-hidden-focusable {
354
+ &:not(:focus):not(:focus-within) {
355
+ position: absolute;
356
+ width: 1px;
357
+ height: 1px;
358
+ padding: 0;
359
+ margin: -1px;
360
+ overflow: hidden;
361
+ clip: rect(0, 0, 0, 0);
362
+ white-space: nowrap;
363
+ border: 0;
364
+ }
365
+ }
366
+
367
+ // Text Truncate (alias for .truncate)
368
+ .text-truncate {
369
+ overflow: hidden;
370
+ text-overflow: ellipsis;
371
+ white-space: nowrap;
372
+ }
373
+
374
+ // Text Reset - inherit color from parent
375
+ .text-reset {
376
+ color: inherit !important;
377
+ }
378
+
379
+ // ----------------------------------------
380
+ // Icon Link
381
+ // ----------------------------------------
382
+ .icon-link {
383
+ display: inline-flex;
384
+ gap: 0.375rem;
385
+ align-items: center;
386
+ text-decoration-color: rgba($primary, 0.5);
387
+ text-underline-offset: 0.25em;
388
+
389
+ > svg,
390
+ > .bi {
391
+ width: 1em;
392
+ height: 1em;
393
+ flex-shrink: 0;
394
+ fill: currentColor;
395
+ transition: transform $transition-fast ease-in-out;
396
+ }
397
+ }
398
+
399
+ .icon-link-hover:hover > svg,
400
+ .icon-link-hover:hover > .bi,
401
+ .icon-link-hover:focus-visible > svg,
402
+ .icon-link-hover:focus-visible > .bi {
403
+ transform: translateX(0.25em);
404
+ }
405
+
406
+ // ----------------------------------------
407
+ // Skip Link (Accessibility)
408
+ // ----------------------------------------
409
+ .skip-link {
410
+ position: absolute;
411
+ top: -100%;
412
+ left: 50%;
413
+ transform: translateX(-50%);
414
+ background: var(--primary);
415
+ color: var(--white);
416
+ padding: 0.75rem 1.5rem;
417
+ border-radius: var(--radius);
418
+ text-decoration: none;
419
+ font-weight: $font-weight-semibold;
420
+ z-index: 9999;
421
+ transition: top $transition-fast ease-in-out;
422
+
423
+ &:focus {
424
+ top: 1rem;
425
+ outline: 2px solid var(--primary);
426
+ outline-offset: 2px;
427
+ }
428
+ }
429
+
430
+ // ----------------------------------------
431
+ // Focus Visible Enhancement
432
+ // ----------------------------------------
433
+ .focus-visible-only:focus:not(:focus-visible) {
434
+ outline: none;
435
+ box-shadow: none;
436
+ }
437
+
438
+ .focus-visible-only:focus-visible {
439
+ outline: 2px solid var(--primary);
440
+ outline-offset: 2px;
441
+ }
442
+
443
+ // ----------------------------------------
444
+ // Backdrop Blur
445
+ // ----------------------------------------
446
+ .backdrop-blur-none { backdrop-filter: blur(0); }
447
+ .backdrop-blur-sm { backdrop-filter: blur(4px); }
448
+ .backdrop-blur { backdrop-filter: blur(8px); }
449
+ .backdrop-blur-md { backdrop-filter: blur(12px); }
450
+ .backdrop-blur-lg { backdrop-filter: blur(16px); }
451
+ .backdrop-blur-xl { backdrop-filter: blur(24px); }
452
+ .backdrop-blur-2xl { backdrop-filter: blur(40px); }
453
+ .backdrop-blur-3xl { backdrop-filter: blur(64px); }
454
+
455
+ // ----------------------------------------
456
+ // Mix Blend Mode
457
+ // ----------------------------------------
458
+ .mix-blend-normal { mix-blend-mode: normal; }
459
+ .mix-blend-multiply { mix-blend-mode: multiply; }
460
+ .mix-blend-screen { mix-blend-mode: screen; }
461
+ .mix-blend-overlay { mix-blend-mode: overlay; }
462
+ .mix-blend-darken { mix-blend-mode: darken; }
463
+ .mix-blend-lighten { mix-blend-mode: lighten; }
464
+ .mix-blend-color-dodge { mix-blend-mode: color-dodge; }
465
+ .mix-blend-color-burn { mix-blend-mode: color-burn; }
466
+ .mix-blend-hard-light { mix-blend-mode: hard-light; }
467
+ .mix-blend-soft-light { mix-blend-mode: soft-light; }
468
+ .mix-blend-difference { mix-blend-mode: difference; }
469
+ .mix-blend-exclusion { mix-blend-mode: exclusion; }
470
+ .mix-blend-hue { mix-blend-mode: hue; }
471
+ .mix-blend-saturation { mix-blend-mode: saturation; }
472
+ .mix-blend-color { mix-blend-mode: color; }
473
+ .mix-blend-luminosity { mix-blend-mode: luminosity; }
474
+
475
+ // ----------------------------------------
476
+ // Isolation
477
+ // ----------------------------------------
478
+ .isolate { isolation: isolate; }
479
+ .isolation-auto { isolation: auto; }