fractalstyler2 0.4.0 → 0.7.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.
- package/README.md +114 -95
- package/dist/cli.js +105 -25
- package/dist/components/Accordion.svelte +44 -0
- package/dist/components/Accordion.svelte.d.ts +23 -0
- package/dist/components/AccordionItem.svelte +44 -0
- package/dist/components/AccordionItem.svelte.d.ts +21 -0
- package/dist/components/AppShell.svelte +86 -0
- package/dist/components/AppShell.svelte.d.ts +39 -0
- package/dist/components/ColorPicker.svelte +38 -0
- package/dist/components/ColorPicker.svelte.d.ts +6 -0
- package/dist/components/Hero.svelte +14 -0
- package/dist/components/Hero.svelte.d.ts +9 -0
- package/dist/components/LayoutPicker.svelte +34 -0
- package/dist/components/LayoutPicker.svelte.d.ts +6 -0
- package/dist/components/MotionPicker.svelte +34 -0
- package/dist/components/MotionPicker.svelte.d.ts +6 -0
- package/dist/components/PageShell.svelte +14 -0
- package/dist/components/PageShell.svelte.d.ts +9 -0
- package/dist/components/PageSplit.svelte +26 -0
- package/dist/components/PageSplit.svelte.d.ts +18 -0
- package/dist/components/ShapePicker.svelte +37 -0
- package/dist/components/ShapePicker.svelte.d.ts +6 -0
- package/dist/css/fractalstyler.css +10643 -0
- package/dist/css/fractalstyler.min.css +2 -0
- package/dist/index.d.ts +18 -6
- package/dist/index.js +30 -12
- package/dist/mcp/schemas/compile_fractals.json +3 -3
- package/dist/mcp/schemas/css_to_fractals.json +1 -1
- package/dist/mcp/schemas/generate_component.json +2 -2
- package/dist/mcp/schemas/instructions.md +41 -14
- package/dist/mcp/schemas/list_fractals.json +9 -7
- package/dist/mcp/schemas/validate_recipe.json +2 -2
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +334 -237
- package/dist/presets.core.d.ts +42 -0
- package/dist/presets.core.js +190 -0
- package/dist/presets.svelte.d.ts +6 -0
- package/dist/presets.svelte.js +21 -0
- package/dist/styles/_00_presets.sass +111 -0
- package/dist/styles/_00_themes.sass +1061 -0
- package/dist/styles/_00_tokens.sass +57 -17
- package/dist/styles/_01_config.sass +77 -70
- package/dist/styles/_02_dimensions.sass +174 -0
- package/dist/styles/_03_containers.sass +105 -0
- package/dist/styles/_04_layouts.sass +100 -0
- package/dist/styles/_05_shells.sass +374 -0
- package/dist/styles/_06_visuals.sass +236 -0
- package/dist/styles/_07_interactions.sass +112 -0
- package/dist/styles/_08_own.sass +4 -0
- package/dist/styles/canonical-markups.md +160 -0
- package/dist/styles/index.sass +11 -18
- package/dist/themes.d.ts +7 -0
- package/dist/themes.js +45 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +2 -0
- package/package.json +26 -15
- package/plugin.json +11 -10
- package/registry.json +2002 -0
- package/skills/fractal-styler/SKILL.md +137 -50
- package/skills/fractal-styler/references/fractals.md +416 -28
- package/skills/fractal-styler/references/tokens.md +110 -36
- package/dist/styles/_02_fonts.sass +0 -13
- package/dist/styles/_03_responsive.sass +0 -31
- package/dist/styles/_04_atoms.sass +0 -155
- package/dist/styles/_05_molecules.sass +0 -97
- package/dist/styles/_06_recipes.sass +0 -189
- package/dist/styles/_07_base.sass +0 -44
- package/dist/styles/_08_blocks.sass +0 -433
- package/dist/styles/_09_utilities.sass +0 -208
- package/dist/styles/_10_layouts.sass +0 -373
- package/dist/styles/_11_own.sass +0 -21
- package/dist/styles/_fractals.sass +0 -14
- package/skills/style-migration/SKILL.md +0 -45
- package/templates/_00_tokens.sass +0 -136
- package/templates/_01_config.sass +0 -66
- package/templates/_02_fonts.sass +0 -13
- package/templates/_03_responsive.sass +0 -31
- package/templates/_04_atoms.sass +0 -155
- package/templates/_05_molecules.sass +0 -97
- package/templates/_06_recipes.sass +0 -189
- package/templates/_07_base.sass +0 -44
- package/templates/_08_blocks.sass +0 -433
- package/templates/_09_utilities.sass +0 -207
- package/templates/_10_layouts.sass +0 -373
- package/templates/_11_own.sass +0 -21
- package/templates/_fractals.sass +0 -14
- package/templates/index.sass +0 -18
package/templates/_04_atoms.sass
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
// =============================================================================
|
|
2
|
-
// 04_ATOMS — the indivisible units. One visual decision each.
|
|
3
|
-
// -----------------------------------------------------------------------------
|
|
4
|
-
// Every atom is a mixin. Call it inside a class to compose, or let
|
|
5
|
-
// _09_utilities.sass project it to a utility class. Same fractal, two consumers.
|
|
6
|
-
// =============================================================================
|
|
7
|
-
|
|
8
|
-
@use '01_config' as *
|
|
9
|
-
|
|
10
|
-
// --- Flow: the two axes of layout ------------------------------------------
|
|
11
|
-
// A box is a vertical stack, a row is horizontal. Optional semantic alignment:
|
|
12
|
-
// +box(center) → items centered on the cross axis
|
|
13
|
-
// +row(between, center) → spread on main axis, centered on cross axis
|
|
14
|
-
=box($x: null, $y: null)
|
|
15
|
-
display: flex
|
|
16
|
-
flex-direction: column
|
|
17
|
-
@if $x
|
|
18
|
-
align-items: align($x)
|
|
19
|
-
@if $y
|
|
20
|
-
justify-content: align($y)
|
|
21
|
-
|
|
22
|
-
=row($x: null, $y: null)
|
|
23
|
-
display: flex
|
|
24
|
-
flex-direction: row
|
|
25
|
-
@if $x
|
|
26
|
-
justify-content: align($x)
|
|
27
|
-
@if $y
|
|
28
|
-
align-items: align($y)
|
|
29
|
-
|
|
30
|
-
=wrap
|
|
31
|
-
flex-wrap: wrap
|
|
32
|
-
|
|
33
|
-
=grid($cols: 1)
|
|
34
|
-
display: grid
|
|
35
|
-
grid-template-columns: repeat($cols, minmax(0, 1fr))
|
|
36
|
-
|
|
37
|
-
// A grid that reflows on its own — no breakpoints, no counting columns.
|
|
38
|
-
=auto-grid($min: 15rem, $gap: s)
|
|
39
|
-
display: grid
|
|
40
|
-
grid-template-columns: repeat(auto-fit, minmax(min(#{$min}, 100%), 1fr))
|
|
41
|
-
gap: space($gap)
|
|
42
|
-
|
|
43
|
-
// Dead-center anything (grid is the one-liner that works for a single child).
|
|
44
|
-
=center
|
|
45
|
-
display: grid
|
|
46
|
-
place-items: center
|
|
47
|
-
|
|
48
|
-
// --- Spacing ---------------------------------------------------------------
|
|
49
|
-
=gap($v: s)
|
|
50
|
-
gap: space($v)
|
|
51
|
-
|
|
52
|
-
=pad($v: s)
|
|
53
|
-
padding: space($v)
|
|
54
|
-
|
|
55
|
-
=px($v: s)
|
|
56
|
-
padding-inline: space($v)
|
|
57
|
-
|
|
58
|
-
=py($v: s)
|
|
59
|
-
padding-block: space($v)
|
|
60
|
-
|
|
61
|
-
=mx-auto
|
|
62
|
-
margin-inline: auto
|
|
63
|
-
|
|
64
|
-
=my-auto
|
|
65
|
-
margin-block: auto
|
|
66
|
-
|
|
67
|
-
// --- Size ------------------------------------------------------------------
|
|
68
|
-
=w($v: 100%)
|
|
69
|
-
width: $v
|
|
70
|
-
|
|
71
|
-
=h($v: 100%)
|
|
72
|
-
height: $v
|
|
73
|
-
|
|
74
|
-
=full
|
|
75
|
-
width: 100%
|
|
76
|
-
height: 100%
|
|
77
|
-
|
|
78
|
-
=square($v)
|
|
79
|
-
width: $v
|
|
80
|
-
height: $v
|
|
81
|
-
|
|
82
|
-
=grow($n: 1)
|
|
83
|
-
flex-grow: $n
|
|
84
|
-
|
|
85
|
-
=shrink($n: 0)
|
|
86
|
-
flex-shrink: $n
|
|
87
|
-
|
|
88
|
-
=min0
|
|
89
|
-
min-width: 0
|
|
90
|
-
min-height: 0
|
|
91
|
-
|
|
92
|
-
// --- Surface & skin --------------------------------------------------------
|
|
93
|
-
=bg($role: surface)
|
|
94
|
-
background-color: surface($role)
|
|
95
|
-
|
|
96
|
-
=ink($role: primary)
|
|
97
|
-
color: ink($role)
|
|
98
|
-
|
|
99
|
-
=border($side: all, $color: var(--border))
|
|
100
|
-
@if $side == all
|
|
101
|
-
border: 1px solid $color
|
|
102
|
-
@else
|
|
103
|
-
border-#{$side}: 1px solid $color
|
|
104
|
-
|
|
105
|
-
=radius($v: 4)
|
|
106
|
-
border-radius: radius($v)
|
|
107
|
-
|
|
108
|
-
=shadow($v: md)
|
|
109
|
-
box-shadow: shadow($v)
|
|
110
|
-
|
|
111
|
-
// --- Position --------------------------------------------------------------
|
|
112
|
-
=relative
|
|
113
|
-
position: relative
|
|
114
|
-
|
|
115
|
-
=absolute($inset: null)
|
|
116
|
-
position: absolute
|
|
117
|
-
@if $inset
|
|
118
|
-
inset: $inset
|
|
119
|
-
|
|
120
|
-
=sticky($top: 0)
|
|
121
|
-
position: sticky
|
|
122
|
-
top: $top
|
|
123
|
-
|
|
124
|
-
=fill
|
|
125
|
-
position: absolute
|
|
126
|
-
inset: 0
|
|
127
|
-
|
|
128
|
-
// --- Type ------------------------------------------------------------------
|
|
129
|
-
=type($v)
|
|
130
|
-
font-size: text-size($v)
|
|
131
|
-
|
|
132
|
-
=weight($w: 500)
|
|
133
|
-
font-weight: $w
|
|
134
|
-
|
|
135
|
-
=leading($lh: 1.5)
|
|
136
|
-
line-height: $lh
|
|
137
|
-
|
|
138
|
-
=truncate
|
|
139
|
-
overflow: hidden
|
|
140
|
-
white-space: nowrap
|
|
141
|
-
text-overflow: ellipsis
|
|
142
|
-
|
|
143
|
-
=clamp-lines($n: 2)
|
|
144
|
-
display: -webkit-box
|
|
145
|
-
-webkit-line-clamp: $n
|
|
146
|
-
-webkit-box-orient: vertical
|
|
147
|
-
overflow: hidden
|
|
148
|
-
|
|
149
|
-
// --- Motion ----------------------------------------------------------------
|
|
150
|
-
=transition($props: all, $dur: 150ms, $ease: ease)
|
|
151
|
-
transition: $props $dur $ease
|
|
152
|
-
|
|
153
|
-
=ring($color: var(--ring))
|
|
154
|
-
outline: 2px solid $color
|
|
155
|
-
outline-offset: 1px
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
// =============================================================================
|
|
2
|
-
// 05_MOLECULES — self-similar: each is a small graph of atom fractals.
|
|
3
|
-
// -----------------------------------------------------------------------------
|
|
4
|
-
// This is the payoff of the model. A molecule reads like a recipe of atoms,
|
|
5
|
-
// and a component (next layer up) reads like a recipe of molecules. Same move
|
|
6
|
-
// at every scale — that is the "fractal" in fractalstyler2.
|
|
7
|
-
// =============================================================================
|
|
8
|
-
|
|
9
|
-
@use 'sass:string'
|
|
10
|
-
@use '01_config' as *
|
|
11
|
-
@use '04_atoms' as *
|
|
12
|
-
@use '03_responsive' as *
|
|
13
|
-
|
|
14
|
-
// Stack — vertical rhythm with one shared gap.
|
|
15
|
-
=stack($gap: xs, $x: null)
|
|
16
|
-
+box($x)
|
|
17
|
-
+gap($gap)
|
|
18
|
-
|
|
19
|
-
// Cluster — wrapping row of chips/tags/buttons.
|
|
20
|
-
=cluster($gap: xs, $x: start, $y: center)
|
|
21
|
-
+row($x, $y)
|
|
22
|
-
+wrap
|
|
23
|
-
+gap($gap)
|
|
24
|
-
|
|
25
|
-
// Center — a centered reading column bounded by a measure.
|
|
26
|
-
=center-column($max: var(--measure, 60ch), $pad: s)
|
|
27
|
-
max-width: $max
|
|
28
|
-
+mx-auto
|
|
29
|
-
+px($pad)
|
|
30
|
-
|
|
31
|
-
// Cover — fills a min-height with a centered focal child.
|
|
32
|
-
=cover($min: 100vh, $pad: s)
|
|
33
|
-
+box
|
|
34
|
-
min-height: $min
|
|
35
|
-
+pad($pad)
|
|
36
|
-
> *
|
|
37
|
-
margin-block: 0
|
|
38
|
-
> .center
|
|
39
|
-
+my-auto
|
|
40
|
-
|
|
41
|
-
// Frame — fixed aspect-ratio media box.
|
|
42
|
-
=frame($ratio: '16 / 9')
|
|
43
|
-
aspect-ratio: string.unquote('#{$ratio}')
|
|
44
|
-
overflow: hidden
|
|
45
|
-
position: relative
|
|
46
|
-
> *
|
|
47
|
-
+full
|
|
48
|
-
> :is(img, video, iframe)
|
|
49
|
-
object-fit: cover
|
|
50
|
-
|
|
51
|
-
// Reel — horizontal scroll-snap rail.
|
|
52
|
-
=reel($gap: xs)
|
|
53
|
-
+row
|
|
54
|
-
+gap($gap)
|
|
55
|
-
overflow-x: auto
|
|
56
|
-
overscroll-behavior-inline: contain
|
|
57
|
-
scroll-snap-type: inline mandatory
|
|
58
|
-
> *
|
|
59
|
-
scroll-snap-align: start
|
|
60
|
-
flex: 0 0 auto
|
|
61
|
-
|
|
62
|
-
// Sidebar — an intrinsic rail beside a fluid main; wraps when tight.
|
|
63
|
-
=with-sidebar($rail: 240px, $gap: s, $min: 60%)
|
|
64
|
-
+row
|
|
65
|
-
+wrap
|
|
66
|
-
+gap($gap)
|
|
67
|
-
> .rail
|
|
68
|
-
flex-basis: $rail
|
|
69
|
-
flex-grow: 1
|
|
70
|
-
> .flow
|
|
71
|
-
flex-basis: 0
|
|
72
|
-
flex-grow: 999
|
|
73
|
-
min-width: $min
|
|
74
|
-
|
|
75
|
-
// Surface — the "material" fractal: skin + border + optional radius + optional padding + elevation.
|
|
76
|
-
// The building block of every card/panel/popover.
|
|
77
|
-
=surface($bg: surface, $pad: null, $radius: 6, $elevation: none)
|
|
78
|
-
+bg($bg)
|
|
79
|
-
@if $radius != null
|
|
80
|
-
+radius($radius)
|
|
81
|
-
@if $pad != null
|
|
82
|
-
+pad($pad)
|
|
83
|
-
@if $elevation != none
|
|
84
|
-
+shadow($elevation)
|
|
85
|
-
|
|
86
|
-
// Responsive column grid from a per-breakpoint map:
|
|
87
|
-
// +cols((base: 1, sm: 2, lg: 3))
|
|
88
|
-
=cols($map, $gap: s)
|
|
89
|
-
display: grid
|
|
90
|
-
grid-auto-flow: row
|
|
91
|
-
+gap($gap)
|
|
92
|
-
@each $bp, $n in $map
|
|
93
|
-
@if $bp == base
|
|
94
|
-
grid-template-columns: repeat($n, minmax(0, 1fr))
|
|
95
|
-
@else
|
|
96
|
-
+at($bp)
|
|
97
|
-
grid-template-columns: repeat($n, minmax(0, 1fr))
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
// =============================================================================
|
|
2
|
-
// 06_RECIPES — macro mixins. Compositions of molecules and atoms.
|
|
3
|
-
// -----------------------------------------------------------------------------
|
|
4
|
-
// Recipes are mixins, NOT locked CSS classes. They take arguments and allow
|
|
5
|
-
// custom components to compose standard patterns with flexible parameters.
|
|
6
|
-
// =============================================================================
|
|
7
|
-
|
|
8
|
-
@use '01_config' as *
|
|
9
|
-
@use '04_atoms' as *
|
|
10
|
-
@use '05_molecules' as *
|
|
11
|
-
|
|
12
|
-
// Universal interactive control primitive (Button, Select trigger, Accordion header)
|
|
13
|
-
=control($size: md, $radius: 4)
|
|
14
|
-
+row(null, center)
|
|
15
|
-
+gap(2xs)
|
|
16
|
-
+radius($radius)
|
|
17
|
-
+border(all, var(--border))
|
|
18
|
-
+bg(surface)
|
|
19
|
-
+ink(primary)
|
|
20
|
-
+weight(500)
|
|
21
|
-
user-select: none
|
|
22
|
-
cursor: pointer
|
|
23
|
-
text-decoration: none
|
|
24
|
-
transition: background 120ms ease, border-color 120ms ease, transform 80ms ease
|
|
25
|
-
|
|
26
|
-
@if $size == sm
|
|
27
|
-
height: var(--control-h-sm, 26px)
|
|
28
|
-
+px(2xs)
|
|
29
|
-
+type(xs)
|
|
30
|
-
@else if $size == lg
|
|
31
|
-
height: var(--control-h-lg, 38px)
|
|
32
|
-
+px(s)
|
|
33
|
-
+type(md)
|
|
34
|
-
@else
|
|
35
|
-
height: var(--control-h-md, 32px)
|
|
36
|
-
+px(xs)
|
|
37
|
-
+type(sm)
|
|
38
|
-
|
|
39
|
-
&:hover
|
|
40
|
-
+bg(raised)
|
|
41
|
-
border-color: var(--border-subtle)
|
|
42
|
-
|
|
43
|
-
&:active
|
|
44
|
-
transform: scale(0.985)
|
|
45
|
-
|
|
46
|
-
&:focus-visible
|
|
47
|
-
+ring
|
|
48
|
-
|
|
49
|
-
&:disabled, &[aria-disabled='true']
|
|
50
|
-
opacity: 0.5
|
|
51
|
-
cursor: not-allowed
|
|
52
|
-
pointer-events: none
|
|
53
|
-
|
|
54
|
-
// Select input recipe (with embedded SVG chevron and optical line-height)
|
|
55
|
-
=select($size: md, $radius: 4)
|
|
56
|
-
+control($size, $radius)
|
|
57
|
-
appearance: none
|
|
58
|
-
-webkit-appearance: none
|
|
59
|
-
padding-right: 28px
|
|
60
|
-
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%237F91AA' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E")
|
|
61
|
-
background-repeat: no-repeat
|
|
62
|
-
background-position: right 8px center
|
|
63
|
-
line-height: 1.2
|
|
64
|
-
cursor: pointer
|
|
65
|
-
width: 100%
|
|
66
|
-
|
|
67
|
-
// Partition divider recipe with guaranteed breathing room
|
|
68
|
-
=partition($side: top, $pad: s)
|
|
69
|
-
@if $side == top
|
|
70
|
-
margin-top: auto
|
|
71
|
-
padding-top: space($pad)
|
|
72
|
-
border-top: 1px solid var(--border)
|
|
73
|
-
@else if $side == bottom
|
|
74
|
-
margin-bottom: space($pad)
|
|
75
|
-
padding-bottom: space($pad)
|
|
76
|
-
border-bottom: 1px solid var(--border)
|
|
77
|
-
|
|
78
|
-
// Pure CSS collapsible transition (0fr -> 1fr grid transition)
|
|
79
|
-
=collapsible
|
|
80
|
-
display: grid
|
|
81
|
-
grid-template-rows: 0fr
|
|
82
|
-
transition: grid-template-rows 140ms cubic-bezier(0.16, 1, 0.3, 1)
|
|
83
|
-
|
|
84
|
-
&[data-open='true'], &[aria-expanded='true']
|
|
85
|
-
grid-template-rows: 1fr
|
|
86
|
-
|
|
87
|
-
> .collapsible-inner
|
|
88
|
-
overflow: hidden
|
|
89
|
-
min-height: 0
|
|
90
|
-
|
|
91
|
-
// Marquee animation recipe
|
|
92
|
-
=marquee($speed: 30s, $gap: 1rem)
|
|
93
|
-
overflow: hidden
|
|
94
|
-
display: flex
|
|
95
|
-
user-select: none
|
|
96
|
-
gap: $gap
|
|
97
|
-
position: relative
|
|
98
|
-
|
|
99
|
-
&[data-fade='true']
|
|
100
|
-
mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%)
|
|
101
|
-
|
|
102
|
-
> [data-slot='marquee-track']
|
|
103
|
-
display: flex
|
|
104
|
-
flex-shrink: 0
|
|
105
|
-
justify-content: space-around
|
|
106
|
-
gap: $gap
|
|
107
|
-
min-width: 100%
|
|
108
|
-
animation: marquee-scroll $speed linear infinite
|
|
109
|
-
|
|
110
|
-
&[data-pause='true']:hover > [data-slot='marquee-track']
|
|
111
|
-
animation-play-state: paused
|
|
112
|
-
|
|
113
|
-
// Card recipe — surface material + top-anchored vertical stack
|
|
114
|
-
=card($bg: surface, $pad: null, $radius: 6, $elevation: none)
|
|
115
|
-
+surface($bg, $pad, $radius, $elevation)
|
|
116
|
-
+box(stretch, start)
|
|
117
|
-
+gap(s)
|
|
118
|
-
height: 100%
|
|
119
|
-
text-align: left
|
|
120
|
-
|
|
121
|
-
// Button recipe
|
|
122
|
-
=button($size: md, $radius: 4)
|
|
123
|
-
+control($size, $radius)
|
|
124
|
-
justify-content: center
|
|
125
|
-
|
|
126
|
-
// Badge recipe — compact pill chip with subtle border
|
|
127
|
-
=badge
|
|
128
|
-
+row(center, center)
|
|
129
|
-
display: inline-flex
|
|
130
|
-
+gap(3xs)
|
|
131
|
-
+px(2xs)
|
|
132
|
-
+type(xs)
|
|
133
|
-
+weight(500)
|
|
134
|
-
+radius(3)
|
|
135
|
-
+bg(raised)
|
|
136
|
-
+ink(secondary)
|
|
137
|
-
+border(all, var(--border))
|
|
138
|
-
padding-block: 2px
|
|
139
|
-
|
|
140
|
-
// Input recipe — text entry field
|
|
141
|
-
=input
|
|
142
|
-
display: block
|
|
143
|
-
+w(100%)
|
|
144
|
-
+px(xs)
|
|
145
|
-
+type(sm)
|
|
146
|
-
+leading(1.5)
|
|
147
|
-
+border(all, var(--border))
|
|
148
|
-
+radius(4)
|
|
149
|
-
+bg(input)
|
|
150
|
-
+ink(primary)
|
|
151
|
-
height: var(--control-h-md, 32px)
|
|
152
|
-
transition: border-color 120ms ease, box-shadow 120ms ease
|
|
153
|
-
&:focus-visible, &:focus
|
|
154
|
-
outline: none
|
|
155
|
-
border-color: var(--theme-color)
|
|
156
|
-
box-shadow: 0 0 0 2px var(--ring)
|
|
157
|
-
|
|
158
|
-
// Keycap recipe
|
|
159
|
-
=kbd
|
|
160
|
-
display: inline-block
|
|
161
|
-
+px(3xs)
|
|
162
|
-
+type(xs)
|
|
163
|
-
+leading(1)
|
|
164
|
-
+radius(3)
|
|
165
|
-
+bg(raised)
|
|
166
|
-
border: 1px solid var(--border)
|
|
167
|
-
font-family: var(--font-mono)
|
|
168
|
-
padding-block: 2px
|
|
169
|
-
|
|
170
|
-
// Overlay & Dialog surfaces
|
|
171
|
-
=dialog-surface
|
|
172
|
-
+bg(dialog)
|
|
173
|
-
+border(all, var(--border))
|
|
174
|
-
+radius(6)
|
|
175
|
-
+shadow(lg)
|
|
176
|
-
max-width: min(92vw, 540px)
|
|
177
|
-
width: 100%
|
|
178
|
-
|
|
179
|
-
=popover-surface
|
|
180
|
-
+bg(popover)
|
|
181
|
-
+border(all, var(--border))
|
|
182
|
-
+radius(6)
|
|
183
|
-
+shadow(md)
|
|
184
|
-
|
|
185
|
-
// Divider recipe
|
|
186
|
-
=divider
|
|
187
|
-
border: none
|
|
188
|
-
+border(top)
|
|
189
|
-
margin-block: space(s)
|
package/templates/_07_base.sass
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
// =============================================================================
|
|
2
|
-
// 07_BASE — a minimal, opinionated reset so the tokens actually reach the page.
|
|
3
|
-
// Kept tiny: box model, sane media defaults, and wiring body to the palette.
|
|
4
|
-
// =============================================================================
|
|
5
|
-
|
|
6
|
-
*, *::before, *::after
|
|
7
|
-
box-sizing: border-box
|
|
8
|
-
|
|
9
|
-
html
|
|
10
|
-
-webkit-text-size-adjust: 100%
|
|
11
|
-
font-family: var(--font-sans)
|
|
12
|
-
|
|
13
|
-
body
|
|
14
|
-
margin: 0
|
|
15
|
-
min-height: 100vh
|
|
16
|
-
font-family: var(--font-sans)
|
|
17
|
-
font-size: var(--text-md)
|
|
18
|
-
line-height: 1.5
|
|
19
|
-
color: var(--text-primary)
|
|
20
|
-
background-color: var(--bg)
|
|
21
|
-
-webkit-font-smoothing: antialiased
|
|
22
|
-
|
|
23
|
-
:where(h1, h2, h3, h4, h5, h6, p, figure, blockquote)
|
|
24
|
-
margin: 0
|
|
25
|
-
|
|
26
|
-
:where(h1, h2, h3, h4)
|
|
27
|
-
line-height: 1.15
|
|
28
|
-
text-wrap: balance
|
|
29
|
-
|
|
30
|
-
:where(img, picture, video, canvas, svg)
|
|
31
|
-
display: block
|
|
32
|
-
max-width: 100%
|
|
33
|
-
|
|
34
|
-
:where(a)
|
|
35
|
-
color: inherit
|
|
36
|
-
text-decoration-color: var(--border-subtle)
|
|
37
|
-
|
|
38
|
-
:where(button, input, select, textarea)
|
|
39
|
-
font: inherit
|
|
40
|
-
color: inherit
|
|
41
|
-
|
|
42
|
-
:where(:focus-visible)
|
|
43
|
-
outline: 2px solid var(--ring)
|
|
44
|
-
outline-offset: 2px
|