@layer components {
  /* ========================================
   * Prose Editor
   * ======================================== */

  .editor {
    display: flex;
    flex-direction: column;
    block-size: 100%;
    max-inline-size: var(--editor-max-width);
    margin-inline: auto;
    padding: var(--block-space) var(--inline-space);
  }

  /* -- Header -- */

  .editor__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--inline-space-half);
    padding-block-end: var(--block-space-half);
    border-block-end: var(--border);
    margin-block-end: var(--block-space-half);
  }

  .editor__nav {
    display: flex;
    align-items: center;
    gap: var(--inline-space-half);
  }

  .editor__nav-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.25em;
    border-radius: var(--radius);
    color: var(--color-ink);
    text-decoration: none;
    transition: background-color var(--transition-fast);
  }

  .editor__nav-btn:hover {
    background-color: oklch(var(--lch-ink-lighter));
  }

  .editor__nav-btn--disabled {
    opacity: 0.3;
    pointer-events: none;
  }

  .editor__chapter-title {
    font-weight: 600;
    font-size: var(--text-medium);
    color: var(--color-ink);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-inline-size: 20ch;
  }

  .editor__meta {
    display: flex;
    align-items: center;
    gap: var(--inline-space);
    font-size: var(--text-small);
    color: oklch(var(--lch-ink-dark));
  }

  .editor__word-count {
    font-variant-numeric: tabular-nums;
  }

  .editor__status {
    padding: 0.15em 0.6em;
    border-radius: 99rem;
    font-size: var(--text-small);
    font-weight: 500;
  }

  /* -- Editor Body -- */

  .editor__body {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-block-size: 0;
  }

  /* -- Action Bar -- */

  .editor__actions {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--inline-space-half);
    padding-block-start: var(--block-space-half);
    border-block-start: var(--border);
  }

  .editor__action-group {
    display: flex;
    align-items: center;
    gap: var(--inline-space-half);
    flex-wrap: wrap;
  }

  .editor__action-group--secondary {
    display: flex;
    align-items: center;
    gap: var(--inline-space);
  }

  /* -- Streaming indicator -- */

  .editor__streaming {
    display: inline-flex;
    align-items: center;
    gap: 0.5ch;
    font-size: var(--text-small);
    color: oklch(var(--lch-ink-dark));
  }

  .editor__streaming-dot {
    display: inline-block;
    inline-size: 6px;
    block-size: 6px;
    border-radius: 50%;
    background: var(--color-link);
    animation: editor-pulse 1s ease-in-out infinite;
  }

  @keyframes editor-pulse {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.3; }
  }

  /* -- Error banner -- */

  .editor__error {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: var(--block-space-half) var(--inline-space);
    background: oklch(var(--lch-ink-lighter));
    border-radius: var(--radius-lg);
    margin-block-start: var(--block-space-half);
    color: var(--color-negative);
    font-size: var(--text-small);
  }

  /* -- Status badges -- */

  .status--draft {
    background: oklch(var(--lch-ink-lighter));
    color: oklch(var(--lch-ink-dark));
  }

  .status--revised {
    background: oklch(var(--lch-link) / 0.15);
    color: var(--color-link);
  }

  .status--final {
    background: oklch(var(--lch-positive) / 0.15);
    color: var(--color-positive);
  }

  /* -- Tiptap Editor Rendering --
   * Styles for the ProseMirror editor element rendered by Tiptap. */

  .editor__tiptap {
    flex: 1;
    inline-size: 100%;
    min-block-size: 200px;
    padding: var(--block-space) var(--inline-space);
    border: none;
    outline: none;
    background: transparent;
    color: var(--color-ink);
    font-family: var(--font-serif);
    font-size: var(--text-medium);
    line-height: var(--line-height-loose);
    overflow-y: auto;
    white-space: pre-wrap;
    overflow-wrap: break-word;
  }

  .editor__tiptap:focus {
    outline: none;
  }

  /* ProseMirror paragraph spacing — use margin-block-end for visual separation
   * between paragraphs in the prose editor. Without this, consecutive <p>
   * elements run together with no gap, making the text hard to read. */
  .editor__tiptap p {
    margin: 0;
    margin-block-end: var(--block-space);
  }

  .editor__tiptap p:last-child {
    margin-block-end: 0;
  }

  /* Italic and bold rendering in the prose editor */
  .editor__tiptap em {
    font-style: italic;
  }

  .editor__tiptap strong {
    font-weight: 700;
  }

  /* Placeholder text (via @tiptap/extension-placeholder) */
  .editor__tiptap p.is-editor-empty:first-child::before {
    content: attr(data-placeholder);
    color: oklch(var(--lch-ink-medium));
    float: inline-start;
    block-size: 0;
    pointer-events: none;
  }

  /* -- Mobile -- */

  @media (max-width: 799px) {
    .editor {
      padding: var(--block-space-half) var(--inline-space-half);
    }

    .editor__chapter-title {
      max-inline-size: 12ch;
    }

    .editor__actions {
      position: sticky;
      inset-block-end: calc(var(--nav-height) + var(--safe-inset-bottom));
      background: var(--color-canvas);
      padding: var(--block-space-half) var(--inline-space-half);
      z-index: var(--z-base);
    }
  }

  /* -- Bubble Menu --
   * Floating toolbar for italic/bold. Appears on text selection. */

  .bubble-menu {
    position: absolute;
    display: flex;
    align-items: center;
    gap: 2px;
    padding: 4px;
    background: var(--color-ink);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    z-index: var(--z-popover);
    transform: translateX(-50%);
  }

  .bubble-menu__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-inline-size: 32px;
    min-block-size: 32px;
    padding: 2px 8px;
    border: none;
    border-radius: calc(var(--radius) - 2px);
    background: transparent;
    color: var(--color-canvas);
    font-family: var(--font-serif);
    font-size: var(--text-small);
    font-weight: 700;
    cursor: pointer;
    transition: background-color var(--transition-fast);
  }

  .bubble-menu__btn:hover {
    background: oklch(var(--lch-canvas) / 0.2);
  }

  .bubble-menu__btn--active {
    background: oklch(var(--lch-canvas) / 0.3);
  }
}
