nostr-components 0.2.7 → 0.3.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/README.md +105 -185
- package/dist/assets/{base-styles-BSEzBDsk.js → base-styles-DC0ilu4S.js} +3 -3
- package/dist/assets/{base-styles-BSEzBDsk.js.map → base-styles-DC0ilu4S.js.map} +1 -1
- package/dist/assets/{copy-delegation-B7y2q5Kn.js → copy-delegation-CcagQMIW.js} +5 -5
- package/dist/assets/{copy-delegation-B7y2q5Kn.js.map → copy-delegation-CcagQMIW.js.map} +1 -1
- package/dist/assets/{dialog-component-Da1ZIYh9.js → dialog-component-Dqg0QU9I.js} +2 -7
- package/dist/assets/dialog-component-Dqg0QU9I.js.map +1 -0
- package/dist/assets/{dialog-likers-BqDn2P_3.js → dialog-likers-D3c7WIMp.js} +5 -5
- package/dist/assets/dialog-likers-D3c7WIMp.js.map +1 -0
- package/dist/assets/index.esm-ByUtE_cm.js +2159 -0
- package/dist/assets/index.esm-ByUtE_cm.js.map +1 -0
- package/dist/assets/nip05-utils-BNBHUmkr.js.map +1 -1
- package/dist/assets/nostr-login-service-D2FmscPI.js +2 -0
- package/dist/assets/nostr-login-service-D2FmscPI.js.map +1 -0
- package/dist/assets/nostr-service-m3Hgc5Xx.js +266 -0
- package/dist/assets/nostr-service-m3Hgc5Xx.js.map +1 -0
- package/dist/assets/nostr-user-component-XEnanH-d.js +2 -0
- package/dist/assets/nostr-user-component-XEnanH-d.js.map +1 -0
- package/dist/assets/{pure-DPo-pzxM.js → pure-laCRX9eG.js} +2 -2
- package/dist/assets/pure-laCRX9eG.js.map +1 -0
- package/dist/assets/{theme-BN1Bvweb.js → theme-C1r1Zw8r.js} +2 -2
- package/dist/assets/{theme-BN1Bvweb.js.map → theme-C1r1Zw8r.js.map} +1 -1
- package/dist/assets/{user-resolver-CMmbtY9Y.js → user-resolver-DqI5KGh6.js} +2 -2
- package/dist/assets/{user-resolver-CMmbtY9Y.js.map → user-resolver-DqI5KGh6.js.map} +1 -1
- package/dist/assets/utils--bxLbhGF.js.map +1 -1
- package/dist/assets/zap-utils-BZcaCsT_.js +2 -0
- package/dist/assets/zap-utils-BZcaCsT_.js.map +1 -0
- package/dist/components/nostr-comment.es.js +26 -26
- package/dist/components/nostr-comment.es.js.map +1 -1
- package/dist/components/nostr-dm.es.js +2 -2
- package/dist/components/nostr-dm.es.js.map +1 -1
- package/dist/components/nostr-follow-button.es.js +6 -7
- package/dist/components/nostr-follow-button.es.js.map +1 -1
- package/dist/components/nostr-like.es.js +16 -16
- package/dist/components/nostr-like.es.js.map +1 -1
- package/dist/components/nostr-live-chat.es.js +3 -3
- package/dist/components/nostr-live-chat.es.js.map +1 -1
- package/dist/components/nostr-post.es.js +19 -19
- package/dist/components/nostr-post.es.js.map +1 -1
- package/dist/components/nostr-profile-badge.es.js +3 -3
- package/dist/components/nostr-profile-badge.es.js.map +1 -1
- package/dist/components/nostr-profile.es.js +2 -2
- package/dist/components/nostr-profile.es.js.map +1 -1
- package/dist/components/nostr-zap.es.js +24 -24
- package/dist/components/nostr-zap.es.js.map +1 -1
- package/dist/nostr-components.es.js +1 -1
- package/dist/nostr-components.es.js.map +1 -1
- package/dist/nostr-components.umd.js +2644 -305
- package/dist/nostr-components.umd.js.map +1 -1
- package/package.json +5 -2
- package/dist/assets/dark-nostrich-running.gif +0 -0
- package/dist/assets/default_dp-NQ3TGrtT.png +0 -0
- package/dist/assets/default_dp.png +0 -0
- package/dist/assets/default_dp_32.png +0 -0
- package/dist/assets/dialog-component-Da1ZIYh9.js.map +0 -1
- package/dist/assets/dialog-likers-BqDn2P_3.js.map +0 -1
- package/dist/assets/light-nostrich-running.gif +0 -0
- package/dist/assets/nostr-service-CnaPxjc6.js +0 -78
- package/dist/assets/nostr-service-CnaPxjc6.js.map +0 -1
- package/dist/assets/nostr-user-component-Cbs97dlK.js +0 -2
- package/dist/assets/nostr-user-component-Cbs97dlK.js.map +0 -1
- package/dist/assets/pure-DPo-pzxM.js.map +0 -1
- package/dist/assets/zap-utils-KFUD_vTU.js +0 -2
- package/dist/assets/zap-utils-KFUD_vTU.js.map +0 -1
- package/dist/index.d.ts +0 -6
- package/dist/nostr-comment.d.ts +0 -4
- package/dist/nostr-dm.d.ts +0 -4
- package/dist/nostr-follow-button.d.ts +0 -4
- package/dist/nostr-like.d.ts +0 -4
- package/dist/nostr-live-chat.d.ts +0 -4
- package/dist/nostr-post.d.ts +0 -4
- package/dist/nostr-profile-badge.d.ts +0 -4
- package/dist/nostr-profile.d.ts +0 -4
- package/dist/nostr-zap.d.ts +0 -4
- package/dist/src/base/base-component/nostr-base-component.d.ts +0 -116
- package/dist/src/base/copy-delegation.d.ts +0 -5
- package/dist/src/base/dialog-component/dialog-component.d.ts +0 -67
- package/dist/src/base/dialog-component/style.d.ts +0 -5
- package/dist/src/base/event-component/nostr-event-component.d.ts +0 -53
- package/dist/src/base/render-options.d.ts +0 -5
- package/dist/src/base/resolvers/event-resolver.d.ts +0 -20
- package/dist/src/base/resolvers/user-resolver.d.ts +0 -19
- package/dist/src/base/text-row/render-name.d.ts +0 -7
- package/dist/src/base/text-row/render-nip05.d.ts +0 -1
- package/dist/src/base/text-row/render-npub.d.ts +0 -1
- package/dist/src/base/text-row/render-text-row.d.ts +0 -9
- package/dist/src/base/user-component/nostr-user-component.d.ts +0 -43
- package/dist/src/common/base-styles.d.ts +0 -44
- package/dist/src/common/constants.d.ts +0 -4
- package/dist/src/common/date-utils.d.ts +0 -9
- package/dist/src/common/icons.d.ts +0 -7
- package/dist/src/common/nip05-utils.d.ts +0 -13
- package/dist/src/common/nostr-service.d.ts +0 -40
- package/dist/src/common/theme.d.ts +0 -4
- package/dist/src/common/types.d.ts +0 -1
- package/dist/src/common/utils.d.ts +0 -34
- package/dist/src/index.d.ts +0 -32
- package/dist/src/nostr-comment/nostr-comment.d.ts +0 -60
- package/dist/src/nostr-comment/render.d.ts +0 -15
- package/dist/src/nostr-comment/utils.d.ts +0 -81
- package/dist/src/nostr-dm/nostr-dm.d.ts +0 -34
- package/dist/src/nostr-dm/render.d.ts +0 -15
- package/dist/src/nostr-follow-button/nostr-follow-button.d.ts +0 -24
- package/dist/src/nostr-follow-button/render.d.ts +0 -11
- package/dist/src/nostr-follow-button/style.d.ts +0 -1
- package/dist/src/nostr-like/dialog-help-style.d.ts +0 -1
- package/dist/src/nostr-like/dialog-help.d.ts +0 -2
- package/dist/src/nostr-like/dialog-likers-style.d.ts +0 -1
- package/dist/src/nostr-like/dialog-likers.d.ts +0 -24
- package/dist/src/nostr-like/like-utils.d.ts +0 -52
- package/dist/src/nostr-like/nostr-like.d.ts +0 -49
- package/dist/src/nostr-like/render.d.ts +0 -10
- package/dist/src/nostr-like/style.d.ts +0 -1
- package/dist/src/nostr-live-chat/nostr-live-chat.d.ts +0 -65
- package/dist/src/nostr-live-chat/render.d.ts +0 -31
- package/dist/src/nostr-post/nostr-post.d.ts +0 -25
- package/dist/src/nostr-post/parse-text.d.ts +0 -8
- package/dist/src/nostr-post/render-content.d.ts +0 -5
- package/dist/src/nostr-post/render.d.ts +0 -19
- package/dist/src/nostr-post/style.d.ts +0 -1
- package/dist/src/nostr-profile/nostr-profile.d.ts +0 -24
- package/dist/src/nostr-profile/render-stats.d.ts +0 -1
- package/dist/src/nostr-profile/render.d.ts +0 -22
- package/dist/src/nostr-profile/style.d.ts +0 -1
- package/dist/src/nostr-profile-badge/nostr-profile-badge.d.ts +0 -34
- package/dist/src/nostr-profile-badge/render.d.ts +0 -11
- package/dist/src/nostr-profile-badge/style.d.ts +0 -1
- package/dist/src/nostr-zap/dialog-help-style.d.ts +0 -5
- package/dist/src/nostr-zap/dialog-help.d.ts +0 -2
- package/dist/src/nostr-zap/dialog-zap-style.d.ts +0 -6
- package/dist/src/nostr-zap/dialog-zap.d.ts +0 -31
- package/dist/src/nostr-zap/dialog-zappers-style.d.ts +0 -1
- package/dist/src/nostr-zap/dialog-zappers.d.ts +0 -25
- package/dist/src/nostr-zap/nostr-zap.d.ts +0 -45
- package/dist/src/nostr-zap/render.d.ts +0 -9
- package/dist/src/nostr-zap/style.d.ts +0 -1
- package/dist/src/nostr-zap/zap-utils.d.ts +0 -53
- package/dist/vite.config.d.ts +0 -2
- package/dist/vite.config.esm.d.ts +0 -2
- package/dist/vite.config.umd.d.ts +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{m as v,e as s,g as m,
|
|
1
|
+
import{m as v,e as s,g as m,a as d,p as b}from"../assets/base-styles-DC0ilu4S.js";import{N as y}from"../assets/nostr-user-component-XEnanH-d.js";import{h as w}from"../assets/nostr-service-m3Hgc5Xx.js";import{r as x,a as C,b as E,c as N}from"../assets/copy-delegation-CcagQMIW.js";import"../assets/user-resolver-DqI5KGh6.js";function A({isLoading:n,isError:r,errorMessage:o,userProfile:e,ndkUser:t,showNpub:a,showFollow:c}){if(n)return L();if(r||e==null)return S(o||"");const i=e.displayName||e.name||v((t==null?void 0:t.npub)||""),p=s(i),f=s(e.picture||w),g=(t==null?void 0:t.npub)||"",h=(e==null?void 0:e.nip05)||"",u=s((t==null?void 0:t.pubkey)||"");return l(`<img src='${f}' alt='Nostr profile image of ${p}' loading="lazy" decoding="async"/>`,`${x({name:i})}
|
|
2
2
|
${e.nip05?C(h):""}
|
|
3
3
|
${a===!0?E(g||""):""}
|
|
4
4
|
${c===!0&&(t!=null&&t.pubkey)?`<nostr-follow-button pubkey="${u}"></nostr-follow-button>`:""}`)}function L(){return l('<div class="skeleton img-skeleton"></div>',`<div class="skeleton" style="width: 120px;"></div>
|
|
@@ -93,8 +93,8 @@ import{m as v,e as s,g as m,N as d,p as b}from"../assets/base-styles-BSEzBDsk.js
|
|
|
93
93
|
border-radius: var(--nostrc-border-radius-full);
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
`)}const
|
|
96
|
+
`)}const I="nc:profile_badge";class D extends y{static get observedAttributes(){return[...super.observedAttributes,"show-npub","show-follow"]}connectedCallback(){var r;(r=super.connectedCallback)==null||r.call(this),this.attachDelegatedListeners(),N({addDelegatedListener:this.addDelegatedListener.bind(this)}),this.render()}attributeChangedCallback(r,o,e){var t;o!==e&&((t=super.attributeChangedCallback)==null||t.call(this,r,o,e),(r==="show-npub"||r==="show-follow")&&this.render())}onStatusChange(r){this.render()}onUserReady(r,o){this.render()}onProfileClick(){var o,e;const r=((o=this.user)==null?void 0:o.npub)||this.getAttribute("npub")||((e=this.profile)==null?void 0:e.nip05)||this.getAttribute("nip05");r&&this.handleNjumpClick(I,this.profile,encodeURIComponent(r))}attachDelegatedListeners(){this.delegateEvent("click",".nostr-profile-badge-container",r=>{r.target.closest(".nc-copy-btn, .nostr-follow-button-container, nostr-follow-button")||this.onProfileClick()})}renderContent(){const r=this.computeOverall(),o=r===d.Loading,e=r===d.Error,t=b(this.getAttribute("show-follow")),a=b(this.getAttribute("show-npub")),c=e?super.renderError(this.errorMessage):"",i={isLoading:o,isError:e,errorMessage:c,userProfile:this.profile,ndkUser:this.user,showNpub:a,showFollow:t};this.shadowRoot.innerHTML=`
|
|
97
97
|
${$()}
|
|
98
98
|
${A(i)}
|
|
99
|
-
`}}customElements.define("nostr-profile-badge",
|
|
99
|
+
`}}customElements.define("nostr-profile-badge",D);
|
|
100
100
|
//# sourceMappingURL=nostr-profile-badge.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nostr-profile-badge.es.js","sources":["../../src/nostr-profile-badge/render.ts","../../src/nostr-profile-badge/style.ts","../../src/nostr-profile-badge/nostr-profile-badge.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { NDKUser, NDKUserProfile } from '@nostr-dev-kit/ndk';\nimport { escapeHtml, maskNPub } from '../common/utils';\nimport { DEFAULT_PROFILE_IMAGE } from '../common/constants';\nimport { renderNpub } from '../base/text-row/render-npub';\nimport { renderNip05 } from '../base/text-row/render-nip05';\nimport { renderName } from '../base/text-row/render-name';\n\nexport interface RenderProfileBadgeOptions {\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n userProfile: NDKUserProfile | null;\n ndkUser: NDKUser | null;\n showNpub: boolean;\n showFollow: boolean;\n}\n\nexport function renderProfileBadge({\n isLoading,\n isError,\n errorMessage,\n userProfile,\n ndkUser,\n showNpub,\n showFollow\n}: RenderProfileBadgeOptions): string {\n\n if (isLoading) {\n return renderLoading();\n }\n\n if (isError || userProfile == null) {\n return renderError(errorMessage || '');\n }\n\n const rawName = userProfile.displayName ||\n userProfile.name ||\n maskNPub(ndkUser?.npub || '')\n const escapedName = escapeHtml(rawName);\n const profileImage = escapeHtml(userProfile.picture || DEFAULT_PROFILE_IMAGE);\n const npub = ndkUser?.npub || '';\n const nip05 = userProfile?.nip05 || '';\n const pubkey = escapeHtml(ndkUser?.pubkey || '');\n\n return renderContainer(\n `<img src='${profileImage}' alt='Nostr profile image of ${escapedName}' loading=\"lazy\" decoding=\"async\"/>`,\n `${renderName({ name: rawName })}\n ${userProfile.nip05 ? renderNip05(nip05) : ''}\n ${showNpub === true ? renderNpub(npub || '') : ''}\n ${showFollow === true && ndkUser?.pubkey ? `<nostr-follow-button pubkey=\"${pubkey}\"></nostr-follow-button>` : ''}`\n );\n}\n\nfunction renderLoading(): string {\n return renderContainer(\n '<div class=\"skeleton img-skeleton\"></div>',\n `<div class=\"skeleton\" style=\"width: 120px;\"></div>\n <div class=\"skeleton\" style=\"width: 160px;\"></div>`\n );\n}\n\nfunction renderError(errorMessage: string): string {\n return renderContainer(\n '<div class=\"error-icon\">⚠</div>',\n escapeHtml(errorMessage)\n );\n}\n\nfunction renderContainer(leftContent: string, rightContent: string): string {\n return `\n <div class='nostr-profile-badge-container'>\n <div class='nostr-profile-badge-left-container'>\n ${leftContent}\n </div>\n <div class='nostr-profile-badge-right-container'>\n ${rightContent}\n </div>\n </div>\n `;\n}","// SPDX-License-Identifier: MIT\n\nimport { getComponentStyles } from \"../common/base-styles\";\n\nexport function getProfileBadgeStyles(): string {\n const customStyles = `\n /* === PROFILE BADGE SPECIFIC CSS VARIABLES === */\n :host {\n --nostrc-profile-badge-bg: var(--nostrc-theme-bg, #ffffff);\n --nostrc-profile-badge-text-primary: var(--nostrc-theme-text-primary, #333333);\n --nostrc-profile-badge-text-secondary: var(--nostrc-theme-text-secondary, #666666);\n --nostrc-profile-badge-border: var(--nostrc-theme-border, var(--nostrc-color-border));\n --nostrc-profile-badge-font-family: var(--nostrc-font-family-primary);\n --nostrc-profile-badge-font-size: var(--nostrc-font-size-base);\n \n /* Hover state variables */\n --nostrc-profile-badge-hover-bg: var(--nostrc-theme-hover-bg, rgba(0, 0, 0, 0.05));\n --nostrc-profile-badge-hover-color: var(--nostrc-theme-text-primary, #333333);\n --nostrc-profile-badge-hover-border: var(--nostrc-border-width) solid var(--nostrc-theme-border, var(--nostrc-color-border));\n\n /* Make the host the visual profile badge surface */\n display: block;\n background: var(--nostrc-profile-badge-bg);\n border: var(--nostrc-border-width) solid var(--nostrc-profile-badge-border);\n border-radius: var(--nostrc-border-radius-md);\n font-family: var(--nostrc-profile-badge-font-family);\n font-size: var(--nostrc-profile-badge-font-size);\n transition: background-color var(--nostrc-transition-duration) var(--nostrc-transition-timing);\n }\n \n /* === PROFILE BADGE CONTAINER PATTERN === */\n .nostr-profile-badge-container {\n display: flex;\n gap: var(--nostrc-spacing-md);\n padding: var(--nostrc-spacing-md);\n }\n\n /* Hover state */\n :host(.is-clickable:hover) {\n background: var(--nostrc-profile-badge-hover-bg);\n color: var(--nostrc-profile-badge-hover-color);\n border: var(--nostrc-profile-badge-hover-border);\n }\n\n :host(.is-error) .nostr-profile-badge-container {\n justify-content: center;\n align-items: center;\n color: var(--nostrc-color-error-text);\n border: var(--nostrc-border-width) solid var(--nostrc-color-error-text);\n }\n \n .nostr-profile-badge-left-container {\n width: 48px;\n height: 48px;\n }\n \n .nostr-profile-badge-left-container img {\n width: 100%;\n height: 100%;\n border-radius: var(--nostrc-border-radius-full);\n object-fit: cover;\n }\n \n .nostr-profile-badge-right-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n flex-grow: 1;\n min-width: 0;\n }\n \n /* Profile badge specific styling using component variables */\n .nostr-profile-badge-container .nostr-profile-name {\n color: var(--nostrc-profile-badge-text-primary);\n }\n \n .nostr-profile-badge-container .text-row {\n color: var(--nostrc-profile-badge-text-secondary);\n }\n \n /* Skeleton specific styles */\n .img-skeleton {\n width: 48px;\n height: 48px;\n border-radius: var(--nostrc-border-radius-full);\n }\n \n `;\n \n return getComponentStyles(customStyles);\n}\n","// SPDX-License-Identifier: MIT\n\nimport { NCStatus } from '../base/base-component/nostr-base-component';\nimport { NostrUserComponent } from '../base/user-component/nostr-user-component';\nimport { parseBooleanAttribute } from '../common/utils';\nimport { renderProfileBadge, RenderProfileBadgeOptions } from './render';\nimport { getProfileBadgeStyles } from './style';\nimport { attachCopyDelegation } from '../base/copy-delegation';\nimport { NDKUser, NDKUserProfile } from '@nostr-dev-kit/ndk';\n\nconst EVT_BADGE = 'nc:profile_badge';\n\n/**\n * NostrProfileBadge\n * =================\n * UI component (extends `NostrUserComponent`) that renders a compact user badge\n * with avatar/name/nip05 and optional npub + follow button.\n *\n * Observed attributes\n * - `show-npub` — boolean-like attribute to display the masked npub + copy\n * - `show-follow` — boolean-like attribute to display the follow button\n *\n * Events\n * - `nc:status` — (from base) status changes for connection/user\n * - `nc:user` — emitted when user & profile are ready (from parent)\n * - `nc:profile_badge` — fired on badge click (detail: `NDKUserProfile | null`);\n * default action opens `https://njump.me/<nip05|npub>`\n *\n * Note: Follow button placement to be improved in future versions\n */\nexport default class NostrProfileBadge extends NostrUserComponent {\n\n /** Lifecycle methods */\n static get observedAttributes() {\n return [\n ...super.observedAttributes,\n 'show-npub',\n 'show-follow',\n ];\n }\n\n connectedCallback() {\n super.connectedCallback?.();\n \n this.attachDelegatedListeners();\n attachCopyDelegation({\n addDelegatedListener: this.addDelegatedListener.bind(this),\n });\n this.render();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (oldValue === newValue) return;\n super.attributeChangedCallback?.(name, oldValue, newValue);\n\n if (name === 'show-npub' || name === 'show-follow') {\n this.render();\n }\n }\n\n /** Base class functions */\n protected onStatusChange(_status: NCStatus) {\n this.render();\n }\n\n protected onUserReady(_user: NDKUser, _profile: NDKUserProfile | null) {\n this.render();\n }\n\n /** Private functions */\n private onProfileClick() {\n const key =\n this.user?.npub ||\n this.getAttribute('npub') ||\n this.profile?.nip05 ||\n this.getAttribute('nip05');\n\n if (key) {\n this.handleNjumpClick(EVT_BADGE, this.profile, encodeURIComponent(key));\n }\n }\n\n private attachDelegatedListeners() {\n\n // Click anywhere on the profile badge (except follow button, copy buttons)\n this.delegateEvent('click', '.nostr-profile-badge-container', (e: Event) => {\n const target = e.target as HTMLElement;\n if (!target.closest('.nc-copy-btn, .nostr-follow-button-container, nostr-follow-button')) {\n this.onProfileClick();\n }\n });\n\n // Copy is handled via attachCopyDelegation() using `.nc-copy-btn`\n }\n\n protected renderContent() {\n const overall = this.computeOverall();\n const isLoading = overall === NCStatus.Loading;\n const isError = overall === NCStatus.Error;\n\n // Get attribute values\n const showFollow = parseBooleanAttribute(this.getAttribute('show-follow'));\n const showNpub = parseBooleanAttribute(this.getAttribute('show-npub'));\n const errorMessage = isError ? super.renderError(this.errorMessage) : '';\n\n const renderOptions: RenderProfileBadgeOptions = {\n isLoading : isLoading,\n isError : isError,\n errorMessage: errorMessage,\n userProfile : this.profile,\n ndkUser : this.user,\n showNpub : showNpub,\n showFollow : showFollow\n };\n\n this.shadowRoot!.innerHTML = `\n ${getProfileBadgeStyles()}\n ${renderProfileBadge(renderOptions)}\n `;\n }\n}\n\ncustomElements.define('nostr-profile-badge', NostrProfileBadge);\n"],"names":["renderProfileBadge","isLoading","isError","errorMessage","userProfile","ndkUser","showNpub","showFollow","renderLoading","renderError","rawName","maskNPub","escapedName","escapeHtml","profileImage","DEFAULT_PROFILE_IMAGE","npub","nip05","pubkey","renderContainer","renderName","renderNip05","renderNpub","leftContent","rightContent","getProfileBadgeStyles","getComponentStyles","EVT_BADGE","NostrProfileBadge","NostrUserComponent","_a","attachCopyDelegation","name","oldValue","newValue","_status","_user","_profile","key","_b","e","overall","NCStatus","parseBooleanAttribute","renderOptions"],"mappings":"oUAmBO,SAASA,EAAmB,CACjC,UAAAC,EACA,QAAAC,EACA,aAAAC,EACA,YAAAC,EACA,QAAAC,EACA,SAAAC,EACA,WAAAC,CACF,EAAsC,CAEpC,GAAIN,EACF,OAAOO,EAAc,EAGnB,GAAAN,GAAWE,GAAe,KACrB,OAAAK,EAAYN,GAAgB,EAAE,EAGjC,MAAAO,EAAUN,EAAY,aAC1BA,EAAY,MACZO,GAASN,GAAA,YAAAA,EAAS,OAAQ,EAAE,EACxBO,EAAcC,EAAWH,CAAO,EAChCI,EAAeD,EAAWT,EAAY,SAAWW,CAAqB,EACtEC,GAAOX,GAAA,YAAAA,EAAS,OAAQ,GACxBY,GAAQb,GAAA,YAAAA,EAAa,QAAS,GAC9Bc,EAASL,GAAWR,GAAA,YAAAA,EAAS,SAAU,EAAE,EAExC,OAAAc,EACL,aAAaL,CAAY,iCAAiCF,CAAW,sCACrE,GAAGQ,EAAW,CAAE,KAAMV,CAAA,CAAS,CAAC;AAAA,OAC7BN,EAAY,MAAQiB,EAAYJ,CAAK,EAAI,EAAE;AAAA,OAC3CX,IAAa,GAAOgB,EAAWN,GAAQ,EAAE,EAAI,EAAE;AAAA,OAC/CT,IAAe,KAAQF,GAAA,MAAAA,EAAS,QAAS,gCAAgCa,CAAM,2BAA6B,EAAE,EACnH,CACF,CAEA,SAASV,GAAwB,CACxB,OAAAW,EACL,4CACA;AAAA,wDAEF,CACF,CAEA,SAASV,EAAYN,EAA8B,CAC1C,OAAAgB,EACL,wCACAN,EAAWV,CAAY,CACzB,CACF,CAEA,SAASgB,EAAgBI,EAAqBC,EAA8B,CACnE,MAAA;AAAA;AAAA;AAAA,UAGCD,CAAW;AAAA;AAAA;AAAA,UAGXC,CAAY;AAAA;AAAA;AAAA,GAItB,CC7EO,SAASC,GAAgC,CAqF9C,OAAOC,EApFc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoFiB,CACxC,CChFA,MAAMC,EAAY,mBAoBlB,MAAqBC,UAA0BC,CAAmB,CAGhE,WAAW,oBAAqB,CACvB,MAAA,CACL,GAAG,MAAM,mBACT,YACA,aACF,CAAA,CAGF,mBAAoB,QAClBC,EAAA,MAAM,oBAAN,MAAAA,EAAA,WAEA,KAAK,yBAAyB,EACTC,EAAA,CACnB,qBAAsB,KAAK,qBAAqB,KAAK,IAAI,CAAA,CAC1D,EACD,KAAK,OAAO,CAAA,CAGd,yBAAyBC,EAAcC,EAAyBC,EAAyB,OACnFD,IAAaC,KACXJ,EAAA,MAAA,2BAAA,MAAAA,EAAA,UAA2BE,EAAMC,EAAUC,IAE7CF,IAAS,aAAeA,IAAS,gBACnC,KAAK,OAAO,EACd,CAIQ,eAAeG,EAAmB,CAC1C,KAAK,OAAO,CAAA,CAGJ,YAAYC,EAAgBC,EAAiC,CACrE,KAAK,OAAO,CAAA,CAIN,gBAAiB,SACvB,MAAMC,IACJR,EAAA,KAAK,OAAL,YAAAA,EAAW,OACX,KAAK,aAAa,MAAM,KACxBS,EAAA,KAAK,UAAL,YAAAA,EAAc,QACd,KAAK,aAAa,OAAO,EAEvBD,GACF,KAAK,iBAAiBX,EAAW,KAAK,QAAS,mBAAmBW,CAAG,CAAC,CACxE,CAGM,0BAA2B,CAGjC,KAAK,cAAc,QAAS,iCAAmCE,GAAa,CAC3DA,EAAE,OACL,QAAQ,mEAAmE,GACrF,KAAK,eAAe,CACtB,CACD,CAAA,CAKO,eAAgB,CAClB,MAAAC,EAAgB,KAAK,eAAe,EACpCxC,EAAgBwC,IAAYC,EAAS,QACrCxC,EAAgBuC,IAAYC,EAAS,MAGrCnC,EAAgBoC,EAAsB,KAAK,aAAa,aAAa,CAAC,EACtErC,EAAgBqC,EAAsB,KAAK,aAAa,WAAW,CAAC,EACpExC,EAAgBD,EAAU,MAAM,YAAY,KAAK,YAAY,EAAI,GAEjE0C,EAA2C,CAC/C,UAAA3C,EACA,QAAAC,EACA,aAAAC,EACA,YAAc,KAAK,QACnB,QAAc,KAAK,KACnB,SAAAG,EACA,WAAAC,CACF,EAEA,KAAK,WAAY,UAAY;AAAA,QACzBkB,EAAuB,CAAA;AAAA,QACvBzB,EAAmB4C,CAAa,CAAC;AAAA,KAAA,CAGzC,CAEA,eAAe,OAAO,sBAAuBhB,CAAiB"}
|
|
1
|
+
{"version":3,"file":"nostr-profile-badge.es.js","sources":["../../src/nostr-profile-badge/render.ts","../../src/nostr-profile-badge/style.ts","../../src/nostr-profile-badge/nostr-profile-badge.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { NDKUser, NDKUserProfile } from '@nostr-dev-kit/ndk';\nimport { escapeHtml, maskNPub } from '../common/utils';\nimport { DEFAULT_PROFILE_IMAGE } from '../common/constants';\nimport { renderNpub } from '../base/text-row/render-npub';\nimport { renderNip05 } from '../base/text-row/render-nip05';\nimport { renderName } from '../base/text-row/render-name';\n\nexport interface RenderProfileBadgeOptions {\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n userProfile: NDKUserProfile | null;\n ndkUser: NDKUser | null;\n showNpub: boolean;\n showFollow: boolean;\n}\n\nexport function renderProfileBadge({\n isLoading,\n isError,\n errorMessage,\n userProfile,\n ndkUser,\n showNpub,\n showFollow\n}: RenderProfileBadgeOptions): string {\n\n if (isLoading) {\n return renderLoading();\n }\n\n if (isError || userProfile == null) {\n return renderError(errorMessage || '');\n }\n\n const rawName = userProfile.displayName ||\n userProfile.name ||\n maskNPub(ndkUser?.npub || '')\n const escapedName = escapeHtml(rawName);\n const profileImage = escapeHtml(userProfile.picture || DEFAULT_PROFILE_IMAGE);\n const npub = ndkUser?.npub || '';\n const nip05 = userProfile?.nip05 || '';\n const pubkey = escapeHtml(ndkUser?.pubkey || '');\n\n return renderContainer(\n `<img src='${profileImage}' alt='Nostr profile image of ${escapedName}' loading=\"lazy\" decoding=\"async\"/>`,\n `${renderName({ name: rawName })}\n ${userProfile.nip05 ? renderNip05(nip05) : ''}\n ${showNpub === true ? renderNpub(npub || '') : ''}\n ${showFollow === true && ndkUser?.pubkey ? `<nostr-follow-button pubkey=\"${pubkey}\"></nostr-follow-button>` : ''}`\n );\n}\n\nfunction renderLoading(): string {\n return renderContainer(\n '<div class=\"skeleton img-skeleton\"></div>',\n `<div class=\"skeleton\" style=\"width: 120px;\"></div>\n <div class=\"skeleton\" style=\"width: 160px;\"></div>`\n );\n}\n\nfunction renderError(errorMessage: string): string {\n return renderContainer(\n '<div class=\"error-icon\">⚠</div>',\n escapeHtml(errorMessage)\n );\n}\n\nfunction renderContainer(leftContent: string, rightContent: string): string {\n return `\n <div class='nostr-profile-badge-container'>\n <div class='nostr-profile-badge-left-container'>\n ${leftContent}\n </div>\n <div class='nostr-profile-badge-right-container'>\n ${rightContent}\n </div>\n </div>\n `;\n}","// SPDX-License-Identifier: MIT\n\nimport { getComponentStyles } from \"../common/base-styles\";\n\nexport function getProfileBadgeStyles(): string {\n const customStyles = `\n /* === PROFILE BADGE SPECIFIC CSS VARIABLES === */\n :host {\n --nostrc-profile-badge-bg: var(--nostrc-theme-bg, #ffffff);\n --nostrc-profile-badge-text-primary: var(--nostrc-theme-text-primary, #333333);\n --nostrc-profile-badge-text-secondary: var(--nostrc-theme-text-secondary, #666666);\n --nostrc-profile-badge-border: var(--nostrc-theme-border, var(--nostrc-color-border));\n --nostrc-profile-badge-font-family: var(--nostrc-font-family-primary);\n --nostrc-profile-badge-font-size: var(--nostrc-font-size-base);\n \n /* Hover state variables */\n --nostrc-profile-badge-hover-bg: var(--nostrc-theme-hover-bg, rgba(0, 0, 0, 0.05));\n --nostrc-profile-badge-hover-color: var(--nostrc-theme-text-primary, #333333);\n --nostrc-profile-badge-hover-border: var(--nostrc-border-width) solid var(--nostrc-theme-border, var(--nostrc-color-border));\n\n /* Make the host the visual profile badge surface */\n display: block;\n background: var(--nostrc-profile-badge-bg);\n border: var(--nostrc-border-width) solid var(--nostrc-profile-badge-border);\n border-radius: var(--nostrc-border-radius-md);\n font-family: var(--nostrc-profile-badge-font-family);\n font-size: var(--nostrc-profile-badge-font-size);\n transition: background-color var(--nostrc-transition-duration) var(--nostrc-transition-timing);\n }\n \n /* === PROFILE BADGE CONTAINER PATTERN === */\n .nostr-profile-badge-container {\n display: flex;\n gap: var(--nostrc-spacing-md);\n padding: var(--nostrc-spacing-md);\n }\n\n /* Hover state */\n :host(.is-clickable:hover) {\n background: var(--nostrc-profile-badge-hover-bg);\n color: var(--nostrc-profile-badge-hover-color);\n border: var(--nostrc-profile-badge-hover-border);\n }\n\n :host(.is-error) .nostr-profile-badge-container {\n justify-content: center;\n align-items: center;\n color: var(--nostrc-color-error-text);\n border: var(--nostrc-border-width) solid var(--nostrc-color-error-text);\n }\n \n .nostr-profile-badge-left-container {\n width: 48px;\n height: 48px;\n }\n \n .nostr-profile-badge-left-container img {\n width: 100%;\n height: 100%;\n border-radius: var(--nostrc-border-radius-full);\n object-fit: cover;\n }\n \n .nostr-profile-badge-right-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n flex-grow: 1;\n min-width: 0;\n }\n \n /* Profile badge specific styling using component variables */\n .nostr-profile-badge-container .nostr-profile-name {\n color: var(--nostrc-profile-badge-text-primary);\n }\n \n .nostr-profile-badge-container .text-row {\n color: var(--nostrc-profile-badge-text-secondary);\n }\n \n /* Skeleton specific styles */\n .img-skeleton {\n width: 48px;\n height: 48px;\n border-radius: var(--nostrc-border-radius-full);\n }\n \n `;\n \n return getComponentStyles(customStyles);\n}\n","// SPDX-License-Identifier: MIT\n\nimport { NCStatus } from '../base/base-component/nostr-base-component';\nimport { NostrUserComponent } from '../base/user-component/nostr-user-component';\nimport { parseBooleanAttribute } from '../common/utils';\nimport { renderProfileBadge, RenderProfileBadgeOptions } from './render';\nimport { getProfileBadgeStyles } from './style';\nimport { attachCopyDelegation } from '../base/copy-delegation';\nimport { NDKUser, NDKUserProfile } from '@nostr-dev-kit/ndk';\n\nconst EVT_BADGE = 'nc:profile_badge';\n\n/**\n * NostrProfileBadge\n * =================\n * UI component (extends `NostrUserComponent`) that renders a compact user badge\n * with avatar/name/nip05 and optional npub + follow button.\n *\n * Observed attributes\n * - `show-npub` — boolean-like attribute to display the masked npub + copy\n * - `show-follow` — boolean-like attribute to display the follow button\n *\n * Events\n * - `nc:status` — (from base) status changes for connection/user\n * - `nc:user` — emitted when user & profile are ready (from parent)\n * - `nc:profile_badge` — fired on badge click (detail: `NDKUserProfile | null`);\n * default action opens `https://njump.me/<nip05|npub>`\n *\n * Note: Follow button placement to be improved in future versions\n */\nexport default class NostrProfileBadge extends NostrUserComponent {\n\n /** Lifecycle methods */\n static get observedAttributes() {\n return [\n ...super.observedAttributes,\n 'show-npub',\n 'show-follow',\n ];\n }\n\n connectedCallback() {\n super.connectedCallback?.();\n \n this.attachDelegatedListeners();\n attachCopyDelegation({\n addDelegatedListener: this.addDelegatedListener.bind(this),\n });\n this.render();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (oldValue === newValue) return;\n super.attributeChangedCallback?.(name, oldValue, newValue);\n\n if (name === 'show-npub' || name === 'show-follow') {\n this.render();\n }\n }\n\n /** Base class functions */\n protected onStatusChange(_status: NCStatus) {\n this.render();\n }\n\n protected onUserReady(_user: NDKUser, _profile: NDKUserProfile | null) {\n this.render();\n }\n\n /** Private functions */\n private onProfileClick() {\n const key =\n this.user?.npub ||\n this.getAttribute('npub') ||\n this.profile?.nip05 ||\n this.getAttribute('nip05');\n\n if (key) {\n this.handleNjumpClick(EVT_BADGE, this.profile, encodeURIComponent(key));\n }\n }\n\n private attachDelegatedListeners() {\n\n // Click anywhere on the profile badge (except follow button, copy buttons)\n this.delegateEvent('click', '.nostr-profile-badge-container', (e: Event) => {\n const target = e.target as HTMLElement;\n if (!target.closest('.nc-copy-btn, .nostr-follow-button-container, nostr-follow-button')) {\n this.onProfileClick();\n }\n });\n\n // Copy is handled via attachCopyDelegation() using `.nc-copy-btn`\n }\n\n protected renderContent() {\n const overall = this.computeOverall();\n const isLoading = overall === NCStatus.Loading;\n const isError = overall === NCStatus.Error;\n\n // Get attribute values\n const showFollow = parseBooleanAttribute(this.getAttribute('show-follow'));\n const showNpub = parseBooleanAttribute(this.getAttribute('show-npub'));\n const errorMessage = isError ? super.renderError(this.errorMessage) : '';\n\n const renderOptions: RenderProfileBadgeOptions = {\n isLoading : isLoading,\n isError : isError,\n errorMessage: errorMessage,\n userProfile : this.profile,\n ndkUser : this.user,\n showNpub : showNpub,\n showFollow : showFollow\n };\n\n this.shadowRoot!.innerHTML = `\n ${getProfileBadgeStyles()}\n ${renderProfileBadge(renderOptions)}\n `;\n }\n}\n\ncustomElements.define('nostr-profile-badge', NostrProfileBadge);\n"],"names":["renderProfileBadge","isLoading","isError","errorMessage","userProfile","ndkUser","showNpub","showFollow","renderLoading","renderError","rawName","maskNPub","escapedName","escapeHtml","profileImage","DEFAULT_PROFILE_IMAGE","npub","nip05","pubkey","renderContainer","renderName","renderNip05","renderNpub","leftContent","rightContent","getProfileBadgeStyles","getComponentStyles","EVT_BADGE","NostrProfileBadge","NostrUserComponent","_a","attachCopyDelegation","name","oldValue","newValue","_status","_user","_profile","key","_b","e","overall","NCStatus","parseBooleanAttribute","renderOptions"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var S=Object.defineProperty;var L=(e,o,t)=>o in e?S(e,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[o]=t;var n=(e,o,t)=>L(e,typeof o!="symbol"?o+"":o,t);import{e as k,g as $,
|
|
1
|
+
var S=Object.defineProperty;var L=(e,o,t)=>o in e?S(e,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[o]=t;var n=(e,o,t)=>L(e,typeof o!="symbol"?o+"":o,t);import{e as k,g as $,a as p}from"../assets/base-styles-DC0ilu4S.js";import{N as z}from"../assets/nostr-user-component-XEnanH-d.js";import{r as F,a as C,b as E,d as N,c as A}from"../assets/copy-delegation-CcagQMIW.js";import"../assets/nostr-service-m3Hgc5Xx.js";import"../assets/user-resolver-DqI5KGh6.js";function l(e,o,t){const s=k(e);return`
|
|
2
2
|
<div class="stat" data-orientation="horizontal" aria-busy="${t}" aria-live="polite">
|
|
3
3
|
<div class="stat-inner">
|
|
4
4
|
<div class="stat-value">
|
|
@@ -283,5 +283,5 @@ var S=Object.defineProperty;var L=(e,o,t)=>o in e?S(e,o,{enumerable:!0,configura
|
|
|
283
283
|
`)}const j="nc:profile";class O extends z{constructor(){super(...arguments);n(this,"profileStatus",this.channel("profile"));n(this,"isStatsLoading",!0);n(this,"isStatsFollowsLoading",!0);n(this,"isStatsFollowersLoading",!0);n(this,"isZapsLoading",!0);n(this,"stats",{follows:0,followers:0,notes:0,replies:0,zaps:0,relays:0});n(this,"getUserStats",async()=>{try{this.isStatsLoading=!0,this.isStatsFollowsLoading=!0,this.isStatsFollowersLoading=!0,this.isZapsLoading=!0,this.nostrService.fetchFollows(this.user).then(t=>{this.stats={...this.stats,follows:t},this.isStatsFollowsLoading=!1,this.render()}).catch(t=>{console.error("Error loading follows:",t),this.isStatsFollowsLoading=!1,this.render()}),this.nostrService.fetchFollowers(this.user).then(t=>{this.stats={...this.stats,followers:t},this.isStatsFollowersLoading=!1,this.render()}).catch(t=>{console.error("Error loading followers:",t),this.isStatsFollowersLoading=!1,this.render()}),this.nostrService.fetchNotesAndReplies(this.user).then(([t,s])=>{this.stats={...this.stats,notes:t,replies:s},this.isStatsLoading=!1,this.render()}).catch(t=>{console.error("Error loading notes and replies",t),this.isStatsLoading=!1,this.render()}),this.nostrService.fetchZaps(this.user).then(t=>{this.stats={...this.stats,zaps:t},this.isZapsLoading=!1,this.render()}).catch(t=>{console.error("Error loading Zaps:",t),this.isZapsLoading=!1,this.render()})}catch(t){this.profileStatus.set(p.Error),console.error("getUserStats failed:",t)}finally{this.render()}})}static get observedAttributes(){return[...super.observedAttributes,"show-npub","show-follow"]}async connectedCallback(){var t;(t=super.connectedCallback)==null||t.call(this),this.attachDelegatedListeners(),A({addDelegatedListener:this.addDelegatedListener.bind(this)}),this.render()}onStatusChange(t){this.render()}onUserReady(t,s){this.getUserStats(),this.render()}attributeChangedCallback(t,s,i){var r;s!==i&&((r=super.attributeChangedCallback)==null||r.call(this,t,s,i),(t==="show-npub"||t==="show-follow")&&this.render())}onProfileClick(){var s,i;if(this.profileStatus.get()===p.Error)return;const t=((s=this.user)==null?void 0:s.npub)||this.getAttribute("npub")||((i=this.profile)==null?void 0:i.nip05)||this.getAttribute("nip05");t&&this.handleNjumpClick(j,this.profile,encodeURIComponent(t))}attachDelegatedListeners(){this.delegateEvent("click",".profile-banner",t=>{t.target.closest(".nc-copy-btn, .nostr-follow-button-container, nostr-follow-button")||this.onProfileClick()})}renderContent(){var c;const t=this.computeOverall()===p.Loading,s=this.computeOverall()===p.Error,i=this.getAttribute("show-npub")==="true",r=this.getAttribute("show-follow")==="true",d={isLoading:t,isError:s,errorMessage:this.errorMessage,npub:((c=this.user)==null?void 0:c.npub)||"",userProfile:this.profile,isStatsLoading:this.isStatsLoading,isStatsFollowersLoading:this.isStatsFollowersLoading,isStatsFollowsLoading:this.isStatsFollowsLoading,isZapsLoading:this.isZapsLoading,stats:{notes:this.stats.notes,replies:this.stats.replies,follows:this.stats.follows,followers:this.stats.followers,zaps:this.stats.zaps,relays:this.stats.relays},showFollow:r,showNpub:i};this.shadowRoot.innerHTML=`
|
|
284
284
|
${_()}
|
|
285
285
|
${R(d)}
|
|
286
|
-
`}}customElements.define("nostr-profile",O);
|
|
286
|
+
`}}customElements.define("nostr-profile",O);
|
|
287
287
|
//# sourceMappingURL=nostr-profile.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nostr-profile.es.js","sources":["../../src/nostr-profile/render-stats.ts","../../src/nostr-profile/render.ts","../../src/nostr-profile/style.ts","../../src/nostr-profile/nostr-profile.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { escapeHtml } from \"../common/utils\";\n\nexport function renderStats(\n label: string,\n value: number,\n isLoading: boolean\n): string {\n const safeLabel = escapeHtml(label)\n return `\n <div class=\"stat\" data-orientation=\"horizontal\" aria-busy=\"${isLoading}\" aria-live=\"polite\">\n <div class=\"stat-inner\">\n <div class=\"stat-value\">\n ${\n isLoading\n ? '<div style=\"width: 50px; height: 28px; border-radius: 5px\" class=\"skeleton\"></div>'\n : value.toLocaleString()\n }\n </div>\n <div class=\"stat-name\">${safeLabel}</div>\n </div>\n </div>\n `;\n}\n","// SPDX-License-Identifier: MIT\n\nimport { NDKUserProfile } from '@nostr-dev-kit/ndk';\nimport { IRenderOptions } from '../base/render-options';\nimport { renderNpub } from '../base/text-row/render-npub';\nimport { renderNip05 } from '../base/text-row/render-nip05';\nimport { renderStats } from './render-stats';\nimport { renderName } from '../base/text-row/render-name';\nimport { renderTextRow } from '../base/text-row/render-text-row';\n\nexport interface Stats {\n notes: number;\n replies: number;\n follows: number;\n followers: number;\n zaps: number;\n relays: number;\n}\n\nexport interface RenderProfileOptions extends IRenderOptions {\n npub: string;\n userProfile: NDKUserProfile;\n isStatsLoading: boolean;\n isStatsFollowersLoading: boolean;\n isStatsFollowsLoading: boolean;\n isZapsLoading: boolean;\n stats: Stats;\n showFollow: boolean;\n showNpub: boolean;\n}\n\nexport function renderProfile(options: RenderProfileOptions): string {\n const {\n isLoading,\n isError,\n errorMessage,\n npub,\n userProfile,\n isStatsLoading,\n isStatsFollowersLoading,\n isStatsFollowsLoading,\n isZapsLoading,\n stats,\n showFollow,\n showNpub,\n } = options;\n\n if (isError) {\n return renderError(errorMessage || '');\n }\n\n // Extract profile data with null checks and default values\n const displayName = userProfile?.displayName || userProfile?.name || '';\n const nip05 = userProfile?.nip05 || '';\n const image = userProfile?.picture || '';\n const about = userProfile?.about || '';\n const website = userProfile?.website || '';\n\n const renderFollowButton = () => {\n if (!showFollow || npub === '') return '';\n return `\n <nostr-follow-button\n npub=\"${npub}\">\n </nostr-follow-button>\n `;\n };\n\n return `\n <div class=\"nostr-profile-container\">\n <div class=\"profile-banner\">\n ${isLoading\n ? '<div style=\"width: 100%; height: 100%;\" class=\"skeleton\"></div>'\n : userProfile?.banner\n ? `<img src=\"${userProfile.banner}\" width=\"524px\"/>`\n : '<div class=\"banner-placeholder\"></div>'\n }\n\n <div class=\"dp-container\">\n <div class=\"avatar\" role=\"img\" aria-label=\"${displayName}\">\n ${isLoading\n ? '<div style=\"width: 100%; height: 100%; border-radius: 50%\" class=\"skeleton\"></div>'\n : `<img\n src=\"${image}\"\n alt=\"${displayName}\"\n width=\"142\" height=\"142\"\n loading=\"lazy\" decoding=\"async\"\n onerror=\"this.onerror=null; this.src='data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 142 142%22%3E%3Crect width=%22142%22 height=%22142%22 fill=%22%23ccc%22/%3E%3C/svg%3E'\"\n />`\n }\n </div>\n </div>\n </div>\n\n <div class=\"profile_actions\">\n ${showFollow ?\n isLoading? '<div style=\"width: 100px; height: 36px; border-radius: 18px;\" class=\"skeleton\"></div>'\n : renderFollowButton()\n : ''\n }\n </div>\n \n <div class=\"profile_data\">\n ${isLoading\n ? '<div style=\"width: 100px; height: 24px;\" class=\"skeleton\"></div>'\n : renderName({ name: displayName })\n }\n \n ${isLoading\n ? '<div style=\"width: 75px; height: 20px;\" class=\"skeleton\"></div>'\n : renderNip05(nip05)\n }\n\n ${showNpub ?\n isLoading\n ? '<div style=\"width: 75px; height: 20px;\" class=\"skeleton\"></div>'\n : renderNpub(npub)\n : ''\n }\n\n <div class=\"margin-bottom-md\"> </div>\n \n ${isLoading\n ? `<div style=\"width: 100%; margin-bottom: 12px; height: 18px\" class=\"skeleton\"></div>`\n : renderTextRow({ display: about, value: about })\n }\n\n <div class=\"margin-bottom-md\"> </div>\n \n ${isLoading\n ? '<div style=\"width: 150px\" class=\"skeleton\"></div>'\n : website\n ? `<div class=\"website\">\n <a target=\"_blank\" href=\"${website}\">${website}</a>\n </div>`\n : ''\n }\n \n <div class=\"stats\">\n\n ${renderStats('Following', stats.follows, isStatsFollowsLoading)}\n \n ${renderStats('Followers', stats.followers, isStatsFollowersLoading)}\n\n ${renderStats('Notes', stats.notes, isStatsLoading)}\n \n ${renderStats('Replies', stats.replies, isStatsLoading)}\n \n ${renderStats('Zaps', stats.zaps, isZapsLoading)}\n \n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderError(errorMessage: string): string {\n return `\n <div class='nostr-profile-container'>\n <div class='nostr-profile-top-container'>\n <div class=\"error-icon\">⚠</div>\n </div>\n <div class='nostr-profile-bottom-container'>\n ${errorMessage}\n </div>\n </div>\n `;\n}","// SPDX-License-Identifier: MIT\n\nimport { getComponentStyles } from \"../common/base-styles\";\n\nexport function getProfileStyles(): string {\n const customStyles = `\n /* === PROFILE CSS VARIABLES & CONTAINER PATTERN === */\n :host {\n /* Override follow button styles for profile context */\n --nostrc-follow-btn-padding: 5px 8px !important;\n --nostrc-follow-btn-font-size: 14px !important;\n --nostrc-follow-btn-border-radius: 12px !important;\n --nostrc-follow-btn-border: var(--nostrc-border-width) solid var(--nostrc-color-border) !important;\n --nostrc-follow-btn-horizontal-alignment: end !important;\n --nostrc-follow-btn-min-height: auto !important;\n --nostrc-follow-btn-width: 280px;\n\n /* Component theme variables (fallback to global theme tokens) */\n --nostrc-profile-bg: var(--nostrc-theme-bg, #ffffff);\n --nostrc-profile-text-primary: var(--nostrc-theme-text-primary, #333333);\n --nostrc-profile-text-secondary: var(--nostrc-theme-text-secondary, #666666);\n --nostrc-profile-border: var(--nostrc-theme-border, var(--nostrc-border-width) solid var(--nostrc-color-border));\n --nostrc-profile-banner-placeholder: var(--nostrc-profile-border);\n --nostrc-profile-font-family: var(--nostrc-font-family-primary);\n --nostrc-profile-font-size: var(--nostrc-font-size-base);\n \n /* Hover state variables */\n --nostrc-profile-hover-bg: var(--nostrc-theme-hover-bg, rgba(0, 0, 0, 0.05));\n --nostrc-profile-hover-color: var(--nostrc-theme-text-primary, #333333);\n --nostrc-profile-hover-border: var(--nostrc-theme-hover-border, var(--nostrc-border-width) solid var(--nostrc-color-border));\n\n /* Make the host the visual profile surface */\n display: block;\n background: var(--nostrc-profile-bg);\n color: var(--nostrc-profile-text-primary);\n border: var(--nostrc-profile-border);\n border-radius: var(--nostrc-border-radius-md);\n font-family: var(--nostrc-profile-font-family);\n font-size: var(--nostrc-profile-font-size);\n transition: background-color var(--nostrc-transition-duration) var(--nostrc-transition-timing);\n }\n\n .nostr-profile-container {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--nostrc-spacing-md);\n min-height: 500px;\n padding: 0px;\n }\n\n :host(.is-error) .nostr-profile-container {\n justify-content: center;\n align-items: center;\n color: var(--nostrc-color-error-text);\n border: var(--nostrc-border-width) solid var(--nostrc-color-error-text);\n }\n\n /* Hover state */\n :host(.is-clickable:hover) {\n background: var(--nostrc-profile-hover-bg);\n color: var(--nostrc-profile-hover-color);\n border: var(--nostrc-profile-hover-border);\n }\n\n .nostr-profile-top-container img {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n object-fit: cover;\n }\n\n .nostr-profile-bottom-container {\n min-width: 0;\n text-align: center;\n }\n\n .profile-banner {\n position: relative;\n width: 100%;\n height: 214px;\n cursor: pointer;\n border-radius: var(--nostrc-border-radius-md) var(--nostrc-border-radius-md) 0px 0px;\n }\n\n .banner-placeholder {\n width: 100%;\n height: 100%;\n background-color: var(--nostrc-profile-banner-placeholder);\n border-radius: var(--nostrc-border-radius-md) var(--nostrc-border-radius-md) 0px 0px;\n }\n\n .profile-banner img {\n width: 100%;\n height: 214px;\n object-fit: cover;\n }\n\n .dp-container {\n position: absolute;\n top: 140px;\n left: var(--nostrc-spacing-md);\n }\n\n .avatar {\n --avatar-size: 142px;\n --avatar-ring: 4px;\n\n inline-size: var(--avatar-size);\n block-size: var(--avatar-size);\n border-radius: var(--nostrc-border-radius-full);\n overflow: hidden;\n\n /* ring + backfill in one place */\n background-color: var(--nostrc-profile-bg);\n border: var(--avatar-ring) solid var(--nostrc-profile-bg);\n }\n\n .avatar img {\n inline-size: 100%;\n block-size: 100%;\n border-radius: var(--nostrc-border-radius-full);\n display: block;\n object-fit: cover;\n }\n\n .profile_actions {\n height: 56px;\n align-self: flex-end;\n padding: 0 var(--nostrc-spacing-lg);\n }\n\n .profile_data {\n padding: var(--nostrc-spacing-md);\n }\n\n .website {\n font-weight: 400;\n font-size: var(--nostrc-font-size-base);\n line-height: 20px;\n display: flex;\n align-items: center;\n }\n\n .website a {\n line-height: 20px;\n outline: none;\n color: var(--nostrc-profile-accent);\n max-width: 350px;\n overflow: hidden;\n text-overflow: ellipsis;\n word-wrap: normal;\n }\n\n .stats {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n border-radius: 0;\n border-top: none;\n margin-top: var(--nostrc-spacing-md);\n }\n\n .stat {\n position: relative;\n display: inline-block;\n padding-inline: var(--nostrc-spacing-md);\n padding-block: var(--nostrc-spacing-xs);\n border: none;\n background: none;\n width: fit-content;\n height: 40px;\n margin: 0 0 var(--nostrc-spacing-md);\n }\n\n .stat-inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n\n .stat-inner .stat-value {\n font-weight: 100;\n font-size: 1.5em;\n color: var(--nostrc-profile-text-primary);\n }\n\n .stat-inner .stat-name {\n font-weight: 400;\n line-height: 16px;\n text-transform: lowercase;\n color: var(--nostrc-profile-text-secondary);\n }\n\n @media only screen and (max-width: 600px) {\n .stat .stat-value {\n font-size: 18px !important;\n }\n :host {\n --nostrc-follow-btn-padding: 5px 8px !important;\n --nostrc-follow-btn-font-size: 12px !important;\n --nostrc-follow-btn-min-height: auto !important;\n --nostrc-follow-btn-border-radius: 8px !important;\n --nostrc-follow-btn-error-max-width: 150px !important;\n }\n }\n\n `;\n \n // Use component styles - includes design tokens + utilities + custom styles\n return getComponentStyles(customStyles);\n}\n","// SPDX-License-Identifier: MIT\n\nimport { NCStatus } from '../base/base-component/nostr-base-component';\nimport { NostrUserComponent } from '../base/user-component/nostr-user-component';\nimport { renderProfile, RenderProfileOptions } from './render';\nimport { getProfileStyles } from './style';\nimport { attachCopyDelegation } from '../base/copy-delegation';\n\nconst EVT_PROFILE = 'nc:profile';\n\nexport default class NostrProfile extends NostrUserComponent {\n\n protected profileStatus = this.channel('profile');\n\n // Stats loading states\n private isStatsLoading: boolean = true;\n private isStatsFollowsLoading: boolean = true;\n private isStatsFollowersLoading: boolean = true;\n private isZapsLoading: boolean = true;\n\n private stats = {\n follows: 0,\n followers: 0,\n notes: 0,\n replies: 0,\n zaps: 0,\n relays: 0,\n };\n\n static get observedAttributes() {\n return [\n ...super.observedAttributes,\n 'show-npub',\n 'show-follow',\n ];\n }\n\n async connectedCallback() {\n super.connectedCallback?.();\n this.attachDelegatedListeners();\n attachCopyDelegation({\n addDelegatedListener: this.addDelegatedListener.bind(this),\n });\n this.render();\n }\n\n /** Base class functions */\n protected onStatusChange(_status: NCStatus) {\n this.render();\n }\n\n protected onUserReady(_user: any, _profile: any) {\n this.getUserStats();\n this.render();\n }\n\n getUserStats = async () => {\n try {\n this.isStatsLoading = true;\n this.isStatsFollowsLoading = true;\n this.isStatsFollowersLoading = true;\n this.isZapsLoading = true;\n\n // Fetch follows\n this.nostrService\n .fetchFollows(this.user!)\n .then((follows) => {\n this.stats = { ...this.stats, follows };\n this.isStatsFollowsLoading = false;\n this.render();\n })\n .catch(err => {\n console.error('Error loading follows:', err);\n this.isStatsFollowsLoading = false;\n this.render();\n });\n\n // Fetch followers\n this.nostrService\n .fetchFollowers(this.user!)\n .then((followers) => {\n this.stats = { ...this.stats, followers };\n this.isStatsFollowersLoading = false;\n this.render();\n })\n .catch(err => {\n console.error('Error loading followers:', err);\n this.isStatsFollowersLoading = false;\n this.render();\n });\n\n // Fetch notes and replies\n this.nostrService\n .fetchNotesAndReplies(this.user!)\n .then(([ notes, replies ]) => {\n this.stats = { ...this.stats, notes, replies };\n this.isStatsLoading = false;\n this.render();\n })\n .catch(err => {\n console.error('Error loading notes and replies', err);\n this.isStatsLoading = false;\n this.render();\n });\n\n // Fetch zaps\n this.nostrService\n .fetchZaps(this.user!)\n .then((zaps) => {\n this.stats = { ...this.stats, zaps };\n this.isZapsLoading = false;\n this.render();\n })\n .catch(err => {\n console.error('Error loading Zaps:', err);\n this.isZapsLoading = false;\n this.render();\n });\n\n\n } catch (err) {\n this.profileStatus.set(NCStatus.Error);\n console.error('getUserStats failed:', err);\n } finally {\n this.render();\n }\n };\n\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ) {\n if (oldValue === newValue) return;\n super.attributeChangedCallback?.(name, oldValue, newValue);\n\n if (name === 'show-npub' || name === 'show-follow') {\n this.render();\n }\n }\n\n /** Private functions */\n private onProfileClick() {\n if (this.profileStatus.get() === NCStatus.Error) return;\n\n const key =\n this.user?.npub ||\n this.getAttribute('npub') ||\n this.profile?.nip05 ||\n this.getAttribute('nip05');\n\n if (key) {\n this.handleNjumpClick(EVT_PROFILE, this.profile, encodeURIComponent(key));\n }\n }\n\n private attachDelegatedListeners() {\n\n // Click anywhere on the profile badge (except follow button, copy buttons)\n this.delegateEvent('click', '.profile-banner', (e: Event) => {\n const target = e.target as HTMLElement;\n if (!target.closest('.nc-copy-btn, .nostr-follow-button-container, nostr-follow-button')) {\n this.onProfileClick();\n }\n });\n\n }\n\n protected renderContent() {\n const isLoading = this.computeOverall() === NCStatus.Loading;\n const isError = this.computeOverall() === NCStatus.Error;\n const showNpub = this.getAttribute('show-npub') === 'true';\n const showFollow = this.getAttribute('show-follow') === 'true';\n\n const renderOptions: RenderProfileOptions = {\n isLoading: isLoading,\n isError: isError,\n errorMessage: this.errorMessage,\n npub: this.user?.npub || '',\n userProfile: this.profile!,\n isStatsLoading: this.isStatsLoading,\n isStatsFollowersLoading: this.isStatsFollowersLoading,\n isStatsFollowsLoading: this.isStatsFollowsLoading,\n isZapsLoading: this.isZapsLoading,\n stats: {\n notes: this.stats.notes,\n replies: this.stats.replies,\n follows: this.stats.follows,\n followers: this.stats.followers,\n zaps: this.stats.zaps,\n relays: this.stats.relays,\n },\n showFollow: showFollow,\n showNpub: showNpub,\n };\n\n this.shadowRoot!.innerHTML = `\n ${getProfileStyles()}\n ${renderProfile(renderOptions)}\n `;\n\n }\n}\n\ncustomElements.define('nostr-profile', NostrProfile);\n"],"names":["renderStats","label","value","isLoading","safeLabel","escapeHtml","renderProfile","options","isError","errorMessage","npub","userProfile","isStatsLoading","isStatsFollowersLoading","isStatsFollowsLoading","isZapsLoading","stats","showFollow","showNpub","renderError","displayName","nip05","image","about","website","renderFollowButton","renderName","renderNip05","renderNpub","renderTextRow","getProfileStyles","getComponentStyles","EVT_PROFILE","NostrProfile","NostrUserComponent","__publicField","follows","err","followers","notes","replies","zaps","NCStatus","_a","attachCopyDelegation","_status","_user","_profile","name","oldValue","newValue","key","_b","e","renderOptions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nostr-profile.es.js","sources":["../../src/nostr-profile/render-stats.ts","../../src/nostr-profile/render.ts","../../src/nostr-profile/style.ts","../../src/nostr-profile/nostr-profile.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { escapeHtml } from \"../common/utils\";\n\nexport function renderStats(\n label: string,\n value: number,\n isLoading: boolean\n): string {\n const safeLabel = escapeHtml(label)\n return `\n <div class=\"stat\" data-orientation=\"horizontal\" aria-busy=\"${isLoading}\" aria-live=\"polite\">\n <div class=\"stat-inner\">\n <div class=\"stat-value\">\n ${\n isLoading\n ? '<div style=\"width: 50px; height: 28px; border-radius: 5px\" class=\"skeleton\"></div>'\n : value.toLocaleString()\n }\n </div>\n <div class=\"stat-name\">${safeLabel}</div>\n </div>\n </div>\n `;\n}\n","// SPDX-License-Identifier: MIT\n\nimport { NDKUserProfile } from '@nostr-dev-kit/ndk';\nimport { IRenderOptions } from '../base/render-options';\nimport { renderNpub } from '../base/text-row/render-npub';\nimport { renderNip05 } from '../base/text-row/render-nip05';\nimport { renderStats } from './render-stats';\nimport { renderName } from '../base/text-row/render-name';\nimport { renderTextRow } from '../base/text-row/render-text-row';\n\nexport interface Stats {\n notes: number;\n replies: number;\n follows: number;\n followers: number;\n zaps: number;\n relays: number;\n}\n\nexport interface RenderProfileOptions extends IRenderOptions {\n npub: string;\n userProfile: NDKUserProfile;\n isStatsLoading: boolean;\n isStatsFollowersLoading: boolean;\n isStatsFollowsLoading: boolean;\n isZapsLoading: boolean;\n stats: Stats;\n showFollow: boolean;\n showNpub: boolean;\n}\n\nexport function renderProfile(options: RenderProfileOptions): string {\n const {\n isLoading,\n isError,\n errorMessage,\n npub,\n userProfile,\n isStatsLoading,\n isStatsFollowersLoading,\n isStatsFollowsLoading,\n isZapsLoading,\n stats,\n showFollow,\n showNpub,\n } = options;\n\n if (isError) {\n return renderError(errorMessage || '');\n }\n\n // Extract profile data with null checks and default values\n const displayName = userProfile?.displayName || userProfile?.name || '';\n const nip05 = userProfile?.nip05 || '';\n const image = userProfile?.picture || '';\n const about = userProfile?.about || '';\n const website = userProfile?.website || '';\n\n const renderFollowButton = () => {\n if (!showFollow || npub === '') return '';\n return `\n <nostr-follow-button\n npub=\"${npub}\">\n </nostr-follow-button>\n `;\n };\n\n return `\n <div class=\"nostr-profile-container\">\n <div class=\"profile-banner\">\n ${isLoading\n ? '<div style=\"width: 100%; height: 100%;\" class=\"skeleton\"></div>'\n : userProfile?.banner\n ? `<img src=\"${userProfile.banner}\" width=\"524px\"/>`\n : '<div class=\"banner-placeholder\"></div>'\n }\n\n <div class=\"dp-container\">\n <div class=\"avatar\" role=\"img\" aria-label=\"${displayName}\">\n ${isLoading\n ? '<div style=\"width: 100%; height: 100%; border-radius: 50%\" class=\"skeleton\"></div>'\n : `<img\n src=\"${image}\"\n alt=\"${displayName}\"\n width=\"142\" height=\"142\"\n loading=\"lazy\" decoding=\"async\"\n onerror=\"this.onerror=null; this.src='data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 142 142%22%3E%3Crect width=%22142%22 height=%22142%22 fill=%22%23ccc%22/%3E%3C/svg%3E'\"\n />`\n }\n </div>\n </div>\n </div>\n\n <div class=\"profile_actions\">\n ${showFollow ?\n isLoading? '<div style=\"width: 100px; height: 36px; border-radius: 18px;\" class=\"skeleton\"></div>'\n : renderFollowButton()\n : ''\n }\n </div>\n \n <div class=\"profile_data\">\n ${isLoading\n ? '<div style=\"width: 100px; height: 24px;\" class=\"skeleton\"></div>'\n : renderName({ name: displayName })\n }\n \n ${isLoading\n ? '<div style=\"width: 75px; height: 20px;\" class=\"skeleton\"></div>'\n : renderNip05(nip05)\n }\n\n ${showNpub ?\n isLoading\n ? '<div style=\"width: 75px; height: 20px;\" class=\"skeleton\"></div>'\n : renderNpub(npub)\n : ''\n }\n\n <div class=\"margin-bottom-md\"> </div>\n \n ${isLoading\n ? `<div style=\"width: 100%; margin-bottom: 12px; height: 18px\" class=\"skeleton\"></div>`\n : renderTextRow({ display: about, value: about })\n }\n\n <div class=\"margin-bottom-md\"> </div>\n \n ${isLoading\n ? '<div style=\"width: 150px\" class=\"skeleton\"></div>'\n : website\n ? `<div class=\"website\">\n <a target=\"_blank\" href=\"${website}\">${website}</a>\n </div>`\n : ''\n }\n \n <div class=\"stats\">\n\n ${renderStats('Following', stats.follows, isStatsFollowsLoading)}\n \n ${renderStats('Followers', stats.followers, isStatsFollowersLoading)}\n\n ${renderStats('Notes', stats.notes, isStatsLoading)}\n \n ${renderStats('Replies', stats.replies, isStatsLoading)}\n \n ${renderStats('Zaps', stats.zaps, isZapsLoading)}\n \n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderError(errorMessage: string): string {\n return `\n <div class='nostr-profile-container'>\n <div class='nostr-profile-top-container'>\n <div class=\"error-icon\">⚠</div>\n </div>\n <div class='nostr-profile-bottom-container'>\n ${errorMessage}\n </div>\n </div>\n `;\n}","// SPDX-License-Identifier: MIT\n\nimport { getComponentStyles } from \"../common/base-styles\";\n\nexport function getProfileStyles(): string {\n const customStyles = `\n /* === PROFILE CSS VARIABLES & CONTAINER PATTERN === */\n :host {\n /* Override follow button styles for profile context */\n --nostrc-follow-btn-padding: 5px 8px !important;\n --nostrc-follow-btn-font-size: 14px !important;\n --nostrc-follow-btn-border-radius: 12px !important;\n --nostrc-follow-btn-border: var(--nostrc-border-width) solid var(--nostrc-color-border) !important;\n --nostrc-follow-btn-horizontal-alignment: end !important;\n --nostrc-follow-btn-min-height: auto !important;\n --nostrc-follow-btn-width: 280px;\n\n /* Component theme variables (fallback to global theme tokens) */\n --nostrc-profile-bg: var(--nostrc-theme-bg, #ffffff);\n --nostrc-profile-text-primary: var(--nostrc-theme-text-primary, #333333);\n --nostrc-profile-text-secondary: var(--nostrc-theme-text-secondary, #666666);\n --nostrc-profile-border: var(--nostrc-theme-border, var(--nostrc-border-width) solid var(--nostrc-color-border));\n --nostrc-profile-banner-placeholder: var(--nostrc-profile-border);\n --nostrc-profile-font-family: var(--nostrc-font-family-primary);\n --nostrc-profile-font-size: var(--nostrc-font-size-base);\n \n /* Hover state variables */\n --nostrc-profile-hover-bg: var(--nostrc-theme-hover-bg, rgba(0, 0, 0, 0.05));\n --nostrc-profile-hover-color: var(--nostrc-theme-text-primary, #333333);\n --nostrc-profile-hover-border: var(--nostrc-theme-hover-border, var(--nostrc-border-width) solid var(--nostrc-color-border));\n\n /* Make the host the visual profile surface */\n display: block;\n background: var(--nostrc-profile-bg);\n color: var(--nostrc-profile-text-primary);\n border: var(--nostrc-profile-border);\n border-radius: var(--nostrc-border-radius-md);\n font-family: var(--nostrc-profile-font-family);\n font-size: var(--nostrc-profile-font-size);\n transition: background-color var(--nostrc-transition-duration) var(--nostrc-transition-timing);\n }\n\n .nostr-profile-container {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--nostrc-spacing-md);\n min-height: 500px;\n padding: 0px;\n }\n\n :host(.is-error) .nostr-profile-container {\n justify-content: center;\n align-items: center;\n color: var(--nostrc-color-error-text);\n border: var(--nostrc-border-width) solid var(--nostrc-color-error-text);\n }\n\n /* Hover state */\n :host(.is-clickable:hover) {\n background: var(--nostrc-profile-hover-bg);\n color: var(--nostrc-profile-hover-color);\n border: var(--nostrc-profile-hover-border);\n }\n\n .nostr-profile-top-container img {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n object-fit: cover;\n }\n\n .nostr-profile-bottom-container {\n min-width: 0;\n text-align: center;\n }\n\n .profile-banner {\n position: relative;\n width: 100%;\n height: 214px;\n cursor: pointer;\n border-radius: var(--nostrc-border-radius-md) var(--nostrc-border-radius-md) 0px 0px;\n }\n\n .banner-placeholder {\n width: 100%;\n height: 100%;\n background-color: var(--nostrc-profile-banner-placeholder);\n border-radius: var(--nostrc-border-radius-md) var(--nostrc-border-radius-md) 0px 0px;\n }\n\n .profile-banner img {\n width: 100%;\n height: 214px;\n object-fit: cover;\n }\n\n .dp-container {\n position: absolute;\n top: 140px;\n left: var(--nostrc-spacing-md);\n }\n\n .avatar {\n --avatar-size: 142px;\n --avatar-ring: 4px;\n\n inline-size: var(--avatar-size);\n block-size: var(--avatar-size);\n border-radius: var(--nostrc-border-radius-full);\n overflow: hidden;\n\n /* ring + backfill in one place */\n background-color: var(--nostrc-profile-bg);\n border: var(--avatar-ring) solid var(--nostrc-profile-bg);\n }\n\n .avatar img {\n inline-size: 100%;\n block-size: 100%;\n border-radius: var(--nostrc-border-radius-full);\n display: block;\n object-fit: cover;\n }\n\n .profile_actions {\n height: 56px;\n align-self: flex-end;\n padding: 0 var(--nostrc-spacing-lg);\n }\n\n .profile_data {\n padding: var(--nostrc-spacing-md);\n }\n\n .website {\n font-weight: 400;\n font-size: var(--nostrc-font-size-base);\n line-height: 20px;\n display: flex;\n align-items: center;\n }\n\n .website a {\n line-height: 20px;\n outline: none;\n color: var(--nostrc-profile-accent);\n max-width: 350px;\n overflow: hidden;\n text-overflow: ellipsis;\n word-wrap: normal;\n }\n\n .stats {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n border-radius: 0;\n border-top: none;\n margin-top: var(--nostrc-spacing-md);\n }\n\n .stat {\n position: relative;\n display: inline-block;\n padding-inline: var(--nostrc-spacing-md);\n padding-block: var(--nostrc-spacing-xs);\n border: none;\n background: none;\n width: fit-content;\n height: 40px;\n margin: 0 0 var(--nostrc-spacing-md);\n }\n\n .stat-inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n }\n\n .stat-inner .stat-value {\n font-weight: 100;\n font-size: 1.5em;\n color: var(--nostrc-profile-text-primary);\n }\n\n .stat-inner .stat-name {\n font-weight: 400;\n line-height: 16px;\n text-transform: lowercase;\n color: var(--nostrc-profile-text-secondary);\n }\n\n @media only screen and (max-width: 600px) {\n .stat .stat-value {\n font-size: 18px !important;\n }\n :host {\n --nostrc-follow-btn-padding: 5px 8px !important;\n --nostrc-follow-btn-font-size: 12px !important;\n --nostrc-follow-btn-min-height: auto !important;\n --nostrc-follow-btn-border-radius: 8px !important;\n --nostrc-follow-btn-error-max-width: 150px !important;\n }\n }\n\n `;\n \n // Use component styles - includes design tokens + utilities + custom styles\n return getComponentStyles(customStyles);\n}\n","// SPDX-License-Identifier: MIT\n\nimport { NCStatus } from '../base/base-component/nostr-base-component';\nimport { NostrUserComponent } from '../base/user-component/nostr-user-component';\nimport { renderProfile, RenderProfileOptions } from './render';\nimport { getProfileStyles } from './style';\nimport { attachCopyDelegation } from '../base/copy-delegation';\n\nconst EVT_PROFILE = 'nc:profile';\n\nexport default class NostrProfile extends NostrUserComponent {\n\n protected profileStatus = this.channel('profile');\n\n // Stats loading states\n private isStatsLoading: boolean = true;\n private isStatsFollowsLoading: boolean = true;\n private isStatsFollowersLoading: boolean = true;\n private isZapsLoading: boolean = true;\n\n private stats = {\n follows: 0,\n followers: 0,\n notes: 0,\n replies: 0,\n zaps: 0,\n relays: 0,\n };\n\n static get observedAttributes() {\n return [\n ...super.observedAttributes,\n 'show-npub',\n 'show-follow',\n ];\n }\n\n async connectedCallback() {\n super.connectedCallback?.();\n this.attachDelegatedListeners();\n attachCopyDelegation({\n addDelegatedListener: this.addDelegatedListener.bind(this),\n });\n this.render();\n }\n\n /** Base class functions */\n protected onStatusChange(_status: NCStatus) {\n this.render();\n }\n\n protected onUserReady(_user: any, _profile: any) {\n this.getUserStats();\n this.render();\n }\n\n getUserStats = async () => {\n try {\n this.isStatsLoading = true;\n this.isStatsFollowsLoading = true;\n this.isStatsFollowersLoading = true;\n this.isZapsLoading = true;\n\n // Fetch follows\n this.nostrService\n .fetchFollows(this.user!)\n .then((follows) => {\n this.stats = { ...this.stats, follows };\n this.isStatsFollowsLoading = false;\n this.render();\n })\n .catch(err => {\n console.error('Error loading follows:', err);\n this.isStatsFollowsLoading = false;\n this.render();\n });\n\n // Fetch followers\n this.nostrService\n .fetchFollowers(this.user!)\n .then((followers) => {\n this.stats = { ...this.stats, followers };\n this.isStatsFollowersLoading = false;\n this.render();\n })\n .catch(err => {\n console.error('Error loading followers:', err);\n this.isStatsFollowersLoading = false;\n this.render();\n });\n\n // Fetch notes and replies\n this.nostrService\n .fetchNotesAndReplies(this.user!)\n .then(([ notes, replies ]) => {\n this.stats = { ...this.stats, notes, replies };\n this.isStatsLoading = false;\n this.render();\n })\n .catch(err => {\n console.error('Error loading notes and replies', err);\n this.isStatsLoading = false;\n this.render();\n });\n\n // Fetch zaps\n this.nostrService\n .fetchZaps(this.user!)\n .then((zaps) => {\n this.stats = { ...this.stats, zaps };\n this.isZapsLoading = false;\n this.render();\n })\n .catch(err => {\n console.error('Error loading Zaps:', err);\n this.isZapsLoading = false;\n this.render();\n });\n\n\n } catch (err) {\n this.profileStatus.set(NCStatus.Error);\n console.error('getUserStats failed:', err);\n } finally {\n this.render();\n }\n };\n\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null\n ) {\n if (oldValue === newValue) return;\n super.attributeChangedCallback?.(name, oldValue, newValue);\n\n if (name === 'show-npub' || name === 'show-follow') {\n this.render();\n }\n }\n\n /** Private functions */\n private onProfileClick() {\n if (this.profileStatus.get() === NCStatus.Error) return;\n\n const key =\n this.user?.npub ||\n this.getAttribute('npub') ||\n this.profile?.nip05 ||\n this.getAttribute('nip05');\n\n if (key) {\n this.handleNjumpClick(EVT_PROFILE, this.profile, encodeURIComponent(key));\n }\n }\n\n private attachDelegatedListeners() {\n\n // Click anywhere on the profile badge (except follow button, copy buttons)\n this.delegateEvent('click', '.profile-banner', (e: Event) => {\n const target = e.target as HTMLElement;\n if (!target.closest('.nc-copy-btn, .nostr-follow-button-container, nostr-follow-button')) {\n this.onProfileClick();\n }\n });\n\n }\n\n protected renderContent() {\n const isLoading = this.computeOverall() === NCStatus.Loading;\n const isError = this.computeOverall() === NCStatus.Error;\n const showNpub = this.getAttribute('show-npub') === 'true';\n const showFollow = this.getAttribute('show-follow') === 'true';\n\n const renderOptions: RenderProfileOptions = {\n isLoading: isLoading,\n isError: isError,\n errorMessage: this.errorMessage,\n npub: this.user?.npub || '',\n userProfile: this.profile!,\n isStatsLoading: this.isStatsLoading,\n isStatsFollowersLoading: this.isStatsFollowersLoading,\n isStatsFollowsLoading: this.isStatsFollowsLoading,\n isZapsLoading: this.isZapsLoading,\n stats: {\n notes: this.stats.notes,\n replies: this.stats.replies,\n follows: this.stats.follows,\n followers: this.stats.followers,\n zaps: this.stats.zaps,\n relays: this.stats.relays,\n },\n showFollow: showFollow,\n showNpub: showNpub,\n };\n\n this.shadowRoot!.innerHTML = `\n ${getProfileStyles()}\n ${renderProfile(renderOptions)}\n `;\n\n }\n}\n\ncustomElements.define('nostr-profile', NostrProfile);\n"],"names":["renderStats","label","value","isLoading","safeLabel","escapeHtml","renderProfile","options","isError","errorMessage","npub","userProfile","isStatsLoading","isStatsFollowersLoading","isStatsFollowsLoading","isZapsLoading","stats","showFollow","showNpub","renderError","displayName","nip05","image","about","website","renderFollowButton","renderName","renderNip05","renderNpub","renderTextRow","getProfileStyles","getComponentStyles","EVT_PROFILE","NostrProfile","NostrUserComponent","__publicField","follows","err","followers","notes","replies","zaps","NCStatus","_a","attachCopyDelegation","_status","_user","_profile","name","oldValue","newValue","key","_b","e","renderOptions"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/zap-utils-
|
|
2
|
-
var
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/zap-utils-BZcaCsT_.js","assets/nostr-service-m3Hgc5Xx.js","assets/nostr-login-service-D2FmscPI.js","assets/preload-helper-D7HrI6pR.js","assets/utils--bxLbhGF.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
var Jt=Object.defineProperty;var $t=(e,t,n)=>t in e?Jt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Z=(e,t,n)=>$t(e,typeof t!="symbol"?t+"":t,n);import{N as Gt}from"../assets/nostr-user-component-XEnanH-d.js";import{n as Qt,g as St,h as G,e as X,f as kt,c as At,a as N}from"../assets/base-styles-DC0ilu4S.js";import"../assets/dialog-component-Dqg0QU9I.js";import{getProfileMetadata as Wt,getZapEndpoint as Xt,fetchInvoice as te,listenForZapReceipt as ee,getBatchedProfileMetadata as ne,extractProfileMetadataContent as Nt,fetchTotalZapAmount as oe}from"../assets/zap-utils-BZcaCsT_.js";import{_ as re}from"../assets/preload-helper-D7HrI6pR.js";import{i as ae}from"../assets/utils--bxLbhGF.js";import{e as ie}from"../assets/nostr-login-service-D2FmscPI.js";import"../assets/user-resolver-DqI5KGh6.js";import"../assets/nostr-service-m3Hgc5Xx.js";const se=(e="light")=>{const t=e==="dark";return`
|
|
3
3
|
/* === ZAP DIALOG CONTENT STYLES === */
|
|
4
4
|
.zap-dialog-content {
|
|
5
5
|
text-align: center;
|
|
@@ -154,19 +154,19 @@ var Yt=Object.defineProperty;var Jt=(e,t,n)=>t in e?Yt(e,t,{enumerable:!0,config
|
|
|
154
154
|
transform: rotate(360deg);
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
|
-
`};var
|
|
158
|
-
]))+`;L.KANJI=new RegExp(
|
|
159
|
-
Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),e.put(n,13)}};var
|
|
160
|
-
Suggested mode is: `+t.toString(h));switch(f===t.KANJI&&!i.isKanjiModeEnabled()&&(f=t.BYTE),f){case t.NUMERIC:return new n(g);case t.ALPHANUMERIC:return new o(g);case t.KANJI:return new a(g);case t.BYTE:return new r(g)}}e.fromArray=function(v){return v.reduce(function(f,h){return typeof h=="string"?f.push(A(h,null)):h.data&&f.push(A(h.data,h.mode)),f},[])},e.fromString=function(v,f){const h=y(v,i.isKanjiModeEnabled()),E=m(h),z=C(E,f),b=c.find_path(z.map,"start","end"),S=[];for(let T=1;T<b.length-1;T++)S.push(z.table[b[T]].node);return e.fromArray(d(S))},e.rawSplit=function(v){return e.fromArray(y(v,i.isKanjiModeEnabled()))}})(
|
|
157
|
+
`};var ce=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then},xt={},P={};let pt;const le=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];P.getSymbolSize=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return t*4+17};P.getSymbolTotalCodewords=function(t){return le[t]};P.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t};P.setToSJISFunction=function(t){if(typeof t!="function")throw new Error('"toSJISFunc" is not a valid function.');pt=t};P.isKanjiModeEnabled=function(){return typeof pt<"u"};P.toSJIS=function(t){return pt(t)};var tt={};(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(n){if(typeof n!="string")throw new Error("Param is not a string");switch(n.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+n)}}e.isValid=function(o){return o&&typeof o.bit<"u"&&o.bit>=0&&o.bit<4},e.from=function(o,r){if(e.isValid(o))return o;try{return t(o)}catch{return r}}})(tt);function Tt(){this.buffer=[],this.length=0}Tt.prototype={get:function(e){const t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)===1},put:function(e,t){for(let n=0;n<t;n++)this.putBit((e>>>t-n-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(e){const t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}};var ue=Tt;function K(e){if(!e||e<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}K.prototype.set=function(e,t,n,o){const r=e*this.size+t;this.data[r]=n,o&&(this.reservedBit[r]=!0)};K.prototype.get=function(e,t){return this.data[e*this.size+t]};K.prototype.xor=function(e,t,n){this.data[e*this.size+t]^=n};K.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]};var de=K,Bt={};(function(e){const t=P.getSymbolSize;e.getRowColCoords=function(o){if(o===1)return[];const r=Math.floor(o/7)+2,a=t(o),s=a===145?26:Math.ceil((a-13)/(2*r-2))*2,i=[a-7];for(let c=1;c<r-1;c++)i[c]=i[c-1]-s;return i.push(6),i.reverse()},e.getPositions=function(o){const r=[],a=e.getRowColCoords(o),s=a.length;for(let i=0;i<s;i++)for(let c=0;c<s;c++)i===0&&c===0||i===0&&c===s-1||i===s-1&&c===0||r.push([a[i],a[c]]);return r}})(Bt);var It={};const fe=P.getSymbolSize,Ct=7;It.getPositions=function(t){const n=fe(t);return[[0,0],[n-Ct,0],[0,n-Ct]]};var Pt={};(function(e){e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};const t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(r){return r!=null&&r!==""&&!isNaN(r)&&r>=0&&r<=7},e.from=function(r){return e.isValid(r)?parseInt(r,10):void 0},e.getPenaltyN1=function(r){const a=r.size;let s=0,i=0,c=0,l=null,u=null;for(let y=0;y<a;y++){i=c=0,l=u=null;for(let p=0;p<a;p++){let d=r.get(y,p);d===l?i++:(i>=5&&(s+=t.N1+(i-5)),l=d,i=1),d=r.get(p,y),d===u?c++:(c>=5&&(s+=t.N1+(c-5)),u=d,c=1)}i>=5&&(s+=t.N1+(i-5)),c>=5&&(s+=t.N1+(c-5))}return s},e.getPenaltyN2=function(r){const a=r.size;let s=0;for(let i=0;i<a-1;i++)for(let c=0;c<a-1;c++){const l=r.get(i,c)+r.get(i,c+1)+r.get(i+1,c)+r.get(i+1,c+1);(l===4||l===0)&&s++}return s*t.N2},e.getPenaltyN3=function(r){const a=r.size;let s=0,i=0,c=0;for(let l=0;l<a;l++){i=c=0;for(let u=0;u<a;u++)i=i<<1&2047|r.get(l,u),u>=10&&(i===1488||i===93)&&s++,c=c<<1&2047|r.get(u,l),u>=10&&(c===1488||c===93)&&s++}return s*t.N3},e.getPenaltyN4=function(r){let a=0;const s=r.data.length;for(let c=0;c<s;c++)a+=r.data[c];return Math.abs(Math.ceil(a*100/s/5)-10)*t.N4};function n(o,r,a){switch(o){case e.Patterns.PATTERN000:return(r+a)%2===0;case e.Patterns.PATTERN001:return r%2===0;case e.Patterns.PATTERN010:return a%3===0;case e.Patterns.PATTERN011:return(r+a)%3===0;case e.Patterns.PATTERN100:return(Math.floor(r/2)+Math.floor(a/3))%2===0;case e.Patterns.PATTERN101:return r*a%2+r*a%3===0;case e.Patterns.PATTERN110:return(r*a%2+r*a%3)%2===0;case e.Patterns.PATTERN111:return(r*a%3+(r+a)%2)%2===0;default:throw new Error("bad maskPattern:"+o)}}e.applyMask=function(r,a){const s=a.size;for(let i=0;i<s;i++)for(let c=0;c<s;c++)a.isReserved(c,i)||a.xor(c,i,n(r,c,i))},e.getBestMask=function(r,a){const s=Object.keys(e.Patterns).length;let i=0,c=1/0;for(let l=0;l<s;l++){a(l),e.applyMask(l,r);const u=e.getPenaltyN1(r)+e.getPenaltyN2(r)+e.getPenaltyN3(r)+e.getPenaltyN4(r);e.applyMask(l,r),u<c&&(c=u,i=l)}return i}})(Pt);var et={};const U=tt,J=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],$=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];et.getBlocksCount=function(t,n){switch(n){case U.L:return J[(t-1)*4+0];case U.M:return J[(t-1)*4+1];case U.Q:return J[(t-1)*4+2];case U.H:return J[(t-1)*4+3];default:return}};et.getTotalCodewordsCount=function(t,n){switch(n){case U.L:return $[(t-1)*4+0];case U.M:return $[(t-1)*4+1];case U.Q:return $[(t-1)*4+2];case U.H:return $[(t-1)*4+3];default:return}};var Lt={},nt={};const V=new Uint8Array(512),Q=new Uint8Array(256);(function(){let t=1;for(let n=0;n<255;n++)V[n]=t,Q[t]=n,t<<=1,t&256&&(t^=285);for(let n=255;n<512;n++)V[n]=V[n-255]})();nt.log=function(t){if(t<1)throw new Error("log("+t+")");return Q[t]};nt.exp=function(t){return V[t]};nt.mul=function(t,n){return t===0||n===0?0:V[Q[t]+Q[n]]};(function(e){const t=nt;e.mul=function(o,r){const a=new Uint8Array(o.length+r.length-1);for(let s=0;s<o.length;s++)for(let i=0;i<r.length;i++)a[s+i]^=t.mul(o[s],r[i]);return a},e.mod=function(o,r){let a=new Uint8Array(o);for(;a.length-r.length>=0;){const s=a[0];for(let c=0;c<r.length;c++)a[c]^=t.mul(r[c],s);let i=0;for(;i<a.length&&a[i]===0;)i++;a=a.slice(i)}return a},e.generateECPolynomial=function(o){let r=new Uint8Array([1]);for(let a=0;a<o;a++)r=e.mul(r,new Uint8Array([1,t.exp(a)]));return r}})(Lt);const Mt=Lt;function gt(e){this.genPoly=void 0,this.degree=e,this.degree&&this.initialize(this.degree)}gt.prototype.initialize=function(t){this.degree=t,this.genPoly=Mt.generateECPolynomial(this.degree)};gt.prototype.encode=function(t){if(!this.genPoly)throw new Error("Encoder not initialized");const n=new Uint8Array(t.length+this.degree);n.set(t);const o=Mt.mod(n,this.genPoly),r=this.degree-o.length;if(r>0){const a=new Uint8Array(this.degree);return a.set(o,r),a}return o};var pe=gt,Rt={},_={},ht={};ht.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40};var L={};const Dt="[0-9]+",ge="[A-Z $%*+\\-./:]+";let j="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";j=j.replace(/u/g,"\\u");const he="(?:(?![A-Z0-9 $%*+\\-./:]|"+j+`)(?:.|[\r
|
|
158
|
+
]))+`;L.KANJI=new RegExp(j,"g");L.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g");L.BYTE=new RegExp(he,"g");L.NUMERIC=new RegExp(Dt,"g");L.ALPHANUMERIC=new RegExp(ge,"g");const me=new RegExp("^"+j+"$"),be=new RegExp("^"+Dt+"$"),ye=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");L.testKanji=function(t){return me.test(t)};L.testNumeric=function(t){return be.test(t)};L.testAlphanumeric=function(t){return ye.test(t)};(function(e){const t=ht,n=L;e.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(a,s){if(!a.ccBits)throw new Error("Invalid mode: "+a);if(!t.isValid(s))throw new Error("Invalid version: "+s);return s>=1&&s<10?a.ccBits[0]:s<27?a.ccBits[1]:a.ccBits[2]},e.getBestModeForData=function(a){return n.testNumeric(a)?e.NUMERIC:n.testAlphanumeric(a)?e.ALPHANUMERIC:n.testKanji(a)?e.KANJI:e.BYTE},e.toString=function(a){if(a&&a.id)return a.id;throw new Error("Invalid mode")},e.isValid=function(a){return a&&a.bit&&a.ccBits};function o(r){if(typeof r!="string")throw new Error("Param is not a string");switch(r.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+r)}}e.from=function(a,s){if(e.isValid(a))return a;try{return o(a)}catch{return s}}})(_);(function(e){const t=P,n=et,o=tt,r=_,a=ht,s=7973,i=t.getBCHDigit(s);function c(p,d,m){for(let C=1;C<=40;C++)if(d<=e.getCapacity(C,m,p))return C}function l(p,d){return r.getCharCountIndicator(p,d)+4}function u(p,d){let m=0;return p.forEach(function(C){const A=l(C.mode,d);m+=A+C.getBitsLength()}),m}function y(p,d){for(let m=1;m<=40;m++)if(u(p,m)<=e.getCapacity(m,d,r.MIXED))return m}e.from=function(d,m){return a.isValid(d)?parseInt(d,10):m},e.getCapacity=function(d,m,C){if(!a.isValid(d))throw new Error("Invalid QR Code version");typeof C>"u"&&(C=r.BYTE);const A=t.getSymbolTotalCodewords(d),g=n.getTotalCodewordsCount(d,m),v=(A-g)*8;if(C===r.MIXED)return v;const f=v-l(C,d);switch(C){case r.NUMERIC:return Math.floor(f/10*3);case r.ALPHANUMERIC:return Math.floor(f/11*2);case r.KANJI:return Math.floor(f/13);case r.BYTE:default:return Math.floor(f/8)}},e.getBestVersionForData=function(d,m){let C;const A=o.from(m,o.M);if(Array.isArray(d)){if(d.length>1)return y(d,A);if(d.length===0)return 1;C=d[0]}else C=d;return c(C.mode,C.getLength(),A)},e.getEncodedBits=function(d){if(!a.isValid(d)||d<7)throw new Error("Invalid QR Code version");let m=d<<12;for(;t.getBCHDigit(m)-i>=0;)m^=s<<t.getBCHDigit(m)-i;return d<<12|m}})(Rt);var Ut={};const lt=P,_t=1335,we=21522,Et=lt.getBCHDigit(_t);Ut.getEncodedBits=function(t,n){const o=t.bit<<3|n;let r=o<<10;for(;lt.getBCHDigit(r)-Et>=0;)r^=_t<<lt.getBCHDigit(r)-Et;return(o<<10|r)^we};var Zt={};const ve=_;function F(e){this.mode=ve.NUMERIC,this.data=e.toString()}F.getBitsLength=function(t){return 10*Math.floor(t/3)+(t%3?t%3*3+1:0)};F.prototype.getLength=function(){return this.data.length};F.prototype.getBitsLength=function(){return F.getBitsLength(this.data.length)};F.prototype.write=function(t){let n,o,r;for(n=0;n+3<=this.data.length;n+=3)o=this.data.substr(n,3),r=parseInt(o,10),t.put(r,10);const a=this.data.length-n;a>0&&(o=this.data.substr(n),r=parseInt(o,10),t.put(r,a*3+1))};var Ce=F;const Ee=_,rt=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function q(e){this.mode=Ee.ALPHANUMERIC,this.data=e}q.getBitsLength=function(t){return 11*Math.floor(t/2)+6*(t%2)};q.prototype.getLength=function(){return this.data.length};q.prototype.getBitsLength=function(){return q.getBitsLength(this.data.length)};q.prototype.write=function(t){let n;for(n=0;n+2<=this.data.length;n+=2){let o=rt.indexOf(this.data[n])*45;o+=rt.indexOf(this.data[n+1]),t.put(o,11)}this.data.length%2&&t.put(rt.indexOf(this.data[n]),6)};var ze=q;const Se=_;function H(e){this.mode=Se.BYTE,typeof e=="string"?this.data=new TextEncoder().encode(e):this.data=new Uint8Array(e)}H.getBitsLength=function(t){return t*8};H.prototype.getLength=function(){return this.data.length};H.prototype.getBitsLength=function(){return H.getBitsLength(this.data.length)};H.prototype.write=function(e){for(let t=0,n=this.data.length;t<n;t++)e.put(this.data[t],8)};var ke=H;const Ae=_,Ne=P;function O(e){this.mode=Ae.KANJI,this.data=e}O.getBitsLength=function(t){return t*13};O.prototype.getLength=function(){return this.data.length};O.prototype.getBitsLength=function(){return O.getBitsLength(this.data.length)};O.prototype.write=function(e){let t;for(t=0;t<this.data.length;t++){let n=Ne.toSJIS(this.data[t]);if(n>=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw new Error("Invalid SJIS character: "+this.data[t]+`
|
|
159
|
+
Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),e.put(n,13)}};var xe=O,Ft={exports:{}};(function(e){var t={single_source_shortest_paths:function(n,o,r){var a={},s={};s[o]=0;var i=t.PriorityQueue.make();i.push(o,0);for(var c,l,u,y,p,d,m,C,A;!i.empty();){c=i.pop(),l=c.value,y=c.cost,p=n[l]||{};for(u in p)p.hasOwnProperty(u)&&(d=p[u],m=y+d,C=s[u],A=typeof s[u]>"u",(A||C>m)&&(s[u]=m,i.push(u,m),a[u]=l))}if(typeof r<"u"&&typeof s[r]>"u"){var g=["Could not find a path from ",o," to ",r,"."].join("");throw new Error(g)}return a},extract_shortest_path_from_predecessor_list:function(n,o){for(var r=[],a=o;a;)r.push(a),n[a],a=n[a];return r.reverse(),r},find_path:function(n,o,r){var a=t.single_source_shortest_paths(n,o,r);return t.extract_shortest_path_from_predecessor_list(a,r)},PriorityQueue:{make:function(n){var o=t.PriorityQueue,r={},a;n=n||{};for(a in o)o.hasOwnProperty(a)&&(r[a]=o[a]);return r.queue=[],r.sorter=n.sorter||o.default_sorter,r},default_sorter:function(n,o){return n.cost-o.cost},push:function(n,o){var r={value:n,cost:o};this.queue.push(r),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};e.exports=t})(Ft);var Te=Ft.exports;(function(e){const t=_,n=Ce,o=ze,r=ke,a=xe,s=L,i=P,c=Te;function l(g){return unescape(encodeURIComponent(g)).length}function u(g,v,f){const h=[];let E;for(;(E=g.exec(f))!==null;)h.push({data:E[0],index:E.index,mode:v,length:E[0].length});return h}function y(g){const v=u(s.NUMERIC,t.NUMERIC,g),f=u(s.ALPHANUMERIC,t.ALPHANUMERIC,g);let h,E;return i.isKanjiModeEnabled()?(h=u(s.BYTE,t.BYTE,g),E=u(s.KANJI,t.KANJI,g)):(h=u(s.BYTE_KANJI,t.BYTE,g),E=[]),v.concat(f,h,E).sort(function(b,S){return b.index-S.index}).map(function(b){return{data:b.data,mode:b.mode,length:b.length}})}function p(g,v){switch(v){case t.NUMERIC:return n.getBitsLength(g);case t.ALPHANUMERIC:return o.getBitsLength(g);case t.KANJI:return a.getBitsLength(g);case t.BYTE:return r.getBitsLength(g)}}function d(g){return g.reduce(function(v,f){const h=v.length-1>=0?v[v.length-1]:null;return h&&h.mode===f.mode?(v[v.length-1].data+=f.data,v):(v.push(f),v)},[])}function m(g){const v=[];for(let f=0;f<g.length;f++){const h=g[f];switch(h.mode){case t.NUMERIC:v.push([h,{data:h.data,mode:t.ALPHANUMERIC,length:h.length},{data:h.data,mode:t.BYTE,length:h.length}]);break;case t.ALPHANUMERIC:v.push([h,{data:h.data,mode:t.BYTE,length:h.length}]);break;case t.KANJI:v.push([h,{data:h.data,mode:t.BYTE,length:l(h.data)}]);break;case t.BYTE:v.push([{data:h.data,mode:t.BYTE,length:l(h.data)}])}}return v}function C(g,v){const f={},h={start:{}};let E=["start"];for(let z=0;z<g.length;z++){const b=g[z],S=[];for(let T=0;T<b.length;T++){const I=b[T],R=""+z+T;S.push(R),f[R]={node:I,lastCount:0},h[R]={};for(let D=0;D<E.length;D++){const B=E[D];f[B]&&f[B].node.mode===I.mode?(h[B][R]=p(f[B].lastCount+I.length,I.mode)-p(f[B].lastCount,I.mode),f[B].lastCount+=I.length):(f[B]&&(f[B].lastCount=I.length),h[B][R]=p(I.length,I.mode)+4+t.getCharCountIndicator(I.mode,v))}}E=S}for(let z=0;z<E.length;z++)h[E[z]].end=0;return{map:h,table:f}}function A(g,v){let f;const h=t.getBestModeForData(g);if(f=t.from(v,h),f!==t.BYTE&&f.bit<h.bit)throw new Error('"'+g+'" cannot be encoded with mode '+t.toString(f)+`.
|
|
160
|
+
Suggested mode is: `+t.toString(h));switch(f===t.KANJI&&!i.isKanjiModeEnabled()&&(f=t.BYTE),f){case t.NUMERIC:return new n(g);case t.ALPHANUMERIC:return new o(g);case t.KANJI:return new a(g);case t.BYTE:return new r(g)}}e.fromArray=function(v){return v.reduce(function(f,h){return typeof h=="string"?f.push(A(h,null)):h.data&&f.push(A(h.data,h.mode)),f},[])},e.fromString=function(v,f){const h=y(v,i.isKanjiModeEnabled()),E=m(h),z=C(E,f),b=c.find_path(z.map,"start","end"),S=[];for(let T=1;T<b.length-1;T++)S.push(z.table[b[T]].node);return e.fromArray(d(S))},e.rawSplit=function(v){return e.fromArray(y(v,i.isKanjiModeEnabled()))}})(Zt);const ot=P,at=tt,Be=ue,Ie=de,Pe=Bt,Le=It,ut=Pt,dt=et,Me=pe,W=Rt,Re=Ut,De=_,it=Zt;function Ue(e,t){const n=e.size,o=Le.getPositions(t);for(let r=0;r<o.length;r++){const a=o[r][0],s=o[r][1];for(let i=-1;i<=7;i++)if(!(a+i<=-1||n<=a+i))for(let c=-1;c<=7;c++)s+c<=-1||n<=s+c||(i>=0&&i<=6&&(c===0||c===6)||c>=0&&c<=6&&(i===0||i===6)||i>=2&&i<=4&&c>=2&&c<=4?e.set(a+i,s+c,!0,!0):e.set(a+i,s+c,!1,!0))}}function _e(e){const t=e.size;for(let n=8;n<t-8;n++){const o=n%2===0;e.set(n,6,o,!0),e.set(6,n,o,!0)}}function Ze(e,t){const n=Pe.getPositions(t);for(let o=0;o<n.length;o++){const r=n[o][0],a=n[o][1];for(let s=-2;s<=2;s++)for(let i=-2;i<=2;i++)s===-2||s===2||i===-2||i===2||s===0&&i===0?e.set(r+s,a+i,!0,!0):e.set(r+s,a+i,!1,!0)}}function Fe(e,t){const n=e.size,o=W.getEncodedBits(t);let r,a,s;for(let i=0;i<18;i++)r=Math.floor(i/3),a=i%3+n-8-3,s=(o>>i&1)===1,e.set(r,a,s,!0),e.set(a,r,s,!0)}function st(e,t,n){const o=e.size,r=Re.getEncodedBits(t,n);let a,s;for(a=0;a<15;a++)s=(r>>a&1)===1,a<6?e.set(a,8,s,!0):a<8?e.set(a+1,8,s,!0):e.set(o-15+a,8,s,!0),a<8?e.set(8,o-a-1,s,!0):a<9?e.set(8,15-a-1+1,s,!0):e.set(8,15-a-1,s,!0);e.set(o-8,8,1,!0)}function qe(e,t){const n=e.size;let o=-1,r=n-1,a=7,s=0;for(let i=n-1;i>0;i-=2)for(i===6&&i--;;){for(let c=0;c<2;c++)if(!e.isReserved(r,i-c)){let l=!1;s<t.length&&(l=(t[s]>>>a&1)===1),e.set(r,i-c,l),a--,a===-1&&(s++,a=7)}if(r+=o,r<0||n<=r){r-=o,o=-o;break}}}function He(e,t,n){const o=new Be;n.forEach(function(c){o.put(c.mode.bit,4),o.put(c.getLength(),De.getCharCountIndicator(c.mode,e)),c.write(o)});const r=ot.getSymbolTotalCodewords(e),a=dt.getTotalCodewordsCount(e,t),s=(r-a)*8;for(o.getLengthInBits()+4<=s&&o.put(0,4);o.getLengthInBits()%8!==0;)o.putBit(0);const i=(s-o.getLengthInBits())/8;for(let c=0;c<i;c++)o.put(c%2?17:236,8);return Oe(o,e,t)}function Oe(e,t,n){const o=ot.getSymbolTotalCodewords(t),r=dt.getTotalCodewordsCount(t,n),a=o-r,s=dt.getBlocksCount(t,n),i=o%s,c=s-i,l=Math.floor(o/s),u=Math.floor(a/s),y=u+1,p=l-u,d=new Me(p);let m=0;const C=new Array(s),A=new Array(s);let g=0;const v=new Uint8Array(e.buffer);for(let b=0;b<s;b++){const S=b<c?u:y;C[b]=v.slice(m,m+S),A[b]=d.encode(C[b]),m+=S,g=Math.max(g,S)}const f=new Uint8Array(o);let h=0,E,z;for(E=0;E<g;E++)for(z=0;z<s;z++)E<C[z].length&&(f[h++]=C[z][E]);for(E=0;E<p;E++)for(z=0;z<s;z++)f[h++]=A[z][E];return f}function Ve(e,t,n,o){let r;if(Array.isArray(e))r=it.fromArray(e);else if(typeof e=="string"){let l=t;if(!l){const u=it.rawSplit(e);l=W.getBestVersionForData(u,n)}r=it.fromString(e,l||40)}else throw new Error("Invalid data");const a=W.getBestVersionForData(r,n);if(!a)throw new Error("The amount of data is too big to be stored in a QR Code");if(!t)t=a;else if(t<a)throw new Error(`
|
|
161
161
|
The chosen QR Code version cannot contain this amount of data.
|
|
162
162
|
Minimum version required to store current data is: `+a+`.
|
|
163
|
-
`);const s=
|
|
164
|
-
`;return typeof o=="function"&&o(null,p),p};const
|
|
163
|
+
`);const s=He(t,n,r),i=ot.getSymbolSize(t),c=new Ie(i);return Ue(c,t),_e(c),Ze(c,t),st(c,n,0),t>=7&&Fe(c,t),qe(c,s),isNaN(o)&&(o=ut.getBestMask(c,st.bind(null,c,n))),ut.applyMask(o,c),st(c,n,o),{modules:c,version:t,errorCorrectionLevel:n,maskPattern:o,segments:r}}xt.create=function(t,n){if(typeof t>"u"||t==="")throw new Error("No input text");let o=at.M,r,a;return typeof n<"u"&&(o=at.from(n.errorCorrectionLevel,at.M),r=W.from(n.version),a=ut.from(n.maskPattern),n.toSJISFunc&&ot.setToSJISFunction(n.toSJISFunc)),Ve(t,r,o,a)};var qt={},mt={};(function(e){function t(n){if(typeof n=="number"&&(n=n.toString()),typeof n!="string")throw new Error("Color should be defined as hex string");let o=n.slice().replace("#","").split("");if(o.length<3||o.length===5||o.length>8)throw new Error("Invalid hex color: "+n);(o.length===3||o.length===4)&&(o=Array.prototype.concat.apply([],o.map(function(a){return[a,a]}))),o.length===6&&o.push("F","F");const r=parseInt(o.join(""),16);return{r:r>>24&255,g:r>>16&255,b:r>>8&255,a:r&255,hex:"#"+o.slice(0,6).join("")}}e.getOptions=function(o){o||(o={}),o.color||(o.color={});const r=typeof o.margin>"u"||o.margin===null||o.margin<0?4:o.margin,a=o.width&&o.width>=21?o.width:void 0,s=o.scale||4;return{width:a,scale:a?4:s,margin:r,color:{dark:t(o.color.dark||"#000000ff"),light:t(o.color.light||"#ffffffff")},type:o.type,rendererOpts:o.rendererOpts||{}}},e.getScale=function(o,r){return r.width&&r.width>=o+r.margin*2?r.width/(o+r.margin*2):r.scale},e.getImageWidth=function(o,r){const a=e.getScale(o,r);return Math.floor((o+r.margin*2)*a)},e.qrToImageData=function(o,r,a){const s=r.modules.size,i=r.modules.data,c=e.getScale(s,a),l=Math.floor((s+a.margin*2)*c),u=a.margin*c,y=[a.color.light,a.color.dark];for(let p=0;p<l;p++)for(let d=0;d<l;d++){let m=(p*l+d)*4,C=a.color.light;if(p>=u&&d>=u&&p<l-u&&d<l-u){const A=Math.floor((p-u)/c),g=Math.floor((d-u)/c);C=y[i[A*s+g]?1:0]}o[m++]=C.r,o[m++]=C.g,o[m++]=C.b,o[m]=C.a}}})(mt);(function(e){const t=mt;function n(r,a,s){r.clearRect(0,0,a.width,a.height),a.style||(a.style={}),a.height=s,a.width=s,a.style.height=s+"px",a.style.width=s+"px"}function o(){try{return document.createElement("canvas")}catch{throw new Error("You need to specify a canvas element")}}e.render=function(a,s,i){let c=i,l=s;typeof c>"u"&&(!s||!s.getContext)&&(c=s,s=void 0),s||(l=o()),c=t.getOptions(c);const u=t.getImageWidth(a.modules.size,c),y=l.getContext("2d"),p=y.createImageData(u,u);return t.qrToImageData(p.data,a,c),n(y,l,u),y.putImageData(p,0,0),l},e.renderToDataURL=function(a,s,i){let c=i;typeof c>"u"&&(!s||!s.getContext)&&(c=s,s=void 0),c||(c={});const l=e.render(a,s,c),u=c.type||"image/png",y=c.rendererOpts||{};return l.toDataURL(u,y.quality)}})(qt);var Ht={};const je=mt;function zt(e,t){const n=e.a/255,o=t+'="'+e.hex+'"';return n<1?o+" "+t+'-opacity="'+n.toFixed(2).slice(1)+'"':o}function ct(e,t,n){let o=e+t;return typeof n<"u"&&(o+=" "+n),o}function Ke(e,t,n){let o="",r=0,a=!1,s=0;for(let i=0;i<e.length;i++){const c=Math.floor(i%t),l=Math.floor(i/t);!c&&!a&&(a=!0),e[i]?(s++,i>0&&c>0&&e[i-1]||(o+=a?ct("M",c+n,.5+l+n):ct("m",r,0),r=0,a=!1),c+1<t&&e[i+1]||(o+=ct("h",s),s=0)):r++}return o}Ht.render=function(t,n,o){const r=je.getOptions(n),a=t.modules.size,s=t.modules.data,i=a+r.margin*2,c=r.color.light.a?"<path "+zt(r.color.light,"fill")+' d="M0 0h'+i+"v"+i+'H0z"/>':"",l="<path "+zt(r.color.dark,"stroke")+' d="'+Ke(s,a,r.margin)+'"/>',u='viewBox="0 0 '+i+" "+i+'"',p='<svg xmlns="http://www.w3.org/2000/svg" '+(r.width?'width="'+r.width+'" height="'+r.width+'" ':"")+u+' shape-rendering="crispEdges">'+c+l+`</svg>
|
|
164
|
+
`;return typeof o=="function"&&o(null,p),p};const Ye=ce,ft=xt,Ot=qt,Je=Ht;function bt(e,t,n,o,r){const a=[].slice.call(arguments,1),s=a.length,i=typeof a[s-1]=="function";if(!i&&!Ye())throw new Error("Callback required as last argument");if(i){if(s<2)throw new Error("Too few arguments provided");s===2?(r=n,n=t,t=o=void 0):s===3&&(t.getContext&&typeof r>"u"?(r=o,o=void 0):(r=o,o=n,n=t,t=void 0))}else{if(s<1)throw new Error("Too few arguments provided");return s===1?(n=t,t=o=void 0):s===2&&!t.getContext&&(o=n,n=t,t=void 0),new Promise(function(c,l){try{const u=ft.create(n,o);c(e(u,t,o))}catch(u){l(u)}})}try{const c=ft.create(n,o);r(null,e(c,t,o))}catch(c){r(c)}}ft.create;bt.bind(null,Ot.render);var $e=bt.bind(null,Ot.renderToDataURL);bt.bind(null,function(e,t,n){return Je.render(e,n)});const Ge=(e="light")=>{document.querySelectorAll("style[data-zap-dialog-styles]").forEach(o=>o.remove());const n=document.createElement("style");n.setAttribute("data-zap-dialog-styles","true"),n.textContent=se(e),document.head.appendChild(n)};async function Qe(e){var wt;const{npub:t,relays:n,cachedDialogComponent:o,buttonColor:r,fixedAmount:a,defaultAmount:s,initialAmount:i,url:c}=e,l=Qt(t);if(customElements.get("dialog-component")||await customElements.whenDefined("dialog-component"),o){const w=document.querySelector(".nostr-base-dialog");if(w){w.classList.remove("success"),w.querySelectorAll(".amount-buttons, .update-zap-container, .comment-container, .cta-btn, .copy-btn").forEach(Y=>{Y instanceof HTMLElement&&(Y.style.display="")});const k=w.querySelector(".update-zap-btn");k&&(k.style.display="");const M=w.querySelector(".success-overlay");return M&&(M.style.opacity="0",M.style.pointerEvents="none"),v(w),o.showModal(),o}}const u=[21,100,1e3];let y;typeof a=="number"&&a>0?y=a:typeof s=="number"&&s>0?y=s:typeof i=="number"&&i>0?y=i:y=u[0];let p="",d="",m=null;async function C(w,x){const k=l,M=await Wt(k),Y=await Xt(M),vt=await te({zapEndpoint:Y,amount:w*1e3,comment:x,authorId:k,nip19Target:void 0,normalizedRelays:n.split(","),anon:e.anon,url:c});d=vt;const Yt=n.split(",");m&&m(),m=ee({relays:Yt,receiversPubKey:l,invoice:vt,onSuccess:yt})}async function A(w){try{return await $e(w,{width:240,margin:1,color:{dark:"#000000",light:"#ffffff"}})}catch(x){return console.error("Failed to generate QR code:",x),`data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="240" height="240" viewBox="0 0 100 100">
|
|
165
165
|
<rect width="100%" height="100%" fill="white"/>
|
|
166
166
|
<text x="50%" y="50%" font-family="monospace" font-size="10" text-anchor="middle" dominant-baseline="middle" fill="black">
|
|
167
167
|
Invoice: ${w.substring(0,10)}...
|
|
168
168
|
</text>
|
|
169
|
-
</svg>`}}function g(w,x){w.querySelectorAll("button").forEach(k=>{k.dataset.val===String(x)?k.classList.add("active"):k.classList.remove("active")})}async function v(w){w.classList.add("loading");try{await C(y,p);const x=w.querySelector("img.qr");A(d).then(M=>{x.src=M});const k=w.querySelector(".cta-btn");k.disabled=!1}finally{w.classList.remove("loading")}}
|
|
169
|
+
</svg>`}}function g(w,x){w.querySelectorAll("button").forEach(k=>{k.dataset.val===String(x)?k.classList.add("active"):k.classList.remove("active")})}async function v(w){w.classList.add("loading");try{await C(y,p);const x=w.querySelector("img.qr");A(d).then(M=>{x.src=M});const k=w.querySelector(".cta-btn");k.disabled=!1}finally{w.classList.remove("loading")}}Ge(e.theme||"light");const f=document.createElement("dialog-component");f.setAttribute("header","Send a Zap"),e.theme&&f.setAttribute("data-theme",e.theme);const h=u.map(w=>`<button type="button" data-val="${w}">${w} ⚡</button>`).join(""),E=typeof a=="number"&&a>0;f.innerHTML=`
|
|
170
170
|
<div class="zap-dialog-content">
|
|
171
171
|
${E?"":`<div class="amount-buttons">${h}</div>`}
|
|
172
172
|
${E?`<p class="zapping-amount">Zapping ${a} sats</p>`:""}
|
|
@@ -185,7 +185,7 @@ Minimum version required to store current data is: `+a+`.
|
|
|
185
185
|
<div class="loading-overlay"><div class="loader"></div></div>
|
|
186
186
|
<div class="success-overlay">⚡ Thank you!</div>
|
|
187
187
|
</div>
|
|
188
|
-
`,f.showModal();const z=f.querySelector(".nostr-base-dialog")||((wt=f.shadowRoot)==null?void 0:wt.querySelector(".nostr-base-dialog"))||document.body.querySelector(".nostr-base-dialog");if(!z)throw console.error("[showZapDialog] Failed to find dialog element after showModal()"),new Error("Dialog element not found. The dialog may not have been created properly.");const b=z,S=b.querySelector(".amount-buttons");S&&S.addEventListener("click",async w=>{const x=w.target;if(x.tagName==="BUTTON"){const k=Number(x.dataset.val);if(!isNaN(k)){y=k,g(S,k);const M=b.querySelector(".cta-btn");M.disabled=!0,await v(b)}}});const T=b.querySelector(".custom-amount");T&&T.addEventListener("input",async w=>{const x=Number(w.target.value);if(x>0){y=x,S&&g(S,-1);const k=b.querySelector(".cta-btn");k.disabled=!0}});const I=b.querySelector(".comment-input");I&&I.addEventListener("input",w=>{p=w.target.value.slice(0,200)});const R=async()=>{d&&(await navigator.clipboard.writeText(d),b.querySelector(".copy-btn").textContent="Copied!",setTimeout(()=>{b.querySelector(".copy-btn").textContent="Copy invoice"},1500))};b.querySelector(".copy-btn").onclick=R,b.querySelector("img.qr").onclick=R;const D=b.querySelector(".update-zap-btn");D&&D.addEventListener("click",async()=>{const w=Number(T==null?void 0:T.value);!isNaN(w)&&w>0&&(y=w,D.disabled=!0,await v(b),D.disabled=!1)});const B=b.querySelector(".add-comment-btn");B&&B.addEventListener("click",async()=>{B.disabled=!0,await v(b),B.disabled=!1}),b.querySelector(".cta-btn").onclick=async()=>{if(d){if(window.webln)try{await window.webln.enable(),await window.webln.sendPayment(d),yt();return}catch(w){console.error("Nostr-Components: Zap button: webln payment failed",w),b.close()}window.location.href=`lightning:${d}`}};function yt(){b.classList.add("success");const w=b.querySelector(".success-overlay");w.style.opacity="1",w.style.pointerEvents="none",b.querySelectorAll(".amount-buttons, .update-zap-container, .comment-container, .cta-btn, .copy-btn").forEach(k=>{k instanceof HTMLElement&&(k.style.display="none")})}if(b.addEventListener("close",()=>{m&&m()}),r){const w=r;b.querySelector(".cta-btn").style.background=w,b.querySelector(".cta-btn").style.color=
|
|
188
|
+
`,f.showModal();const z=f.querySelector(".nostr-base-dialog")||((wt=f.shadowRoot)==null?void 0:wt.querySelector(".nostr-base-dialog"))||document.body.querySelector(".nostr-base-dialog");if(!z)throw console.error("[showZapDialog] Failed to find dialog element after showModal()"),new Error("Dialog element not found. The dialog may not have been created properly.");const b=z,S=b.querySelector(".amount-buttons");S&&S.addEventListener("click",async w=>{const x=w.target;if(x.tagName==="BUTTON"){const k=Number(x.dataset.val);if(!isNaN(k)){y=k,g(S,k);const M=b.querySelector(".cta-btn");M.disabled=!0,await v(b)}}});const T=b.querySelector(".custom-amount");T&&T.addEventListener("input",async w=>{const x=Number(w.target.value);if(x>0){y=x,S&&g(S,-1);const k=b.querySelector(".cta-btn");k.disabled=!0}});const I=b.querySelector(".comment-input");I&&I.addEventListener("input",w=>{p=w.target.value.slice(0,200)});const R=async()=>{d&&(await navigator.clipboard.writeText(d),b.querySelector(".copy-btn").textContent="Copied!",setTimeout(()=>{b.querySelector(".copy-btn").textContent="Copy invoice"},1500))};b.querySelector(".copy-btn").onclick=R,b.querySelector("img.qr").onclick=R;const D=b.querySelector(".update-zap-btn");D&&D.addEventListener("click",async()=>{const w=Number(T==null?void 0:T.value);!isNaN(w)&&w>0&&(y=w,D.disabled=!0,await v(b),D.disabled=!1)});const B=b.querySelector(".add-comment-btn");B&&B.addEventListener("click",async()=>{B.disabled=!0,await v(b),B.disabled=!1}),b.querySelector(".cta-btn").onclick=async()=>{if(d){if(window.webln)try{await window.webln.enable(),await window.webln.sendPayment(d),yt();return}catch(w){console.error("Nostr-Components: Zap button: webln payment failed",w),b.close()}window.location.href=`lightning:${d}`}};function yt(){b.classList.add("success");const w=b.querySelector(".success-overlay");w.style.opacity="1",w.style.pointerEvents="none",b.querySelectorAll(".amount-buttons, .update-zap-container, .comment-container, .cta-btn, .copy-btn").forEach(k=>{k instanceof HTMLElement&&(k.style.display="none")})}if(b.addEventListener("close",()=>{m&&m()}),r){const w=r;b.querySelector(".cta-btn").style.background=w,b.querySelector(".cta-btn").style.color=We(w)}if(await v(b),S&&u.includes(y))g(S,y);else if(!E){const w=b.querySelector(".custom-amount");w&&(w.value=String(y)),S&&g(S,-1)}return f}function We(e){e=e.replace("#",""),e.length===3&&(e=e.split("").map(a=>a+a).join(""));const t=parseInt(e.slice(0,2),16),n=parseInt(e.slice(2,4),16),o=parseInt(e.slice(4,6),16);return(t*299+n*587+o*114)/1e3>125?"#000":"#fff"}const Xe=()=>`
|
|
189
189
|
/* Help Dialog Content Styles */
|
|
190
190
|
.help-content {
|
|
191
191
|
padding: var(--nostrc-spacing-md, 12px);
|
|
@@ -245,7 +245,7 @@ Minimum version required to store current data is: `+a+`.
|
|
|
245
245
|
.youtube-link:hover {
|
|
246
246
|
background: var(--nostrc-color-primary-hover, #6b00d9);
|
|
247
247
|
}
|
|
248
|
-
`,
|
|
248
|
+
`,tn="https://www.youtube.com/shorts/PDnrh8pkF3g",en=()=>{if(document.querySelector("style[data-help-dialog-styles]"))return;const e=document.createElement("style");e.setAttribute("data-help-dialog-styles","true"),e.textContent=Xe(),document.head.appendChild(e)},nn=async e=>{en(),customElements.get("dialog-component")||await customElements.whenDefined("dialog-component");const t=document.createElement("dialog-component");t.setAttribute("header","What is a Zap?"),t.setAttribute("data-theme",e),t.innerHTML=`
|
|
249
249
|
<div class="help-content">
|
|
250
250
|
<p>Send instant tips to support content creators! Zaps are small Bitcoin Lightning payments that go directly to creators—no middleman.</p>
|
|
251
251
|
<ul>
|
|
@@ -254,11 +254,11 @@ Minimum version required to store current data is: `+a+`.
|
|
|
254
254
|
<li>Powered by Bitcoin Lightning Network</li>
|
|
255
255
|
</ul>
|
|
256
256
|
<p><strong>How it works:</strong> Click zap, choose amount, scan QR code with a Lightning wallet, done!</p>
|
|
257
|
-
<a href="${
|
|
257
|
+
<a href="${tn}" target="_blank" rel="noopener noreferrer" class="youtube-link">
|
|
258
258
|
Watch Tutorial
|
|
259
259
|
</a>
|
|
260
260
|
</div>
|
|
261
|
-
`,t.showModal()};function
|
|
261
|
+
`,t.showModal()};function on(e="light"){const t=e==="dark";return St(`
|
|
262
262
|
/* === ZAPPERS DIALOG CONTENT STYLES === */
|
|
263
263
|
.zappers-dialog-content {
|
|
264
264
|
overflow: hidden;
|
|
@@ -435,7 +435,7 @@ Minimum version required to store current data is: `+a+`.
|
|
|
435
435
|
.zappers-list::-webkit-scrollbar-thumb:hover {
|
|
436
436
|
background: ${t?"#6b7280":"#94a3b8"};
|
|
437
437
|
}
|
|
438
|
-
`)}const
|
|
438
|
+
`)}const rn=(e="light")=>{document.querySelectorAll("style[data-zappers-dialog-styles]").forEach(o=>o.remove());const n=document.createElement("style");n.setAttribute("data-zappers-dialog-styles","true"),n.textContent=on(e),document.head.appendChild(n)};function Vt(e,t){const n=X(e.authorName||"Unknown zapper"),r=`https://njump.me/${ae(e.authorNpub||"")?e.authorNpub:""}`,a=At(e.authorPicture||"")&&e.authorPicture||"",s=e.authorPicture?`<img src="${a}" alt="${n}" class="zap-author-picture" />`:'<div class="zap-author-picture-default">👤</div>',i=e.comment?`<div class="zap-comment">${e.comment}</div>`:"";return`
|
|
439
439
|
<div class="zap-entry" data-zap-index="${t}" data-author-pubkey="${e.authorPubkey}">
|
|
440
440
|
<div class="zap-author-info">
|
|
441
441
|
${s}
|
|
@@ -450,7 +450,7 @@ Minimum version required to store current data is: `+a+`.
|
|
|
450
450
|
</div>
|
|
451
451
|
</div>
|
|
452
452
|
</div>
|
|
453
|
-
`}function
|
|
453
|
+
`}function an(e,t,n){return`
|
|
454
454
|
<div class="zap-entry skeleton-entry" data-zap-index="${n}" data-author-pubkey="${e.authorPubkey}">
|
|
455
455
|
<div class="zap-author-info">
|
|
456
456
|
<div class="skeleton-picture"></div>
|
|
@@ -464,7 +464,7 @@ Minimum version required to store current data is: `+a+`.
|
|
|
464
464
|
</div>
|
|
465
465
|
</div>
|
|
466
466
|
</div>
|
|
467
|
-
`}async function
|
|
467
|
+
`}async function sn(e){var i;const{zapDetails:t,theme:n="light"}=e;rn(n),customElements.get("dialog-component")||await customElements.whenDefined("dialog-component");const o=document.createElement("dialog-component");o.setAttribute("header","Zappers"),e.theme&&o.setAttribute("data-theme",e.theme);const r=await cn(t);o.innerHTML=r,o.showModal();const a=o.querySelector(".nostr-base-dialog")||((i=o.shadowRoot)==null?void 0:i.querySelector(".nostr-base-dialog"))||document.body.querySelector(".nostr-base-dialog");if(!a)throw console.error("[showZappersDialog] Failed to find dialog element after showModal()"),new Error("Dialog element not found. The dialog may not have been created properly.");const s=a;return s&&t.length>0&&ln(s,t),o}async function cn(e){if(e.length===0)return`
|
|
468
468
|
<div class="zappers-dialog-content">
|
|
469
469
|
<div class="zappers-list">
|
|
470
470
|
<div class="no-zaps">No zaps received yet</div>
|
|
@@ -473,10 +473,10 @@ Minimum version required to store current data is: `+a+`.
|
|
|
473
473
|
`;const t=e.map(o=>G(o.authorPubkey));return`
|
|
474
474
|
<div class="zappers-dialog-content">
|
|
475
475
|
<div class="zappers-list">
|
|
476
|
-
${e.map((o,r)=>
|
|
476
|
+
${e.map((o,r)=>an(o,t[r],r)).join("")}
|
|
477
477
|
</div>
|
|
478
478
|
</div>
|
|
479
|
-
`}async function
|
|
479
|
+
`}async function ln(e,t){const n=e.querySelector(".zappers-list");if(!n)return;const o=[...new Set(t.map(r=>r.authorPubkey))];console.log("Nostr-Components: Zappers dialog: Fetching profiles for",o.length,"unique authors");try{const r=await ne(o),a=new Map;r.forEach(i=>{a.set(i.id,i.profile)});const s=new Map;o.forEach(i=>{s.set(i,G(i))});for(let i=0;i<t.length;i++){const c=t[i],l=a.get(c.authorPubkey),u=s.get(c.authorPubkey)||c.authorPubkey;let y;if(l){const d=Nt(l);y={...c,authorName:d.display_name||d.name||u,authorPicture:d.picture,authorNpub:u}}else y={...c,authorName:u,authorNpub:u};const p=n.querySelector(`[data-zap-index="${i}"]`);if(p){const d=Vt(y,i);p.outerHTML=d}}console.log("Nostr-Components: Zappers dialog: Progressive enhancement completed for",t.length,"zap entries")}catch(r){console.error("Nostr-Components: Zappers dialog: Error in batched profile enhancement",r),console.log("Nostr-Components: Zappers dialog: Falling back to individual profile fetching"),await un(e,t)}}async function un(e,t){const n=e.querySelector(".zappers-list");if(!n)return;const o=new Map,r=t.map(async(a,s)=>{if(o.has(a.authorPubkey)){const i=o.get(a.authorPubkey);return{index:s,enhanced:{...a,authorName:i.authorName,authorPicture:i.authorPicture,authorNpub:i.authorNpub}}}try{const{getProfileMetadata:i}=await re(async()=>{const{getProfileMetadata:p}=await import("../assets/zap-utils-BZcaCsT_.js");return{getProfileMetadata:p}},__vite__mapDeps([0,1,2,3,4])),c=await i(a.authorPubkey),l=Nt(c),u=G(a.authorPubkey),y={...a,authorName:l.display_name||l.name||u,authorPicture:l.picture,authorNpub:u};return o.set(a.authorPubkey,y),{index:s,enhanced:y}}catch(i){console.error("Nostr-Components: Zappers dialog: Error fetching profile for",a.authorPubkey,i);const c=G(a.authorPubkey),l={...a,authorName:c,authorNpub:c};return o.set(a.authorPubkey,l),{index:s,enhanced:l}}});for(const a of r)try{const{index:s,enhanced:i}=await a,c=n.querySelector(`[data-zap-index="${s}"]`);if(c){const l=Vt(i,s);c.outerHTML=l}}catch(s){console.error("Nostr-Components: Zappers dialog: Error processing profile enhancement",s)}}function dn({isLoading:e,isError:t,isSuccess:n,errorMessage:o,buttonText:r,totalZapAmount:a,isAmountLoading:s,hasZaps:i=!1}){if(t)return pn(o||"");if(e)return fn(s);const c=Kt(),l=`<span>${X(r)}</span>`;return jt(c,l,a,s,i)}function fn(e){return jt(Kt(),'<span class="button-text-skeleton"></span>',null,e)}function pn(e){return gn('<div class="error-icon">⚠</div>',X(e))}function gn(e,t){return`
|
|
480
480
|
<div class="nostr-zap-button-container">
|
|
481
481
|
<div class="nostr-zap-button-left-container">
|
|
482
482
|
${e}
|
|
@@ -485,7 +485,7 @@ Minimum version required to store current data is: `+a+`.
|
|
|
485
485
|
${t}
|
|
486
486
|
</div>
|
|
487
487
|
</div>
|
|
488
|
-
`}function
|
|
488
|
+
`}function jt(e,t,n,o,r=!1){const a=o?'<span class="total-zap-amount skeleton"></span>':n!==null?`<span class="total-zap-amount${r?" clickable":""}">${n.toLocaleString()} ⚡ sats received</span>`:"";return`
|
|
489
489
|
<div class="nostr-zap-button-container">
|
|
490
490
|
<button class="nostr-zap-button">
|
|
491
491
|
${e}
|
|
@@ -493,7 +493,7 @@ Minimum version required to store current data is: `+a+`.
|
|
|
493
493
|
</button>
|
|
494
494
|
${a} <button class="help-icon" title="What is a zap?">?</button>
|
|
495
495
|
</div>
|
|
496
|
-
`}function
|
|
496
|
+
`}function Kt(){return'<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M13 2L3 14h7v8l10-12h-7z" fill="#FFC800"/></svg>'}function hn(){return St(`
|
|
497
497
|
/* === ZAP BUTTON CONTAINER PATTERN === */
|
|
498
498
|
:host {
|
|
499
499
|
/* Icon sizing (overridable via CSS variables) */
|
|
@@ -687,8 +687,8 @@ Minimum version required to store current data is: `+a+`.
|
|
|
687
687
|
max-width: 250px;
|
|
688
688
|
white-space: pre-line;
|
|
689
689
|
}
|
|
690
|
-
`)}class
|
|
691
|
-
${
|
|
692
|
-
${
|
|
693
|
-
`}}customElements.define("nostr-zap",
|
|
690
|
+
`)}class mn extends Gt{constructor(){super();Z(this,"zapActionStatus",this.channel("zapAction"));Z(this,"zapListStatus",this.channel("zapList"));Z(this,"totalZapAmount",null);Z(this,"cachedZapDetails",[]);Z(this,"cachedAmountDialog",null);this.zapListStatus.set(N.Loading)}connectedCallback(){var n;(n=super.connectedCallback)==null||n.call(this),this.attachDelegatedListeners(),this.render()}static get observedAttributes(){return[...super.observedAttributes,"text","amount","default-amount","url"]}attributeChangedCallback(n,o,r){o!==r&&(super.attributeChangedCallback(n,o,r),this.render())}disconnectedCallback(){this.cachedAmountDialog&&typeof this.cachedAmountDialog.close=="function"&&this.cachedAmountDialog.close()}onStatusChange(n){this.render()}onUserReady(n,o){this.render(),this.updateZapCount()}validateInputs(){if(!super.validateInputs())return this.zapActionStatus.set(N.Idle),this.zapListStatus.set(N.Idle),!1;const n=this.getAttribute("text"),o=this.getAttribute("amount"),r=this.getAttribute("default-amount"),a=this.getAttribute("url"),s=this.tagName.toLowerCase();let i=null;if(n&&n.length>128)i="Max text length: 128 characters";else if(o){const c=Number(o);isNaN(c)||c<=0?i="Invalid amount":c>21e4&&(i="Amount too high (max 210,000 sats)")}else if(r){const c=Number(r);isNaN(c)||c<=0?i="Invalid default-amount":c>21e4&&(i="Default-amount too high (max 210,000 sats)")}else a&&(At(a)||(i="Invalid URL format"));return i?(this.zapActionStatus.set(N.Error,i),this.zapListStatus.set(N.Error,i),this.userStatus.set(N.Idle),console.error(`Nostr-Components: ${s}: ${i}`),!1):!0}async handleZapClick(){if(this.userStatus.get()===N.Ready){this.zapActionStatus.set(N.Loading),this.render();try{if(await ie(),!this.user){this.zapActionStatus.set(N.Error,"Could not resolve user to zap."),this.render();return}const n=this.getRelays().join(","),o=this.user.npub;this.cachedAmountDialog=await Qe({npub:o,relays:n,cachedDialogComponent:this.cachedAmountDialog,theme:this.theme==="dark"?"dark":"light",fixedAmount:(()=>{const r=this.getAttribute("amount");if(!r)return;const a=Number(r);if(isNaN(a)||a<=0||a>21e4){console.error("Nostr-Components: Zap button: Max zap amount: 210,000 sats");return}return a})(),defaultAmount:(()=>{const r=this.getAttribute("default-amount");if(!r)return 21;const a=Number(r);return isNaN(a)||a<=0||a>21e4?(console.error("Nostr-Components: Zap button: Max zap amount: 210,000 sats"),21):a})(),url:this.getAttribute("url")||void 0,anon:!1}),this.zapActionStatus.set(N.Ready)}catch(n){this.zapActionStatus.set(N.Error,(n==null?void 0:n.message)||"Unable to zap")}finally{this.render()}}}async handleHelpClick(){try{await nn(this.theme==="dark"?"dark":"light")}catch(n){console.error("Error showing help dialog:",n)}}async handleZappersClick(){if(this.cachedZapDetails.length!==0)try{await sn({zapDetails:this.cachedZapDetails,theme:this.theme==="dark"?"dark":"light"})}catch(n){console.error("Nostr-Components: Zap button: Error opening zappers dialog",n)}}attachDelegatedListeners(){this.delegateEvent("click",".nostr-zap-button",n=>{var o,r;(o=n.preventDefault)==null||o.call(n),(r=n.stopPropagation)==null||r.call(n),this.handleZapClick()}),this.delegateEvent("click",".help-icon",n=>{var o,r;(o=n.preventDefault)==null||o.call(n),(r=n.stopPropagation)==null||r.call(n),this.handleHelpClick()}),this.delegateEvent("click",".total-zap-amount",n=>{var o,r;(o=n.preventDefault)==null||o.call(n),(r=n.stopPropagation)==null||r.call(n),this.handleZappersClick()})}async updateZapCount(){if(this.user)try{this.zapListStatus.set(N.Loading),this.render(),await this.ensureNostrConnected();const n=await oe({pubkey:this.user.pubkey,relays:this.getRelays(),url:this.getAttribute("url")||void 0});this.totalZapAmount=n.totalAmount,this.cachedZapDetails=n.zapDetails,this.zapListStatus.set(N.Ready)}catch(n){console.error("Nostr-Components: Zap button: Failed to fetch zap count",n),this.totalZapAmount=null,this.zapListStatus.set(N.Error)}finally{this.render()}}renderContent(){const n=this.userStatus.get()==N.Loading,o=this.zapListStatus.get()==N.Loading,r=this.computeOverall()===N.Error,a=this.errorMessage,s=this.getAttribute("text")||"Zap",i={isLoading:n,isAmountLoading:o,isError:r,isSuccess:!1,errorMessage:a,buttonText:s,totalZapAmount:this.totalZapAmount,hasZaps:this.cachedZapDetails.length>0};this.shadowRoot.innerHTML=`
|
|
691
|
+
${hn()}
|
|
692
|
+
${dn(i)}
|
|
693
|
+
`}}customElements.define("nostr-zap",mn);
|
|
694
694
|
//# sourceMappingURL=nostr-zap.es.js.map
|