@fractaldesign/fractalstyler 0.0.0-stage → 0.9.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 (46) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +123 -2
  3. package/cli/main.mjs +141 -0
  4. package/cli/scaffold.mjs +406 -0
  5. package/data/recipes.json +61 -0
  6. package/dist/asset.d.ts +3 -0
  7. package/dist/css/fractalstyler.css +2453 -0
  8. package/dist/css/fractalstyler.min.css +2 -0
  9. package/dist/index.d.ts +6 -0
  10. package/dist/index.js +6 -0
  11. package/dist/styles/_00_config.sass +29 -0
  12. package/dist/styles/_00_fonts.sass +58 -0
  13. package/dist/styles/_00_tokens.sass +211 -0
  14. package/dist/styles/_01_base.sass +58 -0
  15. package/dist/styles/_02_dimensions.sass +70 -0
  16. package/dist/styles/_03_typography.sass +170 -0
  17. package/dist/styles/_04_containers.sass +173 -0
  18. package/dist/styles/_05_layouts.sass +104 -0
  19. package/dist/styles/_06_shells.sass +135 -0
  20. package/dist/styles/_07_interactions.sass +212 -0
  21. package/dist/styles/_08_visuals.sass +136 -0
  22. package/dist/styles/_09_own.sass +174 -0
  23. package/dist/styles/colorpacks.sass +119 -0
  24. package/dist/styles/index.sass +14 -0
  25. package/dist/styles/themeplates.sass +159 -0
  26. package/docs/REGISTRY.api.md +477 -0
  27. package/docs/REGISTRY.md +14 -0
  28. package/docs/references/configurations-api.md +220 -0
  29. package/docs/references/configurations.md +258 -0
  30. package/lint/browser.mjs +79 -0
  31. package/lint/cli.mjs +212 -0
  32. package/lint/lib/agent-reporter.mjs +51 -0
  33. package/lint/lib/fuzzy.mjs +45 -0
  34. package/lint/lib/registry.mjs +107 -0
  35. package/lint/lib/sass-linter.mjs +71 -0
  36. package/lint/lib/svelte-linter.mjs +116 -0
  37. package/lint/lib/token-linter.mjs +97 -0
  38. package/package.json +112 -5
  39. package/registry.json +3999 -0
  40. package/scripts/class-vocab.js +197 -0
  41. package/scripts/update-registry.js +934 -0
  42. package/skills/fractal-styler/references/fractals.md +630 -0
  43. package/skills/fractal-styler/references/tokens.md +226 -0
  44. package/skills/fractalstyler/SKILL.md +59 -0
  45. package/skills/fractalstyler/references/fractals.md +630 -0
  46. package/skills/fractalstyler/references/tokens.md +226 -0
@@ -0,0 +1,170 @@
1
+ @use 'sass:string'
2
+ @use 'sass:list'
3
+ @use 'sass:map'
4
+ @use '00_config' as *
5
+ @use '00_tokens' as *
6
+
7
+ //primitives - they are simply class versions of the text tokens defined in tokens file
8
+ .text-xs
9
+ font-size: var(--text-xs)
10
+ .text-sm
11
+ font-size: var(--text-sm)
12
+ .text-md
13
+ font-size: var(--text-md)
14
+ .text-bs
15
+ font-size: var(--text-bs)
16
+ .text-lg
17
+ font-size: var(--text-lg)
18
+ .text-xl
19
+ font-size: var(--text-xl)
20
+ .text-2xl
21
+ font-size: var(--text-2xl)
22
+ .text-3xl
23
+ font-size: var(--text-3xl)
24
+ .text-4xl
25
+ font-size: var(--text-4xl)
26
+ .text-5xl
27
+ font-size: var(--text-5xl)
28
+
29
+ //semantics - definitions of what text to actually use where
30
+ .text-body
31
+ font-size: var(--text-bs)
32
+ line-height: 1.5
33
+ .text-body-lg
34
+ font-size: var(--text-lg)
35
+ line-height: 1.5
36
+ .text-body-sm
37
+ font-size: var(--text-sm)
38
+ line-height: 1.5
39
+ .page-title
40
+ font-size: var(--text-3xl)
41
+ line-height: 1.1
42
+ font-weight: 700
43
+ letter-spacing: -0.02rem
44
+ .page-desc
45
+ font-size: var(--text-lg)
46
+ line-height: 1.2
47
+ .page-heading-xl
48
+ font-size: var(--text-xl)
49
+ line-height: 1.1
50
+ font-weight: 600
51
+ letter-spacing: -0.03rem
52
+ .page-heading-lg
53
+ font-size: var(--text-lg)
54
+ line-height: 1.1
55
+ font-weight: 600
56
+ letter-spacing: -0.03rem
57
+ .page-heading-bs
58
+ font-size: var(--text-bs)
59
+ line-height: 1.1
60
+ font-weight: 600
61
+ letter-spacing: -0.02rem
62
+ .card-title
63
+ font-size: var(--text-lg)
64
+ font-weight: 600
65
+ line-height: 1.2
66
+ .card-desc
67
+ font-size: var(--text-md)
68
+ line-height: 1.2
69
+ .breadcrumb-link, .breadcrumb-spacer
70
+ color: var(--text-muted)
71
+ font-size: var(--text-xs)
72
+ text-transform: uppercase
73
+ .breadcrumb-link
74
+ &:hover
75
+ color: var(--theme-color)
76
+ .breadcrumb
77
+ display: flex
78
+ justify-content: flex-start
79
+ margin-left: -0.5rem
80
+
81
+ //navigation text in headers, sidebars, etc.
82
+ .nav-link
83
+ font-size: var(--text-md)
84
+ line-height: 1.2
85
+ .nav-link-sm
86
+ font-size: var(--text-sm)
87
+ line-height: 1.2
88
+ .nav-header
89
+ font-size: var(--text-sm)
90
+ line-height: 1.1
91
+ font-weight: 500
92
+ padding: var(--space-sm)
93
+ .header-nav
94
+ a
95
+ text-transform: uppercase
96
+ font-size: var(--text-md)
97
+ font-weight: 500
98
+ &:hover
99
+ color: var(--theme-color)
100
+
101
+ //line height modifiers
102
+ .lh11
103
+ line-height: 1.1
104
+ .lh12
105
+ line-height: 1.2
106
+ .lh13
107
+ line-height: 1.3
108
+ .lh14
109
+ line-height: 1.4
110
+ .lh15
111
+ line-height: 1.5
112
+ .lh16
113
+ line-height: 1.6
114
+
115
+ //letter-spacing modifiers
116
+ .ls-tight-bs
117
+ letter-spacing: -0.01rem
118
+ .ls-tight-lg
119
+ letter-spacing: -0.02rem
120
+ .ls-tight-xl
121
+ letter-spacing: -0.03rem
122
+ .ls-wide-bs
123
+ letter-spacing: 0.01rem
124
+ .ls-wide-lg
125
+ letter-spacing: 0.02rem
126
+ .ls-wide-xl
127
+ letter-spacing: 0.03rem
128
+
129
+ //font weight modifiers
130
+ .weight-300
131
+ font-weight: 300
132
+ .weight-400
133
+ font-weight: 400
134
+ .weight-500
135
+ font-weight: 500
136
+ .weight-600
137
+ font-weight: 600
138
+ .weight-700
139
+ font-weight: 700
140
+ .weight-800
141
+ font-weight: 800
142
+
143
+ //text transformers and aligners
144
+ .tt-u
145
+ text-transform: uppercase
146
+ .tt-c
147
+ text-transform: capitalize
148
+ .ta-c
149
+ text-align: center
150
+ &.mleft
151
+ @media (max-width: 1024px)
152
+ text-align: left
153
+ .ta-l
154
+ text-align: left
155
+ .ta-r
156
+ text-align: right
157
+ &.mleft
158
+ @media (max-width: 1024px)
159
+ text-align: left
160
+
161
+ //font usage shorthands
162
+ .mono
163
+ font-family: var(--font-mono)
164
+ .sans
165
+ font-family: var(--font-sans)
166
+
167
+ .truncate
168
+ overflow: hidden
169
+ white-space: nowrap
170
+ text-overflow: ellipsis
@@ -0,0 +1,173 @@
1
+ // ============================================================================
2
+ // flow — L2. Containers and the alignment universe, verbatim from the
3
+ // registry. Alignment classes are nested under their base — never standalone.
4
+ // x/y are physical axes, always (Contract 4).
5
+ // ============================================================================
6
+ .box
7
+ display: flex
8
+ flex-direction: column
9
+ &.xcenter
10
+ align-items: center
11
+ text-align: center
12
+ &.xleft
13
+ align-items: flex-start
14
+ text-align: left
15
+ &.xright
16
+ align-items: flex-end
17
+ text-align: right
18
+ &.ycenter
19
+ justify-content: center
20
+ &.ytop
21
+ justify-content: flex-start
22
+ &.ybot
23
+ justify-content: flex-end
24
+ &.ybetween
25
+ justify-content: space-between
26
+ &.yevenly
27
+ justify-content: space-evenly
28
+ &.yaround
29
+ justify-content: space-around
30
+
31
+ .row
32
+ display: flex
33
+ flex-direction: row
34
+ &.xleft
35
+ justify-content: flex-start
36
+ &.xcenter
37
+ justify-content: center
38
+ &.xright
39
+ justify-content: flex-end
40
+ &.xbetween
41
+ justify-content: space-between
42
+ &.xevenly
43
+ justify-content: space-evenly
44
+ &.xaround
45
+ justify-content: space-around
46
+ &.ycenter
47
+ align-items: center
48
+ &.ytop
49
+ align-items: flex-start
50
+ &.ybot
51
+ align-items: flex-end
52
+
53
+ .grid
54
+ display: grid
55
+ &.center
56
+ place-items: center
57
+ &.xcenter
58
+ justify-items: center
59
+ text-align: center
60
+ &.xleft
61
+ justify-items: start
62
+ text-align: left
63
+ &.xright
64
+ justify-items: end
65
+ text-align: right
66
+ &.xstretch
67
+ justify-items: stretch
68
+ &.ycenter
69
+ align-items: center
70
+ &.ytop
71
+ align-items: start
72
+ &.ybot
73
+ align-items: end
74
+ &.ystretch
75
+ align-items: stretch
76
+ &.xbetween
77
+ justify-content: space-between
78
+ &.xevenly
79
+ justify-content: space-evenly
80
+ &.xaround
81
+ justify-content: space-around
82
+ &.ybetween
83
+ align-content: space-between
84
+ &.yevenly
85
+ align-content: space-evenly
86
+ &.yaround
87
+ align-content: space-around
88
+
89
+ .wrap
90
+ flex-wrap: wrap
91
+
92
+ .grow
93
+ flex: 1 1 0%
94
+
95
+ .shrink-0
96
+ flex-shrink: 0
97
+
98
+ .relative
99
+ position: relative
100
+ .absolute
101
+ position: absolute
102
+ .fixed
103
+ position: fixed
104
+ .sticky
105
+ position: sticky
106
+
107
+ // Scroll containers. A panel that has to hold more than fits — a long option
108
+ // list, a code block, a table — is a composition primitive, not a bespoke
109
+ // widget. Without these the only way to express it was a hand-written rule,
110
+ // which is the escape hatch the registry exists to avoid.
111
+ // Pair with a height: .scroll-y needs one to have anything to scroll against.
112
+ .scroll-y // Vertical scroll inside a bounded height; needs an .h-* or a constraining flex parent
113
+ overflow-y: auto
114
+ overflow-x: hidden
115
+ overscroll-behavior: contain
116
+
117
+ .scroll-x // Horizontal scroll inside a bounded width; .reel adds snap points
118
+ overflow-x: auto
119
+ overflow-y: hidden
120
+ overscroll-behavior: contain
121
+
122
+ .card
123
+ padding: var(--space-bs)
124
+ border: 1px solid var(--border)
125
+ background: var(--bg-panel)
126
+ svg.arrow
127
+ color: var(--theme-color)
128
+ transition: transform var(--speed1) var(--transout1)
129
+ footer
130
+ margin-top: auto
131
+ &[data-shape="modern"]
132
+ border-radius: var(--radius-sm)
133
+ &:hover
134
+ svg
135
+ transform: translateX(2rem)
136
+
137
+ .chip
138
+ font-size: var(--text-xs)
139
+ font-weight: 500
140
+ letter-spacing: 0.01rem
141
+ padding: var(--space-xs) var(--space-sm)
142
+ border-radius: var(--radius-md)
143
+
144
+ .prose-section
145
+ display: flex
146
+ flex-direction: column
147
+ gap: var(--space-lg)
148
+
149
+ .nav-section
150
+ display: flex
151
+ flex-direction: column
152
+ gap: var(--space-xs)
153
+
154
+ .page-header
155
+ display: flex
156
+ flex-direction: column
157
+ padding-bottom: var(--space-2xl)
158
+ gap: var(--space-sm)
159
+
160
+ .inputs-wrapper
161
+ display: flex
162
+ gap: var(--space-xs)
163
+ label
164
+ font-size: var(--text-sm)
165
+ color: var(--text-muted)
166
+
167
+ .checkbox-wrapper
168
+ display: flex
169
+ align-items: center
170
+ gap: var(--space-xs)
171
+ span
172
+ font-size: var(--text-sm)
173
+ font-weight: 500
@@ -0,0 +1,104 @@
1
+ // ============================================================================
2
+ // layouts — L3. Grids (gridding golden rules), card-grid, prose, frame
3
+ // presets, reel. Grids are pure stepping: no default gap — compose .gap-*
4
+ // (self-sufficiency; a default gap is an opinion the system doesn't hold).
5
+ // ============================================================================
6
+
7
+ @use 'sass:string'
8
+ @use 'sass:list'
9
+ @use 'sass:map'
10
+ @use '00_config' as *
11
+ @use '00_tokens' as *
12
+
13
+ // Gridding golden rules: exactly 3 items → 3→1, never 2+1; count 4 or a
14
+ // multiple of 4 → 4→2→1, never 3+1; 6 → 6→3→2→1 (both rules hold throughout).
15
+ .grid-1
16
+ display: grid
17
+ grid-template-columns: repeat(1, minmax(0, 1fr))
18
+
19
+ .grid-2
20
+ display: grid
21
+ grid-template-columns: repeat(1, minmax(0, 1fr))
22
+ @media (min-width: 1025px)
23
+ grid-template-columns: repeat(2, minmax(0, 1fr))
24
+
25
+ .grid-3
26
+ display: grid
27
+ grid-template-columns: repeat(1, minmax(0, 1fr))
28
+ @media (min-width: 1025px)
29
+ grid-template-columns: repeat(3, minmax(0, 1fr))
30
+
31
+ .grid-4
32
+ display: grid
33
+ grid-template-columns: repeat(1, minmax(0, 1fr))
34
+ @media (min-width: 1025px)
35
+ grid-template-columns: repeat(2, minmax(0, 1fr))
36
+ @media (min-width: 1281px)
37
+ grid-template-columns: repeat(4, minmax(0, 1fr))
38
+
39
+ .grid-6
40
+ display: grid
41
+ grid-template-columns: repeat(1, minmax(0, 1fr))
42
+ @media (min-width: 1025px)
43
+ grid-template-columns: repeat(3, minmax(0, 1fr))
44
+ @media (min-width: 1281px)
45
+ grid-template-columns: repeat(6, minmax(0, 1fr))
46
+
47
+ .cspan-1
48
+ grid-column: span 1
49
+ .cspan-2
50
+ grid-column: span 2
51
+ .cspan-3
52
+ grid-column: span 3
53
+ .cspan-4
54
+ grid-column: span 4
55
+ .cspan-5
56
+ grid-column: span 5
57
+ .cspan-6
58
+ grid-column: span 6
59
+ .cspan-7
60
+ grid-column: span 7
61
+ .cspan-8
62
+ grid-column: span 8
63
+
64
+ // Auto-fit repeatable cards — column count negotiable, min track from config.
65
+ .card-grid
66
+ display: grid
67
+ grid-template-columns: repeat(auto-fit, minmax(min(var(--card-min), 100%), 1fr))
68
+
69
+ // Prose — the reading measure (≤ 760px) + typographic rhythm (rhythm authored).
70
+ .prose
71
+ max-width: var(--prose-clamp)
72
+ margin-inline: auto
73
+ display: flex
74
+ flex-direction: column
75
+ gap: var(--space-sm)
76
+ h1, h2, h3, h4
77
+ &:first-child
78
+ margin-top: 0
79
+
80
+ // Frame presets — aspect-ratio media boxes (replaces any frame abstraction).
81
+ @each $name, $ratio in $frame-ratios
82
+ .frame-#{$name}
83
+ aspect-ratio: #{$ratio}
84
+ overflow: hidden
85
+ position: relative
86
+ img, video, iframe, svg
87
+ width: 100%
88
+ height: 100%
89
+ object-fit: cover
90
+
91
+ // Reel — the human-driven scroll-snap rail (filmstrip). Open for carousel duty.
92
+ .reel
93
+ display: flex
94
+ flex-direction: row
95
+ overflow-x: auto
96
+ overscroll-behavior-inline: contain
97
+ scroll-snap-type: inline mandatory
98
+ // The system's one permitted `>`. Snap targets must be the rail's own
99
+ // children: a descendant selector would make nested elements snap too and
100
+ // the rail would catch in the wrong places. Kept deliberately — see the
101
+ // combinator guard in scripts/validate-deck.js.
102
+ > *
103
+ flex: 0 0 auto
104
+ scroll-snap-align: start
@@ -0,0 +1,135 @@
1
+ // ============================================================================
2
+ // shells — L4. Canonical markups are canon: every class here implements the
3
+ // markup registered in the registry. Overlay mechanics, the docs-frame roles
4
+ // and the mobile TOC disclosure are authored to the registered behaviors.
5
+ // Motion reads the motion tokens — presets reach everything.
6
+ // ============================================================================
7
+
8
+ @use 'sass:string'
9
+ @use 'sass:list'
10
+ @use 'sass:map'
11
+ @use '00_config' as *
12
+ @use '00_tokens' as *
13
+
14
+ $md: map.get($breakpoints, md)
15
+ $bs: map.get($breakpoints, bs)
16
+ $lg: map.get($breakpoints, lg)
17
+
18
+ // --- The app-shell canon ------------------------------------------------------
19
+ .app-shell
20
+ display: flex
21
+ flex-direction: column
22
+ position: relative
23
+ min-height: 100vh
24
+
25
+ .app-header
26
+ display: flex
27
+ flex-direction: row
28
+ align-items: center
29
+ position: sticky
30
+ top: 0
31
+ z-index: var(--z-sticky)
32
+ height: var(--header-height)
33
+ padding-inline: var(--app-inline)
34
+ background: var(--bg-surface)
35
+ &.clamped
36
+ width: var(--content-clamp)
37
+ margin-inline: auto
38
+
39
+ .app-main
40
+ flex: 1 1 0%
41
+ min-width: 0
42
+ min-height: calc(100dvh - var(--fit-height))
43
+ display: flex
44
+ flex-direction: row
45
+ padding-inline: var(--app-inline)
46
+ &.clamped
47
+ width: var(--content-clamp)
48
+ margin-inline: auto
49
+
50
+ .main-section
51
+ flex: 1 1 0%
52
+ min-width: 0
53
+
54
+ // --- Role-bound rails (Amendment A1) -------------------------------------------
55
+ // Left = nav: visible ≥ lg; below, .open on .app-shell resurrects it as an
56
+ // off-canvas drawer (the header menu button toggles it). Right = TOC: visible
57
+ // ≥ xl; below, its content surfaces in .mobile-toc at the top of the page.
58
+ .sidebar-left,
59
+ .sidebar-right
60
+ display: none
61
+ flex-shrink: 0
62
+ position: sticky
63
+ top: var(--header-height)
64
+ height: calc(100dvh - var(--fit-height))
65
+ overflow-y: auto
66
+ padding-block: var(--space-2xl)
67
+ ul, ol
68
+ margin-left: 0
69
+ padding-left: 0
70
+
71
+ .sidebar-left
72
+ width: var(--sidebar-width-left)
73
+
74
+ .sidebar-right
75
+ width: var(--sidebar-width-right)
76
+
77
+ @media (max-width: #{$bs})
78
+ .app-shell.open .sidebar-left
79
+ display: block
80
+ position: fixed
81
+ left: 0
82
+ z-index: var(--z-modal)
83
+ height: var(--fit-height)
84
+
85
+ @media (min-width: 1025px)
86
+ .sidebar-left
87
+ display: block
88
+
89
+ @media (min-width: 1281px)
90
+ .sidebar-right
91
+ display: block
92
+
93
+ .app-footer
94
+ display: flex
95
+ flex-direction: row
96
+ align-items: center
97
+ padding-inline: var(--app-inline)
98
+ min-height: var(--footer-height)
99
+
100
+ .content-section
101
+ width: 100%
102
+ padding: var(--space-2xl) 0
103
+ &.null
104
+ padding: 0 var(--space-bs)
105
+ @media (min-width: 769px)
106
+ padding: var(--space-2xl) var(--space-bs)
107
+ &.narrow-half
108
+ padding: var(--space-2xl) 0
109
+ width: 640px
110
+ margin-inline: auto
111
+ &.narrow-wide
112
+ padding: var(--space-2xl) 0
113
+ width: 720px
114
+ margin-inline: auto
115
+ @media (min-width: 1025px)
116
+ padding: var(--space-2xl) var(--space-bs)
117
+ &.narrow-full
118
+ width: 640px
119
+ margin-inline: auto
120
+ &.narrow-half
121
+ width: 750px
122
+ padding-right: 25px
123
+ &.narrow-wide
124
+ width: 750px
125
+ @media (min-width: 1281px)
126
+ &.narrow-full
127
+ width: 680px
128
+ &.narrow-half
129
+ width: 800px
130
+ padding-right: 120px
131
+ &.narrow-wide
132
+ width: 1024px
133
+ @media (min-width: 1441px)
134
+ &.narrow-wide
135
+ width: 1280px