@popgrids/embed 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/auth-join/auth-join.component.ts","../src/components/auth-join/auth-join.styles.ts","../src/components/auth-join/auth-join.ts","../src/components/auth-panel/auth-panel.component.ts","../src/context/auth_context.ts","../src/components/auth-panel/auth-panel.styles.ts","../src/components/auth-panel/auth-panel.ts","../src/components/auth-provider/auth-provider.component.ts","../src/context/api_context.ts","../src/components/auth-provider/auth-provider.styles.ts","../src/components/auth-provider/auth-provider.ts","../src/components/auth-sign-in/auth-sign-in.component.ts","../src/components/auth-sign-in/auth-sign-in.styles.ts","../src/components/auth-sign-in/auth-sign-in.ts","../src/components/auth-verify-code/auth-verify-code.component.ts","../src/components/auth-verify-code/auth-verify-code.styles.ts","../src/components/auth-verify-code/auth-verify-code.ts","../src/components/comment-bar/comment-bar.component.ts","../src/components/comment-bar/comment-bar.styles.ts","../src/components/comment-bar/comment-bar.ts","../src/components/comment-input/comment-input.component.ts","../src/context/grid_context.ts","../src/components/comment-input/comment-input.styles.ts","../src/components/comment-input/comment-input.ts","../src/components/comment-thread/comment-thread.component.ts","../src/components/comment-thread/comment-thread.styles.ts","../src/components/comment-thread/comment-thread.ts","../src/components/comment/comment.component.ts","../src/helpers/time.ts","../src/components/comment/comment.styles.ts","../src/components/comment/comment.ts","../src/components/feed/feed.component.ts","../src/components/feed/feed.styles.ts","../src/components/feed/feed.ts","../src/components/grid-provider/grid-provider.component.ts","../src/components/grid-provider/grid-provider.ts","../src/components/grid/grid.component.ts","../src/components/grid/grid.styles.ts","../src/components/grid/grid.ts","../src/components/widget/widget.component.ts","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../../../node_modules/composed-offset-position/dist/composed-offset-position.mjs","../src/components/widget/widget.styles.ts","../src/components/widget/widget.ts","../src/components/api-provider/api-provider.component.ts","../src/services/api-client.ts","../src/components/api-provider/api-provider.ts"],"sourcesContent":["import { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\nimport { classMap } from \"lit/directives/class-map.js\";\nimport styles from \"./auth-join.styles\";\n\n/**\n * @summary Auth join button that displays \"Join the Conversation\" with the Popgrids logo.\n * @status experimental\n * @since 0.0.1\n *\n * @event pop-click - Emitted when the button is clicked.\n *\n * @csspart base - The component's base wrapper.\n */\n@customElement(\"pop-auth-join\")\nexport class PopAuthJoin extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n handleClick() {\n this.emit(\"pop-click\");\n }\n\n render() {\n return html` <button\n class=${classMap({\n \"auth-join\": true,\n })}\n part=\"base\"\n type=\"button\"\n @click=${this.handleClick}\n >\n <div class=\"auth-join__actions\">\n Join the Conversation\n <svg\n class=\"auth-join__logo\"\n width=\"75\"\n height=\"12\"\n viewBox=\"0 0 75 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.58333 0.265686C1.0463 0.265686 0 2.5714 0 5.47711C0 6.55283 0.115741 7.6114 0.25 8.67426C0.300926 9.08997 0.282407 9.54854 0.365741 9.96426C0.583333 11.0571 1.69444 11.5628 2.77315 11.5628C4.25 11.5628 5.23148 10.7014 5.23148 9.3214C5.23148 8.52426 4.94907 8.0014 4.13426 7.69283C4.08333 7.67569 4.03241 7.66283 4.03241 7.59854C4.03241 7.4914 4.21759 7.41426 4.33333 7.41426C4.73148 7.41426 5.36111 7.78283 5.91204 7.78283C8.06944 7.78283 9.26389 5.86283 9.26389 4.06283C9.26389 1.44854 7.18518 0.265686 4.58333 0.265686ZM4.56481 5.91854C4.43056 5.91854 4.31481 5.8114 4.31481 5.68711C4.31481 5.51997 4.56481 5.39569 4.64815 5.25854C4.8287 4.94997 4.87963 4.42711 4.87963 4.07569C4.87963 3.65997 4.76389 2.89283 4.48148 2.58426C4.39815 2.49426 4.28241 2.44711 4.28241 2.32283C4.28241 2.19854 4.41667 2.0914 4.5463 2.0914C5.11111 2.0914 5.39352 3.62997 5.39352 4.02854C5.39352 4.45711 5.24537 5.91854 4.56481 5.91854Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M14.9259 0.527108C11.4074 0.527108 9.2963 2.83282 9.2963 5.99568C9.2963 9.15854 11.4028 11.4643 14.9259 11.4643C18.4491 11.4643 20.537 9.12854 20.537 5.99568C20.537 2.86282 18.412 0.527108 14.9259 0.527108ZM15.0787 9.89997C15.0232 9.96425 14.912 10.0843 14.7778 10.0843C14.6435 10.0843 14.5139 9.97711 14.5139 9.85282C14.5139 9.80568 14.9445 9.20568 15.0139 9.02139C15.2778 8.29711 15.3287 7.51282 15.3287 6.74568C15.3287 5.71711 15.1296 4.39282 14.4491 3.54854C14.3148 3.39425 13.9028 3.10282 13.9028 2.93568C13.9028 2.81139 14.0185 2.70425 14.1528 2.70425C14.2685 2.70425 14.3843 2.79854 14.4676 2.85854C15.5278 3.67282 15.8472 5.53282 15.8472 6.74568C15.8472 7.69711 15.8056 9.08568 15.0833 9.89568L15.0787 9.89997Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M25.375 0.265686C21.838 0.265686 20.7917 2.5714 20.7917 5.47711C20.7917 6.55283 20.9074 7.6114 21.0417 8.67426C21.0926 9.08997 21.0741 9.54854 21.1574 9.96426C21.375 11.0571 22.4861 11.5628 23.5648 11.5628C25.0417 11.5628 26.0231 10.7014 26.0231 9.3214C26.0231 8.52426 25.7407 8.0014 24.9259 7.69283C24.875 7.67569 24.8241 7.66283 24.8241 7.59854C24.8241 7.4914 25.0092 7.41426 25.125 7.41426C25.5231 7.41426 26.1528 7.78283 26.7037 7.78283C28.8611 7.78283 30.0555 5.86283 30.0555 4.06283C30.0555 1.44854 27.9815 0.265686 25.375 0.265686ZM25.3611 5.91854C25.2268 5.91854 25.1111 5.8114 25.1111 5.68711C25.1111 5.51997 25.3611 5.39569 25.4444 5.25854C25.625 4.94997 25.6759 4.42711 25.6759 4.07569C25.6759 3.65997 25.5602 2.89283 25.2778 2.58426C25.1944 2.49426 25.0787 2.44711 25.0787 2.32283C25.0787 2.19854 25.213 2.0914 25.3426 2.0914C25.9074 2.0914 26.1898 3.62997 26.1898 4.02854C26.1898 4.45711 26.0417 5.91854 25.3611 5.91854Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M37.3843 4.81284C36.1898 4.81284 34.5278 5.31855 34.5278 6.64284C34.5278 7.39713 35.125 8.5157 36.0741 8.5157C36.6713 8.5157 37.0556 8.08713 37.2546 8.08713C37.3056 8.08713 37.3519 8.11713 37.3519 8.16427C37.3519 8.60998 36.4213 8.81141 36.0556 8.81141C34.7778 8.81141 34.0972 7.7957 34.0972 6.71998C34.0972 5.39998 35.4398 4.38427 36.8009 4.38427C37.1991 4.38427 37.6158 4.49141 38.0139 4.49141C39.1945 4.49141 40.0371 3.50998 40.0371 2.46427C40.0371 0.728554 37.8148 0.329982 36.3333 0.329982C32.3982 0.329982 30.1065 2.6957 30.1065 6.29141C30.1065 9.61284 31.9676 11.73 35.6528 11.73C38.0417 11.73 40.6482 10.7786 40.6482 8.19427C40.6482 6.42855 39.4028 4.81284 37.3796 4.81284H37.3843Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M48.3611 7.42711C48.0602 7.42711 47.8148 7.53426 47.5648 7.53426C47.5139 7.53426 47.5 7.48711 47.5 7.45712C47.5 7.34997 47.5509 7.30283 47.6342 7.27283C47.9167 7.18283 48.2176 7.11854 48.4954 6.99426C49.7592 6.4414 50.5046 5.45569 50.5046 4.15283C50.5046 1.79997 48.3287 0.372829 45.9398 0.372829C45.0741 0.372829 44.2315 0.604257 43.5 0.972829C41.5092 1.9714 41.125 3.40283 41.0092 5.35283C40.9583 6.11997 40.9583 6.8914 40.9583 7.65854V9.51854C40.9583 10.6843 41.787 11.6228 43.0972 11.6228C44.0416 11.6228 44.8889 10.9928 45.1065 10.1614C45.2222 9.66854 45.1574 9.08569 45.1574 8.60997C45.1574 8.56283 45.1759 8.54997 45.2222 8.54997C45.2685 8.54997 45.3241 8.57997 45.3565 8.59711C45.9398 9.90426 46.7361 11.5628 48.5417 11.5628C49.787 11.5628 50.8148 10.7485 50.8148 9.56569C50.8148 8.38283 49.6204 7.4314 48.3565 7.4314L48.3611 7.42711ZM45.6574 5.91854C45.5231 5.91854 45.4074 5.8114 45.4074 5.68711C45.4074 5.51997 45.6574 5.39569 45.7407 5.25854C45.9213 4.94997 45.9722 4.42711 45.9722 4.07569C45.9722 3.65997 45.8565 2.89283 45.5741 2.58426C45.4907 2.49426 45.3935 2.44711 45.3935 2.32283C45.3935 2.19854 45.5092 2.0914 45.6435 2.0914C46.2083 2.0914 46.4907 3.62997 46.4907 4.02854C46.4907 4.45711 46.3565 5.91854 45.662 5.91854H45.6574Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M54.8056 0.865677C54.4074 0.621391 53.8426 0.497105 53.3611 0.497105C52.3148 0.497105 51.4167 1.26425 51.3009 2.21996C51.2685 2.49853 51.2824 2.75996 51.2824 3.05139V5.66139L51.2315 8.41282V9.77996C51.2315 10.8557 52.2269 11.7 53.375 11.7C54.2222 11.7 55.1528 11.2071 55.4676 10.47C55.6482 10.0542 55.6667 9.47139 55.6667 9.02568V7.82568L55.6852 5.42996V3.03425C55.6852 2.14282 55.6667 1.43568 54.8056 0.865677Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M58.9445 0.402828C57.25 0.402828 56.4028 1.13997 56.4028 2.7214V3.3514L56.4213 4.59426V5.22426C56.4213 5.69997 56.4213 6.14568 56.4028 6.6214C56.3704 7.1914 56.287 7.75711 56.287 8.34426C56.287 10.4957 57.4815 11.5414 59.7917 11.5414C63.3426 11.5414 65.75 10.1271 65.75 6.60854C65.75 2.36568 63.5417 0.398542 58.9445 0.398542V0.402828ZM60.537 8.9014C60.4028 8.9014 60.287 8.79426 60.287 8.66997C60.287 8.62283 60.3056 8.59283 60.338 8.54568C60.7685 7.88568 60.8843 6.96426 60.8843 6.20997C60.8843 5.50283 60.8009 4.45711 60.3194 3.90426C60.2361 3.77997 60.0695 3.68997 60.0695 3.53569C60.0695 3.4114 60.1852 3.30426 60.3194 3.30426C60.5694 3.30426 60.9167 3.88711 61.0185 4.08854C61.3333 4.76569 61.3843 5.50283 61.3843 6.22283C61.3843 6.66854 61.1343 8.89711 60.537 8.89711V8.9014Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M73.5046 5.85855C72.5417 5.78141 71.162 5.47284 70.4167 4.88998C70.3194 4.81284 70.1528 4.7057 70.1528 4.56855C70.1528 4.52141 70.1713 4.44427 70.2361 4.44427C70.4167 4.44427 71.5787 5.3057 72.5787 5.3057C73.8426 5.3057 75 4.39713 75 3.20141C75 1.23427 72.1806 0.437125 70.4676 0.437125C67.9259 0.437125 66.037 1.95855 66.037 4.37141C66.037 4.89427 66.1204 5.61427 66.537 6.01713C66.7361 6.21855 67.0694 6.21855 67.3333 6.21855C68.3287 6.21855 69.5926 6.50998 70.1204 7.35427C70.1713 7.43141 70.2176 7.5557 70.2176 7.6457C70.2176 7.6757 70.2176 7.72284 70.1852 7.7057C70.088 7.6757 70.0046 7.59855 69.9352 7.53855C69.3519 7.0157 68.5555 6.49284 67.713 6.49284C66.4491 6.49284 66.0046 7.6157 66.0046 8.59713C66.0046 10.5771 67.9306 11.67 69.8889 11.67C72.213 11.67 75 10.2557 75 7.84284C75 6.95141 74.5833 5.95284 73.5046 5.86284V5.85855Z\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n </button>`;\n }\n}\n","import { css, unsafeCSS } from \"lit\";\nimport swirlingOvals from \"../../assets/images/swirling-ovals.gif\";\n\nexport default css`\n :host {\n display: flex;\n width: 100%;\n }\n\n .auth-join {\n background-image: url(\"${unsafeCSS(swirlingOvals)}\"), none;\n background-color: lightgray;\n background-position: 79% center;\n background-size:\n 8.215% 59.149%,\n auto;\n background-repeat: no-repeat, repeat;\n background-color: var(--color-surface-bg-default, #fff);\n border: none;\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n gap: var(--spacing-sm, 6px);\n justify-content: flex-end;\n padding: var(--spacing-xl, 16px) var(--spacing-md, 8px);\n width: 100%;\n }\n\n .auth-join__actions {\n color: var(--color-text-text-default, #000);\n font-feature-settings:\n \"liga\" off,\n \"clig\" off;\n display: flex;\n padding: 0px var(--spacing-md, 8px);\n justify-content: space-between;\n align-items: center;\n align-self: stretch;\n font-size: var(--text-widget-base);\n line-height: var(--text-widget-base--line-height);\n letter-spacing: var(--text-widget-base--letter-spacing);\n font-weight: 600;\n }\n\n .auth-join__logo {\n display: flex;\n width: 75px;\n height: 12px;\n padding: 0px var(--spacing-none, 0px);\n flex-direction: column;\n justify-content: center;\n align-items: center;\n color: var(--color-text-text-default, #000);\n }\n`;\n","import { PopAuthJoin } from \"./auth-join.component.js\";\n\nexport * from \"./auth-join.component.js\";\nexport default PopAuthJoin;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-auth-join\": PopAuthJoin;\n }\n}\n","import { consume } from \"@lit/context\";\nimport { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, query, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\n\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { type AuthState, authContext } from \"../../context/auth_context\";\nimport styles from \"./auth-panel.styles\";\n\n/**\n * @summary Authentication panel component that handles user authentication flows.\n * @status experimental\n * @since 0.0.1\n *\n * @description\n * The auth panel provides a complete authentication experience with multiple states:\n * - Collapsed state showing a join button\n * - Sign-in form for email submission\n * - Code verification form for completing authentication\n * - Authenticated state display\n *\n * The panel automatically handles height transitions between states and\n * closes when clicking outside or pressing the Escape key.\n *\n * @event pop-success - Emitted when authentication is successful.\n *\n * @csspart base - The component's base wrapper.\n */\n@customElement(\"pop-auth-panel\")\nexport class PopAuthPanel extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n @consume({ context: authContext, subscribe: true })\n authContext?: AuthState;\n\n @query(\".auth-panel\") _authPanel!: HTMLElement;\n @query(\".auth-panel__content\") _authPanelContent!: HTMLElement;\n\n @state() private _email = \"\";\n @state() private _open = false;\n\n handleJoinClick() {\n this._open = true;\n }\n\n async connectedCallback() {\n super.connectedCallback();\n await this.updateComplete;\n document.addEventListener(\"mousedown\", this.handleDocumentMouseDown);\n document.addEventListener(\"keydown\", this.handleKeyDown);\n this.setupResizeObserver();\n }\n\n disconnectedCallback() {\n document.removeEventListener(\"mousedown\", this.handleDocumentMouseDown);\n document.removeEventListener(\"keydown\", this.handleKeyDown);\n this._resizeObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n private _resizeObserver: ResizeObserver | null = null;\n\n private setupResizeObserver() {\n // Create ResizeObserver to watch for content height changes\n this._resizeObserver = new ResizeObserver((entries) => {\n // We need to schedule this after the current rendering cycle\n requestAnimationFrame(() => {\n for (const entry of entries) {\n // Only apply the height from the content div to the panel\n if (entry.target === this._authPanelContent) {\n // Get the height of the content\n // We use offsetHeight instead of contentRect for more accurate measurement\n const contentHeight = this._authPanelContent.offsetHeight;\n\n // When not open, set to default closed height\n if (!this._open) {\n this._authPanel.style.height = \"50px\";\n } else {\n // Otherwise set to content height\n this._authPanel.style.height = `${contentHeight}px`;\n }\n }\n }\n });\n });\n\n // Start observing the content div\n if (this._authPanelContent) {\n this._resizeObserver.observe(this._authPanelContent);\n }\n }\n\n updated(changedProperties: Map<PropertyKey, unknown>) {\n super.updated(changedProperties);\n\n // Re-measure on important property changes\n if (changedProperties.has(\"_open\") || changedProperties.has(\"authContext\")) {\n // If we're closing the panel, explicitly set height to closed state\n if (changedProperties.has(\"_open\") && !this._open) {\n this._authPanel.style.height = \"50px\";\n } else if (this._open && this._authPanelContent) {\n // If opening, update the height to match content\n requestAnimationFrame(() => {\n const contentHeight = this._authPanelContent.offsetHeight;\n this._authPanel.style.height = `${contentHeight}px`;\n });\n }\n\n // Ensure observer is set up\n if (!this._resizeObserver && this._authPanelContent) {\n this.setupResizeObserver();\n }\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === \"Escape\") {\n this._open = false;\n }\n };\n\n private handleDocumentMouseDown = (event: MouseEvent) => {\n if (!this._open) return;\n\n // Close when clicking outside\n const path = event.composedPath();\n\n if (this && !path.includes(this._authPanel)) {\n this._open = false;\n }\n };\n\n private handleSignInSuccess(event: CustomEvent) {\n if (event.detail?.email) {\n this._email = event.detail.email;\n }\n }\n\n private handleCodeVerificationSuccess() {\n this._open = false;\n }\n\n // Render the authenticated state\n private renderAuthenticated() {\n return html`Authenticated`;\n }\n\n // Render the join button when panel is closed\n private renderJoinButton() {\n return html`<pop-auth-join @pop-click=${this.handleJoinClick}></pop-auth-join>`;\n }\n\n // Render the sign in form\n private renderSignInForm() {\n return html`<pop-auth-sign-in @pop-success=${this.handleSignInSuccess}></pop-auth-sign-in>`;\n }\n\n // Render the code verification form\n private renderVerifyCodeForm() {\n return html`\n <pop-auth-verify-code\n email=${ifDefined(this._email)}\n @pop-success=${this.handleCodeVerificationSuccess}\n ></pop-auth-verify-code>\n `;\n }\n\n // Render unauthenticated state based on panel state\n private renderUnauthenticated() {\n if (!this._open) {\n return this.renderJoinButton();\n }\n\n return this.authContext?.isVerifying ? this.renderVerifyCodeForm() : this.renderSignInForm();\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n \"auth-panel\": true,\n \"auth-panel--is-open\": this._open,\n })}\n >\n <div class=\"auth-panel__content\">\n ${this.authContext?.isAuthenticated ? this.renderAuthenticated() : this.renderUnauthenticated()}\n </div>\n </div>\n `;\n }\n}\n","import { createContext } from \"@lit/context\";\nimport type { Account } from \"../types/models\";\n\n/**\n * Interface for the sign-in response data\n */\nexport interface SignInResponse {\n msg: string;\n message: string;\n email: string;\n expires: string;\n}\n\nexport interface AuthState {\n currentAccount: Account | null;\n error: Error | null;\n isAuthenticated: boolean;\n isVerifying: boolean;\n signIn: (credentials: { email: string }) => Promise<SignInResponse>;\n signOut: () => void;\n token: string | null;\n verificationExpiresAt: string | null;\n verifyCode: (code: string, email: string) => Promise<void>;\n}\n\nexport const authContext = createContext<AuthState>(Symbol(\"pop-auth-context\"));\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: flex;\n width: 100%;\n }\n\n .auth-panel {\n display: flex;\n border-top: 1px solid var(--color-surface-alpha-singular-alpha-input-bar, rgba(0, 0, 32, 0.04));\n flex-direction: column;\n height: 50px;\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n transition: height 150ms ease-in-out;\n width: 100%;\n overflow: hidden;\n background-color: var(--color-surface-bg-default, #fff);\n backdrop-filter: blur(var(--blur-2xl));\n }\n\n .auth-panel--is-open {\n /* Dynamic height will be set via JS */\n /* The max-height provides a constraint */\n max-height: 340px;\n transition: height var(--duration-quick) var(--ease-quick);\n }\n\n .auth-panel__content {\n position: relative;\n top: 0;\n left: 0;\n right: 0;\n\n display: flex;\n flex-direction: column;\n width: 100%;\n }\n`;\n","import { PopAuthPanel } from \"./auth-panel.component.js\";\n\nexport * from \"./auth-panel.component.js\";\nexport default PopAuthPanel;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-auth-panel\": PopAuthPanel;\n }\n}\n","import { consume, provide } from \"@lit/context\";\nimport { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\n\nimport { type ApiState, apiContext } from \"../../context/api_context\";\nimport { type AuthState, type SignInResponse, authContext } from \"../../context/auth_context\";\nimport type { Account } from \"../../types/models\";\nimport styles from \"./auth-provider.styles\";\n\nconst AUTH_TOKEN_KEY = \"popgrids_token\";\n\n/**\n * @summary A component for managing authentication state and providing authentication methods.\n * @status experimental\n * @since 0.0.1\n *\n * @slot - The default slot.\n *\n * @csspart base - The component's base wrapper.\n */\n@customElement(\"pop-auth-provider\")\nexport class PopAuthProvider extends PopElement {\n static styles: CSSResultGroup = [styles];\n\n @consume({ context: apiContext })\n apiState?: ApiState;\n\n @state()\n private error: Error | null = null;\n\n @state()\n private isAuthenticated = false;\n\n @state()\n private currentAccount: Account | null = null;\n\n @state()\n private isVerifying = false;\n\n @state()\n private token: string | null = null;\n\n @state()\n private verificationExpiresAt: string | null = null;\n\n @provide({ context: authContext })\n @property({ attribute: false })\n contextData: AuthState = {\n currentAccount: null,\n error: null,\n isAuthenticated: false,\n isVerifying: false,\n signIn: this.signIn.bind(this),\n signOut: this.signOut.bind(this),\n token: null,\n verificationExpiresAt: null,\n verifyCode: this.verifyCode.bind(this),\n };\n\n connectedCallback() {\n super.connectedCallback();\n\n // Check for existing token in localStorage\n const savedToken = localStorage.getItem(AUTH_TOKEN_KEY);\n\n if (savedToken) {\n this.token = savedToken;\n this.fetchCurrentAccount();\n }\n }\n\n private async fetchCurrentAccount() {\n if (!this.token || !this.apiState?.client) return;\n\n console.log(\"fetchCurrentAccount\", this.token);\n\n try {\n const { data, error } = await this.apiState.client.GET(\"/api/v1/users/me\", {\n headers: {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n });\n\n if (error) {\n this.signOut();\n }\n\n if (data) {\n this.currentAccount = data as Account;\n this.isAuthenticated = true;\n this.updateContextData();\n } else {\n this.signOut();\n }\n } catch (error) {\n console.error(\"Failed to fetch current account:\", error);\n this.signOut();\n }\n }\n\n private async signIn(credentials: { email: string }): Promise<SignInResponse> {\n if (!this.apiState?.client) throw new Error(\"API client not available\");\n\n try {\n const { data, error } = await this.apiState.client.POST(\"/api/v1/session\", {\n params: {\n query: {\n email: credentials.email,\n },\n },\n });\n\n if (error) {\n this.error = error;\n this.updateContextData();\n }\n\n if (data) {\n this.isVerifying = true;\n this.verificationExpiresAt = (data as { expires: string }).expires;\n this.updateContextData();\n return data;\n }\n throw new Error(\"Authentication failed\");\n } catch (error) {\n console.error(\"Sign in failed:\", error);\n throw error;\n }\n }\n\n private async verifyCode(code: string, email: string) {\n if (!this.apiState?.client) return;\n\n try {\n const { data, error } = await this.apiState.client.PUT(\"/api/v1/session\", {\n params: {\n query: {\n code,\n email,\n },\n },\n });\n\n if (error) {\n this.error = error;\n this.updateContextData();\n }\n\n if (data) {\n this.token = `${(data as { token: string }).token}`;\n localStorage.setItem(AUTH_TOKEN_KEY, this.token);\n this.isVerifying = false;\n this.verificationExpiresAt = null;\n await this.fetchCurrentAccount();\n } else {\n throw new Error(\"Verification failed\");\n }\n } catch (error) {\n console.error(\"Verification failed:\", error);\n throw error;\n }\n }\n\n private signOut() {\n this.token = null;\n this.currentAccount = null;\n this.isAuthenticated = false;\n this.isVerifying = false;\n this.verificationExpiresAt = null;\n localStorage.removeItem(AUTH_TOKEN_KEY);\n this.updateContextData();\n }\n\n private updateContextData() {\n this.contextData = {\n ...this.contextData,\n error: this.error,\n isAuthenticated: this.isAuthenticated,\n isVerifying: this.isVerifying,\n currentAccount: this.currentAccount,\n token: this.token,\n verificationExpiresAt: this.verificationExpiresAt,\n };\n }\n\n render() {\n return html`<slot part=\"base\"></slot>`;\n }\n}\n","import { createContext } from \"@lit/context\";\nimport type { Client } from \"openapi-fetch\";\nimport type { paths } from \"../types/api-types\";\n\nexport interface ApiState {\n baseUrl: string;\n client: Client<paths> | null;\n}\n\nexport const apiContext = createContext<ApiState>(Symbol(\"pop-api-context\"));\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: block;\n }\n`;\n","import { PopAuthProvider } from \"./auth-provider.component.js\";\n\nexport * from \"./auth-provider.component.js\";\nexport default PopAuthProvider;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-auth-provider\": PopAuthProvider;\n }\n}\n","import { consume } from \"@lit/context\";\nimport { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\n\nimport appleIconSrc from \"../../assets/images/apple.png\";\nimport googleIconSrc from \"../../assets/images/google.png\";\nimport { AuthState, SignInResponse, authContext } from \"../../context/auth_context\";\nimport styles from \"./auth-sign-in.styles\";\n\nconst googleIcon = googleIconSrc;\nconst appleIcon = appleIconSrc;\n/**\n * @summary A sign-in component that provides email and social authentication options.\n * @description\n * The PopAuthSignIn component provides a comprehensive authentication interface with:\n * - Email-based authentication with validation\n * - Social login options (Google and Apple)\n * - Loading states and error handling\n * - Responsive design with Popgrids branding\n *\n * @status stable\n * @since 0.0.1\n *\n * @dependency pop-logo - For displaying the Popgrids logo\n * @dependency pop-form-input-simple - For the email input field\n * @dependency pop-button-link - For the footer link\n *\n * @event pop-success - Emitted when authentication is successful. Detail contains {email: string, expires: string}\n * @event pop-error - Emitted when authentication fails. Detail contains {error: string, success: false}\n * @event pop-invalid - Emitted when form validation fails\n *\n * @csspart base - The component's base wrapper\n *\n * @cssproperty --auth-sign-in-width - Controls the width of the sign-in form\n * @cssproperty --auth-sign-in-padding - Controls the padding of the sign-in form\n */\n@customElement(\"pop-auth-sign-in\")\nexport class PopAuthSignIn extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n @consume({ context: authContext, subscribe: true })\n authContext?: AuthState;\n\n @state()\n private email = \"\";\n\n @state()\n private emailError = \"\";\n\n @state()\n private isSubmitting = false;\n\n @state()\n private isValid = false;\n\n private validateEmail(email: string): boolean {\n // We'll rely on the native validation + pattern instead of regex\n if (!email) {\n this.emailError = \"Please enter an email address\";\n this.isValid = false;\n return false;\n }\n return true;\n }\n\n private handleBlur() {\n if (this.email) {\n this.validateEmail(this.email);\n }\n }\n\n private handleEmailChange(e: Event) {\n this.email = (e.target as HTMLInputElement).value;\n if (this.email) {\n this.validateEmail(this.email);\n } else {\n this.emailError = \"\";\n this.isValid = false;\n }\n }\n\n private handleInvalid(e: CustomEvent) {\n const { valid, validationMessage, validity } = e.detail;\n // Handle validation state\n if (!valid) {\n console.log(\"Validation failed:\", validationMessage);\n // Check specific validation issues\n if (validity.typeMismatch) {\n console.log(\"Invalid email format\");\n }\n if (validity.patternMismatch) {\n console.log(\"Pattern mismatch\");\n }\n }\n\n this.isValid = valid;\n }\n\n private async handleSubmit(e: Event) {\n e.preventDefault();\n\n if (!this.validateEmail(this.email) || this.isSubmitting) {\n return;\n }\n\n if (!this.authContext?.signIn) {\n throw new Error(\"Authentication context not available\");\n }\n\n this.isSubmitting = true;\n\n try {\n const response = await this.authContext.signIn({ email: this.email });\n this.onSuccess(response);\n } catch (error) {\n this.onFailure();\n } finally {\n this.isSubmitting = false;\n }\n }\n\n private onSuccess(response: SignInResponse) {\n this.emit(\"pop-success\", {\n email: response.email,\n expires: response.expires,\n });\n }\n\n private onFailure() {\n console.log(\"failure\");\n\n this.emit(\"pop-error\", {\n error: \"Creating a session failed\",\n success: false,\n });\n }\n\n render() {\n return html`<div\n class=${classMap({\n \"auth-sign-in\": true,\n })}\n part=\"base\"\n >\n <form class=\"auth-sign-in__form\" @submit=${this.handleSubmit}>\n <pop-logo variant=\"logo\" theme=\"white\" style=\"width: 100px; height: 16px;\"></pop-logo>\n <h2 class=\"auth-sign-in__title\">Small communities, big connections 👋</h2>\n <pop-form-input-simple\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n aria-describedby=\"email-error\"\n autocomplete=\"off\"\n errorMessage=${this.emailError}\n name=\"email\"\n type=\"email\"\n placeholder=\"Email\"\n pattern=\"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9-]+.[a-zA-Z]{2,}\"\n .value=${this.email}\n .disabled=${this.isSubmitting}\n ?required=${true}\n ?error=${!!this.emailError}\n @input=${this.handleEmailChange}\n @blur=${this.handleBlur}\n @pop-invalid=${this.handleInvalid}\n ></pop-form-input-simple>\n <pop-button\n class=\"auth-sign-in__submit-button\"\n theme=\"brand\"\n variant=\"primary\"\n current\n ?disabled=${this.isSubmitting || !this.isValid}\n >\n ${this.isSubmitting ? \"Submitting...\" : \"Continue\"}\n </pop-button>\n </form>\n <div class=\"auth-sign-in__social-login\">\n <button class=\"auth-sign-in__google-icon\" type=\"button\">\n <img src=${googleIcon} alt=\"Google\" />\n </button>\n <button class=\"auth-sign-in__apple-icon\" type=\"button\">\n <img src=${appleIcon} alt=\"Apple\" />\n </button>\n </div>\n <div class=\"auth-sign-in__footer\">\n <pop-button-link ?primary=${true} size=\"sm\">What's Popgrids?</pop-button-link>\n </div>\n </div>`;\n }\n}\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: block;\n }\n\n .auth-sign-in {\n display: flex;\n padding: var(--spacing-2xl, 20px) var(--spacing-3xl, 24px);\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--spacing-xl, 16px);\n }\n\n .auth-sign-in__footer {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xl, 16px);\n font-size: var(--text-widget-base);\n line-height: var(--text-widget-base--line-height);\n letter-spacing: var(--text-widget-base--letter-spacing);\n font-weight: 500;\n }\n\n .auth-sign-in__form {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xl, 16px);\n justify-content: center;\n align-items: center;\n width: 100%;\n }\n\n .auth-sign-in__apple-icon,\n .auth-sign-in__google-icon {\n border: none;\n background-color: transparent;\n display: flex;\n width: 32px;\n height: 32px;\n justify-content: center;\n align-items: center;\n transition: transform 300ms ease-out;\n }\n\n .auth-sign-in__apple-icon:hover,\n .auth-sign-in__google-icon:hover {\n transform: scale(1.125);\n }\n\n .auth-sign-in__social-login {\n display: flex;\n padding: 0px var(--spacing-2xl, 20px);\n justify-content: center;\n align-items: center;\n gap: var(--spacing-4xl, 32px);\n align-self: stretch;\n }\n\n .auth-sign-in__title {\n font-size: var(--text-widget-base);\n line-height: var(--text-widget-base--line-height);\n letter-spacing: var(--text-widget-base--letter-spacing);\n font-weight: 600;\n }\n\n .auth-sign-in__submit-button {\n width: 100%;\n height: 40px;\n color: var(--color-text-text-default);\n }\n\n .auth-sign-in__email-input {\n width: 100%;\n height: 40px;\n color: var(--color-text-text-default);\n }\n`;\n","import { PopAuthSignIn } from \"./auth-sign-in.component.js\";\n\nexport * from \"./auth-sign-in.component.js\";\nexport default PopAuthSignIn;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-auth-sign-in\": PopAuthSignIn;\n }\n}\n","import { consume } from \"@lit/context\";\nimport { PopCodeInputField, PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, property, query, queryAll, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\n\nimport { when } from \"lit/directives/when.js\";\nimport { authContext, type AuthState } from \"../../context/auth_context\";\nimport styles from \"./auth-verify-code.styles\";\n\n/**\n * @summary Code verification component for authentication.\n * @status experimental\n * @since 0.0.1\n *\n * @event pop-success - Emitted when code verification is successful.\n *\n * @slot - The default slot.\n *\n * @csspart base - The component's base wrapper.\n */\n@customElement(\"pop-auth-verify-code\")\nexport class PopAuthVerifyCode extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n @consume({ context: authContext, subscribe: true })\n authContext?: AuthState;\n\n @property({ type: String })\n email = \"\";\n\n @state()\n private code = \"\";\n\n @state()\n private isSubmitting = false;\n\n @state()\n private error = \"\";\n\n @state()\n private _showingHelp = false;\n\n @state()\n private _showingToast = false;\n\n @state()\n private _toastMessage = \"\";\n\n @query('input[name=\"code\"]')\n private hiddenInput!: HTMLInputElement;\n\n @queryAll(\"pop-code-input-field\")\n private codeInputs!: NodeListOf<PopCodeInputField>;\n\n // Helper method to safely access codeInputs elements\n private getCodeInput(index: number): PopCodeInputField | undefined {\n return this.codeInputs[index];\n }\n\n private closeToast() {\n this._showingToast = false;\n }\n\n private handleContactSupport() {\n console.log(\"handleContactSupport\");\n }\n\n private async handleResendCode() {\n console.log(\"handleResendCode\");\n try {\n const response = await this.authContext?.signIn({ email: this.email });\n this._showingHelp = false;\n } catch (error) {\n console.error(error);\n } finally {\n this.isSubmitting = false;\n }\n }\n\n private handleInput(event: Event) {\n const input = event.target as HTMLInputElement;\n const isDigit = /^\\d$/.test(input.value);\n\n // Update only if it's a digit or empty\n if (isDigit || input.value === \"\") {\n // Focus next input if current input is filled with a digit\n if (isDigit) {\n const currentIndex = Array.from(this.codeInputs).indexOf(event.currentTarget as PopCodeInputField);\n if (currentIndex < this.codeInputs.length - 1) {\n const nextInput = this.getCodeInput(currentIndex + 1);\n nextInput?.focus();\n }\n }\n\n this.updateCodeValue();\n } else {\n // Reset to empty if not a digit\n input.value = \"\";\n }\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n const input = event.target as HTMLInputElement;\n const currentIndex = Array.from(this.codeInputs).indexOf(event.currentTarget as PopCodeInputField);\n\n // Handle backspace\n if (event.key === \"Backspace\") {\n if (input.value === \"\" && currentIndex > 0) {\n const prevInput = this.getCodeInput(currentIndex - 1);\n prevInput?.focus();\n prevInput?.select();\n }\n }\n\n // Handle left/right arrow keys\n if (event.key === \"ArrowLeft\" && currentIndex > 0) {\n const prevInput = this.getCodeInput(currentIndex - 1);\n prevInput?.focus();\n prevInput?.select();\n }\n\n if (event.key === \"ArrowRight\" && currentIndex < this.codeInputs.length - 1) {\n const nextInput = this.getCodeInput(currentIndex + 1);\n nextInput?.focus();\n nextInput?.select();\n }\n }\n\n private handleFocus(event: FocusEvent) {\n (event.target as HTMLInputElement).select();\n }\n\n private showToast(message: string) {\n this._showingToast = true;\n this._toastMessage = message;\n }\n\n private toggleHelp() {\n this._showingHelp = !this._showingHelp;\n console.log(\"handleNeedHelpClick\");\n }\n\n private handleSubmit(event: Event) {\n event.preventDefault();\n this.submitForm();\n }\n\n private handlePaste(event: ClipboardEvent) {\n event.preventDefault();\n\n const clipboardData = event.clipboardData;\n if (!clipboardData) return;\n\n const pastedText = clipboardData.getData(\"text\");\n const digits = pastedText.replace(/\\D/g, \"\").substring(0, this.codeInputs.length).split(\"\");\n\n // Fill inputs with pasted digits\n digits.forEach((digit, index) => {\n if (index < this.codeInputs.length) {\n const input = this.getCodeInput(index);\n if (input) input.value = digit;\n }\n });\n\n // Focus the next empty input or the last one if all filled\n const nextEmptyIndex = Array.from(this.codeInputs).findIndex((input) => !input.value);\n const focusIndex = nextEmptyIndex !== -1 ? nextEmptyIndex : this.codeInputs.length - 1;\n const focusInput = this.getCodeInput(focusIndex);\n focusInput?.focus();\n\n // Update and check if form should be submitted\n this.updateCodeValue();\n }\n\n private updateCodeValue() {\n const values = Array.from(this.codeInputs).map((input) => input.value);\n this.code = values.join(\"\");\n\n if (this.hiddenInput) {\n this.hiddenInput.value = this.code;\n }\n\n // Check if all inputs have valid digits (full 6-digit code)\n const allFilled = values.length === 6 && values.every((value) => /^\\d$/.test(value));\n if (allFilled) {\n // Immediately submit the form when all fields are filled\n // Small timeout to ensure UI updates first\n setTimeout(() => this.submitForm(), 0);\n }\n }\n\n private async submitForm() {\n if (!this.authContext?.verifyCode || this.isSubmitting || !this.email || this.code.length !== 6) {\n return;\n }\n\n this.isSubmitting = true;\n this.error = \"\";\n\n try {\n await this.authContext.verifyCode(this.code, this.email);\n this.onSuccess();\n } catch (error) {\n this.onFailure();\n } finally {\n this.isSubmitting = false;\n }\n }\n\n private onSuccess() {\n this.emit(\"pop-success\");\n }\n\n private onFailure() {\n this.showToast(\"Verification failed. Please try again.\");\n\n // Reset input fields\n Array.from(this.codeInputs).forEach((input) => {\n input.value = \"\";\n });\n\n // Focus the first input\n if (this.codeInputs.length) {\n const firstInput = this.getCodeInput(0);\n firstInput?.focus();\n }\n\n this.code = \"\";\n }\n\n render() {\n return html`<div\n class=${classMap({\n \"auth-verify-code\": true,\n })}\n part=\"base\"\n >\n ${when(\n this._showingToast,\n () =>\n html`<pop-toast class=\"auth-verify-code__toast\" theme=\"transparent\" @pop-close=${this.closeToast}\n >${this._toastMessage}</pop-toast\n >`,\n )}\n ${when(\n !this._showingHelp,\n () => html`\n <form class=\"auth-verify-code__form\" @submit=${this.handleSubmit}>\n <input type=\"hidden\" name=\"code\" value=${this.code} />\n <h2 class=\"auth-verify-code__title\">Enter Verification Code</h2>\n <div class=\"auth-verify-code__code-input-fields\">\n <div class=\"auth-verify-code__code-input-group\">\n <pop-code-input-field\n name=\"code_1\"\n autofocus\n .disabled=${this.isSubmitting}\n @input=${this.handleInput}\n @keydown=${this.handleKeyDown}\n @focus=${this.handleFocus}\n @paste=${this.handlePaste}\n ></pop-code-input-field>\n <pop-code-input-field\n name=\"code_2\"\n .disabled=${this.isSubmitting}\n @input=${this.handleInput}\n @keydown=${this.handleKeyDown}\n @focus=${this.handleFocus}\n @paste=${this.handlePaste}\n ></pop-code-input-field>\n <pop-code-input-field\n name=\"code_3\"\n .disabled=${this.isSubmitting}\n @input=${this.handleInput}\n @keydown=${this.handleKeyDown}\n @focus=${this.handleFocus}\n @paste=${this.handlePaste}\n ></pop-code-input-field>\n </div>\n <div class=\"auth-verify-code__code-input-group\">\n <pop-code-input-field\n name=\"code_4\"\n .disabled=${this.isSubmitting}\n @input=${this.handleInput}\n @keydown=${this.handleKeyDown}\n @focus=${this.handleFocus}\n @paste=${this.handlePaste}\n ></pop-code-input-field>\n <pop-code-input-field\n name=\"code_5\"\n .disabled=${this.isSubmitting}\n @input=${this.handleInput}\n @keydown=${this.handleKeyDown}\n @focus=${this.handleFocus}\n @paste=${this.handlePaste}\n ></pop-code-input-field>\n <pop-code-input-field\n name=\"code_6\"\n .disabled=${this.isSubmitting}\n @input=${this.handleInput}\n @keydown=${this.handleKeyDown}\n @focus=${this.handleFocus}\n @paste=${this.handlePaste}\n ></pop-code-input-field>\n </div>\n </div>\n\n <div class=\"auth-verify-code__body\">\n <p>A verification code has been sent to your email. Enter code to continue.</p>\n <p>\n Code expires in\n <pop-timestamp-countdown>${this.authContext?.verificationExpiresAt}</pop-timestamp-countdown>.\n </p>\n </div>\n\n <div class=\"auth-verify-code__footer\">\n <pop-button-link size=\"sm\" theme=\"default\" ?primary=${true} @click=${this.toggleHelp}>\n No verification code?\n </pop-button-link>\n </div>\n </form>\n `,\n () => html`\n <div class=\"auth-verify-code__help\">\n <h2 class=\"auth-verify-code__title\">Steps to Take</h2>\n <div class=\"auth-verify-code__body\">\n <ul>\n <li><strong>Check spam/junk</strong> – it might be there.</li>\n <li><strong>Verify email</strong> – check your email for typos.</li>\n <li><strong>Wait a moment</strong> – emails take a few mins.</li>\n <li><strong>Whitelist us</strong> – it may be blocked.</li>\n </ul>\n </div>\n <div class=\"auth-verify-code__footer\">\n <pop-button-link size=\"sm\" theme=\"default\" @click=${this.handleContactSupport}>\n Contact Support\n </pop-button-link>\n <pop-button-link size=\"sm\" theme=\"default\" ?primary=${true} @click=${this.handleResendCode}>\n Resend Code\n </pop-button-link>\n </div>\n </div>\n `,\n )}\n </div>`;\n }\n}\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: block;\n }\n\n .auth-verify-code {\n display: flex;\n padding: var(--spacing-2xl, 20px) var(--spacing-3xl, 24px);\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--spacing-xl, 16px);\n position: relative;\n }\n\n .auth-verify-code__toast {\n position: absolute;\n }\n\n .auth-verify-code__body {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--spacing-md, 8px);\n align-self: stretch;\n font-size: var(--text-xs);\n line-height: var(--text-xs--line-height);\n text-align: center;\n }\n\n .auth-verify-code__help .auth-verify-code__body {\n text-align: left;\n }\n\n .auth-verify-code__body strong {\n font-weight: 600;\n }\n\n .auth-verify-code__footer {\n display: flex;\n color: var(--color-text-text-default);\n justify-content: center;\n align-items: flex-start;\n gap: var(--spacing-2xl, 20px);\n }\n\n .auth-verify-code__form {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--spacing-xl, 16px);\n }\n\n .auth-verify-code__help {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--spacing-xl, 16px);\n }\n\n .auth-verify-code__title {\n font-size: var(--text-widget-base);\n line-height: var(--text-widget-base--line-height);\n letter-spacing: var(--text-widget-base--letter-spacing);\n font-weight: 600;\n }\n\n .auth-verify-code__code-input-fields {\n display: flex;\n justify-content: center;\n align-items: flex-start;\n gap: var(--spacing-xl, 16px);\n margin-bottom: var(--spacing-xs, 4px);\n }\n\n .auth-verify-code__code-input-group {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm, 6px);\n }\n`;\n","import { PopAuthVerifyCode } from \"./auth-verify-code.component.js\";\n\nexport * from \"./auth-verify-code.component.js\";\nexport default PopAuthVerifyCode;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-auth-verify-code\": PopAuthVerifyCode;\n }\n}\n","import { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\n\nimport styles from \"./comment-bar.styles\";\n\n/**\n * @summary Provides the ability to add comments to a grid.\n * @status experimental\n * @since 0.0.1\n *\n * @slot - The default slot.\n *\n * @csspart base - The component's base wrapper.\n */\n@customElement(\"pop-comment-bar\")\nexport class PopCommentBar extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n render() {\n return html`\n <div\n class=${classMap({\n \"comment-bar\": true,\n })}\n part=\"base\"\n >\n <div class=\"comment-bar__actions\">\n <div>\n <div class=\"comment-bar__avatars\">\n <pop-comment-avatar size=\"xs\" style=\"--comment-avatar-border-size: 2px\">\n <img src=\"https://i.pravatar.cc/90\" alt=\"User avatar\" />\n </pop-comment-avatar>\n <pop-comment-avatar size=\"xs\" style=\"--comment-avatar-border-size: 2px\">\n <img src=\"https://i.pravatar.cc/100\" alt=\"User avatar\" />\n </pop-comment-avatar>\n </div>\n </div>\n <pop-comment-input></pop-comment-input>\n <pop-comment-icon class=\"comment-bar__send-icon\" theme=\"neutral\" variant=\"send\" size=\"sm\"></pop-comment-icon>\n </div>\n </div>\n `;\n }\n}\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: block;\n }\n\n .comment-bar {\n align-items: flex-start;\n background: var(--color-border-singular-border-island);\n border-top: 1px solid var(--color-surface-alpha-alpha-input-bar);\n padding: var(--spacing-sm, 6px) var(--spacing-sm, 6px) var(--spacing-md, 8px) var(--spacing-sm, 6px);\n position: relative;\n transition: all var(--duration-quick) var(--ease-quick);\n }\n\n .comment-bar__actions {\n position: relative;\n display: grid;\n grid-template-columns: auto 1fr 0px;\n gap: 6px;\n align-items: start;\n transition: all var(--duration-quick) var(--ease-quick);\n }\n .comment-bar--has-content {\n grid-template-columns: auto 1fr 32px;\n }\n\n .comment-bar__avatars {\n display: flex;\n align-items: center;\n padding-top: 2px;\n }\n\n .comment-bar__avatars > *:not(:last-child) {\n margin-right: -4px;\n }\n\n .comment-bar__avatars > pop-comment-avatar {\n transition: transform var(--duration-pop-hover) var(--ease-pop-hover);\n }\n .comment-bar__avatars > pop-comment-avatar:hover {\n transform: scale(1.1875);\n }\n\n .comment-bar__send-icon {\n position: absolute;\n right: 0;\n bottom: 0.5px;\n transition: opacity var(--duration-150) var(--ease-linear);\n opacity: 0;\n }\n .comment-bar--has-content .comment-bar__send-icon {\n opacity: 1;\n }\n`;\n","import { PopCommentBar } from \"./comment-bar.component.js\";\n\nexport * from \"./comment-bar.component.js\";\nexport default PopCommentBar;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-comment-bar\": PopCommentBar;\n }\n}\n","import { computePosition, flip, offset, shift } from \"@floating-ui/dom\";\nimport { consume } from \"@lit/context\";\nimport { PopElement } from \"@popgrids/ui\";\nimport { Editor, mergeAttributes } from \"@tiptap/core\";\nimport Document from \"@tiptap/extension-document\";\nimport { Mention } from \"@tiptap/extension-mention\";\nimport Paragraph from \"@tiptap/extension-paragraph\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Text from \"@tiptap/extension-text\";\nimport Typography from \"@tiptap/extension-typography\";\nimport type { SuggestionKeyDownProps, SuggestionProps } from \"@tiptap/suggestion\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, property, query, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\n\nimport { type ApiState, apiContext } from \"../../context/api_context\";\nimport { type GridState, gridContext } from \"../../context/grid_context\";\nimport type { Account } from \"../../types/models\";\nimport styles from \"./comment-input.styles\";\n\ninterface MentionItem {\n id: string;\n label: string;\n href: string;\n}\n\ninterface MentionNodeAttrs {\n id: string;\n label: string;\n href: string;\n}\n\n/**\n * @summary A comment input component that allows users to input comments with mentions.\n * @status experimental\n * @since 0.0.1\n *\n * @event {string} pop-content-change - Emitted when the content changes.\n * @event {Error} pop-error - Emitted when an error occurs.\n *\n * @csspart base - The component's base wrapper.\n */\n@customElement(\"pop-comment-input\")\nexport class PopCommentInput extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n @consume({ context: apiContext, subscribe: true })\n apiState?: ApiState;\n\n @consume({ context: gridContext, subscribe: true })\n gridContext?: GridState;\n\n @property({ type: String })\n variant: \"text\" | \"search\" = \"text\";\n\n @query(\".comment-input__input\") _editor!: HTMLElement;\n\n @state() private _content = \"\";\n @state() private _error: Error | null = null;\n\n private editor?: Editor;\n\n private createMentionSuggestion() {\n return {\n items: async ({ query }: { query: string }) => {\n if (!query || query.trim().length === 0) {\n return [];\n }\n\n const client = this.apiState?.client;\n if (!client) return [];\n\n const { data, error } = await client.GET(\"/api/v1/accounts\", {\n params: {\n query: {\n by_name: query,\n },\n },\n });\n\n if (error) {\n return [];\n }\n\n if (data) {\n return (data as Account[]).map((account) => ({\n id: account.id,\n label: account.name,\n href: account.url,\n }));\n }\n return [];\n },\n\n render: () => {\n let command: (attrs: MentionNodeAttrs) => void;\n let popup: HTMLDivElement;\n let items: MentionItem[];\n let list: HTMLUListElement;\n let selectedIndex = 0;\n\n const updateSelection = () => {\n const listItems = list.querySelectorAll(\"li\");\n listItems.forEach((item, index) => {\n if (index === selectedIndex) {\n item.setAttribute(\"data-selected\", \"true\");\n } else {\n item.removeAttribute(\"data-selected\");\n }\n });\n\n if (listItems.length > 0) {\n popup.style.visibility = \"visible\";\n popup.style.opacity = \"1\";\n } else {\n popup.style.visibility = \"hidden\";\n popup.style.opacity = \"0\";\n }\n };\n\n const updatePopupPosition = async (coords: DOMRect) => {\n if (!popup || !coords) return;\n\n const virtualElement = {\n getBoundingClientRect() {\n return coords;\n },\n };\n\n const { x, y } = await computePosition(virtualElement, popup, {\n placement: \"top-start\",\n middleware: [\n offset(6), // Add some space between the cursor and popup\n flip(), // Flip to bottom if not enough space on top\n shift({ padding: 8 }), // Shift horizontally if needed, with padding from viewport edges\n ],\n });\n\n // Apply the positioning\n Object.assign(popup.style, {\n position: \"absolute\",\n left: `${x}px`,\n top: `${y}px`,\n });\n };\n\n const fadeOutAndRemove = () => {\n if (!popup) return;\n popup.style.opacity = \"0\";\n popup.style.visibility = \"hidden\";\n setTimeout(() => {\n popup?.remove();\n // Clean up references\n popup = undefined as unknown as HTMLDivElement;\n list = undefined as unknown as HTMLUListElement;\n }, 150); // Match transition duration\n };\n\n return {\n onStart: (props: SuggestionProps<MentionItem>) => {\n command = props.command;\n\n // Clean up any existing popup\n const existingPopup = this.shadowRoot?.querySelector(\".tiptap__mention-popup\");\n if (existingPopup) {\n existingPopup.remove();\n }\n\n popup = document.createElement(\"div\");\n popup.className = \"tiptap__mention-popup\";\n popup.style.opacity = \"0\";\n popup.style.transition = \"opacity 150ms ease-in-out\";\n popup.style.visibility = \"hidden\";\n this.shadowRoot?.appendChild(popup);\n\n items = props.items;\n if (items.length === 0) {\n popup.style.visibility = \"hidden\";\n popup.style.opacity = \"0\";\n return;\n }\n\n selectedIndex = 0;\n list = document.createElement(\"ul\");\n\n for (const item of items) {\n const listItem = document.createElement(\"li\");\n listItem.textContent = item.label;\n listItem.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n command({\n id: item.id,\n label: item.label,\n href: item.href,\n });\n fadeOutAndRemove();\n });\n list.appendChild(listItem);\n }\n\n popup.appendChild(list);\n updateSelection();\n\n const coords = props.clientRect?.();\n if (coords) {\n updatePopupPosition(coords);\n }\n },\n\n onUpdate: (props: SuggestionProps<MentionItem>) => {\n command = props.command;\n items = props.items;\n\n // Hide popup if no items\n if (items.length === 0) {\n popup.style.visibility = \"hidden\";\n popup.style.opacity = \"0\";\n return;\n }\n\n selectedIndex = 0;\n\n // Create new list if it doesn't exist\n if (!list) {\n list = document.createElement(\"ul\");\n popup.appendChild(list);\n } else {\n list.innerHTML = \"\";\n }\n\n for (const item of items) {\n const listItem = document.createElement(\"li\");\n listItem.textContent = item.label;\n listItem.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n command({\n id: item.id,\n label: item.label,\n href: item.href,\n });\n fadeOutAndRemove();\n });\n list.appendChild(listItem);\n }\n\n updateSelection();\n\n const coords = props.clientRect?.();\n if (coords) {\n updatePopupPosition(coords);\n }\n },\n\n onKeyDown: (props: SuggestionKeyDownProps) => {\n if (props.event?.key === \"Escape\") {\n fadeOutAndRemove();\n return true;\n }\n\n if (props.event?.key === \"ArrowDown\") {\n selectedIndex = (selectedIndex + 1) % items.length;\n updateSelection();\n return true;\n }\n\n if (props.event?.key === \"ArrowUp\") {\n selectedIndex = (selectedIndex - 1 + items.length) % items.length;\n updateSelection();\n return true;\n }\n\n if (props.event?.key === \"Enter\") {\n const selectedItem = items[selectedIndex];\n\n if (selectedItem) {\n command({\n id: selectedItem.id,\n label: selectedItem.label,\n href: selectedItem.href,\n });\n fadeOutAndRemove();\n return true;\n }\n }\n\n return false;\n },\n\n onExit: () => {\n fadeOutAndRemove();\n },\n };\n },\n };\n }\n\n async firstUpdated() {\n await this.updateComplete;\n this.initializeEditor();\n }\n\n disconnectedCallback() {\n this.editor?.destroy();\n super.disconnectedCallback();\n }\n\n private initializeEditor() {\n if (!this._editor) return;\n\n const suggestion = this.createMentionSuggestion();\n\n this.editor = new Editor({\n element: this._editor,\n content: this._content,\n editable: true,\n editorProps: {\n attributes: {\n class: \"tiptap__editor\",\n },\n },\n extensions: [\n Document,\n Mention.configure({\n HTMLAttributes: {\n class: \"tiptap__mention\",\n },\n renderText({ options, node }) {\n return `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`;\n },\n renderHTML({ options, node }) {\n return [\n \"a\",\n mergeAttributes({ href: `${node.attrs.href}` }, options.HTMLAttributes),\n `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`,\n ];\n },\n suggestion,\n }).extend({\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n return {\n \"data-id\": attributes.id,\n };\n },\n },\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-label\"),\n renderHTML: (attributes) => {\n return {\n \"data-label\": attributes.label,\n };\n },\n },\n href: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"href\"),\n renderHTML: (attributes) => {\n return {\n href: attributes.href,\n };\n },\n },\n };\n },\n }),\n Paragraph,\n Placeholder.configure({\n placeholder: \"Try mentioning someone using @ symbol\",\n }),\n Text,\n Typography,\n ],\n onUpdate: ({ editor }) => {\n this._content = editor.getHTML();\n this.emit(\"pop-content-change\", this._content);\n },\n });\n }\n\n render() {\n return html`<div\n class=${classMap({\n \"comment-input\": true,\n [`comment-input--variant-${this.variant}`]: true,\n \"comment-input--has-error\": !!this._error,\n })}\n part=\"base\"\n >\n <div class=\"comment-input__input\"></div>\n ${this._error ? html`<div class=\"comment-input__error\">${this._error.message}</div>` : \"\"}\n </div>`;\n }\n}\n","import { createContext } from \"@lit/context\";\nimport type { Comment, Grid } from \"../types/models\";\n\nexport interface GridState {\n comments: Comment[];\n fetchGrid: (id: string) => void;\n fetchReplies: (commentId: string) => void;\n grid: Grid | null;\n loading: boolean;\n selectedCommentId: string | null;\n selectComment: (commentId: string | null) => void;\n}\n\nexport const gridContext = createContext<GridState>(Symbol(\"pop-grid-context\"));\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: flex;\n position: relative;\n }\n\n .comment-input {\n display: flex;\n align-items: flex-end;\n justify-content: center;\n max-height: 280px;\n width: 100%;\n padding-top: 4px;\n padding-right: 8px;\n padding-bottom: 4px;\n padding-left: 12px;\n background-color: var(--color-surface-alpha-singular-alpha-input-bar);\n transition: all var(--duration-quick) var(--ease-quick);\n border-radius: 18px;\n min-height: 36px;\n flex: 1 0 0;\n }\n\n .comment-input--has-error {\n border-color: var(--color-border-conditional-border-error);\n background-color: var(--color-surface-alpha-alpha-error);\n }\n\n .comment-input__input {\n display: flex;\n padding: 5px 0;\n align-items: flex-end;\n gap: 2px;\n flex: 1 0 0;\n font-size: var(--text-widget-base);\n line-height: var(--text-widget-base--line-height);\n letter-spacing: var(--text-widget-base--letter-spacing);\n white-space: pre-wrap;\n }\n\n .tiptap__editor {\n color: var(--color-text-text-default);\n font-size: var(--text-widget-base);\n line-height: var(--text-widget-base--line-height);\n letter-spacing: var(--text-widget-base--letter-spacing);\n max-height: 264px;\n outline: none;\n overflow-y: auto;\n position: relative;\n width: 100%;\n }\n\n .tiptap__mention {\n color: var(--color-text-singular-text-link);\n font-weight: var(--font-weight-medium);\n }\n\n .tiptap__mention-popup {\n background: var(--color-surface-bg-default);\n border-radius: var(--radius-sm);\n border: 1px solid var(--color-border-border-edge-strong);\n box-shadow: var(--shadow-lg);\n position: absolute;\n z-index: 1000;\n transition: opacity 0.1s ease-in-out;\n }\n\n .tiptap__mention-popup ul {\n align-items: flex-start;\n display: flex;\n flex-direction: column;\n list-style: none;\n margin: 0;\n padding: var(--spacing-sm);\n }\n\n .tiptap__mention-popup li {\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n align-items: center;\n align-self: stretch;\n background: var(--color-surface-buttons-secondary-bg-blank-resting);\n border-radius: var(--radius-sm);\n color: var(--color-text-text-default);\n cursor: pointer;\n display: -webkit-box;\n display: flex;\n flex: 1 0 0;\n font-size: var(--text-widget-base);\n line-height: var(--text-widget-base--line-height);\n letter-spacing: var(--text-widget-base--letter-spacing);\n font-weight: 400;\n gap: 12px;\n padding: 8px;\n }\n\n .tiptap__mention-popup li:hover {\n background: #f0f0f0;\n }\n\n .tiptap__mention-popup li[data-selected] {\n background: var(--color-surface-buttons-secondary-bg-blank-hover);\n }\n\n .is-editor-empty:first-child::before {\n color: var(--color-text-text-placeholder);\n content: attr(data-placeholder);\n float: left;\n height: 0;\n pointer-events: none;\n }\n`;\n","import { PopCommentInput } from \"./comment-input.component.js\";\n\nexport * from \"./comment-input.component.js\";\nexport default PopCommentInput;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-comment-input\": PopCommentInput;\n }\n}\n","import { consume } from \"@lit/context\";\nimport { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { when } from \"lit/directives/when.js\";\n\nimport { type GridState, gridContext } from \"../../context/grid_context\";\nimport styles from \"./comment-thread.styles\";\n\n/**\n * @summary Short summary of the component's intended use.\n * @status experimental\n * @since 0.0.1\n *\n * @dependency pop-example\n *\n * @event pop-event-name - Emitted as an example.\n *\n * @slot - The default slot.\n * @slot example - An example slot.\n *\n * @csspart base - The component's base wrapper.\n *\n * @cssproperty --example - An example CSS custom property.\n */\n@customElement(\"pop-comment-thread\")\nexport class PopCommentThread extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n @consume({ context: gridContext, subscribe: true })\n gridContext?: GridState;\n\n @property({ type: String })\n id!: string;\n\n get comment() {\n return this.gridContext?.comments.find((c) => c.id === this.id);\n }\n\n render() {\n return html`\n <div\n class=${classMap({\n \"comment-thread\": true,\n })}\n >\n <pop-comment id=${this.id}></pop-comment>\n ${when(\n (this.comment?.repliesCount ?? 0) > 0,\n () => html`\n <div class=\"comment-thread__replies\">\n ${this.comment?.replies.map((reply) => html`<pop-comment id=${reply.id}></pop-comment>`)}\n </div>\n `,\n )}\n </div>\n `;\n }\n}\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: block;\n }\n\n .comment-thread {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 12px;\n }\n\n .comment-thread--size-sm {\n }\n\n .comment-thread--size-md {\n }\n\n .comment-thread__replies {\n display: flex;\n padding-left: var(--spacing-3xl, 24px);\n flex-direction: column;\n align-items: center;\n gap: var(--spacing-lg, 12px);\n }\n`;\n","import { PopCommentThread } from \"./comment-thread.component.js\";\n\nexport * from \"./comment-thread.component.js\";\nexport default PopCommentThread;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-comment-thread\": PopCommentThread;\n }\n}\n","import { consume } from \"@lit/context\";\nimport { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, property, query, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nimport { sampleColor } from \"@popgrids/ui\";\nimport { type GridState, gridContext } from \"../../context/grid_context\";\nimport { abbreviatedTimeAgoInWords } from \"../../helpers/time\";\nimport { type Comment } from \"../../types/models\";\n\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport styles from \"./comment.styles\";\n\n/**\n * @summary A component for displaying a comment.\n * @status experimental\n * @since 0.0.1\n *\n * @event {{ id: string, selected: boolean }} pop-click - Emitted when the comment is clicked.\n *\n * @csspart base - The component's base wrapper.\n *\n * @cssproperty --example - An example CSS custom property.\n */\n@customElement(\"pop-comment\")\nexport class PopComment extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n @consume({ context: gridContext, subscribe: true })\n gridContext?: GridState;\n\n @property({ type: String })\n id!: string;\n\n @state()\n private _randomColor = sampleColor();\n\n @state()\n private _expanded = false;\n\n @query(\".comment__text\")\n _text!: HTMLElement;\n\n private handleClick() {\n // Check if this comment is already selected\n const isAlreadySelected = this.selected;\n\n // Toggle the selected state\n if (isAlreadySelected) {\n // If already selected, deselect by passing null\n this.gridContext?.selectComment(null as any);\n } else {\n // If not selected, select this comment\n this.gridContext?.selectComment(this.id);\n }\n\n // Emit the click event with the new selected state\n this.emit(\"pop-click\", { id: this.id, selected: !isAlreadySelected });\n\n // Only expand if not already expanded\n if (!this._expanded && this._text) {\n // First: measure current height\n const startHeight = this._text.offsetHeight;\n\n // Set expanded state to true (once)\n this._expanded = true;\n\n // Force a synchronous layout to apply the expanded class immediately\n this.requestUpdate();\n // Wait for the update to complete\n this.updateComplete.then(() => {\n // Last: measure height after the change\n const endHeight = this._text.scrollHeight;\n\n // Invert: set the initial animation state\n this._text.style.height = `${startHeight}px`;\n this._text.style.overflow = \"hidden\";\n\n // Force a reflow\n void this._text.offsetHeight;\n\n // Play: animate to the new state\n this._text.style.transition = \"height var(--duration-quick) var(--ease-quick)\";\n this._text.style.height = `${endHeight}px`;\n\n // Clean up after animation\n setTimeout(() => {\n this._text.style.height = \"\";\n this._text.style.overflow = \"\";\n }, 300);\n });\n }\n }\n\n get comment() {\n return this.findCommentOrReply(this.gridContext?.comments ?? [], this.id);\n }\n\n get commentAvatarSize() {\n return this.gridContext?.grid?.layout === \"sm\" ? \"xs\" : \"sm\";\n }\n\n get selected() {\n return this.gridContext?.selectedCommentId === this.id;\n }\n\n findCommentOrReply(comments: Comment[], id: string) {\n const stack = [...comments];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) continue;\n\n if (current.id === id) {\n return current;\n }\n\n if (current.replies && current.replies.length > 0) {\n stack.push(...current.replies);\n }\n }\n\n return null;\n }\n\n render() {\n return html`\n <button\n class=${classMap({\n comment: true,\n [`comment--size-${this.gridContext?.grid?.layout ?? \"sm\"}`]: true,\n \"comment--is-selected\": this.selected,\n })}\n part=\"base\"\n type=\"button\"\n @click=${this.handleClick}\n >\n <div class=\"comment__user\">\n <pop-comment-avatar\n class=\"comment__avatar\"\n size=${this.commentAvatarSize}\n style=\"--comment-avatar-border-size: 0;\"\n >\n <img\n src=${ifDefined(this.comment?.account?.avatar?.url)}\n alt=\"${this.comment?.account?.name}'s avatar\"\n style=${styleMap({\n backgroundColor: this._randomColor,\n })}\n />\n </pop-comment-avatar>\n </div>\n <div class=\"comment__content\">\n <div class=\"comment__info\">\n <div class=\"comment__user\">\n <div class=\"comment__user-name\">${this.comment?.account?.name}</div>\n <div class=\"comment__timestamp\">\n ${this.comment ? abbreviatedTimeAgoInWords(new Date(this.comment.createdAt ?? \"\")) : \"\"}\n </div>\n </div>\n </div>\n <div\n class=${classMap({\n comment__text: true,\n expanded: this._expanded,\n })}\n >\n ${this.comment?.content}\n </div>\n </div>\n </button>\n `;\n }\n}\n","export function abbreviatedTimeAgoInWords(time: Date): string {\n const seconds = (Date.now() - time.getTime()) / 1000;\n\n if (seconds < 60) {\n return `${Math.floor(seconds)}s`;\n }\n\n if (seconds < 3600) {\n return `${Math.floor(seconds / 60)}m`;\n }\n\n if (seconds < 86400) {\n return `${Math.floor(seconds / 3600)}h`;\n }\n\n return `${Math.floor(seconds / 86400)}d`;\n}\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: block;\n }\n\n .comment {\n display: flex;\n width: 100%;\n align-items: center;\n background-color: transparent;\n\n border: none;\n padding: 0;\n border-radius: var(--radius-md);\n outline: 6px solid transparent;\n transition:\n background-color 0.2s ease,\n outline-color 0.2s ease;\n }\n\n .comment--size-sm {\n --avatar-size: 32px;\n --width: 32px;\n\n gap: 8px;\n }\n\n .comment--size-lg {\n --avatar-size: 56px;\n --width: 56px;\n\n gap: 12px;\n }\n\n .comment--is-selected {\n background-color: var(--color-black-alpha-900);\n outline-color: var(--color-black-alpha-900);\n }\n\n @media (hover: hover) and (pointer: fine) {\n .comment:hover .comment__avatar {\n transform: translateX(2px);\n }\n }\n\n .comment--is-selected .comment__avatar {\n transform: translateX(2px);\n }\n\n .comment__avatar {\n --border-size: 0;\n width: var(--avatar-size);\n height: var(--avatar-size);\n }\n\n .comment__user {\n display: flex;\n width: var(--width);\n align-items: flex-start;\n gap: 10px;\n flex-shrink: 0;\n align-self: stretch;\n }\n\n .comment__content {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n flex: 1 0 0;\n align-self: stretch;\n }\n\n .comment__info {\n display: flex;\n align-items: flex-start;\n align-self: stretch;\n }\n\n .comment__user-name {\n color: var(--color-text-text-default, #000);\n font-feature-settings:\n \"liga\" off,\n \"clig\" off;\n font-family: Inter;\n font-size: var(--text-widget-base, 13px);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-widget-base--line-height, 18px);\n letter-spacing: -0.08px;\n }\n\n .comment__timestamp {\n color: var(--color-text-text-default-dim-light, #697586);\n font-feature-settings:\n \"liga\" off,\n \"clig\" off;\n /* Widget/Regular */\n font-family: Inter;\n font-size: var(--text-widget-base, 13px);\n font-style: normal;\n font-weight: 400;\n line-height: var(--text-widget-base--line-height, 18px);\n letter-spacing: -0.08px;\n }\n\n .comment__text {\n /* Base styles */\n align-self: stretch;\n color: var(--color-text-text-default-dim);\n font-feature-settings:\n \"liga\" off,\n \"clig\" off;\n font-family: Inter;\n font-size: var(--text-widget-base, 13px);\n font-style: normal;\n font-weight: 400;\n line-height: var(--text-widget-base--line-height, 18px);\n letter-spacing: -0.08px;\n text-align: left;\n\n /* Clamping when not expanded */\n display: -webkit-box;\n -webkit-line-clamp: 4;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .comment__text.expanded {\n /* Remove line clamping */\n -webkit-line-clamp: initial;\n display: block;\n }\n`;\n","import { PopComment } from \"./comment.component.js\";\n\nexport * from \"./comment.component.js\";\nexport default PopComment;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-comment\": PopComment;\n }\n}\n","import { consume } from \"@lit/context\";\nimport { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\n\nimport { authContext, AuthState } from \"../../context/auth_context\";\nimport { type GridState, gridContext } from \"../../context/grid_context\";\nimport styles from \"./feed.styles\";\n\n/**\n * @summary A component for displaying a feed of comments.\n * @status experimental\n * @since 0.0.1\n *\n * @csspart base - The component's base wrapper.\n */\n@customElement(\"pop-feed\")\nexport class PopFeed extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n @consume({ context: authContext, subscribe: true })\n authContext?: AuthState;\n\n @consume({ context: gridContext, subscribe: true })\n gridContext?: GridState;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: String })\n size: \"sm\" | \"md\" = \"sm\";\n\n render() {\n if (!this.gridContext) {\n return html``;\n }\n\n if (this.gridContext.comments.length === 0) {\n return html`<div class=\"feed__empty\">No comments yet</div>`;\n }\n\n return html`\n <div\n class=${classMap({\n feed: true,\n \"feed--is-open\": this.open,\n [`feed--size-${this.gridContext.grid?.layout ?? \"sm\"}`]: true,\n })}\n part=\"base\"\n >\n <div class=\"feed__content\">\n <div class=\"feed__main\">\n ${this.gridContext.comments.map(\n (comment) => html`<pop-comment-thread id=${comment.id}></pop-comment-thread> `,\n )}\n </div>\n </div>\n <div class=\"feed__footer\">\n ${this.authContext?.isAuthenticated\n ? html`<pop-comment-bar class=\"feed__comment-bar\"></pop-comment-bar>`\n : html` <pop-auth-panel class=\"feed__auth-panel\"></pop-auth-panel> `}\n </div>\n </div>\n `;\n }\n}\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: flex;\n }\n\n .feed {\n align-items: flex-start;\n background: var(--color-border-singular-border-island, #fff);\n border-radius: var(--border-radius-2xl, 16px);\n border: 1px solid var(--color-border-singular-border-island, #fff);\n box-shadow: var(--shadow-3xl);\n display: grid;\n grid-template-rows: 1fr 50px;\n max-height: 400px;\n max-width: 400px;\n overflow: hidden;\n position: relative;\n }\n\n .feed__footer {\n position: absolute;\n bottom: 0;\n min-height: 50px;\n width: 100%;\n }\n\n .feed__comment-bar {\n }\n\n .feed__content {\n align-items: flex-start;\n align-self: stretch;\n display: flex;\n gap: var(--spacing-md, 8px);\n min-height: 80px;\n max-height: 290px;\n overflow: hidden auto;\n padding: var(--spacing-md, 8px) 20px var(--spacing-xl, 16px) var(--spacing-md, 8px);\n }\n\n .feed__main {\n align-items: stretch;\n align-self: stretch;\n display: flex;\n flex-direction: column;\n flex: 1 0 0;\n gap: var(--spacing-xl, 16px);\n min-height: 100%;\n }\n\n .feed--size-md .feed__main {\n gap: var(--spacing-lg, 12px);\n }\n`;\n","import { PopFeed } from \"./feed.component.js\";\n\nexport * from \"./feed.component.js\";\nexport default PopFeed;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-feed\": PopFeed;\n }\n}\n","import { consume, provide } from \"@lit/context\";\nimport { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\n\nimport { type ApiState, apiContext } from \"../../context/api_context\";\nimport { type GridState, gridContext } from \"../../context/grid_context\";\nimport type { Comment, Grid } from \"../../types/models\";\n\n/**\n * @summary A data provider for the grid component.\n * @status experimental\n * @since 0.0.1\n *\n * @slot - The default slot.\n */\n@customElement(\"pop-grid-provider\")\nexport class PopGridProvider extends PopElement {\n static styles: CSSResultGroup = [];\n\n @consume({ context: apiContext })\n apiState?: ApiState;\n\n /** Grid ID */\n @property({ type: String })\n id!: string;\n\n @state()\n grid: Grid | null = null;\n\n @state()\n comments: Comment[] = [];\n\n @state()\n loading = false;\n\n @provide({ context: gridContext })\n @property({ attribute: false })\n contextData: GridState = this.initializeContextData();\n\n private initializeContextData(): GridState {\n return {\n grid: null,\n comments: [],\n loading: this.loading,\n fetchGrid: this.fetchGrid.bind(this),\n fetchReplies: this.fetchReplies.bind(this),\n selectedCommentId: null,\n selectComment: this.selectComment.bind(this),\n };\n }\n\n private updateState(updates: Partial<GridState>) {\n this.contextData = {\n ...this.contextData,\n ...updates,\n };\n this.requestUpdate();\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n if (this.id) {\n this.fetchGrid(this.id);\n } else {\n console.error(\"ID not provided.\");\n }\n }\n\n async fetchGrid(id: string) {\n if (!this.apiState?.client) {\n console.error(\"No API client provided.\");\n return;\n }\n\n this.updateState({ loading: true });\n\n const { data, error } = await this.apiState.client.GET(\"/api/v1/grids/{id}\", {\n params: {\n path: {\n id,\n },\n },\n });\n\n if (data) {\n const responseData = data as { grid: Grid };\n this.grid = responseData.grid;\n this.updateState({ grid: this.grid, loading: false });\n this.fetchComments(this.id);\n }\n\n if (error) {\n console.error(\"Failed to fetch grid:\", error);\n this.loading = false;\n this.updateState({ loading: this.loading });\n return;\n }\n }\n\n async fetchComments(gridId: string) {\n if (!this.apiState?.client) return;\n\n const { data, error } = await this.apiState.client.GET(\"/api/v1/grids/{grid_id}/comments\", {\n params: {\n path: {\n grid_id: gridId,\n },\n },\n });\n\n this.loading = false;\n\n if (data) {\n // Type the response data or handle it appropriately\n const responseData = data as { comments: Comment[] };\n this.comments = responseData.comments;\n this.updateState({ comments: this.comments, loading: this.loading });\n }\n\n if (error) {\n console.error(\"Failed to fetch comments:\", error);\n this.updateState({ loading: this.loading });\n return;\n }\n }\n\n async fetchReplies(commentId: string) {\n if (!this.apiState?.client) return;\n\n try {\n const repliesResponse = await this.apiState.client.GET(\"/api/v1/grids/{grid_id}/comments/{id}/replies\", {\n params: {\n path: {\n grid_id: this.id,\n id: commentId,\n },\n },\n });\n\n if (repliesResponse.data) {\n const responseData = repliesResponse.data as { replies: Comment[] };\n const replies = responseData.replies || [];\n this.comments = this.comments.map((comment) =>\n comment.id === commentId ? { ...comment, replies: [...(comment.replies || []), ...replies] } : comment,\n );\n\n this.updateState({ comments: this.comments });\n }\n } catch (error) {\n console.error(`Failed to fetch replies for comment ${commentId}:`, error);\n }\n }\n\n selectComment(commentId: string | null) {\n this.updateState({ selectedCommentId: commentId });\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n","import { PopGridProvider } from \"./grid-provider.component.js\";\n\nexport * from \"./grid-provider.component.js\";\nexport default PopGridProvider;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-grid-provider\": PopGridProvider;\n }\n}\n","import { PopElement } from \"@popgrids/ui\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nimport styles from \"./grid.styles\";\n\n/**\n * @summary A Grid displays a discussion thread.\n * @status experimental\n * @since 0.0.1\n *\n * @slot - The default slot.\n *\n * @csspart base - The component's base wrapper.\n */\n@customElement(\"pop-grid\")\nexport class PopGrid extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n @property({ type: String, attribute: \"api-url\", reflect: true })\n apiUrl = \"https://api.popgrids.com\"; // Default API URL, can be overridden\n\n @property({ type: String, attribute: \"data-grid-id\" })\n gridId = \"\";\n\n render() {\n return html`\n <pop-api-provider api-url=${this.apiUrl}>\n <pop-grid-provider id=${this.gridId}>\n <pop-auth-provider>\n <pop-widget></pop-widget>\n </pop-auth-provider>\n </pop-grid-provider>\n </pop-api-provider>\n `;\n }\n}\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: flex;\n align-items: center;\n }\n`;\n","import { PopGrid } from \"./grid.component\";\n\nexport * from \"./grid.component\";\nexport default PopGrid;\n\n// Automatically define the custom element\nif (!customElements.get(\"pop-grid\")) {\n customElements.define(\"pop-grid\", PopGrid);\n}\n\n// Automatically create grid elements with grid-id attributes\nfunction initializeGrids() {\n const gridElements = document.querySelectorAll(\n \"pop-grid[grid-id]:not([initialized])\"\n );\n\n for (const element of Array.from(gridElements)) {\n const gridId = element.getAttribute(\"grid-id\");\n if (gridId) {\n element.setAttribute(\"data-grid-id\", gridId);\n element.setAttribute(\"initialized\", \"true\");\n }\n }\n}\n\n// Run initialization when the script loads\nif (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", initializeGrids);\n} else {\n initializeGrids();\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-grid\": PopGrid;\n }\n}\n","import { type Middleware, autoUpdate, computePosition, flip, offset, platform } from \"@floating-ui/dom\";\nimport { consume } from \"@lit/context\";\nimport { PopElement } from \"@popgrids/ui\";\nimport { offsetParent } from \"composed-offset-position\";\nimport { type CSSResultGroup, html } from \"lit\";\nimport { customElement, query, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\n\nimport { type GridState, gridContext } from \"../../context/grid_context\";\nimport styles from \"./widget.styles\";\n\nconst previewLimits: Record<string, number> = {\n default: 1,\n md: 3,\n lg: 5,\n};\n\n/**\n * @summary The base widget for a pop grid.\n * @status experimental\n * @since 0.0.1\n *\n * @dependency pop-widget\n *\n * @slot - The default slot.\n */\n@customElement(\"pop-widget\")\nexport default class PopGridView extends PopElement {\n static styles: CSSResultGroup = [super.styles, styles];\n\n @consume({ context: gridContext, subscribe: true })\n gridContext?: GridState;\n\n @state()\n private _open = false;\n\n @query(\".grid-widget__previews\") _previews!: HTMLElement;\n @query(\".grid-widget__feed\") _feed!: HTMLElement;\n\n private cleanup: ReturnType<typeof autoUpdate> | undefined;\n\n async connectedCallback() {\n super.connectedCallback();\n\n // Start positioning the island after the first update\n await this.updateComplete;\n this.start();\n document.addEventListener(\"mousedown\", this.handleDocumentMouseDown);\n document.addEventListener(\"keydown\", this.handleKeyDown);\n }\n\n disconnectedCallback() {\n document.removeEventListener(\"mousedown\", this.handleDocumentMouseDown);\n document.removeEventListener(\"keydown\", this.handleKeyDown);\n super.disconnectedCallback();\n this.stop();\n }\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === \"Escape\") {\n this._open = false;\n }\n };\n\n private handleDocumentMouseDown = (event: MouseEvent) => {\n if (!this._open) return;\n\n // Close when clicking outside\n const path = event.composedPath();\n\n if (this && !path.includes(this._feed)) {\n this._open = false;\n }\n };\n\n private handlePopClick() {\n if (!this._open) {\n this._open = true;\n }\n }\n\n private reposition = () => {\n if (!this._open || !this._previews || !this._feed || !this.gridContext?.grid) {\n return;\n }\n\n // Offset\n let middleware: Middleware[] = [];\n\n middleware = [\n offset({\n mainAxis: this.gridContext.grid.position === \"down\" ? -16 : -48,\n crossAxis: -13,\n }),\n ];\n\n // Flip\n if (!this.gridContext.grid.position || this.gridContext.grid.position === \"smart\") {\n middleware.push(\n flip({\n fallbackPlacements: [\"bottom-start\", \"top-start\"],\n fallbackStrategy: \"bestFit\",\n padding: 16,\n }),\n );\n }\n\n // Shift\n // middleware.push(\n // shift({\n // padding: 0,\n // }),\n // );\n\n const getOffsetParent = (element: Element) => platform.getOffsetParent(element, offsetParent);\n\n computePosition(this._previews, this._feed, {\n placement: this.gridContext.grid.position === \"down\" ? \"bottom-start\" : \"top-start\",\n middleware,\n strategy: \"fixed\",\n platform: {\n ...platform,\n getOffsetParent,\n },\n }).then(({ x, y, placement }) => {\n this._feed.setAttribute(\"data-current-placement\", placement);\n\n Object.assign(this._feed.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n });\n };\n\n private start() {\n if (!this._previews) {\n return;\n }\n\n this.cleanup = autoUpdate(this._previews, this._feed, () => {\n this.reposition();\n });\n }\n\n private async stop(): Promise<void> {\n return new Promise((resolve) => {\n if (this.cleanup) {\n this.cleanup();\n this.cleanup = undefined;\n this.removeAttribute(\"data-current-placement\");\n this.style.removeProperty(\"--auto-size-available-width\");\n this.style.removeProperty(\"--auto-size-available-height\");\n requestAnimationFrame(() => resolve());\n } else {\n resolve();\n }\n });\n }\n\n async updated(changedProps: Map<string, unknown>) {\n super.updated(changedProps);\n\n // Start or stop the positioner when +open+ changes\n if (changedProps.has(\"_open\")) {\n if (this._open) {\n this.start();\n } else {\n this.stop();\n }\n }\n\n // Start or stop the positioner when +position+ changes\n if (changedProps.has(\"position\")) {\n if (this.gridContext?.grid?.position === \"smart\" && this._open) {\n this.start();\n } else {\n this.stop();\n }\n }\n\n // All other properties will trigger a reposition when active\n if (this._open) {\n await this.updateComplete;\n this.reposition();\n }\n }\n\n get previewComments() {\n return this.gridContext?.comments\n .filter((c) => c.parentCommentId === null)\n .sort((a, b) => new Date(b.createdAt ?? \"\").getTime() - new Date(a.createdAt ?? \"\").getTime())\n .slice(0, previewLimits[this.gridContext.grid?.preview ?? \"default\"]);\n }\n\n render() {\n if (this.gridContext?.loading) {\n return html`<div class=\"grid-widget\">\n <pop-loader class=\"grid-widget__loader\" variant=\"spinner\"></pop-loader>\n </div>`;\n }\n\n if (!this.gridContext?.grid) return html`<p>No grid found.</p>`;\n\n return html`\n <div\n class=${classMap({\n \"grid-widget\": true,\n [`grid-widget--align-${this.gridContext.grid.align}`]: true,\n [`grid-widget--appearance-${this.gridContext.grid.appearance}`]: true,\n [`grid-widget--icon-${this.gridContext.grid.icon}`]: true,\n [`grid-widget--layout-${this.gridContext.grid.layout}`]: true,\n [`grid-widget--position-${this.gridContext.grid.position}`]: true,\n [`grid-widget--preview-${this.gridContext.grid.preview}`]: true,\n })}\n >\n <div class=\"grid-widget__previews\">\n ${(this.previewComments ?? []).map(\n (comment) => html`\n <pop-comment-avatar class=\"grid-widget__preview-avatar\" size=\"xs\" @click=${this.handlePopClick}>\n <img src=${ifDefined(comment.account?.avatar?.url)} alt=\"${comment.account?.name}’s avatar\" />\n </pop-comment-avatar>\n `,\n )}\n <pop-sum class=\"grid-widget__preview-sum\">${this.gridContext.grid.commentsCount}</pop-sum>\n <pop-comment-icon\n size=\"sm\"\n theme=${this.gridContext.grid?.customAddIcon ? \"brand\" : \"neutral\"}\n variant=\"add\"\n .iconUrl=${this.gridContext.grid?.customAddIcon || undefined}\n ></pop-comment-icon>\n </div>\n <div\n class=${classMap({\n \"grid-widget__feed\": true,\n \"grid-widget__feed--open\": this._open,\n })}\n part=\"feed\"\n >\n <pop-feed ?open=${this._open}></pop-feed>\n </div>\n </div>\n `;\n }\n}\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n return [':popover-open', ':modal'].some(selector => {\n try {\n return element.matches(selector);\n } catch (e) {\n return false;\n }\n });\n}\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return ['transform', 'translate', 'scale', 'rotate', 'perspective'].some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { isContainingBlock } from '@floating-ui/utils/dom';\n\nfunction offsetParent(element) {\n return offsetParentPolyfill(element);\n}\nfunction offsetTop(element) {\n return offsetTopLeftPolyfill(element, 'offsetTop');\n}\nfunction offsetLeft(element) {\n return offsetTopLeftPolyfill(element, 'offsetLeft');\n}\nfunction flatTreeParent(element) {\n if (element.assignedSlot) {\n return element.assignedSlot;\n }\n if (element.parentNode instanceof ShadowRoot) {\n return element.parentNode.host;\n }\n return element.parentNode;\n}\nfunction ancestorTreeScopes(element) {\n const scopes = new Set();\n let currentScope = element.getRootNode();\n while (currentScope) {\n scopes.add(currentScope);\n currentScope = currentScope.parentNode\n ? currentScope.parentNode.getRootNode()\n : null;\n }\n return scopes;\n}\nfunction offsetParentPolyfill(element) {\n // Do an initial walk to check for display:none ancestors.\n for (let ancestor = element; ancestor; ancestor = flatTreeParent(ancestor)) {\n if (!(ancestor instanceof Element)) {\n continue;\n }\n if (getComputedStyle(ancestor).display === 'none') {\n return null;\n }\n }\n for (let ancestor = flatTreeParent(element); ancestor; ancestor = flatTreeParent(ancestor)) {\n if (!(ancestor instanceof Element)) {\n continue;\n }\n const style = getComputedStyle(ancestor);\n // Display:contents nodes aren't in the layout tree, so they should be skipped.\n if (style.display === 'contents') {\n continue;\n }\n if (style.position !== 'static' || isContainingBlock(style)) {\n return ancestor;\n }\n if (ancestor.tagName === 'BODY') {\n return ancestor;\n }\n }\n return null;\n}\nfunction offsetTopLeftPolyfill(element, offsetTopOrLeft) {\n let value = element[offsetTopOrLeft];\n let nextOffsetParent = offsetParentPolyfill(element);\n const scopes = ancestorTreeScopes(element);\n while (nextOffsetParent && !scopes.has(nextOffsetParent.getRootNode())) {\n value -= nextOffsetParent[offsetTopOrLeft];\n nextOffsetParent = offsetParentPolyfill(nextOffsetParent);\n }\n return value;\n}\n\nexport { offsetLeft, offsetParent, offsetTop };\n","import { css } from \"lit\";\n\nexport default css`\n :host {\n display: block;\n }\n\n .grid-widget {\n display: flex;\n height: 100%;\n position: relative;\n width: 100%;\n }\n\n .grid-widget--align-left {\n justify-content: flex-start;\n }\n\n .grid-widget--align-center {\n justify-content: center;\n }\n\n .grid-widget--align-right {\n justify-content: flex-end;\n }\n\n .grid-widget__feed {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 2147483647;\n display: none;\n opacity: 0;\n transform: scale(0.94);\n transition:\n opacity var(--duration-quick) var(--ease-quick),\n transform var(--duration-quick) var(--ease-quick),\n display var(--duration-quick) allow-discrete;\n }\n\n .grid-widget__feed[data-current-placement=\"top-start\"] {\n transform-origin: left bottom;\n }\n\n .grid-widget__feed[data-current-placement=\"bottom-start\"] {\n transform-origin: left top;\n }\n\n .grid-widget__feed[data-current-placement=\"top-end\"] {\n transform-origin: right bottom;\n }\n\n .grid-widget__feed[data-current-placement=\"bottom-end\"] {\n transform-origin: right top;\n }\n\n .grid-widget__feed[data-current-placement=\"top\"] {\n transform-origin: bottom;\n }\n\n .grid-widget__feed[data-current-placement=\"bottom\"] {\n transform-origin: top;\n }\n\n .grid-widget__feed--open {\n display: flex;\n opacity: 1;\n transform: scale(1);\n\n @starting-style {\n display: flex;\n opacity: 0;\n transform: scale(0.94);\n }\n }\n\n .grid-widget__loader {\n align-items: center;\n display: flex;\n min-height: 30px;\n }\n\n .grid-widget__previews {\n display: inline-flex;\n align-items: flex-start;\n }\n\n .grid-widget__previews > :not([hidden]) ~ :not([hidden]) {\n margin-left: -4px;\n }\n\n .grid-widget__preview-avatar,\n .grid-widget__preview-sum {\n transition: transform var(--ease-quick) 600ms;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .grid-widget__preview-avatar:hover,\n .grid-widget__preview-sum:hover {\n cursor: pointer;\n transform: scale(1.1875);\n }\n }\n\n .grid-widget__preview-avatar:active,\n .grid-widget__preview-sum:active {\n cursor: pointer;\n transform: scale(0.875);\n }\n`;\n","import PopWidget from \"./widget.component.js\";\n\nexport * from \"./widget.component.js\";\nexport default PopWidget;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-widget\": PopWidget;\n }\n}\n","import { provide } from \"@lit/context\";\nimport { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\n\nimport { type ApiState, apiContext } from \"../../context/api_context\";\nimport { createApiClient } from \"../../services/api-client\";\n\n/**\n * @summary A provider for the API context.\n * @status experimental\n * @since 0.0.1\n *\n * @slot - The default slot.\n */\n@customElement(\"pop-api-provider\")\nexport class PopApiProvider extends LitElement {\n @property({ type: String, attribute: \"api-url\" })\n apiUrl!: string;\n\n @provide({ context: apiContext })\n @state()\n apiState: ApiState = {\n baseUrl: \"\",\n client: null,\n };\n\n connectedCallback() {\n super.connectedCallback();\n\n if (this.apiUrl) {\n this.apiState = {\n ...this.apiState,\n baseUrl: this.apiUrl,\n client: createApiClient(this.apiUrl),\n };\n\n this.requestUpdate();\n } else {\n console.error(\"API URL or ID not provided.\");\n }\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n","import createClient from \"openapi-fetch\";\nimport type { paths } from \"../types/api-types\";\n\nexport const createApiClient = (apiUrl: string) => {\n const client = createClient<paths>({\n baseUrl: apiUrl,\n });\n\n return client;\n};\n","import { PopApiProvider } from \"./api-provider.component.js\";\n\nexport * from \"./api-provider.component.js\";\nexport default PopApiProvider;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"pop-api-provider\": PopApiProvider;\n }\n}\n"],"mappings":"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","names":["PopElement","html","customElement","classMap","css","unsafeCSS","auth_join_styles_default","css","unsafeCSS","swirling_ovals_default","PopAuthJoin","PopElement","html","classMap","__superGet","auth_join_styles_default","__decorateClass","customElement","auth_join_default","PopAuthJoin","consume","PopElement","html","customElement","query","state","classMap","ifDefined","createContext","authContext","css","auth_panel_styles_default","PopAuthPanel","PopElement","e","event","path","entries","entry","contentHeight","changedProperties","html","ifDefined","classMap","__superGet","auth_panel_styles_default","__decorateClass","consume","authContext","query","state","customElement","auth_panel_default","PopAuthPanel","consume","provide","PopElement","html","customElement","property","state","createContext","apiContext","css","auth_provider_styles_default","AUTH_TOKEN_KEY","PopAuthProvider","PopElement","savedToken","data","error","credentials","code","email","html","auth_provider_styles_default","__decorateClass","consume","apiContext","state","provide","authContext","property","customElement","auth_provider_default","PopAuthProvider","consume","PopElement","html","customElement","state","classMap","css","auth_sign_in_styles_default","googleIcon","google_default","appleIcon","apple_default","PopAuthSignIn","PopElement","email","e","valid","validationMessage","validity","response","html","classMap","__superGet","auth_sign_in_styles_default","__decorateClass","consume","authContext","state","customElement","auth_sign_in_default","PopAuthSignIn","consume","PopElement","html","customElement","property","query","queryAll","state","classMap","when","css","auth_verify_code_styles_default","PopAuthVerifyCode","PopElement","index","response","error","event","input","isDigit","currentIndex","prevInput","nextInput","message","clipboardData","digit","nextEmptyIndex","focusIndex","values","value","html","classMap","when","__superGet","auth_verify_code_styles_default","__decorateClass","consume","authContext","property","state","query","queryAll","customElement","auth_verify_code_default","PopAuthVerifyCode","PopElement","html","customElement","classMap","css","comment_bar_styles_default","PopCommentBar","PopElement","html","classMap","__superGet","comment_bar_styles_default","__decorateClass","customElement","comment_bar_default","PopCommentBar","computePosition","flip","offset","shift","consume","PopElement","Editor","mergeAttributes","Document","Mention","Paragraph","Placeholder","Text","Typography","html","customElement","property","query","state","classMap","createContext","gridContext","css","comment_input_styles_default","PopCommentInput","PopElement","query","client","data","error","account","command","popup","items","list","selectedIndex","updateSelection","listItems","item","index","updatePopupPosition","coords","virtualElement","x","y","computePosition","offset","flip","shift","fadeOutAndRemove","props","existingPopup","listItem","e","selectedItem","suggestion","Editor","Document","Mention","options","node","mergeAttributes","element","attributes","Paragraph","Placeholder","Text","Typography","editor","html","classMap","__superGet","comment_input_styles_default","__decorateClass","consume","apiContext","gridContext","property","state","customElement","comment_input_default","PopCommentInput","consume","PopElement","html","customElement","property","classMap","when","css","comment_thread_styles_default","PopCommentThread","PopElement","c","html","classMap","when","reply","__superGet","comment_thread_styles_default","__decorateClass","consume","gridContext","property","customElement","comment_thread_default","PopCommentThread","consume","PopElement","html","customElement","property","query","state","classMap","styleMap","sampleColor","abbreviatedTimeAgoInWords","time","seconds","ifDefined","css","comment_styles_default","PopComment","PopElement","sampleColor","isAlreadySelected","startHeight","endHeight","comments","id","stack","current","html","classMap","ifDefined","styleMap","abbreviatedTimeAgoInWords","__superGet","comment_styles_default","__decorateClass","consume","gridContext","property","state","query","customElement","comment_default","PopComment","consume","PopElement","html","customElement","property","classMap","css","feed_styles_default","PopFeed","PopElement","html","classMap","comment","__superGet","feed_styles_default","__decorateClass","consume","authContext","gridContext","property","customElement","feed_default","PopFeed","consume","provide","PopElement","html","customElement","property","state","PopGridProvider","PopElement","updates","id","data","error","responseData","gridId","commentId","repliesResponse","replies","comment","html","__decorateClass","consume","apiContext","property","state","provide","gridContext","customElement","grid_provider_default","PopGridProvider","PopElement","html","customElement","property","css","grid_styles_default","PopGrid","PopElement","html","__superGet","grid_styles_default","__decorateClass","property","customElement","grid_default","PopGrid","initializeGrids","gridElements","element","gridId","autoUpdate","computePosition","flip","offset","platform","consume","PopElement","hasWindow","getWindow","node","_node$ownerDocument","isElement","value","hasWindow","getWindow","isContainingBlock","elementOrCss","webkit","isWebKit","css","isElement","getComputedStyle","value","isWebKit","getComputedStyle","element","getWindow","offsetParent","element","offsetParentPolyfill","flatTreeParent","element","offsetParentPolyfill","element","ancestor","flatTreeParent","style","isContainingBlock","html","customElement","query","state","classMap","ifDefined","css","widget_styles_default","previewLimits","PopGridView","PopElement","e","event","path","middleware","offset","flip","getOffsetParent","element","platform","offsetParent","computePosition","x","y","placement","autoUpdate","resolve","changedProps","c","a","b","html","classMap","comment","ifDefined","__superGet","widget_styles_default","__decorateClass","consume","gridContext","state","query","customElement","widget_default","PopGridView","provide","LitElement","html","customElement","property","state","createClient","createApiClient","apiUrl","PopApiProvider","LitElement","createApiClient","html","__decorateClass","property","provide","apiContext","state","customElement","api_provider_default","PopApiProvider"]}
Binary file
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@popgrids/embed",
3
+ "description": "PopGrids Embeddable Objects",
4
+ "version": "0.0.1",
5
+ "private": false,
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/popgrids/popgrids-turborepo.git"
13
+ },
14
+ "author": "Popgrids",
15
+ "license": "UNLICENSED",
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "exports": {
20
+ ".": {
21
+ "import": "./dist/index.js",
22
+ "types": "./dist/index.d.ts"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "dev": "tsup --watch",
31
+ "clean": "rm -rf .turbo node_modules dist",
32
+ "lint": "eslint . --max-warnings 0",
33
+ "test": "web-test-runner src/**/*.test.ts --node-resolve",
34
+ "prepublishOnly": "npm run build"
35
+ },
36
+ "dependencies": {
37
+ "@floating-ui/dom": "^1.6.13",
38
+ "@lit/context": "^1.1.4",
39
+ "@popgrids/theme": "*",
40
+ "@popgrids/ui": "*",
41
+ "@tiptap/core": "^2.11.7",
42
+ "@tiptap/extension-document": "^2.11.7",
43
+ "@tiptap/extension-mention": "^2.11.7",
44
+ "@tiptap/extension-paragraph": "^2.11.7",
45
+ "@tiptap/extension-placeholder": "^2.11.7",
46
+ "@tiptap/extension-text": "^2.11.7",
47
+ "@tiptap/extension-typography": "^2.11.7",
48
+ "@tiptap/pm": "^2.11.7",
49
+ "@tiptap/suggestion": "^2.11.7",
50
+ "lit": "^3.2.1",
51
+ "openapi-fetch": "^0.13.5"
52
+ },
53
+ "devDependencies": {
54
+ "@open-wc/testing": "^4.0.0",
55
+ "@popgrids/eslint-config": "*",
56
+ "@popgrids/prettier-config": "*",
57
+ "@types/mocha": "^10.0.10",
58
+ "@web/dev-server-esbuild": "^1.0.4",
59
+ "@web/test-runner": "^0.20.0",
60
+ "composed-offset-position": "^0.0.6",
61
+ "openapi-typescript": "^7.6.1",
62
+ "tsup": "^8.4.0"
63
+ }
64
+ }