emily-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.
@@ -0,0 +1 @@
1
+ .py-2{ padding-top: 0.5rem;padding-bottom: 0.5rem;} .px-4{ padding-left: 1rem;padding-right: 1rem;} .text-lg{ font-size: var(--text-lg);line-height: 1.6;} .font-bold{ font-weight: 700;} .bg-primary-90{ background-color: #004469;} .bg-success-80{ background-color: #017F65;} .hover\:bg-primary-80:hover{ background-color: #0077B6;} .hover\:bg-success-70:hover{ background-color: #02AA89;}
Binary file
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "emily-css",
3
+ "version": "1.0.0",
4
+ "description": "Config-driven, utility-first CSS framework. Define brand colours once, generate 11,000+ utilities, browse and copy production-ready components.",
5
+ "main": "src/index.js",
6
+ "bin": {
7
+ "emily-ui": "./bin/emilyui.js"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "src/",
12
+ "dist/",
13
+ "fonts/",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "node src/index.js",
19
+ "dev": "nodemon src/index.js",
20
+ "init": "node src/init.js",
21
+ "test": "node tests/test.js"
22
+ },
23
+ "keywords": [
24
+ "css",
25
+ "design-system",
26
+ "components",
27
+ "config-driven",
28
+ "utility-css",
29
+ "accessibility",
30
+ "drupal",
31
+ "legacy",
32
+ "no-build-step"
33
+ ],
34
+ "author": "Andy Terry",
35
+ "license": "MIT",
36
+ "engines": {
37
+ "node": ">=16.0.0"
38
+ },
39
+ "devDependencies": {
40
+ "nodemon": "^3.0.0"
41
+ }
42
+ }
@@ -0,0 +1,506 @@
1
+ // ============================================================================
2
+ // UTILITY GENERATORS MODULE
3
+ // Organized by category, each function returns a string of CSS rules
4
+ // ============================================================================
5
+
6
+ // Helper function to escape special characters in class names
7
+ function escapeClassName(key) {
8
+ return key.replace(/\./g, '\\.');
9
+ }
10
+
11
+ // Display & Visibility
12
+ function displayUtilities() {
13
+ return `/* Display & Visibility */
14
+ .block { display: block; }
15
+ .inline { display: inline; }
16
+ .inline-block { display: inline-block; }
17
+ .flex { display: flex; }
18
+ .inline-flex { display: inline-flex; }
19
+ .grid { display: grid; }
20
+ .inline-grid { display: inline-grid; }
21
+ .hidden { display: none; }
22
+ .contents { display: contents; }
23
+ .visible { visibility: visible; }
24
+ .invisible { visibility: hidden; }
25
+
26
+ `;
27
+ }
28
+
29
+ // Sizing (Width & Height)
30
+ function sizingUtilities(spacing) {
31
+ let css = `/* Sizing */\n`;
32
+
33
+ // Width
34
+ Object.entries(spacing).forEach(([key, value]) => {
35
+ const escaped = escapeClassName(key);
36
+ css += `.w-${escaped} { width: ${value}; }\n`;
37
+ });
38
+
39
+ // Height
40
+ Object.entries(spacing).forEach(([key, value]) => {
41
+ const escaped = escapeClassName(key);
42
+ css += `.h-${escaped} { height: ${value}; }\n`;
43
+ });
44
+
45
+ // Full & screen
46
+ css += `.w-full { width: 100%; }\n`;
47
+ css += `.h-full { height: 100%; }\n`;
48
+ css += `.w-screen { width: 100vw; }\n`;
49
+ css += `.h-screen { height: 100vh; }\n`;
50
+
51
+ // Min/Max
52
+ css += `.min-w-0 { min-width: 0; }\n`;
53
+ css += `.min-h-0 { min-height: 0; }\n`;
54
+ css += `.min-h-screen { min-height: 100vh; }\n`;
55
+ css += `.max-w-full { max-width: 100%; }\n`;
56
+ css += `.max-h-full { max-height: 100%; }\n`;
57
+ css += `.max-w-xs { max-width: 20rem; }\n`;
58
+ css += `.max-w-sm { max-width: 24rem; }\n`;
59
+ css += `.max-w-md { max-width: 28rem; }\n`;
60
+ css += `.max-w-lg { max-width: 32rem; }\n`;
61
+ css += `.max-w-xl { max-width: 36rem; }\n`;
62
+ css += `.max-w-2xl { max-width: 42rem; }\n`;
63
+ css += `.max-w-3xl { max-width: 48rem; }\n`;
64
+ css += `.max-w-4xl { max-width: 56rem; }\n`;
65
+ css += `.max-w-5xl { max-width: 64rem; }\n`;
66
+ css += `.max-w-6xl { max-width: 72rem; }\n`;
67
+ css += `.max-w-7xl { max-width: 80rem; }\n`;
68
+
69
+ // Aspect ratio
70
+ css += `.aspect-auto { aspect-ratio: auto; }\n`;
71
+ css += `.aspect-square { aspect-ratio: 1; }\n`;
72
+ css += `.aspect-video { aspect-ratio: 16 / 9; }\n`;
73
+ css += `.aspect-3\/2 { aspect-ratio: 3 / 2; }\n`;
74
+ css += `.aspect-4\/3 { aspect-ratio: 4 / 3; }\n`;
75
+ css += `.aspect-16\/9 { aspect-ratio: 16 / 9; }\n`;
76
+
77
+ css += `\n`;
78
+ return css;
79
+ }
80
+
81
+ // Positioning
82
+ function positioningUtilities(spacing) {
83
+ let css = `/* Positioning */\n`;
84
+
85
+ css += `.static { position: static; }\n`;
86
+ css += `.relative { position: relative; }\n`;
87
+ css += `.absolute { position: absolute; }\n`;
88
+ css += `.fixed { position: fixed; }\n`;
89
+ css += `.sticky { position: sticky; }\n`;
90
+
91
+ // Inset values
92
+ Object.entries(spacing).forEach(([key, value]) => {
93
+ const escaped = escapeClassName(key);
94
+ css += `.top-${escaped} { top: ${value}; }\n`;
95
+ css += `.right-${escaped} { right: ${value}; }\n`;
96
+ css += `.bottom-${escaped} { bottom: ${value}; }\n`;
97
+ css += `.left-${escaped} { left: ${value}; }\n`;
98
+ css += `.inset-${escaped} { inset: ${value}; }\n`;
99
+ });
100
+
101
+ css += `.inset-auto { inset: auto; }\n`;
102
+
103
+ // Z-index (semantic)
104
+ const zIndices = {
105
+ 'auto': 'auto',
106
+ '0': '0',
107
+ '10': '10',
108
+ '20': '20',
109
+ '30': '30',
110
+ '40': '40',
111
+ '50': '50',
112
+ 'dropdown': '1000',
113
+ 'sticky': '1020',
114
+ 'fixed': '1030',
115
+ 'modal': '1040',
116
+ 'popover': '1060',
117
+ 'tooltip': '1070'
118
+ };
119
+
120
+ Object.entries(zIndices).forEach(([name, value]) => {
121
+ css += `.z-${name} { z-index: ${value}; }\n`;
122
+ });
123
+
124
+ css += `\n`;
125
+ return css;
126
+ }
127
+
128
+ // Overflow & Clipping
129
+ function overflowUtilities() {
130
+ return `/* Overflow & Clipping */
131
+ .overflow-auto { overflow: auto; }
132
+ .overflow-hidden { overflow: hidden; }
133
+ .overflow-visible { overflow: visible; }
134
+ .overflow-scroll { overflow: scroll; }
135
+ .overflow-x-auto { overflow-x: auto; }
136
+ .overflow-x-hidden { overflow-x: hidden; }
137
+ .overflow-y-auto { overflow-y: auto; }
138
+ .overflow-y-hidden { overflow-y: hidden; }
139
+ .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
140
+ .line-clamp-2 { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
141
+ .line-clamp-3 { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
142
+ .line-clamp-4 { display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; }
143
+ .line-clamp-5 { display: -webkit-box; -webkit-line-clamp: 5; -webkit-box-orient: vertical; overflow: hidden; }
144
+ .line-clamp-6 { display: -webkit-box; -webkit-line-clamp: 6; -webkit-box-orient: vertical; overflow: hidden; }
145
+
146
+ `;
147
+ }
148
+
149
+ // Opacity
150
+ function opacityUtilities() {
151
+ const opacities = [0, 5, 10, 25, 50, 75, 90, 95, 100];
152
+ let css = `/* Opacity */\n`;
153
+
154
+ opacities.forEach(op => {
155
+ css += `.opacity-${op} { opacity: ${op / 100}; }\n`;
156
+ });
157
+
158
+ css += `\n`;
159
+ return css;
160
+ }
161
+
162
+ // Transitions & Transforms
163
+ function transitionUtilities() {
164
+ return `/* Transitions */
165
+ .transition { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
166
+ .transition-none { transition-property: none; }
167
+ .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
168
+ .transition-opacity { transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
169
+ .transition-transform { transition-property: transform; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
170
+ .duration-75 { transition-duration: 75ms; }
171
+ .duration-100 { transition-duration: 100ms; }
172
+ .duration-150 { transition-duration: 150ms; }
173
+ .duration-200 { transition-duration: 200ms; }
174
+ .duration-300 { transition-duration: 300ms; }
175
+ .duration-500 { transition-duration: 500ms; }
176
+ .duration-700 { transition-duration: 700ms; }
177
+ .duration-1000 { transition-duration: 1000ms; }
178
+ .ease-linear { transition-timing-function: linear; }
179
+ .ease-in { transition-timing-function: cubic-bezier(0.4, 0, 1, 1); }
180
+ .ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); }
181
+ .ease-in-out { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
182
+ .delay-75 { transition-delay: 75ms; }
183
+ .delay-100 { transition-delay: 100ms; }
184
+ .delay-150 { transition-delay: 150ms; }
185
+ .delay-200 { transition-delay: 200ms; }
186
+ .delay-300 { transition-delay: 300ms; }
187
+ .delay-500 { transition-delay: 500ms; }
188
+
189
+ `;
190
+ }
191
+
192
+ // Transforms
193
+ function transformUtilities(spacing) {
194
+ let css = `/* Transforms */\n`;
195
+
196
+ css += `.transform { transform: translateZ(0); }\n`;
197
+ css += `.transform-gpu { transform: translate3d(0, 0, 0); }\n`;
198
+ css += `.transform-none { transform: none; }\n`;
199
+
200
+ // Translate
201
+ Object.entries(spacing).forEach(([key, value]) => {
202
+ const escaped = escapeClassName(key);
203
+ css += `.translate-x-${escaped} { transform: translateX(${value}); }\n`;
204
+ css += `.translate-y-${escaped} { transform: translateY(${value}); }\n`;
205
+ css += `.-translate-x-${escaped} { transform: translateX(-${value}); }\n`;
206
+ css += `.-translate-y-${escaped} { transform: translateY(-${value}); }\n`;
207
+ });
208
+
209
+ // Rotate
210
+ const rotations = [0, 1, 2, 3, 6, 12, 45, 90, 180];
211
+ rotations.forEach(deg => {
212
+ css += `.rotate-${deg} { transform: rotate(${deg}deg); }\n`;
213
+ if (deg > 0) css += `.-rotate-${deg} { transform: rotate(-${deg}deg); }\n`;
214
+ });
215
+
216
+ // Scale
217
+ const scales = [0, 50, 75, 90, 95, 100, 110, 125, 150];
218
+ scales.forEach(scale => {
219
+ css += `.scale-${scale} { transform: scale(${scale / 100}); }\n`;
220
+ });
221
+
222
+ // Skew
223
+ const skews = [0, 1, 2, 3];
224
+ skews.forEach(sk => {
225
+ css += `.skew-x-${sk} { transform: skewX(${sk}deg); }\n`;
226
+ css += `.skew-y-${sk} { transform: skewY(${sk}deg); }\n`;
227
+ });
228
+
229
+ // Transform origin
230
+ css += `.origin-center { transform-origin: center; }\n`;
231
+ css += `.origin-top { transform-origin: top; }\n`;
232
+ css += `.origin-top-right { transform-origin: top right; }\n`;
233
+ css += `.origin-right { transform-origin: right; }\n`;
234
+ css += `.origin-bottom-right { transform-origin: bottom right; }\n`;
235
+ css += `.origin-bottom { transform-origin: bottom; }\n`;
236
+ css += `.origin-bottom-left { transform-origin: bottom left; }\n`;
237
+ css += `.origin-left { transform-origin: left; }\n`;
238
+ css += `.origin-top-left { transform-origin: top left; }\n`;
239
+
240
+ css += `\n`;
241
+ return css;
242
+ }
243
+
244
+ // Shadows
245
+ function shadowUtilities() {
246
+ return `/* Shadows */
247
+ .shadow-none { box-shadow: none; }
248
+ .shadow-sm { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); }
249
+ .shadow { box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); }
250
+ .shadow-md { box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1); }
251
+ .shadow-lg { box-shadow: 0 20px 25px rgba(0, 0, 0, 0.15); }
252
+
253
+ `;
254
+ }
255
+
256
+ // Rings & Outlines (Focus states)
257
+ function ringUtilities(colours) {
258
+ let css = `/* Rings & Outlines */\n`;
259
+
260
+ css += `.ring-0 { box-shadow: 0 0 0 0px var(--ring-color, transparent); }\n`;
261
+ css += `.ring-1 { box-shadow: 0 0 0 1px var(--ring-color, transparent); }\n`;
262
+ css += `.ring-2 { box-shadow: 0 0 0 2px var(--ring-color, transparent); }\n`;
263
+
264
+ css += `.ring-offset-0 { --ring-offset-width: 0px; }\n`;
265
+ css += `.ring-offset-2 { --ring-offset-width: 2px; }\n`;
266
+ css += `.ring-offset-4 { --ring-offset-width: 4px; }\n`;
267
+
268
+ // Ring colours
269
+ Object.entries(colours).forEach(([colourName, shades]) => {
270
+ Object.entries(shades).forEach(([shade]) => {
271
+ css += `.ring-${colourName}-${shade} { --ring-color: var(--color-${colourName}-${shade}); }\n`;
272
+ });
273
+ });
274
+
275
+ css += `.outline-none { outline: 2px solid transparent; outline-offset: 2px; }\n`;
276
+ css += `.outline { outline: 1px solid currentColor; }\n`;
277
+ css += `.outline-0 { outline-width: 0; }\n`;
278
+ css += `.outline-1 { outline-width: 1px; }\n`;
279
+ css += `.outline-2 { outline-width: 2px; }\n`;
280
+
281
+ css += `\n`;
282
+ return css;
283
+ }
284
+
285
+ // Object Fit & Position
286
+ function objectUtilities() {
287
+ return `/* Object Fit & Position */
288
+ .object-contain { object-fit: contain; }
289
+ .object-cover { object-fit: cover; }
290
+ .object-fill { object-fit: fill; }
291
+ .object-none { object-fit: none; }
292
+ .object-scale-down { object-fit: scale-down; }
293
+ .object-center { object-position: center; }
294
+ .object-top { object-position: top; }
295
+ .object-bottom { object-position: bottom; }
296
+ .object-left { object-position: left; }
297
+ .object-right { object-position: right; }
298
+ .object-top-left { object-position: top left; }
299
+ .object-top-right { object-position: top right; }
300
+ .object-bottom-left { object-position: bottom left; }
301
+ .object-bottom-right { object-position: bottom right; }
302
+
303
+ `;
304
+ }
305
+
306
+ // Tables & Lists
307
+ function tableListUtilities() {
308
+ return `/* Tables & Lists */
309
+ .border-collapse { border-collapse: collapse; }
310
+ .border-separate { border-collapse: separate; }
311
+ .table-auto { table-layout: auto; }
312
+ .table-fixed { table-layout: fixed; }
313
+ .caption-top { caption-side: top; }
314
+ .caption-bottom { caption-side: bottom; }
315
+ .list-none { list-style-type: none; }
316
+ .list-disc { list-style-type: disc; }
317
+ .list-decimal { list-style-type: decimal; }
318
+ .list-inside { list-style-position: inside; }
319
+ .list-outside { list-style-position: outside; }
320
+
321
+ `;
322
+ }
323
+
324
+ // SVG Utilities
325
+ function svgUtilities(colours) {
326
+ let css = `/* SVG */\n`;
327
+
328
+ css += `.fill-current { fill: currentColor; }\n`;
329
+ css += `.stroke-current { stroke: currentColor; }\n`;
330
+ css += `.stroke-0 { stroke-width: 0; }\n`;
331
+ css += `.stroke-1 { stroke-width: 1; }\n`;
332
+ css += `.stroke-2 { stroke-width: 2; }\n`;
333
+
334
+ // Fill colours
335
+ Object.entries(colours).forEach(([colourName, shades]) => {
336
+ Object.entries(shades).forEach(([shade]) => {
337
+ css += `.fill-${colourName}-${shade} { fill: var(--color-${colourName}-${shade}); }\n`;
338
+ });
339
+ });
340
+
341
+ // Stroke colours
342
+ Object.entries(colours).forEach(([colourName, shades]) => {
343
+ Object.entries(shades).forEach(([shade]) => {
344
+ css += `.stroke-${colourName}-${shade} { stroke: var(--color-${colourName}-${shade}); }\n`;
345
+ });
346
+ });
347
+
348
+ css += `\n`;
349
+ return css;
350
+ }
351
+
352
+ // Forms
353
+ function formUtilities() {
354
+ return `/* Forms */
355
+ .appearance-none { appearance: none; }
356
+ .placeholder-transparent::placeholder { color: transparent; }
357
+ .placeholder-current::placeholder { color: currentColor; }
358
+ .autofill\\:bg-transparent:autofill { background-color: transparent !important; }
359
+ .autofill\\:text-current:autofill { color: currentColor !important; }
360
+ .accent-current { accent-color: currentColor; }
361
+ .checked\\:bg-current:checked { background-color: currentColor; }
362
+ .indeterminate\\:bg-current:indeterminate { background-color: currentColor; }
363
+ .default\\:ring-0:default { box-shadow: 0 0 0 0px transparent; }
364
+ .disabled\\:opacity-50:disabled { opacity: 0.5; }
365
+ .enabled\\:opacity-100:enabled { opacity: 1; }
366
+ .read-only\\:bg-gray-100:read-only { background-color: rgb(243, 244, 246); }
367
+
368
+ `;
369
+ }
370
+
371
+ // Vertical Align
372
+ function verticalAlignUtilities() {
373
+ return `/* Vertical Align */
374
+ .align-baseline { vertical-align: baseline; }
375
+ .align-top { vertical-align: top; }
376
+ .align-middle { vertical-align: middle; }
377
+ .align-bottom { vertical-align: bottom; }
378
+ .align-text-top { vertical-align: text-top; }
379
+ .align-text-bottom { vertical-align: text-bottom; }
380
+ .align-sub { vertical-align: sub; }
381
+ .align-super { vertical-align: super; }
382
+
383
+ `;
384
+ }
385
+
386
+ // Content Visibility & Scroll
387
+ function contentScrollUtilities() {
388
+ return `/* Content Visibility & Scroll */
389
+ .content-normal { content-visibility: normal; }
390
+ .content-hidden { content-visibility: hidden; }
391
+ .content-auto { content-visibility: auto; }
392
+ .scroll-auto { scroll-behavior: auto; }
393
+ .scroll-smooth { scroll-behavior: smooth; }
394
+ .scroll-m-0 { scroll-margin: 0; }
395
+ .snap-none { scroll-snap-type: none; }
396
+ .snap-x { scroll-snap-type: x var(--emily-scroll-snap-strictness); }
397
+ .snap-y { scroll-snap-type: y var(--emily-scroll-snap-strictness); }
398
+ .snap-both { scroll-snap-type: both var(--emily-scroll-snap-strictness); }
399
+ .snap-mandatory { --emily-scroll-snap-strictness: mandatory; }
400
+ .snap-proximity { --emily-scroll-snap-strictness: proximity; }
401
+
402
+ `;
403
+ }
404
+
405
+ // Blend Modes
406
+ function blendUtilities() {
407
+ return `/* Blend Modes */
408
+ .mix-normal { mix-blend-mode: normal; }
409
+ .mix-multiply { mix-blend-mode: multiply; }
410
+ .mix-screen { mix-blend-mode: screen; }
411
+ .mix-overlay { mix-blend-mode: overlay; }
412
+ .mix-darken { mix-blend-mode: darken; }
413
+ .mix-lighten { mix-blend-mode: lighten; }
414
+ .mix-color-dodge { mix-blend-mode: color-dodge; }
415
+ .mix-color-burn { mix-blend-mode: color-burn; }
416
+ .mix-hard-light { mix-blend-mode: hard-light; }
417
+ .mix-soft-light { mix-blend-mode: soft-light; }
418
+ .mix-difference { mix-blend-mode: difference; }
419
+ .mix-exclusion { mix-blend-mode: exclusion; }
420
+ .mix-hue { mix-blend-mode: hue; }
421
+ .mix-saturation { mix-blend-mode: saturation; }
422
+ .mix-color { mix-blend-mode: color; }
423
+ .mix-luminosity { mix-blend-mode: luminosity; }
424
+
425
+ `;
426
+ }
427
+
428
+ // Cursors & Interactions
429
+ function cursorUtilities() {
430
+ return `/* Cursors & Interactions */
431
+ .cursor-auto { cursor: auto; }
432
+ .cursor-default { cursor: default; }
433
+ .cursor-pointer { cursor: pointer; }
434
+ .cursor-wait { cursor: wait; }
435
+ .cursor-not-allowed { cursor: not-allowed; }
436
+ .cursor-move { cursor: move; }
437
+ .cursor-text { cursor: text; }
438
+ .cursor-help { cursor: help; }
439
+ .pointer-events-auto { pointer-events: auto; }
440
+ .pointer-events-none { pointer-events: none; }
441
+ .select-none { user-select: none; }
442
+ .select-text { user-select: text; }
443
+ .select-all { user-select: all; }
444
+ .select-auto { user-select: auto; }
445
+
446
+ `;
447
+ }
448
+
449
+ // Accessibility
450
+ function accessibilityUtilities() {
451
+ return `/* Accessibility */
452
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; }
453
+ .not-sr-only { position: static; width: auto; height: auto; padding: 0; margin: 0; overflow: visible; clip: auto; white-space: normal; }
454
+ .focus-visible:focus { outline: 2px solid currentColor; outline-offset: 2px; }
455
+ .focus\\:outline-none:focus { outline: 2px solid transparent; outline-offset: 2px; }
456
+ @media (prefers-reduced-motion: reduce) {
457
+ .motion-reduce\\:transition-none { transition-property: none; }
458
+ .motion-reduce\\:animate-none { animation: none; }
459
+ }
460
+ @media (prefers-reduced-motion: no-preference) {
461
+ .motion-safe\\:transition { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
462
+ }
463
+ @media (forced-colors: active) {
464
+ .forced-colors\\:outline { outline: 1px solid CanvasText; }
465
+ .forced-colors\\:outline-1 { outline: 1px solid CanvasText; }
466
+ .forced-colors\\:forced-color-adjust-none { forced-color-adjust: none; }
467
+ }
468
+
469
+ `;
470
+ }
471
+
472
+ // Container Queries (Forward-looking)
473
+ function containerUtilities() {
474
+ return `/* Container Queries */
475
+ @supports (container-type: inline-size) {
476
+ .container-type-inline { container-type: inline-size; }
477
+ @container (min-width: 20rem) { .cq-xs\\: { /* utilities */ } }
478
+ @container (min-width: 28rem) { .cq-sm\\: { /* utilities */ } }
479
+ @container (min-width: 36rem) { .cq-md\\: { /* utilities */ } }
480
+ @container (min-width: 48rem) { .cq-lg\\: { /* utilities */ } }
481
+ }
482
+
483
+ `;
484
+ }
485
+
486
+ module.exports = {
487
+ displayUtilities,
488
+ sizingUtilities,
489
+ positioningUtilities,
490
+ overflowUtilities,
491
+ opacityUtilities,
492
+ transitionUtilities,
493
+ transformUtilities,
494
+ shadowUtilities,
495
+ ringUtilities,
496
+ objectUtilities,
497
+ tableListUtilities,
498
+ svgUtilities,
499
+ formUtilities,
500
+ verticalAlignUtilities,
501
+ contentScrollUtilities,
502
+ blendUtilities,
503
+ cursorUtilities,
504
+ accessibilityUtilities,
505
+ containerUtilities
506
+ };