@mich8060/chg-design-system 0.1.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 (260) hide show
  1. package/.github/workflows/figma-sync.yml +30 -0
  2. package/ARCHITECTURE_FIX.md +241 -0
  3. package/LICENSE +21 -0
  4. package/README.lib.md +103 -0
  5. package/README.md +177 -0
  6. package/figma.config.json +9 -0
  7. package/package.json +67 -0
  8. package/package.lib.json +49 -0
  9. package/public/data/figma-variables.json +40026 -0
  10. package/public/favicon.ico +0 -0
  11. package/public/index.html +46 -0
  12. package/public/logo192.png +0 -0
  13. package/public/logo512.png +0 -0
  14. package/public/manifest.json +25 -0
  15. package/public/robots.txt +3 -0
  16. package/public/styles/tokens.css +1994 -0
  17. package/scripts/index.js +896 -0
  18. package/scripts/publish-lib.js +150 -0
  19. package/scripts/validate.js +94 -0
  20. package/src/App.css +457 -0
  21. package/src/App.css.map +1 -0
  22. package/src/App.js +161 -0
  23. package/src/App.scss +548 -0
  24. package/src/App.test.js +8 -0
  25. package/src/assets/images/.gitkeep +0 -0
  26. package/src/assets/images/doctors/Avatar-1.png +0 -0
  27. package/src/assets/images/doctors/Avatar-10.png +0 -0
  28. package/src/assets/images/doctors/Avatar-11.png +0 -0
  29. package/src/assets/images/doctors/Avatar-12.png +0 -0
  30. package/src/assets/images/doctors/Avatar-13.png +0 -0
  31. package/src/assets/images/doctors/Avatar-14.png +0 -0
  32. package/src/assets/images/doctors/Avatar-15.png +0 -0
  33. package/src/assets/images/doctors/Avatar-16.png +0 -0
  34. package/src/assets/images/doctors/Avatar-17.png +0 -0
  35. package/src/assets/images/doctors/Avatar-18.png +0 -0
  36. package/src/assets/images/doctors/Avatar-19.png +0 -0
  37. package/src/assets/images/doctors/Avatar-2.png +0 -0
  38. package/src/assets/images/doctors/Avatar-20.png +0 -0
  39. package/src/assets/images/doctors/Avatar-21.png +0 -0
  40. package/src/assets/images/doctors/Avatar-3.png +0 -0
  41. package/src/assets/images/doctors/Avatar-4.png +0 -0
  42. package/src/assets/images/doctors/Avatar-5.png +0 -0
  43. package/src/assets/images/doctors/Avatar-6.png +0 -0
  44. package/src/assets/images/doctors/Avatar-7.png +0 -0
  45. package/src/assets/images/doctors/Avatar-8.png +0 -0
  46. package/src/assets/images/doctors/Avatar-9.png +0 -0
  47. package/src/assets/images/doctors/Avatar.png +0 -0
  48. package/src/assets/images/doctors/index.js +141 -0
  49. package/src/data/figma-variables.json +90305 -0
  50. package/src/index.js +20 -0
  51. package/src/index.scss +10 -0
  52. package/src/pages/AccordionDemo.jsx +206 -0
  53. package/src/pages/AccordionDemo.scss +34 -0
  54. package/src/pages/ActionMenuDemo.jsx +957 -0
  55. package/src/pages/ActionMenuDemo.scss +34 -0
  56. package/src/pages/AvatarDemo.jsx +328 -0
  57. package/src/pages/AvatarDemo.scss +40 -0
  58. package/src/pages/BadgeDemo.jsx +254 -0
  59. package/src/pages/BadgeDemo.scss +40 -0
  60. package/src/pages/BorderRadiusDemo.jsx +112 -0
  61. package/src/pages/BorderRadiusDemo.scss +50 -0
  62. package/src/pages/BrandingDemo.jsx +117 -0
  63. package/src/pages/BreadcrumbDemo.jsx +172 -0
  64. package/src/pages/ButtonDemo.jsx +708 -0
  65. package/src/pages/ButtonDemo.scss +34 -0
  66. package/src/pages/CheckboxDemo.jsx +194 -0
  67. package/src/pages/ChipDemo.jsx +359 -0
  68. package/src/pages/ChipDemo.scss +40 -0
  69. package/src/pages/ColorsDemo.jsx +566 -0
  70. package/src/pages/ColorsDemo.scss +243 -0
  71. package/src/pages/ComponentsUsage.jsx +401 -0
  72. package/src/pages/DatepickerDemo.jsx +223 -0
  73. package/src/pages/DividerDemo.jsx +337 -0
  74. package/src/pages/DotStatusDemo.jsx +223 -0
  75. package/src/pages/DropdownDemo.jsx +229 -0
  76. package/src/pages/FieldDemo.jsx +253 -0
  77. package/src/pages/FigmaVariablesDemo.jsx +426 -0
  78. package/src/pages/FigmaVariablesDemo.scss +316 -0
  79. package/src/pages/FileUploadDemo.jsx +186 -0
  80. package/src/pages/FlexDemo.jsx +144 -0
  81. package/src/pages/FlexDemo.scss +119 -0
  82. package/src/pages/FontInstallation.jsx +252 -0
  83. package/src/pages/FontInstallation.scss +40 -0
  84. package/src/pages/Home.jsx +3156 -0
  85. package/src/pages/IconDemo.jsx +1680 -0
  86. package/src/pages/ImageAspectDemo.jsx +152 -0
  87. package/src/pages/InputDemo.jsx +245 -0
  88. package/src/pages/Installation.jsx +257 -0
  89. package/src/pages/Installation.scss +40 -0
  90. package/src/pages/KeyDemo.jsx +184 -0
  91. package/src/pages/MenuDemo.jsx +139 -0
  92. package/src/pages/MicroCalendarDemo.jsx +165 -0
  93. package/src/pages/PaginationDemo.jsx +176 -0
  94. package/src/pages/PillToggleDemo.jsx +212 -0
  95. package/src/pages/ProgressCircleDemo.jsx +206 -0
  96. package/src/pages/ProgressIndicatorDemo.jsx +227 -0
  97. package/src/pages/RadioDemo.jsx +282 -0
  98. package/src/pages/ShadowsDemo.jsx +118 -0
  99. package/src/pages/ShadowsDemo.scss +93 -0
  100. package/src/pages/SliderDemo.jsx +226 -0
  101. package/src/pages/SpacingDemo.jsx +160 -0
  102. package/src/pages/SpacingDemo.scss +107 -0
  103. package/src/pages/StatusDemo.jsx +196 -0
  104. package/src/pages/StepsDemo.jsx +308 -0
  105. package/src/pages/TableDemo.jsx +376 -0
  106. package/src/pages/TabsDemo.jsx +221 -0
  107. package/src/pages/ToastDemo.jsx +195 -0
  108. package/src/pages/ToggleDemo.jsx +187 -0
  109. package/src/pages/TokensDemo.jsx +637 -0
  110. package/src/pages/TokensDemo.scss +270 -0
  111. package/src/pages/TokensUsage.jsx +220 -0
  112. package/src/pages/TooltipDemo.jsx +170 -0
  113. package/src/pages/TypographyDemo.jsx +229 -0
  114. package/src/pages/TypographyDemo.scss +105 -0
  115. package/src/pages/UtilitiesDemo.jsx +381 -0
  116. package/src/pages/UtilitiesDemo.scss +214 -0
  117. package/src/reportWebVitals.js +13 -0
  118. package/src/setupTests.js +5 -0
  119. package/src/styles/_typography.scss +932 -0
  120. package/src/styles/_utilities.scss +3635 -0
  121. package/src/styles/_variables.scss +887 -0
  122. package/src/styles/prism-custom.css +206 -0
  123. package/src/styles/prism-custom.css.map +1 -0
  124. package/src/styles/prism-custom.scss +205 -0
  125. package/src/styles/tokens.css +4416 -0
  126. package/src/styles/tokens.css.map +1 -0
  127. package/src/styles/tokens.scss +1456 -0
  128. package/src/ui/Accordion/Accordion.jsx +70 -0
  129. package/src/ui/Accordion/Accordion.scss +82 -0
  130. package/src/ui/Accordion/index.js +1 -0
  131. package/src/ui/ActionMenu/ActionMenu.jsx +383 -0
  132. package/src/ui/ActionMenu/ActionMenu.scss +198 -0
  133. package/src/ui/ActionMenu/index.js +1 -0
  134. package/src/ui/Avatar/Avatar.jsx +49 -0
  135. package/src/ui/Avatar/Avatar.scss +82 -0
  136. package/src/ui/Avatar/index.js +1 -0
  137. package/src/ui/Badge/Badge.jsx +64 -0
  138. package/src/ui/Badge/Badge.scss +84 -0
  139. package/src/ui/Badge/index.js +1 -0
  140. package/src/ui/Branding/Branding.jsx +65 -0
  141. package/src/ui/Branding/Branding.scss +116 -0
  142. package/src/ui/Branding/index.js +1 -0
  143. package/src/ui/Breadcrumb/Breadcrumb.jsx +162 -0
  144. package/src/ui/Breadcrumb/Breadcrumb.scss +46 -0
  145. package/src/ui/Breadcrumb/index.js +2 -0
  146. package/src/ui/Button/Button.figma.tsx +49 -0
  147. package/src/ui/Button/Button.jsx +135 -0
  148. package/src/ui/Button/Button.scss +188 -0
  149. package/src/ui/Button/index.js +1 -0
  150. package/src/ui/Card/Card.jsx +25 -0
  151. package/src/ui/Card/Card.scss +47 -0
  152. package/src/ui/Card/index.js +1 -0
  153. package/src/ui/Checkbox/Checkbox.jsx +70 -0
  154. package/src/ui/Checkbox/Checkbox.scss +96 -0
  155. package/src/ui/Checkbox/index.js +1 -0
  156. package/src/ui/Chip/Chip.jsx +104 -0
  157. package/src/ui/Chip/Chip.scss +118 -0
  158. package/src/ui/Chip/index.js +1 -0
  159. package/src/ui/CopyButton/CopyButton.jsx +102 -0
  160. package/src/ui/CopyButton/CopyButton.scss +56 -0
  161. package/src/ui/CopyButton/index.js +1 -0
  162. package/src/ui/Datepicker/Datepicker.jsx +326 -0
  163. package/src/ui/Datepicker/Datepicker.scss +187 -0
  164. package/src/ui/Datepicker/index.js +2 -0
  165. package/src/ui/Divider/Divider.jsx +89 -0
  166. package/src/ui/Divider/Divider.scss +112 -0
  167. package/src/ui/Divider/index.js +1 -0
  168. package/src/ui/DotStatus/DotStatus.jsx +64 -0
  169. package/src/ui/DotStatus/DotStatus.scss +87 -0
  170. package/src/ui/DotStatus/index.js +1 -0
  171. package/src/ui/Dropdown/Dropdown.jsx +200 -0
  172. package/src/ui/Dropdown/Dropdown.scss +156 -0
  173. package/src/ui/Dropdown/index.js +1 -0
  174. package/src/ui/Field/Field.jsx +89 -0
  175. package/src/ui/Field/Field.scss +119 -0
  176. package/src/ui/Field/index.js +1 -0
  177. package/src/ui/FileUpload/FileUpload.figma.tsx +28 -0
  178. package/src/ui/FileUpload/FileUpload.jsx +153 -0
  179. package/src/ui/FileUpload/FileUpload.scss +78 -0
  180. package/src/ui/FileUpload/index.js +2 -0
  181. package/src/ui/Flex/Flex.jsx +42 -0
  182. package/src/ui/Flex/Flex.scss +119 -0
  183. package/src/ui/Flex/index.js +1 -0
  184. package/src/ui/Icon/Icon.figma.tsx +22 -0
  185. package/src/ui/Icon/Icon.jsx +47 -0
  186. package/src/ui/Icon/index.js +1 -0
  187. package/src/ui/ImageAspect/ImageAspect.jsx +56 -0
  188. package/src/ui/ImageAspect/ImageAspect.scss +62 -0
  189. package/src/ui/ImageAspect/index.js +1 -0
  190. package/src/ui/Input/Input.figma.tsx +35 -0
  191. package/src/ui/Input/Input.jsx +68 -0
  192. package/src/ui/Input/Input.scss +64 -0
  193. package/src/ui/Input/index.js +2 -0
  194. package/src/ui/Key/Key.jsx +37 -0
  195. package/src/ui/Key/Key.scss +34 -0
  196. package/src/ui/Key/index.js +1 -0
  197. package/src/ui/Menu/Menu.jsx +389 -0
  198. package/src/ui/Menu/Menu.scss +382 -0
  199. package/src/ui/Menu/index.js +1 -0
  200. package/src/ui/MicroCalendar/MicroCalendar.jsx +392 -0
  201. package/src/ui/MicroCalendar/MicroCalendar.scss +277 -0
  202. package/src/ui/MicroCalendar/index.js +1 -0
  203. package/src/ui/Pagination/Pagination.jsx +237 -0
  204. package/src/ui/Pagination/Pagination.scss +182 -0
  205. package/src/ui/Pagination/index.js +1 -0
  206. package/src/ui/PillToggle/PillToggle.jsx +56 -0
  207. package/src/ui/PillToggle/PillToggle.scss +84 -0
  208. package/src/ui/PillToggle/index.js +1 -0
  209. package/src/ui/Playground/Playground.jsx +524 -0
  210. package/src/ui/Playground/Playground.scss +310 -0
  211. package/src/ui/Playground/index.js +2 -0
  212. package/src/ui/ProgressCircle/ProgressCircle.jsx +147 -0
  213. package/src/ui/ProgressCircle/ProgressCircle.scss +143 -0
  214. package/src/ui/ProgressCircle/index.js +1 -0
  215. package/src/ui/ProgressIndicator/ProgressIndicator.jsx +92 -0
  216. package/src/ui/ProgressIndicator/ProgressIndicator.scss +133 -0
  217. package/src/ui/ProgressIndicator/index.js +1 -0
  218. package/src/ui/Radio/Radio.jsx +57 -0
  219. package/src/ui/Radio/Radio.scss +84 -0
  220. package/src/ui/Radio/index.js +1 -0
  221. package/src/ui/Slider/Slider.jsx +283 -0
  222. package/src/ui/Slider/Slider.scss +156 -0
  223. package/src/ui/Slider/index.js +1 -0
  224. package/src/ui/Status/Status.jsx +66 -0
  225. package/src/ui/Status/Status.scss +90 -0
  226. package/src/ui/Status/index.js +1 -0
  227. package/src/ui/Steps/Steps.jsx +201 -0
  228. package/src/ui/Steps/Steps.scss +240 -0
  229. package/src/ui/Steps/index.js +1 -0
  230. package/src/ui/Table/Table.jsx +143 -0
  231. package/src/ui/Table/Table.scss +90 -0
  232. package/src/ui/Table/index.js +1 -0
  233. package/src/ui/Tabs/TabItem.jsx +86 -0
  234. package/src/ui/Tabs/Tabs.figma.tsx +30 -0
  235. package/src/ui/Tabs/Tabs.jsx +318 -0
  236. package/src/ui/Tabs/Tabs.scss +164 -0
  237. package/src/ui/Tabs/Untitled +1 -0
  238. package/src/ui/Tabs/index.js +3 -0
  239. package/src/ui/Tag/Tag.figma.tsx +29 -0
  240. package/src/ui/Tag/Tag.jsx +93 -0
  241. package/src/ui/Tag/Tag.scss +229 -0
  242. package/src/ui/Tag/index.js +2 -0
  243. package/src/ui/Textarea/Textarea.figma.tsx +35 -0
  244. package/src/ui/Textarea/Textarea.jsx +68 -0
  245. package/src/ui/Textarea/Textarea.scss +69 -0
  246. package/src/ui/Textarea/index.js +2 -0
  247. package/src/ui/Toast/Toast.jsx +75 -0
  248. package/src/ui/Toast/Toast.scss +132 -0
  249. package/src/ui/Toast/index.js +2 -0
  250. package/src/ui/Toggle/Toggle.jsx +73 -0
  251. package/src/ui/Toggle/Toggle.scss +139 -0
  252. package/src/ui/Toggle/index.js +1 -0
  253. package/src/ui/Tooltip/Tooltip.figma.tsx +24 -0
  254. package/src/ui/Tooltip/Tooltip.jsx +123 -0
  255. package/src/ui/Tooltip/Tooltip.scss +80 -0
  256. package/src/ui/Tooltip/index.js +2 -0
  257. package/src/ui/index.js +63 -0
  258. package/src/utils/formatDate.js +27 -0
  259. package/src/utils/headerVariants.js +69 -0
  260. package/vite.config.lib.js +55 -0
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Publish Script for UDS Component Library
5
+ *
6
+ * Usage:
7
+ * npm run publish:lib # Build and prepare for publishing
8
+ * npm run publish:lib -- --npm # Build and publish to npm
9
+ */
10
+
11
+ const { execSync } = require("child_process");
12
+ const fs = require("fs");
13
+ const path = require("path");
14
+
15
+ const ROOT_DIR = path.join(__dirname, "..");
16
+ const DIST_DIR = path.join(ROOT_DIR, "dist");
17
+
18
+ // ANSI colors for terminal output
19
+ const colors = {
20
+ reset: "\x1b[0m",
21
+ green: "\x1b[32m",
22
+ yellow: "\x1b[33m",
23
+ blue: "\x1b[34m",
24
+ red: "\x1b[31m",
25
+ };
26
+
27
+ function log(message, color = "reset") {
28
+ console.log(`${colors[color]}${message}${colors.reset}`);
29
+ }
30
+
31
+ function run(command, options = {}) {
32
+ log(`\n> ${command}`, "blue");
33
+ try {
34
+ execSync(command, {
35
+ stdio: "inherit",
36
+ cwd: ROOT_DIR,
37
+ ...options
38
+ });
39
+ } catch (error) {
40
+ log(`Command failed: ${command}`, "red");
41
+ process.exit(1);
42
+ }
43
+ }
44
+
45
+ function copyFile(src, dest) {
46
+ const srcPath = path.join(ROOT_DIR, src);
47
+ const destPath = path.join(DIST_DIR, dest);
48
+
49
+ if (fs.existsSync(srcPath)) {
50
+ fs.copyFileSync(srcPath, destPath);
51
+ log(` ✓ Copied ${src} → dist/${dest}`, "green");
52
+ } else {
53
+ log(` ⚠ Warning: ${src} not found`, "yellow");
54
+ }
55
+ }
56
+
57
+ function cleanDist() {
58
+ // Remove files that shouldn't be in the npm package
59
+ const filesToRemove = [
60
+ "index.html",
61
+ "favicon.ico",
62
+ "logo192.png",
63
+ "logo512.png",
64
+ "manifest.json",
65
+ "robots.txt",
66
+ "asset-manifest.json",
67
+ ];
68
+
69
+ const dirsToRemove = ["data", "static", "styles"];
70
+
71
+ filesToRemove.forEach((file) => {
72
+ const filePath = path.join(DIST_DIR, file);
73
+ if (fs.existsSync(filePath)) {
74
+ fs.unlinkSync(filePath);
75
+ log(` ✓ Removed ${file}`, "yellow");
76
+ }
77
+ });
78
+
79
+ dirsToRemove.forEach((dir) => {
80
+ const dirPath = path.join(DIST_DIR, dir);
81
+ if (fs.existsSync(dirPath)) {
82
+ fs.rmSync(dirPath, { recursive: true });
83
+ log(` ✓ Removed ${dir}/`, "yellow");
84
+ }
85
+ });
86
+ }
87
+
88
+ async function main() {
89
+ const args = process.argv.slice(2);
90
+ const shouldPublish = args.includes("--npm");
91
+ const dryRun = args.includes("--dry-run");
92
+
93
+ log("\n🏗️ UDS Component Library - Build & Publish", "green");
94
+ log("=" .repeat(50));
95
+
96
+ // Step 1: Build the library
97
+ log("\n📦 Step 1: Building library...", "blue");
98
+ run("npm run build:lib");
99
+
100
+ // Step 2: Clean dist folder
101
+ log("\n🧹 Step 2: Cleaning dist folder...", "blue");
102
+ cleanDist();
103
+
104
+ // Step 3: Copy package files
105
+ log("\n📋 Step 3: Copying package files...", "blue");
106
+ copyFile("package.lib.json", "package.json");
107
+ copyFile("README.lib.md", "README.md");
108
+ copyFile("LICENSE", "LICENSE");
109
+
110
+ // Step 4: Show what's in dist
111
+ log("\n📁 Step 4: Package contents:", "blue");
112
+ const distFiles = fs.readdirSync(DIST_DIR);
113
+ distFiles.forEach((file) => {
114
+ const filePath = path.join(DIST_DIR, file);
115
+ const stats = fs.statSync(filePath);
116
+ const size = stats.isDirectory()
117
+ ? "dir"
118
+ : `${(stats.size / 1024).toFixed(1)} KB`;
119
+ log(` - ${file} (${size})`);
120
+ });
121
+
122
+ // Step 5: Publish if requested
123
+ if (shouldPublish) {
124
+ log("\n🚀 Step 5: Publishing to npm...", "blue");
125
+
126
+ if (dryRun) {
127
+ run("npm publish --dry-run", { cwd: DIST_DIR });
128
+ } else {
129
+ log("\n⚠️ About to publish to npm!", "yellow");
130
+ log("Press Ctrl+C to cancel or wait 5 seconds to continue...", "yellow");
131
+
132
+ await new Promise((resolve) => setTimeout(resolve, 5000));
133
+ run("npm publish --access public", { cwd: DIST_DIR });
134
+ }
135
+ } else {
136
+ log("\n✅ Build complete!", "green");
137
+ log("\nTo publish to npm, run one of:", "blue");
138
+ log(" npm run publish:lib -- --npm # Publish to npm");
139
+ log(" npm run publish:lib -- --npm --dry-run # Test publish (no upload)");
140
+ log("\nOr manually:");
141
+ log(" cd dist && npm publish --access public");
142
+ }
143
+
144
+ log("\n");
145
+ }
146
+
147
+ main().catch((err) => {
148
+ log(`\n❌ Error: ${err.message}`, "red");
149
+ process.exit(1);
150
+ });
@@ -0,0 +1,94 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ const rootDir = path.resolve(__dirname, '..');
8
+ const stylesDir = path.join(rootDir, 'src', 'styles');
9
+
10
+ // Import the validation function from index.js
11
+ // Since we can't easily import from index.js, we'll duplicate the logic here
12
+ function validateVariables(variablesPath = '_variables.scss', tokensPath = 'tokens.scss') {
13
+ try {
14
+ if (!fs.existsSync(tokensPath)) {
15
+ console.error(`✗ ${tokensPath} not found`);
16
+ process.exit(1);
17
+ }
18
+
19
+ if (!fs.existsSync(variablesPath)) {
20
+ console.error(`✗ ${variablesPath} not found. Run 'npm run generate' first.`);
21
+ process.exit(1);
22
+ }
23
+
24
+ const tokensContent = fs.readFileSync(tokensPath, 'utf-8');
25
+ const variablesContent = fs.readFileSync(variablesPath, 'utf-8');
26
+
27
+ // Extract all variable references from tokens.scss (format: vars.$variable-name)
28
+ const variableRegex = /vars\.\$([a-zA-Z0-9-]+)/g;
29
+ const referencedVars = new Set();
30
+ const varLocations = new Map();
31
+ let match;
32
+
33
+ // Find all variable references with line numbers
34
+ while ((match = variableRegex.exec(tokensContent)) !== null) {
35
+ const varName = match[1];
36
+ referencedVars.add(varName);
37
+
38
+ // Find line number
39
+ const beforeMatch = tokensContent.substring(0, match.index);
40
+ const lineNumber = beforeMatch.split('\n').length;
41
+
42
+ if (!varLocations.has(varName)) {
43
+ varLocations.set(varName, []);
44
+ }
45
+ varLocations.get(varName).push(lineNumber);
46
+ }
47
+
48
+ // Extract all defined variables from _variables.scss (format: $variable-name:)
49
+ const definedVarRegex = /^\$([a-zA-Z0-9-]+):/gm;
50
+ const definedVars = new Set();
51
+ while ((match = definedVarRegex.exec(variablesContent)) !== null) {
52
+ definedVars.add(match[1]);
53
+ }
54
+
55
+ // Find missing variables
56
+ const missingVars = Array.from(referencedVars).filter(v => !definedVars.has(v));
57
+
58
+ if (missingVars.length > 0) {
59
+ console.error(`\n✗ VALIDATION FAILED: ${missingVars.length} variable(s) missing:`);
60
+ missingVars.forEach(v => {
61
+ const locations = varLocations.get(v);
62
+ const locationStr = locations.length === 1
63
+ ? `line ${locations[0]}`
64
+ : `lines ${locations.join(', ')}`;
65
+ console.error(` - $${v} (referenced at ${locationStr} in tokens.scss)`);
66
+ });
67
+
68
+ console.error('\n✗ SCSS compilation will fail with these missing variables!');
69
+ console.error('\nTo fix:');
70
+ console.error(' 1. Run "npm run tokens:generate" to pull latest from Figma');
71
+ console.error(' 2. Or manually add the missing variables to src/styles/_variables.scss');
72
+ console.error(' 3. Or update src/styles/tokens.scss to remove references to deleted variables\n');
73
+
74
+ process.exit(1);
75
+ } else {
76
+ console.log('✓ All variables validated successfully');
77
+ console.log(` - ${referencedVars.size} variables referenced in tokens.scss`);
78
+ console.log(` - ${definedVars.size} variables defined in _variables.scss`);
79
+ return true;
80
+ }
81
+ } catch (error) {
82
+ console.error(`✗ Validation error: ${error.message}`);
83
+ process.exit(1);
84
+ }
85
+ }
86
+
87
+ // Run validation (paths to src/styles/ directory)
88
+ const variablesPath = process.argv[2] || path.join(stylesDir, '_variables.scss');
89
+ const tokensPath = process.argv[3] || path.join(stylesDir, 'tokens.scss');
90
+
91
+ console.log('Validating variables...\n');
92
+ console.log(` Variables: ${variablesPath}`);
93
+ console.log(` Tokens: ${tokensPath}\n`);
94
+ validateVariables(variablesPath, tokensPath);
package/src/App.css ADDED
@@ -0,0 +1,457 @@
1
+ @charset "UTF-8";
2
+ * {
3
+ box-sizing: border-box;
4
+ }
5
+
6
+ .app {
7
+ background: var(--uds-surface-primary);
8
+ display: flex;
9
+ flex-direction: row;
10
+ }
11
+ .app__sidebar {
12
+ height: 100vh;
13
+ width: 300px;
14
+ background: var(--uds-surface-secondary);
15
+ border-right: var(--uds-border-width-1) solid var(--uds-border-primary);
16
+ transition: width var(--uds-duration-200) var(--uds-ease-standard);
17
+ }
18
+ .app__content {
19
+ flex: 1;
20
+ display: flex;
21
+ flex-direction: column;
22
+ }
23
+
24
+ .page {
25
+ display: flex;
26
+ flex-direction: column;
27
+ gap: var(--uds-gap-24);
28
+ position: relative;
29
+ background: var(--uds-surface-secondary);
30
+ min-height: 100vh;
31
+ }
32
+ .page__content {
33
+ flex: 1;
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: var(--uds-gap-48);
37
+ padding: var(--uds-padding-48);
38
+ background: var(--uds-surface-secondary);
39
+ max-width: 1280px;
40
+ width: 100%;
41
+ margin: 0;
42
+ }
43
+ .page__header {
44
+ background: var(--uds-surface-secondary);
45
+ padding: 80px var(--uds-padding-48);
46
+ border-bottom: var(--uds-border-width-1) solid var(--uds-border-primary);
47
+ color: var(--uds-text-inverse);
48
+ position: relative;
49
+ overflow: hidden;
50
+ }
51
+ .page__header-container {
52
+ max-width: 1184px;
53
+ width: 100%;
54
+ margin: 0;
55
+ display: flex;
56
+ flex-direction: column;
57
+ gap: var(--uds-gap-16);
58
+ }
59
+ .page__header-shapes {
60
+ position: absolute;
61
+ top: 0;
62
+ left: 0;
63
+ right: 0;
64
+ bottom: 0;
65
+ pointer-events: none;
66
+ z-index: 0;
67
+ }
68
+ .page__header-shape {
69
+ position: absolute;
70
+ opacity: 0.6;
71
+ transition: opacity var(--uds-duration-200) var(--uds-ease-standard);
72
+ }
73
+ .page__header-shape--circle {
74
+ border-radius: 50%;
75
+ }
76
+ .page__header-shape--triangle {
77
+ transform-origin: left center;
78
+ }
79
+ .page__header-shape--line {
80
+ transform-origin: left center;
81
+ }
82
+ .page__header-title {
83
+ font-size: var(--uds-font-size-48);
84
+ line-height: var(--uds-line-48);
85
+ font-family: var(--uds-font-family);
86
+ font-weight: var(--uds-font-weight-bold);
87
+ letter-spacing: -0.02em;
88
+ text-transform: uppercase;
89
+ margin: 0;
90
+ color: var(--uds-text-inverse);
91
+ letter-spacing: -0.96px;
92
+ text-transform: capitalize;
93
+ position: relative;
94
+ z-index: 1;
95
+ }
96
+ .page__header-description {
97
+ font-size: var(--uds-font-size-16);
98
+ line-height: var(--uds-line-16);
99
+ font-family: var(--uds-font-family);
100
+ font-weight: var(--uds-font-weight);
101
+ letter-spacing: 0px;
102
+ margin: 0;
103
+ color: var(--uds-text-inverse);
104
+ max-width: 720px;
105
+ position: relative;
106
+ z-index: 1;
107
+ }
108
+ .page__header-info {
109
+ display: flex;
110
+ gap: var(--uds-gap-10);
111
+ align-items: flex-end;
112
+ justify-content: space-between;
113
+ width: 100%;
114
+ position: relative;
115
+ z-index: 1;
116
+ }
117
+ .page__header-content {
118
+ display: flex;
119
+ flex: 1 0 0;
120
+ flex-direction: column;
121
+ gap: var(--uds-gap-16);
122
+ position: relative;
123
+ z-index: 1;
124
+ }
125
+ .page__header-metadata {
126
+ display: flex;
127
+ flex-direction: column;
128
+ align-items: flex-start;
129
+ border-radius: var(--uds-radius-4);
130
+ width: 320px;
131
+ }
132
+ .page__metadata-row {
133
+ border-bottom: solid 1px var(--uds-border-primary);
134
+ display: flex;
135
+ gap: var(--uds-gap-24);
136
+ align-items: center;
137
+ padding: var(--uds-padding-8) var(--uds-padding-12);
138
+ width: 100%;
139
+ }
140
+ .page__metadata-row:not(:first-child) {
141
+ border-top: var(--uds-border-width-1) solid var(--uds-border-on-dark-high);
142
+ }
143
+ .page__metadata-label {
144
+ font-size: var(--uds-font-size-12);
145
+ line-height: var(--uds-line-12);
146
+ font-family: var(--uds-font-family);
147
+ font-weight: var(--uds-font-weight-semibold);
148
+ letter-spacing: 0px;
149
+ color: var(--uds-text-inverse);
150
+ width: 120px;
151
+ margin: 0;
152
+ }
153
+ .page__metadata-value {
154
+ font-size: var(--uds-font-size-12);
155
+ line-height: var(--uds-line-12);
156
+ font-family: var(--uds-font-family);
157
+ font-weight: var(--uds-font-weight);
158
+ letter-spacing: 0px;
159
+ color: var(--uds-text-inverse);
160
+ margin: 0;
161
+ }
162
+ .page__metadata-link {
163
+ font-size: var(--uds-font-size-12);
164
+ line-height: var(--uds-line-12);
165
+ font-family: var(--uds-font-family);
166
+ font-weight: var(--uds-font-weight);
167
+ letter-spacing: 0px;
168
+ color: var(--uds-text-link-primary-default);
169
+ text-decoration: none;
170
+ margin: 0;
171
+ }
172
+ .page__metadata-link:hover {
173
+ text-decoration: underline;
174
+ }
175
+ .page__version-badge {
176
+ font-size: var(--uds-font-size-14);
177
+ line-height: var(--uds-line-14);
178
+ font-family: var(--uds-font-family);
179
+ font-weight: var(--uds-font-weight-semibold);
180
+ letter-spacing: 0em;
181
+ color: var(--uds-text-link-primary-default);
182
+ padding: 0 var(--uds-padding-4);
183
+ }
184
+
185
+ .card {
186
+ padding: var(--uds-padding-24);
187
+ border-radius: var(--uds-radius-16);
188
+ background: var(--uds-surface-primary);
189
+ border: var(--uds-border-width-1) solid var(--uds-border-primary);
190
+ box-shadow: var(--uds-shadow-md);
191
+ display: flex;
192
+ flex-direction: column;
193
+ gap: var(--uds-gap-12);
194
+ transition:
195
+ box-shadow var(--uds-duration-200) var(--uds-ease-standard),
196
+ transform var(--uds-duration-200) var(--uds-ease-standard),
197
+ border-color var(--uds-duration-200) var(--uds-ease-standard);
198
+ }
199
+ .card:hover {
200
+ box-shadow: var(--uds-shadow-lg);
201
+ border-color: var(--uds-border-brand-primary);
202
+ transform: translateY(-2px);
203
+ }
204
+ .card__icon {
205
+ display: flex;
206
+ align-items: center;
207
+ justify-content: center;
208
+ width: 100%;
209
+ height: 120px;
210
+ background: var(--uds-surface-primary);
211
+ border-radius: var(--uds-radius-8);
212
+ color: var(--uds-text-brand-primary);
213
+ margin-bottom: var(--uds-gap-16);
214
+ padding: var(--uds-padding-16);
215
+ }
216
+ .card__icon svg {
217
+ width: 100%;
218
+ height: 100%;
219
+ max-height: 100%;
220
+ }
221
+ .card h2 {
222
+ font-size: var(--uds-font-size-20);
223
+ line-height: var(--uds-line-heading-20);
224
+ font-family: var(--uds-font-family);
225
+ font-weight: var(--uds-font-weight-semibold);
226
+ letter-spacing: 0em;
227
+ margin: 0;
228
+ color: var(--uds-text-brand-primary);
229
+ }
230
+ .card p {
231
+ font-size: var(--uds-font-size-16);
232
+ line-height: var(--uds-line-16);
233
+ font-family: var(--uds-font-family);
234
+ font-weight: var(--uds-font-weight);
235
+ letter-spacing: 0px;
236
+ margin: 0;
237
+ color: var(--uds-text-secondary);
238
+ }
239
+
240
+ .card__link {
241
+ font-size: var(--uds-font-size-16);
242
+ line-height: var(--uds-line-16);
243
+ font-family: var(--uds-font-family);
244
+ font-weight: var(--uds-font-weight-semibold);
245
+ letter-spacing: 0px;
246
+ align-self: flex-start;
247
+ color: var(--uds-text-brand-primary);
248
+ text-decoration: none;
249
+ display: inline-flex;
250
+ align-items: center;
251
+ gap: var(--uds-gap-4);
252
+ padding: var(--uds-padding-4) var(--uds-padding-8);
253
+ border-radius: var(--uds-radius-4);
254
+ background: var(--uds-surface-brand-primary);
255
+ transition:
256
+ color var(--uds-duration-200) var(--uds-ease-standard),
257
+ background-color var(--uds-duration-200) var(--uds-ease-standard);
258
+ }
259
+ .card__link:after {
260
+ content: "→";
261
+ font-size: var(--uds-font-size-16);
262
+ transition: transform var(--uds-duration-200) var(--uds-ease-standard);
263
+ }
264
+ .card__link:hover {
265
+ color: var(--uds-text-inverse);
266
+ background-color: var(--uds-surface-brand-secondary);
267
+ }
268
+ .card__link:hover:after {
269
+ transform: translateX(4px);
270
+ }
271
+
272
+ .demo-group {
273
+ display: flex;
274
+ flex-direction: column;
275
+ gap: var(--uds-gap-16);
276
+ margin-bottom: var(--uds-padding-48);
277
+ background: var(--uds-surface-primary);
278
+ border: var(--uds-border-width-1) solid var(--uds-border-primary);
279
+ padding: var(--uds-padding-24);
280
+ border-radius: var(--uds-radius-8);
281
+ }
282
+ .demo-group:last-child {
283
+ margin-bottom: 0;
284
+ }
285
+ .demo-group h2 {
286
+ font-size: var(--uds-font-size-24);
287
+ line-height: var(--uds-line-24);
288
+ font-family: var(--uds-font-family);
289
+ font-weight: var(--uds-font-weight-bold);
290
+ letter-spacing: 0em;
291
+ margin: 0;
292
+ color: var(--uds-text-primary);
293
+ }
294
+ .demo-group h3 {
295
+ font-size: var(--uds-font-size-20);
296
+ line-height: var(--uds-line-heading-20);
297
+ font-family: var(--uds-font-family);
298
+ font-weight: var(--uds-font-weight-semibold);
299
+ letter-spacing: 0em;
300
+ margin: 0;
301
+ color: var(--uds-text-primary);
302
+ }
303
+ .demo-group p {
304
+ font-size: var(--uds-font-size-16);
305
+ line-height: var(--uds-line-16);
306
+ font-family: var(--uds-font-family);
307
+ font-weight: var(--uds-font-weight);
308
+ letter-spacing: 0px;
309
+ margin: 0;
310
+ color: var(--uds-text-secondary);
311
+ }
312
+ .demo-file-list {
313
+ margin-top: var(--uds-gap-16);
314
+ padding: var(--uds-padding-12);
315
+ background: var(--uds-surface-secondary);
316
+ border-radius: var(--uds-radius-4);
317
+ }
318
+ .demo-file-list__title {
319
+ font-size: var(--uds-font-size-14);
320
+ line-height: var(--uds-line-14);
321
+ font-family: var(--uds-font-family);
322
+ font-weight: var(--uds-font-weight-semibold);
323
+ letter-spacing: 0em;
324
+ margin: 0 0 var(--uds-gap-8) 0;
325
+ color: var(--uds-text-primary);
326
+ }
327
+ .demo-file-list__items {
328
+ font-size: var(--uds-font-size-14);
329
+ line-height: var(--uds-line-14);
330
+ font-family: var(--uds-font-family);
331
+ font-weight: var(--uds-font-weight);
332
+ letter-spacing: 0em;
333
+ margin: 0;
334
+ padding-left: var(--uds-padding-20);
335
+ color: var(--uds-text-primary);
336
+ }
337
+ .demo-file-list__item {
338
+ margin-bottom: var(--uds-gap-4);
339
+ }
340
+ .demo-file-list__item:last-child {
341
+ margin-bottom: 0;
342
+ }
343
+ .demo-file-list ul {
344
+ font-size: var(--uds-font-size-16);
345
+ line-height: var(--uds-line-16);
346
+ font-family: var(--uds-font-family);
347
+ font-weight: var(--uds-font-weight);
348
+ letter-spacing: 0px;
349
+ margin: 0;
350
+ padding-left: var(--uds-padding-24);
351
+ color: var(--uds-text-secondary);
352
+ }
353
+ .demo-file-list li {
354
+ margin-bottom: var(--uds-gap-8);
355
+ }
356
+ .demo-file-list code {
357
+ font-size: var(--uds-font-size-14);
358
+ line-height: var(--uds-line-14);
359
+ font-family: var(--uds-font-family);
360
+ font-weight: var(--uds-font-weight);
361
+ letter-spacing: 0em;
362
+ padding: var(--uds-padding-2) var(--uds-padding-6);
363
+ background: var(--uds-surface-tertiary);
364
+ border-radius: var(--uds-radius-4);
365
+ color: var(--uds-text-brand-primary);
366
+ }
367
+
368
+ .page__grid > * {
369
+ flex: 1 1 280px;
370
+ min-width: 280px;
371
+ }
372
+
373
+ .demo-content > * {
374
+ flex: 1 1 200px;
375
+ min-width: 200px;
376
+ }
377
+ .demo-content--icons > * {
378
+ flex: 1 1 240px;
379
+ min-width: 240px;
380
+ }
381
+
382
+ .demo-grid > * {
383
+ flex: 0 1 auto;
384
+ }
385
+
386
+ .demo-icon {
387
+ font-size: var(--uds-font-size-20);
388
+ line-height: var(--uds-line-20);
389
+ font-family: var(--uds-font-family);
390
+ font-weight: var(--uds-font-weight);
391
+ letter-spacing: 0px;
392
+ display: inline-flex;
393
+ }
394
+
395
+ .icon-card {
396
+ display: flex;
397
+ flex-direction: column;
398
+ gap: var(--uds-gap-12);
399
+ padding: var(--uds-padding-24);
400
+ border-radius: var(--uds-radius-16);
401
+ background: var(--uds-surface-secondary);
402
+ border: var(--uds-border-width-1) solid var(--uds-border-primary);
403
+ align-items: center;
404
+ text-align: center;
405
+ box-shadow: var(--uds-shadow-sm);
406
+ transition:
407
+ box-shadow var(--uds-duration-200) var(--uds-ease-standard),
408
+ transform var(--uds-duration-200) var(--uds-ease-standard),
409
+ border-color var(--uds-duration-200) var(--uds-ease-standard);
410
+ }
411
+ .icon-card:hover {
412
+ box-shadow: var(--uds-shadow-md);
413
+ border-color: var(--uds-border-brand-primary);
414
+ transform: translateY(-2px);
415
+ }
416
+
417
+ .icon-card__meta {
418
+ display: flex;
419
+ flex-direction: column;
420
+ gap: var(--uds-gap-4);
421
+ color: var(--uds-text-secondary);
422
+ }
423
+
424
+ .icon-card__label {
425
+ font-size: var(--uds-font-size-14);
426
+ line-height: var(--uds-line-14);
427
+ font-family: var(--uds-font-family);
428
+ font-weight: var(--uds-font-weight-semibold);
429
+ letter-spacing: 0em;
430
+ text-transform: capitalize;
431
+ color: var(--uds-text-primary);
432
+ }
433
+
434
+ .icon-card__meta code {
435
+ font-size: var(--uds-font-size-12);
436
+ line-height: var(--uds-line-12);
437
+ font-family: var(--uds-font-family);
438
+ font-weight: var(--uds-font-weight);
439
+ letter-spacing: 0px;
440
+ padding: var(--uds-padding-4) var(--uds-padding-8);
441
+ background: var(--uds-surface-tertiary);
442
+ border-radius: var(--uds-radius-4);
443
+ color: var(--uds-text-secondary);
444
+ }
445
+
446
+ @media (max-width: var(--uds-breakpoint-md)) {
447
+ .app-shell {
448
+ flex-direction: column;
449
+ }
450
+ .app-shell__content {
451
+ margin-left: 0;
452
+ max-width: 100%;
453
+ padding: var(--uds-padding-32) var(--uds-padding-16) var(--uds-padding-48);
454
+ }
455
+ }
456
+
457
+ /*# sourceMappingURL=App.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["App.scss","styles/_typography.scss"],"names":[],"mappings":";AAEA;EACI;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAIR;ECmFA;EACA;EACA;EACA;EACA;EACA;EDtFI;EACA;EACA;EACA;EACA;EACA;;AAGJ;ECwRA;EACA;EACA;EACA;EACA;ED1RI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAIR;ECuTA;EACA;EACA;EACA;EACA;EDzTI;EACA;EACA;;AAGJ;ECgSA;EACA;EACA;EACA;EACA;EDlSI;EACA;;AAGJ;EC0RA;EACA;EACA;EACA;EACA;ED5RI;EACA;EACA;;AAEA;EACI;;AAIR;EC+PA;EACA;EACA;EACA;EACA;EDjQI;EACA;;;AAMR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAIR;ECeA;EACA;EACA;EACA;EACA;EDjBI;EACA;;AAGJ;EC0JA;EACA;EACA;EACA;EACA;ED5JI;EACA;;;AAIR;ECmKI;EACA;EACA;EACA;EACA;EDrKA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;;;AAMR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EC6DJ;EACA;EACA;EACA;EACA;ED/DQ;EACA;;AAGJ;ECjDJ;EACA;EACA;EACA;EACA;ED+CQ;EACA;;AAGJ;EC0FJ;EACA;EACA;EACA;EACA;ED5FQ;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EC6HJ;EACA;EACA;EACA;EACA;ED/HQ;EACA;;AAGJ;ECuGJ;EACA;EACA;EACA;EACA;EDzGQ;EACA;EACA;;AAGJ;EACI;;AAEA;EACI;;AAIR;ECwDJ;EACA;EACA;EACA;EACA;ED1DQ;EACA;EACA;;AAGJ;EACI;;AAGJ;EC6EJ;EACA;EACA;EACA;EACA;ED/EQ;EACA;EACA;EACA;;;AAMR;EACI;EACA;;;AAKJ;EACI;EACA;;AAIA;EACI;EACA;;;AAMR;EACI;;;AAIR;ECxBI;EACA;EACA;EACA;EACA;EDsBA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;ECsBI;EACA;EACA;EACA;EACA;EDxBA;EACA;;;AAGJ;ECgCI;EACA;EACA;EACA;EACA;EDlCA;EACA;EACA;EACA;;;AAGJ;EACI;IACI;;EAGJ;IACI;IACA;IACA","file":"App.css"}