@arcblock/did-connect-service 4.1.37 → 4.1.39
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.js +1 -1
- package/dist/_generated/asset-manifest.js +5 -5
- package/dist/_generated/header-bundle-string.d.ts +1 -1
- package/dist/_generated/header-bundle-string.d.ts.map +1 -1
- package/dist/_generated/header-bundle-string.js +1 -1
- package/dist/_generated/header-bundle-string.js.map +1 -1
- package/dist/_generated/login-bundle-string.d.ts +1 -1
- package/dist/_generated/login-bundle-string.d.ts.map +1 -1
- package/dist/_generated/login-bundle-string.js +1 -1
- package/dist/_generated/login-bundle-string.js.map +1 -1
- package/dist/assets/{admin-extra.979f5e56.js → admin-extra.c7a0720f.js} +3 -3
- package/dist/assets/{admin.f5f577f9.css → admin.ab0009f2.css} +22 -2
- package/dist/assets/{header.94d9e46b.js → header.8703ab26.js} +5 -5
- package/dist/assets/login.60fd0777.js +731 -0
- package/dist/assets/{login.7b12c6dc.css → login.a9c8b434.css} +11 -0
- package/dist/handler-errors.d.ts +868 -3
- package/dist/handler-errors.d.ts.map +1 -1
- package/dist/handler-errors.js +1067 -26
- package/dist/handler-errors.js.map +1 -1
- package/dist/handlers/access-key-connect-handler.d.ts.map +1 -1
- package/dist/handlers/access-key-connect-handler.js +20 -11
- package/dist/handlers/access-key-connect-handler.js.map +1 -1
- package/dist/handlers/access-key-handler.d.ts.map +1 -1
- package/dist/handlers/access-key-handler.js +18 -7
- package/dist/handlers/access-key-handler.js.map +1 -1
- package/dist/handlers/account-merge-handler.d.ts +2 -0
- package/dist/handlers/account-merge-handler.d.ts.map +1 -1
- package/dist/handlers/account-merge-handler.js +34 -29
- package/dist/handlers/account-merge-handler.js.map +1 -1
- package/dist/handlers/admin-instance-handler.d.ts.map +1 -1
- package/dist/handlers/admin-instance-handler.js +21 -17
- package/dist/handlers/admin-instance-handler.js.map +1 -1
- package/dist/handlers/auth-handler.d.ts.map +1 -1
- package/dist/handlers/auth-handler.js +14 -10
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/blocklet-js-handler.d.ts.map +1 -1
- package/dist/handlers/blocklet-js-handler.js +2 -1
- package/dist/handlers/blocklet-js-handler.js.map +1 -1
- package/dist/handlers/branding-handler.d.ts +1 -0
- package/dist/handlers/branding-handler.d.ts.map +1 -1
- package/dist/handlers/branding-handler.js +15 -8
- package/dist/handlers/branding-handler.js.map +1 -1
- package/dist/handlers/did-connect-handler.d.ts +1 -0
- package/dist/handlers/did-connect-handler.d.ts.map +1 -1
- package/dist/handlers/did-connect-handler.js +40 -18
- package/dist/handlers/did-connect-handler.js.map +1 -1
- package/dist/handlers/email-login-handler.d.ts +81 -0
- package/dist/handlers/email-login-handler.d.ts.map +1 -1
- package/dist/handlers/email-login-handler.js +124 -23
- package/dist/handlers/email-login-handler.js.map +1 -1
- package/dist/handlers/federation-admin-handler.js +2 -2
- package/dist/handlers/federation-admin-handler.js.map +1 -1
- package/dist/handlers/oauth-handler.d.ts +1 -0
- package/dist/handlers/oauth-handler.d.ts.map +1 -1
- package/dist/handlers/oauth-handler.js +42 -53
- package/dist/handlers/oauth-handler.js.map +1 -1
- package/dist/handlers/passkey-handler.d.ts +1 -0
- package/dist/handlers/passkey-handler.d.ts.map +1 -1
- package/dist/handlers/passkey-handler.js +51 -37
- package/dist/handlers/passkey-handler.js.map +1 -1
- package/dist/handlers/team-handler.d.ts +2 -0
- package/dist/handlers/team-handler.d.ts.map +1 -1
- package/dist/handlers/team-handler.js +57 -35
- package/dist/handlers/team-handler.js.map +1 -1
- package/dist/locale.d.ts +40 -4
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +109 -34
- package/dist/locale.js.map +1 -1
- package/dist/pages/admin/i18n.d.ts.map +1 -1
- package/dist/pages/admin/i18n.js +1411 -6
- package/dist/pages/admin/i18n.js.map +1 -1
- package/dist/pages/admin/index.d.ts.map +1 -1
- package/dist/pages/admin/index.js +9 -5
- package/dist/pages/admin/index.js.map +1 -1
- package/dist/pages/admin/styles.d.ts +1 -1
- package/dist/pages/admin/styles.d.ts.map +1 -1
- package/dist/pages/admin/styles.js +22 -2
- package/dist/pages/admin/styles.js.map +1 -1
- package/dist/pages/admin/tab-branding.d.ts.map +1 -1
- package/dist/pages/admin/tab-branding.js +4 -6
- package/dist/pages/admin/tab-branding.js.map +1 -1
- package/dist/pages/admin-instances-page.d.ts +218 -0
- package/dist/pages/admin-instances-page.d.ts.map +1 -1
- package/dist/pages/admin-instances-page.js +133 -24
- package/dist/pages/admin-instances-page.js.map +1 -1
- package/dist/pages/error-page.d.ts +37 -0
- package/dist/pages/error-page.d.ts.map +1 -1
- package/dist/pages/error-page.js +33 -1
- package/dist/pages/error-page.js.map +1 -1
- package/dist/pages/gen-access-key-page.d.ts +126 -0
- package/dist/pages/gen-access-key-page.d.ts.map +1 -1
- package/dist/pages/gen-access-key-page.js +72 -20
- package/dist/pages/gen-access-key-page.js.map +1 -1
- package/dist/pages/homepage.d.ts +98 -0
- package/dist/pages/homepage.d.ts.map +1 -1
- package/dist/pages/homepage.js +66 -15
- package/dist/pages/homepage.js.map +1 -1
- package/dist/pages/invite-page.d.ts +90 -0
- package/dist/pages/invite-page.d.ts.map +1 -1
- package/dist/pages/invite-page.js +66 -17
- package/dist/pages/invite-page.js.map +1 -1
- package/dist/pages/login-page.d.ts +8 -0
- package/dist/pages/login-page.d.ts.map +1 -1
- package/dist/pages/login-page.js +12 -2
- package/dist/pages/login-page.js.map +1 -1
- package/dist/pages/oauth-callback-page.d.ts +52 -1
- package/dist/pages/oauth-callback-page.d.ts.map +1 -1
- package/dist/pages/oauth-callback-page.js +85 -8
- package/dist/pages/oauth-callback-page.js.map +1 -1
- package/package.json +3 -3
- package/dist/assets/login.566f858e.js +0 -720
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// AUTO-GENERATED by build-assets.mjs — do not edit
|
|
2
2
|
export default {
|
|
3
|
-
"login.js": "login.
|
|
3
|
+
"login.js": "login.60fd0777.js",
|
|
4
4
|
"qr.js": "qr.c0d203ca.js",
|
|
5
5
|
"did-address.js": "did-address.7df30f28.js",
|
|
6
|
-
"header.js": "header.
|
|
7
|
-
"login.css": "login.
|
|
6
|
+
"header.js": "header.8703ab26.js",
|
|
7
|
+
"login.css": "login.a9c8b434.css",
|
|
8
8
|
"design.css": "design.99dc4ddc.css",
|
|
9
|
-
"admin.css": "admin.
|
|
9
|
+
"admin.css": "admin.ab0009f2.css",
|
|
10
10
|
"admin-core.js": "admin-core.d42d34ce.js",
|
|
11
|
-
"admin-extra.js": "admin-extra.
|
|
11
|
+
"admin-extra.js": "admin-extra.c7a0720f.js"
|
|
12
12
|
};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
declare const _default: "\"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=`\n:host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n /* Use design tokens from host page (inherited through Shadow DOM), with fallbacks */\n --header-bg: var(--bg-surface, #111827);\n --header-border: var(--border, #374151);\n --header-text: var(--text-white, #f3f4f6);\n --header-text-secondary: var(--text-tertiary, #9ca3af);\n --header-hover: var(--bg-hover, #1f2937);\n --header-primary: var(--blue-muted, #60a5fa);\n --header-height: 56px;\n --badge-bg: var(--blue-light, #1e3a5f);\n --badge-text: var(--blue-muted, #93c5fd);\n --dropdown-shadow: var(--shadow-lg, 0 4px 24px rgba(0,0,0,.4));\n --dropdown-bg: var(--bg-card, #111827);\n --dropdown-border: var(--border, #374151);\n --dropdown-divider: var(--border-subtle, #1f2937);\n --red-danger: var(--red-text, #ef4444);\n --red-danger-bg: var(--red-light, #fef2f2);\n}\n* { box-sizing: border-box; margin: 0; padding: 0; }\n.header {\n display: flex; align-items: center; justify-content: space-between;\n height: var(--header-height); padding: 0 16px;\n background: var(--header-bg); border-bottom: 1px solid var(--header-border);\n color: var(--header-text); position: relative; z-index: 100;\n}\n.header-left { display: flex; align-items: center; gap: 16px; min-width: 0; }\n.header-left a { color: var(--header-text-secondary); text-decoration: none; font-size: 13px; transition: color .15s; white-space: nowrap; }\n.header-left a:hover { color: var(--header-text); text-decoration: none; }\n.logo { height: 28px; width: auto; border-radius: 4px; flex-shrink: 0; }\n.header-right { display: flex; align-items: center; gap: 8px; }\n.avatar {\n width: 32px; height: 32px; border-radius: 50%; background: var(--header-hover);\n display: flex; align-items: center; justify-content: center; overflow: hidden;\n color: var(--header-text-secondary); flex-shrink: 0; cursor: pointer;\n}\n.avatar img { width: 100%; height: 100%; object-fit: cover; }\n.user-trigger {\n position: relative;\n display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 0;\n border: none; background: none; color: var(--header-text);\n font: inherit;\n}\n.user-name { display: none; }\n.user-arrow { font-size: 12px; color: var(--header-text-secondary); line-height: 1; }\n.badge {\n display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px;\n font-size: 11px; font-weight: 500; background: var(--badge-bg); color: var(--badge-text);\n line-height: 1.45; white-space: nowrap;\n}\n.badge-owner { background: var(--blue-light, #1e3a5f); color: var(--blue-muted, #93c5fd); }\n.badge-admin { background: var(--info-light, #1a2e4a); color: var(--info-text, #7dd3fc); }\n.badge-member { background: var(--green-light, #14352a); color: var(--green-text, #4ade80); }\n.badge-guest { background: var(--yellow-light, #3b2e1a); color: var(--yellow-text, #fbbf24); }\n.dropdown {\n position: absolute; top: calc(100% + 8px); right: 0;\n background: var(--dropdown-bg); border: 1px solid var(--dropdown-border);\n border-radius: 12px; width: 240px; max-width: calc(100vw - 32px);\n box-shadow: var(--dropdown-shadow); display: none; z-index: 200;\n overflow: hidden;\n}\n.dropdown.open { display: block; }\n.dropdown-user {\n padding: 12px 16px; border-bottom: 1px solid var(--dropdown-divider);\n display: flex; align-items: center; gap: 8px;\n}\n.dropdown-user-name { font-weight: 600; font-size: 15px; color: var(--header-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dropdown-item {\n display: flex; align-items: center; gap: 12px; padding: 10px 16px;\n cursor: pointer; color: var(--header-text); font-size: 14px; transition: background .15s;\n text-decoration: none;\n}\n.dropdown-item:hover { background: var(--header-hover); }\n.dropdown-item svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--header-text-secondary); }\n.dropdown-item.danger { color: var(--red-danger); }\n.dropdown-item.danger:hover { background: var(--red-danger-bg); }\n.dropdown-item.danger svg { color: var(--red-danger); }\n.dropdown-divider { height: 1px; background: var(--dropdown-divider); margin: 4px 0; }\n.login-btn {\n display: inline-flex; align-items: center; justify-content: center;\n height: 32px; padding: 0 16px; border-radius: 6px;\n border: none; background: var(--header-primary); color: #fff;\n font: inherit; font-weight: 500; cursor: pointer; font-size: 13px;\n transition: opacity .15s;\n}\n.login-btn:hover { opacity: .9; }\n.hidden { display: none !important; }\n.nav { display: flex; align-items: center; gap: 2px; margin-left: 8px; }\n.nav-item {\n padding: 6px 12px; border-radius: 6px; font-size: 13px; font-weight: 500;\n color: var(--header-text-secondary); text-decoration: none; white-space: nowrap;\n transition: color .15s, background .15s; cursor: pointer; border: none; background: none;\n font: inherit;\n}\n.nav-item:hover { color: var(--header-text); background: var(--header-hover); }\n.nav-item.active { color: var(--header-primary); background: transparent; font-weight: 600; }\n`,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?`\n <nav class=\"nav\">\n ${i.map(r=>`<a class=\"nav-item${(r.link===\"/\"?a===\"/\":a.startsWith(r.link))?\" active\":\"\"}\" href=\"${r.link}\">${r.label}</a>`).join(\"\")}\n </nav>\n `:\"\";this.shadow.innerHTML=`\n <style>${C}</style>\n <div class=\"header\">\n <div class=\"header-left\">\n ${t?`<img class=\"logo\" src=\"${t}\" alt=\"\" />`:\"\"}\n <a href=\"/\">${u||this.t(\"home\")}</a>\n ${b}\n </div>\n <div class=\"header-right\">\n ${e?`\n <button class=\"user-trigger\" id=\"trigger\">\n <div class=\"avatar\">\n ${e.avatar?`<img src=\"${e.avatar}\" alt=\"\" />`:m}\n </div>\n <span class=\"user-arrow\">▾</span>\n </button>\n <div class=\"dropdown\" id=\"dropdown\">\n <div class=\"dropdown-user\">\n <div class=\"dropdown-user-name\">${e.fullName||e.displayName||this.abbreviateDid(e.did)}</div>\n <span class=\"badge badge-${e.role||\"member\"}\">${e.role||\"member\"}</span>\n </div>\n <div class=\"dropdown-item\" id=\"user-center-link\">${k} ${this.t(\"userCenter\")}</div>\n ${w?`<div class=\"dropdown-item\" id=\"team-link\">${y} ${this.t(\"adminConsole\")}</div>`:\"\"}\n ${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>`:\"\"}\n <div class=\"dropdown-divider\"></div>\n <div class=\"dropdown-item danger\" id=\"logout-btn\">${x} ${this.t(\"signOut\")}</div>\n </div>\n `:`\n <button class=\"login-btn\" id=\"login-btn\">${this.t(\"signIn\")}</button>\n `}\n </div>\n </div>\n `;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);})();\n";
|
|
1
|
+
declare const _default: "\"use strict\";var __BlockletHeaderBundle=(()=>{var m=typeof HTMLElement<\"u\"?HTMLElement:class{},f='<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 n={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\"},\"zh-TW\":{home:\"\\u9996\\u9801\",userCenter:\"\\u500B\\u4EBA\\u4E2D\\u5FC3\",adminConsole:\"\\u7BA1\\u7406\\u4E3B\\u63A7\\u53F0\",billing:\"\\u5E33\\u55AE\",signOut:\"\\u767B\\u51FA\",signIn:\"\\u767B\\u5165\"},ja:{home:\"\\u30DB\\u30FC\\u30E0\",userCenter:\"\\u30E6\\u30FC\\u30B6\\u30FC\\u30BB\\u30F3\\u30BF\\u30FC\",adminConsole:\"\\u7BA1\\u7406\\u30B3\\u30F3\\u30BD\\u30FC\\u30EB\",billing:\"\\u8ACB\\u6C42\",signOut:\"\\u30ED\\u30B0\\u30A2\\u30A6\\u30C8\",signIn:\"\\u30ED\\u30B0\\u30A4\\u30F3\"}},C=`\n:host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n /* Use design tokens from host page (inherited through Shadow DOM), with fallbacks */\n --header-bg: var(--bg-surface, #111827);\n --header-border: var(--border, #374151);\n --header-text: var(--text-white, #f3f4f6);\n --header-text-secondary: var(--text-tertiary, #9ca3af);\n --header-hover: var(--bg-hover, #1f2937);\n --header-primary: var(--blue-muted, #60a5fa);\n --header-height: 56px;\n --badge-bg: var(--blue-light, #1e3a5f);\n --badge-text: var(--blue-muted, #93c5fd);\n --dropdown-shadow: var(--shadow-lg, 0 4px 24px rgba(0,0,0,.4));\n --dropdown-bg: var(--bg-card, #111827);\n --dropdown-border: var(--border, #374151);\n --dropdown-divider: var(--border-subtle, #1f2937);\n --red-danger: var(--red-text, #ef4444);\n --red-danger-bg: var(--red-light, #fef2f2);\n}\n* { box-sizing: border-box; margin: 0; padding: 0; }\n.header {\n display: flex; align-items: center; justify-content: space-between;\n height: var(--header-height); padding: 0 16px;\n background: var(--header-bg); border-bottom: 1px solid var(--header-border);\n color: var(--header-text); position: relative; z-index: 100;\n}\n.header-left { display: flex; align-items: center; gap: 16px; min-width: 0; }\n.header-left a { color: var(--header-text-secondary); text-decoration: none; font-size: 13px; transition: color .15s; white-space: nowrap; }\n.header-left a:hover { color: var(--header-text); text-decoration: none; }\n.logo { height: 28px; width: auto; border-radius: 4px; flex-shrink: 0; }\n.header-right { display: flex; align-items: center; gap: 8px; }\n.avatar {\n width: 32px; height: 32px; border-radius: 50%; background: var(--header-hover);\n display: flex; align-items: center; justify-content: center; overflow: hidden;\n color: var(--header-text-secondary); flex-shrink: 0; cursor: pointer;\n}\n.avatar img { width: 100%; height: 100%; object-fit: cover; }\n.user-trigger {\n position: relative;\n display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 0;\n border: none; background: none; color: var(--header-text);\n font: inherit;\n}\n.user-name { display: none; }\n.user-arrow { font-size: 12px; color: var(--header-text-secondary); line-height: 1; }\n.badge {\n display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px;\n font-size: 11px; font-weight: 500; background: var(--badge-bg); color: var(--badge-text);\n line-height: 1.45; white-space: nowrap;\n}\n.badge-owner { background: var(--blue-light, #1e3a5f); color: var(--blue-muted, #93c5fd); }\n.badge-admin { background: var(--info-light, #1a2e4a); color: var(--info-text, #7dd3fc); }\n.badge-member { background: var(--green-light, #14352a); color: var(--green-text, #4ade80); }\n.badge-guest { background: var(--yellow-light, #3b2e1a); color: var(--yellow-text, #fbbf24); }\n.dropdown {\n position: absolute; top: calc(100% + 8px); right: 0;\n background: var(--dropdown-bg); border: 1px solid var(--dropdown-border);\n border-radius: 12px; width: 240px; max-width: calc(100vw - 32px);\n box-shadow: var(--dropdown-shadow); display: none; z-index: 200;\n overflow: hidden;\n}\n.dropdown.open { display: block; }\n.dropdown-user {\n padding: 12px 16px; border-bottom: 1px solid var(--dropdown-divider);\n display: flex; align-items: center; gap: 8px;\n}\n.dropdown-user-name { font-weight: 600; font-size: 15px; color: var(--header-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dropdown-item {\n display: flex; align-items: center; gap: 12px; padding: 10px 16px;\n cursor: pointer; color: var(--header-text); font-size: 14px; transition: background .15s;\n text-decoration: none;\n}\n.dropdown-item:hover { background: var(--header-hover); }\n.dropdown-item svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--header-text-secondary); }\n.dropdown-item.danger { color: var(--red-danger); }\n.dropdown-item.danger:hover { background: var(--red-danger-bg); }\n.dropdown-item.danger svg { color: var(--red-danger); }\n.dropdown-divider { height: 1px; background: var(--dropdown-divider); margin: 4px 0; }\n.login-btn {\n display: inline-flex; align-items: center; justify-content: center;\n height: 32px; padding: 0 16px; border-radius: 6px;\n border: none; background: var(--header-primary); color: #fff;\n font: inherit; font-weight: 500; cursor: pointer; font-size: 13px;\n transition: opacity .15s;\n}\n.login-btn:hover { opacity: .9; }\n.hidden { display: none !important; }\n.nav { display: flex; align-items: center; gap: 2px; margin-left: 8px; }\n.nav-item {\n padding: 6px 12px; border-radius: 6px; font-size: 13px; font-weight: 500;\n color: var(--header-text-secondary); text-decoration: none; white-space: nowrap;\n transition: color .15s, background .15s; cursor: pointer; border: none; background: none;\n font: inherit;\n}\n.nav-item:hover { color: var(--header-text); background: var(--header-hover); }\n.nav-item.active { color: var(--header-primary); background: transparent; font-weight: 600; }\n`,i=class extends m{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(){let e=this.getAttribute(\"locale\");return e&&n[e]?e:\"en\"}t(e){return n[this.locale][e]??n.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,a=this.navItems,d=window.location.pathname,w=e?.role===\"admin\"||e?.role===\"owner\",b=a.length>0?`\n <nav class=\"nav\">\n ${a.map(r=>`<a class=\"nav-item${(r.link===\"/\"?d===\"/\":d.startsWith(r.link))?\" active\":\"\"}\" href=\"${r.link}\">${r.label}</a>`).join(\"\")}\n </nav>\n `:\"\";this.shadow.innerHTML=`\n <style>${C}</style>\n <div class=\"header\">\n <div class=\"header-left\">\n ${t?`<img class=\"logo\" src=\"${t}\" alt=\"\" />`:\"\"}\n <a href=\"/\">${u||this.t(\"home\")}</a>\n ${b}\n </div>\n <div class=\"header-right\">\n ${e?`\n <button class=\"user-trigger\" id=\"trigger\">\n <div class=\"avatar\">\n ${e.avatar?`<img src=\"${e.avatar}\" alt=\"\" />`:f}\n </div>\n <span class=\"user-arrow\">▾</span>\n </button>\n <div class=\"dropdown\" id=\"dropdown\">\n <div class=\"dropdown-user\">\n <div class=\"dropdown-user-name\">${e.fullName||e.displayName||this.abbreviateDid(e.did)}</div>\n <span class=\"badge badge-${e.role||\"member\"}\">${e.role||\"member\"}</span>\n </div>\n <div class=\"dropdown-item\" id=\"user-center-link\">${k} ${this.t(\"userCenter\")}</div>\n ${w?`<div class=\"dropdown-item\" id=\"team-link\">${y} ${this.t(\"adminConsole\")}</div>`:\"\"}\n ${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>`:\"\"}\n <div class=\"dropdown-divider\"></div>\n <div class=\"dropdown-item danger\" id=\"logout-btn\">${x} ${this.t(\"signOut\")}</div>\n </div>\n `:`\n <button class=\"login-btn\" id=\"login-btn\">${this.t(\"signIn\")}</button>\n `}\n </div>\n </div>\n `;let s=this.shadow.getElementById(\"trigger\");s&&s.addEventListener(\"click\",r=>this.toggleDropdown(r));let l=this.shadow.getElementById(\"login-btn\");l&&l.addEventListener(\"click\",()=>{window.location.href=this.loginUrl});let h=this.shadow.getElementById(\"logout-btn\");h&&h.addEventListener(\"click\",()=>{window.location.href=\"/.well-known/service/api/did/logout\"});let c=this.shadow.getElementById(\"user-center-link\");c&&c.addEventListener(\"click\",()=>{window.location.href=this.userUrl});let g=this.shadow.getElementById(\"team-link\");g&&g.addEventListener(\"click\",()=>{window.location.href=this.teamUrl});let p=this.shadow.getElementById(\"billing-link\");p&&p.addEventListener(\"click\",()=>{window.location.href=this.billingUrl}),this.shadow.querySelectorAll(\".nav-item\").forEach(r=>{r.addEventListener(\"click\",v=>{v.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\",i);})();\n";
|
|
2
2
|
export default _default;
|
|
3
3
|
//# sourceMappingURL=header-bundle-string.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header-bundle-string.d.ts","sourceRoot":"","sources":["../../src/_generated/header-bundle-string.ts"],"names":[],"mappings":"wBACe,
|
|
1
|
+
{"version":3,"file":"header-bundle-string.d.ts","sourceRoot":"","sources":["../../src/_generated/header-bundle-string.ts"],"names":[],"mappings":"wBACe,yzXAAyzX;AAAx0X,wBAAy0X"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// AUTO-GENERATED by build-header.mjs — do not edit
|
|
2
|
-
export default "\"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=`\n:host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n /* Use design tokens from host page (inherited through Shadow DOM), with fallbacks */\n --header-bg: var(--bg-surface, #111827);\n --header-border: var(--border, #374151);\n --header-text: var(--text-white, #f3f4f6);\n --header-text-secondary: var(--text-tertiary, #9ca3af);\n --header-hover: var(--bg-hover, #1f2937);\n --header-primary: var(--blue-muted, #60a5fa);\n --header-height: 56px;\n --badge-bg: var(--blue-light, #1e3a5f);\n --badge-text: var(--blue-muted, #93c5fd);\n --dropdown-shadow: var(--shadow-lg, 0 4px 24px rgba(0,0,0,.4));\n --dropdown-bg: var(--bg-card, #111827);\n --dropdown-border: var(--border, #374151);\n --dropdown-divider: var(--border-subtle, #1f2937);\n --red-danger: var(--red-text, #ef4444);\n --red-danger-bg: var(--red-light, #fef2f2);\n}\n* { box-sizing: border-box; margin: 0; padding: 0; }\n.header {\n display: flex; align-items: center; justify-content: space-between;\n height: var(--header-height); padding: 0 16px;\n background: var(--header-bg); border-bottom: 1px solid var(--header-border);\n color: var(--header-text); position: relative; z-index: 100;\n}\n.header-left { display: flex; align-items: center; gap: 16px; min-width: 0; }\n.header-left a { color: var(--header-text-secondary); text-decoration: none; font-size: 13px; transition: color .15s; white-space: nowrap; }\n.header-left a:hover { color: var(--header-text); text-decoration: none; }\n.logo { height: 28px; width: auto; border-radius: 4px; flex-shrink: 0; }\n.header-right { display: flex; align-items: center; gap: 8px; }\n.avatar {\n width: 32px; height: 32px; border-radius: 50%; background: var(--header-hover);\n display: flex; align-items: center; justify-content: center; overflow: hidden;\n color: var(--header-text-secondary); flex-shrink: 0; cursor: pointer;\n}\n.avatar img { width: 100%; height: 100%; object-fit: cover; }\n.user-trigger {\n position: relative;\n display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 0;\n border: none; background: none; color: var(--header-text);\n font: inherit;\n}\n.user-name { display: none; }\n.user-arrow { font-size: 12px; color: var(--header-text-secondary); line-height: 1; }\n.badge {\n display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px;\n font-size: 11px; font-weight: 500; background: var(--badge-bg); color: var(--badge-text);\n line-height: 1.45; white-space: nowrap;\n}\n.badge-owner { background: var(--blue-light, #1e3a5f); color: var(--blue-muted, #93c5fd); }\n.badge-admin { background: var(--info-light, #1a2e4a); color: var(--info-text, #7dd3fc); }\n.badge-member { background: var(--green-light, #14352a); color: var(--green-text, #4ade80); }\n.badge-guest { background: var(--yellow-light, #3b2e1a); color: var(--yellow-text, #fbbf24); }\n.dropdown {\n position: absolute; top: calc(100% + 8px); right: 0;\n background: var(--dropdown-bg); border: 1px solid var(--dropdown-border);\n border-radius: 12px; width: 240px; max-width: calc(100vw - 32px);\n box-shadow: var(--dropdown-shadow); display: none; z-index: 200;\n overflow: hidden;\n}\n.dropdown.open { display: block; }\n.dropdown-user {\n padding: 12px 16px; border-bottom: 1px solid var(--dropdown-divider);\n display: flex; align-items: center; gap: 8px;\n}\n.dropdown-user-name { font-weight: 600; font-size: 15px; color: var(--header-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dropdown-item {\n display: flex; align-items: center; gap: 12px; padding: 10px 16px;\n cursor: pointer; color: var(--header-text); font-size: 14px; transition: background .15s;\n text-decoration: none;\n}\n.dropdown-item:hover { background: var(--header-hover); }\n.dropdown-item svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--header-text-secondary); }\n.dropdown-item.danger { color: var(--red-danger); }\n.dropdown-item.danger:hover { background: var(--red-danger-bg); }\n.dropdown-item.danger svg { color: var(--red-danger); }\n.dropdown-divider { height: 1px; background: var(--dropdown-divider); margin: 4px 0; }\n.login-btn {\n display: inline-flex; align-items: center; justify-content: center;\n height: 32px; padding: 0 16px; border-radius: 6px;\n border: none; background: var(--header-primary); color: #fff;\n font: inherit; font-weight: 500; cursor: pointer; font-size: 13px;\n transition: opacity .15s;\n}\n.login-btn:hover { opacity: .9; }\n.hidden { display: none !important; }\n.nav { display: flex; align-items: center; gap: 2px; margin-left: 8px; }\n.nav-item {\n padding: 6px 12px; border-radius: 6px; font-size: 13px; font-weight: 500;\n color: var(--header-text-secondary); text-decoration: none; white-space: nowrap;\n transition: color .15s, background .15s; cursor: pointer; border: none; background: none;\n font: inherit;\n}\n.nav-item:hover { color: var(--header-text); background: var(--header-hover); }\n.nav-item.active { color: var(--header-primary); background: transparent; font-weight: 600; }\n`,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?`\n <nav class=\"nav\">\n ${i.map(r=>`<a class=\"nav-item${(r.link===\"/\"?a===\"/\":a.startsWith(r.link))?\" active\":\"\"}\" href=\"${r.link}\">${r.label}</a>`).join(\"\")}\n </nav>\n `:\"\";this.shadow.innerHTML=`\n <style>${C}</style>\n <div class=\"header\">\n <div class=\"header-left\">\n ${t?`<img class=\"logo\" src=\"${t}\" alt=\"\" />`:\"\"}\n <a href=\"/\">${u||this.t(\"home\")}</a>\n ${b}\n </div>\n <div class=\"header-right\">\n ${e?`\n <button class=\"user-trigger\" id=\"trigger\">\n <div class=\"avatar\">\n ${e.avatar?`<img src=\"${e.avatar}\" alt=\"\" />`:m}\n </div>\n <span class=\"user-arrow\">▾</span>\n </button>\n <div class=\"dropdown\" id=\"dropdown\">\n <div class=\"dropdown-user\">\n <div class=\"dropdown-user-name\">${e.fullName||e.displayName||this.abbreviateDid(e.did)}</div>\n <span class=\"badge badge-${e.role||\"member\"}\">${e.role||\"member\"}</span>\n </div>\n <div class=\"dropdown-item\" id=\"user-center-link\">${k} ${this.t(\"userCenter\")}</div>\n ${w?`<div class=\"dropdown-item\" id=\"team-link\">${y} ${this.t(\"adminConsole\")}</div>`:\"\"}\n ${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>`:\"\"}\n <div class=\"dropdown-divider\"></div>\n <div class=\"dropdown-item danger\" id=\"logout-btn\">${x} ${this.t(\"signOut\")}</div>\n </div>\n `:`\n <button class=\"login-btn\" id=\"login-btn\">${this.t(\"signIn\")}</button>\n `}\n </div>\n </div>\n `;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);})();\n";
|
|
2
|
+
export default "\"use strict\";var __BlockletHeaderBundle=(()=>{var m=typeof HTMLElement<\"u\"?HTMLElement:class{},f='<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 n={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\"},\"zh-TW\":{home:\"\\u9996\\u9801\",userCenter:\"\\u500B\\u4EBA\\u4E2D\\u5FC3\",adminConsole:\"\\u7BA1\\u7406\\u4E3B\\u63A7\\u53F0\",billing:\"\\u5E33\\u55AE\",signOut:\"\\u767B\\u51FA\",signIn:\"\\u767B\\u5165\"},ja:{home:\"\\u30DB\\u30FC\\u30E0\",userCenter:\"\\u30E6\\u30FC\\u30B6\\u30FC\\u30BB\\u30F3\\u30BF\\u30FC\",adminConsole:\"\\u7BA1\\u7406\\u30B3\\u30F3\\u30BD\\u30FC\\u30EB\",billing:\"\\u8ACB\\u6C42\",signOut:\"\\u30ED\\u30B0\\u30A2\\u30A6\\u30C8\",signIn:\"\\u30ED\\u30B0\\u30A4\\u30F3\"}},C=`\n:host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n /* Use design tokens from host page (inherited through Shadow DOM), with fallbacks */\n --header-bg: var(--bg-surface, #111827);\n --header-border: var(--border, #374151);\n --header-text: var(--text-white, #f3f4f6);\n --header-text-secondary: var(--text-tertiary, #9ca3af);\n --header-hover: var(--bg-hover, #1f2937);\n --header-primary: var(--blue-muted, #60a5fa);\n --header-height: 56px;\n --badge-bg: var(--blue-light, #1e3a5f);\n --badge-text: var(--blue-muted, #93c5fd);\n --dropdown-shadow: var(--shadow-lg, 0 4px 24px rgba(0,0,0,.4));\n --dropdown-bg: var(--bg-card, #111827);\n --dropdown-border: var(--border, #374151);\n --dropdown-divider: var(--border-subtle, #1f2937);\n --red-danger: var(--red-text, #ef4444);\n --red-danger-bg: var(--red-light, #fef2f2);\n}\n* { box-sizing: border-box; margin: 0; padding: 0; }\n.header {\n display: flex; align-items: center; justify-content: space-between;\n height: var(--header-height); padding: 0 16px;\n background: var(--header-bg); border-bottom: 1px solid var(--header-border);\n color: var(--header-text); position: relative; z-index: 100;\n}\n.header-left { display: flex; align-items: center; gap: 16px; min-width: 0; }\n.header-left a { color: var(--header-text-secondary); text-decoration: none; font-size: 13px; transition: color .15s; white-space: nowrap; }\n.header-left a:hover { color: var(--header-text); text-decoration: none; }\n.logo { height: 28px; width: auto; border-radius: 4px; flex-shrink: 0; }\n.header-right { display: flex; align-items: center; gap: 8px; }\n.avatar {\n width: 32px; height: 32px; border-radius: 50%; background: var(--header-hover);\n display: flex; align-items: center; justify-content: center; overflow: hidden;\n color: var(--header-text-secondary); flex-shrink: 0; cursor: pointer;\n}\n.avatar img { width: 100%; height: 100%; object-fit: cover; }\n.user-trigger {\n position: relative;\n display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 0;\n border: none; background: none; color: var(--header-text);\n font: inherit;\n}\n.user-name { display: none; }\n.user-arrow { font-size: 12px; color: var(--header-text-secondary); line-height: 1; }\n.badge {\n display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px;\n font-size: 11px; font-weight: 500; background: var(--badge-bg); color: var(--badge-text);\n line-height: 1.45; white-space: nowrap;\n}\n.badge-owner { background: var(--blue-light, #1e3a5f); color: var(--blue-muted, #93c5fd); }\n.badge-admin { background: var(--info-light, #1a2e4a); color: var(--info-text, #7dd3fc); }\n.badge-member { background: var(--green-light, #14352a); color: var(--green-text, #4ade80); }\n.badge-guest { background: var(--yellow-light, #3b2e1a); color: var(--yellow-text, #fbbf24); }\n.dropdown {\n position: absolute; top: calc(100% + 8px); right: 0;\n background: var(--dropdown-bg); border: 1px solid var(--dropdown-border);\n border-radius: 12px; width: 240px; max-width: calc(100vw - 32px);\n box-shadow: var(--dropdown-shadow); display: none; z-index: 200;\n overflow: hidden;\n}\n.dropdown.open { display: block; }\n.dropdown-user {\n padding: 12px 16px; border-bottom: 1px solid var(--dropdown-divider);\n display: flex; align-items: center; gap: 8px;\n}\n.dropdown-user-name { font-weight: 600; font-size: 15px; color: var(--header-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dropdown-item {\n display: flex; align-items: center; gap: 12px; padding: 10px 16px;\n cursor: pointer; color: var(--header-text); font-size: 14px; transition: background .15s;\n text-decoration: none;\n}\n.dropdown-item:hover { background: var(--header-hover); }\n.dropdown-item svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--header-text-secondary); }\n.dropdown-item.danger { color: var(--red-danger); }\n.dropdown-item.danger:hover { background: var(--red-danger-bg); }\n.dropdown-item.danger svg { color: var(--red-danger); }\n.dropdown-divider { height: 1px; background: var(--dropdown-divider); margin: 4px 0; }\n.login-btn {\n display: inline-flex; align-items: center; justify-content: center;\n height: 32px; padding: 0 16px; border-radius: 6px;\n border: none; background: var(--header-primary); color: #fff;\n font: inherit; font-weight: 500; cursor: pointer; font-size: 13px;\n transition: opacity .15s;\n}\n.login-btn:hover { opacity: .9; }\n.hidden { display: none !important; }\n.nav { display: flex; align-items: center; gap: 2px; margin-left: 8px; }\n.nav-item {\n padding: 6px 12px; border-radius: 6px; font-size: 13px; font-weight: 500;\n color: var(--header-text-secondary); text-decoration: none; white-space: nowrap;\n transition: color .15s, background .15s; cursor: pointer; border: none; background: none;\n font: inherit;\n}\n.nav-item:hover { color: var(--header-text); background: var(--header-hover); }\n.nav-item.active { color: var(--header-primary); background: transparent; font-weight: 600; }\n`,i=class extends m{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(){let e=this.getAttribute(\"locale\");return e&&n[e]?e:\"en\"}t(e){return n[this.locale][e]??n.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,a=this.navItems,d=window.location.pathname,w=e?.role===\"admin\"||e?.role===\"owner\",b=a.length>0?`\n <nav class=\"nav\">\n ${a.map(r=>`<a class=\"nav-item${(r.link===\"/\"?d===\"/\":d.startsWith(r.link))?\" active\":\"\"}\" href=\"${r.link}\">${r.label}</a>`).join(\"\")}\n </nav>\n `:\"\";this.shadow.innerHTML=`\n <style>${C}</style>\n <div class=\"header\">\n <div class=\"header-left\">\n ${t?`<img class=\"logo\" src=\"${t}\" alt=\"\" />`:\"\"}\n <a href=\"/\">${u||this.t(\"home\")}</a>\n ${b}\n </div>\n <div class=\"header-right\">\n ${e?`\n <button class=\"user-trigger\" id=\"trigger\">\n <div class=\"avatar\">\n ${e.avatar?`<img src=\"${e.avatar}\" alt=\"\" />`:f}\n </div>\n <span class=\"user-arrow\">▾</span>\n </button>\n <div class=\"dropdown\" id=\"dropdown\">\n <div class=\"dropdown-user\">\n <div class=\"dropdown-user-name\">${e.fullName||e.displayName||this.abbreviateDid(e.did)}</div>\n <span class=\"badge badge-${e.role||\"member\"}\">${e.role||\"member\"}</span>\n </div>\n <div class=\"dropdown-item\" id=\"user-center-link\">${k} ${this.t(\"userCenter\")}</div>\n ${w?`<div class=\"dropdown-item\" id=\"team-link\">${y} ${this.t(\"adminConsole\")}</div>`:\"\"}\n ${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>`:\"\"}\n <div class=\"dropdown-divider\"></div>\n <div class=\"dropdown-item danger\" id=\"logout-btn\">${x} ${this.t(\"signOut\")}</div>\n </div>\n `:`\n <button class=\"login-btn\" id=\"login-btn\">${this.t(\"signIn\")}</button>\n `}\n </div>\n </div>\n `;let s=this.shadow.getElementById(\"trigger\");s&&s.addEventListener(\"click\",r=>this.toggleDropdown(r));let l=this.shadow.getElementById(\"login-btn\");l&&l.addEventListener(\"click\",()=>{window.location.href=this.loginUrl});let h=this.shadow.getElementById(\"logout-btn\");h&&h.addEventListener(\"click\",()=>{window.location.href=\"/.well-known/service/api/did/logout\"});let c=this.shadow.getElementById(\"user-center-link\");c&&c.addEventListener(\"click\",()=>{window.location.href=this.userUrl});let g=this.shadow.getElementById(\"team-link\");g&&g.addEventListener(\"click\",()=>{window.location.href=this.teamUrl});let p=this.shadow.getElementById(\"billing-link\");p&&p.addEventListener(\"click\",()=>{window.location.href=this.billingUrl}),this.shadow.querySelectorAll(\".nav-item\").forEach(r=>{r.addEventListener(\"click\",v=>{v.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\",i);})();\n";
|
|
3
3
|
//# sourceMappingURL=header-bundle-string.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header-bundle-string.js","sourceRoot":"","sources":["../../src/_generated/header-bundle-string.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,eAAe,
|
|
1
|
+
{"version":3,"file":"header-bundle-string.js","sourceRoot":"","sources":["../../src/_generated/header-bundle-string.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,eAAe,yzXAAyzX,CAAC"}
|