@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.
- package/LICENSE +19 -0
- package/README.md +123 -2
- package/cli/main.mjs +141 -0
- package/cli/scaffold.mjs +406 -0
- package/data/recipes.json +61 -0
- package/dist/asset.d.ts +3 -0
- package/dist/css/fractalstyler.css +2453 -0
- package/dist/css/fractalstyler.min.css +2 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/styles/_00_config.sass +29 -0
- package/dist/styles/_00_fonts.sass +58 -0
- package/dist/styles/_00_tokens.sass +211 -0
- package/dist/styles/_01_base.sass +58 -0
- package/dist/styles/_02_dimensions.sass +70 -0
- package/dist/styles/_03_typography.sass +170 -0
- package/dist/styles/_04_containers.sass +173 -0
- package/dist/styles/_05_layouts.sass +104 -0
- package/dist/styles/_06_shells.sass +135 -0
- package/dist/styles/_07_interactions.sass +212 -0
- package/dist/styles/_08_visuals.sass +136 -0
- package/dist/styles/_09_own.sass +174 -0
- package/dist/styles/colorpacks.sass +119 -0
- package/dist/styles/index.sass +14 -0
- package/dist/styles/themeplates.sass +159 -0
- package/docs/REGISTRY.api.md +477 -0
- package/docs/REGISTRY.md +14 -0
- package/docs/references/configurations-api.md +220 -0
- package/docs/references/configurations.md +258 -0
- package/lint/browser.mjs +79 -0
- package/lint/cli.mjs +212 -0
- package/lint/lib/agent-reporter.mjs +51 -0
- package/lint/lib/fuzzy.mjs +45 -0
- package/lint/lib/registry.mjs +107 -0
- package/lint/lib/sass-linter.mjs +71 -0
- package/lint/lib/svelte-linter.mjs +116 -0
- package/lint/lib/token-linter.mjs +97 -0
- package/package.json +112 -5
- package/registry.json +3999 -0
- package/scripts/class-vocab.js +197 -0
- package/scripts/update-registry.js +934 -0
- package/skills/fractal-styler/references/fractals.md +630 -0
- package/skills/fractal-styler/references/tokens.md +226 -0
- package/skills/fractalstyler/SKILL.md +59 -0
- package/skills/fractalstyler/references/fractals.md +630 -0
- 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
|