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.
Files changed (87) hide show
  1. package/README.md +114 -95
  2. package/dist/cli.js +105 -25
  3. package/dist/components/Accordion.svelte +44 -0
  4. package/dist/components/Accordion.svelte.d.ts +23 -0
  5. package/dist/components/AccordionItem.svelte +44 -0
  6. package/dist/components/AccordionItem.svelte.d.ts +21 -0
  7. package/dist/components/AppShell.svelte +86 -0
  8. package/dist/components/AppShell.svelte.d.ts +39 -0
  9. package/dist/components/ColorPicker.svelte +38 -0
  10. package/dist/components/ColorPicker.svelte.d.ts +6 -0
  11. package/dist/components/Hero.svelte +14 -0
  12. package/dist/components/Hero.svelte.d.ts +9 -0
  13. package/dist/components/LayoutPicker.svelte +34 -0
  14. package/dist/components/LayoutPicker.svelte.d.ts +6 -0
  15. package/dist/components/MotionPicker.svelte +34 -0
  16. package/dist/components/MotionPicker.svelte.d.ts +6 -0
  17. package/dist/components/PageShell.svelte +14 -0
  18. package/dist/components/PageShell.svelte.d.ts +9 -0
  19. package/dist/components/PageSplit.svelte +26 -0
  20. package/dist/components/PageSplit.svelte.d.ts +18 -0
  21. package/dist/components/ShapePicker.svelte +37 -0
  22. package/dist/components/ShapePicker.svelte.d.ts +6 -0
  23. package/dist/css/fractalstyler.css +10643 -0
  24. package/dist/css/fractalstyler.min.css +2 -0
  25. package/dist/index.d.ts +18 -6
  26. package/dist/index.js +30 -12
  27. package/dist/mcp/schemas/compile_fractals.json +3 -3
  28. package/dist/mcp/schemas/css_to_fractals.json +1 -1
  29. package/dist/mcp/schemas/generate_component.json +2 -2
  30. package/dist/mcp/schemas/instructions.md +41 -14
  31. package/dist/mcp/schemas/list_fractals.json +9 -7
  32. package/dist/mcp/schemas/validate_recipe.json +2 -2
  33. package/dist/mcp/server.d.ts +1 -1
  34. package/dist/mcp/server.js +334 -237
  35. package/dist/presets.core.d.ts +42 -0
  36. package/dist/presets.core.js +190 -0
  37. package/dist/presets.svelte.d.ts +6 -0
  38. package/dist/presets.svelte.js +21 -0
  39. package/dist/styles/_00_presets.sass +111 -0
  40. package/dist/styles/_00_themes.sass +1061 -0
  41. package/dist/styles/_00_tokens.sass +57 -17
  42. package/dist/styles/_01_config.sass +77 -70
  43. package/dist/styles/_02_dimensions.sass +174 -0
  44. package/dist/styles/_03_containers.sass +105 -0
  45. package/dist/styles/_04_layouts.sass +100 -0
  46. package/dist/styles/_05_shells.sass +374 -0
  47. package/dist/styles/_06_visuals.sass +236 -0
  48. package/dist/styles/_07_interactions.sass +112 -0
  49. package/dist/styles/_08_own.sass +4 -0
  50. package/dist/styles/canonical-markups.md +160 -0
  51. package/dist/styles/index.sass +11 -18
  52. package/dist/themes.d.ts +7 -0
  53. package/dist/themes.js +45 -0
  54. package/dist/version.d.ts +1 -0
  55. package/dist/version.js +2 -0
  56. package/package.json +26 -15
  57. package/plugin.json +11 -10
  58. package/registry.json +2002 -0
  59. package/skills/fractal-styler/SKILL.md +137 -50
  60. package/skills/fractal-styler/references/fractals.md +416 -28
  61. package/skills/fractal-styler/references/tokens.md +110 -36
  62. package/dist/styles/_02_fonts.sass +0 -13
  63. package/dist/styles/_03_responsive.sass +0 -31
  64. package/dist/styles/_04_atoms.sass +0 -155
  65. package/dist/styles/_05_molecules.sass +0 -97
  66. package/dist/styles/_06_recipes.sass +0 -189
  67. package/dist/styles/_07_base.sass +0 -44
  68. package/dist/styles/_08_blocks.sass +0 -433
  69. package/dist/styles/_09_utilities.sass +0 -208
  70. package/dist/styles/_10_layouts.sass +0 -373
  71. package/dist/styles/_11_own.sass +0 -21
  72. package/dist/styles/_fractals.sass +0 -14
  73. package/skills/style-migration/SKILL.md +0 -45
  74. package/templates/_00_tokens.sass +0 -136
  75. package/templates/_01_config.sass +0 -66
  76. package/templates/_02_fonts.sass +0 -13
  77. package/templates/_03_responsive.sass +0 -31
  78. package/templates/_04_atoms.sass +0 -155
  79. package/templates/_05_molecules.sass +0 -97
  80. package/templates/_06_recipes.sass +0 -189
  81. package/templates/_07_base.sass +0 -44
  82. package/templates/_08_blocks.sass +0 -433
  83. package/templates/_09_utilities.sass +0 -207
  84. package/templates/_10_layouts.sass +0 -373
  85. package/templates/_11_own.sass +0 -21
  86. package/templates/_fractals.sass +0 -14
  87. package/templates/index.sass +0 -18
@@ -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)
@@ -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