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

# Page title

> Page titles help people understand where they are in a product and can surface related navigation, context, and actions.

export const CodeLivePreview = ({code, children, height, removePadding = false, mode = 'shadow'}) => {
  const previewRef = useRef(null);
  const BEEQ_ESM_URL = 'https://esm.sh/@beeq/core/dist/beeq/beeq.esm.js';
  const BEEQ_CSS_URL = 'https://esm.sh/@beeq/core/dist/beeq/beeq.css';
  const BEEQ_ICONS_URL = 'https://esm.sh/@beeq/core/dist/beeq/svg';
  const ensureParentBeeqRuntime = () => {
    if (document.querySelector('script[data-beeq-parent-runtime]')) return;
    const script = document.createElement('script');
    script.type = 'module';
    script.src = BEEQ_ESM_URL;
    script.dataset.beeqParentRuntime = BEEQ_ICONS_URL;
    document.head.appendChild(script);
  };
  const executeSnippetScripts = (root, runtimeWindow, previewRootArg, skipAttr) => {
    root.querySelectorAll('script').forEach(oldScript => {
      if (skipAttr && oldScript.hasAttribute(skipAttr)) return;
      if (oldScript.src) {
        const newScript = runtimeWindow.document.createElement('script');
        newScript.src = oldScript.src;
        oldScript.replaceWith(newScript);
        return;
      }
      runtimeWindow.Function('previewRoot', oldScript.textContent || '')(previewRootArg);
      oldScript.remove();
    });
  };
  const syncIframeMode = iframeDoc => {
    const root = document.documentElement;
    const explicitMode = root.getAttribute('bq-mode');
    const isDark = root.classList.contains('dark');
    const resolvedMode = explicitMode || (isDark ? 'dark' : 'light');
    iframeDoc.documentElement.setAttribute('bq-mode', resolvedMode);
    iframeDoc.body.setAttribute('bq-mode', resolvedMode);
  };
  useEffect(() => {
    if (mode === 'shadow') ensureParentBeeqRuntime();
  }, [mode]);
  useEffect(() => {
    const container = previewRef.current;
    if (!container) return;
    if (removePadding) container.style.padding = '0';
    container.innerHTML = '';
    if (mode === 'iframe') {
      const iframe = document.createElement('iframe');
      iframe.className = 'preview-iframe';
      iframe.style.width = '100%';
      iframe.style.border = '0';
      iframe.style.display = 'block';
      iframe.style.minHeight = height ?? '0px';
      iframe.setAttribute('title', 'Live code preview');
      iframe.setAttribute('loading', 'lazy');
      iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin');
      container.appendChild(iframe);
      const iframeDoc = iframe.contentDocument;
      const iframeWin = iframe.contentWindow;
      if (!iframeDoc || !iframeWin) return;
      iframeDoc.open();
      iframeDoc.write(['<!doctype html>', '<html>', '<head>', '  <meta charset="utf-8" />', '  <meta name="viewport" content="width=device-width, initial-scale=1" />', '  <style>html,body{margin:0;padding:0;min-height:100%;}</style>', `  <link rel="stylesheet" href="${BEEQ_CSS_URL}" />`, `  <script type="module" src="${BEEQ_ESM_URL}" data-beeq-iframe-runtime="${BEEQ_ICONS_URL}"></script>`, '</head>', '<body>', code, '</body>', '</html>'].join('\n'));
      iframeDoc.close();
      syncIframeMode(iframeDoc);
      const modeObserver = new MutationObserver(() => syncIframeMode(iframeDoc));
      modeObserver.observe(document.documentElement, {
        attributes: true,
        attributeFilter: ['class', 'bq-mode']
      });
      executeSnippetScripts(iframeDoc, iframeWin, iframeDoc, 'data-beeq-iframe-runtime');
      return () => modeObserver.disconnect();
    }
    const shadowRoot = container.shadowRoot ?? container.attachShadow({
      mode: 'open'
    });
    if (!shadowRoot.adoptedStyleSheets.length) {
      const fixSheet = new CSSStyleSheet();
      fixSheet.replaceSync(`
        bq-dropdown::part(panel),
        bq-panel::part(panel),
        bq-select::part(panel),
        bq-date-picker::part(panel) { z-index: 9999; }
        bq-tooltip::part(panel) { position: absolute; }
      `);
      shadowRoot.adoptedStyleSheets = [fixSheet];
    }
    shadowRoot.innerHTML = [`<link rel="stylesheet" href="${BEEQ_CSS_URL}">`, code].join('');
    executeSnippetScripts(shadowRoot, window, shadowRoot);
    return undefined;
  }, [code, mode, height]);
  return <div className="code-live-preview not-prose">
      {}
      <div className="preview" ref={previewRef} style={{
    minHeight: height
  }} />

      {}
      {children && <div className="code">{children}</div>}
    </div>;
};

<Frame className="px-4 py-4" caption="Page title component overview">
  <img className="block dark:hidden" src="https://mintcdn.com/beeq/wg4EwK5G4l2plt8W/components/images/page-title/page-title-overview-light.svg?fit=max&auto=format&n=wg4EwK5G4l2plt8W&q=85&s=4651926f0cb5253aa5ad949515bf9544" alt="BEEQ Page title component overview" width="640" height="636" data-path="components/images/page-title/page-title-overview-light.svg" />

  <img className="hidden dark:block" src="https://mintcdn.com/beeq/wg4EwK5G4l2plt8W/components/images/page-title/page-title-overview-dark.svg?fit=max&auto=format&n=wg4EwK5G4l2plt8W&q=85&s=5394d77f1b1b55222d09960c99850e0f" alt="BEEQ Page title component overview" width="640" height="636" data-path="components/images/page-title/page-title-overview-dark.svg" />
</Frame>

Page titles introduce the current page or section and can pair the main heading with navigation, context, and related actions. Use them when the top of the page should confirm location immediately and keep the most relevant page-level controls nearby.

<Note>
  `bq-page-title` is slot-based. Use the default slot for the main title, `back` for navigation, `sub-title` for supporting text, and `suffix` for related actions.
</Note>

## When to use

<CardGroup cols={2}>
  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="thumbs-up" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Use page titles when
    </span>

    * The page needs a clear H1-level title
    * People benefit from a back action or supporting context near the heading
    * Related page-level actions should stay close to the title instead of being scattered across the layout
    * The page should immediately confirm where the user is
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="thumbs-down" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Do not use page titles when
    </span>

    * A smaller section heading is enough
    * Several competing actions would overload the title area
    * The title repeats information that is already obvious from surrounding context
    * Extra supporting text would make the top of the page harder to scan
  </Card>
</CardGroup>

## Patterns

The common page-title compositions build from the same base component.

<CardGroup cols={2}>
  <Card title="Title only">
    The simplest pattern, used when the page heading alone provides enough context.
  </Card>

  <Card title="Title with back navigation">
    Useful for nested screens, sub-pages, or multi-step flows where users may need to return to a previous page.
  </Card>

  <Card title="Title with subtitle">
    Adds supporting context when the page needs a little more explanation than the main title alone can provide.
  </Card>

  <Card title="Title with actions">
    Keeps page-level actions such as edit, save, or download close to the heading they affect.
  </Card>
</CardGroup>

## Anatomy

Page titles combine a required H1 with optional supporting slots. This makes it easy to keep navigation, context, and related actions grouped in one predictable place.

| Part  | Element   | Description                                        |
| ----- | --------- | -------------------------------------------------- |
| **1** | Back      | Optional slot used for back navigation             |
| **2** | Title     | The main page heading rendered as an `h1`          |
| **3** | Suffix    | Optional slot for page-level actions               |
| **4** | Sub-title | Optional supporting text shown below the title row |

## Design guidelines

The page title component already renders the main title inside an `h1`. Use it for the primary page heading, not for lower-level section labels.
Follow this sequence when you define a page title:

<Steps>
  <Step title="Write the title first">
    Start with the shortest heading that clearly identifies the page. The main title should confirm location immediately without sounding like a sentence.
  </Step>

  <Step title="Add context only when needed">
    Use the subtitle for clarifying details that help users act or understand scope. If the subtitle repeats the title, remove it.
  </Step>

  <Step title="Keep actions focused">
    Only place page-level actions in the suffix area. If the title bar starts competing with the page content, reduce or relocate the actions.
  </Step>
</Steps>

<Warning>
  Use `bq-page-title` once per page view and only at the top of the main content area. Placing it inside cards, panels, or repeating list items creates multiple `h1` elements on the same page, which breaks heading hierarchy for screen readers.
</Warning>

## Usage

### Default

Use the default composition when the title alone provides enough context.

<CodeLivePreview
  mode="shadow"
  code={`
<style>
bq-page-title {
  inline-size: 100% !important;
}
</style>
<bq-page-title>
  Title
</bq-page-title>
`}
>
  <CodeGroup>
    ```html HTML icon="html5" theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-page-title>
      Title
    </bq-page-title>
    ```

    ```jsx React icon="react" theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqPageTitle } from "@beeq/react";

    <BqPageTitle>
      Title
    </BqPageTitle>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqPageTitle } from "@beeq/angular/standalone";

    @Component({
      selector: "app-root",
      standalone: true,
      imports: [BqPageTitle],
      template: `
        <bq-page-title>
          Title
        </bq-page-title>
      `,
    })
    export class AppComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqPageTitle } from "@beeq/vue";
    </script>

    <template>
      <BqPageTitle>
        Title
      </BqPageTitle>
    </template>
    ```
  </CodeGroup>
</CodeLivePreview>

### Title + Back

Use a back action when the page is part of a flow or nested navigation path.

<CodeLivePreview
  mode="shadow"
  code={`
<style>
bq-page-title {
  inline-size: 100% !important;
}
</style>
<bq-page-title>
  <bq-button appearance="link" slot="back" only-icon>
    <bq-icon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page"></bq-icon>
  </bq-button>
  Title
</bq-page-title>
`}
>
  <CodeGroup>
    ```html HTML icon="html5" theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-page-title>
      <bq-button appearance="link" slot="back" only-icon>
        <bq-icon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page"></bq-icon>
      </bq-button>
      Title
    </bq-page-title>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqButton, BqIcon, BqPageTitle } from "@beeq/react";

    <BqPageTitle>
      <BqButton appearance="link" slot="back" onlyIcon>
        <BqIcon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page" />
      </BqButton>
      Title
    </BqPageTitle>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqPageTitle, BqButton, BqIcon } from "@beeq/angular/standalone";

    @Component({
      selector: "app-root",
      standalone: true,
      imports: [BqPageTitle, BqButton, BqIcon],
      template: `
        <bq-page-title>
          <bq-button appearance="link" slot="back" only-icon>
            <bq-icon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page"></bq-icon>
          </bq-button>
          Title
        </bq-page-title>
      `,
    })
    export class AppComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqButton, BqIcon, BqPageTitle } from "@beeq/vue";
    </script>

    <template>
      <BqPageTitle>
        <BqButton appearance="link" slot="back" onlyIcon>
          <BqIcon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page" />
        </BqButton>
        Title
      </BqPageTitle>
    </template>
    ```
  </CodeGroup>
</CodeLivePreview>

### Title + Back + Subtitle

Add a subtitle when people need a little more context before acting.

<CodeLivePreview
  mode="shadow"
  code={`
<style>
bq-page-title {
  inline-size: 100% !important;
}
</style>
<bq-page-title>
  <bq-button appearance="link" slot="back" only-icon>
    <bq-icon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page"></bq-icon>
  </bq-button>
  Title
  <div slot="sub-title">Sub-title</div>
</bq-page-title>
`}
>
  <CodeGroup>
    ```html HTML icon="html5" theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-page-title>
      <bq-button appearance="link" slot="back" only-icon>
        <bq-icon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page"></bq-icon>
      </bq-button>
      Title
      <div slot="sub-title">Sub-title</div>
    </bq-page-title>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqButton, BqIcon, BqPageTitle } from "@beeq/react";

    <BqPageTitle>
      <BqButton appearance="link" slot="back" onlyIcon>
        <BqIcon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page" />
      </BqButton>
      Title
      <div slot="sub-title">Sub-title</div>
    </BqPageTitle>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqPageTitle, BqButton, BqIcon } from "@beeq/angular/standalone";

    @Component({
      selector: "app-root",
      standalone: true,
      imports: [BqPageTitle, BqButton, BqIcon],
      template: `
        <bq-page-title>
          <bq-button appearance="link" slot="back" only-icon>
            <bq-icon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page"></bq-icon>
          </bq-button>
          Title
          <div slot="sub-title">Sub-title</div>
        </bq-page-title>
      `,
    })
    export class AppComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqButton, BqIcon, BqPageTitle } from "@beeq/vue";
    </script>

    <template>
      <BqPageTitle>
        <BqButton appearance="link" slot="back" onlyIcon>
          <BqIcon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page" />
        </BqButton>
        Title
        <div slot="sub-title">Sub-title</div>
      </BqPageTitle>
    </template>
    ```
  </CodeGroup>
</CodeLivePreview>

## Options

### Title + Actions

Use the suffix slot for page-level actions when back navigation is not relevant — for example, a top-level list page with a primary action.

<CodeLivePreview
  mode="shadow"
  code={`
<style>
bq-page-title {
  inline-size: 100% !important;

  & [slot="suffix"] {
    display: flex;
    align-items: center;
    flex-grow: 1;
    justify-content: flex-end;
  }
}
</style>
<bq-page-title>
Dashboard users
<div slot="suffix">
  <bq-button>
    <bq-icon name="plus" aria-hidden="true" slot="prefix"></bq-icon>
    Add user
  </bq-button>
</div>
</bq-page-title>
`}
>
  <CodeGroup>
    ```html HTML icon="html5" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-page-title>
      Dashboard users
      <div slot="suffix">
        <bq-button>
          <bq-icon name="plus" aria-hidden="true" slot="prefix"></bq-icon>
          Add user
        </bq-button>
      </div>
    </bq-page-title>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqButton, BqIcon, BqPageTitle } from "@beeq/react";

    <BqPageTitle>
      Dashboard users
      <div slot="suffix">
        <BqButton>
          <BqIcon name="plus" aria-hidden="true" slot="prefix" />
          Add user
        </BqButton>
      </div>
    </BqPageTitle>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqPageTitle, BqButton, BqIcon } from "@beeq/angular/standalone";

    @Component({
      selector: "app-root",
      standalone: true,
      imports: [BqPageTitle, BqButton, BqIcon],
      template: `
        <bq-page-title>
          Dashboard users
          <div slot="suffix">
            <bq-button>
              <bq-icon name="plus" aria-hidden="true" slot="prefix"></bq-icon>
              Add user
            </bq-button>
          </div>
        </bq-page-title>
      `,
    })
    export class AppComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqButton, BqIcon, BqPageTitle } from "@beeq/vue";
    </script>

    <template>
      <BqPageTitle>
        Dashboard users
        <div slot="suffix">
          <BqButton>
            <BqIcon name="plus" aria-hidden="true" slot="prefix" />
            Add user
          </BqButton>
        </div>
      </BqPageTitle>
    </template>
    ```
  </CodeGroup>
</CodeLivePreview>

### Title + Back + Subtitle + Actions

Use the suffix slot when the title area needs page-level actions such as edit or download.

<CodeLivePreview
  mode="shadow"
  code={`
<style>
bq-page-title {
  inline-size: 100% !important;

  & [slot="suffix"] {
    display: flex;
    flex-grow: 1;
    justify-content: end;
  }

  & [slot="suffix"] bq-button {
    padding: var(--bq-spacing-xs2);
  }
}
</style>
<bq-page-title>
  <bq-button appearance="link" slot="back" only-icon>
    <bq-icon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page"></bq-icon>
  </bq-button>
  Title
  <div slot="sub-title">Sub-title</div>
  <div slot="suffix">
    <bq-button appearance="text" size="small" only-icon>
      <bq-icon name="pencil-simple-bold" color="text--brand" aria-label="Edit"></bq-icon>
    </bq-button>
    <bq-button appearance="text" size="small" only-icon>
      <bq-icon name="download-simple-bold" color="text--brand" aria-label="Download"></bq-icon>
    </bq-button>
  </div>
</bq-page-title>
`}
>
  <CodeGroup>
    ```css styles.css icon="css" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    bq-page-title {
      inline-size: 100% !important;

      & [slot="suffix"] {
        display: flex;
        flex-grow: 1;
        justify-content: end;
      }

      & [slot="suffix"] bq-button {
        padding: var(--bq-spacing-xs2);
      }
    }
    ```

    ```html HTML icon="html5" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-page-title>
      <bq-button appearance="link" slot="back" only-icon>
        <bq-icon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page"></bq-icon>
      </bq-button>
      Title
      <div slot="sub-title">Sub-title</div>
      <div slot="suffix">
        <bq-button appearance="text" size="small" only-icon>
          <bq-icon name="pencil-simple-bold" color="text--brand" aria-label="Edit"></bq-icon>
        </bq-button>
        <bq-button appearance="text" size="small" only-icon>
          <bq-icon name="download-simple-bold" color="text--brand" aria-label="Download"></bq-icon>
        </bq-button>
      </div>
    </bq-page-title>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqButton, BqIcon, BqPageTitle } from "@beeq/react";
    import "./styles.css";

    <BqPageTitle>
      <BqButton appearance="link" slot="back" onlyIcon>
        <BqIcon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page" />
      </BqButton>
      Title
      <div slot="sub-title">Sub-title</div>
      <div slot="suffix">
        <BqButton appearance="text" size="small" onlyIcon>
          <BqIcon name="pencil-simple-bold" color="text--brand" aria-label="Edit" />
        </BqButton>
        <BqButton appearance="text" size="small" onlyIcon>
          <BqIcon name="download-simple-bold" color="text--brand" aria-label="Download" />
        </BqButton>
      </div>
    </BqPageTitle>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqPageTitle, BqButton, BqIcon } from "@beeq/angular/standalone";

    @Component({
      selector: "app-root",
      standalone: true,
      imports: [BqPageTitle, BqButton, BqIcon],
      template: `
        <bq-page-title>
          <bq-button appearance="link" slot="back" only-icon>
            <bq-icon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page"></bq-icon>
          </bq-button>
          Title
          <div slot="sub-title">Sub-title</div>
          <div slot="suffix">
            <bq-button appearance="text" size="small" only-icon>
              <bq-icon name="pencil-simple-bold" color="text--brand" aria-label="Edit"></bq-icon>
            </bq-button>
            <bq-button appearance="text" size="small" only-icon>
              <bq-icon name="download-simple-bold" color="text--brand" aria-label="Download"></bq-icon>
            </bq-button>
          </div>
        </bq-page-title>
      `,
      styles: [`
        bq-page-title {
          inline-size: 100% !important;

          & [slot="suffix"] {
            display: flex;
            flex-grow: 1;
            justify-content: end;
          }

          & [slot="suffix"] bq-button {
            padding: var(--bq-spacing-xs2);
          }
        }
      `],
    })
    export class AppComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqButton, BqIcon, BqPageTitle } from "@beeq/vue";
    </script>

    <template>
      <BqPageTitle>
        <BqButton appearance="link" slot="back" onlyIcon>
          <BqIcon color="text--primary" name="arrow-left" weight="bold" title="Navigate back to the previous page" />
        </BqButton>
        Title
        <div slot="sub-title">Sub-title</div>
        <div slot="suffix">
          <BqButton appearance="text" size="small" onlyIcon>
            <BqIcon name="pencil-simple-bold" color="text--brand" aria-label="Edit" />
          </BqButton>
          <BqButton appearance="text" size="small" onlyIcon>
            <BqIcon name="download-simple-bold" color="text--brand" aria-label="Download" />
          </BqButton>
        </div>
      </BqPageTitle>
    </template>


    <style>
      bq-page-title {
        inline-size: 100% !important;

        & [slot="suffix"] {
          display: flex;
          flex-grow: 1;
          justify-content: end;
        }

        & [slot="suffix"] bq-button {
          padding: var(--bq-spacing-xs2);
        }
      }
    </style>
    ```
  </CodeGroup>
</CodeLivePreview>

## Best practices

<CardGroup cols={2}>
  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="check" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Do
    </span>

    Use the page title for the main page heading so people can understand location immediately.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="xmark" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Don't
    </span>

    Do not use the component for lower-level section labels that should remain inside the page content.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="check" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Do
    </span>

    Keep the title concise and use the subtitle only when it adds real context.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="xmark" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Don't
    </span>

    Do not repeat the same message across the title and subtitle or turn the header into a paragraph.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="check" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Do
    </span>

    Use the back slot for clear return navigation when the page belongs to a nested flow.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="xmark" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Don't
    </span>

    Do not add decorative icons that look like actions but have no clear purpose.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="check" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Do
    </span>

    Keep suffix actions limited to the page-level controls users are most likely to need right away.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="xmark" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Don't
    </span>

    Do not overload the title area with too many actions or controls that compete with the heading itself.
  </Card>
</CardGroup>

## Accessibility

* Only one `h1` may exist per page. Do not place `bq-page-title` inside panels, cards, drawers, or any context where it would render alongside another `h1`.
* When using an icon-only back button, add `role="img"` and a descriptive `title` attribute to `bq-icon` (e.g., `title="Navigate back to the previous page"`) so screen readers announce the icon's purpose rather than its name.
* `bq-page-title` renders the main title inside an `h1`, so the default slot should contain the primary heading for the page.
* Back and suffix content are slotted, so their accessibility depends on what you place there. Use real buttons or links with clear accessible names.
* The subtitle is additional context, not a replacement for the title. Keep the main heading understandable on its own.
* If you use icon-only controls in `back` or `suffix`, make sure they have an accessible label and not just a visual symbol.

## API reference

### Properties

| Property | Attribute | Description                                      | Type | Default |
| -------- | --------- | ------------------------------------------------ | ---- | ------- |
| None     | None      | This component does not expose public properties | —    | —       |

### Slots

| Slot        | Description                                        |
| ----------- | -------------------------------------------------- |
| *(default)* | The main page title content                        |
| `back`      | Optional back navigation action                    |
| `sub-title` | Optional supporting text shown below the title row |
| `suffix`    | Optional trailing actions shown beside the title   |

### Shadow parts

| Part           | Description                                                  |
| -------------- | ------------------------------------------------------------ |
| `base`         | The inner container that holds the full page title component |
| `back`         | The container for the back slot                              |
| `content`      | The main title and subtitle container                        |
| `title-suffix` | The row containing the title and suffix                      |
| `title`        | The `h1` title element                                       |
| `suffix`       | The container for the suffix slot                            |
| `sub-title`    | The container for the subtitle slot                          |

### CSS custom properties

<Expandable title="CSS variables" defaultOpen={true}>
  | Variable                    | Description                                | Default                               |
  | --------------------------- | ------------------------------------------ | ------------------------------------- |
  | `--paddingY`                | Vertical padding of the page title wrapper | `var(--bq-spacing-xl)`                |
  | `--subtitle-borderBlockEnd` | Border below the page title area           | `1px solid var(--bq-stroke--primary)` |
  | `--subtitle-fontWeight`     | Subtitle font weight                       | `var(--bq-font-weight--medium)`       |
  | `--subtitle-textColor`      | Subtitle text color                        | `var(--bq-text--secondary)`           |
  | `--subtitle-textSize`       | Subtitle font size                         | `var(--bq-font-size--l)`              |
  | `--title-fontWeight`        | Title font weight                          | `var(--bq-font-weight--bold)`         |
  | `--title-lineHeight`        | Title line height                          | `var(--bq-font-line-height--regular)` |
  | `--title-textColor`         | Title text color                           | `var(--bq-text--primary)`             |
  | `--title-textSize`          | Title font size                            | `var(--bq-font-size--xxl)`            |
</Expandable>

<Note>
  The CSS custom properties for `bq-page-title` use shorthand names (e.g., `--paddingY`, `--title-fontWeight`) rather than the `--bq-*` prefix convention used by other BEEQ components. Set these variables directly on the `bq-page-title` element or a wrapping ancestor.
</Note>

<Tip>
  Learn more about [styling with shadow parts](/guides/styles#component-shadow-dom-parts) and [CSS custom properties](/guides/styles#global-css-custom-properties).
</Tip>

## Resources

<CardGroup cols={2}>
  <Card horizontal title="Interactive playground" icon="code" href="https://storybook.beeq.design/?path=/story/components-page-title--default">
    Explore page title configurations in Storybook
  </Card>

  <Card horizontal title="Source code" icon="github" href="https://github.com/Endava/BEEQ/tree/main/packages/beeq/src/components/page-title">
    View the component source on GitHub
  </Card>
</CardGroup>
