spoko-design-system 0.9.5 → 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 (179) hide show
  1. package/.astro/content.d.ts +1 -1
  2. package/.astro/settings.json +4 -4
  3. package/.astro/types.d.ts +2 -1
  4. package/.github/dependabot.yml +11 -11
  5. package/.github/todo.yml +3 -3
  6. package/.github/workflows/deploy.yml +39 -39
  7. package/.github/workflows/release.yml +64 -0
  8. package/.releaserc.json +93 -0
  9. package/.stackblitzrc +5 -5
  10. package/.vscode/extensions.json +5 -5
  11. package/.vscode/launch.json +11 -11
  12. package/.vscode/settings.json +5 -5
  13. package/CHANGELOG.md +12 -0
  14. package/CONTRIBUTING.md +183 -0
  15. package/LICENSE +21 -21
  16. package/README.md +116 -116
  17. package/astro-i18next.config.mjs +17 -17
  18. package/astro-i18next.config.ts +10 -10
  19. package/astro.config.mjs +86 -86
  20. package/dev-dist/sw.js +91 -91
  21. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  22. package/icon.config.ts +310 -310
  23. package/index.ts +70 -70
  24. package/package.json +22 -12
  25. package/public/arrow-bottom.svg +7 -7
  26. package/public/fonts/lg.svg +53 -53
  27. package/public/fonts/vwhead-bold-demo.html +549 -549
  28. package/public/fonts/vwhead-regular-demo.html +549 -549
  29. package/public/fonts/vwtext-bold-demo.html +549 -549
  30. package/public/fonts/vwtext-regular-demo.html +549 -549
  31. package/public/github.svg +3 -3
  32. package/public/grid_dot.svg +4 -4
  33. package/public/linkedin.svg +44 -44
  34. package/public/locales/en/translation.json +12 -12
  35. package/public/locales/pl/translation.json +12 -12
  36. package/public/make-scrollable-code-focusable.js +3 -3
  37. package/public/pagefind.yml +3 -3
  38. package/public/polo.blue.svg +29 -29
  39. package/public/spoko.space.svg +71 -71
  40. package/public/twitter.svg +46 -46
  41. package/renovate.json +6 -6
  42. package/sandbox.config.json +11 -11
  43. package/src/MyComponent.astro +8 -8
  44. package/src/components/Badge.vue +19 -19
  45. package/src/components/Badges.vue +21 -21
  46. package/src/components/Breadcrumbs.vue +94 -94
  47. package/src/components/Button.vue +101 -101
  48. package/src/components/ButtonCopy.astro +183 -183
  49. package/src/components/ButtonCopy.vue +36 -36
  50. package/src/components/Card.astro +27 -27
  51. package/src/components/Carousel.astro +26 -26
  52. package/src/components/Category/CategoriesCarousel.astro +101 -101
  53. package/src/components/Category/CategoryDetails.astro +169 -169
  54. package/src/components/Category/CategoryLink.vue +28 -28
  55. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  56. package/src/components/Category/CategoryTile.astro +37 -37
  57. package/src/components/Category/CategoryViewToggler.astro +89 -89
  58. package/src/components/Category/SubCategoryLink.vue +19 -19
  59. package/src/components/Copyright.astro +12 -12
  60. package/src/components/Date.astro +7 -7
  61. package/src/components/Faq.astro +33 -33
  62. package/src/components/FaqItem.astro +80 -80
  63. package/src/components/FeaturesList.vue +37 -37
  64. package/src/components/FuckRussia.vue +62 -62
  65. package/src/components/HandDrive.astro +55 -29
  66. package/src/components/Header/Header.astro +210 -210
  67. package/src/components/Header/SkipToContent.astro +1 -1
  68. package/src/components/Headline.vue +87 -87
  69. package/src/components/Image.astro +30 -30
  70. package/src/components/LeftSidebar.astro +53 -53
  71. package/src/components/MainColors.vue +22 -22
  72. package/src/components/MainInput.vue +15 -15
  73. package/src/components/Modal.astro +27 -27
  74. package/src/components/PageContent.astro +5 -5
  75. package/src/components/PartNumber.vue +27 -27
  76. package/src/components/Post/PostCategories.astro +41 -41
  77. package/src/components/Post/PostCategories.vue +30 -30
  78. package/src/components/PostHeader.astro +103 -103
  79. package/src/components/PrCode.vue +141 -141
  80. package/src/components/Product/ProductButton.vue +18 -18
  81. package/src/components/Product/ProductCarousel.astro +35 -35
  82. package/src/components/Product/ProductColors.vue +1 -1
  83. package/src/components/Product/ProductEngineType.vue +42 -42
  84. package/src/components/Product/ProductImage.astro +40 -40
  85. package/src/components/Product/ProductLink.astro +101 -101
  86. package/src/components/Product/ProductLink.vue +59 -59
  87. package/src/components/Product/ProductLinkInfo.astro +37 -37
  88. package/src/components/Product/ProductModels.vue +4 -2
  89. package/src/components/Product/ProductNumber.astro +60 -60
  90. package/src/components/Product/ProductPositions.vue +1 -1
  91. package/src/components/ProductCarousel.astro +38 -38
  92. package/src/components/ProductCodes.vue +39 -39
  93. package/src/components/ProductDetailName.vue +52 -52
  94. package/src/components/ProductDetailsList.vue +216 -216
  95. package/src/components/ProductTile.astro +48 -48
  96. package/src/components/Quote.vue +23 -23
  97. package/src/components/ReloadPrompt.astro +50 -50
  98. package/src/components/SlimBanner.vue +72 -72
  99. package/src/components/Table.vue +32 -32
  100. package/src/components/TableOfContents.astro +15 -15
  101. package/src/components/Translations.vue +23 -23
  102. package/src/components/flags/FlagPL.vue +3 -3
  103. package/src/components/flags/FlagUA.vue +2 -2
  104. package/src/components/{Layout → layout}/CallToAction.astro +52 -52
  105. package/src/components/{Layout → layout}/Container.astro +7 -7
  106. package/src/components/{Layout → layout}/Header.astro +80 -80
  107. package/src/config.ts +56 -56
  108. package/src/design.config.ts +98 -98
  109. package/src/env.d.ts +6 -6
  110. package/src/layouts/Layout.astro +61 -61
  111. package/src/layouts/MainLayout.astro +81 -81
  112. package/src/layouts/partials/FooterCommon.astro +4 -4
  113. package/src/layouts/partials/HeadCommon.astro +44 -44
  114. package/src/layouts/partials/HeadSEO.astro +41 -41
  115. package/src/pages/components/badges.mdx +57 -57
  116. package/src/pages/components/breadcrumbs.mdx +139 -139
  117. package/src/pages/components/buttons.mdx +360 -360
  118. package/src/pages/components/card.mdx +294 -294
  119. package/src/pages/components/carousel.mdx +62 -62
  120. package/src/pages/components/copyright.mdx +42 -42
  121. package/src/pages/components/details-list.mdx +115 -115
  122. package/src/pages/components/features-list.mdx +37 -37
  123. package/src/pages/components/flags.mdx +49 -49
  124. package/src/pages/components/fuck-russia.mdx +39 -39
  125. package/src/pages/components/hand-drive.mdx +105 -38
  126. package/src/pages/components/headline.mdx +137 -137
  127. package/src/pages/components/icons.astro +135 -135
  128. package/src/pages/components/image.mdx +513 -513
  129. package/src/pages/components/input.mdx +367 -367
  130. package/src/pages/components/jumbotron.mdx +359 -359
  131. package/src/pages/components/modal.mdx +64 -64
  132. package/src/pages/components/post-header.mdx +64 -64
  133. package/src/pages/components/pr-code.mdx +65 -65
  134. package/src/pages/components/product-number.mdx +58 -58
  135. package/src/pages/components/product-tile.mdx +51 -51
  136. package/src/pages/components/quote.mdx +33 -33
  137. package/src/pages/components/slimbanner.mdx +35 -35
  138. package/src/pages/components/table.mdx +108 -108
  139. package/src/pages/core/colors.mdx +10 -10
  140. package/src/pages/core/grid.mdx +89 -89
  141. package/src/pages/core/introduction.mdx +77 -77
  142. package/src/pages/core/shadows.astro +20 -20
  143. package/src/pages/core/typography.astro +49 -49
  144. package/src/pages/index.astro +133 -133
  145. package/src/pages/patterns/introduction.mdx +60 -60
  146. package/src/pwa.ts +12 -12
  147. package/src/styles/_variables.scss +70 -70
  148. package/src/styles/base/base.css +184 -184
  149. package/src/styles/base/grid.css +92 -92
  150. package/src/styles/base/typography.css +70 -70
  151. package/src/styles/content.css +73 -73
  152. package/src/styles/main.css +7 -7
  153. package/src/types/Product.ts +31 -31
  154. package/src/types/astro.d.ts +3 -3
  155. package/src/utils/product/getPriceFormatted.ts +15 -15
  156. package/src/utils/product/getProductChecklist.ts +17 -17
  157. package/src/utils/product/useFormatProductNumber.ts +41 -41
  158. package/src/utils/seo/getShorterDescription.ts +14 -14
  159. package/src/utils/text/formatDate.ts +5 -5
  160. package/src/utils/text/formatLocaleNumber.ts +6 -6
  161. package/src/utils/text/formatPad.ts +12 -12
  162. package/src/utils/text/getNumberFormatted.ts +33 -33
  163. package/src/utils/text/getTranslatedLink.ts +5 -5
  164. package/src/utils/text.ts +19 -19
  165. package/tailwind.config.cjs +8 -8
  166. package/tsconfig.json +28 -28
  167. package/uno-config/index.ts +268 -268
  168. package/uno-config/theme/breakpoints.ts +9 -9
  169. package/uno-config/theme/colors.ts +64 -64
  170. package/uno-config/theme/dimensions.ts +17 -17
  171. package/uno-config/theme/effects.ts +14 -14
  172. package/uno-config/theme/grid.ts +10 -10
  173. package/uno-config/theme/index.ts +28 -28
  174. package/uno-config/theme/shortcuts/buttons.ts +53 -53
  175. package/uno-config/theme/shortcuts/components.ts +123 -123
  176. package/uno-config/theme/shortcuts/index.ts +20 -20
  177. package/uno-config/theme/shortcuts/layout.ts +74 -74
  178. package/uno-config/theme/typography.ts +29 -29
  179. package/uno.config.ts +2 -2
@@ -1,269 +1,269 @@
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
- // Static imports for all icon collections (prevents Vite module runner issues)
23
- import antDesignIcons from '@iconify-json/ant-design/icons.json';
24
- import biIcons from '@iconify-json/bi/icons.json';
25
- import bxIcons from '@iconify-json/bx/icons.json';
26
- import carbonIcons from '@iconify-json/carbon/icons.json';
27
- import circleFlagsIcons from '@iconify-json/circle-flags/icons.json';
28
- import eiIcons from '@iconify-json/ei/icons.json';
29
- import elIcons from '@iconify-json/el/icons.json';
30
- import eosIcons from '@iconify-json/eos-icons/icons.json';
31
- import etIcons from '@iconify-json/et/icons.json';
32
- import flowbiteIcons from '@iconify-json/flowbite/icons.json';
33
- import fluentIcons from '@iconify-json/fluent/icons.json';
34
- import fluentEmojiIcons from '@iconify-json/fluent-emoji/icons.json';
35
- import icIcons from '@iconify-json/ic/icons.json';
36
- import iconParkOutlineIcons from '@iconify-json/icon-park-outline/icons.json';
37
- import laIcons from '@iconify-json/la/icons.json';
38
- import lucideIcons from '@iconify-json/lucide/icons.json';
39
- import materialSymbolsLightIcons from '@iconify-json/material-symbols-light/icons.json';
40
- import mdiIcons from '@iconify-json/mdi/icons.json';
41
- import notoV1Icons from '@iconify-json/noto-v1/icons.json';
42
- import octiconIcons from '@iconify-json/octicon/icons.json';
43
- import phIcons from '@iconify-json/ph/icons.json';
44
- import simpleIcons from '@iconify-json/simple-icons/icons.json';
45
- import systemUiconsIcons from '@iconify-json/system-uicons/icons.json';
46
- import uilIcons from '@iconify-json/uil/icons.json';
47
-
48
- // List of peer selectors we want to preserve during build
49
- const peerSelectorClasses = [
50
- // Focus state classes
51
- 'peer-focus:text-blue-light',
52
- 'peer-focus:dark:text-blue-lightest',
53
- 'peer-focus:scale-75',
54
- 'peer-focus:-translate-y-6',
55
- 'peer-focus:-translate-y-4',
56
- 'peer-focus:start-0',
57
-
58
- // Placeholder shown classes
59
- 'peer-placeholder-shown:scale-100',
60
- 'peer-placeholder-shown:translate-y-0',
61
-
62
- // Not placeholder shown classes
63
- 'peer-not-placeholder-shown:scale-75',
64
- 'peer-not-placeholder-shown:-translate-y-6',
65
- 'peer-not-placeholder-shown:-translate-y-4',
66
- ];
67
-
68
- interface CustomConfig extends Partial<UserConfig> {
69
- shortcuts?: UserShortcuts;
70
- theme?: Partial<typeof theme>;
71
- }
72
-
73
- /**
74
- * Creates a UnoCSS configuration with Spoko Design System defaults
75
- *
76
- * IMPORTANT: This function requires all the imported UnoCSS presets and transformers.
77
- * Do not remove any imports at the top of this file as they are necessary for
78
- * proper functioning of the UnoCSS configuration.
79
- *
80
- * @param customConfig - Optional custom configuration to merge with defaults
81
- * @returns Complete UnoCSS configuration
82
- */
83
- export function createSdsConfig(customConfig: CustomConfig = {}) {
84
- return defineConfig({
85
- // Optimizations for static builds
86
- ...(process.env.NODE_ENV === 'production' && {
87
- inspector: false,
88
- hmr: false,
89
- }),
90
-
91
- // Transform directives and variant groups
92
- transformers: [
93
- transformerDirectives(),
94
- transformerVariantGroup(),
95
- ],
96
- shortcuts: {
97
- ...shortcuts,
98
- ...(customConfig.shortcuts || {})
99
- },
100
- theme: {
101
- ...theme,
102
- ...(customConfig.theme || {})
103
- },
104
- // Enhanced variants to better handle peer selectors
105
- variants: [
106
- // Add specific peer variant support
107
- (matcher) => {
108
- if (!matcher.startsWith('peer-'))
109
- return matcher;
110
-
111
- const peerVariant = matcher.slice(5);
112
- const selectorMap = {
113
- 'focus:': (s) => `.peer:focus ~ ${s}`,
114
- 'hover:': (s) => `.peer:hover ~ ${s}`,
115
- 'placeholder-shown:': (s) => `.peer:placeholder-shown ~ ${s}`,
116
- 'not-placeholder-shown:': (s) => `.peer:not(:placeholder-shown) ~ ${s}`,
117
- };
118
-
119
- // Check for nested variants like 'peer-focus:text-blue'
120
- for (const [key, selectorFn] of Object.entries(selectorMap)) {
121
- if (peerVariant.startsWith(key)) {
122
- return {
123
- matcher: peerVariant.slice(key.length),
124
- selector: selectorFn,
125
- };
126
- }
127
- }
128
-
129
- // Default peer handling
130
- return {
131
- matcher: peerVariant,
132
- selector: (s) => `.peer:${peerVariant} ~ ${s}`,
133
- };
134
- },
135
- ],
136
- // Optimized safelist for static Astro builds
137
- safelist: [
138
- // Layout and grid classes that might be used dynamically
139
- 'md:grid-cols-product',
140
-
141
- // Component-specific classes for static generation
142
- 'breadcrumb-link-disabled',
143
- 'breadcrumb-link',
144
- 'breadcrumb-item',
145
- 'features-list-caption',
146
- 'features-list-ul',
147
- 'features-list-item',
148
- 'category-link-base',
149
- 'category-link-active',
150
-
151
- // Essential peer and input classes
152
- 'peer',
153
- 'resize-none',
154
- 'origin-top-left',
155
- 'transform-gpu',
156
-
157
- // All peer selectors from the list (needed for floating labels)
158
- ...peerSelectorClasses,
159
- ],
160
- // Optimized extractors for static Astro builds
161
- extractors: [
162
- {
163
- name: 'astro-static',
164
- extract({ code, id }) {
165
- const result = new Set();
166
-
167
- // Enhanced class extraction for Astro components
168
- const classRegex = /class(?:Name)?=["'`]([^"'`]+)["'`]/g;
169
- let match;
170
- while ((match = classRegex.exec(code)) !== null) {
171
- match[1].split(/\s+/).forEach(cls => {
172
- if (cls) result.add(cls);
173
- });
174
- }
175
-
176
- // Extract peer selectors
177
- const peerRegex = /peer-[a-zA-Z0-9-]+(?::[a-zA-Z0-9-]+)*/g;
178
- const peerMatches = code.match(peerRegex);
179
- if (peerMatches) {
180
- peerMatches.forEach(match => result.add(match));
181
- }
182
-
183
- // Extract shortcut references
184
- const shortcutRegex = /\b(?:input|button|layout|component|product|jumbotron)-[a-zA-Z0-9-]+/g;
185
- const shortcutMatches = code.match(shortcutRegex);
186
- if (shortcutMatches) {
187
- shortcutMatches.forEach(match => result.add(match));
188
- }
189
-
190
- // For .astro files, extract from both template and script sections
191
- if (id && id.endsWith('.astro')) {
192
- // Extract from dynamic class bindings
193
- const dynamicClassRegex = /class:\w+\s*=\s*["'`]([^"'`]+)["'`]/g;
194
- while ((match = dynamicClassRegex.exec(code)) !== null) {
195
- match[1].split(/\s+/).forEach(cls => {
196
- if (cls) result.add(cls);
197
- });
198
- }
199
- }
200
-
201
- return result;
202
- },
203
- },
204
- ],
205
- // IMPORTANT: All of these presets are required for proper functioning
206
- presets: [
207
- presetUno(),
208
- presetAttributify(),
209
- presetIcons({
210
- scale: 1.2,
211
- warn: true,
212
- prefix: 'i-',
213
- extraProperties: {
214
- 'display': 'inline-block',
215
- 'vertical-align': 'middle',
216
- },
217
- collections: {
218
- // All icon collections with static imports to prevent Vite module runner issues
219
- 'ant-design': antDesignIcons,
220
- 'bi': biIcons,
221
- 'bx': bxIcons,
222
- 'carbon': carbonIcons,
223
- 'circle-flags': circleFlagsIcons,
224
- 'ei': eiIcons,
225
- 'el': elIcons,
226
- 'eos-icons': eosIcons,
227
- 'et': etIcons,
228
- 'flowbite': flowbiteIcons,
229
- 'fluent': fluentIcons,
230
- 'fluent-emoji': fluentEmojiIcons,
231
- 'ic': icIcons,
232
- 'icon-park-outline': iconParkOutlineIcons,
233
- 'la': laIcons,
234
- 'lucide': lucideIcons,
235
- 'material-symbols-light': materialSymbolsLightIcons,
236
- 'mdi': mdiIcons,
237
- 'noto-v1': notoV1Icons,
238
- 'octicon': octiconIcons,
239
- 'ph': phIcons,
240
- 'simple-icons': simpleIcons,
241
- 'system-uicons': systemUiconsIcons,
242
- 'uil': uilIcons,
243
- }
244
- }),
245
- presetTypography(),
246
- presetWebFonts({
247
- provider: 'none',
248
- fonts: theme.fontFamily
249
- })
250
- ],
251
-
252
- // Additional optimizations for static Astro builds
253
- preflights: [
254
- {
255
- getCSS: () => `
256
- /* Optimized base styles for static builds */
257
- *,*::before,*::after{box-sizing:border-box}
258
- html{line-height:1.5;-webkit-text-size-adjust:100%}
259
- body{margin:0;font-family:vw_textregular,system-ui,sans-serif}
260
- `
261
- }
262
- ],
263
-
264
- ...customConfig
265
- });
266
- }
267
-
268
- 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
+ // Static imports for all icon collections (prevents Vite module runner issues)
23
+ import antDesignIcons from '@iconify-json/ant-design/icons.json';
24
+ import biIcons from '@iconify-json/bi/icons.json';
25
+ import bxIcons from '@iconify-json/bx/icons.json';
26
+ import carbonIcons from '@iconify-json/carbon/icons.json';
27
+ import circleFlagsIcons from '@iconify-json/circle-flags/icons.json';
28
+ import eiIcons from '@iconify-json/ei/icons.json';
29
+ import elIcons from '@iconify-json/el/icons.json';
30
+ import eosIcons from '@iconify-json/eos-icons/icons.json';
31
+ import etIcons from '@iconify-json/et/icons.json';
32
+ import flowbiteIcons from '@iconify-json/flowbite/icons.json';
33
+ import fluentIcons from '@iconify-json/fluent/icons.json';
34
+ import fluentEmojiIcons from '@iconify-json/fluent-emoji/icons.json';
35
+ import icIcons from '@iconify-json/ic/icons.json';
36
+ import iconParkOutlineIcons from '@iconify-json/icon-park-outline/icons.json';
37
+ import laIcons from '@iconify-json/la/icons.json';
38
+ import lucideIcons from '@iconify-json/lucide/icons.json';
39
+ import materialSymbolsLightIcons from '@iconify-json/material-symbols-light/icons.json';
40
+ import mdiIcons from '@iconify-json/mdi/icons.json';
41
+ import notoV1Icons from '@iconify-json/noto-v1/icons.json';
42
+ import octiconIcons from '@iconify-json/octicon/icons.json';
43
+ import phIcons from '@iconify-json/ph/icons.json';
44
+ import simpleIcons from '@iconify-json/simple-icons/icons.json';
45
+ import systemUiconsIcons from '@iconify-json/system-uicons/icons.json';
46
+ import uilIcons from '@iconify-json/uil/icons.json';
47
+
48
+ // List of peer selectors we want to preserve during build
49
+ const peerSelectorClasses = [
50
+ // Focus state classes
51
+ 'peer-focus:text-blue-light',
52
+ 'peer-focus:dark:text-blue-lightest',
53
+ 'peer-focus:scale-75',
54
+ 'peer-focus:-translate-y-6',
55
+ 'peer-focus:-translate-y-4',
56
+ 'peer-focus:start-0',
57
+
58
+ // Placeholder shown classes
59
+ 'peer-placeholder-shown:scale-100',
60
+ 'peer-placeholder-shown:translate-y-0',
61
+
62
+ // Not placeholder shown classes
63
+ 'peer-not-placeholder-shown:scale-75',
64
+ 'peer-not-placeholder-shown:-translate-y-6',
65
+ 'peer-not-placeholder-shown:-translate-y-4',
66
+ ];
67
+
68
+ interface CustomConfig extends Partial<UserConfig> {
69
+ shortcuts?: UserShortcuts;
70
+ theme?: Partial<typeof theme>;
71
+ }
72
+
73
+ /**
74
+ * Creates a UnoCSS configuration with Spoko Design System defaults
75
+ *
76
+ * IMPORTANT: This function requires all the imported UnoCSS presets and transformers.
77
+ * Do not remove any imports at the top of this file as they are necessary for
78
+ * proper functioning of the UnoCSS configuration.
79
+ *
80
+ * @param customConfig - Optional custom configuration to merge with defaults
81
+ * @returns Complete UnoCSS configuration
82
+ */
83
+ export function createSdsConfig(customConfig: CustomConfig = {}) {
84
+ return defineConfig({
85
+ // Optimizations for static builds
86
+ ...(process.env.NODE_ENV === 'production' && {
87
+ inspector: false,
88
+ hmr: false,
89
+ }),
90
+
91
+ // Transform directives and variant groups
92
+ transformers: [
93
+ transformerDirectives(),
94
+ transformerVariantGroup(),
95
+ ],
96
+ shortcuts: {
97
+ ...shortcuts,
98
+ ...(customConfig.shortcuts || {})
99
+ },
100
+ theme: {
101
+ ...theme,
102
+ ...(customConfig.theme || {})
103
+ },
104
+ // Enhanced variants to better handle peer selectors
105
+ variants: [
106
+ // Add specific peer variant support
107
+ (matcher) => {
108
+ if (!matcher.startsWith('peer-'))
109
+ return matcher;
110
+
111
+ const peerVariant = matcher.slice(5);
112
+ const selectorMap = {
113
+ 'focus:': (s) => `.peer:focus ~ ${s}`,
114
+ 'hover:': (s) => `.peer:hover ~ ${s}`,
115
+ 'placeholder-shown:': (s) => `.peer:placeholder-shown ~ ${s}`,
116
+ 'not-placeholder-shown:': (s) => `.peer:not(:placeholder-shown) ~ ${s}`,
117
+ };
118
+
119
+ // Check for nested variants like 'peer-focus:text-blue'
120
+ for (const [key, selectorFn] of Object.entries(selectorMap)) {
121
+ if (peerVariant.startsWith(key)) {
122
+ return {
123
+ matcher: peerVariant.slice(key.length),
124
+ selector: selectorFn,
125
+ };
126
+ }
127
+ }
128
+
129
+ // Default peer handling
130
+ return {
131
+ matcher: peerVariant,
132
+ selector: (s) => `.peer:${peerVariant} ~ ${s}`,
133
+ };
134
+ },
135
+ ],
136
+ // Optimized safelist for static Astro builds
137
+ safelist: [
138
+ // Layout and grid classes that might be used dynamically
139
+ 'md:grid-cols-product',
140
+
141
+ // Component-specific classes for static generation
142
+ 'breadcrumb-link-disabled',
143
+ 'breadcrumb-link',
144
+ 'breadcrumb-item',
145
+ 'features-list-caption',
146
+ 'features-list-ul',
147
+ 'features-list-item',
148
+ 'category-link-base',
149
+ 'category-link-active',
150
+
151
+ // Essential peer and input classes
152
+ 'peer',
153
+ 'resize-none',
154
+ 'origin-top-left',
155
+ 'transform-gpu',
156
+
157
+ // All peer selectors from the list (needed for floating labels)
158
+ ...peerSelectorClasses,
159
+ ],
160
+ // Optimized extractors for static Astro builds
161
+ extractors: [
162
+ {
163
+ name: 'astro-static',
164
+ extract({ code, id }) {
165
+ const result = new Set();
166
+
167
+ // Enhanced class extraction for Astro components
168
+ const classRegex = /class(?:Name)?=["'`]([^"'`]+)["'`]/g;
169
+ let match;
170
+ while ((match = classRegex.exec(code)) !== null) {
171
+ match[1].split(/\s+/).forEach(cls => {
172
+ if (cls) result.add(cls);
173
+ });
174
+ }
175
+
176
+ // Extract peer selectors
177
+ const peerRegex = /peer-[a-zA-Z0-9-]+(?::[a-zA-Z0-9-]+)*/g;
178
+ const peerMatches = code.match(peerRegex);
179
+ if (peerMatches) {
180
+ peerMatches.forEach(match => result.add(match));
181
+ }
182
+
183
+ // Extract shortcut references
184
+ const shortcutRegex = /\b(?:input|button|layout|component|product|jumbotron)-[a-zA-Z0-9-]+/g;
185
+ const shortcutMatches = code.match(shortcutRegex);
186
+ if (shortcutMatches) {
187
+ shortcutMatches.forEach(match => result.add(match));
188
+ }
189
+
190
+ // For .astro files, extract from both template and script sections
191
+ if (id && id.endsWith('.astro')) {
192
+ // Extract from dynamic class bindings
193
+ const dynamicClassRegex = /class:\w+\s*=\s*["'`]([^"'`]+)["'`]/g;
194
+ while ((match = dynamicClassRegex.exec(code)) !== null) {
195
+ match[1].split(/\s+/).forEach(cls => {
196
+ if (cls) result.add(cls);
197
+ });
198
+ }
199
+ }
200
+
201
+ return result;
202
+ },
203
+ },
204
+ ],
205
+ // IMPORTANT: All of these presets are required for proper functioning
206
+ presets: [
207
+ presetUno(),
208
+ presetAttributify(),
209
+ presetIcons({
210
+ scale: 1.2,
211
+ warn: true,
212
+ prefix: 'i-',
213
+ extraProperties: {
214
+ 'display': 'inline-block',
215
+ 'vertical-align': 'middle',
216
+ },
217
+ collections: {
218
+ // All icon collections with static imports to prevent Vite module runner issues
219
+ 'ant-design': antDesignIcons,
220
+ 'bi': biIcons,
221
+ 'bx': bxIcons,
222
+ 'carbon': carbonIcons,
223
+ 'circle-flags': circleFlagsIcons,
224
+ 'ei': eiIcons,
225
+ 'el': elIcons,
226
+ 'eos-icons': eosIcons,
227
+ 'et': etIcons,
228
+ 'flowbite': flowbiteIcons,
229
+ 'fluent': fluentIcons,
230
+ 'fluent-emoji': fluentEmojiIcons,
231
+ 'ic': icIcons,
232
+ 'icon-park-outline': iconParkOutlineIcons,
233
+ 'la': laIcons,
234
+ 'lucide': lucideIcons,
235
+ 'material-symbols-light': materialSymbolsLightIcons,
236
+ 'mdi': mdiIcons,
237
+ 'noto-v1': notoV1Icons,
238
+ 'octicon': octiconIcons,
239
+ 'ph': phIcons,
240
+ 'simple-icons': simpleIcons,
241
+ 'system-uicons': systemUiconsIcons,
242
+ 'uil': uilIcons,
243
+ }
244
+ }),
245
+ presetTypography(),
246
+ presetWebFonts({
247
+ provider: 'none',
248
+ fonts: theme.fontFamily
249
+ })
250
+ ],
251
+
252
+ // Additional optimizations for static Astro builds
253
+ preflights: [
254
+ {
255
+ getCSS: () => `
256
+ /* Optimized base styles for static builds */
257
+ *,*::before,*::after{box-sizing:border-box}
258
+ html{line-height:1.5;-webkit-text-size-adjust:100%}
259
+ body{margin:0;font-family:vw_textregular,system-ui,sans-serif}
260
+ `
261
+ }
262
+ ],
263
+
264
+ ...customConfig
265
+ });
266
+ }
267
+
268
+ export * from './theme';
269
269
  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
  };