@mastors/core 1.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 (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +940 -0
  3. package/api/_index.scss +5 -0
  4. package/dist/mastors-core.css +7419 -0
  5. package/dist/mastors-core.css.map +1 -0
  6. package/package.json +73 -0
  7. package/postinstall.js +41 -0
  8. package/scripts/generate-tokens.js +259 -0
  9. package/scss/abstracts/_index.scss +6 -0
  10. package/scss/abstracts/_maps.scss +9 -0
  11. package/scss/abstracts/_placeholders.scss +7 -0
  12. package/scss/accessibility/_focus.scss +21 -0
  13. package/scss/accessibility/_index.scss +7 -0
  14. package/scss/accessibility/_motion.scss +14 -0
  15. package/scss/accessibility/_print.scss +52 -0
  16. package/scss/accessibility/_screen-reader.scss +31 -0
  17. package/scss/api/_index.scss +14 -0
  18. package/scss/base/_box-sizing.scss +6 -0
  19. package/scss/base/_index.scss +7 -0
  20. package/scss/base/_reset.scss +59 -0
  21. package/scss/base/_root.scss +43 -0
  22. package/scss/base/_typography-base.scss +40 -0
  23. package/scss/config/_flags.scss +13 -0
  24. package/scss/config/_index.scss +12 -0
  25. package/scss/config/_settings.scss +18 -0
  26. package/scss/functions/_color.scss +66 -0
  27. package/scss/functions/_em.scss +28 -0
  28. package/scss/functions/_index.scss +15 -0
  29. package/scss/functions/_map-helpers.scss +29 -0
  30. package/scss/functions/_math.scss +40 -0
  31. package/scss/functions/_rem.scss +27 -0
  32. package/scss/functions/_string.scss +57 -0
  33. package/scss/functions/_vars.scss +49 -0
  34. package/scss/generators/_class-generator.scss +83 -0
  35. package/scss/generators/_custom-property-generator.scss +29 -0
  36. package/scss/generators/_index.scss +6 -0
  37. package/scss/generators/_responsive-generator.scss +28 -0
  38. package/scss/helpers/_clearfix.scss +9 -0
  39. package/scss/helpers/_index.scss +7 -0
  40. package/scss/helpers/_ratio.scss +22 -0
  41. package/scss/helpers/_truncate.scss +25 -0
  42. package/scss/helpers/_visually-hidden.scss +39 -0
  43. package/scss/index.scss +41 -0
  44. package/scss/mixins/_breakpoint.scss +33 -0
  45. package/scss/mixins/_container.scss +20 -0
  46. package/scss/mixins/_elevation.scss +12 -0
  47. package/scss/mixins/_index.scss +9 -0
  48. package/scss/mixins/_pseudo.scss +13 -0
  49. package/scss/mixins/_theme.scss +31 -0
  50. package/scss/mixins/_transition.scss +20 -0
  51. package/scss/responsive/_container-queries.scss +31 -0
  52. package/scss/responsive/_engine.scss +65 -0
  53. package/scss/responsive/_fluid-type.scss +40 -0
  54. package/scss/responsive/_index.scss +6 -0
  55. package/scss/semantic/_colors.scss +29 -0
  56. package/scss/semantic/_index.scss +6 -0
  57. package/scss/semantic/_spacing.scss +13 -0
  58. package/scss/semantic/_typography.scss +13 -0
  59. package/scss/themes/_base-theme.scss +28 -0
  60. package/scss/themes/_dark.scss +59 -0
  61. package/scss/themes/_index.scss +6 -0
  62. package/scss/themes/_light.scss +31 -0
  63. package/scss/tokens/_color.scss +100 -0
  64. package/scss/tokens/_index.scss +12 -0
  65. package/scss/tokens/_opacity.scss +28 -0
  66. package/scss/tokens/_radii.scss +21 -0
  67. package/scss/tokens/_shadows.scss +20 -0
  68. package/scss/tokens/_sizing.scss +47 -0
  69. package/scss/tokens/_spacing.scss +48 -0
  70. package/scss/tokens/_transitions.scss +27 -0
  71. package/scss/tokens/_typography.scss +63 -0
  72. package/scss/tokens/_z-index.scss +21 -0
  73. package/scss/utilities/_animation.scss +125 -0
  74. package/scss/utilities/_borders.scss +55 -0
  75. package/scss/utilities/_colors.scss +42 -0
  76. package/scss/utilities/_cursor.scss +28 -0
  77. package/scss/utilities/_display.scss +26 -0
  78. package/scss/utilities/_index.scss +20 -0
  79. package/scss/utilities/_interaction.scss +156 -0
  80. package/scss/utilities/_layout.scss +162 -0
  81. package/scss/utilities/_opacity.scss +9 -0
  82. package/scss/utilities/_overflow.scss +36 -0
  83. package/scss/utilities/_pointer-events.scss +6 -0
  84. package/scss/utilities/_position.scss +32 -0
  85. package/scss/utilities/_shadows.scss +11 -0
  86. package/scss/utilities/_sizing.scss +40 -0
  87. package/scss/utilities/_spacing.scss +42 -0
  88. package/scss/utilities/_transform.scss +43 -0
  89. package/scss/utilities/_typography.scss +163 -0
  90. package/scss/utilities/_z-index.scss +9 -0
  91. package/scss/variables/_breakpoints.scss +14 -0
  92. package/scss/variables/_container.scss +13 -0
  93. package/scss/variables/_global.scss +8 -0
  94. package/scss/variables/_grid.scss +7 -0
  95. package/scss/variables/_index.scss +7 -0
  96. package/scss/vendors/_index.scss +15 -0
@@ -0,0 +1,29 @@
1
+ // semantic/_colors.scss
2
+ // Semantic color aliases mapped from primitive color tokens.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ // Semantic color aliases — role-based names that map to CSS custom properties.
6
+ // Use these in component CSS instead of raw token references for themability.
7
+
8
+ // These are SCSS variable aliases pointing to the custom properties
9
+ // emitted by themes/_base-theme.scss, _light.scss, _dark.scss.
10
+ // Downstream packages can @use this file to access semantic names.
11
+
12
+ $color-bg: var(--mastors-bg) !default;
13
+ $color-bg-subtle: var(--mastors-bg-subtle) !default;
14
+ $color-surface: var(--mastors-surface) !default;
15
+ $color-surface-raised: var(--mastors-surface-raised) !default;
16
+ $color-surface-overlay: var(--mastors-surface-overlay) !default;
17
+
18
+ $color-text: var(--mastors-text) !default;
19
+ $color-text-muted: var(--mastors-text-muted) !default;
20
+ $color-text-subtle: var(--mastors-text-subtle) !default;
21
+ $color-text-inverse: var(--mastors-text-inverse) !default;
22
+
23
+ $color-border: var(--mastors-border) !default;
24
+ $color-border-strong: var(--mastors-border-strong) !default;
25
+
26
+ $color-accent: var(--mastors-accent) !default;
27
+ $color-accent-hover: var(--mastors-accent-hover) !default;
28
+ $color-accent-subtle: var(--mastors-accent-subtle) !default;
29
+ $color-accent-text: var(--mastors-accent-text) !default;
@@ -0,0 +1,6 @@
1
+ // semantic/_index.scss
2
+ // ─────────────────────────────────────────────────────────────
3
+
4
+ @forward "colors";
5
+ @forward "spacing";
6
+ @forward "typography";
@@ -0,0 +1,13 @@
1
+ // semantic/_spacing.scss
2
+ // Semantic spacing aliases (layout-level naming).
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "../tokens/spacing" as sp;
6
+
7
+ // Semantic spacing aliases — layout-level naming on top of raw scale tokens.
8
+
9
+ $space-inline: sp.spacing(1) !default; // 0.25rem — tight inline gap
10
+ $space-element: sp.spacing(2) !default; // 0.5rem — within a component
11
+ $space-component: sp.spacing(4) !default; // 1rem — between component parts
12
+ $space-section: sp.spacing(16) !default; // 4rem — between page sections
13
+ $space-page: sp.spacing(24) !default; // 6rem — page-level breathing room
@@ -0,0 +1,13 @@
1
+ // semantic/_typography.scss
2
+ // Semantic typography aliases (role-based naming).
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "../tokens/typography" as ty;
6
+
7
+ // Semantic typography role aliases.
8
+
9
+ $font-display: ty.font-family("sans") !default; // Hero headings
10
+ $font-heading: ty.font-family("sans") !default; // h1–h6
11
+ $font-body: ty.font-family("sans") !default; // p, li, td
12
+ $font-mono: ty.font-family("mono") !default; // code, pre, kbd
13
+ $font-ui: ty.font-family("sans") !default; // labels, buttons, nav
@@ -0,0 +1,28 @@
1
+ // themes/_base-theme.scss
2
+ // Shared theme structure — reference doc only, not emitted.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ // The light and dark themes (_light.scss, _dark.scss) are the actual emitters.
6
+ // This file documents the full semantic custom property contract
7
+ // that all themes must implement, without producing any CSS output.
8
+ // Semantic custom properties contract:
9
+ // Surfaces
10
+ // --mastors-bg ← page background
11
+ // --mastors-bg-subtle ← subdued page background
12
+ // --mastors-surface ← card / panel surface
13
+ // --mastors-surface-raised ← elevated surface (dropdowns, tooltips)
14
+ // --mastors-surface-overlay ← modal/overlay surface
15
+ // Text
16
+ // --mastors-text ← primary text
17
+ // --mastors-text-muted ← secondary / supporting text
18
+ // --mastors-text-subtle ← tertiary / placeholder text
19
+ // --mastors-text-inverse ← text on dark/accent surfaces
20
+ // Borders
21
+ // --mastors-border ← default border
22
+ // --mastors-border-strong ← emphasis border
23
+ // Brand / Accent
24
+ // --mastors-accent ← primary brand color
25
+ // --mastors-accent-hover ← accent hover state
26
+ // --mastors-accent-subtle ← light accent tint
27
+ // --mastors-accent-text ← text on accent backgrounds
28
+
@@ -0,0 +1,59 @@
1
+ // themes/_dark.scss
2
+ // Dark theme CSS custom property overrides.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "../tokens/color" as ct;
6
+
7
+ // Dark theme — inverts surface/text/border semantics.
8
+ // Strategy is controlled by $dark-mode-strategy (default: "class").
9
+ // "class" → activated by .dark / [data-theme="dark"] on <html>
10
+ // "media" → activated by prefers-color-scheme: dark
11
+
12
+ $dark-mode-strategy: "class" !default;
13
+
14
+ @if $dark-mode-strategy == "class" {
15
+ [data-theme="dark"],
16
+ .dark {
17
+ --mastors-bg: #{ct.color("neutral", 950)};
18
+ --mastors-bg-subtle: #{ct.color("neutral", 900)};
19
+ --mastors-surface: #{ct.color("neutral", 900)};
20
+ --mastors-surface-raised: #{ct.color("neutral", 800)};
21
+ --mastors-surface-overlay: #{ct.color("neutral", 700)};
22
+
23
+ --mastors-text: #{ct.color("neutral", 50)};
24
+ --mastors-text-muted: #{ct.color("neutral", 400)};
25
+ --mastors-text-subtle: #{ct.color("neutral", 500)};
26
+ --mastors-text-inverse: #{ct.color("neutral", 900)};
27
+
28
+ --mastors-border: #{ct.color("neutral", 700)};
29
+ --mastors-border-strong: #{ct.color("neutral", 500)};
30
+
31
+ --mastors-accent: #{ct.color("primary", 400)};
32
+ --mastors-accent-hover: #{ct.color("primary", 300)};
33
+ --mastors-accent-subtle: #{ct.color("primary", 950)};
34
+ --mastors-accent-text: #{ct.color("neutral", 950)};
35
+ }
36
+ } @else {
37
+ @media (prefers-color-scheme: dark) {
38
+ :root {
39
+ --mastors-bg: #{ct.color("neutral", 950)};
40
+ --mastors-bg-subtle: #{ct.color("neutral", 900)};
41
+ --mastors-surface: #{ct.color("neutral", 900)};
42
+ --mastors-surface-raised: #{ct.color("neutral", 800)};
43
+ --mastors-surface-overlay: #{ct.color("neutral", 700)};
44
+
45
+ --mastors-text: #{ct.color("neutral", 50)};
46
+ --mastors-text-muted: #{ct.color("neutral", 400)};
47
+ --mastors-text-subtle: #{ct.color("neutral", 500)};
48
+ --mastors-text-inverse: #{ct.color("neutral", 900)};
49
+
50
+ --mastors-border: #{ct.color("neutral", 700)};
51
+ --mastors-border-strong: #{ct.color("neutral", 500)};
52
+
53
+ --mastors-accent: #{ct.color("primary", 400)};
54
+ --mastors-accent-hover: #{ct.color("primary", 300)};
55
+ --mastors-accent-subtle: #{ct.color("primary", 950)};
56
+ --mastors-accent-text: #{ct.color("neutral", 950)};
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,6 @@
1
+ // themes/_index.scss
2
+ // ─────────────────────────────────────────────────────────────
3
+
4
+ @forward "light";
5
+ @forward "dark";
6
+ @forward "base-theme";
@@ -0,0 +1,31 @@
1
+ // themes/_light.scss
2
+ // Light theme CSS custom property overrides.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "../tokens/color" as ct;
6
+
7
+ // Light theme — explicit override (identical to base, but declared
8
+ // so a .light class or data-theme can be toggled back from dark).
9
+
10
+ :root,
11
+ [data-theme="light"],
12
+ .light {
13
+ --mastors-bg: #{ct.color("white")};
14
+ --mastors-bg-subtle: #{ct.color("neutral", 50)};
15
+ --mastors-surface: #{ct.color("white")};
16
+ --mastors-surface-raised: #{ct.color("neutral", 50)};
17
+ --mastors-surface-overlay: #{ct.color("neutral", 100)};
18
+
19
+ --mastors-text: #{ct.color("neutral", 900)};
20
+ --mastors-text-muted: #{ct.color("neutral", 500)};
21
+ --mastors-text-subtle: #{ct.color("neutral", 400)};
22
+ --mastors-text-inverse: #{ct.color("white")};
23
+
24
+ --mastors-border: #{ct.color("neutral", 200)};
25
+ --mastors-border-strong: #{ct.color("neutral", 400)};
26
+
27
+ --mastors-accent: #{ct.color("primary", 600)};
28
+ --mastors-accent-hover: #{ct.color("primary", 700)};
29
+ --mastors-accent-subtle: #{ct.color("primary", 50)};
30
+ --mastors-accent-text: #{ct.color("white")};
31
+ }
@@ -0,0 +1,100 @@
1
+ // tokens/_color.scss
2
+ // Design token map: color palette (primitives).
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "sass:map";
6
+
7
+ $color-tokens: (
8
+ "primary": (
9
+ "50": #eff6ff,
10
+ "100": #dbeafe,
11
+ "200": #bfdbfe,
12
+ "300": #93c5fd,
13
+ "400": #60a5fa,
14
+ "500": #3b82f6,
15
+ "600": #2563eb,
16
+ "700": #1d4ed8,
17
+ "800": #1e40af,
18
+ "900": #1e3a8a,
19
+ "950": #172554,
20
+ ),
21
+ "neutral": (
22
+ "50": #f9fafb,
23
+ "100": #f3f4f6,
24
+ "200": #e5e7eb,
25
+ "300": #d1d5db,
26
+ "400": #9ca3af,
27
+ "500": #6b7280,
28
+ "600": #4b5563,
29
+ "700": #374151,
30
+ "800": #1f2937,
31
+ "900": #111827,
32
+ "950": #030712,
33
+ ),
34
+ "success": (
35
+ "50": #f0fdf4,
36
+ "100": #dcfce7,
37
+ "200": #bbf7d0,
38
+ "300": #86efac,
39
+ "400": #4ade80,
40
+ "500": #22c55e,
41
+ "600": #16a34a,
42
+ "700": #15803d,
43
+ "800": #166534,
44
+ "900": #14532d,
45
+ "950": #052e16,
46
+ ),
47
+ "warning": (
48
+ "50": #fffbeb,
49
+ "100": #fef3c7,
50
+ "200": #fde68a,
51
+ "300": #fcd34d,
52
+ "400": #fbbf24,
53
+ "500": #f59e0b,
54
+ "600": #d97706,
55
+ "700": #b45309,
56
+ "800": #92400e,
57
+ "900": #78350f,
58
+ "950": #451a03,
59
+ ),
60
+ "error": (
61
+ "50": #fef2f2,
62
+ "100": #fee2e2,
63
+ "200": #fecaca,
64
+ "300": #fca5a5,
65
+ "400": #f87171,
66
+ "500": #ef4444,
67
+ "600": #dc2626,
68
+ "700": #b91c1c,
69
+ "800": #991b1b,
70
+ "900": #7f1d1d,
71
+ "950": #450a0a,
72
+ ),
73
+ "info": (
74
+ "50": #ecfeff,
75
+ "100": #cffafe,
76
+ "200": #a5f3fc,
77
+ "300": #67e8f9,
78
+ "400": #22d3ee,
79
+ "500": #06b6d4,
80
+ "600": #0891b2,
81
+ "700": #0e7490,
82
+ "800": #155e75,
83
+ "900": #164e63,
84
+ "950": #083344,
85
+ ),
86
+ "white": #fff,
87
+ "black": #000,
88
+ "transparent": transparent,
89
+ ) !default;
90
+
91
+ // Accessor: color("primary", 600)
92
+ @function color($palette, $shade: null) {
93
+ $p: map.get($color-tokens, $palette);
94
+
95
+ @if $shade {
96
+ @return map.get($p, "#{$shade}");
97
+ }
98
+
99
+ @return $p;
100
+ }
@@ -0,0 +1,12 @@
1
+ // tokens/_index.scss
2
+ // ─────────────────────────────────────────────────────────────
3
+
4
+ @forward "color";
5
+ @forward "spacing";
6
+ @forward "typography";
7
+ @forward "shadows";
8
+ @forward "radii";
9
+ @forward "transitions";
10
+ @forward "z-index";
11
+ @forward "opacity";
12
+ @forward "sizing";
@@ -0,0 +1,28 @@
1
+ // tokens/_opacity.scss
2
+ // Design token map: opacity scale.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "sass:map";
6
+
7
+ $opacity-tokens: (
8
+ "0": 0,
9
+ "5": 0.05,
10
+ "10": 0.1,
11
+ "15": 0.15,
12
+ "20": 0.2,
13
+ "25": 0.25,
14
+ "30": 0.3,
15
+ "40": 0.4,
16
+ "50": 0.5,
17
+ "60": 0.6,
18
+ "70": 0.7,
19
+ "75": 0.75,
20
+ "80": 0.8,
21
+ "90": 0.9,
22
+ "95": 0.95,
23
+ "100": 1,
24
+ ) !default;
25
+
26
+ @function opacity($key) {
27
+ @return map.get($opacity-tokens, "#{$key}");
28
+ }
@@ -0,0 +1,21 @@
1
+ // tokens/_radii.scss
2
+ // Design token map: border-radius scale.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "sass:map";
6
+
7
+ $radius-tokens: (
8
+ "none": 0px,
9
+ "sm": 0.125rem,
10
+ "base": 0.25rem,
11
+ "md": 0.375rem,
12
+ "lg": 0.5rem,
13
+ "xl": 0.75rem,
14
+ "2xl": 1rem,
15
+ "3xl": 1.5rem,
16
+ "full": 9999px,
17
+ ) !default;
18
+
19
+ @function radius($key) {
20
+ @return map.get($radius-tokens, $key);
21
+ }
@@ -0,0 +1,20 @@
1
+ // tokens/_shadows.scss
2
+ // Design token map: box-shadow elevation scale.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "sass:map";
6
+
7
+ $shadow-tokens: (
8
+ "xs": (0 1px 2px 0 rgb(0 0 0 / 5%)),
9
+ "sm": (0 1px 3px 0 rgb(0 0 0 / 10%), 0 1px 2px -1px rgb(0 0 0 / 10%)),
10
+ "md": (0 4px 6px -1px rgb(0 0 0 / 10%), 0 2px 4px -2px rgb(0 0 0 / 10%)),
11
+ "lg": (0 10px 15px -3px rgb(0 0 0 / 10%), 0 4px 6px -4px rgb(0 0 0 / 10%)),
12
+ "xl": (0 20px 25px -5px rgb(0 0 0 / 10%), 0 8px 10px -6px rgb(0 0 0 / 10%)),
13
+ "2xl": (0 25px 50px -12px rgb(0 0 0 / 25%)),
14
+ "inner": (inset 0 2px 4px 0 rgb(0 0 0 / 5%)),
15
+ "none": none,
16
+ ) !default;
17
+
18
+ @function shadow($key) {
19
+ @return map.get($shadow-tokens, $key);
20
+ }
@@ -0,0 +1,47 @@
1
+ // tokens/_sizing.scss
2
+ // Design token map: width / height / size scale.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "sass:map";
6
+
7
+ $sizing-tokens: (
8
+ "0": 0,
9
+ "px": 1px,
10
+ "1": 0.25rem,
11
+ "2": 0.5rem,
12
+ "4": 1rem,
13
+ "8": 2rem,
14
+ "12": 3rem,
15
+ "16": 4rem,
16
+ "20": 5rem,
17
+ "24": 6rem,
18
+ "32": 8rem,
19
+ "40": 10rem,
20
+ "48": 12rem,
21
+ "56": 14rem,
22
+ "64": 16rem,
23
+ "72": 18rem,
24
+ "80": 20rem,
25
+ "96": 24rem,
26
+ "1\\/2": 50%,
27
+ "1\\/3": 33.3333%,
28
+ "2\\/3": 66.6667%,
29
+ "1\\/4": 25%,
30
+ "3\\/4": 75%,
31
+ "1\\/5": 20%,
32
+ "2\\/5": 40%,
33
+ "3\\/5": 60%,
34
+ "4\\/5": 80%,
35
+ "auto": auto,
36
+ "full": 100%,
37
+ "screen": 100vw,
38
+ "svw": 100svw,
39
+ "dvw": 100dvw,
40
+ "min": min-content,
41
+ "max": max-content,
42
+ "fit": fit-content,
43
+ ) !default;
44
+
45
+ @function sizing($key) {
46
+ @return map.get($sizing-tokens, "#{$key}");
47
+ }
@@ -0,0 +1,48 @@
1
+ // tokens/_spacing.scss
2
+ // Design token map: spacing scale.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "sass:map";
6
+
7
+ $spacing-tokens: (
8
+ "0": 0px,
9
+ "px": 1px,
10
+ "0\\.5": 0.125rem,
11
+ "1": 0.25rem,
12
+ "1\\.5": 0.375rem,
13
+ "2": 0.5rem,
14
+ "2\\.5": 0.625rem,
15
+ "3": 0.75rem,
16
+ "3\\.5": 0.875rem,
17
+ "4": 1rem,
18
+ "5": 1.25rem,
19
+ "6": 1.5rem,
20
+ "7": 1.75rem,
21
+ "8": 2rem,
22
+ "9": 2.25rem,
23
+ "10": 2.5rem,
24
+ "11": 2.75rem,
25
+ "12": 3rem,
26
+ "14": 3.5rem,
27
+ "16": 4rem,
28
+ "20": 5rem,
29
+ "24": 6rem,
30
+ "28": 7rem,
31
+ "32": 8rem,
32
+ "36": 9rem,
33
+ "40": 10rem,
34
+ "44": 11rem,
35
+ "48": 12rem,
36
+ "52": 13rem,
37
+ "56": 14rem,
38
+ "60": 15rem,
39
+ "64": 16rem,
40
+ "72": 18rem,
41
+ "80": 20rem,
42
+ "96": 24rem,
43
+ ) !default;
44
+
45
+ // Accessor: spacing(4) → 1rem
46
+ @function spacing($key) {
47
+ @return map.get($spacing-tokens, "#{$key}");
48
+ }
@@ -0,0 +1,27 @@
1
+ // tokens/_transitions.scss
2
+ // Design token map: duration and easing curves.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "sass:map";
6
+
7
+ $duration-tokens: (
8
+ "75": 75ms,
9
+ "100": 100ms,
10
+ "150": 150ms,
11
+ "200": 200ms,
12
+ "300": 300ms,
13
+ "500": 500ms,
14
+ "700": 700ms,
15
+ "1000": 1000ms,
16
+ ) !default;
17
+
18
+ $easing-tokens: (
19
+ "linear": linear,
20
+ "in": cubic-bezier(0.4, 0, 1, 1),
21
+ "out": cubic-bezier(0, 0, 0.2, 1),
22
+ "in-out": cubic-bezier(0.4, 0, 0.2, 1),
23
+ "bounce": cubic-bezier(0.34, 1.56, 0.64, 1),
24
+ ) !default;
25
+
26
+ @function duration($key) { @return map.get($duration-tokens, "#{$key}"); }
27
+ @function easing($key) { @return map.get($easing-tokens, $key); }
@@ -0,0 +1,63 @@
1
+ // tokens/_typography.scss
2
+ // Design token map: type scale, font families, weights, tracking.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "sass:map";
6
+
7
+ $font-size-tokens: (
8
+ "xs": 0.75rem,
9
+ "sm": 0.875rem,
10
+ "base": 1rem,
11
+ "lg": 1.125rem,
12
+ "xl": 1.25rem,
13
+ "2xl": 1.5rem,
14
+ "3xl": 1.875rem,
15
+ "4xl": 2.25rem,
16
+ "5xl": 3rem,
17
+ "6xl": 3.75rem,
18
+ "7xl": 4.5rem,
19
+ "8xl": 6rem,
20
+ "9xl": 8rem,
21
+ ) !default;
22
+
23
+ $font-family-tokens: (
24
+ "sans": (system-ui, -apple-system, "BlinkMacSystemFont", "Segoe UI", "Roboto", sans-serif),
25
+ "serif": ("Georgia", "Cambria", "Times New Roman", "Times", serif),
26
+ "mono": (ui-monospace, "SFMono-Regular", "Menlo", "Monaco", "Consolas", monospace),
27
+ ) !default;
28
+
29
+ $font-weight-tokens: (
30
+ "thin": 100,
31
+ "extralight": 200,
32
+ "light": 300,
33
+ "normal": 400,
34
+ "medium": 500,
35
+ "semibold": 600,
36
+ "bold": 700,
37
+ "extrabold": 800,
38
+ "black": 900,
39
+ ) !default;
40
+
41
+ $line-height-tokens: (
42
+ "none": 1,
43
+ "tight": 1.25,
44
+ "snug": 1.375,
45
+ "normal": 1.5,
46
+ "relaxed": 1.625,
47
+ "loose": 2,
48
+ ) !default;
49
+
50
+ $letter-spacing-tokens: (
51
+ "tighter": -0.05em,
52
+ "tight": -0.025em,
53
+ "normal": 0,
54
+ "wide": 0.025em,
55
+ "wider": 0.05em,
56
+ "widest": 0.1em,
57
+ ) !default;
58
+
59
+ @function font-size($key) { @return map.get($font-size-tokens, $key); }
60
+ @function font-family($key) { @return map.get($font-family-tokens, $key); }
61
+ @function font-weight($key) { @return map.get($font-weight-tokens, $key); }
62
+ @function line-height($key) { @return map.get($line-height-tokens, $key); }
63
+ @function letter-spacing($key) { @return map.get($letter-spacing-tokens, $key); }
@@ -0,0 +1,21 @@
1
+ // tokens/_z-index.scss
2
+ // Design token map: z-index stacking layers.
3
+ // ─────────────────────────────────────────────────────────────
4
+
5
+ @use "sass:map";
6
+
7
+ $z-index-tokens: (
8
+ "base": 0,
9
+ "raised": 10,
10
+ "dropdown": 100,
11
+ "sticky": 200,
12
+ "overlay": 300,
13
+ "modal": 400,
14
+ "toast": 500,
15
+ "tooltip": 600,
16
+ "max": 9999,
17
+ ) !default;
18
+
19
+ @function z($key) {
20
+ @return map.get($z-index-tokens, $key);
21
+ }