@arcblock/did-connect-service 4.0.6 → 4.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/dist/_generated/asset-bytes.d.ts +3 -0
- package/dist/_generated/asset-bytes.d.ts.map +1 -0
- package/dist/_generated/asset-bytes.js +2 -0
- package/dist/_generated/asset-bytes.js.map +1 -0
- package/dist/_generated/asset-manifest.d.ts +3 -0
- package/dist/_generated/asset-manifest.d.ts.map +1 -0
- package/dist/_generated/asset-manifest.js +12 -0
- package/dist/_generated/asset-manifest.js.map +1 -0
- package/dist/asset-registry.d.ts +38 -0
- package/dist/asset-registry.d.ts.map +1 -0
- package/dist/asset-registry.js +73 -0
- package/dist/asset-registry.js.map +1 -0
- package/dist/assets/admin-core.c0b5af61.js +1393 -0
- package/dist/assets/admin-extra.7ca9c16b.js +2529 -0
- package/dist/assets/admin.c26bb17a.css +2219 -0
- package/dist/assets/design.99dc4ddc.css +97 -0
- package/dist/assets/did-address.7df30f28.js +51 -0
- package/dist/assets/header.94d9e46b.js +136 -0
- package/dist/assets/login.7b12c6dc.css +662 -0
- package/dist/assets/login.d3f05790.js +720 -0
- package/dist/assets/qr.c0d203ca.js +3 -0
- package/dist/blocklet-service.d.ts +7 -32
- package/dist/blocklet-service.d.ts.map +1 -1
- package/dist/blocklet-service.js +43 -37
- package/dist/blocklet-service.js.map +1 -1
- package/dist/env-config.d.ts +86 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +33 -0
- package/dist/env-config.js.map +1 -0
- package/dist/handlers/auth-handler.d.ts +1 -1
- package/dist/handlers/auth-handler.d.ts.map +1 -1
- package/dist/handlers/auth-handler.js +11 -11
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/branding-handler.d.ts.map +1 -1
- package/dist/handlers/branding-handler.js +3 -2
- package/dist/handlers/branding-handler.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/og/generator.d.ts.map +1 -1
- package/dist/og/generator.js +8 -2
- package/dist/og/generator.js.map +1 -1
- package/dist/og/index.d.ts +2 -0
- package/dist/og/index.d.ts.map +1 -1
- package/dist/og/index.js +1 -0
- package/dist/og/index.js.map +1 -1
- package/dist/og/node-config.d.ts +23 -0
- package/dist/og/node-config.d.ts.map +1 -0
- package/dist/og/node-config.js +22 -0
- package/dist/og/node-config.js.map +1 -0
- package/dist/og/types.d.ts +10 -5
- package/dist/og/types.d.ts.map +1 -1
- package/dist/og/types.js.map +1 -1
- package/dist/pages/admin/index.d.ts.map +1 -1
- package/dist/pages/admin/index.js +25 -41
- package/dist/pages/admin/index.js.map +1 -1
- package/dist/pages/admin/tab-access.d.ts +1 -1
- package/dist/pages/admin/tab-access.d.ts.map +1 -1
- package/dist/pages/admin/tab-access.js +5 -2
- package/dist/pages/admin/tab-access.js.map +1 -1
- package/dist/pages/admin/tab-appearance.d.ts +1 -1
- package/dist/pages/admin/tab-appearance.d.ts.map +1 -1
- package/dist/pages/admin/tab-appearance.js +4 -2
- package/dist/pages/admin/tab-appearance.js.map +1 -1
- package/dist/pages/admin/tab-branding.d.ts.map +1 -1
- package/dist/pages/admin/tab-branding.js +4 -2
- package/dist/pages/admin/tab-branding.js.map +1 -1
- package/dist/pages/admin/tab-profile-accounts.d.ts.map +1 -1
- package/dist/pages/admin/tab-profile-accounts.js +4 -2
- package/dist/pages/admin/tab-profile-accounts.js.map +1 -1
- package/dist/pages/admin/tab-settings.d.ts.map +1 -1
- package/dist/pages/admin/tab-settings.js +4 -2
- package/dist/pages/admin/tab-settings.js.map +1 -1
- package/dist/pages/admin-instances-page.d.ts.map +1 -1
- package/dist/pages/admin-instances-page.js +4 -6
- package/dist/pages/admin-instances-page.js.map +1 -1
- package/dist/pages/error-page.d.ts.map +1 -1
- package/dist/pages/error-page.js +3 -2
- package/dist/pages/error-page.js.map +1 -1
- package/dist/pages/gen-access-key-page.d.ts.map +1 -1
- package/dist/pages/gen-access-key-page.js +3 -4
- package/dist/pages/gen-access-key-page.js.map +1 -1
- package/dist/pages/homepage.d.ts.map +1 -1
- package/dist/pages/homepage.js +4 -3
- package/dist/pages/homepage.js.map +1 -1
- package/dist/pages/invite-page.d.ts.map +1 -1
- package/dist/pages/invite-page.js +4 -4
- package/dist/pages/invite-page.js.map +1 -1
- package/dist/pages/login-page.d.ts.map +1 -1
- package/dist/pages/login-page.js +3 -4
- package/dist/pages/login-page.js.map +1 -1
- package/package.json +6 -4
- package/dist/identity/csrf.d.ts +0 -17
- package/dist/identity/csrf.d.ts.map +0 -1
- package/dist/identity/csrf.js +0 -56
- package/dist/identity/csrf.js.map +0 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
|
|
2
|
+
:root {
|
|
3
|
+
/* Backgrounds — layered depth */
|
|
4
|
+
--bg-root: #0a0a0b;
|
|
5
|
+
--bg-surface: #141416;
|
|
6
|
+
--bg-card: #1c1c20;
|
|
7
|
+
--bg-elevated: #232328;
|
|
8
|
+
--bg-hover: #2b2b34;
|
|
9
|
+
--bg-active: #33333e;
|
|
10
|
+
--bg-input: rgba(255,255,255,0.06);
|
|
11
|
+
|
|
12
|
+
/* Borders — semi-transparent for adaptability */
|
|
13
|
+
--border: rgba(255,255,255,0.10);
|
|
14
|
+
--border-subtle:rgba(255,255,255,0.06);
|
|
15
|
+
--border-strong:rgba(255,255,255,0.15);
|
|
16
|
+
--border-focus: rgba(255,255,255,0.25);
|
|
17
|
+
|
|
18
|
+
/* Text hierarchy */
|
|
19
|
+
--text: #f5f5f7;
|
|
20
|
+
--text-secondary:#9394a1;
|
|
21
|
+
--text-tertiary:#767684;
|
|
22
|
+
--text-placeholder:#5e5f6e;
|
|
23
|
+
--text-white: #ffffff;
|
|
24
|
+
|
|
25
|
+
/* Accents */
|
|
26
|
+
--blue: #6c47ff;
|
|
27
|
+
--blue-hover: #5f15fe;
|
|
28
|
+
--blue-light: rgba(108,71,255,0.15);
|
|
29
|
+
--blue-muted: #9280ff;
|
|
30
|
+
--red: #e02e2e;
|
|
31
|
+
--red-light: rgba(224,46,46,0.15);
|
|
32
|
+
--red-text: #f98a8a;
|
|
33
|
+
--green: #15892b;
|
|
34
|
+
--green-light: rgba(21,137,43,0.15);
|
|
35
|
+
--green-text: #49dc6e;
|
|
36
|
+
--yellow: #fd7224;
|
|
37
|
+
--yellow-light: rgba(253,114,36,0.15);
|
|
38
|
+
--yellow-text: #fd9357;
|
|
39
|
+
--info: #236dd7;
|
|
40
|
+
--info-light: rgba(35,109,215,0.15);
|
|
41
|
+
--info-text: #73acfa;
|
|
42
|
+
|
|
43
|
+
/* Radii */
|
|
44
|
+
--radius-xs: 4px;
|
|
45
|
+
--radius-sm: 6px;
|
|
46
|
+
--radius: 8px;
|
|
47
|
+
--radius-lg: 12px;
|
|
48
|
+
--radius-full: 9999px;
|
|
49
|
+
|
|
50
|
+
/* Shadows */
|
|
51
|
+
--shadow-sm: 0 1px 3px rgba(0,0,0,0.3), 0 1px 2px -1px rgba(0,0,0,0.2);
|
|
52
|
+
--shadow-md: 0 4px 6px -1px rgba(0,0,0,0.4), 0 2px 4px -2px rgba(0,0,0,0.3);
|
|
53
|
+
--shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.5), 0 4px 6px -4px rgba(0,0,0,0.4);
|
|
54
|
+
--shadow-focus: 0 0 0 1px rgba(255,255,255,0.12), 0 0 0 3px rgba(108,71,255,0.3);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
[data-theme="light"] {
|
|
58
|
+
--bg-root: #f8f9fa;
|
|
59
|
+
--bg-surface: #ffffff;
|
|
60
|
+
--bg-card: #ffffff;
|
|
61
|
+
--bg-elevated: #f0f1f3;
|
|
62
|
+
--bg-hover: #e9eaec;
|
|
63
|
+
--bg-active: #dddee1;
|
|
64
|
+
--bg-input: rgba(0,0,0,0.04);
|
|
65
|
+
|
|
66
|
+
--border: rgba(0,0,0,0.10);
|
|
67
|
+
--border-subtle:rgba(0,0,0,0.06);
|
|
68
|
+
--border-strong:rgba(0,0,0,0.15);
|
|
69
|
+
--border-focus: rgba(0,0,0,0.25);
|
|
70
|
+
|
|
71
|
+
--text: #1a1a1a;
|
|
72
|
+
--text-secondary:#6b7280;
|
|
73
|
+
--text-tertiary:#9ca3af;
|
|
74
|
+
--text-placeholder:#c0c5ce;
|
|
75
|
+
--text-white: #1a1a1a;
|
|
76
|
+
|
|
77
|
+
--shadow-sm: 0 1px 3px rgba(0,0,0,0.08), 0 1px 2px -1px rgba(0,0,0,0.06);
|
|
78
|
+
--shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.06);
|
|
79
|
+
--shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.12), 0 4px 6px -4px rgba(0,0,0,0.08);
|
|
80
|
+
--shadow-focus: 0 0 0 1px rgba(0,0,0,0.08), 0 0 0 3px rgba(108,71,255,0.2);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
84
|
+
html { color-scheme: dark; }
|
|
85
|
+
html[data-theme="light"] { color-scheme: light; }
|
|
86
|
+
body {
|
|
87
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
88
|
+
background: var(--bg-root);
|
|
89
|
+
color: var(--text);
|
|
90
|
+
-webkit-font-smoothing: antialiased;
|
|
91
|
+
-moz-osx-font-smoothing: grayscale;
|
|
92
|
+
font-size: 14px;
|
|
93
|
+
line-height: 1.43;
|
|
94
|
+
}
|
|
95
|
+
a { color: var(--blue-muted); text-decoration: none; }
|
|
96
|
+
a:hover { text-decoration: underline; }
|
|
97
|
+
.hidden { display: none; }
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";var __DidAddressBundle=(()=>{var p=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var D=(e,t)=>{for(var o in t)p(e,o,{get:t[o],enumerable:!0})},E=(e,t,o,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of $(t))!A.call(e,s)&&s!==o&&p(e,s,{get:()=>t[s],enumerable:!(i=k(t,s))||i.enumerable});return e};var L=e=>E(p({},"__esModule",{value:!0}),e);var S={};D(S,{DidAddressElement:()=>n,truncateDid:()=>h});var d="did:abt:";function H(e){if(!e||typeof e!="string")return!1;let t=e.replace(d,"");return/^(0x)?[0-9a-f]{40}$/i.test(t)}function h(e,t=8,o=6){return!e||typeof e!="string"?"":e.length<=t+o+3?e:`${e.slice(0,t)}...${e.slice(-o)}`}function m(e,t={}){if(!e||typeof e!="string")return{prefix:"DID: ABT:",chainLabel:"ABT",address:"",compact:"",copyText:""};let{startChars:o=8,endChars:i=6}=t,s=H(e),r=e.replace(d,""),c=s?"ETH":"ABT",a=t.includePrefix??!s;return{prefix:`DID: ${c}:`,chainLabel:c,address:r,compact:h(r,o,i),copyText:a?`${d}${r}`:r}}var M=typeof HTMLElement<"u"?HTMLElement:class{},b='<svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>',P='<svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>',B=`
|
|
2
|
+
:host {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
max-width: 100%;
|
|
6
|
+
overflow: hidden;
|
|
7
|
+
font-family: 'SF Mono', 'JetBrains Mono', 'Menlo', 'Consolas', monospace;
|
|
8
|
+
line-height: 1.5;
|
|
9
|
+
}
|
|
10
|
+
:host([block]) { display: flex; }
|
|
11
|
+
.prefix {
|
|
12
|
+
flex-shrink: 0;
|
|
13
|
+
opacity: 0.6;
|
|
14
|
+
margin-right: 4px;
|
|
15
|
+
white-space: nowrap;
|
|
16
|
+
}
|
|
17
|
+
.address {
|
|
18
|
+
white-space: nowrap;
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
text-overflow: ellipsis;
|
|
21
|
+
color: var(--did-text-color, currentColor);
|
|
22
|
+
}
|
|
23
|
+
.address-compact {
|
|
24
|
+
white-space: nowrap;
|
|
25
|
+
color: var(--did-text-color, currentColor);
|
|
26
|
+
cursor: default;
|
|
27
|
+
}
|
|
28
|
+
.clickable { cursor: pointer; }
|
|
29
|
+
.clickable:hover { opacity: 0.8; }
|
|
30
|
+
.copy-btn {
|
|
31
|
+
flex-shrink: 0;
|
|
32
|
+
display: inline-flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
justify-content: center;
|
|
35
|
+
width: 1em;
|
|
36
|
+
height: 1em;
|
|
37
|
+
margin-left: 6px;
|
|
38
|
+
padding: 0;
|
|
39
|
+
border: none;
|
|
40
|
+
background: none;
|
|
41
|
+
color: inherit;
|
|
42
|
+
opacity: 0.5;
|
|
43
|
+
cursor: pointer;
|
|
44
|
+
transition: opacity 0.15s;
|
|
45
|
+
}
|
|
46
|
+
.copy-btn:hover { opacity: 1; }
|
|
47
|
+
.copy-btn.copied { opacity: 1; color: var(--did-copy-success-color, #22c55e); }
|
|
48
|
+
`,n=class extends M{static observedAttributes=["did","compact","copyable","start-chars","end-chars","show-prefix","no-tooltip","no-copy","block","size"];shadow;copyTimer=null;constructor(){super(),this.shadow=this.attachShadow({mode:"open"})}connectedCallback(){this.render()}attributeChangedCallback(){this.render()}disconnectedCallback(){this.copyTimer&&clearTimeout(this.copyTimer)}get parts(){let t=Number(this.getAttribute("start-chars")),o=Number(this.getAttribute("end-chars"));return m(this.getAttribute("did")||"",{startChars:t>0?t:void 0,endChars:o>0?o:void 0})}render(){if(!(this.getAttribute("did")||"")){this.shadow.innerHTML="";return}let o=this.parts,i=this.hasAttribute("compact"),s=!this.hasAttribute("no-copy")&&this.getAttribute("copyable")!=="false",r=this.hasAttribute("show-prefix"),c=this.hasAttribute("no-tooltip"),a=Number(this.getAttribute("size"))||0,x=a>=12?`${a}px`:"inherit",g=i?o.compact:o.address,C=!c&&i?` title="${o.address}"`:"",w=r?`<span class="prefix">${o.prefix} </span>`:"",u=i?"address-compact":"address",T=s?" clickable":"",v=s?`<button class="copy-btn" aria-label="Copy DID">${b}</button>`:"";if(this.shadow.innerHTML=`
|
|
49
|
+
<style>${B}:host { font-size: ${x}; }</style>
|
|
50
|
+
${w}<span class="${u}${T}"${C}>${g}</span>${v}
|
|
51
|
+
`,s){let f=this.shadow.querySelector(`.${u}`);f&&f.addEventListener("click",l=>{l.stopPropagation(),this.copyToClipboard(o.copyText)});let y=this.shadow.querySelector(".copy-btn");y&&y.addEventListener("click",l=>{l.stopPropagation(),this.copyToClipboard(o.copyText)})}}copyToClipboard(t){navigator.clipboard?.writeText?navigator.clipboard.writeText(t).catch(()=>this.fallbackCopy(t)):this.fallbackCopy(t),this.showCopied()}fallbackCopy(t){try{let o=document.createElement("input");o.value=t,document.body.appendChild(o),o.select(),document.execCommand?.("copy"),o.remove()}catch{}}showCopied(){let t=this.shadow.querySelector(".copy-btn");t&&(t.classList.add("copied"),t.innerHTML=P,this.copyTimer&&clearTimeout(this.copyTimer),this.copyTimer=setTimeout(()=>{t.classList.remove("copied"),t.innerHTML=b},1500))}};typeof customElements<"u"&&!customElements.get("did-address")&&customElements.define("did-address",n);return L(S);})();
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";var __BlockletHeaderBundle=(()=>{var f=typeof HTMLElement<"u"?HTMLElement:class{},m='<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4m0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4"/></svg>',x='<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4z"/></svg>',k='<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4m0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4"/></svg>',y='<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M3 13h8V3H3zm0 8h8v-6H3zm10 0h8V11h-8zm0-18v6h8V3z"/></svg>';var v={en:{home:"Home",userCenter:"User Center",adminConsole:"Admin Console",billing:"Billing",signOut:"Sign Out",signIn:"Sign In"},zh:{home:"\u9996\u9875",userCenter:"\u4E2A\u4EBA\u4E2D\u5FC3",adminConsole:"\u63A7\u5236\u53F0",billing:"\u8D26\u5355",signOut:"\u9000\u51FA\u767B\u5F55",signIn:"\u767B\u5F55"}},C=`
|
|
2
|
+
:host {
|
|
3
|
+
display: block;
|
|
4
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
5
|
+
font-size: 14px;
|
|
6
|
+
/* Use design tokens from host page (inherited through Shadow DOM), with fallbacks */
|
|
7
|
+
--header-bg: var(--bg-surface, #111827);
|
|
8
|
+
--header-border: var(--border, #374151);
|
|
9
|
+
--header-text: var(--text-white, #f3f4f6);
|
|
10
|
+
--header-text-secondary: var(--text-tertiary, #9ca3af);
|
|
11
|
+
--header-hover: var(--bg-hover, #1f2937);
|
|
12
|
+
--header-primary: var(--blue-muted, #60a5fa);
|
|
13
|
+
--header-height: 56px;
|
|
14
|
+
--badge-bg: var(--blue-light, #1e3a5f);
|
|
15
|
+
--badge-text: var(--blue-muted, #93c5fd);
|
|
16
|
+
--dropdown-shadow: var(--shadow-lg, 0 4px 24px rgba(0,0,0,.4));
|
|
17
|
+
--dropdown-bg: var(--bg-card, #111827);
|
|
18
|
+
--dropdown-border: var(--border, #374151);
|
|
19
|
+
--dropdown-divider: var(--border-subtle, #1f2937);
|
|
20
|
+
--red-danger: var(--red-text, #ef4444);
|
|
21
|
+
--red-danger-bg: var(--red-light, #fef2f2);
|
|
22
|
+
}
|
|
23
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
24
|
+
.header {
|
|
25
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
26
|
+
height: var(--header-height); padding: 0 16px;
|
|
27
|
+
background: var(--header-bg); border-bottom: 1px solid var(--header-border);
|
|
28
|
+
color: var(--header-text); position: relative; z-index: 100;
|
|
29
|
+
}
|
|
30
|
+
.header-left { display: flex; align-items: center; gap: 16px; min-width: 0; }
|
|
31
|
+
.header-left a { color: var(--header-text-secondary); text-decoration: none; font-size: 13px; transition: color .15s; white-space: nowrap; }
|
|
32
|
+
.header-left a:hover { color: var(--header-text); text-decoration: none; }
|
|
33
|
+
.logo { height: 28px; width: auto; border-radius: 4px; flex-shrink: 0; }
|
|
34
|
+
.header-right { display: flex; align-items: center; gap: 8px; }
|
|
35
|
+
.avatar {
|
|
36
|
+
width: 32px; height: 32px; border-radius: 50%; background: var(--header-hover);
|
|
37
|
+
display: flex; align-items: center; justify-content: center; overflow: hidden;
|
|
38
|
+
color: var(--header-text-secondary); flex-shrink: 0; cursor: pointer;
|
|
39
|
+
}
|
|
40
|
+
.avatar img { width: 100%; height: 100%; object-fit: cover; }
|
|
41
|
+
.user-trigger {
|
|
42
|
+
position: relative;
|
|
43
|
+
display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 0;
|
|
44
|
+
border: none; background: none; color: var(--header-text);
|
|
45
|
+
font: inherit;
|
|
46
|
+
}
|
|
47
|
+
.user-name { display: none; }
|
|
48
|
+
.user-arrow { font-size: 12px; color: var(--header-text-secondary); line-height: 1; }
|
|
49
|
+
.badge {
|
|
50
|
+
display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px;
|
|
51
|
+
font-size: 11px; font-weight: 500; background: var(--badge-bg); color: var(--badge-text);
|
|
52
|
+
line-height: 1.45; white-space: nowrap;
|
|
53
|
+
}
|
|
54
|
+
.badge-owner { background: var(--blue-light, #1e3a5f); color: var(--blue-muted, #93c5fd); }
|
|
55
|
+
.badge-admin { background: var(--info-light, #1a2e4a); color: var(--info-text, #7dd3fc); }
|
|
56
|
+
.badge-member { background: var(--green-light, #14352a); color: var(--green-text, #4ade80); }
|
|
57
|
+
.badge-guest { background: var(--yellow-light, #3b2e1a); color: var(--yellow-text, #fbbf24); }
|
|
58
|
+
.dropdown {
|
|
59
|
+
position: absolute; top: calc(100% + 8px); right: 0;
|
|
60
|
+
background: var(--dropdown-bg); border: 1px solid var(--dropdown-border);
|
|
61
|
+
border-radius: 12px; width: 240px; max-width: calc(100vw - 32px);
|
|
62
|
+
box-shadow: var(--dropdown-shadow); display: none; z-index: 200;
|
|
63
|
+
overflow: hidden;
|
|
64
|
+
}
|
|
65
|
+
.dropdown.open { display: block; }
|
|
66
|
+
.dropdown-user {
|
|
67
|
+
padding: 12px 16px; border-bottom: 1px solid var(--dropdown-divider);
|
|
68
|
+
display: flex; align-items: center; gap: 8px;
|
|
69
|
+
}
|
|
70
|
+
.dropdown-user-name { font-weight: 600; font-size: 15px; color: var(--header-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
71
|
+
.dropdown-item {
|
|
72
|
+
display: flex; align-items: center; gap: 12px; padding: 10px 16px;
|
|
73
|
+
cursor: pointer; color: var(--header-text); font-size: 14px; transition: background .15s;
|
|
74
|
+
text-decoration: none;
|
|
75
|
+
}
|
|
76
|
+
.dropdown-item:hover { background: var(--header-hover); }
|
|
77
|
+
.dropdown-item svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--header-text-secondary); }
|
|
78
|
+
.dropdown-item.danger { color: var(--red-danger); }
|
|
79
|
+
.dropdown-item.danger:hover { background: var(--red-danger-bg); }
|
|
80
|
+
.dropdown-item.danger svg { color: var(--red-danger); }
|
|
81
|
+
.dropdown-divider { height: 1px; background: var(--dropdown-divider); margin: 4px 0; }
|
|
82
|
+
.login-btn {
|
|
83
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
84
|
+
height: 32px; padding: 0 16px; border-radius: 6px;
|
|
85
|
+
border: none; background: var(--header-primary); color: #fff;
|
|
86
|
+
font: inherit; font-weight: 500; cursor: pointer; font-size: 13px;
|
|
87
|
+
transition: opacity .15s;
|
|
88
|
+
}
|
|
89
|
+
.login-btn:hover { opacity: .9; }
|
|
90
|
+
.hidden { display: none !important; }
|
|
91
|
+
.nav { display: flex; align-items: center; gap: 2px; margin-left: 8px; }
|
|
92
|
+
.nav-item {
|
|
93
|
+
padding: 6px 12px; border-radius: 6px; font-size: 13px; font-weight: 500;
|
|
94
|
+
color: var(--header-text-secondary); text-decoration: none; white-space: nowrap;
|
|
95
|
+
transition: color .15s, background .15s; cursor: pointer; border: none; background: none;
|
|
96
|
+
font: inherit;
|
|
97
|
+
}
|
|
98
|
+
.nav-item:hover { color: var(--header-text); background: var(--header-hover); }
|
|
99
|
+
.nav-item.active { color: var(--header-primary); background: transparent; font-weight: 600; }
|
|
100
|
+
`,n=class extends f{static observedAttributes=["theme","app-name","app-logo","login-url","user-url","team-url","billing-url","nav-items","locale"];shadow;_user=null;_dropdownOpen=!1;_boundClose=null;constructor(){super(),this.shadow=this.attachShadow({mode:"open"})}connectedCallback(){this.render(),this.fetchSession(),this._boundClose=e=>{this.shadow.contains(e.target)||this.closeDropdown()},document.addEventListener("click",this._boundClose)}disconnectedCallback(){this._boundClose&&document.removeEventListener("click",this._boundClose)}attributeChangedCallback(){this.render()}get appName(){return this.getAttribute("app-name")||""}get appLogo(){return this.getAttribute("app-logo")||"/.well-known/service/blocklet/logo"}get loginUrl(){return this.getAttribute("login-url")||"/.well-known/service/login"}get userUrl(){return this.getAttribute("user-url")||"/.well-known/service/user"}get teamUrl(){return this.getAttribute("team-url")||"/.well-known/service/admin"}get billingUrl(){return this.getAttribute("billing-url")||""}get locale(){return this.getAttribute("locale")==="zh"?"zh":"en"}t(e){return v[this.locale][e]??v.en[e]??e}get navItems(){let e=this.getAttribute("nav-items");if(!e)return[];try{return JSON.parse(e)}catch{return[]}}async fetchSession(){try{let e=await fetch("/.well-known/service/api/did/session",{credentials:"include"});if(!e.ok)return;let t=await e.json();t.authenticated&&t.user&&(this._user=t.user,this.render())}catch{}}closeDropdown(){this._dropdownOpen=!1;let e=this.shadow.querySelector(".dropdown");e&&e.classList.remove("open")}toggleDropdown(e){e.stopPropagation(),this._dropdownOpen=!this._dropdownOpen;let t=this.shadow.querySelector(".dropdown");t&&t.classList.toggle("open",this._dropdownOpen)}abbreviateDid(e){return e.length<=20?e:`${e.slice(0,10)}...${e.slice(-6)}`}render(){let e=this._user,t=this.appLogo,u=this.appName,i=this.navItems,a=window.location.pathname,w=e?.role==="admin"||e?.role==="owner",b=i.length>0?`
|
|
101
|
+
<nav class="nav">
|
|
102
|
+
${i.map(r=>`<a class="nav-item${(r.link==="/"?a==="/":a.startsWith(r.link))?" active":""}" href="${r.link}">${r.label}</a>`).join("")}
|
|
103
|
+
</nav>
|
|
104
|
+
`:"";this.shadow.innerHTML=`
|
|
105
|
+
<style>${C}</style>
|
|
106
|
+
<div class="header">
|
|
107
|
+
<div class="header-left">
|
|
108
|
+
${t?`<img class="logo" src="${t}" alt="" />`:""}
|
|
109
|
+
<a href="/">${u||this.t("home")}</a>
|
|
110
|
+
${b}
|
|
111
|
+
</div>
|
|
112
|
+
<div class="header-right">
|
|
113
|
+
${e?`
|
|
114
|
+
<button class="user-trigger" id="trigger">
|
|
115
|
+
<div class="avatar">
|
|
116
|
+
${e.avatar?`<img src="${e.avatar}" alt="" />`:m}
|
|
117
|
+
</div>
|
|
118
|
+
<span class="user-arrow">▾</span>
|
|
119
|
+
</button>
|
|
120
|
+
<div class="dropdown" id="dropdown">
|
|
121
|
+
<div class="dropdown-user">
|
|
122
|
+
<div class="dropdown-user-name">${e.fullName||e.displayName||this.abbreviateDid(e.did)}</div>
|
|
123
|
+
<span class="badge badge-${e.role||"member"}">${e.role||"member"}</span>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="dropdown-item" id="user-center-link">${k} ${this.t("userCenter")}</div>
|
|
126
|
+
${w?`<div class="dropdown-item" id="team-link">${y} ${this.t("adminConsole")}</div>`:""}
|
|
127
|
+
${this.billingUrl?`<div class="dropdown-item" id="billing-link"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2m0 14H4v-6h16zm0-10H4V6h16z"/></svg> ${this.t("billing")}</div>`:""}
|
|
128
|
+
<div class="dropdown-divider"></div>
|
|
129
|
+
<div class="dropdown-item danger" id="logout-btn">${x} ${this.t("signOut")}</div>
|
|
130
|
+
</div>
|
|
131
|
+
`:`
|
|
132
|
+
<button class="login-btn" id="login-btn">${this.t("signIn")}</button>
|
|
133
|
+
`}
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
`;let d=this.shadow.getElementById("trigger");d&&d.addEventListener("click",r=>this.toggleDropdown(r));let s=this.shadow.getElementById("login-btn");s&&s.addEventListener("click",()=>{window.location.href=this.loginUrl});let l=this.shadow.getElementById("logout-btn");l&&l.addEventListener("click",()=>{window.location.href="/.well-known/service/api/did/logout"});let h=this.shadow.getElementById("user-center-link");h&&h.addEventListener("click",()=>{window.location.href=this.userUrl});let c=this.shadow.getElementById("team-link");c&&c.addEventListener("click",()=>{window.location.href=this.teamUrl});let g=this.shadow.getElementById("billing-link");g&&g.addEventListener("click",()=>{window.location.href=this.billingUrl}),this.shadow.querySelectorAll(".nav-item").forEach(r=>{r.addEventListener("click",p=>{p.preventDefault();let o=r.getAttribute("href");o&&o!==window.location.pathname&&(window.history.pushState({},"",o),window.dispatchEvent(new PopStateEvent("popstate")),this.render())})})}};typeof customElements<"u"&&!customElements.get("blocklet-header")&&customElements.define("blocklet-header",n);})();
|