@@ -3,25 +3,45 @@ import { LitElement, html, css, nothing } from "lit";
33
44// Import Internal Dependencies
55import { 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