@work-rjkashyap/unified-ui 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 (60) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/README.md +365 -0
  3. package/dist/chunk-2JFREULQ.cjs +29 -0
  4. package/dist/chunk-2RGLRX6K.cjs +279 -0
  5. package/dist/chunk-3HHJAYQI.cjs +469 -0
  6. package/dist/chunk-5S5DMH5G.cjs +5983 -0
  7. package/dist/chunk-BIW2RPDU.cjs +73 -0
  8. package/dist/chunk-CWETOWRM.mjs +456 -0
  9. package/dist/chunk-ECIGDEAH.cjs +140 -0
  10. package/dist/chunk-EO4WROWH.mjs +432 -0
  11. package/dist/chunk-EZ2L3XPS.mjs +83 -0
  12. package/dist/chunk-I74E52C5.mjs +271 -0
  13. package/dist/chunk-ITBG42M5.mjs +133 -0
  14. package/dist/chunk-IWJ5VMZ7.mjs +323 -0
  15. package/dist/chunk-KHON2AEM.cjs +342 -0
  16. package/dist/chunk-LSNKPQP7.cjs +58 -0
  17. package/dist/chunk-M2LNQWOB.mjs +63 -0
  18. package/dist/chunk-NMPHV6ZD.mjs +27 -0
  19. package/dist/chunk-QXR4VY7Q.cjs +268 -0
  20. package/dist/chunk-SSGN5QDC.mjs +248 -0
  21. package/dist/chunk-X2WCY4VB.mjs +5836 -0
  22. package/dist/chunk-XCKK6P46.cjs +91 -0
  23. package/dist/chunk-ZBN26FLO.mjs +46 -0
  24. package/dist/chunk-ZPIPKY2J.cjs +478 -0
  25. package/dist/components.cjs +477 -0
  26. package/dist/components.d.cts +3077 -0
  27. package/dist/components.d.ts +3077 -0
  28. package/dist/components.mjs +4 -0
  29. package/dist/index.cjs +1027 -0
  30. package/dist/index.d.cts +30 -0
  31. package/dist/index.d.ts +30 -0
  32. package/dist/index.mjs +17 -0
  33. package/dist/motion-D9wQbcKL.d.cts +80 -0
  34. package/dist/motion-D9wQbcKL.d.ts +80 -0
  35. package/dist/motion.cjs +216 -0
  36. package/dist/motion.d.cts +104 -0
  37. package/dist/motion.d.ts +104 -0
  38. package/dist/motion.mjs +3 -0
  39. package/dist/primitives.cjs +57 -0
  40. package/dist/primitives.d.cts +390 -0
  41. package/dist/primitives.d.ts +390 -0
  42. package/dist/primitives.mjs +4 -0
  43. package/dist/theme.cjs +38 -0
  44. package/dist/theme.d.cts +117 -0
  45. package/dist/theme.d.ts +117 -0
  46. package/dist/theme.mjs +5 -0
  47. package/dist/tokens.cjs +137 -0
  48. package/dist/tokens.d.cts +30 -0
  49. package/dist/tokens.d.ts +30 -0
  50. package/dist/tokens.mjs +4 -0
  51. package/dist/typography-DlvVjEdE.d.cts +146 -0
  52. package/dist/typography-DlvVjEdE.d.ts +146 -0
  53. package/dist/utils.cjs +164 -0
  54. package/dist/utils.d.cts +521 -0
  55. package/dist/utils.d.ts +521 -0
  56. package/dist/utils.mjs +3 -0
  57. package/dist/z-index-B_nTQ3qo.d.cts +422 -0
  58. package/dist/z-index-B_nTQ3qo.d.ts +422 -0
  59. package/package.json +183 -0
  60. package/styles.css +500 -0
@@ -0,0 +1,73 @@
1
+ 'use strict';
2
+
3
+ var clsx = require('clsx');
4
+ var tailwindMerge = require('tailwind-merge');
5
+
6
+ // src/utils/cn.ts
7
+ function cn(...inputs) {
8
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
9
+ }
10
+ function mergeSlots(defaults, overrides) {
11
+ if (!overrides) {
12
+ return defaults;
13
+ }
14
+ const allKeys = /* @__PURE__ */ new Set([
15
+ ...Object.keys(defaults),
16
+ ...Object.keys(overrides)
17
+ ]);
18
+ const result = {};
19
+ for (const key of allKeys) {
20
+ result[key] = cn(defaults[key] ?? "", overrides[key] ?? "");
21
+ }
22
+ return result;
23
+ }
24
+ function dsAttr(componentName) {
25
+ return {
26
+ "data-ds": "",
27
+ "data-ds-component": componentName
28
+ };
29
+ }
30
+ function dsStateAttr(state, active) {
31
+ if (!active) return {};
32
+ return { [`data-ds-${state}`]: "" };
33
+ }
34
+ function dsVar(category, name, fallback) {
35
+ const varName = `--ds-${category}-${name}`;
36
+ return fallback ? `var(${varName}, ${fallback})` : `var(${varName})`;
37
+ }
38
+ function dsColorVar(name, alpha) {
39
+ const channels = `var(--ds-color-${name})`;
40
+ if (alpha !== void 0) {
41
+ return `rgb(${channels} / ${alpha})`;
42
+ }
43
+ return `rgb(${channels})`;
44
+ }
45
+ function setRef(ref, value) {
46
+ if (typeof ref === "function") {
47
+ ref(value);
48
+ } else if (ref !== null && ref !== void 0) {
49
+ ref.current = value;
50
+ }
51
+ }
52
+ function composeRefs(...refs) {
53
+ return (node) => {
54
+ for (const ref of refs) {
55
+ setRef(ref, node);
56
+ }
57
+ };
58
+ }
59
+ function typedKeys(obj) {
60
+ return Object.keys(obj);
61
+ }
62
+ var noop = () => {
63
+ };
64
+
65
+ exports.cn = cn;
66
+ exports.composeRefs = composeRefs;
67
+ exports.dsAttr = dsAttr;
68
+ exports.dsColorVar = dsColorVar;
69
+ exports.dsStateAttr = dsStateAttr;
70
+ exports.dsVar = dsVar;
71
+ exports.mergeSlots = mergeSlots;
72
+ exports.noop = noop;
73
+ exports.typedKeys = typedKeys;
@@ -0,0 +1,456 @@
1
+ import { typographyVariants } from './chunk-ITBG42M5.mjs';
2
+ import { cn } from './chunk-M2LNQWOB.mjs';
3
+ import { forwardRef } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var sizeClassMap = {
7
+ /** 640px — narrow forms, single-column content */
8
+ xs: "max-w-screen-sm",
9
+ /** 768px — articles, focused reading content */
10
+ sm: "max-w-screen-md",
11
+ /** 1024px — dashboards, multi-column layouts */
12
+ md: "max-w-screen-lg",
13
+ /** 1280px — default, full-width page content */
14
+ lg: "max-w-7xl",
15
+ /** No max-width constraint — full bleed */
16
+ full: "max-w-full"
17
+ };
18
+ var paddingClassMap = {
19
+ /** No horizontal padding */
20
+ none: "",
21
+ /** Tighter padding: px-3 → px-4 → px-6 */
22
+ tight: "px-3 sm:px-4 lg:px-6",
23
+ /** Standard padding: px-4 → px-6 → px-8 (project default) */
24
+ default: "px-4 sm:px-6 lg:px-8",
25
+ /** Wider padding: px-6 → px-8 → px-10 */
26
+ wide: "px-6 sm:px-8 lg:px-10"
27
+ };
28
+ var Container = forwardRef(
29
+ function Container2({
30
+ size = "lg",
31
+ padding = "default",
32
+ centered = true,
33
+ as: Component = "div",
34
+ className,
35
+ children,
36
+ ...rest
37
+ }, ref) {
38
+ return /* @__PURE__ */ jsx(
39
+ Component,
40
+ {
41
+ ref,
42
+ className: cn(
43
+ // Max-width constraint
44
+ sizeClassMap[size],
45
+ // Responsive horizontal padding
46
+ paddingClassMap[padding],
47
+ // Centering
48
+ centered && "mx-auto",
49
+ // Width fills available space up to max-width
50
+ "w-full",
51
+ // Consumer overrides
52
+ className
53
+ ),
54
+ "data-ds": "",
55
+ "data-ds-component": "container",
56
+ ...rest,
57
+ children
58
+ }
59
+ );
60
+ }
61
+ );
62
+ Container.displayName = "Container";
63
+ var spacingYMap = {
64
+ 0: "my-0",
65
+ 1: "my-1",
66
+ 2: "my-2",
67
+ 3: "my-3",
68
+ 4: "my-4",
69
+ 5: "my-5",
70
+ 6: "my-6",
71
+ 8: "my-8",
72
+ 10: "my-10",
73
+ 12: "my-12"
74
+ };
75
+ var spacingXMap = {
76
+ 0: "mx-0",
77
+ 1: "mx-1",
78
+ 2: "mx-2",
79
+ 3: "mx-3",
80
+ 4: "mx-4",
81
+ 5: "mx-5",
82
+ 6: "mx-6",
83
+ 8: "mx-8",
84
+ 10: "mx-10",
85
+ 12: "mx-12"
86
+ };
87
+ var Divider = forwardRef(function Divider2({ spacing = 4, orientation = "horizontal", className, ...rest }, ref) {
88
+ const isVertical = orientation === "vertical";
89
+ return /* @__PURE__ */ jsx(
90
+ "hr",
91
+ {
92
+ ref,
93
+ role: "separator",
94
+ "aria-orientation": orientation,
95
+ className: cn(
96
+ "border-none shrink-0",
97
+ isVertical ? cn("w-px self-stretch bg-ds-border", spacingXMap[spacing] ?? "mx-4") : cn("h-px w-full bg-ds-border", spacingYMap[spacing] ?? "my-4"),
98
+ className
99
+ ),
100
+ "data-ds": "",
101
+ "data-ds-component": "divider",
102
+ ...rest
103
+ }
104
+ );
105
+ });
106
+ Divider.displayName = "Divider";
107
+ var gapClassMap = {
108
+ 0: "gap-0",
109
+ 0.5: "gap-0.5",
110
+ 1: "gap-1",
111
+ 1.5: "gap-1.5",
112
+ 2: "gap-2",
113
+ 2.5: "gap-2.5",
114
+ 3: "gap-3",
115
+ 3.5: "gap-3.5",
116
+ 4: "gap-4",
117
+ 5: "gap-5",
118
+ 6: "gap-6",
119
+ 7: "gap-7",
120
+ 8: "gap-8",
121
+ 9: "gap-9",
122
+ 10: "gap-10",
123
+ 11: "gap-11",
124
+ 12: "gap-12",
125
+ 14: "gap-14",
126
+ 16: "gap-16",
127
+ 20: "gap-20",
128
+ 24: "gap-24"
129
+ };
130
+ var directionClassMap = {
131
+ vertical: "flex-col",
132
+ horizontal: "flex-row"
133
+ };
134
+ var alignClassMap = {
135
+ start: "items-start",
136
+ center: "items-center",
137
+ end: "items-end",
138
+ stretch: "items-stretch",
139
+ baseline: "items-baseline"
140
+ };
141
+ var justifyClassMap = {
142
+ start: "justify-start",
143
+ center: "justify-center",
144
+ end: "justify-end",
145
+ between: "justify-between",
146
+ around: "justify-around",
147
+ evenly: "justify-evenly"
148
+ };
149
+ var Stack = forwardRef(function Stack2({
150
+ gap = 4,
151
+ direction = "vertical",
152
+ align,
153
+ justify,
154
+ wrap = false,
155
+ as: Component = "div",
156
+ className,
157
+ children,
158
+ ...rest
159
+ }, ref) {
160
+ return /* @__PURE__ */ jsx(
161
+ Component,
162
+ {
163
+ ref,
164
+ className: cn(
165
+ "flex",
166
+ directionClassMap[direction],
167
+ gapClassMap[gap],
168
+ align && alignClassMap[align],
169
+ justify && justifyClassMap[justify],
170
+ wrap && "flex-wrap",
171
+ className
172
+ ),
173
+ "data-ds": "",
174
+ "data-ds-component": "stack",
175
+ ...rest,
176
+ children
177
+ }
178
+ );
179
+ });
180
+ Stack.displayName = "Stack";
181
+ var colsClassMap = {
182
+ 1: "grid-cols-1",
183
+ 2: "grid-cols-2",
184
+ 3: "grid-cols-3",
185
+ 4: "grid-cols-4",
186
+ 5: "grid-cols-5",
187
+ 6: "grid-cols-6"
188
+ };
189
+ var colsSmClassMap = {
190
+ 1: "sm:grid-cols-1",
191
+ 2: "sm:grid-cols-2",
192
+ 3: "sm:grid-cols-3",
193
+ 4: "sm:grid-cols-4"
194
+ };
195
+ var colsMdClassMap = {
196
+ 1: "md:grid-cols-1",
197
+ 2: "md:grid-cols-2",
198
+ 3: "md:grid-cols-3",
199
+ 4: "md:grid-cols-4"
200
+ };
201
+ var colsLgClassMap = {
202
+ 1: "lg:grid-cols-1",
203
+ 2: "lg:grid-cols-2",
204
+ 3: "lg:grid-cols-3",
205
+ 4: "lg:grid-cols-4",
206
+ 5: "lg:grid-cols-5",
207
+ 6: "lg:grid-cols-6"
208
+ };
209
+ var Grid = forwardRef(function Grid2({
210
+ cols = 1,
211
+ colsSm,
212
+ colsMd,
213
+ colsLg,
214
+ gap = 4,
215
+ as: Component = "div",
216
+ className,
217
+ children,
218
+ ...rest
219
+ }, ref) {
220
+ return /* @__PURE__ */ jsx(
221
+ Component,
222
+ {
223
+ ref,
224
+ className: cn(
225
+ "grid",
226
+ colsClassMap[cols],
227
+ colsSm && colsSmClassMap[colsSm],
228
+ colsMd && colsMdClassMap[colsMd],
229
+ colsLg && colsLgClassMap[colsLg],
230
+ gapClassMap[gap],
231
+ className
232
+ ),
233
+ "data-ds": "",
234
+ "data-ds-component": "grid",
235
+ ...rest,
236
+ children
237
+ }
238
+ );
239
+ });
240
+ Grid.displayName = "Grid";
241
+ var fontClassMap = {
242
+ display: "font-ds-display",
243
+ sans: "font-ds-sans",
244
+ serif: "font-ds-serif",
245
+ mono: "font-ds-mono",
246
+ inherit: "font-[inherit]"
247
+ };
248
+ var variantDefaultFont = {
249
+ heading1: typographyVariants.heading1.fontFamily,
250
+ heading2: typographyVariants.heading2.fontFamily,
251
+ heading3: typographyVariants.heading3.fontFamily,
252
+ subheading: typographyVariants.subheading.fontFamily,
253
+ body: typographyVariants.body.fontFamily,
254
+ bodySm: typographyVariants.bodySm.fontFamily,
255
+ caption: typographyVariants.caption.fontFamily,
256
+ label: typographyVariants.label.fontFamily,
257
+ overline: typographyVariants.overline.fontFamily,
258
+ code: typographyVariants.code.fontFamily
259
+ };
260
+ var defaultElementMap = {
261
+ heading1: "h1",
262
+ heading2: "h2",
263
+ heading3: "h3",
264
+ subheading: "h4",
265
+ body: "p",
266
+ bodySm: "p",
267
+ caption: "span",
268
+ label: "label",
269
+ overline: "span",
270
+ code: "code"
271
+ };
272
+ var variantClassMap = {
273
+ heading1: "text-[30px] leading-[36px] font-bold tracking-tight text-ds-foreground",
274
+ heading2: "text-[24px] leading-[32px] font-semibold tracking-tight text-ds-foreground",
275
+ heading3: "text-[20px] leading-[28px] font-semibold tracking-normal text-ds-foreground",
276
+ subheading: "text-[18px] leading-[28px] font-medium tracking-normal text-ds-foreground",
277
+ body: "text-[16px] leading-[24px] font-normal tracking-normal text-ds-foreground",
278
+ bodySm: "text-[14px] leading-[20px] font-normal tracking-normal text-ds-foreground",
279
+ caption: "text-[12px] leading-[16px] font-normal tracking-wide text-ds-muted-foreground",
280
+ label: "text-[14px] leading-[20px] font-medium tracking-normal text-ds-foreground",
281
+ overline: "text-[12px] leading-[16px] font-semibold tracking-wider uppercase text-ds-muted-foreground",
282
+ code: "text-[14px] leading-[20px] font-normal tracking-normal text-ds-foreground"
283
+ };
284
+ var colorClassMap = {
285
+ default: "",
286
+ foreground: "text-ds-foreground",
287
+ muted: "text-ds-muted-foreground",
288
+ primary: "text-ds-primary",
289
+ success: "text-ds-success",
290
+ warning: "text-ds-warning",
291
+ danger: "text-ds-danger",
292
+ info: "text-ds-info",
293
+ inherit: "text-inherit"
294
+ };
295
+ var alignClassMap2 = {
296
+ left: "text-left",
297
+ center: "text-center",
298
+ right: "text-right"
299
+ };
300
+ var lineClampClassMap = {
301
+ 1: "line-clamp-1",
302
+ 2: "line-clamp-2",
303
+ 3: "line-clamp-3",
304
+ 4: "line-clamp-4",
305
+ 5: "line-clamp-5",
306
+ 6: "line-clamp-6"
307
+ };
308
+ var Typography = forwardRef(
309
+ function Typography2({
310
+ variant = "body",
311
+ font,
312
+ color = "default",
313
+ align,
314
+ as,
315
+ truncate = false,
316
+ lineClamp,
317
+ noMargin = true,
318
+ className,
319
+ children,
320
+ ...rest
321
+ }, ref) {
322
+ const Component = as ?? defaultElementMap[variant];
323
+ const resolvedFont = font ?? variantDefaultFont[variant];
324
+ const classes = cn(
325
+ // Base variant styles (size, weight, line-height, tracking, default color)
326
+ variantClassMap[variant],
327
+ // Font family (resolved from prop or variant default)
328
+ fontClassMap[resolvedFont],
329
+ // Color override (only applied if not "default" — default keeps variant's color)
330
+ color !== "default" && colorClassMap[color],
331
+ // Alignment
332
+ align && alignClassMap2[align],
333
+ // Truncation
334
+ truncate && "truncate",
335
+ // Line clamping
336
+ lineClamp && lineClampClassMap[lineClamp],
337
+ // Margin reset
338
+ noMargin && "m-0",
339
+ // Consumer overrides
340
+ className
341
+ );
342
+ return /* @__PURE__ */ jsx(
343
+ Component,
344
+ {
345
+ ref,
346
+ className: classes,
347
+ "data-ds": "",
348
+ "data-ds-component": "typography",
349
+ "data-ds-variant": variant,
350
+ ...rest,
351
+ children
352
+ }
353
+ );
354
+ }
355
+ );
356
+ Typography.displayName = "Typography";
357
+ var headingVariantMap = {
358
+ 1: "heading1",
359
+ 2: "heading2",
360
+ 3: "heading3"
361
+ };
362
+ var Heading = forwardRef(
363
+ function Heading2({ level = 1, ...rest }, ref) {
364
+ return /* @__PURE__ */ jsx(
365
+ Typography,
366
+ {
367
+ ref,
368
+ variant: headingVariantMap[level],
369
+ ...rest
370
+ }
371
+ );
372
+ }
373
+ );
374
+ Heading.displayName = "Heading";
375
+ var Subheading = forwardRef(
376
+ function Subheading2(props, ref) {
377
+ return /* @__PURE__ */ jsx(Typography, { ref, variant: "subheading", ...props });
378
+ }
379
+ );
380
+ Subheading.displayName = "Subheading";
381
+ var Body = forwardRef(function Body2({ small = false, ...rest }, ref) {
382
+ return /* @__PURE__ */ jsx(
383
+ Typography,
384
+ {
385
+ ref,
386
+ variant: small ? "bodySm" : "body",
387
+ ...rest
388
+ }
389
+ );
390
+ });
391
+ Body.displayName = "Body";
392
+ var Caption = forwardRef(function Caption2({ color = "muted", ...rest }, ref) {
393
+ return /* @__PURE__ */ jsx(Typography, { ref, variant: "caption", color, ...rest });
394
+ });
395
+ Caption.displayName = "Caption";
396
+ var Label = forwardRef(function Label2({
397
+ htmlFor,
398
+ font,
399
+ color,
400
+ align,
401
+ as,
402
+ truncate,
403
+ lineClamp,
404
+ noMargin = true,
405
+ className,
406
+ children,
407
+ ...rest
408
+ }, ref) {
409
+ const resolvedFont = font ?? variantDefaultFont.label;
410
+ const classes = cn(
411
+ variantClassMap.label,
412
+ fontClassMap[resolvedFont],
413
+ color && color !== "default" && colorClassMap[color],
414
+ align && alignClassMap2[align],
415
+ truncate && "truncate",
416
+ lineClamp && lineClampClassMap[lineClamp],
417
+ noMargin && "m-0",
418
+ className
419
+ );
420
+ return /* @__PURE__ */ jsx(
421
+ "label",
422
+ {
423
+ ref,
424
+ htmlFor,
425
+ className: classes,
426
+ "data-ds": "",
427
+ "data-ds-component": "typography",
428
+ "data-ds-variant": "label",
429
+ ...rest,
430
+ children
431
+ }
432
+ );
433
+ });
434
+ Label.displayName = "Label";
435
+ var Overline = forwardRef(
436
+ function Overline2({ color = "muted", ...rest }, ref) {
437
+ return /* @__PURE__ */ jsx(Typography, { ref, variant: "overline", color, ...rest });
438
+ }
439
+ );
440
+ Overline.displayName = "Overline";
441
+ var InlineCode = forwardRef(
442
+ function InlineCode2({ className, ...rest }, ref) {
443
+ return /* @__PURE__ */ jsx(
444
+ Typography,
445
+ {
446
+ ref,
447
+ variant: "code",
448
+ className: cn("rounded-ds-sm bg-ds-muted px-1.5 py-0.5", className),
449
+ ...rest
450
+ }
451
+ );
452
+ }
453
+ );
454
+ InlineCode.displayName = "InlineCode";
455
+
456
+ export { Body, Caption, Container, Divider, Grid, Heading, InlineCode, Label, Overline, Stack, Subheading, Typography };
@@ -0,0 +1,140 @@
1
+ 'use strict';
2
+
3
+ // src/tokens/typography.ts
4
+ var fontFamily = {
5
+ /** Display — used for hero headings, marketing text, landing pages */
6
+ display: "'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
7
+ /** Sans — primary UI typeface for all interface text */
8
+ sans: "'Outfit', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif",
9
+ /** Serif — long-form reading, editorial content, blog posts */
10
+ serif: "'Lora', Georgia, 'Times New Roman', serif",
11
+ /** Mono — code blocks, technical values, tabular data */
12
+ mono: "'JetBrains Mono', 'Fira Code', 'SF Mono', 'Cascadia Code', Consolas, 'Liberation Mono', Menlo, monospace",
13
+ /** Inherit — use parent's font (escape hatch for third-party integration) */
14
+ inherit: "inherit"
15
+ };
16
+ var fontSize = {
17
+ xs: "12px",
18
+ sm: "14px",
19
+ base: "16px",
20
+ lg: "18px",
21
+ xl: "20px",
22
+ "2xl": "24px",
23
+ "3xl": "30px"
24
+ };
25
+ var lineHeight = {
26
+ none: "1",
27
+ tight: "1.25",
28
+ snug: "1.375",
29
+ normal: "1.5",
30
+ relaxed: "1.625",
31
+ /** Fixed pixel values for precise control */
32
+ "16": "16px",
33
+ "20": "20px",
34
+ "24": "24px",
35
+ "28": "28px",
36
+ "32": "32px",
37
+ "36": "36px"
38
+ };
39
+ var fontWeight = {
40
+ regular: "400",
41
+ medium: "500",
42
+ semibold: "600",
43
+ bold: "700"
44
+ };
45
+ var letterSpacing = {
46
+ tighter: "-0.05em",
47
+ tight: "-0.025em",
48
+ normal: "0em",
49
+ wide: "0.025em",
50
+ wider: "0.05em"
51
+ };
52
+ var typographyVariants = {
53
+ /** Page titles — 30px bold, tight leading, sans font */
54
+ heading1: {
55
+ fontSize: fontSize["3xl"],
56
+ lineHeight: lineHeight["36"],
57
+ fontWeight: fontWeight.bold,
58
+ letterSpacing: letterSpacing.tight,
59
+ fontFamily: "sans"
60
+ },
61
+ /** Section titles — 24px semibold, sans font */
62
+ heading2: {
63
+ fontSize: fontSize["2xl"],
64
+ lineHeight: lineHeight["32"],
65
+ fontWeight: fontWeight.semibold,
66
+ letterSpacing: letterSpacing.tight,
67
+ fontFamily: "sans"
68
+ },
69
+ /** Subsection titles — 20px semibold, sans font */
70
+ heading3: {
71
+ fontSize: fontSize.xl,
72
+ lineHeight: lineHeight["28"],
73
+ fontWeight: fontWeight.semibold,
74
+ letterSpacing: letterSpacing.normal,
75
+ fontFamily: "sans"
76
+ },
77
+ /** Card titles, sidebar headings — 18px medium, sans font */
78
+ subheading: {
79
+ fontSize: fontSize.lg,
80
+ lineHeight: lineHeight["28"],
81
+ fontWeight: fontWeight.medium,
82
+ letterSpacing: letterSpacing.normal,
83
+ fontFamily: "sans"
84
+ },
85
+ /** Default body text — 16px regular, sans font */
86
+ body: {
87
+ fontSize: fontSize.base,
88
+ lineHeight: lineHeight["24"],
89
+ fontWeight: fontWeight.regular,
90
+ letterSpacing: letterSpacing.normal,
91
+ fontFamily: "sans"
92
+ },
93
+ /** Compact body text — 14px regular, sans font */
94
+ bodySm: {
95
+ fontSize: fontSize.sm,
96
+ lineHeight: lineHeight["20"],
97
+ fontWeight: fontWeight.regular,
98
+ letterSpacing: letterSpacing.normal,
99
+ fontFamily: "sans"
100
+ },
101
+ /** Captions, helper text, timestamps — 12px regular, sans font */
102
+ caption: {
103
+ fontSize: fontSize.xs,
104
+ lineHeight: lineHeight["16"],
105
+ fontWeight: fontWeight.regular,
106
+ letterSpacing: letterSpacing.wide,
107
+ fontFamily: "sans"
108
+ },
109
+ /** Form labels, badges — 14px medium, sans font */
110
+ label: {
111
+ fontSize: fontSize.sm,
112
+ lineHeight: lineHeight["20"],
113
+ fontWeight: fontWeight.medium,
114
+ letterSpacing: letterSpacing.normal,
115
+ fontFamily: "sans"
116
+ },
117
+ /** Overline / eyebrow text — 12px semibold, uppercased in usage, sans font */
118
+ overline: {
119
+ fontSize: fontSize.xs,
120
+ lineHeight: lineHeight["16"],
121
+ fontWeight: fontWeight.semibold,
122
+ letterSpacing: letterSpacing.wider,
123
+ fontFamily: "sans"
124
+ },
125
+ /** Code / monospace inline text — 14px regular, mono font */
126
+ code: {
127
+ fontSize: fontSize.sm,
128
+ lineHeight: lineHeight["20"],
129
+ fontWeight: fontWeight.regular,
130
+ letterSpacing: letterSpacing.normal,
131
+ fontFamily: "mono"
132
+ }
133
+ };
134
+
135
+ exports.fontFamily = fontFamily;
136
+ exports.fontSize = fontSize;
137
+ exports.fontWeight = fontWeight;
138
+ exports.letterSpacing = letterSpacing;
139
+ exports.lineHeight = lineHeight;
140
+ exports.typographyVariants = typographyVariants;