spoko-design-system 0.2.85 → 0.2.87

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.
@@ -1,48 +1,68 @@
1
1
  export const COLORS = {
2
- gray: [
3
- { name: "100", value: "#f3f4f6" },
4
- { name: "200", value: "#e5e7eb" },
5
- { name: "300", value: "#b5bbc5" },
6
- { name: "400", value: "#9ca3af" },
7
- { name: "500", value: "#64748B" },
8
- { name: "600", value: "#475569" },
9
- { name: "700", value: "#334155" },
10
- { name: "800", value: "#1e293b" },
11
- { name: "900", value: "#0f172a" },
2
+ // Brand Colors
3
+ brand: [
4
+ { name: "primary", value: "#0040c5" },
5
+ { name: "secondary", value: "#00b0f0" }
12
6
  ],
7
+
8
+ // Primary Blues
13
9
  blue: [
14
- { name: "50", value: "#eff6ff" },
15
- { name: "100", value: "#dbeafe" },
16
- { name: "200", value: "#bfdbfe" },
17
- { name: "300", value: "#93c5fd" },
18
- { name: "400", value: "#60a5fa" },
19
- { name: "500", value: "#3b82f6" },
20
- { name: "540", value: '#0069ff'},
21
- { name: "545", value: '#005ad7'},
22
- { name: "550", value: '#0040c5'},
23
- { name: "600", value: "#02307d" },
24
- { name: "601", value: '#002059'},
25
- { name: "700", value: "#001e50" },
26
- { name: "800", value: "#00437a" },
27
- { name: "900", value: "#000f28" },
28
- { name: "901", value: "#0c1a32" },
29
- { name: "wrc", value: "#0000c8" },
10
+ { name: "ultralight", value: "#dbeafe" },
11
+ { name: "lightest", value: "#3b82f6" },
12
+ { name: "light", value: "#0069ff" },
13
+ { name: "default", value: "#005ad7" },
14
+ { name: "medium", value: "#02307d" },
15
+ { name: "darker", value: "#001e50" },
16
+ { name: "darkest", value: "#000f28" },
17
+ { name: "wrc", value: "#0000c8" }
18
+ ],
19
+
20
+ // Accent Colors
21
+ accent: [
22
+ { name: "lightest", value: "#00b0f0" },
23
+ { name: "light", value: "#0099da" },
24
+ { name: "default", value: "#0087c1" },
25
+ { name: "dark", value: "#006ea6" },
26
+ { name: "darker", value: "#00437a" },
27
+ { name: "deepBlue", value: "#0c1a32" }
28
+ ],
29
+
30
+ // Neutral Colors
31
+ neutral: [
32
+ { name: "lightest", value: "#f3f4f6" },
33
+ { name: "lighter", value: "#e5e7eb" },
34
+ { name: "light", value: "#b5bbc5" },
35
+ { name: "default", value: "#9ca3af" },
36
+ { name: "dark", value: "#6a767d" },
37
+ { name: "darker", value: "#4b5563"},
38
+ { name: "black", value: "#000000" }
30
39
  ],
31
- lightBlue: [
32
- { name: "400", value: "#00b0f0" },
33
- { name: "500", value: "#0099da" },
34
- { name: "600", value: "#0087c1" },
35
- { name: "700", value: "#006ea6" },
40
+
41
+ // Slate Colors
42
+ slate: [
43
+ { name: "light", value: "#64748B" },
44
+ { name: "default", value: "#475569" },
45
+ { name: "dark", value: "#334155" },
46
+ { name: "darker", value: "#1e293b" }, // Previously 'darkest'
47
+ { name: "darkest", value: "#0f172a" } // New shade added
36
48
  ],
37
- red: [
38
- { name: "400", value: "#f8b5b5" },
39
- { name: "500", value: "#f49f9f" },
40
- { name: "600", value: "#e57373" },
49
+
50
+ // System Colors
51
+ system: [
52
+ { name: "success", value: "#10B981" },
53
+ { name: "warning", value: "#FBBF24" },
54
+ { name: "error", value: "#EF4444" },
55
+ { name: "info", value: "#3B82F6" }
41
56
  ],
57
+
58
+ // State Colors
59
+ state: [
60
+ { name: "overlay", value: "rgb(0 0 0 / 0.06)" },
61
+ { name: "disabled", value: "rgb(0 0 0 / 0.12)" },
62
+ ]
42
63
  };
43
64
 
44
65
  export const TYPOGRAPHY = {
45
- fontFamily: "Inter, system",
46
66
  scale: [
47
67
  { name: "h1", size: "22pt", weight: "400" },
48
68
  { name: "h2", size: "17pt", weight: "500" },
@@ -50,32 +70,30 @@ export const TYPOGRAPHY = {
50
70
  { name: "h4", size: "13pt", weight: "500" },
51
71
  { name: "body", size: "13pt", weight: "400" },
52
72
  { name: "button", size: "13pt", weight: "400" },
53
- { name: "caption", size: "10pt", weight: "400" },
54
- ],
73
+ { name: "caption", size: "10pt", weight: "400" }
74
+ ]
75
+ };
76
+
77
+ export const FONTS = {
78
+ types: [
79
+ { name: "sans", value: "font-textregular" },
80
+ { name: "text-regular", value: "font-textregular" },
81
+ { name: "text-bold", value: "font-textbold" },
82
+ { name: "head-bold", value: "font-headbold" },
83
+ { name: "head-regular", value: "font-headregular" },
84
+ { name: "head-light", value: "font-headlight" },
85
+ { name: "text-light", value: "font-textlight" },
86
+ { name: "mono", value: "font-novamono" }
87
+ ]
55
88
  };
56
89
 
57
- export const SHADOWS = {
90
+ export const SHADOWS = {
58
91
  types: [
59
92
  { name: "xs", value: "0px 2px 4px rgba(0, 0, 0, 0.08)" },
60
93
  { name: "sm", value: "0px 4px 8px rgba(0, 0, 0, 0.125)" },
61
94
  { name: "md", value: "0px 8px 16px rgba(0, 0, 0, 0.125)" },
62
95
  { name: "lg", value: "0px 16px 32px rgba(0, 0, 0, 0.125)" },
63
- { name: "xl", value: "0px 32px 64px rgba(0, 0, 0, 0.125)" },
64
- { name: "2xl", value: "0px 64px 128px rgba(0, 0, 0, 0.125)" },
65
- ],
66
- };
67
-
68
-
69
- export const FONTS = {
70
- types: [
71
- { name: "vw_textregular", value: "font-textregular" },
72
- { name: "vw_textregular", value: "font-sans" },
73
- { name: "vw_textbold", value: "font-textbold" },
74
- { name: "vw_headbold", value: "font-headbold" },
75
- { name: "vw_headregular", value: "font-headregular" },
76
- { name: "vw_headlight", value: "font-headlight" },
77
- { name: "vw_textlight", value: "font-textlight" },
78
- { name: "Nova Mono", value: "font-novamono" },
79
- { name: "Nova Mono", value: "font-mono" }
80
- ],
81
- };
96
+ { name: "xl", value: "0px 32px 64px rgba(0, 0, 0, 0.125)" },
97
+ { name: "2xl", value: "0px 64px 128px rgba(0, 0, 0, 0.125)" }
98
+ ]
99
+ };
@@ -221,7 +221,7 @@ Skewed background with CSS & SVG.
221
221
 
222
222
  <div class="columns-3 gap-8">
223
223
 
224
- <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-600 break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
224
+ <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-medium break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
225
225
  <img alt="..." src="https://picsum.photos/900/600/?random" class="w-full align-middle rounded-t-lg img--16/9" />
226
226
  <blockquote class="relative p-8 mb-4 text-white/90">
227
227
  <svg preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 583 95" class="absolute left-0 w-full block" style="height:95px;top:-94px"><polygon points="-30,95 583,95 583,65" class="text-blue-600 fill-current"></polygon></svg>
@@ -232,7 +232,7 @@ Skewed background with CSS & SVG.
232
232
  </blockquote>
233
233
  </div>
234
234
 
235
- <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-600 break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
235
+ <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-medium break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
236
236
  <img alt="..." src="https://picsum.photos/900/600/?random" class="w-full align-middle rounded-t-lg img--16/9" />
237
237
  <blockquote class="relative p-8 mb-4 text-white/90">
238
238
  <svg preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 583 95" class="absolute left-0 w-full block" style="height:95px;top:-94px"><polygon points="-30,95 583,95 583,65" class="text-blue-600 fill-current"></polygon></svg>
@@ -243,7 +243,7 @@ Skewed background with CSS & SVG.
243
243
  </blockquote>
244
244
  </div>
245
245
 
246
- <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-600 break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
246
+ <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-medium break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
247
247
  <img alt="..." src="https://picsum.photos/900/600/?random" class="w-full align-middle rounded-t-lg img--16/9" />
248
248
  <blockquote class="relative p-8 mb-4 text-white/90">
249
249
  <svg preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 583 95" class="absolute left-0 w-full block" style="height:95px;top:-94px"><polygon points="-30,95 583,95 583,65" class="text-blue-600 fill-current"></polygon></svg>
@@ -254,7 +254,7 @@ Skewed background with CSS & SVG.
254
254
  </blockquote>
255
255
  </div>
256
256
 
257
- <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-600 break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
257
+ <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-medium break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
258
258
  <img alt="..." src="https://picsum.photos/900/600/?random" class="w-full align-middle rounded-t-lg img--16/9" />
259
259
  <blockquote class="relative p-8 mb-4 text-white/90">
260
260
  <svg preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 583 95" class="absolute left-0 w-full block" style="height:95px;top:-94px"><polygon points="-30,95 583,95 583,65" class="text-blue-600 fill-current"></polygon></svg>
@@ -265,7 +265,7 @@ Skewed background with CSS & SVG.
265
265
  </blockquote>
266
266
  </div>
267
267
 
268
- <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-600 break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
268
+ <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-medium break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
269
269
  <img alt="..." src="https://picsum.photos/900/600/?random" class="w-full align-middle rounded-t-lg img--16/9" />
270
270
  <blockquote class="relative p-8 mb-4 text-white/90">
271
271
  <svg preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 583 95" class="absolute left-0 w-full block" style="height:95px;top:-94px"><polygon points="-30,95 583,95 583,65" class="text-blue-600 fill-current"></polygon></svg>
@@ -276,7 +276,7 @@ Skewed background with CSS & SVG.
276
276
  </blockquote>
277
277
  </div>
278
278
 
279
- <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-600 break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
279
+ <div class="relative flex flex-col min-w-0 break-words w-full mb-8 shadow-lg rounded-lg bg-blue-medium break-inside-avoid-column duration-300 hover:scale-105 hover:shadow-xl">
280
280
  <img alt="..." src="https://picsum.photos/900/600/?random" class="w-full align-middle rounded-t-lg img--16/9" />
281
281
  <blockquote class="relative p-8 mb-4 text-white/90">
282
282
  <svg preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 583 95" class="absolute left-0 w-full block" style="height:95px;top:-94px"><polygon points="-30,95 583,95 583,65" class="text-blue-600 fill-current"></polygon></svg>
@@ -1,48 +1,136 @@
1
1
  ---
2
2
  import MainLayout from "../../layouts/MainLayout.astro";
3
3
  import { Icon } from "astro-icon/components";
4
-
4
+ import { iconConfig } from '../../../icon.config';
5
5
 
6
6
  const iconifyUrl = "https://icon-sets.iconify.design/";
7
- const ICONS = {
8
- mdi: ["facebook", "instagram", "post-it-note-edit-outline", "car-hatchback", "car-door", "car-side", "car-windshield-outline", "car-light-alert", "car-tire-alert", "car-light-dimmed", "car-light-fog", "car-light-high", "car-parking-lights", "car-esp", "car-brake-abs", "car-horn", "engine-outline", "fan", "fan-off", "air-conditioner", "coolant-temperature", "car-brake-alert", "car-traction-control", "card-text-outline", "fuel", "oil", "hazard-lights", "credit-card-outline"],
9
- el: ["star-empty", "star", "heart-empty", "heart", "map-marker", "fire", "quote-right", "qrcode", "car", "indent-left", "indent-right", "ok"], 'eos-icons': ["three-dots-loading", "bubble-loading", "loading", "installing"],
10
- fluent: ["share-android-24-regular", "checkmark-24-filled", "tag-24-regular", "tag-multiple-24-regular" ],
11
- "fluent-emoji": ["cookie", "construction", "warning", "wrench"],
12
- la: ["arrow-right", "arrow-left", "car", "car-side"],
13
- octicon: ["chevron-left-24", "x-24", "alert-24", "graph-24", "comment-24", "comment-discussion-24", "clock-24", "star-24", "star-fill-24", "file-media-24", "heart-24", "heart-fill-24", "project-roadmap-24", "location-24", "info-24", "mark-github-16"],
14
- uil: ["map-marker", "envelope", "phone", "tag-alt"],
15
- "simple-icons": ["ebay", "allegro", "volkswagen", "audi", "skoda", "seat", "whatsapp", "x", "facebook", "messenger", "instagram", "telegram"],
16
- "icon-park-outline": ["shopping-bag", "comment", "comments", "tag-one"],
17
- flowbite: ["arrow-left-outline", "arrow-right-outline", "angle-left-outline", "angle-right-outline", "chevron-left-outline", "chevron-right-outline","map-location-outline", "map-pin-alt-solid", "x-outline", "messages-outline", "arrow-down-to-bracket-outline", "check-outline"]
7
+ const ICONS = iconConfig.include;
18
8
 
9
+ type IconGroup = {
10
+ name: string;
11
+ icons: string[];
12
+ url: string;
19
13
  };
14
+
15
+ const sortedIconCollections = Object.entries(ICONS)
16
+ .sort(([a], [b]) => a.localeCompare(b))
17
+ .map(([name, icons]) => ({
18
+ name,
19
+ icons,
20
+ url: `${iconifyUrl}${name}/`
21
+ }));
20
22
  ---
21
23
 
22
24
  <MainLayout>
23
- <h1>Icons</h1>
24
- <p>Astro Icon is a straightforward icon system for the Astro framework.</p>
25
-
26
- <a href="https://www.astroicon.dev/">https://www.astroicon.dev/</a>
27
-
28
- <pre class="mt-6 astro-code bg-slate-800 text-white">import &#123; Icon &#125; from 'astro-icon/components';</pre>
29
- <div class="">
30
- {Object.keys(ICONS).map((key) => (
31
- <h2 class="mt-6 mx-2">
32
- <a href={`${iconifyUrl}${key}/`} target="_blank">
33
- {key}
34
- </a>
35
- </h2>
36
- <div class="inline-grid grid-cols-2 md:grid-cols-4 gap-0 w-full">
37
- {ICONS[key].map((value) => (
38
- <div class="mx-1 mb-2">
39
- <div class="component-preview ">
40
- <Icon name={`${key}:${value}`} class="text-3xl mx-auto text-light-blue-400" />
41
- </div>
42
- <pre class="astro-code bg-slate-800 text-white text-sm text-center">&lt;Icon name={`"${key}:${value}"`} /&gt;</pre>
43
- </div>
44
- ))}
45
- </div>
46
- ))}
47
- </div>
48
- </MainLayout>
25
+ <div class="max-w-7xl mx-auto px-4 py-8">
26
+ <h1 class="text-2xl font-bold mb-4">Icons</h1>
27
+ <p class="mb-4">Astro Icon is a straightforward icon system for the Astro framework.</p>
28
+
29
+ <a href="https://www.astroicon.dev/"
30
+ class="text-blue-600 hover:text-blue-800 underline"
31
+ target="_blank"
32
+ rel="noopener noreferrer">
33
+ https://www.astroicon.dev/
34
+ </a>
35
+
36
+ <pre class="mt-6 p-4 rounded bg-slate-800 text-white overflow-x-auto">
37
+ import &#123; Icon &#125; from 'astro-icon/components';
38
+ </pre>
39
+
40
+ <div class="mt-8 space-y-12">
41
+ {sortedIconCollections.map(({ name, icons, url }) => (
42
+ <div>
43
+ <h2 class="text-xl font-semibold mb-4">
44
+ <a href={url}
45
+ class="text-blue-600 hover:text-blue-800 inline-flex items-center gap-2"
46
+ target="_blank"
47
+ rel="noopener noreferrer">
48
+ {name}
49
+ <span class="text-sm text-gray-500">({icons.length} icons)</span>
50
+ </a>
51
+ </h2>
52
+ <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-4">
53
+ {icons.map((iconName) => (
54
+ <div class="group relative p-4 border rounded-lg hover:shadow-md transition-shadow cursor-pointer icon-card"
55
+ data-icon-name={`${name}:${iconName}`}>
56
+ <div class="flex flex-col items-center">
57
+ <div class="p-4 bg-gray-50 rounded-lg mb-2 w-full flex justify-center items-center min-h-[64px]">
58
+ <Icon
59
+ name={`${name}:${iconName}`}
60
+ class="text-3xl text-blue-600"
61
+ />
62
+ </div>
63
+ <code class="text-sm text-gray-600 text-center break-all">
64
+ {name}:{iconName}
65
+ </code>
66
+ </div>
67
+ <div class="tooltip opacity-0 invisible absolute left-1/2 -translate-x-1/2 -top-10 bg-gray-800 text-white px-3 py-1.5 rounded text-sm whitespace-nowrap transition-all z-10">
68
+ Copied!
69
+ </div>
70
+ </div>
71
+ ))}
72
+ </div>
73
+ </div>
74
+ ))}
75
+ </div>
76
+
77
+ <div class="fixed bottom-4 right-4 bg-gray-800 text-white px-4 py-2 rounded-lg opacity-0 invisible transition-all duration-300" id="globalNotification">
78
+ Icon code copied to clipboard!
79
+ </div>
80
+ </div>
81
+
82
+ <script>
83
+ document.addEventListener('astro:page-load', () => {
84
+ const cards = document.querySelectorAll('.icon-card');
85
+ const globalNotification = document.getElementById('globalNotification');
86
+
87
+ cards.forEach(card => {
88
+ card.addEventListener('click', async () => {
89
+ const iconName = card.getAttribute('data-icon-name');
90
+ if (!iconName) return;
91
+
92
+ try {
93
+ await navigator.clipboard.writeText(`<Icon name="${iconName}" />`);
94
+
95
+ // Show tooltip
96
+ const tooltip = card.querySelector('.tooltip');
97
+ if (tooltip) {
98
+ tooltip.classList.remove('opacity-0', 'invisible');
99
+ tooltip.classList.add('opacity-100', 'visible');
100
+
101
+ // Hide tooltip after 2 seconds
102
+ setTimeout(() => {
103
+ tooltip.classList.add('opacity-0', 'invisible');
104
+ tooltip.classList.remove('opacity-100', 'visible');
105
+ }, 2000);
106
+ }
107
+
108
+ // Show global notification
109
+ if (globalNotification) {
110
+ globalNotification.classList.remove('opacity-0', 'invisible');
111
+ globalNotification.classList.add('opacity-100', 'visible');
112
+
113
+ setTimeout(() => {
114
+ globalNotification.classList.add('opacity-0', 'invisible');
115
+ globalNotification.classList.remove('opacity-100', 'visible');
116
+ }, 2000);
117
+ }
118
+ } catch (err) {
119
+ console.error('Failed to copy:', err);
120
+ }
121
+ });
122
+ });
123
+ });
124
+ </script>
125
+
126
+ <style>
127
+ .tooltip {
128
+ transition: all 0.2s ease-in-out;
129
+ }
130
+
131
+ #globalNotification {
132
+ transition: all 0.3s ease-in-out;
133
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
134
+ }
135
+ </style>
136
+ </MainLayout>
@@ -21,12 +21,12 @@ import MainInput from '../../components/MainInput.vue'
21
21
  <div class="bg-white grid items-end w-full gap-6 md:grid-cols-3 px-4 py-6">
22
22
  <div class="relative">
23
23
  <input type="text" id="floating_filled" class="block rounded-t-lg px-2.5 pb-2.5 pt-5 w-full text-sm text-gray-900 bg-gray-50 dark:bg-gray-700 border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" placeholder=" " />
24
- <label for="floating_filled" class="absolute text-sm text-gray-500 dark:text-gray-400 duration-300 transform -translate-y-4 scale-75 top-4 z-10 origin-[0] start-2.5 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-4 rtl:peer-focus:translate-x-1/4 rtl:peer-focus:left-auto">Floating filled</label>
24
+ <label for="floating_filled" class="absolute text-sm text-slate-medium dark:text-gray-400 duration-300 transform -translate-y-4 scale-75 top-4 z-10 origin-[0] start-2.5 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-4 rtl:peer-focus:translate-x-1/4 rtl:peer-focus:left-auto">Floating filled</label>
25
25
  </div>
26
26
 
27
27
  <div class="relative z-0">
28
28
  <input type="text" id="floating_standard" class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" placeholder=" " />
29
- <label for="floating_standard" class="absolute text-sm text-gray-500 dark:text-gray-400 duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:start-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6 rtl:peer-focus:translate-x-1/4 rtl:peer-focus:left-auto">Floating standard</label>
29
+ <label for="floating_standard" class="absolute text-sm text-slate-medium dark:text-gray-400 duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:start-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6 rtl:peer-focus:translate-x-1/4 rtl:peer-focus:left-auto">Floating standard</label>
30
30
  </div>
31
31
  </div>
32
32
 
@@ -36,11 +36,11 @@ import MainInput from '../../components/MainInput.vue'
36
36
  ```js
37
37
  <div class="relative">
38
38
  <input type="text" id="floating_filled" class="block rounded-t-lg px-2.5 pb-2.5 pt-5 w-full text-sm text-gray-900 bg-gray-50 dark:bg-gray-700 border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" placeholder=" " />
39
- <label for="floating_filled" class="absolute text-sm text-gray-500 dark:text-gray-400 duration-300 transform -translate-y-4 scale-75 top-4 z-10 origin-[0] start-2.5 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-4 rtl:peer-focus:translate-x-1/4 rtl:peer-focus:left-auto">Floating filled</label>
39
+ <label for="floating_filled" class="absolute text-sm text-slate-medium dark:text-gray-400 duration-300 transform -translate-y-4 scale-75 top-4 z-10 origin-[0] start-2.5 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-4 rtl:peer-focus:translate-x-1/4 rtl:peer-focus:left-auto">Floating filled</label>
40
40
  </div>
41
41
 
42
42
  <div class="relative z-0">
43
43
  <input type="text" id="floating_standard" class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" placeholder=" " />
44
- <label for="floating_standard" class="absolute text-sm text-gray-500 dark:text-gray-400 duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:start-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6 rtl:peer-focus:translate-x-1/4 rtl:peer-focus:left-auto">Floating standard</label>
44
+ <label for="floating_standard" class="absolute text-sm text-slate-medium dark:text-gray-400 duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:start-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6 rtl:peer-focus:translate-x-1/4 rtl:peer-focus:left-auto">Floating standard</label>
45
45
  </div>
46
46
  ```
@@ -5,7 +5,7 @@ $gray-100: #F3F4F6;
5
5
  $gray-200: #E5E7EB;
6
6
  $gray-300: #B5BBC5;
7
7
  $gray-400: #9CA3AF;
8
- $gray-500: #64748B!default;
8
+ $slate-medium: #64748B!default;
9
9
  $gray-600: #6c757d !default;
10
10
  $gray-700: #495057 !default;
11
11
  $gray-800: #343a40 !default;
@@ -32,7 +32,7 @@ $grays: map.merge(
32
32
  "200": $gray-200,
33
33
  "300": $gray-300,
34
34
  "400": $gray-400,
35
- "500": $gray-500,
35
+ "500": $slate-medium,
36
36
  "600": $gray-600,
37
37
  "700": $gray-700,
38
38
  "800": $gray-800,
@@ -43,7 +43,7 @@
43
43
  }
44
44
 
45
45
  .component-preview {
46
- @apply bg-blue-600 bg-opacity-5 px-4 py-4 mx-0 flex items-center overflow-x-auto sm:(p-8);
46
+ @apply bg-blue-medium bg-opacity-5 px-4 py-4 mx-0 flex items-center overflow-x-auto sm:(p-8);
47
47
  gap: 1rem;
48
48
  border-radius: 0.33rem;
49
49
  border: 1px solid theme("colors.slate.200");
@@ -0,0 +1,59 @@
1
+ // uno-config/index.ts
2
+ import type { UserConfig, UserShortcuts } from 'unocss'
3
+ import { defineConfig } from 'unocss';
4
+ import {
5
+ transformerDirectives,
6
+ transformerVariantGroup,
7
+ presetAttributify,
8
+ presetIcons,
9
+ presetTypography,
10
+ presetUno,
11
+ presetWebFonts,
12
+ } from 'unocss';
13
+
14
+ import { shortcuts } from './theme/shortcuts';
15
+ import { theme } from './theme';
16
+
17
+ interface CustomConfig extends Partial<UserConfig> {
18
+ shortcuts?: UserShortcuts;
19
+ theme?: Partial<typeof theme>;
20
+ }
21
+
22
+ export function createSdsConfig(customConfig: CustomConfig = {}) {
23
+ return defineConfig({
24
+ transformers: [
25
+ transformerDirectives(),
26
+ transformerVariantGroup(),
27
+ ],
28
+ shortcuts: {
29
+ ...shortcuts,
30
+ ...(customConfig.shortcuts || {})
31
+ },
32
+ theme: {
33
+ ...theme,
34
+ ...(customConfig.theme || {})
35
+ },
36
+ presets: [
37
+ presetUno(),
38
+ presetAttributify(),
39
+ presetIcons({
40
+ scale: 1.2,
41
+ warn: true,
42
+ prefix: 'i-',
43
+ extraProperties: {
44
+ 'display': 'inline-block',
45
+ 'vertical-align': 'middle',
46
+ },
47
+ }),
48
+ presetTypography(),
49
+ presetWebFonts({
50
+ provider: 'none',
51
+ fonts: theme.fontFamily
52
+ })
53
+ ],
54
+ ...customConfig
55
+ });
56
+ }
57
+
58
+ export * from './theme';
59
+ export * from './theme/shortcuts';
@@ -0,0 +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',
10
+ };
@@ -0,0 +1,67 @@
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
+ lightest: '#00b0f0',
24
+ light: '#0099da',
25
+ default: '#0087c1', // Default accent
26
+ dark: '#006ea6',
27
+ darker: '#00437a',
28
+ deepBlue: '#0c1a32',
29
+ },
30
+
31
+ // Neutral colors - grayscale
32
+ neutral: {
33
+ lightest: '#f3f4f6', // Lightest gray
34
+ lighter: '#e5e7eb',
35
+ light: '#b5bbc5',
36
+ default: '#9ca3af', // Base gray
37
+ dark: '#6a767d',
38
+ darker: '#4b5563',
39
+ black: '#000000', // Pure black
40
+ },
41
+
42
+ // Slate colors - gray-blue palette
43
+ slate: {
44
+ light: '#64748B',
45
+ default: '#475569',
46
+ dark: '#334155',
47
+ darkest: '#1e293b',
48
+ },
49
+
50
+ // System colors - functional colors
51
+ system: {
52
+ success: '#10B981', // Green - success state
53
+ warning: '#FBBF24', // Yellow - warning state
54
+ error: '#EF4444', // Red - error state
55
+ info: '#3B82F6', // Blue - information state
56
+ },
57
+
58
+ // States - interaction states
59
+ state: {
60
+ overlay: 'rgb(0 0 0 / 0.06)', // Overlay & Hover state
61
+ disabled: 'rgb(0 0 0 / 0.12)', // Disabled state
62
+ }
63
+ };
64
+
65
+ // Export types for TypeScript
66
+ export type Colors = typeof colors;
67
+ export type ColorShade = keyof typeof colors;
@@ -0,0 +1,18 @@
1
+ // theme/dimensions.ts
2
+ export const dimensions = {
3
+ height: {
4
+ 'tile': '104px',
5
+ 'tile-mobile': '78px',
6
+ 'sidebar': 'calc(100vh - 5.125rem)',
7
+ 'full-mobile': 'calc(var(--vh, 1vh) * 100)',
8
+ 'icon': '46px',
9
+ },
10
+ maxHeight: {
11
+ 'icon': '46px',
12
+ 'sidebar': 'calc(100vh - 5.125rem)',
13
+ },
14
+ minHeight: {
15
+ 'tile': '104px',
16
+ 'tile-mobile': '78px',
17
+ }
18
+ };
@@ -0,0 +1,15 @@
1
+ // theme/effects.ts
2
+ export const effects = {
3
+ filter: {
4
+ blur: 'blur(5px)',
5
+ },
6
+ backgroundSize: {
7
+ full: '100% 100%',
8
+ },
9
+ aspectRatio: {
10
+ '4/3': '4 / 3',
11
+ },
12
+ cursor: {
13
+ 'zoom-in': 'zoom-in',
14
+ },
15
+ };
@@ -0,0 +1,11 @@
1
+ // theme/grid.ts
2
+ export const gridTemplates = {
3
+ columns: {
4
+ 16: 'repeat(16, minmax(0, 1fr))',
5
+ product: '15rem 20rem minmax(15rem, 1fr)',
6
+ productGrid: '15rem minmax(20rem, 1fr)',
7
+ productGalleryDesktop: 'calc(100% - 14% - 0.9375rem) 14%',
8
+ replacement: '6.25rem 12rem auto',
9
+ 'details-desktop': '12.5rem calc(100% - 12.5rem - 1rem)'
10
+ }
11
+ };