Skip to content

Commit 43d886b

Browse files
feat(interface): merge search-nav & drill-down into network-breadcrumb (#704)
1 parent 22d368a commit 43d886b

10 files changed

Lines changed: 197 additions & 363 deletions

File tree

i18n/english.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,9 @@ const ui = {
218218
childOf: "child of",
219219
parentOf: "parent of",
220220
unlocked: "unlocked",
221-
locked: "locked"
221+
locked: "locked",
222+
switchPayload: "Switch payload",
223+
removeFromCache: "Remove from cache"
222224
},
223225
search: {
224226
packagesCache: "Packages available in the cache",

i18n/french.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,9 @@ const ui = {
218218
childOf: "enfant de",
219219
parentOf: "parent de",
220220
unlocked: "Déverrouillé",
221-
locked: "Verrouillé"
221+
locked: "Verrouillé",
222+
switchPayload: "Changer de payload",
223+
removeFromCache: "Retirer du cache"
222224
},
223225
search: {
224226
packagesCache: "Packages disponibles dans le cache",

public/components/navigation/navigation.css

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -76,23 +76,3 @@ nav#aside>ul li.bottom-nav {
7676
margin-top: auto;
7777
}
7878

79-
#search-nav {
80-
z-index: 30;
81-
display: flex;
82-
justify-content: center;
83-
align-items: center;
84-
position: absolute;
85-
height: 30px;
86-
left: 50px;
87-
padding-left: 20px;
88-
max-width: calc(100vw - 70px);
89-
box-sizing: border-box;
90-
background: var(--primary);
91-
transform: skewX(-20deg);
92-
box-shadow: 2px 1px 10px #26107f7a;
93-
}
94-
95-
body.dark #search-nav {
96-
background: var(--dark-theme-primary-color);
97-
}
98-

public/components/drill-breadcrumb/drill-breadcrumb.js renamed to public/components/network-breadcrumb/network-breadcrumb.js

Lines changed: 149 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,45 @@ import { LitElement, html, css, nothing } from "lit";
33

44
// Import Internal Dependencies
55
import { EVENTS } from "../../core/events.js";
6+
import { currentLang } from "../../common/utils.js";
67

7-
class DrillBreadcrumb extends LitElement {
8+
class NetworkBreadcrumb extends LitElement {
89
static styles = css`
910
:host {
11+
--breadcrumb-bg: var(--primary);
12+
--breadcrumb-shadow: 2px 1px 10px rgb(38 16 127 / 48%);
13+
--breadcrumb-dropdown-bg: var(--primary-darker);
14+
--breadcrumb-dropdown-border: rgb(255 255 255 / 20%);
15+
--breadcrumb-dropdown-hover: rgb(255 255 255 / 15%);
16+
--breadcrumb-header-color: rgb(255 255 255 / 50%);
17+
--breadcrumb-separator-bg: rgb(255 255 255 / 15%);
18+
1019
position: absolute;
11-
top: 38px;
20+
top: 8px;
1221
left: 10px;
1322
z-index: 20;
1423
display: flex;
1524
align-items: center;
1625
gap: 4px;
17-
background: rgb(10 10 20 / 72%);
26+
background: var(--breadcrumb-bg);
27+
box-shadow: var(--breadcrumb-shadow);
1828
border-radius: 6px;
1929
padding: 4px 10px;
2030
font-family: mononoki, monospace;
2131
font-size: 12px;
2232
color: #fff;
2333
}
2434
35+
:host-context(body.dark) {
36+
--breadcrumb-bg: rgb(10 10 20 / 72%);
37+
--breadcrumb-shadow: none;
38+
--breadcrumb-dropdown-bg: rgb(10 10 20 / 95%);
39+
--breadcrumb-dropdown-border: rgb(255 255 255 / 15%);
40+
--breadcrumb-dropdown-hover: rgb(255 255 255 / 10%);
41+
--breadcrumb-header-color: rgb(255 255 255 / 40%);
42+
--breadcrumb-separator-bg: rgb(255 255 255 / 10%);
43+
}
44+
2545
:host([hidden]) {
2646
display: none !important;
2747
}
@@ -72,14 +92,11 @@ class DrillBreadcrumb extends LitElement {
7292
.dropdown {
7393
position: absolute;
7494
top: calc(100% + 6px);
75-
left: 50%;
76-
transform: translateX(-50%);
77-
background: rgb(10 10 20 / 95%);
78-
border: 1px solid rgb(255 255 255 / 15%);
95+
left: 0;
96+
background: var(--breadcrumb-dropdown-bg);
97+
border: 1px solid var(--breadcrumb-dropdown-border);
7998
border-radius: 6px;
8099
padding: 4px 0;
81-
min-width: 180px;
82-
max-height: 260px;
83100
overflow-y: auto;
84101
z-index: 30;
85102
box-shadow: 0 4px 16px rgb(0 0 0 / 50%);
@@ -97,25 +114,83 @@ class DrillBreadcrumb extends LitElement {
97114
}
98115
99116
.dropdown button:hover {
100-
background: rgb(255 255 255 / 10%);
117+
background: var(--breadcrumb-dropdown-hover);
101118
color: #fff;
102119
text-decoration: none;
103120
}
121+
122+
.dropdown-header {
123+
display: block;
124+
padding: 4px 12px 3px;
125+
font-size: 10px;
126+
color: var(--breadcrumb-header-color);
127+
text-transform: uppercase;
128+
letter-spacing: 0.08em;
129+
cursor: default;
130+
}
131+
132+
.dropdown-separator {
133+
height: 1px;
134+
background: var(--breadcrumb-separator-bg);
135+
margin: 3px 0 4px;
136+
}
137+
138+
.root-switcher-wrapper {
139+
position: static;
140+
}
141+
142+
.root-switcher {
143+
opacity: 0.55;
144+
font-size: 11px;
145+
padding: 0 3px;
146+
}
147+
148+
.root-switcher:hover {
149+
opacity: 1;
150+
text-decoration: none;
151+
}
152+
153+
.root-entry {
154+
display: inline-flex;
155+
align-items: center;
156+
gap: 5px;
157+
}
158+
159+
.root-label {
160+
color: rgb(255 255 255 / 85%);
161+
}
162+
163+
.remove-btn {
164+
opacity: 0.3;
165+
font-size: 14px;
166+
line-height: 1;
167+
padding: 0 1px;
168+
}
169+
170+
.remove-btn:hover {
171+
opacity: 1;
172+
color: #ff6b6b;
173+
text-decoration: none;
174+
}
104175
`;
105176

106177
static properties = {
107178
root: { type: Object },
108179
stack: { type: Array },
109180
siblings: { type: Array },
110-
_openDropdown: { state: true }
181+
packages: { type: Array },
182+
_openDropdown: { state: true },
183+
_rootSwitcherOpen: { state: true }
111184
};
112185

113186
constructor() {
114187
super();
115188
this.root = null;
116189
this.stack = [];
117190
this.siblings = [];
191+
this.packages = [];
118192
this._openDropdown = null;
193+
this._rootSwitcherOpen = false;
119194
}
120195

121196
connectedCallback() {
@@ -129,13 +204,17 @@ class DrillBreadcrumb extends LitElement {
129204
}
130205

131206
updated() {
132-
this.hidden = this.stack.length === 0 || this.root === null;
207+
this.hidden = this.root === null;
133208
}
134209

135210
#handleDocumentClick = () => {
136211
if (this._openDropdown !== null) {
137212
this._openDropdown = null;
138213
}
214+
215+
if (this._rootSwitcherOpen) {
216+
this._rootSwitcherOpen = false;
217+
}
139218
};
140219

141220
#handleReset() {
@@ -170,13 +249,68 @@ class DrillBreadcrumb extends LitElement {
170249
}));
171250
}
172251

252+
#toggleRootSwitcher(event) {
253+
event.stopPropagation();
254+
255+
this._rootSwitcherOpen = !this._rootSwitcherOpen;
256+
}
257+
258+
#handleRootSwitch(spec, event) {
259+
event.stopPropagation();
260+
261+
this._rootSwitcherOpen = false;
262+
this.dispatchEvent(new CustomEvent(EVENTS.ROOT_SWITCH, {
263+
detail: { spec },
264+
bubbles: true,
265+
composed: true
266+
}));
267+
}
268+
269+
#handleRootRemove(event) {
270+
event.stopPropagation();
271+
272+
this.dispatchEvent(new CustomEvent(EVENTS.ROOT_REMOVE, {
273+
bubbles: true,
274+
composed: true
275+
}));
276+
}
277+
173278
render() {
174-
if (this.stack.length === 0 || this.root === null) {
279+
if (this.root === null) {
175280
return nothing;
176281
}
177282

283+
const otherPackages = this.packages ?? [];
284+
const isInDrill = this.stack.length > 0;
285+
const i18n = window.i18n[currentLang()];
286+
178287
return html`
179-
<button @click="${this.#handleReset}">${this.root.name}@${this.root.version}</button>
288+
${otherPackages.length > 0 ? html`
289+
<span class="separator-wrapper root-switcher-wrapper">
290+
<button
291+
class="root-switcher"
292+
@click="${this.#toggleRootSwitcher}"
293+
></button>
294+
${this._rootSwitcherOpen ? html`
295+
<div class="dropdown">
296+
<span class="dropdown-header">${i18n.network.switchPayload}</span>
297+
<div class="dropdown-separator"></div>
298+
${otherPackages.map((pkg) => html`
299+
<button @click="${(event) => this.#handleRootSwitch(pkg.spec, event)}">
300+
${pkg.spec}
301+
</button>
302+
`)}
303+
</div>
304+
` : nothing}
305+
</span>
306+
` : nothing}
307+
<span class="root-entry">
308+
${isInDrill
309+
? html`<button @click="${this.#handleReset}">${this.root.name}@${this.root.version}</button>`
310+
: html`<span class="root-label">${this.root.name}@${this.root.version}</span>`
311+
}
312+
<button class="remove-btn" @click="${this.#handleRootRemove}" title="${i18n.network.removeFromCache}">×</button>
313+
</span>
180314
${this.stack.map((entry, stackIndex) => {
181315
const siblingList = this.siblings?.[stackIndex] ?? [];
182316
const hasSiblings = siblingList.length > 0;
@@ -212,4 +346,4 @@ class DrillBreadcrumb extends LitElement {
212346
}
213347
}
214348

215-
customElements.define("drill-breadcrumb", DrillBreadcrumb);
349+
customElements.define("network-breadcrumb", NetworkBreadcrumb);

0 commit comments

Comments
 (0)