@nextrap/nte-nav 1.1.40 → 2.0.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/index.scss ADDED
@@ -0,0 +1,8 @@
1
+ @forward 'src/scss/default-style';
2
+ @forward 'src/scss/styles/bordered-style';
3
+ @forward 'src/scss/horizontal';
4
+ @forward 'src/scss/main-navigation';
5
+ @forward 'src/scss/responsive';
6
+ @forward 'src/scss/sizes';
7
+ @forward 'src/scss/sub-navigation';
8
+ @forward 'src/scss/vertical';
package/package.json CHANGED
@@ -1,18 +1,27 @@
1
1
  {
2
2
  "name": "@nextrap/nte-nav",
3
- "version": "1.1.40",
3
+ "version": "2.0.0",
4
+ "files": [
5
+ "*.*",
6
+ ".agents",
7
+ "src"
8
+ ],
4
9
  "main": "./index.js",
10
+ "repository": {
11
+ "directory": "nextrap-elements/nte-nav",
12
+ "type": "git",
13
+ "url": "https://github.com/nextrap/nextrap-monorepo"
14
+ },
5
15
  "dependencies": {
6
- "@nextrap/nt-framework": "^1.1.1",
7
- "@nextrap/nte-burger": "^1.1.7",
8
- "@nextrap/nte-core": "^1.0.2",
9
- "@nextrap/nte-offcanvas": "^1.0.16",
10
- "@trunkjs/browser-utils": "^1.0.12"
16
+ "@nextrap/nt-core": "^2.0.0",
17
+ "@nextrap/style-reset": "^2.0.0",
18
+ "lit": "^3.3.1"
11
19
  },
12
20
  "devDependencies": {
13
- "@nextrap/style-base": "^1.1.11",
14
- "@nextrap/style-reset": "^1.0.0"
21
+ "@nextrap/style-base": "^2.0.0",
22
+ "@nextrap/style-typography": "^2.0.0"
15
23
  },
16
24
  "type": "module",
17
- "types": "./index.d.ts"
25
+ "types": "./index.d.ts",
26
+ "web-types": "./web-types.json"
18
27
  }
@@ -0,0 +1,14 @@
1
+ declare const NteNav_base: import('@nextrap/nt-core').InternalNextrapElementType;
2
+ export declare class NteNav extends NteNav_base {
3
+ static styles: import('lit').CSSResult[];
4
+ /** Accessible name forwarded to the internal navigation landmark. */
5
+ accessor ariaLabel: string;
6
+ protected render(): import('lit-html').TemplateResult<1>;
7
+ private _onSlotChange;
8
+ }
9
+ declare global {
10
+ interface HTMLElementTagNameMap {
11
+ 'nte-nav': NteNav;
12
+ }
13
+ }
14
+ export {};
@@ -0,0 +1,50 @@
1
+ @use '@nextrap/style-reset' as reset;
2
+
3
+ @include reset.reset();
4
+
5
+ // Provides the navigation host with its default flow tokens and intrinsic width.
6
+ :host {
7
+ --nte-nav-flow: row;
8
+ --nte-nav-align: stretch;
9
+ --nte-nav-justify: flex-start;
10
+ --nte-nav-gap: 0;
11
+ --nte-nav-item-gap: 0.5rem;
12
+ --nte-nav-submenu-gap: 0.25rem;
13
+ --nte-nav-submenu-min-inline-size: 12rem;
14
+ --nte-nav-submenu-inline-size: max(100%, var(--nte-nav-submenu-min-inline-size));
15
+ --nte-nav-submenu-max-block-size: min(70vh, 32rem);
16
+ --nte-nav-submenu-position: absolute;
17
+ --nte-nav-submenu-inset-block-start: 100%;
18
+ --nte-nav-submenu-inset-inline-start: 0;
19
+ --nte-nav-nested-submenu-inset-block-start: 0;
20
+ --nte-nav-nested-submenu-inset-inline-start: 100%;
21
+ --nte-nav-submenu-position-area: block-end span-inline-end;
22
+ --nte-nav-nested-submenu-position-area: inline-end span-block-end;
23
+ --nte-nav-submenu-enter-transform: translateY(-0.35rem);
24
+ --nte-nav-nested-submenu-enter-transform: translateX(-0.35rem);
25
+ --nte-nav-transition-duration: 160ms;
26
+
27
+ display: block;
28
+ inline-size: fit-content;
29
+ max-inline-size: 100%;
30
+ }
31
+
32
+ // Keeps the internal navigation landmark available as the list's layout container.
33
+ #nav {
34
+ display: block;
35
+ }
36
+
37
+ // Arranges slotted navigation items according to the active orientation tokens.
38
+ #list {
39
+ display: flex;
40
+ flex-flow: var(--nte-nav-flow) nowrap;
41
+ align-items: var(--nte-nav-align);
42
+ justify-content: var(--nte-nav-justify);
43
+ gap: var(--nte-nav-gap);
44
+ min-inline-size: 0;
45
+ }
46
+
47
+ // Lets the assigned navigation items participate directly in the flex layout.
48
+ #list > slot {
49
+ display: contents;
50
+ }
@@ -0,0 +1,36 @@
1
+ export type NteNavItemCurrent = 'page' | 'step' | 'location' | 'date' | 'time' | 'true' | '';
2
+ declare const NteNavItem_base: import('@nextrap/nt-core').InternalNextrapElementType;
3
+ export declare class NteNavItem extends NteNavItem_base {
4
+ static styles: import('lit').CSSResult[];
5
+ accessor href: string;
6
+ accessor target: string;
7
+ accessor rel: string;
8
+ accessor download: string;
9
+ accessor current: NteNavItemCurrent;
10
+ accessor submenuPopover: boolean;
11
+ /** Accessible name prefix for a submenu disclosure control. */
12
+ accessor submenuLabel: string;
13
+ private accessor _hasSubmenu;
14
+ private accessor _labelText;
15
+ connectedCallback(): void;
16
+ disconnectedCallback(): void;
17
+ protected render(): import('lit-html').TemplateResult<1>;
18
+ private _renderLink;
19
+ private _renderLabel;
20
+ private _renderIconOnlyDisclosure;
21
+ private _renderLabelDisclosure;
22
+ private _renderIconOnlyPopoverControl;
23
+ private _renderLabelPopoverControl;
24
+ private _renderSubmenu;
25
+ private _renderIndicator;
26
+ private _submenuAccessibleName;
27
+ private _onLabelSlotChange;
28
+ private _onSubmenuSlotChange;
29
+ private _assignNestedItems;
30
+ }
31
+ declare global {
32
+ interface HTMLElementTagNameMap {
33
+ 'nte-nav-item': NteNavItem;
34
+ }
35
+ }
36
+ export {};
@@ -0,0 +1,203 @@
1
+ @use '@nextrap/style-reset' as reset;
2
+
3
+ @include reset.reset();
4
+
5
+ slot.slot-empty {
6
+ display: none !important;
7
+ }
8
+
9
+ :host {
10
+ --order: 0;
11
+
12
+ display: block;
13
+ position: relative;
14
+ order: var(--order);
15
+ min-inline-size: 0;
16
+ }
17
+
18
+ #link,
19
+ #text,
20
+ #disclosure,
21
+ #toggle {
22
+ display: flex;
23
+ align-items: center;
24
+ }
25
+
26
+ #item {
27
+ display: grid;
28
+ grid-template-columns: minmax(0, 1fr) auto;
29
+ align-items: stretch;
30
+ min-block-size: 100%;
31
+ }
32
+
33
+ #details {
34
+ display: contents;
35
+ }
36
+
37
+ #link,
38
+ #text,
39
+ #disclosure {
40
+ flex: 1 1 auto;
41
+ min-inline-size: 0;
42
+ gap: var(--nte-nav-item-gap);
43
+ }
44
+
45
+ #label {
46
+ min-inline-size: 0;
47
+ overflow: hidden;
48
+ text-overflow: ellipsis;
49
+ white-space: nowrap;
50
+ }
51
+
52
+ #link,
53
+ #text,
54
+ #disclosure {
55
+ grid-column: 1 / -1;
56
+ grid-row: 1;
57
+ }
58
+
59
+ #item:has(#toggle) > #link {
60
+ grid-column: 1;
61
+ }
62
+
63
+ #toggle {
64
+ grid-column: 2;
65
+ grid-row: 1;
66
+ flex: 0 0 auto;
67
+ justify-content: center;
68
+ }
69
+
70
+ #disclosure,
71
+ #toggle {
72
+ anchor-name: --nte-nav-submenu-anchor;
73
+ list-style: none;
74
+ }
75
+
76
+ #disclosure::-webkit-details-marker,
77
+ #toggle::-webkit-details-marker {
78
+ display: none;
79
+ }
80
+
81
+ #icon:has(> slot.slot-empty) {
82
+ // Outer ::part(icon) theme rules otherwise win over normal Shadow-DOM declarations.
83
+ display: none !important;
84
+ }
85
+
86
+ #icon,
87
+ #indicator {
88
+ flex: 0 0 auto;
89
+ }
90
+
91
+ #indicator {
92
+ inline-size: 1em;
93
+ block-size: 1em;
94
+ transition: transform var(--nte-nav-transition-duration) ease;
95
+ }
96
+
97
+ #details[open] #indicator,
98
+ #item:has(#submenu:popover-open) #indicator {
99
+ transform: rotate(180deg);
100
+ }
101
+
102
+ #submenu {
103
+ z-index: 10;
104
+ display: grid;
105
+ grid-column: 1 / -1;
106
+ grid-row: 2;
107
+ grid-template-rows: 0fr;
108
+ inline-size: var(--nte-nav-submenu-inline-size);
109
+ min-inline-size: var(--nte-nav-submenu-min-inline-size);
110
+ max-block-size: var(--nte-nav-submenu-max-block-size);
111
+ margin: 0;
112
+ padding: 0;
113
+ overflow: hidden;
114
+ position: var(--nte-nav-submenu-position);
115
+ inset-block-start: var(--nte-nav-submenu-inset-block-start);
116
+ inset-inline-start: var(--nte-nav-submenu-inset-inline-start);
117
+ opacity: 0;
118
+ transform: var(--nte-nav-submenu-enter-transform);
119
+ visibility: hidden;
120
+ pointer-events: none;
121
+ transition:
122
+ grid-template-rows var(--nte-nav-transition-duration) ease,
123
+ opacity var(--nte-nav-transition-duration) ease,
124
+ transform var(--nte-nav-transition-duration) ease,
125
+ visibility var(--nte-nav-transition-duration) allow-discrete;
126
+ }
127
+
128
+ #details[open] #submenu {
129
+ grid-template-rows: 1fr;
130
+ margin-block-start: var(--nte-nav-submenu-gap);
131
+ opacity: 1;
132
+ transform: none;
133
+ visibility: visible;
134
+ pointer-events: auto;
135
+ }
136
+
137
+ #submenu[popover] {
138
+ inline-size: max-content;
139
+ max-inline-size: calc(100vw - 2rem);
140
+ margin: var(--nte-nav-submenu-gap) 0 0;
141
+ overflow: hidden;
142
+ position: fixed;
143
+ position-anchor: --nte-nav-submenu-anchor;
144
+ position-area: var(--nte-nav-submenu-position-area);
145
+ position-try-fallbacks: flip-block, flip-inline;
146
+ inset: auto;
147
+ transition:
148
+ opacity var(--nte-nav-transition-duration) ease,
149
+ transform var(--nte-nav-transition-duration) ease,
150
+ display var(--nte-nav-transition-duration) allow-discrete,
151
+ overlay var(--nte-nav-transition-duration) allow-discrete;
152
+ }
153
+
154
+ @supports (inline-size: anchor-size(inline)) {
155
+ #submenu[popover] {
156
+ inline-size: max(anchor-size(inline), var(--nte-nav-submenu-min-inline-size));
157
+ }
158
+ }
159
+
160
+ #submenu[popover]:not(:popover-open) {
161
+ display: none;
162
+ }
163
+
164
+ #submenu[popover]:popover-open {
165
+ display: grid;
166
+ grid-template-rows: 1fr;
167
+ opacity: 1;
168
+ transform: none;
169
+ visibility: visible;
170
+ pointer-events: auto;
171
+ }
172
+
173
+ @starting-style {
174
+ #submenu[popover]:popover-open {
175
+ opacity: 0;
176
+ transform: var(--nte-nav-submenu-enter-transform);
177
+ }
178
+ }
179
+
180
+ #submenu-inner {
181
+ min-block-size: 0;
182
+ overflow: auto;
183
+ }
184
+
185
+ #submenu slot {
186
+ display: flex;
187
+ flex-direction: column;
188
+ align-items: stretch;
189
+ }
190
+
191
+ #submenu slot::slotted(nte-nav-item) {
192
+ --nte-nav-submenu-inset-block-start: var(--nte-nav-nested-submenu-inset-block-start);
193
+ --nte-nav-submenu-inset-inline-start: var(--nte-nav-nested-submenu-inset-inline-start);
194
+ --nte-nav-submenu-position-area: var(--nte-nav-nested-submenu-position-area);
195
+ --nte-nav-submenu-enter-transform: var(--nte-nav-nested-submenu-enter-transform);
196
+ }
197
+
198
+ @media (prefers-reduced-motion: reduce) {
199
+ #indicator,
200
+ #submenu {
201
+ transition-duration: 0.01ms;
202
+ }
203
+ }
@@ -0,0 +1,130 @@
1
+ // Defines the shared visual baseline for navigation links, states, and parts.
2
+ @mixin default-style(
3
+ $background: transparent,
4
+ $color: var(--nt-text, #212529),
5
+ $hover-background: color-mix(in srgb, var(--nt-primary, #0d6efd) 10%, transparent),
6
+ $hover-color: var(--nt-primary, #0d6efd),
7
+ $current-background: var(--nt-primary, #0d6efd),
8
+ $current-color: var(--nt-text-on-primary, #fff),
9
+ $submenu-background: var(--nt-body, #fff),
10
+ $submenu-border: 1px solid color-mix(in srgb, var(--nt-text, #212529) 14%, transparent),
11
+ $submenu-radius: calc(var(--nt-border-radius, 0.375rem) * 2),
12
+ $submenu-shadow: 0 1rem 2.5rem color-mix(in srgb, var(--nt-dark, #212529) 18%, transparent),
13
+ $focus-color: var(--nt-primary, #0d6efd)
14
+ ) {
15
+ --nte-nav-item-gap: 0.5rem;
16
+ --nte-nav-submenu-gap: 0.35rem;
17
+ --nte-nav-transition-duration: 160ms;
18
+
19
+ // Applies the baseline navigation foreground and background colors.
20
+ &::part(nav) {
21
+ color: #{$color};
22
+ background: #{$background};
23
+ }
24
+
25
+ // Keeps navigation items aligned with the height of their navigation line.
26
+ & nte-nav-item::part(item) {
27
+ min-block-size: 100%;
28
+ }
29
+
30
+ // Normalizes sizing and typography across all interactive navigation parts.
31
+ & nte-nav-item::part(link),
32
+ & nte-nav-item::part(text),
33
+ & nte-nav-item::part(disclosure),
34
+ & nte-nav-item::part(toggle) {
35
+ box-sizing: border-box;
36
+ color: inherit;
37
+ font: inherit;
38
+ }
39
+
40
+ // Provides the default spacing and typography for visible item content.
41
+ & nte-nav-item::part(link),
42
+ & nte-nav-item::part(text),
43
+ & nte-nav-item::part(disclosure) {
44
+ gap: 0.5rem;
45
+ padding: 0.7rem 1rem;
46
+ font-size: 1rem;
47
+ line-height: 1.25;
48
+ text-decoration: none;
49
+ }
50
+
51
+ // Makes disclosure controls compact, clipped, and keyboard-usable.
52
+ & nte-nav-item::part(disclosure),
53
+ & nte-nav-item::part(toggle) {
54
+ appearance: none;
55
+ min-inline-size: 0;
56
+ overflow: hidden;
57
+ border: 0;
58
+ background: transparent;
59
+ cursor: pointer;
60
+ white-space: nowrap;
61
+ text-overflow: ellipsis;
62
+ }
63
+
64
+ // Reserves a predictable hit area for submenu toggle controls.
65
+ & nte-nav-item::part(toggle) {
66
+ align-self: stretch;
67
+ min-inline-size: 2.5rem;
68
+ padding: 0.5rem;
69
+ }
70
+
71
+ // Animates color and background changes for interactive states.
72
+ & nte-nav-item::part(link),
73
+ & nte-nav-item::part(text),
74
+ & nte-nav-item::part(disclosure),
75
+ & nte-nav-item::part(toggle) {
76
+ transition:
77
+ color 160ms ease,
78
+ background-color 160ms ease;
79
+ }
80
+
81
+ // Highlights navigation parts while the pointer is over them.
82
+ & nte-nav-item::part(link):hover,
83
+ & nte-nav-item::part(text):hover,
84
+ & nte-nav-item::part(disclosure):hover,
85
+ & nte-nav-item::part(toggle):hover {
86
+ color: #{$hover-color};
87
+ background-color: #{$hover-background};
88
+ }
89
+
90
+ // Provides a visible keyboard focus indicator for actionable parts.
91
+ & nte-nav-item::part(link):focus-visible,
92
+ & nte-nav-item::part(disclosure):focus-visible,
93
+ & nte-nav-item::part(toggle):focus-visible {
94
+ position: relative;
95
+ z-index: 1;
96
+ outline: 2px solid #{$focus-color};
97
+ outline-offset: -2px;
98
+ }
99
+
100
+ // Marks the current page with the active navigation colors.
101
+ & nte-nav-item[current='page']::part(link),
102
+ & nte-nav-item[current='true']::part(link) {
103
+ color: #{$current-color};
104
+ background: #{$current-background};
105
+ }
106
+
107
+ // Aligns optional navigation icons with the item label.
108
+ & nte-nav-item::part(icon) {
109
+ display: inline-grid;
110
+ inline-size: 1.1em;
111
+ block-size: 1.1em;
112
+ place-items: center;
113
+ }
114
+
115
+ // Pushes submenu indicators to the trailing edge of the item.
116
+ & nte-nav-item::part(indicator) {
117
+ flex: 0 0 auto;
118
+ margin-inline-start: auto;
119
+ }
120
+
121
+ // Reduces interactive transitions when the user requests less motion.
122
+ @media (prefers-reduced-motion: reduce) {
123
+ & nte-nav-item::part(link),
124
+ & nte-nav-item::part(text),
125
+ & nte-nav-item::part(disclosure),
126
+ & nte-nav-item::part(toggle) {
127
+ transition-duration: 0.01ms;
128
+ }
129
+ }
130
+ }
@@ -0,0 +1,51 @@
1
+ // Configures the navigation for horizontal items and native popover submenus.
2
+ @mixin horizontal($justify: flex-start, $gap: 0) {
3
+ --nte-nav-flow: row;
4
+ --nte-nav-align: stretch;
5
+ --nte-nav-justify: #{$justify};
6
+ --nte-nav-gap: #{$gap};
7
+ --nte-nav-submenu-position: absolute;
8
+ --nte-nav-submenu-inset-block-start: 100%;
9
+ --nte-nav-submenu-inset-inline-start: 0;
10
+ --nte-nav-nested-submenu-inset-block-start: 0;
11
+ --nte-nav-nested-submenu-inset-inline-start: 100%;
12
+ --nte-nav-submenu-enter-transform: translateY(-0.35rem);
13
+ --nte-nav-nested-submenu-enter-transform: translateX(-0.35rem);
14
+ --nte-nav-submenu-inline-size: max(100%, var(--nte-nav-submenu-min-inline-size));
15
+ --nte-nav-submenu-max-block-size: min(70vh, 32rem);
16
+ --nte-nav-item-min-inline-size: 100px;
17
+ --nte-nav-item-max-inline-size: 20rem;
18
+
19
+ // Keeps horizontal items in one row with the requested alignment and gap.
20
+ &::part(list) {
21
+ flex-flow: row nowrap;
22
+ align-items: stretch;
23
+ justify-content: #{$justify};
24
+ gap: #{$gap};
25
+ }
26
+
27
+ // Gives horizontal popover submenus their dropdown surface and elevation.
28
+ & nte-nav-item::part(submenu) {
29
+ padding: 0;
30
+ color: var(--nt-text, #212529);
31
+ background: var(--nt-body, #fff);
32
+ border: 1px solid color-mix(in srgb, var(--nt-text, #212529) 14%, transparent);
33
+ border-radius: calc(var(--nt-border-radius, 0.375rem) * 2);
34
+ box-shadow: 0 1rem 2.5rem color-mix(in srgb, var(--nt-dark, #212529) 18%, transparent);
35
+ }
36
+
37
+ // Constrains main-level items so long labels can shrink and ellipsize.
38
+ & > nte-nav-item {
39
+ flex: 0 1 auto;
40
+ inline-size: auto;
41
+ min-inline-size: 100px;
42
+ max-inline-size: min(100%, var(--nte-nav-item-max-inline-size));
43
+ overflow: hidden;
44
+ }
45
+
46
+ // Applies the horizontal minimum width to items that own a popover submenu.
47
+ & > nte-nav-item[submenu-popover] {
48
+ flex-shrink: 1;
49
+ min-inline-size: var(--nte-nav-item-min-inline-size);
50
+ }
51
+ }
@@ -0,0 +1,20 @@
1
+ @use 'default-style' as style;
2
+ @use 'sizes' as size;
3
+
4
+ // Provides the default navigation composition while allowing themes to define its color contract.
5
+ @mixin main-navigation(
6
+ $color: var(--nt-text, #212529),
7
+ $hover-color: var(--nt-primary, #0d6efd),
8
+ $current-background: var(--nt-primary, #0d6efd),
9
+ $current-color: var(--nt-text-on-primary, #fff),
10
+ $focus-color: var(--nt-primary, #0d6efd)
11
+ ) {
12
+ @include style.default-style(
13
+ $color: $color,
14
+ $hover-color: $hover-color,
15
+ $current-background: $current-background,
16
+ $current-color: $current-color,
17
+ $focus-color: $focus-color
18
+ );
19
+ @include size.size-large();
20
+ }
@@ -0,0 +1,10 @@
1
+ @use 'horizontal' as orientation-horizontal;
2
+ @use 'vertical' as orientation-vertical;
3
+
4
+ @mixin responsive($breakpoint: 48rem, $horizontal-justify: flex-start) {
5
+ @include orientation-vertical.vertical();
6
+
7
+ @media (min-width: $breakpoint) {
8
+ @include orientation-horizontal.horizontal($horizontal-justify);
9
+ }
10
+ }
@@ -0,0 +1,56 @@
1
+ @mixin size-small() {
2
+ & nte-nav-item::part(link),
3
+ & nte-nav-item::part(text),
4
+ & nte-nav-item::part(disclosure) {
5
+ padding-block: 0.45rem;
6
+ padding-inline: 0.7rem;
7
+ font-size: 0.875rem;
8
+ }
9
+
10
+ & nte-nav-item::part(toggle) {
11
+ min-inline-size: 2rem;
12
+ }
13
+
14
+ & nte-nav-item::part(icon) {
15
+ inline-size: 1rem;
16
+ block-size: 1rem;
17
+ }
18
+ }
19
+
20
+ @mixin size-medium() {
21
+ & nte-nav-item::part(link),
22
+ & nte-nav-item::part(text),
23
+ & nte-nav-item::part(disclosure) {
24
+ padding-block: 0.7rem;
25
+ padding-inline: 1rem;
26
+ font-size: 1rem;
27
+ }
28
+
29
+ & nte-nav-item::part(toggle) {
30
+ min-inline-size: 2.5rem;
31
+ }
32
+
33
+ & nte-nav-item::part(icon) {
34
+ inline-size: 1.1rem;
35
+ block-size: 1.1rem;
36
+ }
37
+ }
38
+
39
+ @mixin size-large() {
40
+ & nte-nav-item::part(link),
41
+ & nte-nav-item::part(text),
42
+ & nte-nav-item::part(disclosure) {
43
+ padding-block: 0.9rem;
44
+ padding-inline: 1.25rem;
45
+ font-size: 1.125rem;
46
+ }
47
+
48
+ & nte-nav-item::part(toggle) {
49
+ min-inline-size: 3rem;
50
+ }
51
+
52
+ & nte-nav-item::part(icon) {
53
+ inline-size: 1.2rem;
54
+ block-size: 1.2rem;
55
+ }
56
+ }
@@ -0,0 +1,11 @@
1
+ @use 'default-style' as style;
2
+ @use 'sizes' as size;
3
+
4
+ @mixin sub-navigation() {
5
+ @include style.default-style(
6
+ $background: transparent,
7
+ $hover-background: color-mix(in srgb, var(--nt-primary, #0d6efd) 8%, transparent),
8
+ $submenu-shadow: 0 0.75rem 2rem color-mix(in srgb, var(--nt-dark, #212529) 14%, transparent)
9
+ );
10
+ @include size.size-small();
11
+ }
@@ -0,0 +1,50 @@
1
+ // Configures the navigation for full-width inline disclosure submenus.
2
+ @mixin vertical($gap: 0.2rem) {
3
+ --nte-nav-flow: column;
4
+ --nte-nav-align: stretch;
5
+ --nte-nav-justify: flex-start;
6
+ --nte-nav-gap: #{$gap};
7
+ --nte-nav-submenu-position: static;
8
+ --nte-nav-submenu-inset-block-start: auto;
9
+ --nte-nav-submenu-inset-inline-start: auto;
10
+ --nte-nav-nested-submenu-inset-block-start: auto;
11
+ --nte-nav-nested-submenu-inset-inline-start: auto;
12
+ --nte-nav-submenu-enter-transform: translateY(-0.35rem);
13
+ --nte-nav-nested-submenu-enter-transform: translateY(-0.35rem);
14
+ --nte-nav-submenu-inline-size: 100%;
15
+ --nte-nav-submenu-min-inline-size: 0;
16
+ --nte-nav-submenu-max-block-size: none;
17
+ inline-size: 100%;
18
+
19
+ // Removes dropdown decoration while keeping vertical submenus transparent.
20
+ & nte-nav-item::part(submenu) {
21
+ background: transparent;
22
+ border: 0;
23
+ border-radius: 0;
24
+ box-shadow: none;
25
+ }
26
+
27
+ // Indents only nested item content while preserving full-width hover surfaces.
28
+ & nte-nav-item nte-nav-item::part(link),
29
+ & nte-nav-item nte-nav-item::part(text),
30
+ & nte-nav-item nte-nav-item::part(disclosure) {
31
+ padding-inline-start: calc(1rem + var(--nte-nav-inline-submenu-indent, 1rem));
32
+ }
33
+
34
+ // Stacks vertical items and disclosure submenus in normal document flow.
35
+ &::part(list) {
36
+ flex-flow: column nowrap;
37
+ align-items: stretch;
38
+ justify-content: flex-start;
39
+ gap: #{$gap};
40
+ }
41
+
42
+ // Makes every top-level vertical item fill the navigation width.
43
+ & > nte-nav-item,
44
+ & > nte-nav-item::part(item),
45
+ & > nte-nav-item::part(link),
46
+ & > nte-nav-item::part(text),
47
+ & > nte-nav-item::part(disclosure) {
48
+ inline-size: 100%;
49
+ }
50
+ }