> ## Documentation Index
> Fetch the complete documentation index at: https://docs.beyondwords.io/llms.txt
> Use this file to discover all available pages before exploring further.

# BeyondWords Logo

> A BeyondWords logo that links back to beyondwords.io with analytics attribution.

export const WebComponentsDemo = ({name}) => {
  const MOCK_CONTENT = [{
    id: "demo-1",
    title: "How AI voices are changing publishing",
    imageUrl: "/images/player-ui/demo-cover.svg",
    sourceUrl: "https://beyondwords.io",
    sourceId: "demo",
    adsEnabled: false,
    duration: 124,
    audio: [{
      id: "audio-1",
      url: "/images/player-ui/demo-silent.mp3",
      contentType: "audio/mpeg",
      duration: 124
    }],
    video: [],
    summarization: {
      audio: [],
      video: []
    },
    segments: []
  }];
  const MOCK_PLAYLIST = [{
    id: "7a974fb1-1b89-4be3-a25d-4ad286d5305b",
    title: "Part 1: The newsroom shift",
    imageUrl: "/images/player-ui/demo-cover.svg",
    sourceUrl: "https://beyondwords.io",
    sourceId: "demo",
    adsEnabled: false,
    duration: 124,
    audio: [{
      id: "audio-1",
      url: "/images/player-ui/demo-silent.mp3",
      contentType: "audio/mpeg",
      duration: 124
    }],
    video: [],
    summarization: {
      audio: [],
      video: []
    },
    segments: []
  }, {
    id: "129e7681-fa4d-4526-8be9-d27c946a5023",
    title: "Part 2: Voices at scale",
    imageUrl: "/images/player-ui/demo-cover.svg",
    sourceUrl: "https://beyondwords.io",
    sourceId: "demo",
    adsEnabled: false,
    duration: 98,
    audio: [{
      id: "audio-1",
      url: "/images/player-ui/demo-silent.mp3",
      contentType: "audio/mpeg",
      duration: 98
    }],
    video: [],
    summarization: {
      audio: [],
      video: []
    },
    segments: []
  }, {
    id: "e9f2257c-14cf-46c0-bab6-bcaa9e229775",
    title: "Part 3: What comes next",
    imageUrl: "/images/player-ui/demo-cover.svg",
    sourceUrl: "https://beyondwords.io",
    sourceId: "demo",
    adsEnabled: false,
    duration: 152,
    audio: [{
      id: "audio-1",
      url: "/images/player-ui/demo-silent.mp3",
      contentType: "audio/mpeg",
      duration: 152
    }],
    video: [],
    summarization: {
      audio: [],
      video: []
    },
    segments: []
  }];
  const MOCK_ADVERTS = [{
    id: "advert-1",
    type: "native",
    placement: "pre-roll",
    vastUrl: null,
    clickThroughUrl: "https://sponsor.example.com",
    imageUrl: "/images/player-ui/demo-cover.svg",
    textColor: "#ffffff",
    backgroundColor: "#943bfc",
    iconColor: "#ffffff",
    audio: [{
      id: "advert-audio-1",
      url: "/images/player-ui/demo-silent.mp3",
      contentType: "audio/mpeg",
      duration: 8
    }],
    video: []
  }];
  const content = JSON.stringify(MOCK_CONTENT).replace(/'/g, "&#39;");
  const playlistContent = JSON.stringify(MOCK_PLAYLIST).replace(/'/g, "&#39;");
  const adverts = JSON.stringify(MOCK_ADVERTS).replace(/'/g, "&#39;");
  const DEMOS = {
    "play-pause-button": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-play-pause-button></bw-play-pause-button></bw-player-provider>`,
    "time-indicator": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-time-indicator></bw-time-indicator></bw-player-provider>`,
    "prev-segment-button": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-prev-segment-button></bw-prev-segment-button></bw-player-provider>`,
    "next-segment-button": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-next-segment-button></bw-next-segment-button></bw-player-provider>`,
    "prev-seconds-button": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-prev-seconds-button></bw-prev-seconds-button></bw-player-provider>`,
    "next-seconds-button": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-next-seconds-button></bw-next-seconds-button></bw-player-provider>`,
    "playback-rate-button": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-playback-rate-button></bw-playback-rate-button></bw-player-provider>`,
    "content-title": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-content-title></bw-content-title></bw-player-provider>`,
    "call-to-action": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-call-to-action></bw-call-to-action></bw-player-provider>`,
    "download-button": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-download-button></bw-download-button></bw-player-provider>`,
    "beyondwords-logo": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><bw-beyondwords-logo></bw-beyondwords-logo></bw-player-provider>`,
    "prev-track-button": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${playlistContent}'><bw-prev-track-button></bw-prev-track-button></bw-player-provider>`,
    "next-track-button": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${playlistContent}'><bw-next-track-button></bw-next-track-button></bw-player-provider>`,
    "playlist": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${playlistContent}'><bw-playlist></bw-playlist></bw-player-provider>`,
    "feature-image": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><div style="width:100%;max-width:20rem;min-width:15rem;overflow:hidden;border-radius:0.5rem"><bw-feature-image></bw-feature-image></div></bw-player-provider>`,
    "progress-bar": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}'><div style="display:flex;flex-direction:row;align-items:center;min-width:30rem"><bw-progress-bar></bw-progress-bar></div></bw-player-provider>`,
    "advert-link": `<bw-player-provider data-show-user-interface="false" data-analytics-consent="none" data-content='${content}' data-adverts='${adverts}' data-advert-index="0"><bw-advert-link></bw-advert-link></bw-player-provider>`,
    "standard-player": `<bw-standard-player-provider data-show-user-interface="false" data-analytics-consent="none" data-project-id="9504" data-content-id="ba00ef51-03ac-4a85-8b98-e45c957e8ef8"><bw-standard-player-bar><bw-standard-play-pause-button></bw-standard-play-pause-button><bw-standard-player-info><bw-standard-call-to-action></bw-standard-call-to-action><bw-standard-duration></bw-standard-duration></bw-standard-player-info><bw-standard-playback-controls><bw-standard-playback-rate-button></bw-standard-playback-rate-button><bw-standard-prev-segment-button></bw-standard-prev-segment-button><bw-standard-next-segment-button></bw-standard-next-segment-button><bw-standard-time-indicator></bw-standard-time-indicator><bw-standard-progress-bar></bw-standard-progress-bar><bw-standard-close-widget-button></bw-standard-close-widget-button></bw-standard-playback-controls><bw-standard-beyondwords-logo></bw-standard-beyondwords-logo></bw-standard-player-bar></bw-standard-player-provider>`,
    "minimal-player": `<bw-minimal-player-provider data-show-user-interface="false" data-analytics-consent="none" data-project-id="9504" data-content-id="ba00ef51-03ac-4a85-8b98-e45c957e8ef8"><bw-minimal-player-bar><bw-minimal-play-pause-button></bw-minimal-play-pause-button><bw-minimal-call-to-action></bw-minimal-call-to-action><bw-minimal-prev-seconds-button data-seconds="10"></bw-minimal-prev-seconds-button><bw-minimal-playback-rate-menu></bw-minimal-playback-rate-menu><bw-minimal-current-time></bw-minimal-current-time></bw-minimal-player-bar></bw-minimal-player-provider>`,
    "playlist-player": `<bw-playlist-player-provider data-show-user-interface="false" data-analytics-consent="none" data-project-id="9504" data-playlist-id="153102"><bw-playlist-player-root><bw-playlist-player-bar><bw-playlist-play-pause-button></bw-playlist-play-pause-button><bw-playlist-player-info><bw-playlist-call-to-action></bw-playlist-call-to-action><bw-playlist-duration></bw-playlist-duration></bw-playlist-player-info><bw-playlist-playback-controls><bw-playlist-playback-rate-button></bw-playlist-playback-rate-button><bw-playlist-prev-track-button></bw-playlist-prev-track-button><bw-playlist-next-track-button></bw-playlist-next-track-button><bw-playlist-time-indicator></bw-playlist-time-indicator><bw-playlist-progress-bar></bw-playlist-progress-bar></bw-playlist-playback-controls><bw-playlist-toggle-button></bw-playlist-toggle-button></bw-playlist-player-bar><bw-playlist-list></bw-playlist-list></bw-playlist-player-root></bw-playlist-player-provider>`,
    "video-player": `<bw-video-player-provider data-show-user-interface="false" data-analytics-consent="none" data-video="true" data-project-id="54009" data-content-id="5ab6a5e1-689c-4103-962d-e7e68a4258ff"><bw-video-feature-image></bw-video-feature-image><bw-video-control-bar><bw-video-prev-seconds-button data-color="white" data-seconds="10"></bw-video-prev-seconds-button><bw-video-play-pause-button data-color="white" data-size="56"></bw-video-play-pause-button><bw-video-next-seconds-button data-color="white" data-seconds="10"></bw-video-next-seconds-button></bw-video-control-bar><bw-video-widget-bar><bw-video-play-pause-button></bw-video-play-pause-button><bw-video-widget-controls><bw-video-playback-rate-button></bw-video-playback-rate-button><bw-video-prev-seconds-button data-seconds="10"></bw-video-prev-seconds-button><bw-video-next-seconds-button data-seconds="10"></bw-video-next-seconds-button><bw-video-time-indicator></bw-video-time-indicator><bw-video-progress-bar></bw-video-progress-bar><bw-video-close-widget-button></bw-video-close-widget-button></bw-video-widget-controls></bw-video-widget-bar></bw-video-player-provider>`,
    "vertical-video-player": `<bw-video-player-provider data-show-user-interface="false" data-analytics-consent="none" data-video="true" data-aspect="9/16" data-height="480" data-project-id="54009" data-content-id="5ab6a5e1-689c-4103-962d-e7e68a4258ff"><bw-video-feature-image></bw-video-feature-image><bw-video-control-bar><bw-video-prev-seconds-button data-color="white" data-seconds="10"></bw-video-prev-seconds-button><bw-video-play-pause-button data-color="white" data-size="56"></bw-video-play-pause-button><bw-video-next-seconds-button data-color="white" data-seconds="10"></bw-video-next-seconds-button></bw-video-control-bar><bw-video-widget-bar><bw-video-play-pause-button></bw-video-play-pause-button><bw-video-widget-controls><bw-video-playback-rate-button></bw-video-playback-rate-button><bw-video-prev-seconds-button data-seconds="10"></bw-video-prev-seconds-button><bw-video-next-seconds-button data-seconds="10"></bw-video-next-seconds-button><bw-video-time-indicator></bw-video-time-indicator><bw-video-progress-bar></bw-video-progress-bar><bw-video-close-widget-button></bw-video-close-widget-button></bw-video-widget-controls></bw-video-widget-bar></bw-video-player-provider>`
  };
  const markup = DEMOS[name];
  return <div className="not-prose flex w-full items-center justify-center rounded-lg border p-10" style={{
    minHeight: "16rem",
    fontFamily: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif'
  }}>
      {markup ? <div dangerouslySetInnerHTML={{
    __html: markup
  }} /> : <p className="text-sm">No preview available for “{name}”.</p>}
    </div>;
};

<Tabs>
  <Tab title="Preview">
    <WebComponentsDemo name="beyondwords-logo" />
  </Tab>

  <Tab title="Code">
    ```js BeyondWordsLogo.js theme={null}
    import { BwPlayerConsumer } from "@/registry/html/PlayerProvider";

    const LOGO_SVG = `<svg width="16" height="16" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M29.4,18.59A20.61,20.61,0,0,0,28,15c2.62-5.17,2.8-10.15,0-13a7.49,7.49,0,0,0-5.47-2,14.14,14.14,0,0,0-3.9.6A21,21,0,0,0,15,2,17,17,0,0,0,7.59,0H7.53A7.57,7.57,0,0,0,2.05,2.05,7.59,7.59,0,0,0,0,7.54v0A17,17,0,0,0,2,15C-.58,20.17-.76,25.14,2.05,28A7.54,7.54,0,0,0,7.56,30,16.8,16.8,0,0,0,15,28a20.06,20.06,0,0,0,3.57,1.44,14.08,14.08,0,0,0,3.89.6A7.53,7.53,0,0,0,28,28C30,25.88,30.55,22.55,29.4,18.59ZM19.18,2.67a11.78,11.78,0,0,1,3.29-.52,5.46,5.46,0,0,1,4,1.41c1.5,1.5,1.81,4.08.89,7.25a18.56,18.56,0,0,1-.68,1.88,31.07,31.07,0,0,0-4.17-5.15A31.16,31.16,0,0,0,17.3,3.35,18.56,18.56,0,0,1,19.18,2.67ZM3.56,3.56a5.43,5.43,0,0,1,4-1.41,13.77,13.77,0,0,1,5.19,1.2A31.27,31.27,0,0,0,7.54,7.53a30.81,30.81,0,0,0-4.19,5.18C1.76,8.91,1.69,5.44,3.56,3.56Zm4,24.27a5.44,5.44,0,0,1-3.95-1.4c-1.5-1.5-1.82-4.08-.89-7.25a18.29,18.29,0,0,1,.67-1.87,31.1,31.1,0,0,0,4.19,5.16,31.07,31.07,0,0,0,5.15,4.17A13.85,13.85,0,0,1,7.52,27.83ZM15,25.52A27.82,27.82,0,0,1,9.05,21a28,28,0,0,1-4.57-6,28.51,28.51,0,0,1,4.58-6A27.82,27.82,0,0,1,15,4.48a27.68,27.68,0,0,1,6,4.57A27.86,27.86,0,0,1,25.52,15a27.9,27.9,0,0,1-4.58,6A28,28,0,0,1,15,25.52Zm11.49.93a5.47,5.47,0,0,1-4,1.42,11.78,11.78,0,0,1-3.29-.52,16.79,16.79,0,0,1-1.9-.69,31.29,31.29,0,0,0,5.18-4.2,31.35,31.35,0,0,0,4.2-5.19,16.93,16.93,0,0,1,.69,1.91C28.27,22.36,28,24.94,26.45,26.45Z"/></svg>`;

    export class BwBeyondWordsLogo extends BwPlayerConsumer {
      _link = null;
      _listener = null;

      constructor() {
        super();
        this._link = document.createElement("a");
        this._link.target = "_blank";
        this._link.rel = "noreferrer";
        this._link.style.display = "inline-flex";
        this._link.style.cursor = "pointer";
        this._link.innerHTML = LOGO_SVG;
      }

      #render() {
        const analyticsId = this._player?.analyticsId ?? "";
        this._link.href = `https://beyondwords.io/?utm_source=${encodeURIComponent(window.location.origin)}&utm_medium=player&utm_campaign=${analyticsId}`;
      }

      connectedCallback() {
        super.connectedCallback();
        this._listener = this._player?.addEventListener("<any>", () => this.#render());
        this.#render();
        this.appendChild(this._link);
      }

      disconnectedCallback() {
        this._player?.removeEventListener("<any>", this._listener);
        this._listener = null;
        super.disconnectedCallback();
      }
    }

    customElements.define("bw-beyondwords-logo", BwBeyondWordsLogo);
    ```
  </Tab>
</Tabs>

## Installation

<CodeGroup>
  ```bash npm theme={null}
  npx @beyondwords/cli components add beyondwords-logo --html
  ```

  ```bash pnpm theme={null}
  pnpm dlx @beyondwords/cli components add beyondwords-logo --html
  ```

  ```bash yarn theme={null}
  yarn dlx @beyondwords/cli components add beyondwords-logo --html
  ```

  ```bash bun theme={null}
  bunx --bun @beyondwords/cli components add beyondwords-logo --html
  ```
</CodeGroup>

## Usage

Import the modules (each calls `customElements.define`), then use the element inside a `<bw-player-provider>`.

```html theme={null}
<bw-player-provider
  data-project-id="9504"
  data-content-id="ba00ef51-03ac-4a85-8b98-e45c957e8ef8"
  data-show-user-interface="false"
>
  <bw-beyondwords-logo></bw-beyondwords-logo>
</bw-player-provider>

<script type="module">
  import "@/registry/html/PlayerProvider";
  import "@/registry/html/BeyondWordsLogo";
</script>
```

`<bw-beyondwords-logo>` renders the BeyondWords logo as a link to beyondwords.io,
tagged with UTM parameters and the player's `analyticsId` (read from the nearest
[`<bw-player-provider>`](/player-ui/html/player-provider) ancestor). The SVG uses
`currentColor`, so it inherits the surrounding text color — style it by setting
the color on a parent.

<Warning>
  These components expect the BeyondWords player to be available as a global
  `BeyondWords` (the player UMD script). Load it before the provider connects.
</Warning>

## Reference

|                       |                                                                                                       |
| --------------------- | ----------------------------------------------------------------------------------------------------- |
| **Attributes**        | None                                                                                                  |
| **Player state read** | `analyticsId`                                                                                         |
| **Events emitted**    | None                                                                                                  |
| **Requires**          | a [`<bw-player-provider>`](/player-ui/html/player-provider) ancestor and the player UMD global loaded |
