spoko-design-system 0.7.9 → 0.8.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/.github/dependabot.yml +11 -11
- package/.github/todo.yml +3 -3
- package/.github/workflows/deploy.yml +39 -39
- package/.stackblitzrc +5 -5
- package/.vscode/extensions.json +5 -5
- package/.vscode/launch.json +11 -11
- package/.vscode/settings.json +5 -5
- package/LICENSE +21 -21
- package/README.md +114 -114
- package/astro-i18next.config.mjs +17 -17
- package/astro-i18next.config.ts +10 -10
- package/astro.config.mjs +86 -86
- package/dev-dist/sw.js +91 -91
- package/dev-dist/workbox-c676b6d3.js +3391 -3391
- package/icon.config.ts +309 -309
- package/index.ts +66 -66
- package/package.json +23 -23
- package/public/fonts/lg.svg +53 -53
- package/public/fonts/vwhead-bold-demo.html +549 -549
- package/public/fonts/vwhead-regular-demo.html +549 -549
- package/public/fonts/vwtext-bold-demo.html +549 -549
- package/public/fonts/vwtext-regular-demo.html +549 -549
- package/public/github.svg +3 -3
- package/public/grid_dot.svg +4 -4
- package/public/linkedin.svg +44 -44
- package/public/locales/en/translation.json +8 -8
- package/public/locales/pl/translation.json +8 -8
- package/public/make-scrollable-code-focusable.js +3 -3
- package/public/pagefind.yml +3 -3
- package/public/polo.blue.svg +29 -29
- package/public/spoko.space.svg +71 -71
- package/public/twitter.svg +46 -46
- package/renovate.json +6 -6
- package/sandbox.config.json +11 -11
- package/src/MyComponent.astro +8 -8
- package/src/components/Badge.vue +19 -19
- package/src/components/Badges.vue +21 -21
- package/src/components/Breadcrumbs.vue +91 -91
- package/src/components/Button.vue +101 -101
- package/src/components/ButtonCopy.astro +183 -183
- package/src/components/ButtonCopy.vue +36 -36
- package/src/components/Card.astro +27 -27
- package/src/components/Carousel.astro +26 -26
- package/src/components/Category/CategoriesCarousel.astro +101 -101
- package/src/components/Category/CategoryDetails.astro +169 -169
- package/src/components/Category/CategoryLink.vue +28 -28
- package/src/components/Category/CategorySidebarToggler.vue +9 -9
- package/src/components/Category/CategoryTile.astro +37 -37
- package/src/components/Category/CategoryViewToggler.astro +89 -89
- package/src/components/Category/SubCategoryLink.vue +19 -19
- package/src/components/Copyright.astro +12 -12
- package/src/components/Date.astro +7 -7
- package/src/components/Faq.astro +33 -33
- package/src/components/FaqItem.astro +80 -80
- package/src/components/FeaturesList.vue +37 -37
- package/src/components/FuckRussia.vue +62 -62
- package/src/components/HandDrive.astro +29 -29
- package/src/components/Header/Header.astro +210 -210
- package/src/components/Header/SkipToContent.astro +1 -1
- package/src/components/Headline.vue +48 -48
- package/src/components/Image.astro +30 -30
- package/src/components/LeftSidebar.astro +53 -53
- package/src/components/MainColors.vue +22 -22
- package/src/components/MainInput.vue +15 -15
- package/src/components/Modal.astro +27 -27
- package/src/components/PageContent.astro +5 -5
- package/src/components/PartNumber.vue +27 -27
- package/src/components/Post/PostCategories.astro +41 -41
- package/src/components/Post/PostCategories.vue +30 -30
- package/src/components/PostHeader.astro +103 -103
- package/src/components/PrCode.vue +141 -141
- package/src/components/Product/ProductButton.vue +18 -18
- package/src/components/Product/ProductCarousel.astro +35 -35
- package/src/components/Product/ProductEngineType.vue +42 -42
- package/src/components/Product/ProductImage.astro +40 -40
- package/src/components/Product/ProductLink.astro +101 -101
- package/src/components/Product/ProductLink.vue +59 -59
- package/src/components/Product/ProductLinkInfo.astro +37 -37
- package/src/components/Product/ProductNumber.astro +60 -60
- package/src/components/ProductCarousel.astro +38 -38
- package/src/components/ProductCodes.vue +39 -39
- package/src/components/ProductDetailName.vue +52 -52
- package/src/components/ProductDetailsList.vue +197 -130
- package/src/components/ProductTile.astro +48 -48
- package/src/components/Quote.vue +23 -23
- package/src/components/ReloadPrompt.astro +50 -50
- package/src/components/SlimBanner.vue +72 -72
- package/src/components/Table.vue +32 -32
- package/src/components/TableOfContents.astro +15 -15
- package/src/components/Translations.vue +23 -23
- package/src/components/flags/FlagPL.vue +3 -3
- package/src/components/flags/FlagUA.vue +2 -2
- package/src/components/layout/Container.astro +7 -7
- package/src/components/layout/Header.astro +80 -80
- package/src/config.ts +56 -56
- package/src/design.config.ts +98 -98
- package/src/env.d.ts +6 -6
- package/src/layouts/Layout.astro +61 -61
- package/src/layouts/MainLayout.astro +81 -81
- package/src/layouts/partials/FooterCommon.astro +4 -4
- package/src/layouts/partials/HeadCommon.astro +44 -44
- package/src/layouts/partials/HeadSEO.astro +41 -41
- package/src/pages/components/badges.mdx +57 -57
- package/src/pages/components/breadcrumbs.mdx +139 -139
- package/src/pages/components/buttons.mdx +360 -360
- package/src/pages/components/card.mdx +294 -294
- package/src/pages/components/carousel.mdx +62 -62
- package/src/pages/components/copyright.mdx +42 -42
- package/src/pages/components/details-list.mdx +115 -115
- package/src/pages/components/features-list.mdx +37 -37
- package/src/pages/components/flags.mdx +49 -49
- package/src/pages/components/fuck-russia.mdx +39 -39
- package/src/pages/components/hand-drive.mdx +38 -38
- package/src/pages/components/headline.mdx +152 -152
- package/src/pages/components/icons.astro +135 -135
- package/src/pages/components/image.mdx +513 -513
- package/src/pages/components/input.mdx +367 -367
- package/src/pages/components/jumbotron.mdx +359 -359
- package/src/pages/components/modal.mdx +64 -64
- package/src/pages/components/post-header.mdx +64 -64
- package/src/pages/components/pr-code.mdx +65 -65
- package/src/pages/components/product-number.mdx +58 -58
- package/src/pages/components/product-tile.mdx +51 -51
- package/src/pages/components/quote.mdx +33 -33
- package/src/pages/components/slimbanner.mdx +35 -35
- package/src/pages/components/table.mdx +108 -108
- package/src/pages/core/colors.mdx +10 -10
- package/src/pages/core/grid.mdx +89 -89
- package/src/pages/core/introduction.mdx +77 -77
- package/src/pages/core/shadows.astro +20 -20
- package/src/pages/core/typography.astro +49 -49
- package/src/pages/index.astro +133 -133
- package/src/pages/patterns/introduction.mdx +60 -60
- package/src/pwa.ts +12 -12
- package/src/styles/_variables.scss +70 -70
- package/src/styles/base/base.css +184 -184
- package/src/styles/base/grid.css +92 -92
- package/src/styles/base/typography.css +70 -70
- package/src/styles/content.css +73 -73
- package/src/styles/main.css +7 -7
- package/src/types/Product.ts +31 -31
- package/src/types/astro.d.ts +3 -3
- package/src/utils/product/getPriceFormatted.ts +15 -15
- package/src/utils/product/getProductChecklist.ts +17 -17
- package/src/utils/product/useFormatProductNumber.ts +41 -41
- package/src/utils/seo/getShorterDescription.ts +14 -14
- package/src/utils/text/formatDate.ts +5 -5
- package/src/utils/text/formatLocaleNumber.ts +6 -6
- package/src/utils/text/formatPad.ts +12 -12
- package/src/utils/text/getNumberFormatted.ts +33 -33
- package/src/utils/text/getTranslatedLink.ts +5 -5
- package/src/utils/text.ts +19 -19
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +28 -28
- package/uno-config/index.ts +259 -259
- package/uno-config/theme/breakpoints.ts +9 -9
- package/uno-config/theme/colors.ts +64 -64
- package/uno-config/theme/dimensions.ts +17 -17
- package/uno-config/theme/effects.ts +14 -14
- package/uno-config/theme/grid.ts +10 -10
- package/uno-config/theme/index.ts +28 -28
- package/uno-config/theme/shortcuts/buttons.ts +53 -53
- package/uno-config/theme/shortcuts/components.ts +123 -123
- package/uno-config/theme/shortcuts/index.ts +20 -20
- package/uno-config/theme/shortcuts/layout.ts +64 -64
- package/uno-config/theme/typography.ts +29 -29
- package/uno.config.ts +2 -2
package/uno-config/index.ts
CHANGED
|
@@ -1,260 +1,260 @@
|
|
|
1
|
-
// uno-config/index.ts
|
|
2
|
-
import type { UserConfig, UserShortcuts } from 'unocss'
|
|
3
|
-
import { defineConfig } from 'unocss';
|
|
4
|
-
|
|
5
|
-
// REQUIRED IMPORTS: These imports are used in the createSdsConfig function
|
|
6
|
-
// Removing or commenting out any of these will break the UnoCSS configuration
|
|
7
|
-
import {
|
|
8
|
-
transformerDirectives, // Used in transformers array
|
|
9
|
-
transformerVariantGroup, // Used in transformers array
|
|
10
|
-
presetAttributify, // Used in presets array
|
|
11
|
-
presetIcons, // Used in presets array with specific configuration
|
|
12
|
-
} from 'unocss';
|
|
13
|
-
|
|
14
|
-
// These presets must be imported explicitly to be used in the configuration
|
|
15
|
-
import presetUno from '@unocss/preset-uno'; // Primary UnoCSS preset
|
|
16
|
-
import presetTypography from '@unocss/preset-typography'; // Typography preset
|
|
17
|
-
import presetWebFonts from '@unocss/preset-web-fonts'; // Web fonts preset
|
|
18
|
-
|
|
19
|
-
import { shortcuts } from './theme/shortcuts';
|
|
20
|
-
import { theme } from './theme';
|
|
21
|
-
|
|
22
|
-
// List of peer selectors we want to preserve during build
|
|
23
|
-
const peerSelectorClasses = [
|
|
24
|
-
// Focus state classes
|
|
25
|
-
'peer-focus:text-blue-light',
|
|
26
|
-
'peer-focus:dark:text-blue-lightest',
|
|
27
|
-
'peer-focus:scale-75',
|
|
28
|
-
'peer-focus:-translate-y-6',
|
|
29
|
-
'peer-focus:-translate-y-4',
|
|
30
|
-
'peer-focus:start-0',
|
|
31
|
-
|
|
32
|
-
// Placeholder shown classes
|
|
33
|
-
'peer-placeholder-shown:scale-100',
|
|
34
|
-
'peer-placeholder-shown:translate-y-0',
|
|
35
|
-
|
|
36
|
-
// Not placeholder shown classes
|
|
37
|
-
'peer-not-placeholder-shown:scale-75',
|
|
38
|
-
'peer-not-placeholder-shown:-translate-y-6',
|
|
39
|
-
'peer-not-placeholder-shown:-translate-y-4',
|
|
40
|
-
];
|
|
41
|
-
|
|
42
|
-
interface CustomConfig extends Partial<UserConfig> {
|
|
43
|
-
shortcuts?: UserShortcuts;
|
|
44
|
-
theme?: Partial<typeof theme>;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Creates a UnoCSS configuration with Spoko Design System defaults
|
|
49
|
-
*
|
|
50
|
-
* IMPORTANT: This function requires all the imported UnoCSS presets and transformers.
|
|
51
|
-
* Do not remove any imports at the top of this file as they are necessary for
|
|
52
|
-
* proper functioning of the UnoCSS configuration.
|
|
53
|
-
*
|
|
54
|
-
* @param customConfig - Optional custom configuration to merge with defaults
|
|
55
|
-
* @returns Complete UnoCSS configuration
|
|
56
|
-
*/
|
|
57
|
-
export function createSdsConfig(customConfig: CustomConfig = {}) {
|
|
58
|
-
return defineConfig({
|
|
59
|
-
// Transform directives and variant groups
|
|
60
|
-
transformers: [
|
|
61
|
-
transformerDirectives(),
|
|
62
|
-
transformerVariantGroup(),
|
|
63
|
-
],
|
|
64
|
-
shortcuts: {
|
|
65
|
-
...shortcuts,
|
|
66
|
-
...(customConfig.shortcuts || {})
|
|
67
|
-
},
|
|
68
|
-
theme: {
|
|
69
|
-
...theme,
|
|
70
|
-
...(customConfig.theme || {})
|
|
71
|
-
},
|
|
72
|
-
// Enhanced variants to better handle peer selectors
|
|
73
|
-
variants: [
|
|
74
|
-
// Add specific peer variant support
|
|
75
|
-
(matcher) => {
|
|
76
|
-
if (!matcher.startsWith('peer-'))
|
|
77
|
-
return matcher;
|
|
78
|
-
|
|
79
|
-
const peerVariant = matcher.slice(5);
|
|
80
|
-
const selectorMap = {
|
|
81
|
-
'focus:': (s) => `.peer:focus ~ ${s}`,
|
|
82
|
-
'hover:': (s) => `.peer:hover ~ ${s}`,
|
|
83
|
-
'placeholder-shown:': (s) => `.peer:placeholder-shown ~ ${s}`,
|
|
84
|
-
'not-placeholder-shown:': (s) => `.peer:not(:placeholder-shown) ~ ${s}`,
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
// Check for nested variants like 'peer-focus:text-blue'
|
|
88
|
-
for (const [key, selectorFn] of Object.entries(selectorMap)) {
|
|
89
|
-
if (peerVariant.startsWith(key)) {
|
|
90
|
-
return {
|
|
91
|
-
matcher: peerVariant.slice(key.length),
|
|
92
|
-
selector: selectorFn,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Default peer handling
|
|
98
|
-
return {
|
|
99
|
-
matcher: peerVariant,
|
|
100
|
-
selector: (s) => `.peer:${peerVariant} ~ ${s}`,
|
|
101
|
-
};
|
|
102
|
-
},
|
|
103
|
-
],
|
|
104
|
-
// Comprehensive safelist with all needed classes
|
|
105
|
-
safelist: [
|
|
106
|
-
// Existing safelist items
|
|
107
|
-
'md:grid-cols-product',
|
|
108
|
-
|
|
109
|
-
'breadcrumb-link-disabled',
|
|
110
|
-
'breadcrumb-link',
|
|
111
|
-
'breadcrumb-item',
|
|
112
|
-
'features-list-caption',
|
|
113
|
-
'features-list-ul',
|
|
114
|
-
'features-list-item',
|
|
115
|
-
|
|
116
|
-
'category-link-base',
|
|
117
|
-
'category-link-active',
|
|
118
|
-
|
|
119
|
-
// Base peer class
|
|
120
|
-
'peer',
|
|
121
|
-
|
|
122
|
-
// All input component classes from shortcuts
|
|
123
|
-
'input-base',
|
|
124
|
-
'input-label-base',
|
|
125
|
-
'input-placeholder',
|
|
126
|
-
'input-standard',
|
|
127
|
-
'input-filled',
|
|
128
|
-
'input-wrapper-standard',
|
|
129
|
-
'input-wrapper-filled',
|
|
130
|
-
'input-label-standard',
|
|
131
|
-
'input-label-filled',
|
|
132
|
-
|
|
133
|
-
// Label state shortcuts
|
|
134
|
-
'input-label-focus-color',
|
|
135
|
-
'input-label-focus-scale',
|
|
136
|
-
'input-label-focus-translate-standard',
|
|
137
|
-
'input-label-focus-translate-filled',
|
|
138
|
-
'input-label-placeholder',
|
|
139
|
-
'input-label-filled-standard',
|
|
140
|
-
'input-label-filled-filled',
|
|
141
|
-
'input-label-standard-state',
|
|
142
|
-
'input-label-filled-state',
|
|
143
|
-
|
|
144
|
-
// Input types
|
|
145
|
-
'input-textarea',
|
|
146
|
-
'resize-none',
|
|
147
|
-
|
|
148
|
-
// Size variants
|
|
149
|
-
'input-sm',
|
|
150
|
-
'input-md',
|
|
151
|
-
'input-lg',
|
|
152
|
-
'input-label-sm',
|
|
153
|
-
'input-label-md',
|
|
154
|
-
'input-label-lg',
|
|
155
|
-
|
|
156
|
-
// Status classes
|
|
157
|
-
'input-error',
|
|
158
|
-
'input-label-error',
|
|
159
|
-
'input-error-message',
|
|
160
|
-
'input-success',
|
|
161
|
-
'input-label-success',
|
|
162
|
-
'input-success-message',
|
|
163
|
-
|
|
164
|
-
// Transform related classes
|
|
165
|
-
'origin-top-left',
|
|
166
|
-
'transform-gpu',
|
|
167
|
-
'translate-y-0',
|
|
168
|
-
'-translate-y-4',
|
|
169
|
-
'-translate-y-6',
|
|
170
|
-
'scale-75',
|
|
171
|
-
'scale-100',
|
|
172
|
-
|
|
173
|
-
// Every possible arbitrary selector used
|
|
174
|
-
'[&:focus~label]:scale-75',
|
|
175
|
-
'[&:focus~label]:-translate-y-4',
|
|
176
|
-
'[&:focus~label]:-translate-y-6',
|
|
177
|
-
'[&:focus~label]:text-blue-light',
|
|
178
|
-
'[&:focus~label]:dark:text-blue-lightest',
|
|
179
|
-
'[&:focus~label]:start-0',
|
|
180
|
-
'[&:placeholder-shown~label]:scale-100',
|
|
181
|
-
'[&:placeholder-shown~label]:translate-y-0',
|
|
182
|
-
'[&:not(:placeholder-shown)~label]:scale-75',
|
|
183
|
-
'[&:not(:placeholder-shown)~label]:-translate-y-4',
|
|
184
|
-
'[&:not(:placeholder-shown)~label]:-translate-y-6',
|
|
185
|
-
|
|
186
|
-
// Combinations of selectors
|
|
187
|
-
'peer:focus:text-blue-light',
|
|
188
|
-
'peer:focus:dark:text-blue-lightest',
|
|
189
|
-
'peer:focus:scale-75',
|
|
190
|
-
'peer:focus:-translate-y-4',
|
|
191
|
-
'peer:focus:-translate-y-6',
|
|
192
|
-
'peer:focus:start-0',
|
|
193
|
-
'peer-placeholder-shown:scale-100',
|
|
194
|
-
'peer-placeholder-shown:translate-y-0',
|
|
195
|
-
'peer-not-placeholder-shown:scale-75',
|
|
196
|
-
'peer-not-placeholder-shown:-translate-y-4',
|
|
197
|
-
'peer-not-placeholder-shown:-translate-y-6',
|
|
198
|
-
|
|
199
|
-
// With !important for good measure
|
|
200
|
-
'[&:focus~label]:!scale-75',
|
|
201
|
-
'[&:focus~label]:!-translate-y-4',
|
|
202
|
-
'[&:focus~label]:!-translate-y-6',
|
|
203
|
-
'[&:not(:placeholder-shown)~label]:!scale-75',
|
|
204
|
-
'[&:not(:placeholder-shown)~label]:!-translate-y-4',
|
|
205
|
-
'[&:not(:placeholder-shown)~label]:!-translate-y-6',
|
|
206
|
-
|
|
207
|
-
// Direct css vars that might be used
|
|
208
|
-
'--un-scale-x',
|
|
209
|
-
'--un-scale-y',
|
|
210
|
-
'--un-translate-y',
|
|
211
|
-
|
|
212
|
-
// All peer selectors from the list
|
|
213
|
-
...peerSelectorClasses,
|
|
214
|
-
],
|
|
215
|
-
// Custom extractors to ensure peer classes are preserved
|
|
216
|
-
extractors: [
|
|
217
|
-
{
|
|
218
|
-
name: 'vue-astro',
|
|
219
|
-
extract({ code }) {
|
|
220
|
-
const result = new Set();
|
|
221
|
-
|
|
222
|
-
// Extract all peer selectors in the code
|
|
223
|
-
const peerRegex = /peer-([a-zA-Z0-9-]+:[a-zA-Z0-9-]+)/g;
|
|
224
|
-
const peerMatches = code.match(peerRegex);
|
|
225
|
-
if (peerMatches) {
|
|
226
|
-
peerMatches.forEach(match => result.add(match));
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Add all known peer selectors
|
|
230
|
-
peerSelectorClasses.forEach(cls => result.add(cls));
|
|
231
|
-
|
|
232
|
-
return result;
|
|
233
|
-
},
|
|
234
|
-
},
|
|
235
|
-
],
|
|
236
|
-
// IMPORTANT: All of these presets are required for proper functioning
|
|
237
|
-
presets: [
|
|
238
|
-
presetUno(),
|
|
239
|
-
presetAttributify(),
|
|
240
|
-
presetIcons({
|
|
241
|
-
scale: 1.2,
|
|
242
|
-
warn: true,
|
|
243
|
-
prefix: 'i-',
|
|
244
|
-
extraProperties: {
|
|
245
|
-
'display': 'inline-block',
|
|
246
|
-
'vertical-align': 'middle',
|
|
247
|
-
},
|
|
248
|
-
}),
|
|
249
|
-
presetTypography(),
|
|
250
|
-
presetWebFonts({
|
|
251
|
-
provider: 'none',
|
|
252
|
-
fonts: theme.fontFamily
|
|
253
|
-
})
|
|
254
|
-
],
|
|
255
|
-
...customConfig
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
export * from './theme';
|
|
1
|
+
// uno-config/index.ts
|
|
2
|
+
import type { UserConfig, UserShortcuts } from 'unocss'
|
|
3
|
+
import { defineConfig } from 'unocss';
|
|
4
|
+
|
|
5
|
+
// REQUIRED IMPORTS: These imports are used in the createSdsConfig function
|
|
6
|
+
// Removing or commenting out any of these will break the UnoCSS configuration
|
|
7
|
+
import {
|
|
8
|
+
transformerDirectives, // Used in transformers array
|
|
9
|
+
transformerVariantGroup, // Used in transformers array
|
|
10
|
+
presetAttributify, // Used in presets array
|
|
11
|
+
presetIcons, // Used in presets array with specific configuration
|
|
12
|
+
} from 'unocss';
|
|
13
|
+
|
|
14
|
+
// These presets must be imported explicitly to be used in the configuration
|
|
15
|
+
import presetUno from '@unocss/preset-uno'; // Primary UnoCSS preset
|
|
16
|
+
import presetTypography from '@unocss/preset-typography'; // Typography preset
|
|
17
|
+
import presetWebFonts from '@unocss/preset-web-fonts'; // Web fonts preset
|
|
18
|
+
|
|
19
|
+
import { shortcuts } from './theme/shortcuts';
|
|
20
|
+
import { theme } from './theme';
|
|
21
|
+
|
|
22
|
+
// List of peer selectors we want to preserve during build
|
|
23
|
+
const peerSelectorClasses = [
|
|
24
|
+
// Focus state classes
|
|
25
|
+
'peer-focus:text-blue-light',
|
|
26
|
+
'peer-focus:dark:text-blue-lightest',
|
|
27
|
+
'peer-focus:scale-75',
|
|
28
|
+
'peer-focus:-translate-y-6',
|
|
29
|
+
'peer-focus:-translate-y-4',
|
|
30
|
+
'peer-focus:start-0',
|
|
31
|
+
|
|
32
|
+
// Placeholder shown classes
|
|
33
|
+
'peer-placeholder-shown:scale-100',
|
|
34
|
+
'peer-placeholder-shown:translate-y-0',
|
|
35
|
+
|
|
36
|
+
// Not placeholder shown classes
|
|
37
|
+
'peer-not-placeholder-shown:scale-75',
|
|
38
|
+
'peer-not-placeholder-shown:-translate-y-6',
|
|
39
|
+
'peer-not-placeholder-shown:-translate-y-4',
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
interface CustomConfig extends Partial<UserConfig> {
|
|
43
|
+
shortcuts?: UserShortcuts;
|
|
44
|
+
theme?: Partial<typeof theme>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates a UnoCSS configuration with Spoko Design System defaults
|
|
49
|
+
*
|
|
50
|
+
* IMPORTANT: This function requires all the imported UnoCSS presets and transformers.
|
|
51
|
+
* Do not remove any imports at the top of this file as they are necessary for
|
|
52
|
+
* proper functioning of the UnoCSS configuration.
|
|
53
|
+
*
|
|
54
|
+
* @param customConfig - Optional custom configuration to merge with defaults
|
|
55
|
+
* @returns Complete UnoCSS configuration
|
|
56
|
+
*/
|
|
57
|
+
export function createSdsConfig(customConfig: CustomConfig = {}) {
|
|
58
|
+
return defineConfig({
|
|
59
|
+
// Transform directives and variant groups
|
|
60
|
+
transformers: [
|
|
61
|
+
transformerDirectives(),
|
|
62
|
+
transformerVariantGroup(),
|
|
63
|
+
],
|
|
64
|
+
shortcuts: {
|
|
65
|
+
...shortcuts,
|
|
66
|
+
...(customConfig.shortcuts || {})
|
|
67
|
+
},
|
|
68
|
+
theme: {
|
|
69
|
+
...theme,
|
|
70
|
+
...(customConfig.theme || {})
|
|
71
|
+
},
|
|
72
|
+
// Enhanced variants to better handle peer selectors
|
|
73
|
+
variants: [
|
|
74
|
+
// Add specific peer variant support
|
|
75
|
+
(matcher) => {
|
|
76
|
+
if (!matcher.startsWith('peer-'))
|
|
77
|
+
return matcher;
|
|
78
|
+
|
|
79
|
+
const peerVariant = matcher.slice(5);
|
|
80
|
+
const selectorMap = {
|
|
81
|
+
'focus:': (s) => `.peer:focus ~ ${s}`,
|
|
82
|
+
'hover:': (s) => `.peer:hover ~ ${s}`,
|
|
83
|
+
'placeholder-shown:': (s) => `.peer:placeholder-shown ~ ${s}`,
|
|
84
|
+
'not-placeholder-shown:': (s) => `.peer:not(:placeholder-shown) ~ ${s}`,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// Check for nested variants like 'peer-focus:text-blue'
|
|
88
|
+
for (const [key, selectorFn] of Object.entries(selectorMap)) {
|
|
89
|
+
if (peerVariant.startsWith(key)) {
|
|
90
|
+
return {
|
|
91
|
+
matcher: peerVariant.slice(key.length),
|
|
92
|
+
selector: selectorFn,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Default peer handling
|
|
98
|
+
return {
|
|
99
|
+
matcher: peerVariant,
|
|
100
|
+
selector: (s) => `.peer:${peerVariant} ~ ${s}`,
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
// Comprehensive safelist with all needed classes
|
|
105
|
+
safelist: [
|
|
106
|
+
// Existing safelist items
|
|
107
|
+
'md:grid-cols-product',
|
|
108
|
+
|
|
109
|
+
'breadcrumb-link-disabled',
|
|
110
|
+
'breadcrumb-link',
|
|
111
|
+
'breadcrumb-item',
|
|
112
|
+
'features-list-caption',
|
|
113
|
+
'features-list-ul',
|
|
114
|
+
'features-list-item',
|
|
115
|
+
|
|
116
|
+
'category-link-base',
|
|
117
|
+
'category-link-active',
|
|
118
|
+
|
|
119
|
+
// Base peer class
|
|
120
|
+
'peer',
|
|
121
|
+
|
|
122
|
+
// All input component classes from shortcuts
|
|
123
|
+
'input-base',
|
|
124
|
+
'input-label-base',
|
|
125
|
+
'input-placeholder',
|
|
126
|
+
'input-standard',
|
|
127
|
+
'input-filled',
|
|
128
|
+
'input-wrapper-standard',
|
|
129
|
+
'input-wrapper-filled',
|
|
130
|
+
'input-label-standard',
|
|
131
|
+
'input-label-filled',
|
|
132
|
+
|
|
133
|
+
// Label state shortcuts
|
|
134
|
+
'input-label-focus-color',
|
|
135
|
+
'input-label-focus-scale',
|
|
136
|
+
'input-label-focus-translate-standard',
|
|
137
|
+
'input-label-focus-translate-filled',
|
|
138
|
+
'input-label-placeholder',
|
|
139
|
+
'input-label-filled-standard',
|
|
140
|
+
'input-label-filled-filled',
|
|
141
|
+
'input-label-standard-state',
|
|
142
|
+
'input-label-filled-state',
|
|
143
|
+
|
|
144
|
+
// Input types
|
|
145
|
+
'input-textarea',
|
|
146
|
+
'resize-none',
|
|
147
|
+
|
|
148
|
+
// Size variants
|
|
149
|
+
'input-sm',
|
|
150
|
+
'input-md',
|
|
151
|
+
'input-lg',
|
|
152
|
+
'input-label-sm',
|
|
153
|
+
'input-label-md',
|
|
154
|
+
'input-label-lg',
|
|
155
|
+
|
|
156
|
+
// Status classes
|
|
157
|
+
'input-error',
|
|
158
|
+
'input-label-error',
|
|
159
|
+
'input-error-message',
|
|
160
|
+
'input-success',
|
|
161
|
+
'input-label-success',
|
|
162
|
+
'input-success-message',
|
|
163
|
+
|
|
164
|
+
// Transform related classes
|
|
165
|
+
'origin-top-left',
|
|
166
|
+
'transform-gpu',
|
|
167
|
+
'translate-y-0',
|
|
168
|
+
'-translate-y-4',
|
|
169
|
+
'-translate-y-6',
|
|
170
|
+
'scale-75',
|
|
171
|
+
'scale-100',
|
|
172
|
+
|
|
173
|
+
// Every possible arbitrary selector used
|
|
174
|
+
'[&:focus~label]:scale-75',
|
|
175
|
+
'[&:focus~label]:-translate-y-4',
|
|
176
|
+
'[&:focus~label]:-translate-y-6',
|
|
177
|
+
'[&:focus~label]:text-blue-light',
|
|
178
|
+
'[&:focus~label]:dark:text-blue-lightest',
|
|
179
|
+
'[&:focus~label]:start-0',
|
|
180
|
+
'[&:placeholder-shown~label]:scale-100',
|
|
181
|
+
'[&:placeholder-shown~label]:translate-y-0',
|
|
182
|
+
'[&:not(:placeholder-shown)~label]:scale-75',
|
|
183
|
+
'[&:not(:placeholder-shown)~label]:-translate-y-4',
|
|
184
|
+
'[&:not(:placeholder-shown)~label]:-translate-y-6',
|
|
185
|
+
|
|
186
|
+
// Combinations of selectors
|
|
187
|
+
'peer:focus:text-blue-light',
|
|
188
|
+
'peer:focus:dark:text-blue-lightest',
|
|
189
|
+
'peer:focus:scale-75',
|
|
190
|
+
'peer:focus:-translate-y-4',
|
|
191
|
+
'peer:focus:-translate-y-6',
|
|
192
|
+
'peer:focus:start-0',
|
|
193
|
+
'peer-placeholder-shown:scale-100',
|
|
194
|
+
'peer-placeholder-shown:translate-y-0',
|
|
195
|
+
'peer-not-placeholder-shown:scale-75',
|
|
196
|
+
'peer-not-placeholder-shown:-translate-y-4',
|
|
197
|
+
'peer-not-placeholder-shown:-translate-y-6',
|
|
198
|
+
|
|
199
|
+
// With !important for good measure
|
|
200
|
+
'[&:focus~label]:!scale-75',
|
|
201
|
+
'[&:focus~label]:!-translate-y-4',
|
|
202
|
+
'[&:focus~label]:!-translate-y-6',
|
|
203
|
+
'[&:not(:placeholder-shown)~label]:!scale-75',
|
|
204
|
+
'[&:not(:placeholder-shown)~label]:!-translate-y-4',
|
|
205
|
+
'[&:not(:placeholder-shown)~label]:!-translate-y-6',
|
|
206
|
+
|
|
207
|
+
// Direct css vars that might be used
|
|
208
|
+
'--un-scale-x',
|
|
209
|
+
'--un-scale-y',
|
|
210
|
+
'--un-translate-y',
|
|
211
|
+
|
|
212
|
+
// All peer selectors from the list
|
|
213
|
+
...peerSelectorClasses,
|
|
214
|
+
],
|
|
215
|
+
// Custom extractors to ensure peer classes are preserved
|
|
216
|
+
extractors: [
|
|
217
|
+
{
|
|
218
|
+
name: 'vue-astro',
|
|
219
|
+
extract({ code }) {
|
|
220
|
+
const result = new Set();
|
|
221
|
+
|
|
222
|
+
// Extract all peer selectors in the code
|
|
223
|
+
const peerRegex = /peer-([a-zA-Z0-9-]+:[a-zA-Z0-9-]+)/g;
|
|
224
|
+
const peerMatches = code.match(peerRegex);
|
|
225
|
+
if (peerMatches) {
|
|
226
|
+
peerMatches.forEach(match => result.add(match));
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Add all known peer selectors
|
|
230
|
+
peerSelectorClasses.forEach(cls => result.add(cls));
|
|
231
|
+
|
|
232
|
+
return result;
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
// IMPORTANT: All of these presets are required for proper functioning
|
|
237
|
+
presets: [
|
|
238
|
+
presetUno(),
|
|
239
|
+
presetAttributify(),
|
|
240
|
+
presetIcons({
|
|
241
|
+
scale: 1.2,
|
|
242
|
+
warn: true,
|
|
243
|
+
prefix: 'i-',
|
|
244
|
+
extraProperties: {
|
|
245
|
+
'display': 'inline-block',
|
|
246
|
+
'vertical-align': 'middle',
|
|
247
|
+
},
|
|
248
|
+
}),
|
|
249
|
+
presetTypography(),
|
|
250
|
+
presetWebFonts({
|
|
251
|
+
provider: 'none',
|
|
252
|
+
fonts: theme.fontFamily
|
|
253
|
+
})
|
|
254
|
+
],
|
|
255
|
+
...customConfig
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export * from './theme';
|
|
260
260
|
export * from './theme/shortcuts';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// theme/breakpoints.ts
|
|
2
|
-
export const breakpoints = {
|
|
3
|
-
sm: '640px',
|
|
4
|
-
md: '768px',
|
|
5
|
-
lg: '1024px',
|
|
6
|
-
xl: '1280px',
|
|
7
|
-
'2xl': '1536px',
|
|
8
|
-
'3xl': '1920px',
|
|
9
|
-
'4xl': '2400px',
|
|
1
|
+
// theme/breakpoints.ts
|
|
2
|
+
export const breakpoints = {
|
|
3
|
+
sm: '640px',
|
|
4
|
+
md: '768px',
|
|
5
|
+
lg: '1024px',
|
|
6
|
+
xl: '1280px',
|
|
7
|
+
'2xl': '1536px',
|
|
8
|
+
'3xl': '1920px',
|
|
9
|
+
'4xl': '2400px',
|
|
10
10
|
};
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
// theme/colors.ts
|
|
2
|
-
export const colors = {
|
|
3
|
-
// Brand colors - core identity colors
|
|
4
|
-
brand: {
|
|
5
|
-
primary: '#0040c5', // Main brand color
|
|
6
|
-
secondary: '#00b0f0', // Supporting brand color
|
|
7
|
-
},
|
|
8
|
-
|
|
9
|
-
// Primary blues - main blue palette
|
|
10
|
-
blue: {
|
|
11
|
-
ultralight: '#dbeafe',
|
|
12
|
-
lightest: '#3b82f6', // Lightest shade
|
|
13
|
-
light: '#0069ff',
|
|
14
|
-
default: '#005ad7', // Default/base blue
|
|
15
|
-
medium: '#02307d',
|
|
16
|
-
darker: '#001e50',
|
|
17
|
-
darkest: '#000f28', // Darkest shade
|
|
18
|
-
wrc: '#0000c8', // Special WRC color
|
|
19
|
-
},
|
|
20
|
-
|
|
21
|
-
// Secondary colors - accent palette
|
|
22
|
-
accent: {
|
|
23
|
-
light: '#0099da',
|
|
24
|
-
default: '#0087c1', // Default accent
|
|
25
|
-
dark: '#006ea6',
|
|
26
|
-
darker: '#00437a',
|
|
27
|
-
deepBlue: '#0c1a32',
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
// Neutral colors - grayscale
|
|
31
|
-
neutral: {
|
|
32
|
-
lightest: '#f3f4f6', // Lightest gray
|
|
33
|
-
lighter: '#e5e7eb',
|
|
34
|
-
light: '#b5bbc5',
|
|
35
|
-
default: '#9ca3af', // Base gray
|
|
36
|
-
dark: '#6a767d',
|
|
37
|
-
darker: '#4b5563',
|
|
38
|
-
},
|
|
39
|
-
|
|
40
|
-
// Slate colors - gray-blue palette
|
|
41
|
-
slate: {
|
|
42
|
-
light: '#64748B',
|
|
43
|
-
default: '#475569',
|
|
44
|
-
dark: '#334155',
|
|
45
|
-
darkest: '#1e293b',
|
|
46
|
-
},
|
|
47
|
-
|
|
48
|
-
// System colors - functional colors
|
|
49
|
-
system: {
|
|
50
|
-
success: '#10B981', // Green - success state
|
|
51
|
-
warning: '#FBBF24', // Yellow - warning state
|
|
52
|
-
error: '#EF4444', // Red - error state
|
|
53
|
-
info: '#3B82F6', // Blue - information state
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
// States - interaction states
|
|
57
|
-
state: {
|
|
58
|
-
overlay: 'rgb(0 0 0 / 0.06)', // Overlay & Hover state
|
|
59
|
-
disabled: 'rgb(0 0 0 / 0.12)', // Disabled state
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// Export types for TypeScript
|
|
64
|
-
export type Colors = typeof colors;
|
|
1
|
+
// theme/colors.ts
|
|
2
|
+
export const colors = {
|
|
3
|
+
// Brand colors - core identity colors
|
|
4
|
+
brand: {
|
|
5
|
+
primary: '#0040c5', // Main brand color
|
|
6
|
+
secondary: '#00b0f0', // Supporting brand color
|
|
7
|
+
},
|
|
8
|
+
|
|
9
|
+
// Primary blues - main blue palette
|
|
10
|
+
blue: {
|
|
11
|
+
ultralight: '#dbeafe',
|
|
12
|
+
lightest: '#3b82f6', // Lightest shade
|
|
13
|
+
light: '#0069ff',
|
|
14
|
+
default: '#005ad7', // Default/base blue
|
|
15
|
+
medium: '#02307d',
|
|
16
|
+
darker: '#001e50',
|
|
17
|
+
darkest: '#000f28', // Darkest shade
|
|
18
|
+
wrc: '#0000c8', // Special WRC color
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
// Secondary colors - accent palette
|
|
22
|
+
accent: {
|
|
23
|
+
light: '#0099da',
|
|
24
|
+
default: '#0087c1', // Default accent
|
|
25
|
+
dark: '#006ea6',
|
|
26
|
+
darker: '#00437a',
|
|
27
|
+
deepBlue: '#0c1a32',
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
// Neutral colors - grayscale
|
|
31
|
+
neutral: {
|
|
32
|
+
lightest: '#f3f4f6', // Lightest gray
|
|
33
|
+
lighter: '#e5e7eb',
|
|
34
|
+
light: '#b5bbc5',
|
|
35
|
+
default: '#9ca3af', // Base gray
|
|
36
|
+
dark: '#6a767d',
|
|
37
|
+
darker: '#4b5563',
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
// Slate colors - gray-blue palette
|
|
41
|
+
slate: {
|
|
42
|
+
light: '#64748B',
|
|
43
|
+
default: '#475569',
|
|
44
|
+
dark: '#334155',
|
|
45
|
+
darkest: '#1e293b',
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
// System colors - functional colors
|
|
49
|
+
system: {
|
|
50
|
+
success: '#10B981', // Green - success state
|
|
51
|
+
warning: '#FBBF24', // Yellow - warning state
|
|
52
|
+
error: '#EF4444', // Red - error state
|
|
53
|
+
info: '#3B82F6', // Blue - information state
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
// States - interaction states
|
|
57
|
+
state: {
|
|
58
|
+
overlay: 'rgb(0 0 0 / 0.06)', // Overlay & Hover state
|
|
59
|
+
disabled: 'rgb(0 0 0 / 0.12)', // Disabled state
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// Export types for TypeScript
|
|
64
|
+
export type Colors = typeof colors;
|
|
65
65
|
export type ColorShade = keyof typeof colors;
|