@smwb/ui-styles 2.7.0 → 2.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/README.md +27 -4
- package/less/components/dagView/dagView.less +19 -0
- package/less/components/markdown/markdown.entry.less +2 -0
- package/less/components/markdown/markdown.less +265 -0
- package/less/components.less +1 -0
- package/less/default/globals/default.variables.less +29 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -144,6 +144,26 @@ so a copied or printed svg scans without the library CSS). Only the caption is t
|
|
|
144
144
|
(`--smui-onSurfaceVariant`). The corner rounding is `@qrCodeRadius` (`@smui-radius-sm`); the svg clips to
|
|
145
145
|
it, and the quiet zone keeps the modules clear of the rounding.
|
|
146
146
|
|
|
147
|
+
#### Markdown
|
|
148
|
+
|
|
149
|
+
`Markdown` (issue and PR descriptions and comments) takes its text styles from `@markdown*` variables and
|
|
150
|
+
its colours from runtime tokens, so the dark theme follows without extra settings: the link is
|
|
151
|
+
`@markdownLinkColor` (`--smui-primaryColor`), the code and table-head surfaces are
|
|
152
|
+
`@markdownCodeBackground` / `@markdownTableHeadBackground` (`--smui-surfaceVariant`), the quote border and
|
|
153
|
+
text are `@markdownQuoteBorderColor` / `@markdownQuoteColor` (`--smui-outlineColor` /
|
|
154
|
+
`--smui-onSurfaceVariant`), the table borders are `@markdownTableBorderColor` (`--smui-tableBorderColor`)
|
|
155
|
+
and the rule is `@markdownRuleColor` (`--smui-dividerColor`). The type scale lives in
|
|
156
|
+
`@markdownFontSize` / `@markdownLineHeight` (body2), the six `@markdownHeading*Size` steps, sized in `em`
|
|
157
|
+
off the prose, `@markdownHeadingWeight`, `@markdownListIndent`, the code measures (`@markdownCodeFontFamily`,
|
|
158
|
+
`@markdownCodeFontSize`, `@markdownCodeRadius`, `@markdownCodeBlockPadding`, `@markdownInlineCodePadding`),
|
|
159
|
+
the quote's `@markdownQuoteBorderWidth` and the table's `@markdownTableCellPadding`.
|
|
160
|
+
|
|
161
|
+
Two layout promises are part of the theme contract: the prose wraps long words and addresses itself
|
|
162
|
+
(`overflow-wrap: anywhere` on the root), and the code blocks and tables scroll sideways _inside
|
|
163
|
+
themselves_ (`overflow-x: auto` with `contain: inline-size`), so a long line or a wide table never widens
|
|
164
|
+
the page — not even inside a flex or grid parent that does not set `min-width: 0`. Override the variables
|
|
165
|
+
in `theme.config`; an app needs no rules of its own on the `smwb-markdown` classes.
|
|
166
|
+
|
|
147
167
|
#### DagView colours
|
|
148
168
|
|
|
149
169
|
The dependency graph (`DagView` in `@smwb/ui-solid` and `@smwb/ui-react`) takes its colours from theme variables that default to the
|
|
@@ -179,13 +199,16 @@ An edge the app marks `active` shows work flowing along it (`DagViewEdge.active`
|
|
|
179
199
|
the flow colour over a paler track, a static glow lies under it and pulses run from `source` to `target`; a running
|
|
180
200
|
node's frame glows and pulses with its dot. This `active` is not the selection highlight — the selected node's edges
|
|
181
201
|
keep `@dagViewEdgeActiveColor`, and where both apply the flowing edge wins the colour and the arrow. All flow rules and
|
|
182
|
-
the node glow are gated on markup only `@smwb/ui-solid` writes (`data-animate-running`
|
|
183
|
-
classes on the edge paths), so the shared CSS is inert for `@smwb/ui-react` until its own
|
|
184
|
-
change React sees is the new custom properties on its root and the dot's duration read from
|
|
202
|
+
the node glow are gated on markup only `@smwb/ui-solid` writes (`data-animate-running` and `data-animate-flow` on
|
|
203
|
+
the root, the flowing classes on the edge paths), so the shared CSS is inert for `@smwb/ui-react` until its own
|
|
204
|
+
issue lands; the only change React sees is the new custom properties on its root and the dot's duration read from
|
|
185
205
|
`--smwb-dag-view-node-pulse-duration`, whose default is the 1.4 s of before. Motion is CSS only: with
|
|
186
206
|
`prefers-reduced-motion: reduce` the pulses stay hidden, the flowing edge stays lit in the full flow colour, and a
|
|
187
207
|
running node keeps a still glow; `animateRunning={false}` stops a running node's glow and dot pulse without reduced
|
|
188
|
-
motion.
|
|
208
|
+
motion. `animateFlow={false}` (`data-animate-flow="false"` on the root) asks for that same still state on demand and
|
|
209
|
+
keeps the light: the pulses are hidden, a running node's dot and frame hold still, the flowing edge stays lit in the
|
|
210
|
+
full flow colour with its static glow, and the running node keeps its still glow. Those rules sit after the motion
|
|
211
|
+
media query, which is what makes them win at equal specificity.
|
|
189
212
|
|
|
190
213
|
The statuses are `idle`, `pending`, `running`, `success`, `warning`, `error` and `skipped`; a node with any other
|
|
191
214
|
status is drawn as `idle`. Each colour variable has a `…Dark` twin (e.g. `@dagViewStatusSuccessDark`), `false` by
|
|
@@ -388,6 +388,25 @@
|
|
|
388
388
|
}
|
|
389
389
|
}
|
|
390
390
|
|
|
391
|
+
// animateFlow={false}: the same still state reduced motion shows — the flow
|
|
392
|
+
// stays lit in the full flow colour and the glows stay, nothing moves. The
|
|
393
|
+
// block sits after the motion rules so its frame rule, of equal specificity
|
|
394
|
+
// to theirs, wins.
|
|
395
|
+
.smwb-dag-view[data-animate-flow="false"] {
|
|
396
|
+
.smwb-dag-view__edge--flowing {
|
|
397
|
+
stroke: var(--smwb-dag-view-edge-flow-color);
|
|
398
|
+
}
|
|
399
|
+
.smwb-dag-view__edge-pulse {
|
|
400
|
+
display: none;
|
|
401
|
+
}
|
|
402
|
+
.smwb-dag-view__node[data-status="running"] .smwb-dag-view__dot {
|
|
403
|
+
animation: none;
|
|
404
|
+
}
|
|
405
|
+
.smwb-dag-view__node[data-status="running"]::before {
|
|
406
|
+
animation: none;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
391
410
|
@keyframes smwb-dag-view-pulse {
|
|
392
411
|
50% {
|
|
393
412
|
opacity: 0.35;
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
// Markdown prose: an issue or PR description or comment rendered from a parsed tree.
|
|
2
|
+
// Text styles follow the @markdown* theme variables; colours are runtime tokens, so the
|
|
3
|
+
// dark theme follows without extra settings. Long words and addresses wrap in the prose
|
|
4
|
+
// itself; the wide blocks (code and tables) scroll sideways inside themselves instead
|
|
5
|
+
// of widening the page — `contain: inline-size` takes their min-content contribution out
|
|
6
|
+
// of flex and grid parents that do not set min-width: 0.
|
|
7
|
+
.smwb-markdown {
|
|
8
|
+
min-width: 0;
|
|
9
|
+
max-width: 100%;
|
|
10
|
+
overflow-wrap: anywhere;
|
|
11
|
+
font-size: @markdownFontSize;
|
|
12
|
+
line-height: @markdownLineHeight;
|
|
13
|
+
|
|
14
|
+
// Blocks stack with a gap; the first and the last child carry no outer margin.
|
|
15
|
+
> * {
|
|
16
|
+
margin-block: 0;
|
|
17
|
+
}
|
|
18
|
+
> * + * {
|
|
19
|
+
margin-block-start: @markdownBlockGap;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Over the maxLength cap, and for raw HTML that survived as a block, the text is pre-wrapped prose.
|
|
23
|
+
&__plain,
|
|
24
|
+
&__raw {
|
|
25
|
+
white-space: pre-wrap;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// The look follows the Markdown level (the class), not the tag: `headingOffset` shifts
|
|
29
|
+
// the tag for the document outline, not the size.
|
|
30
|
+
&__heading {
|
|
31
|
+
font-weight: @markdownHeadingWeight;
|
|
32
|
+
line-height: 1.3;
|
|
33
|
+
|
|
34
|
+
&_level-1 {
|
|
35
|
+
font-size: @markdownHeading1Size;
|
|
36
|
+
}
|
|
37
|
+
&_level-2 {
|
|
38
|
+
font-size: @markdownHeading2Size;
|
|
39
|
+
}
|
|
40
|
+
&_level-3 {
|
|
41
|
+
font-size: @markdownHeading3Size;
|
|
42
|
+
}
|
|
43
|
+
&_level-4 {
|
|
44
|
+
font-size: @markdownHeading4Size;
|
|
45
|
+
}
|
|
46
|
+
&_level-5 {
|
|
47
|
+
font-size: @markdownHeading5Size;
|
|
48
|
+
}
|
|
49
|
+
&_level-6 {
|
|
50
|
+
font-size: @markdownHeading6Size;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&__rule {
|
|
55
|
+
height: 0;
|
|
56
|
+
border: 0;
|
|
57
|
+
border-block-start: 1px solid @markdownRuleColor;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
&__quote {
|
|
61
|
+
margin-inline: 0;
|
|
62
|
+
padding-inline-start: @markdownBlockGap;
|
|
63
|
+
border-inline-start: @markdownQuoteBorderWidth solid @markdownQuoteBorderColor;
|
|
64
|
+
color: @markdownQuoteColor;
|
|
65
|
+
|
|
66
|
+
> * + * {
|
|
67
|
+
margin-block-start: @markdownBlockGap;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Deep nesting stops widening the text: from the fourth occurrence of the same container on,
|
|
72
|
+
// a quote, a list or a footnote indents only a little, so the deepest text that still draws as
|
|
73
|
+
// Markdown (31 levels of quotes, lists and footnotes, alone or mixed) fits a phone-width column.
|
|
74
|
+
&__quote &__quote &__quote &__quote,
|
|
75
|
+
&__footnote &__footnote &__footnote &__footnote {
|
|
76
|
+
padding-inline-start: ~"calc(@{markdownBlockGap} / 3)";
|
|
77
|
+
}
|
|
78
|
+
&__list &__list &__list &__list {
|
|
79
|
+
padding-inline-start: ~"calc(@{markdownListIndent} * 2 / 3)";
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The marker kind lives on the list…
|
|
83
|
+
&__list {
|
|
84
|
+
padding-inline-start: @markdownListIndent;
|
|
85
|
+
list-style: disc;
|
|
86
|
+
|
|
87
|
+
&_ordered {
|
|
88
|
+
list-style: decimal;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// A nested list hangs closer to its parent item than a top-level block gap.
|
|
92
|
+
.smwb-markdown__list {
|
|
93
|
+
margin-block-start: ~"calc(@{markdownBlockGap} / 2)";
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// …and reaches each item through `inherit`: normalize.css sets `list-style: none` on every
|
|
98
|
+
// `ul li` (0,0,2), and this class (0,1,0) wins over it.
|
|
99
|
+
&__item {
|
|
100
|
+
list-style: inherit;
|
|
101
|
+
|
|
102
|
+
// Loose list items stack their paragraphs like the root's blocks.
|
|
103
|
+
> * + * {
|
|
104
|
+
margin-block-start: ~"calc(@{markdownBlockGap} / 2)";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// A task item drops its marker, the checkbox leads it instead; plain items in the same list
|
|
108
|
+
// keep theirs. In a loose item the first paragraph runs on after the checkbox.
|
|
109
|
+
&_task {
|
|
110
|
+
list-style: none;
|
|
111
|
+
|
|
112
|
+
> .smwb-markdown__checkbox + .smwb-markdown__paragraph {
|
|
113
|
+
display: inline;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// normalize.css stretches every `input` to the full width and height of its parent; the
|
|
119
|
+
// checkbox keeps its own size so the item's text runs on beside it.
|
|
120
|
+
&__checkbox {
|
|
121
|
+
width: auto;
|
|
122
|
+
height: auto;
|
|
123
|
+
margin-block: 0;
|
|
124
|
+
margin-inline-end: 0.5em;
|
|
125
|
+
vertical-align: middle;
|
|
126
|
+
accent-color: var(--smui-primaryColor);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// A focusable scroll container: it keeps long lines inside itself, never the page.
|
|
130
|
+
&__code-block {
|
|
131
|
+
max-width: 100%;
|
|
132
|
+
overflow-x: auto;
|
|
133
|
+
contain: inline-size;
|
|
134
|
+
padding: @markdownCodeBlockPadding;
|
|
135
|
+
border-radius: @markdownCodeRadius;
|
|
136
|
+
background-color: @markdownCodeBackground;
|
|
137
|
+
white-space: pre;
|
|
138
|
+
overflow-wrap: normal;
|
|
139
|
+
tab-size: 4;
|
|
140
|
+
|
|
141
|
+
@supports not (contain: inline-size) {
|
|
142
|
+
width: 0;
|
|
143
|
+
min-width: 100%;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
&:focus-visible {
|
|
147
|
+
outline: 2px solid var(--smui-primaryColor);
|
|
148
|
+
outline-offset: 2px;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
&__code,
|
|
153
|
+
&__inline-code {
|
|
154
|
+
font-family: @markdownCodeFontFamily;
|
|
155
|
+
font-size: @markdownCodeFontSize;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
&__code {
|
|
159
|
+
padding: 0;
|
|
160
|
+
border-radius: 0;
|
|
161
|
+
background-color: transparent;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
&__inline-code {
|
|
165
|
+
padding: @markdownInlineCodePadding;
|
|
166
|
+
border-radius: @markdownCodeRadius;
|
|
167
|
+
background-color: @markdownCodeBackground;
|
|
168
|
+
// The background (and padding), not the font, tells inline code apart: an app's own
|
|
169
|
+
// UI font may already be monospace, so a different family alone would read as plain text.
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
&__table-wrap {
|
|
173
|
+
max-width: 100%;
|
|
174
|
+
overflow-x: auto;
|
|
175
|
+
contain: inline-size;
|
|
176
|
+
|
|
177
|
+
@supports not (contain: inline-size) {
|
|
178
|
+
width: 0;
|
|
179
|
+
min-width: 100%;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
&:focus-visible {
|
|
183
|
+
outline: 2px solid var(--smui-primaryColor);
|
|
184
|
+
outline-offset: 2px;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// The cells carry the borders, so the grid reads both when the table fills the wrap
|
|
189
|
+
// and when the wrap scrolls sideways over a wider table.
|
|
190
|
+
&__table {
|
|
191
|
+
width: 100%;
|
|
192
|
+
border-collapse: collapse;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Cells wrap at spaces only: with the root's `overflow-wrap: anywhere` every character would
|
|
196
|
+
// be a break, the table's min-content width would drop to nothing and a wide table would squeeze
|
|
197
|
+
// into the wrap instead of scrolling inside it. Prose in a cell still wraps.
|
|
198
|
+
&__cell {
|
|
199
|
+
overflow-wrap: normal;
|
|
200
|
+
padding: @markdownTableCellPadding;
|
|
201
|
+
border: 1px solid @markdownTableBorderColor;
|
|
202
|
+
text-align: left;
|
|
203
|
+
|
|
204
|
+
&_head {
|
|
205
|
+
background-color: @markdownTableHeadBackground;
|
|
206
|
+
font-weight: @markdownHeadingWeight;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
&_align-left {
|
|
210
|
+
text-align: left;
|
|
211
|
+
}
|
|
212
|
+
&_align-center {
|
|
213
|
+
text-align: center;
|
|
214
|
+
}
|
|
215
|
+
&_align-right {
|
|
216
|
+
text-align: right;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
&__link {
|
|
221
|
+
color: @markdownLinkColor;
|
|
222
|
+
text-decoration: underline;
|
|
223
|
+
text-underline-offset: 0.15em;
|
|
224
|
+
|
|
225
|
+
&:hover,
|
|
226
|
+
&:focus-visible {
|
|
227
|
+
text-decoration-thickness: 2px;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
&__image {
|
|
232
|
+
max-width: 100%;
|
|
233
|
+
height: auto;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Footnotes render where their definitions stand, with no ids or back-links.
|
|
237
|
+
&__footnote {
|
|
238
|
+
margin-inline: 0;
|
|
239
|
+
padding-inline-start: @markdownListIndent;
|
|
240
|
+
|
|
241
|
+
> * + * {
|
|
242
|
+
margin-block-start: @markdownBlockGap;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// The label leads the definition's first paragraph on its line.
|
|
247
|
+
&__footnote-label {
|
|
248
|
+
margin-inline-end: 0.5em;
|
|
249
|
+
font-weight: @markdownHeadingWeight;
|
|
250
|
+
|
|
251
|
+
+ .smwb-markdown__paragraph {
|
|
252
|
+
display: inline;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Forced colours drop background colours: the code surfaces become frames so they stay visible.
|
|
258
|
+
@media (forced-colors: active) {
|
|
259
|
+
.smwb-markdown {
|
|
260
|
+
&__code-block,
|
|
261
|
+
&__inline-code {
|
|
262
|
+
border: 1px solid CanvasText;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
package/less/components.less
CHANGED
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
@import "./components/grid/grid.less";
|
|
43
43
|
@import "./components/tooltip/tooltip.less";
|
|
44
44
|
@import "./components/kbd/kbd.less";
|
|
45
|
+
@import "./components/markdown/markdown.less";
|
|
45
46
|
@import "./components/commandPalette/commandPalette.less";
|
|
46
47
|
@import "./components/sheet/sheet.less";
|
|
47
48
|
@import "./components/floatingWindow/floatingWindow.less";
|
|
@@ -229,6 +229,35 @@
|
|
|
229
229
|
@kbdKeyMinSize: 1.5em; // a key cap is square at one character
|
|
230
230
|
@kbdKeyPaddingX: 0.375em;
|
|
231
231
|
@kbdKeyRadius: @smui-radius-sm;
|
|
232
|
+
|
|
233
|
+
// ---- Markdown ----
|
|
234
|
+
// Prose of Markdown descriptions and comments. The colours are runtime tokens, so the
|
|
235
|
+
// dark theme follows without a Dark set here.
|
|
236
|
+
@markdownFontSize: @smui-font-body2-size; // 14px
|
|
237
|
+
@markdownLineHeight: @smui-font-body2-lh; // 1.5
|
|
238
|
+
@markdownBlockGap: @smui-space-md; // 12px between blocks
|
|
239
|
+
@markdownHeadingWeight: 600;
|
|
240
|
+
@markdownHeading1Size: 1.5em;
|
|
241
|
+
@markdownHeading2Size: 1.3em;
|
|
242
|
+
@markdownHeading3Size: 1.15em;
|
|
243
|
+
@markdownHeading4Size: 1em;
|
|
244
|
+
@markdownHeading5Size: 0.925em;
|
|
245
|
+
@markdownHeading6Size: 0.85em;
|
|
246
|
+
@markdownListIndent: 1.5em;
|
|
247
|
+
@markdownLinkColor: ~"var(--smui-primaryColor)";
|
|
248
|
+
@markdownCodeFontFamily: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
|
|
249
|
+
@markdownCodeFontSize: 0.9em;
|
|
250
|
+
@markdownCodeBackground: ~"var(--smui-surfaceVariant)";
|
|
251
|
+
@markdownCodeRadius: @smui-radius-sm;
|
|
252
|
+
@markdownCodeBlockPadding: @smui-space-sm @smui-space-md;
|
|
253
|
+
@markdownInlineCodePadding: 0.1em 0.35em;
|
|
254
|
+
@markdownQuoteBorderWidth: 3px;
|
|
255
|
+
@markdownQuoteBorderColor: ~"var(--smui-outlineColor)";
|
|
256
|
+
@markdownQuoteColor: ~"var(--smui-onSurfaceVariant)";
|
|
257
|
+
@markdownTableBorderColor: ~"var(--smui-tableBorderColor)";
|
|
258
|
+
@markdownTableCellPadding: @smui-space-xs @smui-space-sm;
|
|
259
|
+
@markdownTableHeadBackground: ~"var(--smui-surfaceVariant)";
|
|
260
|
+
@markdownRuleColor: ~"var(--smui-dividerColor)";
|
|
232
261
|
// ---- DiffStat ----
|
|
233
262
|
@diffStatFontSize: 0.875rem;
|
|
234
263
|
@diffStatCompactFontSize: 0.75rem; // a tab label
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smwb/ui-styles",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.0",
|
|
4
4
|
"description": "Framework-agnostic LESS design tokens and component styles (smwb-*) shared by the @smwb UI libraries. Prebuilt aggregate CSS lives in @smwb/ui-css.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"sideEffects": [
|