@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.
Files changed (97) hide show
  1. package/dist/_generated/asset-bytes.d.ts +3 -0
  2. package/dist/_generated/asset-bytes.d.ts.map +1 -0
  3. package/dist/_generated/asset-bytes.js +2 -0
  4. package/dist/_generated/asset-bytes.js.map +1 -0
  5. package/dist/_generated/asset-manifest.d.ts +3 -0
  6. package/dist/_generated/asset-manifest.d.ts.map +1 -0
  7. package/dist/_generated/asset-manifest.js +12 -0
  8. package/dist/_generated/asset-manifest.js.map +1 -0
  9. package/dist/asset-registry.d.ts +38 -0
  10. package/dist/asset-registry.d.ts.map +1 -0
  11. package/dist/asset-registry.js +73 -0
  12. package/dist/asset-registry.js.map +1 -0
  13. package/dist/assets/admin-core.c0b5af61.js +1393 -0
  14. package/dist/assets/admin-extra.7ca9c16b.js +2529 -0
  15. package/dist/assets/admin.c26bb17a.css +2219 -0
  16. package/dist/assets/design.99dc4ddc.css +97 -0
  17. package/dist/assets/did-address.7df30f28.js +51 -0
  18. package/dist/assets/header.94d9e46b.js +136 -0
  19. package/dist/assets/login.7b12c6dc.css +662 -0
  20. package/dist/assets/login.d3f05790.js +720 -0
  21. package/dist/assets/qr.c0d203ca.js +3 -0
  22. package/dist/blocklet-service.d.ts +7 -32
  23. package/dist/blocklet-service.d.ts.map +1 -1
  24. package/dist/blocklet-service.js +43 -37
  25. package/dist/blocklet-service.js.map +1 -1
  26. package/dist/env-config.d.ts +86 -0
  27. package/dist/env-config.d.ts.map +1 -0
  28. package/dist/env-config.js +33 -0
  29. package/dist/env-config.js.map +1 -0
  30. package/dist/handlers/auth-handler.d.ts +1 -1
  31. package/dist/handlers/auth-handler.d.ts.map +1 -1
  32. package/dist/handlers/auth-handler.js +11 -11
  33. package/dist/handlers/auth-handler.js.map +1 -1
  34. package/dist/handlers/branding-handler.d.ts.map +1 -1
  35. package/dist/handlers/branding-handler.js +3 -2
  36. package/dist/handlers/branding-handler.js.map +1 -1
  37. package/dist/index.d.ts +1 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/og/generator.d.ts.map +1 -1
  42. package/dist/og/generator.js +8 -2
  43. package/dist/og/generator.js.map +1 -1
  44. package/dist/og/index.d.ts +2 -0
  45. package/dist/og/index.d.ts.map +1 -1
  46. package/dist/og/index.js +1 -0
  47. package/dist/og/index.js.map +1 -1
  48. package/dist/og/node-config.d.ts +23 -0
  49. package/dist/og/node-config.d.ts.map +1 -0
  50. package/dist/og/node-config.js +22 -0
  51. package/dist/og/node-config.js.map +1 -0
  52. package/dist/og/types.d.ts +10 -5
  53. package/dist/og/types.d.ts.map +1 -1
  54. package/dist/og/types.js.map +1 -1
  55. package/dist/pages/admin/index.d.ts.map +1 -1
  56. package/dist/pages/admin/index.js +25 -41
  57. package/dist/pages/admin/index.js.map +1 -1
  58. package/dist/pages/admin/tab-access.d.ts +1 -1
  59. package/dist/pages/admin/tab-access.d.ts.map +1 -1
  60. package/dist/pages/admin/tab-access.js +5 -2
  61. package/dist/pages/admin/tab-access.js.map +1 -1
  62. package/dist/pages/admin/tab-appearance.d.ts +1 -1
  63. package/dist/pages/admin/tab-appearance.d.ts.map +1 -1
  64. package/dist/pages/admin/tab-appearance.js +4 -2
  65. package/dist/pages/admin/tab-appearance.js.map +1 -1
  66. package/dist/pages/admin/tab-branding.d.ts.map +1 -1
  67. package/dist/pages/admin/tab-branding.js +4 -2
  68. package/dist/pages/admin/tab-branding.js.map +1 -1
  69. package/dist/pages/admin/tab-profile-accounts.d.ts.map +1 -1
  70. package/dist/pages/admin/tab-profile-accounts.js +4 -2
  71. package/dist/pages/admin/tab-profile-accounts.js.map +1 -1
  72. package/dist/pages/admin/tab-settings.d.ts.map +1 -1
  73. package/dist/pages/admin/tab-settings.js +4 -2
  74. package/dist/pages/admin/tab-settings.js.map +1 -1
  75. package/dist/pages/admin-instances-page.d.ts.map +1 -1
  76. package/dist/pages/admin-instances-page.js +4 -6
  77. package/dist/pages/admin-instances-page.js.map +1 -1
  78. package/dist/pages/error-page.d.ts.map +1 -1
  79. package/dist/pages/error-page.js +3 -2
  80. package/dist/pages/error-page.js.map +1 -1
  81. package/dist/pages/gen-access-key-page.d.ts.map +1 -1
  82. package/dist/pages/gen-access-key-page.js +3 -4
  83. package/dist/pages/gen-access-key-page.js.map +1 -1
  84. package/dist/pages/homepage.d.ts.map +1 -1
  85. package/dist/pages/homepage.js +4 -3
  86. package/dist/pages/homepage.js.map +1 -1
  87. package/dist/pages/invite-page.d.ts.map +1 -1
  88. package/dist/pages/invite-page.js +4 -4
  89. package/dist/pages/invite-page.js.map +1 -1
  90. package/dist/pages/login-page.d.ts.map +1 -1
  91. package/dist/pages/login-page.js +3 -4
  92. package/dist/pages/login-page.js.map +1 -1
  93. package/package.json +6 -4
  94. package/dist/identity/csrf.d.ts +0 -17
  95. package/dist/identity/csrf.d.ts.map +0 -1
  96. package/dist/identity/csrf.js +0 -56
  97. 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">&#9662;</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);})();