@dereekb/dbx-web 13.20.0 → 13.22.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/eslint/index.cjs.js +424 -15
- package/eslint/index.esm.js +423 -16
- package/eslint/package.json +5 -4
- package/eslint/src/lib/dbx-action.template-util.d.ts +106 -0
- package/eslint/src/lib/index.d.ts +2 -0
- package/eslint/src/lib/plugin.d.ts +4 -0
- package/eslint/src/lib/require-action-error-handler.rule.d.ts +30 -0
- package/eslint/src/lib/require-action-value-source.rule.d.ts +36 -0
- package/lib/interaction/prompt/_prompt.scss +13 -5
- package/lib/layout/column/_column.scss +8 -3
- package/lib/layout/list/_list.scss +83 -13
- package/lib/router/layout/anchorlist/_anchorlist.scss +34 -7
- package/lib/router/layout/sidenav/_sidenav.scss +28 -0
- package/lib/style/_theming.scss +0 -2
- package/package.json +7 -7
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type AstNode } from './util';
|
|
2
|
+
/**
|
|
3
|
+
* ESLint rule definition shape used by `require-action-error-handler`.
|
|
4
|
+
*/
|
|
5
|
+
export interface DbxWebRequireActionErrorHandlerRuleDefinition {
|
|
6
|
+
readonly meta: {
|
|
7
|
+
readonly type: 'suggestion';
|
|
8
|
+
readonly fixable: undefined;
|
|
9
|
+
readonly docs: {
|
|
10
|
+
readonly description: string;
|
|
11
|
+
readonly recommended: boolean;
|
|
12
|
+
};
|
|
13
|
+
readonly messages: {
|
|
14
|
+
readonly missingErrorHandler: string;
|
|
15
|
+
};
|
|
16
|
+
readonly schema: readonly object[];
|
|
17
|
+
};
|
|
18
|
+
create(context: AstNode): Record<string, (node: AstNode) => void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* ESLint (Angular template) rule that flags a `dbxAction` which runs work (has a
|
|
22
|
+
* handler or a trigger) but presents no errors to the user.
|
|
23
|
+
*
|
|
24
|
+
* Satisfied by ANY error directive in the context: `dbxActionSnackbarError`,
|
|
25
|
+
* `[dbxActionError]`, `[dbxActionSnackbar]`, or `[dbxActionErrorHandler]`.
|
|
26
|
+
*
|
|
27
|
+
* Shares the same context-scoping bail conditions as `require-action-value-source`
|
|
28
|
+
* (`[dbxActionSource]` on self/ancestor, or a nested `dbxAction`).
|
|
29
|
+
*/
|
|
30
|
+
export declare const DBX_WEB_REQUIRE_ACTION_ERROR_HANDLER_RULE: DbxWebRequireActionErrorHandlerRuleDefinition;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type AstNode } from './util';
|
|
2
|
+
/**
|
|
3
|
+
* ESLint rule definition shape used by `require-action-value-source`.
|
|
4
|
+
*/
|
|
5
|
+
export interface DbxWebRequireActionValueSourceRuleDefinition {
|
|
6
|
+
readonly meta: {
|
|
7
|
+
readonly type: 'problem';
|
|
8
|
+
readonly fixable: undefined;
|
|
9
|
+
readonly docs: {
|
|
10
|
+
readonly description: string;
|
|
11
|
+
readonly recommended: boolean;
|
|
12
|
+
};
|
|
13
|
+
readonly messages: {
|
|
14
|
+
readonly missingValueSource: string;
|
|
15
|
+
};
|
|
16
|
+
readonly schema: readonly object[];
|
|
17
|
+
};
|
|
18
|
+
create(context: AstNode): Record<string, (node: AstNode) => void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* ESLint (Angular template) rule that flags a `dbxAction` whose context has a
|
|
22
|
+
* trigger but no value source.
|
|
23
|
+
*
|
|
24
|
+
* Such an action hangs: clicking the trigger moves the store to TRIGGERED, but with
|
|
25
|
+
* nothing to call `readyValue()` it never advances to VALUE_READY, so the handler
|
|
26
|
+
* never runs.
|
|
27
|
+
*
|
|
28
|
+
* Targets simple, inline cases only. It bails (does not report) when the value may
|
|
29
|
+
* be supplied in a way a static template scan cannot see:
|
|
30
|
+
* - `[dbxActionSource]` on the element or an ancestor (store forwarded from TS), or
|
|
31
|
+
* - a nested `dbxAction` inside the subtree (ambiguous which context owns a value source).
|
|
32
|
+
*
|
|
33
|
+
* For legitimate programmatic-value cases (or a demo intentionally showing the
|
|
34
|
+
* TRIGGERED state) suppress with `<!-- eslint-disable-next-line dereekb-dbx-web/require-action-value-source -->`.
|
|
35
|
+
*/
|
|
36
|
+
export declare const DBX_WEB_REQUIRE_ACTION_VALUE_SOURCE_RULE: DbxWebRequireActionValueSourceRuleDefinition;
|
|
@@ -13,21 +13,29 @@ $dbx-popup-controls-height: 33px;
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/// @dbx-utility prompt-box
|
|
16
|
-
/// @intent centered prompt panel — auto-margined max-width box with a 40px inset (override via `--dbx-prompt-box-padding`) and a "medium" corner radius (override via `--dbx-prompt-box-border-radius`); compose with `.elevate` to lift it
|
|
16
|
+
/// @intent centered prompt panel — auto-margined max-width box with a 40px inset (override via `--dbx-prompt-box-padding`) and a "medium" corner radius (override via `--dbx-prompt-box-border-radius`); compose with `.elevate` to lift it M3-style — a brighter `surface-bright` tonal wash plus a soft lift shadow
|
|
17
17
|
/// @role layout
|
|
18
18
|
/// @see-also content-box, content-elevate
|
|
19
19
|
.dbx-prompt-box {
|
|
20
20
|
margin: auto;
|
|
21
21
|
padding: var(--dbx-prompt-box-padding, 40px);
|
|
22
22
|
max-width: $box-max-width;
|
|
23
|
-
// Visible via
|
|
24
|
-
// the box itself intentionally has no background. Deliberately
|
|
25
|
-
// through `--mat-dialog-container-shape` — a prompt box is a page surface,
|
|
23
|
+
// Visible via `.elevate` (a bright tonal surface + soft lift shadow, default) or any
|
|
24
|
+
// app-supplied background; the box itself intentionally has no background. Deliberately
|
|
25
|
+
// NOT chained through `--mat-dialog-container-shape` — a prompt box is a page surface,
|
|
26
26
|
// not a dialog.
|
|
27
27
|
border-radius: var(--dbx-prompt-box-border-radius, var(--mat-sys-corner-medium, 12px));
|
|
28
28
|
|
|
29
|
+
// M3 elevation: an elevated prompt panel reads as raised primarily through a brighter
|
|
30
|
+
// tonal surface — a low-opacity wash of the active dbxColor (`--dbx-bg-color-current`,
|
|
31
|
+
// primary by default, driven by an ancestor/host `[dbxColor]`) over `surface-bright` —
|
|
32
|
+
// plus a soft lift shadow for protection against the background, replacing the former
|
|
33
|
+
// Material elevation(2) shadow. Override `--dbx-prompt-box-elevate-tone` (percentage) to
|
|
34
|
+
// tune the wash, `--dbx-prompt-box-elevate-bg` to replace the background outright, or
|
|
35
|
+
// `--dbx-prompt-box-elevate-shadow` to retune/remove (`none`) the lift shadow.
|
|
29
36
|
&.elevate {
|
|
30
|
-
|
|
37
|
+
background: var(--dbx-prompt-box-elevate-bg, color-mix(in srgb, #{theming.$dbx-bg-color} var(--dbx-prompt-box-elevate-tone, 8%), var(--mat-sys-surface-bright)));
|
|
38
|
+
box-shadow: var(--dbx-prompt-box-elevate-shadow, var(--mat-sys-level2));
|
|
31
39
|
}
|
|
32
40
|
}
|
|
33
41
|
}
|
|
@@ -9,7 +9,7 @@ $two-columns-right-padding-size: var(--dbx-padding-2);
|
|
|
9
9
|
// MARK: Mixin
|
|
10
10
|
@mixin core() {
|
|
11
11
|
/// @dbx-utility two-column
|
|
12
|
-
/// @intent two-column page layout — fixed-width left column
|
|
12
|
+
/// @intent two-column page layout — fixed-width left column divided from the right content area by a border
|
|
13
13
|
/// @role layout
|
|
14
14
|
.dbx-two-column {
|
|
15
15
|
height: 100%;
|
|
@@ -29,13 +29,18 @@ $two-columns-right-padding-size: var(--dbx-padding-2);
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
.left-column {
|
|
32
|
-
|
|
32
|
+
/// Color of the right boundary separating the fixed left column from the right content
|
|
33
|
+
/// area (replaces the former elevation shadow). Column-specific override point; defaults
|
|
34
|
+
/// to the shared --dbx-divider-color. Retint just this boundary by overriding it, or set
|
|
35
|
+
/// it to `transparent` to hide the divider while keeping the layout box.
|
|
36
|
+
/// @role color
|
|
37
|
+
/// @intent two column divider color, two column border color, left column separator color
|
|
38
|
+
border-right: 1px solid var(--dbx-two-column-border-color, var(--dbx-divider-color));
|
|
33
39
|
|
|
34
40
|
width: $two-column-left-width;
|
|
35
41
|
flex: 0 0 auto;
|
|
36
42
|
|
|
37
43
|
overflow: auto;
|
|
38
|
-
// background: red;
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
.right-column {
|
|
@@ -31,6 +31,14 @@ $list-item-padded-min-height: 42px;
|
|
|
31
31
|
--dbx-list-item-selected-color: var(--mat-sys-primary-container);
|
|
32
32
|
--dbx-list-item-selected-on-color: var(--mat-sys-on-primary-container);
|
|
33
33
|
|
|
34
|
+
// Active route (nav/value list `dbx-anchor-active`) row tone. A `dbx-anchor` row marks the active
|
|
35
|
+
// route with its own `dbx-anchor-active` class rather than Material's `.mdc-list-item--activated`, so
|
|
36
|
+
// it carries its own tone token here. Defaults to the selected/activated tone above (so an active
|
|
37
|
+
// route reads the same as a selected row out of the box), but can be retargeted independently — e.g.
|
|
38
|
+
// set `--dbx-list-item-active-color` on the list host — to give active routes a distinct color.
|
|
39
|
+
--dbx-list-item-active-color: var(--dbx-list-item-selected-color);
|
|
40
|
+
--dbx-list-item-active-on-color: var(--dbx-list-item-selected-on-color);
|
|
41
|
+
|
|
34
42
|
// Rows are square by default; their corners round per-position / per-state below.
|
|
35
43
|
--mat-list-active-indicator-shape: 0;
|
|
36
44
|
--mat-list-list-item-container-shape: 0;
|
|
@@ -98,14 +106,22 @@ $list-item-padded-min-height: 42px;
|
|
|
98
106
|
--mat-list-list-item-container-shape: var(--dbx-list-item-radius-resolved);
|
|
99
107
|
}
|
|
100
108
|
|
|
101
|
-
// Any hovered / focused / selected / activated row rounds all four corners
|
|
102
|
-
// per-position rules above
|
|
103
|
-
//
|
|
104
|
-
.dbx-list-view .mat-mdc-list-item
|
|
105
|
-
.
|
|
106
|
-
.dbx-list-view
|
|
107
|
-
|
|
108
|
-
|
|
109
|
+
// Any hovered / focused / selected / activated / active-route row rounds all four corners. These must
|
|
110
|
+
// out-specify the per-position first/last/only rules above — and the value-list ones
|
|
111
|
+
// (`.dbx-list-view-group-content > dbx-anchor:first-of-type .dbx-list-view-item`) carry an element +
|
|
112
|
+
// pseudo-class, landing at (0,3,1). A bare `.dbx-list-view .mat-mdc-list-item` state selector is only
|
|
113
|
+
// (0,3,0), so it would LOSE and leave the outer corner square — e.g. the active first row keeping a
|
|
114
|
+
// square bottom. Qualifying each row with `.dbx-list-view-item` raises these to (0,4,0) so the
|
|
115
|
+
// all-corners shape wins (every `.dbx-list-view` row — value-list `<a mat-list-item>` and selection
|
|
116
|
+
// `<mat-list-option>` alike — carries that class). `.dbx-anchor-active` covers nav/value-list rows
|
|
117
|
+
// whose active route is signaled by `dbx-anchor` — it never adds Material's `.mdc-list-item--activated`,
|
|
118
|
+
// so without this the active (un-hovered) row would otherwise fall back to the square per-position shape.
|
|
119
|
+
.dbx-list-view .dbx-list-view-item.mat-mdc-list-item:hover,
|
|
120
|
+
.dbx-list-view .dbx-list-view-item.mat-mdc-list-item:focus,
|
|
121
|
+
.dbx-list-view .dbx-anchor-active .dbx-list-view-item.mat-mdc-list-item,
|
|
122
|
+
.dbx-list-view .dbx-list-view-item.mat-mdc-list-item.mdc-list-item--selected,
|
|
123
|
+
.dbx-list-view .dbx-list-view-item.mat-mdc-list-item.mdc-list-item--activated,
|
|
124
|
+
.dbx-list-view .dbx-list-view-item.mat-mdc-list-item[aria-selected='true'] {
|
|
109
125
|
--mat-list-list-item-container-shape: var(--dbx-list-item-radius-resolved);
|
|
110
126
|
}
|
|
111
127
|
|
|
@@ -125,6 +141,12 @@ $list-item-padded-min-height: 42px;
|
|
|
125
141
|
--mat-list-list-item-container-color: var(--dbx-list-item-selected-color);
|
|
126
142
|
color: var(--dbx-list-item-selected-on-color);
|
|
127
143
|
}
|
|
144
|
+
|
|
145
|
+
// Active-route row tone (a `dbx-anchor` row whose route is active) is painted in `_anchorlist.scss`,
|
|
146
|
+
// which targets both `.dbx-anchor-list` and `.dbx-list-view` nav lists via the
|
|
147
|
+
// `--dbx-anchor-list-item-active-color` token. That token defaults to `--dbx-list-item-active-color`
|
|
148
|
+
// (defined above), so a value list's active route matches its selected tone out of the box; the
|
|
149
|
+
// sidenav overrides the token for its accent treatment. Only the corner shape is handled here (above).
|
|
128
150
|
}
|
|
129
151
|
|
|
130
152
|
// dbx-anchor-list (nav) rows default to an M3 medium corner via their OWN
|
|
@@ -140,13 +162,18 @@ $list-item-padded-min-height: 42px;
|
|
|
140
162
|
}
|
|
141
163
|
}
|
|
142
164
|
|
|
143
|
-
//
|
|
144
|
-
//
|
|
165
|
+
// Sidenav anchor-list rows sit flush against the left drawer edge, so only the RIGHT corners round — the
|
|
166
|
+
// radius is composed into a `0 r r 0` shorthand (top-left / top-right / bottom-right / bottom-left),
|
|
145
167
|
// leaving the left corners square. The "how round" radius defaults to the regular anchor-list radius
|
|
146
168
|
// (`--dbx-anchor-list-item-border-radius`) so the sidenav tracks the `anchor-list-corner-*` lever by default,
|
|
147
|
-
// but `--dbx-sidenav-anchor-list-item-border-radius` overrides it for sidenav-specific tuning.
|
|
148
|
-
//
|
|
149
|
-
|
|
169
|
+
// but `--dbx-sidenav-anchor-list-item-border-radius` overrides it for sidenav-specific tuning.
|
|
170
|
+
//
|
|
171
|
+
// Scoped to EVERY anchor list inside a sidenav drawer (`.dbx-sidenav .mat-drawer .dbx-anchor-list`), not
|
|
172
|
+
// just the `[anchors]` list (`.dbx-sidenav-anchor-list`): a separate `<dbx-anchor-list>` dropped into a
|
|
173
|
+
// `[top]` / `[bottom]` content slot must round the same way, otherwise it falls back to the generic
|
|
174
|
+
// all-corners `.dbx-anchor-list` radius and reads as floating full-radius pills beside the flush main
|
|
175
|
+
// rows. Higher specificity than `.dbx-anchor-list`, so it wins for any inner nav-list inside a sidenav.
|
|
176
|
+
.dbx-sidenav .mat-drawer .dbx-anchor-list {
|
|
150
177
|
--mat-list-active-indicator-shape: 0 var(--dbx-sidenav-anchor-list-item-border-radius, var(--dbx-anchor-list-item-border-radius, var(--mat-sys-corner-medium, 12px))) var(--dbx-sidenav-anchor-list-item-border-radius, var(--dbx-anchor-list-item-border-radius, var(--mat-sys-corner-medium, 12px))) 0;
|
|
151
178
|
--mat-list-list-item-container-shape: 0 var(--dbx-sidenav-anchor-list-item-border-radius, var(--dbx-anchor-list-item-border-radius, var(--mat-sys-corner-medium, 12px))) var(--dbx-sidenav-anchor-list-item-border-radius, var(--dbx-anchor-list-item-border-radius, var(--mat-sys-corner-medium, 12px))) 0;
|
|
152
179
|
}
|
|
@@ -161,6 +188,9 @@ $list-item-padded-min-height: 42px;
|
|
|
161
188
|
|
|
162
189
|
.dbx-list-empty-content {
|
|
163
190
|
text-align: center;
|
|
191
|
+
// Breathing room around the empty-state content so it doesn't sit flush against its container.
|
|
192
|
+
// Override point (`--dbx-list-empty-content-padding`) defaults to the global `--dbx-padding-2` spacing token.
|
|
193
|
+
padding: var(--dbx-list-empty-content-padding, var(--dbx-padding-2));
|
|
164
194
|
}
|
|
165
195
|
|
|
166
196
|
.dbx-list-content {
|
|
@@ -463,8 +493,48 @@ $list-item-padded-min-height: 42px;
|
|
|
463
493
|
position: unset; // do not touch the divider in dbx-list
|
|
464
494
|
}
|
|
465
495
|
|
|
496
|
+
// Accordion list view renders as a card with a rounded TOP. The rounded frame lives on the scroll
|
|
497
|
+
// VIEWPORT (`.dbx-list-content`) so it clips the scrolling content — including panels that scroll BEHIND a
|
|
498
|
+
// sticky group header — which stops them bleeding through the rounded corner. (A rounded ancestor can't
|
|
499
|
+
// clip a composited `position: sticky` element in Chrome, so each group header additionally rounds its OWN
|
|
500
|
+
// top corners below.) Only the top corners are rounded — the bottom stays square so the last panel's
|
|
501
|
+
// elevation shadow isn't clipped by a rounded bottom edge. Scoped with `:has()` so only accordion lists
|
|
502
|
+
// get framed.
|
|
503
|
+
.dbx-list-content:has(.dbx-list-accordion-view) {
|
|
504
|
+
border-top-left-radius: var(--dbx-list-accordion-view-border-radius, var(--mat-sys-corner-medium, 12px));
|
|
505
|
+
border-top-right-radius: var(--dbx-list-accordion-view-border-radius, var(--mat-sys-corner-medium, 12px));
|
|
506
|
+
}
|
|
507
|
+
|
|
466
508
|
.dbx-list-accordion-view {
|
|
509
|
+
// Breathing-room margin (`--dbx-list-accordion-view-margin`, default `--dbx-padding-1` / 2px) so the
|
|
510
|
+
// card sits inset from its container and its walls stay visible — flush against the container the card's
|
|
511
|
+
// edges read as cut off. `padding-bottom` leaves room below the last panel so its elevation shadow shows
|
|
512
|
+
// instead of being clipped at the scroll edge.
|
|
513
|
+
display: block;
|
|
514
|
+
margin: var(--dbx-list-accordion-view-margin, var(--dbx-padding-1));
|
|
515
|
+
padding-bottom: var(--dbx-list-accordion-view-bottom-space, var(--dbx-padding-2));
|
|
516
|
+
--dbx-list-accordion-view-radius-resolved: var(--dbx-list-accordion-view-border-radius, var(--mat-sys-corner-medium, 12px));
|
|
467
517
|
--mat-expansion-container-shape: 0px;
|
|
518
|
+
|
|
519
|
+
// Round the top corners of the first entry (the very top of the card) AND of every group header. Group
|
|
520
|
+
// headers are sticky — when one pins at the rounded top corner, the scroll frame's clip would otherwise
|
|
521
|
+
// shave that header's square corner (and its border) flat, so each header rounds its OWN top corners to
|
|
522
|
+
// follow the curve. `overflow: hidden` clips the header's content/border to those corners.
|
|
523
|
+
mat-accordion > :first-child,
|
|
524
|
+
.dbx-list-view-group-header {
|
|
525
|
+
border-top-left-radius: var(--dbx-list-accordion-view-radius-resolved);
|
|
526
|
+
border-top-right-radius: var(--dbx-list-accordion-view-radius-resolved);
|
|
527
|
+
overflow: hidden;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Box every group header with the same hairline the two-column view uses (`1px solid
|
|
531
|
+
// var(--dbx-divider-color)`) rather than the heavier/darker `--mat-divider-*`; the shorthand overrides
|
|
532
|
+
// the bottom divider on the base `.dbx-list-view-group-header` rule so all four sides match. The `-1px`
|
|
533
|
+
// margin pulls the header out so its border overlaps the adjacent panel edges (no doubled hairline / gap).
|
|
534
|
+
.dbx-list-view-group-header {
|
|
535
|
+
margin: -1px;
|
|
536
|
+
border: 1px solid var(--dbx-divider-color);
|
|
537
|
+
}
|
|
468
538
|
}
|
|
469
539
|
|
|
470
540
|
.dbx-list-view-group-header {
|
|
@@ -56,6 +56,16 @@ $default-mdc-list-list-item-leading-icon-size: 24px;
|
|
|
56
56
|
.dbx-list-view .mat-mdc-nav-list {
|
|
57
57
|
--mat-divider-color: color-mix(in srgb, var(--mat-sys-outline-variant) 15%, transparent);
|
|
58
58
|
|
|
59
|
+
// Active/selected route rows default to the shared dbx list tone so anchor lists match value lists
|
|
60
|
+
// out of the box, instead of a bare on-surface overlay. A standalone `.dbx-anchor-list` isn't
|
|
61
|
+
// necessarily inside a `.dbx-list`, so fall back to the M3 container tones directly when the
|
|
62
|
+
// `--dbx-list-item-*-color` knobs aren't inherited. Override the `--dbx-anchor-list-item-*` tokens to
|
|
63
|
+
// give a list its own active/selected treatment (the sidenav does, for its accent tint + border).
|
|
64
|
+
--dbx-anchor-list-item-selected-color: var(--dbx-list-item-selected-color, var(--mat-sys-primary-container));
|
|
65
|
+
--dbx-anchor-list-item-selected-on-color: var(--dbx-list-item-selected-on-color, var(--mat-sys-on-primary-container));
|
|
66
|
+
--dbx-anchor-list-item-active-color: var(--dbx-list-item-active-color, var(--dbx-anchor-list-item-selected-color));
|
|
67
|
+
--dbx-anchor-list-item-active-on-color: var(--dbx-list-item-active-on-color, var(--dbx-anchor-list-item-selected-on-color));
|
|
68
|
+
|
|
59
69
|
// MARK: Muting
|
|
60
70
|
// items that are not active are muted
|
|
61
71
|
.mat-mdc-list-item {
|
|
@@ -77,11 +87,32 @@ $default-mdc-list-list-item-leading-icon-size: 24px;
|
|
|
77
87
|
}
|
|
78
88
|
}
|
|
79
89
|
|
|
90
|
+
// MARK: Anchor Tree
|
|
91
|
+
// Nested child rows get a subtle depth-shading background. This is the BASE tone for a child row, so
|
|
92
|
+
// it is declared BEFORE the selected / active-route rules below: those match the same row at equal
|
|
93
|
+
// specificity (0,4,0), so source order decides — keeping this first lets an active or selected child
|
|
94
|
+
// row layer its own tone on top instead of being masked by the depth shading (which left an active
|
|
95
|
+
// child reading as un-selected: grey background, only the text recolored).
|
|
96
|
+
//
|
|
97
|
+
// The tone is an override point: set `--dbx-anchor-list-item-child-background` (e.g. to `transparent`)
|
|
98
|
+
// to flatten the depth-shade so nested children read like top-level root rows. Because the
|
|
99
|
+
// active/selected rules below win by source order, overriding the token never clears an active child's
|
|
100
|
+
// accent — only the inactive depth-shade. The `.dbx-sidenav-flat` modifier uses this.
|
|
101
|
+
|
|
102
|
+
/// Background tone applied to nested (depth > 0) anchor-list child rows to set them apart from
|
|
103
|
+
/// top-level root rows. Override to `transparent` to flatten the nesting depth-shade.
|
|
104
|
+
/// @role color
|
|
105
|
+
/// @intent nested child row background, anchor list depth shade, flatten nested rows
|
|
106
|
+
.dbx-anchor-list-child .mat-mdc-list-item {
|
|
107
|
+
background: var(--dbx-anchor-list-item-child-background, color-mix(in srgb, var(--mat-sys-on-surface) 14%, transparent));
|
|
108
|
+
}
|
|
109
|
+
|
|
80
110
|
// selected
|
|
81
111
|
.dbx-anchor-selected {
|
|
82
112
|
.mat-mdc-list-item {
|
|
83
113
|
opacity: #{$anchor-list-item-active-opacity};
|
|
84
|
-
background:
|
|
114
|
+
background: var(--dbx-anchor-list-item-selected-color);
|
|
115
|
+
color: var(--dbx-anchor-list-item-selected-on-color);
|
|
85
116
|
}
|
|
86
117
|
}
|
|
87
118
|
|
|
@@ -89,14 +120,10 @@ $default-mdc-list-list-item-leading-icon-size: 24px;
|
|
|
89
120
|
.dbx-anchor-active-eq {
|
|
90
121
|
.mat-mdc-list-item {
|
|
91
122
|
opacity: #{$anchor-list-item-active-opacity};
|
|
92
|
-
background:
|
|
123
|
+
background: var(--dbx-anchor-list-item-active-color);
|
|
124
|
+
color: var(--dbx-anchor-list-item-active-on-color);
|
|
93
125
|
}
|
|
94
126
|
}
|
|
95
|
-
|
|
96
|
-
// MARK: Anchor Tree
|
|
97
|
-
.dbx-anchor-list-child .mat-mdc-list-item {
|
|
98
|
-
background: color-mix(in srgb, var(--mat-sys-on-surface) 14%, transparent);
|
|
99
|
-
}
|
|
100
127
|
}
|
|
101
128
|
}
|
|
102
129
|
|
|
@@ -24,6 +24,17 @@ $active-background-transparent-color: 0.93;
|
|
|
24
24
|
border-top-right-radius: var(--dbx-sidenav-top-corner-radius, var(--mat-sys-corner-extra-large, 24px));
|
|
25
25
|
border-bottom-right-radius: var(--dbx-sidenav-bottom-corner-radius, var(--mat-sys-corner-extra-large, 24px));
|
|
26
26
|
|
|
27
|
+
// Uniform nav items (default). A sidenav is typically assembled from differently-created nav
|
|
28
|
+
// elements — top-level root anchors and nested child anchors in the `[anchors]` tree, plus separate
|
|
29
|
+
// `<dbx-anchor-list>` lists dropped into the `[top]` / `[bottom]` content slots. Left to the generic
|
|
30
|
+
// anchor-list styling these would NOT match up (a separate list rounds all four corners as floating
|
|
31
|
+
// pills, and nested child rows carry a depth-shade). The sidenav normalizes them so every element
|
|
32
|
+
// reads as one consistent nav: nested children drop the depth-shade here (the active/selected rules
|
|
33
|
+
// override this token by source order, so the active route still keeps its accent), the right-only
|
|
34
|
+
// flush-left corner shape is applied to all drawer anchor lists in `_list.scss`, and child content is
|
|
35
|
+
// aligned with root rows below. Apps can restore the depth-shade per list via the token if desired.
|
|
36
|
+
--dbx-anchor-list-item-child-background: transparent;
|
|
37
|
+
|
|
27
38
|
.mat-drawer-inner-container {
|
|
28
39
|
display: flex;
|
|
29
40
|
flex-direction: column;
|
|
@@ -40,6 +51,12 @@ $active-background-transparent-color: 0.93;
|
|
|
40
51
|
}
|
|
41
52
|
}
|
|
42
53
|
|
|
54
|
+
// Align nested child content with root rows (cancel the small left nudge `_anchorlist.scss` adds
|
|
55
|
+
// to child rows) so a nested child reads like a top-level root item.
|
|
56
|
+
.dbx-anchor-list-child .mat-mdc-list-item .mdc-list-item__content {
|
|
57
|
+
padding-left: 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
43
60
|
// directly active links have a side border indicator
|
|
44
61
|
.dbx-anchor-active-eq,
|
|
45
62
|
.dbx-anchor-list-child .dbx-anchor-active {
|
|
@@ -165,6 +182,17 @@ $active-background-transparent-color: 0.93;
|
|
|
165
182
|
.dbx-anchor-list.mat-mdc-nav-list {
|
|
166
183
|
--dbx-sidenav-active-accent: color-mix(in srgb, var(--dbx-accent-color) 65%, var(--mat-sys-surface));
|
|
167
184
|
|
|
185
|
+
// The sidenav opts out of the default solid list tone (which anchor lists now inherit from
|
|
186
|
+
// `--dbx-list-item-active-color`) in favor of its subtle accent overlay + side-border treatment.
|
|
187
|
+
// Define the anchor-list active/selected override tokens here so the base `_anchorlist.scss` rows
|
|
188
|
+
// pick up the accent tint, and pin the on-color to the drawer text color so the active label is
|
|
189
|
+
// not recolored to the list's on-primary-container tone. The explicit root/child background +
|
|
190
|
+
// border rules below still apply on top (they distinguish root vs child and add the indicator).
|
|
191
|
+
--dbx-anchor-list-item-active-color: var(--dbx-sidenav-active-item-background, color-mix(in srgb, var(--dbx-sidenav-active-accent) 12%, transparent));
|
|
192
|
+
--dbx-anchor-list-item-active-on-color: var(--dbx-sidenav-text-color, var(--dbx-color-current, var(--mat-sys-on-surface)));
|
|
193
|
+
--dbx-anchor-list-item-selected-color: var(--dbx-anchor-list-item-active-color);
|
|
194
|
+
--dbx-anchor-list-item-selected-on-color: var(--dbx-anchor-list-item-active-on-color);
|
|
195
|
+
|
|
168
196
|
.dbx-anchor-active {
|
|
169
197
|
.mat-mdc-list-item {
|
|
170
198
|
.mat-mdc-list-item-icon {
|
package/lib/style/_theming.scss
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/dbx-web",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.22.0",
|
|
4
4
|
"sideEffects": [
|
|
5
5
|
"*.scss",
|
|
6
6
|
"*.css"
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
"@angular/material": "^21.2.9",
|
|
14
14
|
"@angular/platform-browser": "21.2.11",
|
|
15
15
|
"@cantoo/pdf-lib": "^2.6.5",
|
|
16
|
-
"@dereekb/browser": "13.
|
|
17
|
-
"@dereekb/date": "13.
|
|
18
|
-
"@dereekb/dbx-core": "13.
|
|
19
|
-
"@dereekb/rxjs": "13.
|
|
20
|
-
"@dereekb/util": "13.
|
|
21
|
-
"@dereekb/vitest": "13.
|
|
16
|
+
"@dereekb/browser": "13.22.0",
|
|
17
|
+
"@dereekb/date": "13.22.0",
|
|
18
|
+
"@dereekb/dbx-core": "13.22.0",
|
|
19
|
+
"@dereekb/rxjs": "13.22.0",
|
|
20
|
+
"@dereekb/util": "13.22.0",
|
|
21
|
+
"@dereekb/vitest": "13.22.0",
|
|
22
22
|
"@ngbracket/ngx-layout": "^21.0.0",
|
|
23
23
|
"@ngrx/component-store": "^21.1.0",
|
|
24
24
|
"@ngrx/effects": "^21.1.0",
|