ngwr 9.1.0 → 10.1.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 +23 -8
- package/action-sheet/styles/_index.scss +6 -1
- package/badge/styles/_index.scss +17 -7
- package/badge/styles/_tag.scss +12 -3
- package/border-glow/styles/_index.scss +5 -0
- package/button/styles/_index.scss +48 -1
- package/calendar/styles/_index.scss +9 -1
- package/circular-text/styles/_index.scss +6 -1
- package/density/styles/_index.scss +3 -1
- package/dialog/styles/_index.scss +66 -2
- package/drag-drop/styles/_index.scss +20 -7
- package/drawer/styles/_index.scss +61 -1
- package/event-calendar/styles/_index.scss +284 -0
- package/falling-text/styles/_index.scss +5 -0
- package/fesm2022/ngwr-action-sheet.mjs +1 -1
- package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
- package/fesm2022/ngwr-alert.mjs +8 -3
- package/fesm2022/ngwr-alert.mjs.map +1 -1
- package/fesm2022/ngwr-back-top.mjs +6 -4
- package/fesm2022/ngwr-back-top.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow.mjs +12 -9
- package/fesm2022/ngwr-border-glow.mjs.map +1 -1
- package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-calendar.mjs +5 -3
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +2 -2
- package/fesm2022/ngwr-card.mjs.map +1 -1
- package/fesm2022/ngwr-carousel.mjs +17 -4
- package/fesm2022/ngwr-carousel.mjs.map +1 -1
- package/fesm2022/ngwr-cascader.mjs +35 -7
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +12 -3
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text.mjs +2 -2
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker.mjs +6 -5
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette.mjs +7 -3
- package/fesm2022/ngwr-command-palette.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu.mjs +7 -7
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-counter.mjs +9 -1
- package/fesm2022/ngwr-counter.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker.mjs +37 -15
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/ngwr-density.mjs +10 -2
- package/fesm2022/ngwr-density.mjs.map +1 -1
- package/fesm2022/ngwr-descriptions.mjs +5 -4
- package/fesm2022/ngwr-descriptions.mjs.map +1 -1
- package/fesm2022/ngwr-dialog.mjs +10 -1
- package/fesm2022/ngwr-dialog.mjs.map +1 -1
- package/fesm2022/ngwr-drag-drop.mjs +2 -2
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
- package/fesm2022/ngwr-drawer.mjs +37 -16
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +8 -3
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar.mjs +723 -0
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -0
- package/fesm2022/ngwr-falling-text.mjs +2 -2
- package/fesm2022/ngwr-falling-text.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload.mjs +2 -2
- package/fesm2022/ngwr-file-upload.mjs.map +1 -1
- package/fesm2022/ngwr-form.mjs +258 -42
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text.mjs +15 -1
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge.mjs +8 -3
- package/fesm2022/ngwr-gauge.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text.mjs +2 -2
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text.mjs +2 -2
- package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +89 -5
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +90 -5
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +94 -3
- package/fesm2022/ngwr-i18n.mjs.map +1 -1
- package/fesm2022/ngwr-icon.mjs +79 -35
- package/fesm2022/ngwr-icon.mjs.map +1 -1
- package/fesm2022/ngwr-input-number.mjs +19 -3
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input.mjs +48 -6
- package/fesm2022/ngwr-input.mjs.map +1 -1
- package/fesm2022/ngwr-knob.mjs +8 -3
- package/fesm2022/ngwr-knob.mjs.map +1 -1
- package/fesm2022/ngwr-lightbox.mjs +32 -3
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart.mjs +3 -3
- package/fesm2022/ngwr-line-chart.mjs.map +1 -1
- package/fesm2022/ngwr-list.mjs +2 -2
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +2 -2
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
- package/fesm2022/ngwr-marquee.mjs +2 -2
- package/fesm2022/ngwr-marquee.mjs.map +1 -1
- package/fesm2022/ngwr-media.mjs +3 -0
- package/fesm2022/ngwr-media.mjs.map +1 -1
- package/fesm2022/ngwr-mention.mjs +166 -10
- package/fesm2022/ngwr-mention.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group.mjs +14 -3
- package/fesm2022/ngwr-meter-group.mjs.map +1 -1
- package/fesm2022/ngwr-overlay.mjs +173 -3
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-page-header.mjs +2 -2
- package/fesm2022/ngwr-page-header.mjs.map +1 -1
- package/fesm2022/ngwr-pagination.mjs +17 -4
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-popconfirm.mjs +4 -3
- package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +10 -3
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-progress.mjs +8 -2
- package/fesm2022/ngwr-progress.mjs.map +1 -1
- package/fesm2022/ngwr-qr.mjs.map +1 -1
- package/fesm2022/ngwr-rating.mjs +6 -4
- package/fesm2022/ngwr-rating.mjs.map +1 -1
- package/fesm2022/ngwr-result.mjs +19 -12
- package/fesm2022/ngwr-result.mjs.map +1 -1
- package/fesm2022/ngwr-segmented.mjs +2 -2
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +40 -13
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text.mjs +4 -6
- package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
- package/fesm2022/ngwr-speed-dial.mjs +11 -3
- package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
- package/fesm2022/ngwr-spotlight-card.mjs +2 -2
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-squircle.mjs +1 -1
- package/fesm2022/ngwr-squircle.mjs.map +1 -1
- package/fesm2022/ngwr-star-border.mjs +2 -2
- package/fesm2022/ngwr-star-border.mjs.map +1 -1
- package/fesm2022/ngwr-switch.mjs +10 -3
- package/fesm2022/ngwr-switch.mjs.map +1 -1
- package/fesm2022/ngwr-table.mjs +233 -19
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +21 -4
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-textarea.mjs +20 -4
- package/fesm2022/ngwr-textarea.mjs.map +1 -1
- package/fesm2022/ngwr-theme.mjs +13 -3
- package/fesm2022/ngwr-theme.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card.mjs +2 -2
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +2 -2
- package/fesm2022/ngwr-toolbar.mjs.map +1 -1
- package/fesm2022/ngwr-tour.mjs +264 -0
- package/fesm2022/ngwr-tour.mjs.map +1 -0
- package/fesm2022/ngwr-transfer.mjs +184 -0
- package/fesm2022/ngwr-transfer.mjs.map +1 -0
- package/fesm2022/ngwr-tree.mjs +27 -9
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter.mjs +2 -2
- package/fesm2022/ngwr-typewriter.mjs.map +1 -1
- package/fesm2022/ngwr-validators.mjs +118 -2
- package/fesm2022/ngwr-validators.mjs.map +1 -1
- package/fesm2022/ngwr-version.mjs +2 -2
- package/fesm2022/ngwr-version.mjs.map +1 -1
- package/fesm2022/ngwr-virtual-scroll.mjs +2 -2
- package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-waves.mjs +25 -3
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/form/styles/_index.scss +8 -4
- package/glitch-text/styles/_index.scss +5 -0
- package/gradient-text/styles/_index.scss +5 -0
- package/i18n/en.json +233 -0
- package/i18n/ru.json +233 -0
- package/icon/styles/_index.scss +15 -1
- package/input/styles/_index.scss +16 -0
- package/input-number/styles/_index.scss +8 -1
- package/keyboard/styles/_index.scss +15 -3
- package/llms-full.txt +124 -63
- package/llms.txt +29 -8
- package/loading-bar/styles/_index.scss +5 -0
- package/marquee/styles/_index.scss +7 -2
- package/mention/styles/_index.scss +23 -0
- package/overlay/styles/_index.scss +5 -0
- package/package.json +15 -1
- package/pagination/styles/_index.scss +12 -0
- package/popover/styles/_index.scss +165 -45
- package/pull-to-refresh/styles/_index.scss +5 -0
- package/result/styles/_index.scss +3 -3
- package/schematics/icon-set/index.js +80 -34
- package/schematics/icon-set/schema.json +8 -3
- package/schematics/ng-add/index.js +23 -6
- package/schematics/package.json +3 -0
- package/schematics/page/templates.js +17 -21
- package/schematics/provider/index.js +31 -13
- package/schematics/provider/schema.json +40 -24
- package/schematics/use/index.js +5 -1
- package/schematics/use/schema.json +8 -3
- package/schematics/use/symbol-map.json +7 -176
- package/segmented/styles/_index.scss +1 -1
- package/select/styles/_index.scss +20 -3
- package/shiny-text/styles/_index.scss +5 -0
- package/speed-dial/styles/_index.scss +12 -1
- package/splitter/styles/_index.scss +7 -1
- package/spotlight-card/styles/_index.scss +5 -0
- package/squircle/styles/_index.scss +5 -0
- package/star-border/styles/_index.scss +5 -0
- package/statistic/styles/_index.scss +2 -2
- package/styles/_animations.scss +6 -0
- package/styles.scss +3 -0
- package/table/styles/_index.scss +128 -12
- package/theme/styles/_box-model.scss +29 -0
- package/theme/styles/_colors.scss +116 -15
- package/theme/styles/_dark.scss +65 -7
- package/theme/styles/_focus.scss +2 -8
- package/theme/styles/_index.scss +1 -0
- package/tilt-card/styles/_index.scss +5 -0
- package/toast/styles/_index.scss +6 -3
- package/tour/styles/_index.scss +63 -0
- package/transfer/styles/_index.scss +105 -0
- package/types/ngwr-alert.d.ts +4 -1
- package/types/ngwr-avatar.d.ts +1 -1
- package/types/ngwr-back-top.d.ts +3 -2
- package/types/ngwr-badge.d.ts +1 -1
- package/types/ngwr-border-glow.d.ts +0 -1
- package/types/ngwr-carousel.d.ts +10 -1
- package/types/ngwr-cascader.d.ts +13 -1
- package/types/ngwr-checkbox.d.ts +9 -1
- package/types/ngwr-color-picker.d.ts +1 -0
- package/types/ngwr-command-palette.d.ts +4 -1
- package/types/ngwr-context-menu.d.ts +1 -0
- package/types/ngwr-date-picker.d.ts +14 -4
- package/types/ngwr-density.d.ts +9 -2
- package/types/ngwr-dialog.d.ts +9 -0
- package/types/ngwr-divider.d.ts +1 -1
- package/types/ngwr-drawer.d.ts +20 -4
- package/types/ngwr-dropdown.d.ts +1 -0
- package/types/ngwr-event-calendar.d.ts +358 -0
- package/types/ngwr-form.d.ts +177 -20
- package/types/ngwr-fuzzy-text.d.ts +8 -0
- package/types/ngwr-gauge.d.ts +4 -1
- package/types/ngwr-i18n.d.ts +80 -2
- package/types/ngwr-icon.d.ts +11 -19
- package/types/ngwr-input-number.d.ts +8 -1
- package/types/ngwr-input.d.ts +50 -20
- package/types/ngwr-knob.d.ts +4 -1
- package/types/ngwr-lightbox.d.ts +7 -1
- package/types/ngwr-line-chart.d.ts +1 -1
- package/types/ngwr-media.d.ts +1 -1
- package/types/ngwr-mention.d.ts +45 -1
- package/types/ngwr-meter-group.d.ts +9 -1
- package/types/ngwr-overlay.d.ts +80 -2
- package/types/ngwr-page-header.d.ts +2 -2
- package/types/ngwr-pagination.d.ts +15 -2
- package/types/ngwr-popconfirm.d.ts +1 -0
- package/types/ngwr-popover.d.ts +1 -0
- package/types/ngwr-progress.d.ts +4 -1
- package/types/ngwr-rating.d.ts +3 -2
- package/types/ngwr-result.d.ts +12 -6
- package/types/ngwr-segmented.d.ts +6 -0
- package/types/ngwr-select.d.ts +19 -7
- package/types/ngwr-shiny-text.d.ts +2 -4
- package/types/ngwr-speed-dial.d.ts +7 -1
- package/types/ngwr-squircle.d.ts +1 -1
- package/types/ngwr-switch.d.ts +7 -1
- package/types/ngwr-table.d.ts +126 -6
- package/types/ngwr-tabs.d.ts +1 -4
- package/types/ngwr-textarea.d.ts +8 -1
- package/types/ngwr-theme.d.ts +8 -1
- package/types/ngwr-toolbar.d.ts +2 -2
- package/types/ngwr-tour.d.ts +132 -0
- package/types/ngwr-transfer.d.ts +118 -0
- package/types/ngwr-tree.d.ts +11 -2
- package/types/ngwr-validators.d.ts +62 -2
- package/types/ngwr-version.d.ts +2 -2
- package/types/ngwr-waves.d.ts +10 -0
- package/typewriter/styles/_index.scss +5 -0
- package/typography/styles/_index.scss +3 -3
- package/virtual-scroll/styles/_index.scss +6 -1
- package/waves/styles/_index.scss +26 -0
package/table/styles/_index.scss
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
@use '../../theme/styles' as theme;
|
|
2
2
|
|
|
3
3
|
.wr-table {
|
|
4
|
+
--wr-table-bg: var(--wr-color-surface);
|
|
4
5
|
--wr-table-border: var(--wr-color-outline);
|
|
5
6
|
--wr-table-head-bg: rgba(var(--wr-color-outline-rgb), 0.25);
|
|
6
7
|
--wr-table-row-hover: rgba(var(--wr-color-outline-rgb), 0.15);
|
|
8
|
+
// Head casing. The library renders column titles as the author wrote them —
|
|
9
|
+
// forcing `uppercase` mutates their content, and a header written "ID" or
|
|
10
|
+
// "created at" is the consumer's decision to make, not ours. Both halves stay
|
|
11
|
+
// tokens, so opting back into the old treatment is one rule:
|
|
12
|
+
// .wr-table { --wr-table-head-transform: uppercase;
|
|
13
|
+
// --wr-table-head-letter-spacing: 0.04em; }
|
|
14
|
+
// The tracking moves with the casing on purpose — 0.04em is there to open up
|
|
15
|
+
// capitals and looks wrong on sentence case.
|
|
16
|
+
--wr-table-head-transform: none;
|
|
17
|
+
--wr-table-head-letter-spacing: var(--wr-tracking-normal);
|
|
7
18
|
|
|
8
19
|
display: block;
|
|
9
20
|
position: relative;
|
|
21
|
+
// The table paints its own surface. Sticky pinned cells already fill with
|
|
22
|
+
// --wr-color-surface, so leaving the table transparent let a page background
|
|
23
|
+
// show through the normal rows while the pinned ones stayed opaque.
|
|
24
|
+
background: var(--wr-table-bg);
|
|
10
25
|
// Own stacking context so the loading overlay reliably outranks the sticky
|
|
11
26
|
// pinned cells regardless of the surrounding page z-index.
|
|
12
27
|
isolation: isolate;
|
|
@@ -50,8 +65,8 @@
|
|
|
50
65
|
color: var(--wr-color-on-surface-muted);
|
|
51
66
|
font-weight: 600;
|
|
52
67
|
font-size: var(--wr-text-xs);
|
|
53
|
-
letter-spacing:
|
|
54
|
-
text-transform:
|
|
68
|
+
letter-spacing: var(--wr-table-head-letter-spacing);
|
|
69
|
+
text-transform: var(--wr-table-head-transform);
|
|
55
70
|
white-space: nowrap;
|
|
56
71
|
}
|
|
57
72
|
|
|
@@ -111,8 +126,67 @@
|
|
|
111
126
|
opacity: 0.35;
|
|
112
127
|
}
|
|
113
128
|
|
|
114
|
-
|
|
115
|
-
|
|
129
|
+
// NOTE: `.cdk-drag-animating` is NOT here. CDK puts it on the preview clone,
|
|
130
|
+
// which lives in `<body>` — see the rule at the end of this file.
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
// --- Tree rows ------------------------------------------------------------
|
|
134
|
+
// Depth lives on the `<tr>` as `--wr-table-depth` and is spent inside the tree
|
|
135
|
+
// column's cell, not as a lead column: a new column would break `columnOrder`
|
|
136
|
+
// indexes and the pin measurements, and a child would stop being an ordinary
|
|
137
|
+
// `<tr>` going through the same cell loop.
|
|
138
|
+
&__tree-lead {
|
|
139
|
+
display: inline-flex;
|
|
140
|
+
align-items: center;
|
|
141
|
+
vertical-align: middle;
|
|
142
|
+
margin-inline-end: 0.25rem;
|
|
143
|
+
padding-inline-start: calc(var(--wr-table-depth, 0) * var(--wr-table-indent, 1.25rem));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
&__tree-toggle {
|
|
147
|
+
appearance: none;
|
|
148
|
+
flex: 0 0 auto;
|
|
149
|
+
display: inline-flex;
|
|
150
|
+
align-items: center;
|
|
151
|
+
justify-content: center;
|
|
152
|
+
width: 1.25rem;
|
|
153
|
+
height: 1.25rem;
|
|
154
|
+
padding: 0;
|
|
155
|
+
background: transparent;
|
|
156
|
+
border: 0;
|
|
157
|
+
border-radius: var(--wr-border-radius-sm);
|
|
158
|
+
color: var(--wr-color-on-surface-muted);
|
|
159
|
+
cursor: pointer;
|
|
160
|
+
|
|
161
|
+
&:hover {
|
|
162
|
+
background: var(--wr-color-hover);
|
|
163
|
+
color: var(--wr-color-on-surface);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// A leaf keeps the slot so labels line up down a column, but is not a
|
|
167
|
+
// button and is hidden from assistive tech.
|
|
168
|
+
&--leaf {
|
|
169
|
+
cursor: default;
|
|
170
|
+
visibility: hidden;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
&__tree-icon {
|
|
175
|
+
width: 0.875rem;
|
|
176
|
+
height: 0.875rem;
|
|
177
|
+
transition: transform var(--wr-transition-base);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
&__tree-toggle--open &__tree-icon,
|
|
181
|
+
&__tree-toggle--open .wr-table__tree-icon {
|
|
182
|
+
transform: rotate(90deg);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Card mode stacks label / value with `justify-content: space-between`, so an
|
|
186
|
+
// extra inline child would strand the chevron mid-row. Fold the lead into the
|
|
187
|
+
// value side instead.
|
|
188
|
+
&--responsive &__tree-lead {
|
|
189
|
+
margin-inline-end: 0.375rem;
|
|
116
190
|
}
|
|
117
191
|
|
|
118
192
|
// --- Row selection --------------------------------------------------------
|
|
@@ -191,6 +265,9 @@
|
|
|
191
265
|
}
|
|
192
266
|
|
|
193
267
|
// --- Summary / footer row -------------------------------------------------
|
|
268
|
+
// `&__foot-cell--lead` is emitted on the selection / expand footer cells and
|
|
269
|
+
// carries no styles of its own — it exists as a public hook so consumers can
|
|
270
|
+
// target those two cells without matching on position.
|
|
194
271
|
&__foot-cell {
|
|
195
272
|
padding: calc(0.625rem * var(--wr-density-y, 1)) calc(0.875rem * var(--wr-density-x, 1));
|
|
196
273
|
background: var(--wr-table-head-bg);
|
|
@@ -203,7 +280,7 @@
|
|
|
203
280
|
// Pinned footer cells need an opaque base (over the head tint) to stay sticky.
|
|
204
281
|
&__foot-cell#{&}__td--pin-left,
|
|
205
282
|
&__foot-cell#{&}__td--pin-right {
|
|
206
|
-
background-color: var(--wr-
|
|
283
|
+
background-color: var(--wr-table-bg);
|
|
207
284
|
background-image: linear-gradient(var(--wr-table-head-bg), var(--wr-table-head-bg));
|
|
208
285
|
}
|
|
209
286
|
|
|
@@ -221,14 +298,14 @@
|
|
|
221
298
|
&__td--pin-left,
|
|
222
299
|
&__td--pin-right {
|
|
223
300
|
z-index: 1;
|
|
224
|
-
background-color: var(--wr-
|
|
301
|
+
background-color: var(--wr-table-bg);
|
|
225
302
|
}
|
|
226
303
|
|
|
227
304
|
// Header cells lay the head tint over the opaque base so the row stays seamless.
|
|
228
305
|
&__th--pin-left,
|
|
229
306
|
&__th--pin-right {
|
|
230
307
|
z-index: 2;
|
|
231
|
-
background-color: var(--wr-
|
|
308
|
+
background-color: var(--wr-table-bg);
|
|
232
309
|
background-image: linear-gradient(var(--wr-table-head-bg), var(--wr-table-head-bg));
|
|
233
310
|
}
|
|
234
311
|
|
|
@@ -392,7 +469,7 @@
|
|
|
392
469
|
&__group-foot-row > &__foot-cell {
|
|
393
470
|
border-top: 0;
|
|
394
471
|
border-bottom: 1px solid var(--wr-table-border);
|
|
395
|
-
background-color: var(--wr-
|
|
472
|
+
background-color: var(--wr-table-bg);
|
|
396
473
|
background-image: linear-gradient(var(--wr-table-group-bg), var(--wr-table-group-bg));
|
|
397
474
|
}
|
|
398
475
|
|
|
@@ -424,7 +501,7 @@
|
|
|
424
501
|
}
|
|
425
502
|
|
|
426
503
|
thead th:not(.wr-table__th--pin-left):not(.wr-table__th--pin-right) {
|
|
427
|
-
background-color: var(--wr-
|
|
504
|
+
background-color: var(--wr-table-bg);
|
|
428
505
|
background-image: linear-gradient(var(--wr-table-head-bg), var(--wr-table-head-bg));
|
|
429
506
|
}
|
|
430
507
|
|
|
@@ -456,7 +533,7 @@
|
|
|
456
533
|
}
|
|
457
534
|
|
|
458
535
|
tfoot .wr-table__foot-cell:not(.wr-table__td--pin-left):not(.wr-table__td--pin-right) {
|
|
459
|
-
background-color: var(--wr-
|
|
536
|
+
background-color: var(--wr-table-bg);
|
|
460
537
|
background-image: linear-gradient(var(--wr-table-head-bg), var(--wr-table-head-bg));
|
|
461
538
|
}
|
|
462
539
|
|
|
@@ -518,8 +595,11 @@
|
|
|
518
595
|
color: var(--wr-color-on-surface-muted);
|
|
519
596
|
font-size: var(--wr-text-xs);
|
|
520
597
|
font-weight: 600;
|
|
521
|
-
|
|
522
|
-
|
|
598
|
+
// Route through the same tokens as `&__th` instead of re-hard-coding the
|
|
599
|
+
// treatment — card mode used to ignore `--wr-table-head-transform` entirely,
|
|
600
|
+
// so a consumer who opted out still got capitals on mobile.
|
|
601
|
+
letter-spacing: var(--wr-table-head-letter-spacing);
|
|
602
|
+
text-transform: var(--wr-table-head-transform);
|
|
523
603
|
text-align: left;
|
|
524
604
|
white-space: nowrap;
|
|
525
605
|
}
|
|
@@ -744,3 +824,39 @@
|
|
|
744
824
|
}
|
|
745
825
|
}
|
|
746
826
|
}
|
|
827
|
+
|
|
828
|
+
// The dragged header's preview is a clone CDK moves to `document.body`, so it
|
|
829
|
+
// leaves `.wr-table` behind and no ancestor selector reaches it — the clone's
|
|
830
|
+
// own `wr-table__th` class does. Declared here rather than inherited: until the
|
|
831
|
+
// drag-drop entry point's rules were scoped, this preview silently wore
|
|
832
|
+
// `wr-sortable-list`'s lift shadow, and scoping them without this would have
|
|
833
|
+
// left the column preview with no chrome at all.
|
|
834
|
+
.cdk-drag-preview.wr-table__th {
|
|
835
|
+
box-sizing: border-box;
|
|
836
|
+
display: flex;
|
|
837
|
+
align-items: center;
|
|
838
|
+
// Every value has to resolve in `<body>`: the `--wr-table-*` tokens are
|
|
839
|
+
// declared on `.wr-table`, which the preview has left, so they are passed with
|
|
840
|
+
// the same defaults that block sets. `--wr-density-*` and `--wr-color-*` are
|
|
841
|
+
// root-level and resolve as-is.
|
|
842
|
+
padding: calc(0.625rem * var(--wr-density-y, 1)) calc(0.875rem * var(--wr-density-x, 1));
|
|
843
|
+
background: var(--wr-table-head-bg, rgba(var(--wr-color-outline-rgb), 0.25));
|
|
844
|
+
color: var(--wr-color-on-surface-muted);
|
|
845
|
+
font-family: var(--wr-font-family-base);
|
|
846
|
+
font-weight: 600;
|
|
847
|
+
font-size: var(--wr-text-xs);
|
|
848
|
+
letter-spacing: var(--wr-table-head-letter-spacing, var(--wr-tracking-normal));
|
|
849
|
+
text-transform: var(--wr-table-head-transform, none);
|
|
850
|
+
white-space: nowrap;
|
|
851
|
+
border-radius: var(--wr-border-radius-sm);
|
|
852
|
+
box-shadow: 0 8px 12px rgba(var(--wr-color-backdrop-rgb), 0.24);
|
|
853
|
+
// The preview must track the cursor 1:1 — never animate its transform.
|
|
854
|
+
transition: none;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
// The settle animation after a drop. Same element as the rule above — CDK adds
|
|
858
|
+
// `cdk-drag-animating` to the preview while it flies back to the drop slot — so
|
|
859
|
+
// it must come after it to beat that `transition: none` at equal specificity.
|
|
860
|
+
.cdk-drag-animating.wr-table__th {
|
|
861
|
+
transition: transform 0.18s var(--wr-ease-out);
|
|
862
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Box model baseline for ngwr's own elements.
|
|
2
|
+
//
|
|
3
|
+
// `ngwr/reset` (which does set `box-sizing: border-box` globally) is opt-in by
|
|
4
|
+
// design, and the umbrella `@use 'ngwr'` deliberately leaves it out — so a
|
|
5
|
+
// consumer following the documented "import once, everything works" path lands
|
|
6
|
+
// in a `content-box` world. Components can't assume otherwise, and several of
|
|
7
|
+
// them did: any `.wr-*` element that pairs `width: 100%` with padding or a
|
|
8
|
+
// border overflowed its container by exactly padding + border. Measured in a
|
|
9
|
+
// stock Angular app on `@use 'ngwr'`:
|
|
10
|
+
//
|
|
11
|
+
// .wr-btn--block → 30px over (14+14 padding, 1+1 border)
|
|
12
|
+
// .wr-input (sm / md / lg) → 18 / 26 / 34px over
|
|
13
|
+
// .wr-textarea__native → 16 / 24 / 32px over
|
|
14
|
+
// .wr-input-group → 2px over (border only)
|
|
15
|
+
//
|
|
16
|
+
// Which is where the stray horizontal scrollbars came from.
|
|
17
|
+
//
|
|
18
|
+
// Scoped to the `wr-` namespace so it can never change the box model of
|
|
19
|
+
// consumer markup — that stays their call, via `ngwr/reset` or their own reset.
|
|
20
|
+
//
|
|
21
|
+
// `:where()` contributes zero specificity on purpose: this is a baseline, not an
|
|
22
|
+
// override. `.wr-icon` and `.wr-spinner` declare `content-box` deliberately (the
|
|
23
|
+
// declared size IS the glyph box) and keep winning without needing `!important`
|
|
24
|
+
// or a particular load order.
|
|
25
|
+
:where([class^='wr-'], [class*=' wr-']),
|
|
26
|
+
:where([class^='wr-'], [class*=' wr-'])::before,
|
|
27
|
+
:where([class^='wr-'], [class*=' wr-'])::after {
|
|
28
|
+
box-sizing: border-box;
|
|
29
|
+
}
|
|
@@ -21,11 +21,10 @@ $base-colors: (
|
|
|
21
21
|
dark: #0f172a,
|
|
22
22
|
) !default;
|
|
23
23
|
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
// pure blue as 50%-lightness even though it reads as dark).
|
|
24
|
+
// Deprecated: the old YIQ brightness cut-off. No longer read — `_contrast()`
|
|
25
|
+
// compares real WCAG contrast ratios, which needs no threshold. Kept declared
|
|
26
|
+
// so `@use 'ngwr/theme' with ($contrast-threshold: …)` in an existing app still
|
|
27
|
+
// compiles instead of erroring on an unknown variable.
|
|
29
28
|
$contrast-threshold: 150 !default;
|
|
30
29
|
|
|
31
30
|
// Dark text used on light backgrounds.
|
|
@@ -40,20 +39,69 @@ $contrast-light: #ffffff !default;
|
|
|
40
39
|
@return color.channel($c, 'red'), color.channel($c, 'green'), color.channel($c, 'blue');
|
|
41
40
|
}
|
|
42
41
|
|
|
42
|
+
/** One channel, linearised per WCAG 2.x. */
|
|
43
|
+
@function _linear($channel) {
|
|
44
|
+
$s: math.div($channel, 255);
|
|
45
|
+
@if $s <= 0.03928 {
|
|
46
|
+
@return math.div($s, 12.92);
|
|
47
|
+
}
|
|
48
|
+
@return math.pow(math.div($s + 0.055, 1.055), 2.4);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** WCAG relative luminance of a colour. */
|
|
52
|
+
@function _luminance($c) {
|
|
53
|
+
@return 0.2126 * _linear(color.channel($c, 'red')) + 0.7152 * _linear(color.channel($c, 'green')) + 0.0722 *
|
|
54
|
+
_linear(color.channel($c, 'blue'));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** WCAG contrast ratio between two colours. */
|
|
58
|
+
@function _ratio($a, $b) {
|
|
59
|
+
$la: _luminance($a);
|
|
60
|
+
$lb: _luminance($b);
|
|
61
|
+
$hi: math.max($la, $lb);
|
|
62
|
+
$lo: math.min($la, $lb);
|
|
63
|
+
@return math.div($hi + 0.05, $lo + 0.05);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Foreground that actually reads best on `$c` — whichever of the two candidates
|
|
68
|
+
* wins on WCAG contrast ratio.
|
|
69
|
+
*
|
|
70
|
+
* Was a YIQ brightness threshold, which is a brightness *estimate*, not the
|
|
71
|
+
* metric accessibility is judged by, and it mispicked on every mid-saturation
|
|
72
|
+
* colour: five of the nine shipped intents got white text below AA
|
|
73
|
+
* (success 3.33:1, medium 3.10:1, danger and info 3.68:1, secondary 3.99:1)
|
|
74
|
+
* where dark text would have cleared it (5.43 / 5.82 / 4.90 / 4.91 / 4.52).
|
|
75
|
+
* Comparing the real ratios needs no threshold to tune.
|
|
76
|
+
*/
|
|
43
77
|
@function _contrast($c) {
|
|
44
|
-
$
|
|
45
|
-
$g: color.channel($c, 'green');
|
|
46
|
-
$b: color.channel($c, 'blue');
|
|
47
|
-
$yiq: math.div($r * 299 + $g * 587 + $b * 114, 1000);
|
|
48
|
-
@if $yiq >= $contrast-threshold {
|
|
78
|
+
@if _ratio($c, $contrast-dark) >= _ratio($c, $contrast-light) {
|
|
49
79
|
@return $contrast-dark;
|
|
50
80
|
}
|
|
51
81
|
@return $contrast-light;
|
|
52
82
|
}
|
|
53
83
|
|
|
84
|
+
/**
|
|
85
|
+
* Public alias of {@link _contrast}. Any theme partial that re-tunes an intent
|
|
86
|
+
* has to re-derive its `-contrast` token too, otherwise the token stays baked
|
|
87
|
+
* from the light palette — which is how the dark theme ended up putting white
|
|
88
|
+
* text on its lightened primary at 3.36:1.
|
|
89
|
+
*/
|
|
90
|
+
@function contrast($c) {
|
|
91
|
+
@return _contrast($c);
|
|
92
|
+
}
|
|
93
|
+
|
|
54
94
|
// CSS variables
|
|
55
95
|
|
|
56
96
|
:root {
|
|
97
|
+
// Declared here so the light token set also claims the light UA scheme.
|
|
98
|
+
// Without it the browser fell back to the OS preference, and an app running
|
|
99
|
+
// ngwr's LIGHT theme on a dark-mode machine got dark scrollbars and dark
|
|
100
|
+
// native controls (<textarea>, date/colour inputs) against light surfaces.
|
|
101
|
+
// `_dark.scss` still flips it to `dark` under [data-theme='dark'], which wins
|
|
102
|
+
// on specificity.
|
|
103
|
+
color-scheme: light;
|
|
104
|
+
|
|
57
105
|
--wr-color-white: #ffffff;
|
|
58
106
|
--wr-color-white-rgb: 255, 255, 255;
|
|
59
107
|
--wr-color-black: #000000;
|
|
@@ -80,10 +128,25 @@ $contrast-light: #ffffff !default;
|
|
|
80
128
|
// regardless of theme.
|
|
81
129
|
--wr-color-overlay: rgba(var(--wr-color-backdrop-rgb), 0.45);
|
|
82
130
|
|
|
83
|
-
//
|
|
131
|
+
// Muted TEXT, deliberately its own token rather than an alias of the `medium`
|
|
132
|
+
// intent. The two roles pull in opposite directions and cannot share a value:
|
|
133
|
+
// as text it needs >= 4.5:1 against the lightest surface (#ebeff4), while as a
|
|
134
|
+
// button fill it carries dark text and needs >= 4.5:1 the other way. The best
|
|
135
|
+
// candidate for either fails the other — the window closes around #6b7a8a
|
|
136
|
+
// (3.81 as text, 4.11 as fill). Aliasing them left secondary text at 2.69:1.
|
|
137
|
+
--wr-color-muted-text: #5f6c7d;
|
|
138
|
+
--wr-color-muted-text-rgb: 95, 108, 125;
|
|
139
|
+
|
|
140
|
+
// De-emphasized text — the muted ink dimmed to two canonical strengths so
|
|
84
141
|
// labels / captions / placeholders read consistently. One place each.
|
|
85
|
-
|
|
86
|
-
|
|
142
|
+
// Only the full-opacity token above is AA-safe for body text; these two are
|
|
143
|
+
// decorative by design (0.85 reaches ~3.5:1, 0.6 ~2.3:1 on a light surface).
|
|
144
|
+
// 0.95, not 0.85: the role itself is 5.35:1 on the light surface, but wrapping
|
|
145
|
+
// it at 0.85 composited to #778291 — 3.90:1, under the AA bar. 0.95 is the
|
|
146
|
+
// most softening that still clears it (4.81), which leaves this token barely
|
|
147
|
+
// distinguishable from the flat role it wraps.
|
|
148
|
+
--wr-color-text-muted: rgba(var(--wr-color-muted-text-rgb), 0.95);
|
|
149
|
+
--wr-color-text-faint: rgba(var(--wr-color-muted-text-rgb), 0.6);
|
|
87
150
|
|
|
88
151
|
// Neutral gray ramp — a FIXED primitive scale (slate). Each step is a stable
|
|
89
152
|
// job (50 = subtlest surface tint … 950 = strongest ink) and, unlike the
|
|
@@ -121,8 +184,8 @@ $contrast-light: #ffffff !default;
|
|
|
121
184
|
--wr-color-surface-rgb: var(--wr-color-white-rgb);
|
|
122
185
|
--wr-color-on-surface: var(--wr-color-dark);
|
|
123
186
|
--wr-color-on-surface-rgb: var(--wr-color-dark-rgb);
|
|
124
|
-
--wr-color-on-surface-muted: var(--wr-color-
|
|
125
|
-
--wr-color-on-surface-muted-rgb: var(--wr-color-
|
|
187
|
+
--wr-color-on-surface-muted: var(--wr-color-muted-text);
|
|
188
|
+
--wr-color-on-surface-muted-rgb: var(--wr-color-muted-text-rgb);
|
|
126
189
|
|
|
127
190
|
// Solid hairline / divider colour. Distinct from `--wr-color-border` above,
|
|
128
191
|
// which is deliberately translucent (`light` at 50%) so it reads on any
|
|
@@ -155,6 +218,44 @@ $contrast-light: #ffffff !default;
|
|
|
155
218
|
--wr-color-#{$name}-soft-contrast: color-mix(in srgb, var(--wr-color-#{$name}) 62%, var(--wr-color-dark));
|
|
156
219
|
--wr-color-#{$name}-active: rgba(var(--wr-color-#{$name}-rgb), 0.2);
|
|
157
220
|
}
|
|
221
|
+
|
|
222
|
+
// `-ink`: the intent used as TEXT on `--wr-color-surface`.
|
|
223
|
+
//
|
|
224
|
+
// v10 fixed the opposite direction — `-contrast`, the label ON a filled
|
|
225
|
+
// intent. The inverse was never covered, and the light theme fails WCAG AA
|
|
226
|
+
// everywhere an outlined / bordered variant paints the hue as its own label:
|
|
227
|
+
// warning lands at 1.71:1 against a 4.5 bar, medium 3.10, success 3.33,
|
|
228
|
+
// danger and info 3.68, secondary 3.99. Dark passes on all of them, because
|
|
229
|
+
// its bases were retuned lighter for a dark canvas and that happens to be the
|
|
230
|
+
// accessible direction.
|
|
231
|
+
//
|
|
232
|
+
// Same recipe as `-soft-contrast`: mixing toward `--wr-color-dark` darkens in
|
|
233
|
+
// light and lightens in dark from ONE declaration, because that token itself
|
|
234
|
+
// flips. The share is per intent rather than uniform — warning has to travel
|
|
235
|
+
// furthest (a yellow readable on white is not yellow), and forcing every
|
|
236
|
+
// intent to warning's share would drag primary to near-navy for no reason.
|
|
237
|
+
// Each is the measured minimum that clears 4.5:1 in BOTH themes on the surface
|
|
238
|
+
// and on the tag's 6% / 10% tints, with 3pp of headroom.
|
|
239
|
+
$ink-mix: (
|
|
240
|
+
primary: 93%,
|
|
241
|
+
secondary: 80%,
|
|
242
|
+
success: 72%,
|
|
243
|
+
warning: 50%,
|
|
244
|
+
danger: 77%,
|
|
245
|
+
info: 76%,
|
|
246
|
+
medium: 69%,
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
@each $name, $share in $ink-mix {
|
|
250
|
+
--wr-color-#{$name}-ink: color-mix(in srgb, var(--wr-color-#{$name}) #{$share}, var(--wr-color-dark));
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// `light` is a surface tone by definition — a hair off the page background in
|
|
254
|
+
// either theme — so there is no darkening that keeps it recognisable AND
|
|
255
|
+
// readable. It borrows the page's own ink; the border still carries the
|
|
256
|
+
// intent. `dark` already IS the ink.
|
|
257
|
+
--wr-color-light-ink: var(--wr-color-on-surface);
|
|
258
|
+
--wr-color-dark-ink: var(--wr-color-dark);
|
|
158
259
|
}
|
|
159
260
|
|
|
160
261
|
// Public SCSS list
|
package/theme/styles/_dark.scss
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
@use 'sass:color';
|
|
2
2
|
|
|
3
|
+
@use 'colors';
|
|
4
|
+
|
|
3
5
|
// Dark theme overrides — opt-in via `[data-theme="dark"]` on <html>.
|
|
4
6
|
// Drive the toggle from `WrTheme` (provided automatically with
|
|
5
7
|
// `provideWrTheme(...)`).
|
|
@@ -17,6 +19,15 @@ $dark-intents: (
|
|
|
17
19
|
danger: #ff5c5c,
|
|
18
20
|
);
|
|
19
21
|
|
|
22
|
+
// The surface / ink bases below are re-tuned for the dark canvas too, but they
|
|
23
|
+
// live in hand-written blocks (each one documents a judgement call the loop
|
|
24
|
+
// can't express). Holding the values in variables lets the `-rgb` triplets and
|
|
25
|
+
// the shade derivations read from the value that actually ships, instead of
|
|
26
|
+
// being re-typed next to it.
|
|
27
|
+
$_light: #262f44;
|
|
28
|
+
$_medium: #9aa6b8;
|
|
29
|
+
$_dark: #e6ebf3;
|
|
30
|
+
|
|
20
31
|
[data-theme='dark'] {
|
|
21
32
|
// Canvas (was `--wr-color-white` in light mode)
|
|
22
33
|
// Deeper than slate-900 so an elevated surface in slate-800 reads
|
|
@@ -26,8 +37,9 @@ $dark-intents: (
|
|
|
26
37
|
|
|
27
38
|
// Text
|
|
28
39
|
// Softer than pure-white — easier on the eyes for long reading.
|
|
29
|
-
--wr-color-dark: #
|
|
30
|
-
--wr-color-dark-rgb:
|
|
40
|
+
--wr-color-dark: #{$_dark};
|
|
41
|
+
--wr-color-dark-rgb:
|
|
42
|
+
#{color.channel($_dark, 'red')}, #{color.channel($_dark, 'green')}, #{color.channel($_dark, 'blue')};
|
|
31
43
|
// `*-contrast` values are baked at SCSS compile time from the light
|
|
32
44
|
// palette, so they don't auto-flip when `--wr-color-dark` /
|
|
33
45
|
// `--wr-color-white` are reassigned for dark mode. Tooltip-style
|
|
@@ -35,6 +47,22 @@ $dark-intents: (
|
|
|
35
47
|
// white-on-white without this override; re-pair them by hand here.
|
|
36
48
|
--wr-color-dark-contrast: #0b1120;
|
|
37
49
|
--wr-color-white-contrast: #e6ebf3;
|
|
50
|
+
// Same story as the contrast pair: the shades were baked from the light
|
|
51
|
+
// palette's near-black ink, so `.wr-btn--dark:hover` painted itself almost
|
|
52
|
+
// black while keeping the near-black `-contrast` text. `dark` is an INK token,
|
|
53
|
+
// so unlike `light` below its shades mean exactly what they say.
|
|
54
|
+
// `color.scale`, not `color.adjust`, for the two lighter steps. In dark mode
|
|
55
|
+
// `dark` IS the near-white ink (#e6ebf3, L 92.7%), so `adjust(+10%)` asks for
|
|
56
|
+
// L 102.7% — out of gamut. Sass then cannot emit rgb and falls back to legacy
|
|
57
|
+
// comma-hsl with an out-of-range lightness, which browsers clamp: the token
|
|
58
|
+
// silently became pure white instead of a controlled step. `scale` moves a
|
|
59
|
+
// percentage of the REMAINING headroom, so it approaches white without ever
|
|
60
|
+
// leaving the gamut. 70% reproduces the previous `-light` to within a rounding
|
|
61
|
+
// step; 85% is the distinct step beyond it.
|
|
62
|
+
--wr-color-dark-light: #{color.scale($_dark, $lightness: 70%)};
|
|
63
|
+
--wr-color-dark-lighter: #{color.scale($_dark, $lightness: 85%)};
|
|
64
|
+
--wr-color-dark-dark: #{color.adjust($_dark, $lightness: -5%)};
|
|
65
|
+
--wr-color-dark-darker: #{color.adjust($_dark, $lightness: -10%)};
|
|
38
66
|
|
|
39
67
|
// Borders / tints (was `--wr-color-light`)
|
|
40
68
|
// Used for two jobs at once: 1-px borders and translucent surface
|
|
@@ -43,8 +71,9 @@ $dark-intents: (
|
|
|
43
71
|
// looks like glowing pencil lines). This value reads as a real
|
|
44
72
|
// divider on cards / inputs without shouting — matches what Vercel
|
|
45
73
|
// and shadcn ship for the same job.
|
|
46
|
-
--wr-color-light: #
|
|
47
|
-
--wr-color-light-rgb:
|
|
74
|
+
--wr-color-light: #{$_light};
|
|
75
|
+
--wr-color-light-rgb:
|
|
76
|
+
#{color.channel($_light, 'red')}, #{color.channel($_light, 'green')}, #{color.channel($_light, 'blue')};
|
|
48
77
|
// The baked contrast pairs with the LIGHT value (#cbd5e1 → dark text);
|
|
49
78
|
// the dark surface above needs light text instead.
|
|
50
79
|
--wr-color-light-contrast: #e6ebf3;
|
|
@@ -57,18 +86,43 @@ $dark-intents: (
|
|
|
57
86
|
// means "stronger divider" (further from canvas, so lighter).
|
|
58
87
|
--wr-color-light-lighter: #1a2236;
|
|
59
88
|
--wr-color-light-darker: #3a4661;
|
|
89
|
+
// `-light` / `-dark` were the two the hand block forgot, and they are what
|
|
90
|
+
// `.wr-btn--light` uses for hover / active. Left inherited, hover swapped in
|
|
91
|
+
// the LIGHT palette's slate-300 — a near-white fill under the near-white
|
|
92
|
+
// `-contrast` text above, so the button simply disappeared under the cursor.
|
|
93
|
+
// Half-steps of the tuned pair, same inverted reading: toward the canvas for
|
|
94
|
+
// `-light`, away from it for `-dark`, which also makes hover read as a lift.
|
|
95
|
+
--wr-color-light-light: #{color.adjust($_light, $lightness: -2.5%)};
|
|
96
|
+
--wr-color-light-dark: #{color.adjust($_light, $lightness: 5%)};
|
|
60
97
|
|
|
61
98
|
// Secondary text (was `--wr-color-medium`)
|
|
62
99
|
// Lifted from slate-400 → slate-300-ish for better legibility on
|
|
63
100
|
// the deeper canvas.
|
|
64
|
-
--wr-color-medium: #
|
|
65
|
-
--wr-color-medium-rgb:
|
|
101
|
+
--wr-color-medium: #{$_medium};
|
|
102
|
+
--wr-color-medium-rgb:
|
|
103
|
+
#{color.channel($_medium, 'red')}, #{color.channel($_medium, 'green')}, #{color.channel($_medium, 'blue')};
|
|
104
|
+
// This block shipped base + rgb only, so contrast and all four shades still
|
|
105
|
+
// came from the light palette's slate. Ink token, plain shades.
|
|
106
|
+
--wr-color-medium-contrast: #{colors.contrast($_medium)};
|
|
107
|
+
--wr-color-medium-light: #{color.adjust($_medium, $lightness: 5%)};
|
|
108
|
+
--wr-color-medium-lighter: #{color.adjust($_medium, $lightness: 10%)};
|
|
109
|
+
--wr-color-medium-dark: #{color.adjust($_medium, $lightness: -5%)};
|
|
110
|
+
--wr-color-medium-darker: #{color.adjust($_medium, $lightness: -10%)};
|
|
111
|
+
|
|
112
|
+
// Muted TEXT is its own token now (the light theme could not serve both text
|
|
113
|
+
// and fill from one value), so the dark canvas needs its own version too —
|
|
114
|
+
// otherwise it would inherit the light theme's dark ink. 7.64:1 here.
|
|
115
|
+
--wr-color-muted-text: #9aa6b8;
|
|
116
|
+
--wr-color-muted-text-rgb: 154, 166, 184;
|
|
66
117
|
|
|
67
118
|
// Brand-color retune
|
|
68
119
|
// The default primary (#3969e2) reads a touch dim on the deep
|
|
69
120
|
// canvas. Bump the base + shade derivations so hover / focus rings
|
|
70
121
|
// stay visible against slate-900.
|
|
71
122
|
--wr-color-primary: #5b85ff;
|
|
123
|
+
// Same reason as the loop above — the light primary pairs with white, but the
|
|
124
|
+
// lightened dark-theme primary only reaches 3.36:1 against it.
|
|
125
|
+
--wr-color-primary-contrast: #{colors.contrast(#5b85ff)};
|
|
72
126
|
--wr-color-primary-rgb: 91, 133, 255;
|
|
73
127
|
--wr-color-primary-light: #7a9eff;
|
|
74
128
|
--wr-color-primary-dark: #2f56c9;
|
|
@@ -79,7 +133,11 @@ $dark-intents: (
|
|
|
79
133
|
// shade set in dark too (generated, so no intent can silently drift).
|
|
80
134
|
@each $name, $base in $dark-intents {
|
|
81
135
|
--wr-color-#{$name}: #{$base};
|
|
82
|
-
|
|
136
|
+
// Re-derived, not inherited: the light-palette token would pair the wrong
|
|
137
|
+
// foreground with a re-tuned base.
|
|
138
|
+
--wr-color-#{$name}-contrast: #{colors.contrast($base)};
|
|
139
|
+
--wr-color-#{$name}-rgb:
|
|
140
|
+
#{color.channel($base, 'red')}, #{color.channel($base, 'green')}, #{color.channel($base, 'blue')};
|
|
83
141
|
--wr-color-#{$name}-light: #{color.adjust($base, $lightness: 5%)};
|
|
84
142
|
--wr-color-#{$name}-lighter: #{color.adjust($base, $lightness: 10%)};
|
|
85
143
|
--wr-color-#{$name}-dark: #{color.adjust($base, $lightness: -5%)};
|
package/theme/styles/_focus.scss
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
// Mention option rows
|
|
40
|
-
.wr-
|
|
40
|
+
.wr-mention-panel__option:focus-visible {
|
|
41
41
|
@include focus-ring;
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -64,13 +64,7 @@
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
// Stepper step headers
|
|
67
|
-
.wr-
|
|
68
|
-
@include focus-ring;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Toast close/copy
|
|
72
|
-
.wr-toast__close:focus-visible,
|
|
73
|
-
.wr-toast__copy:focus-visible {
|
|
67
|
+
.wr-stepper__header:focus-visible {
|
|
74
68
|
@include focus-ring;
|
|
75
69
|
}
|
|
76
70
|
|
package/theme/styles/_index.scss
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
// Pull the whole theme so a standalone `@use 'ngwr/<name>'` brings in every
|
|
2
|
+
// design token this stylesheet references. Sass deduplicates `@use` per
|
|
3
|
+
// compilation, so the umbrella sheet still emits the theme only once.
|
|
4
|
+
@use '../../theme/styles' as theme;
|
|
5
|
+
|
|
1
6
|
// 3D mouse-tilt card. The transform is set imperatively by `[wrTilt]`,
|
|
2
7
|
// so this stylesheet just covers the card chrome + the optional glare
|
|
3
8
|
// overlay that the directive appends when `[glare]="true"`.
|
package/toast/styles/_index.scss
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
@use '../../theme/styles' as theme;
|
|
2
2
|
|
|
3
|
+
// `info` mapped to `primary` before the `info` intent existed; alert has used
|
|
4
|
+
// the real intent since it landed, so the same toast and alert read as two
|
|
5
|
+
// different colours for the same meaning.
|
|
3
6
|
$toast-colors: (
|
|
4
|
-
info:
|
|
7
|
+
info: info,
|
|
5
8
|
success: success,
|
|
6
9
|
warning: warning,
|
|
7
10
|
danger: danger,
|
|
@@ -59,7 +62,7 @@ $toast-colors: (
|
|
|
59
62
|
width: auto;
|
|
60
63
|
max-width: calc(100% - 2rem);
|
|
61
64
|
transition:
|
|
62
|
-
transform 240ms
|
|
65
|
+
transform 240ms var(--wr-ease-out),
|
|
63
66
|
opacity 240ms ease,
|
|
64
67
|
box-shadow 240ms ease;
|
|
65
68
|
transform-origin: center top;
|
|
@@ -89,7 +92,7 @@ $toast-colors: (
|
|
|
89
92
|
|
|
90
93
|
&--stack.wr-toast-host--expanded .wr-toast {
|
|
91
94
|
transition:
|
|
92
|
-
transform 240ms
|
|
95
|
+
transform 240ms var(--wr-ease-out),
|
|
93
96
|
opacity 240ms ease;
|
|
94
97
|
}
|
|
95
98
|
|