{"version":3,"file":"index.mjs","names":["LinkIcon","InlineEquation","DefaultInlineEquation","Breadcrumb","UiBreadcrumb","Callout","CalloutCard","Separator","AspectRatio","AspectRatioPrimitive","YOUTUBE_RE","toYoutubeEmbedUrl","NOTION_SANDBOX","AspectRatio","Collapsible","Dialog","DialogPrimitive","Dialog","HoverCard","HoverCardPrimitive","HoverCard","LinkIcon","AspectRatio","Table","UiTable","Checkbox","CheckboxPrimitive","Label","LabelPrimitive","Label","Checkbox","Collapsible","AspectRatio","Defaults.Paragraph","Defaults.Heading","Defaults.BulletedListItem","Defaults.NumberedListItem","Defaults.ToDo","Defaults.Toggle","Defaults.Callout","Defaults.Quote","Defaults.Code","Defaults.Equation","Defaults.Divider","Defaults.Image","Defaults.Video","Defaults.Audio","Defaults.File","Defaults.Pdf","Defaults.Bookmark","Defaults.LinkPreview","Defaults.LinkToPage","Defaults.ChildPage","Defaults.ChildDatabase","Defaults.Embed","Defaults.Table","Defaults.Unsupported","Defaults.ColumnList","Defaults.Column","Defaults.SyncedBlock","Defaults.Breadcrumb","Defaults.TableOfContents"],"sources":["../src/context.tsx","../src/lib/notion-file.ts","../src/lib/notion-color.ts","../src/rich-text/Annotation.tsx","../src/rich-text/InlineEquation.tsx","../src/lib/normalize-page-id.ts","../src/rich-text/Mention.tsx","../src/rich-text/RichText.tsx","../src/rich-text/Caption.tsx","../src/blocks/Audio.tsx","../src/components/ui/card.tsx","../src/embeds/OgCard.tsx","../src/embeds/useOgp.ts","../src/blocks/Bookmark.tsx","../src/components/ui/breadcrumb.tsx","../src/blocks/Breadcrumb.tsx","../src/lib/group-list-items.ts","../src/NotionBlocks.tsx","../src/blocks/BulletedListItem.tsx","../src/components/ui/alert.tsx","../src/components/callout.tsx","../src/blocks/Callout.tsx","../src/blocks/ChildDatabase.tsx","../src/blocks/ChildPage.tsx","../src/blocks/Column.tsx","../src/blocks/ColumnList.tsx","../src/blocks/Divider.tsx","../src/components/ui/aspect-ratio.tsx","../src/blocks/Embed.tsx","../src/blocks/Equation.tsx","../src/components/ui/item.tsx","../src/blocks/File.tsx","../src/blocks/Heading.tsx","../src/components/ui/dialog.tsx","../src/blocks/Image.tsx","../src/components/ui/hover-card.tsx","../src/blocks/LinkPreview.tsx","../src/blocks/LinkToPage.tsx","../src/blocks/NumberedListItem.tsx","../src/blocks/Paragraph.tsx","../src/blocks/Pdf.tsx","../src/blocks/Quote.tsx","../src/blocks/SyncedBlock.tsx","../src/components/ui/table.tsx","../src/blocks/Table.tsx","../src/blocks/TableOfContents.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/label.tsx","../src/blocks/ToDo.tsx","../src/blocks/Toggle.tsx","../src/components/ui/empty.tsx","../src/blocks/Unsupported.tsx","../src/blocks/Video.tsx","../src/blocks/index.ts","../src/BlockSwitch.tsx","../src/embeds/index.ts","../src/lib/extract-headings.ts","../src/NotionRenderer.tsx","../src/NotionThemeProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n  AnchorHTMLAttributes,\n  ElementType,\n  ImgHTMLAttributes,\n} from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { ExtractedHeading } from \"./lib/extract-headings.js\";\nimport type {\n  BlockClassNames,\n  ComponentOverrides,\n  PageLinkMap,\n  ResolveImageUrlFn,\n  ResolvePageTitleFn,\n  ResolvePageUrlFn,\n} from \"./types.js\";\n\n/**\n * レスポンシブ画像生成に使う幅 (px) のリスト。\n * `Image` ブロックが proxy URL を受け取った場合、`?w={width}` を付けた `srcSet` を生成する。\n */\nexport type ImageSizes = readonly number[];\n\n/**\n * `NotionRenderer` がツリー全体に提供する Context の値。\n * カスタムブロックコンポーネントから `useNotionContext()` で参照する。\n *\n * @see {@link useNotionContext}\n */\nexport interface NotionRendererContextValue {\n  components: ComponentOverrides;\n  classNames?: BlockClassNames;\n  resolveImageUrl?: ResolveImageUrlFn;\n  /** Notion 内部リンクの解決マップ（`buildPageLinkMap` の戻り値）。 */\n  pageLinks?: PageLinkMap;\n  resolvePageUrl?: ResolvePageUrlFn;\n  resolvePageTitle?: ResolvePageTitleFn;\n  Image?: ElementType<ImgHTMLAttributes<HTMLImageElement>>;\n  Link?: ElementType<AnchorHTMLAttributes<HTMLAnchorElement>>;\n  /** ページ全体の見出し一覧（TOC 用、`NotionRenderer` が自動抽出）。 */\n  headings?: ExtractedHeading[];\n  /** numbered_list の入れ子深さ。`<ol>` の list-style ローテーションに使う。 */\n  listDepth?: number;\n  /**\n   * `srcSet` 生成に使う幅 (px) のリスト。指定すると `Image` ブロックは\n   * `?w={width}` クエリ付きの URL を `srcSet` として出力する。\n   */\n  imageSizes?: ImageSizes;\n  /** `Image` ブロックに渡す `sizes` 属性 (`srcSet` と組合せて使う)。 */\n  imageSizesAttr?: string;\n  /** OGP カードのページアクセス時取得エンドポイント。`useOgp` が参照する。 */\n  ogpEndpoint?: string;\n}\n\nexport const NotionContext = createContext<NotionRendererContextValue>({\n  components: {},\n});\n\n/**\n * `NotionRenderer` の Context にアクセスする hook。\n * カスタムブロックコンポーネントから `components` / `classNames` / `resolveImageUrl` などを取得する。\n *\n * @example\n * ```tsx\n * function MyCodeBlock({ block, className }: BlockComponentProps) {\n *   const { Link } = useNotionContext();\n *   return <pre className={className}><code>...</code></pre>;\n * }\n * ```\n *\n * @see {@link NotionRendererContextValue}\n */\nexport const useNotionContext = () => useContext(NotionContext);\n","type NotionFileObject =\n  | { type: \"external\"; external: { url: string } }\n  | { type: \"file\"; file: { url: string } };\n\nexport function getFileUrl(file: NotionFileObject): string {\n  return file.type === \"external\" ? file.external.url : file.file.url;\n}\n","export type NotionColor = string;\n\nconst FG: Record<string, string> = {\n  gray: \"text-gray-500\",\n  brown: \"text-amber-800\",\n  orange: \"text-orange-500\",\n  yellow: \"text-yellow-600\",\n  green: \"text-green-600\",\n  blue: \"text-blue-600\",\n  purple: \"text-purple-600\",\n  pink: \"text-pink-600\",\n  red: \"text-red-600\",\n};\n\nconst BG: Record<string, string> = {\n  gray_background: \"bg-gray-100\",\n  brown_background: \"bg-amber-100\",\n  orange_background: \"bg-orange-100\",\n  yellow_background: \"bg-yellow-100\",\n  green_background: \"bg-green-100\",\n  blue_background: \"bg-blue-100\",\n  purple_background: \"bg-purple-100\",\n  pink_background: \"bg-pink-100\",\n  red_background: \"bg-red-100\",\n};\n\nconst isDefault = (c: NotionColor | undefined): boolean =>\n  !c || c === \"default\";\n\n/** rich_text の annotation 用。inline span の class を返す。背景時は rounded + 横 padding を付ける。 */\nexport function notionInlineColorClass(color: NotionColor | undefined): string {\n  if (isDefault(color)) return \"\";\n  if (color?.endsWith(\"_background\")) {\n    const bg = BG[color];\n    return bg ? `${bg} rounded px-1` : \"\";\n  }\n  return FG[color as string] ?? \"\";\n}\n\n/** block コンテナ用。背景時はブロック全体に背景を伸ばすため横 padding を厚めに付ける。 */\nexport function notionBlockColorClass(color: NotionColor | undefined): string {\n  if (isDefault(color)) return \"\";\n  if (color?.endsWith(\"_background\")) {\n    const bg = BG[color];\n    return bg ? `${bg} rounded px-3 py-2` : \"\";\n  }\n  return FG[color as string] ?? \"\";\n}\n","\"use client\";\n\nimport type { RichTextItemResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport type { ReactNode } from \"react\";\nimport { notionInlineColorClass } from \"../lib/notion-color\";\n\ntype Annotations = RichTextItemResponse[\"annotations\"];\n\nexport interface AnnotatedProps {\n  annotations: Annotations;\n  href?: string | null;\n  children: ReactNode;\n}\n\n/**\n * Notion の annotation (bold/italic/code/strikethrough/underline + color) と\n * オプションのリンクを 1 つの React 要素にラップする。\n * 色の定義は `lib/notion-color.ts` に集約。\n */\nexport function Annotated({ annotations, href, children }: AnnotatedProps) {\n  let node: ReactNode = children;\n\n  if (annotations.code) {\n    node = (\n      <code className=\"rounded bg-muted px-1 py-0.5 font-mono text-[0.9em]\">\n        {node}\n      </code>\n    );\n  } else {\n    if (annotations.bold) node = <strong>{node}</strong>;\n    if (annotations.italic) node = <em>{node}</em>;\n    if (annotations.strikethrough) node = <s>{node}</s>;\n    if (annotations.underline) node = <u>{node}</u>;\n  }\n\n  const colorClass = notionInlineColorClass(annotations.color);\n  if (colorClass) node = <span className={colorClass}>{node}</span>;\n\n  if (href) {\n    node = (\n      <a\n        href={href}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        className=\"text-primary underline underline-offset-2 hover:no-underline\"\n      >\n        {node}\n      </a>\n    );\n  }\n\n  return <>{node}</>;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nexport interface InlineEquationProps {\n  expression: string;\n  /**\n   * 同期時（`@notion-headless-cms/cms` の katex TransformStage 等）に事前組版された\n   * HTML。あれば SSR からそのまま確定描画し、クライアント側の katex 読み込みをスキップする。\n   */\n  cachedHtml?: string;\n}\n\n/**\n * インライン数式の既定描画。\n * `cachedHtml` があればそれを SSR から確定描画する。無ければ SSR 段で等幅フォントの\n * 素のテキストを返し、クライアント水和後に動的 import で `katex` を読み込み\n * `displayMode: false` で組版した HTML に置換する。\n * `katex` が peer として入っていない場合はテキストのままフォールバックする。\n */\nexport function InlineEquation({\n  expression,\n  cachedHtml,\n}: InlineEquationProps) {\n  const [html, setHtml] = useState<string | null>(cachedHtml ?? null);\n\n  useEffect(() => {\n    // import.meta.env.SSR は Vite が静的に置換する定数のため、この early return により\n    // 後続の katex の動的 import が SSR/Worker バンドルの到達可能グラフから外れ、\n    // tree-shaking で除外される。\n    if (import.meta.env.SSR || cachedHtml) return;\n    let cancelled = false;\n    (async () => {\n      try {\n        const katex = (await import(\"katex\")).default;\n        const out = katex.renderToString(expression, {\n          displayMode: false,\n          throwOnError: false,\n        });\n        if (!cancelled) setHtml(out);\n      } catch {\n        // katex 未インストール時は素のテキストフォールバックのまま。\n      }\n    })();\n    return () => {\n      cancelled = true;\n    };\n  }, [cachedHtml, expression]);\n\n  if (html) {\n    return (\n      <span\n        // biome-ignore lint/security/noDangerouslySetInnerHtml: katex の整形済み HTML\n        dangerouslySetInnerHTML={{ __html: html }}\n      />\n    );\n  }\n\n  return (\n    <code className=\"rounded bg-muted px-1 py-0.5 font-mono text-[0.9em]\">\n      {expression}\n    </code>\n  );\n}\n","/**\n * Notion ページ ID を `pageLinks` の参照キーに正規化する。\n * core の `normalizePageId` と同一実装（ダッシュ除去 + 小文字化）。\n * `buildPageLinkMap` がこの形式でキーを作るため、変更時は両方を揃えること。\n */\nexport function normalizePageId(id: string): string {\n  return id.replace(/-/g, \"\").toLowerCase();\n}\n","\"use client\";\n\nimport type { RichTextItemResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { Link as LinkIcon } from \"lucide-react\";\nimport type { ElementType } from \"react\";\nimport { useNotionContext } from \"../context\";\nimport { normalizePageId } from \"../lib/normalize-page-id\";\n\nexport interface MentionProps {\n  item: Extract<RichTextItemResponse, { type: \"mention\" }>;\n}\n\n/** rich_text の mention 種別を React で描画する。link_mention は Notion 風カードに近い見た目。 */\nexport function Mention({ item }: MentionProps) {\n  const {\n    Image: ImageSlot,\n    Link: LinkSlot,\n    pageLinks,\n    resolvePageUrl,\n    resolvePageTitle,\n  } = useNotionContext();\n  const m = item.mention;\n  const plainText = item.plain_text;\n\n  const LinkComp = (LinkSlot ?? \"a\") as ElementType<\n    React.AnchorHTMLAttributes<HTMLAnchorElement>\n  >;\n  const Img = (ImageSlot ?? \"img\") as ElementType<\n    React.ImgHTMLAttributes<HTMLImageElement>\n  >;\n\n  if (m.type === \"link_mention\") {\n    const lm = m.link_mention;\n    return (\n      <LinkComp\n        href={lm.href}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        className=\"inline-flex items-baseline gap-1 rounded px-1 hover:bg-muted\"\n      >\n        {lm.icon_url ? (\n          <Img\n            src={lm.icon_url}\n            alt=\"\"\n            aria-hidden\n            className=\"inline-block size-3.5 self-center rounded-sm\"\n          />\n        ) : (\n          <LinkIcon className=\"inline-block size-3.5 self-center\" aria-hidden />\n        )}\n        {lm.link_provider ? (\n          <span className=\"text-xs text-muted-foreground\">\n            {lm.link_provider}\n          </span>\n        ) : null}\n        <strong className=\"font-medium\">{lm.title ?? lm.href}</strong>\n      </LinkComp>\n    );\n  }\n\n  if (m.type === \"link_preview\") {\n    return (\n      <LinkComp\n        href={m.link_preview.url}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        className=\"inline-flex items-baseline gap-1 rounded px-1 hover:bg-muted\"\n      >\n        <LinkIcon className=\"inline-block size-3.5 self-center\" aria-hidden />\n        <span>{plainText || m.link_preview.url}</span>\n      </LinkComp>\n    );\n  }\n\n  if (m.type === \"page\") {\n    // pageLinks → resolvePageUrl の順で解決。どちらも無ければ従来どおり素の表示。\n    const resolved = pageLinks?.[normalizePageId(m.page.id)];\n    const href = resolved?.href ?? resolvePageUrl?.(m.page.id);\n    const label =\n      resolved?.title ||\n      resolvePageTitle?.(m.page.id) ||\n      plainText ||\n      m.page.id;\n    const inner = (\n      <>\n        <span aria-hidden>📋</span>\n        <span>{label}</span>\n      </>\n    );\n    if (href) {\n      return (\n        <LinkComp\n          href={href}\n          className=\"inline-flex items-baseline gap-1 rounded px-1 hover:bg-muted\"\n        >\n          {inner}\n        </LinkComp>\n      );\n    }\n    return (\n      <span className=\"inline-flex items-baseline gap-1 rounded bg-muted px-1\">\n        {inner}\n      </span>\n    );\n  }\n\n  if (m.type === \"database\") {\n    const resolved = pageLinks?.[normalizePageId(m.database.id)];\n    const href = resolved?.href ?? resolvePageUrl?.(m.database.id);\n    const label =\n      resolved?.title ||\n      resolvePageTitle?.(m.database.id) ||\n      plainText ||\n      m.database.id;\n    const inner = (\n      <>\n        <span aria-hidden>🗄️</span>\n        <span>{label}</span>\n      </>\n    );\n    if (href) {\n      return (\n        <LinkComp\n          href={href}\n          className=\"inline-flex items-baseline gap-1 rounded px-1 hover:bg-muted\"\n        >\n          {inner}\n        </LinkComp>\n      );\n    }\n    return (\n      <span className=\"inline-flex items-baseline gap-1 rounded bg-muted px-1\">\n        {inner}\n      </span>\n    );\n  }\n\n  if (m.type === \"date\") {\n    const d = m.date;\n    const label = d.end ? `${d.start} → ${d.end}` : d.start;\n    return <time className=\"text-muted-foreground\">{label}</time>;\n  }\n\n  if (m.type === \"user\") {\n    const u = m.user;\n    const name = \"name\" in u && u.name ? u.name : \"id\" in u ? u.id : \"unknown\";\n    return <span className=\"text-muted-foreground\">@{name}</span>;\n  }\n\n  if (m.type === \"custom_emoji\") {\n    const emoji = m.custom_emoji;\n    if (\"url\" in emoji && emoji.url) {\n      return (\n        <Img\n          src={String(emoji.url)}\n          alt={\"name\" in emoji ? String(emoji.name) : \"\"}\n          className=\"inline-block size-[1em] align-baseline\"\n        />\n      );\n    }\n    return <>{plainText}</>;\n  }\n\n  return <>{plainText}</>;\n}\n","\"use client\";\n\nimport type { RichTextItemResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { Fragment } from \"react\";\nimport { useNotionContext } from \"../context.js\";\nimport { Annotated } from \"./Annotation\";\nimport { InlineEquation as DefaultInlineEquation } from \"./InlineEquation\";\nimport { Mention } from \"./Mention\";\n\n/** {@link RichText} の props。Notion `rich_text` 配列 (annotations 含む) を受け取る。 */\nexport interface RichTextProps {\n  value: ReadonlyArray<RichTextItemResponse>;\n}\n\n/**\n * Notion `rich_text` 配列を React のインライン要素として描画する。\n * bold / italic / strikethrough / underline / color / equation / mention を扱う。\n * カスタムブロックコンポーネント内で段落以外の rich_text を描画する際に利用する。\n *\n * @example\n * ```tsx\n * function CustomCallout({ block }: BlockComponentProps<CalloutBlockObjectResponse>) {\n *   return <aside><RichText value={block.callout.rich_text} /></aside>;\n * }\n * ```\n */\nexport function RichText({ value }: RichTextProps) {\n  return (\n    <>\n      {value.map((item, idx) => (\n        // rich_text 配列の要素は同じ key 戦略で十分 (描画時に組み替えが起きないため)\n        // biome-ignore lint/suspicious/noArrayIndexKey: rich_text の並びは安定している\n        <RichTextItem key={idx} item={item} />\n      ))}\n    </>\n  );\n}\n\nfunction RichTextItem({ item }: { item: RichTextItemResponse }) {\n  const { components } = useNotionContext();\n\n  if (item.type === \"mention\") {\n    return (\n      <Annotated annotations={item.annotations} href={item.href}>\n        <Mention item={item} />\n      </Annotated>\n    );\n  }\n\n  if (item.type === \"equation\") {\n    const InlineEquation = components.InlineEquation ?? DefaultInlineEquation;\n    const cachedHtml = (\n      item.equation as { expression: string; __cachedHtml?: string }\n    ).__cachedHtml;\n    return (\n      <Annotated annotations={item.annotations} href={item.href}>\n        <InlineEquation\n          expression={item.equation.expression}\n          cachedHtml={cachedHtml}\n        />\n      </Annotated>\n    );\n  }\n\n  const url = item.text.link?.url ?? item.href ?? null;\n  return (\n    <Annotated annotations={item.annotations} href={url}>\n      {renderWithLineBreaks(item.text.content)}\n    </Annotated>\n  );\n}\n\n/** テキスト内の改行文字を <br> 要素に変換する。 */\nfunction renderWithLineBreaks(content: string) {\n  const parts = content.split(\"\\n\");\n  if (parts.length === 1) return content;\n  return parts.map((part, i) => (\n    // biome-ignore lint/suspicious/noArrayIndexKey: 改行分割の順序は安定している\n    <Fragment key={i}>\n      {i > 0 && <br />}\n      {part}\n    </Fragment>\n  ));\n}\n","\"use client\";\n\nimport type { RichTextItemResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { RichText } from \"./RichText\";\n\n/** {@link Caption} の props。`variant` で figure / block 配下のスタイルを切り替える。 */\nexport interface CaptionProps {\n  value: ReadonlyArray<RichTextItemResponse>;\n  /** figure 配下なら \"figure\" (中央寄せ figcaption)、card 等の文字下なら \"block\"。 */\n  variant?: \"figure\" | \"block\";\n}\n\n/**\n * caption 配列を一貫したスタイルで描画する。空配列なら何も出さない。\n * Image / Video / Audio / File / Pdf / Bookmark / Embed の caption が共通で使う。\n *\n * @example\n * ```tsx\n * <figure>\n *   <img src={url} alt=\"\" />\n *   <Caption value={block.image.caption} variant=\"figure\" />\n * </figure>\n * ```\n *\n * @see {@link RichText} caption 内の rich_text 配列を描画する下位コンポーネント。\n */\nexport function Caption({ value, variant = \"figure\" }: CaptionProps) {\n  if (value.length === 0) return null;\n  const cls =\n    variant === \"figure\"\n      ? \"mt-1 text-center text-sm text-muted-foreground\"\n      : \"mt-1 text-sm text-muted-foreground\";\n  if (variant === \"figure\") {\n    return (\n      <figcaption className={cls}>\n        <RichText value={value} />\n      </figcaption>\n    );\n  }\n  return (\n    <p className={cls}>\n      <RichText value={value} />\n    </p>\n  );\n}\n","\"use client\";\n\nimport type { AudioBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { useNotionContext } from \"../context\";\nimport { getFileUrl } from \"../lib/notion-file\";\nimport { cn } from \"../lib/utils\";\nimport { Caption } from \"../rich-text/Caption\";\nimport type { BlockComponentProps } from \"../types\";\n\nexport function Audio({\n  block,\n  className,\n}: BlockComponentProps<AudioBlockObjectResponse>) {\n  const { resolveImageUrl } = useNotionContext();\n  const rawUrl = getFileUrl(block.audio);\n  const src = resolveImageUrl ? resolveImageUrl(rawUrl, block) : rawUrl;\n  return (\n    <figure className={cn(\"my-4\", className)}>\n      {/* biome-ignore lint/a11y/useMediaCaption: Notion 側にキャプショントラックの概念がない */}\n      <audio src={src} controls className=\"w-full\" />\n      <Caption value={block.audio.caption} variant=\"block\" />\n    </figure>\n  );\n}\n","import * as React from \"react\"\n\nimport { cn } from \"src/lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card\"\n      className={cn(\n        \"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-header\"\n      className={cn(\n        \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-title\"\n      className={cn(\"leading-none font-semibold\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-description\"\n      className={cn(\"text-sm text-muted-foreground\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-action\"\n      className={cn(\n        \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-content\"\n      className={cn(\"px-6\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-footer\"\n      className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n      {...props}\n    />\n  )\n}\n\nexport {\n  Card,\n  CardHeader,\n  CardFooter,\n  CardTitle,\n  CardAction,\n  CardDescription,\n  CardContent,\n}\n","\"use client\";\n\nimport type { ElementType } from \"react\";\nimport { Card } from \"../components/ui/card\";\nimport { useNotionContext } from \"../context\";\n\n/**\n * notion-orm が embed/bookmark ブロックに付与する `ogp` フィールドと同形状の型。\n * react-renderer は notion-orm に直接依存しないため、構造的に互換な型を独自に持つ。\n */\nexport interface OgCardData {\n  title?: string;\n  description?: string;\n  image?: string;\n  siteName?: string;\n}\n\nexport interface OgCardProps {\n  url: string;\n  ogp?: OgCardData;\n}\n\nfunction hostname(url: string): string {\n  try {\n    return new URL(url).hostname;\n  } catch {\n    return url;\n  }\n}\n\n/**\n * Notion 本家のブックマークカード風レイアウト。\n * 左側にタイトル/説明/サイト名+URL、右側に OG 画像。\n * ogp 未指定または空でもホスト名 + URL のリンクカードとして崩れずに描画する。\n *\n * shadcn の CardHeader / CardTitle / CardDescription を挟まないのは、\n * これらが grid layout を被せて画像コンテナの flex 伸縮が崩れ、サムネが\n * 見切れる挙動になるため。Card 直下の生 div でレイアウトを完全に手で組む。\n */\nexport function OgCard({ url, ogp }: OgCardProps) {\n  const { Image: ImageSlot, Link: LinkSlot } = useNotionContext();\n  const title = ogp?.title?.trim() || hostname(url);\n  const description = ogp?.description?.trim();\n  const siteName = ogp?.siteName?.trim() || hostname(url);\n  const image = ogp?.image;\n  const LinkComp = (LinkSlot ?? \"a\") as ElementType<\n    React.AnchorHTMLAttributes<HTMLAnchorElement>\n  >;\n  const Img = (ImageSlot ?? \"img\") as ElementType<\n    React.ImgHTMLAttributes<HTMLImageElement>\n  >;\n\n  return (\n    <LinkComp\n      href={url}\n      target=\"_blank\"\n      rel=\"noopener noreferrer\"\n      className=\"block no-underline\"\n    >\n      {/* min-h でカード高さの最低値を保証し、本文は line-clamp + break-words で\n          長文・長単語が overflow-hidden で見切れないようにする。Card 既定の\n          gap-6 / py-6 を打ち消すため gap-0 / p-0 を明示。 */}\n      <Card className=\"flex min-h-[6.5rem] flex-row items-stretch gap-0 overflow-hidden p-0 transition-colors hover:bg-muted/40\">\n        <div className=\"flex min-w-0 flex-1 flex-col gap-1 p-4\">\n          <div className=\"line-clamp-2 break-words font-medium leading-snug\">\n            {title}\n          </div>\n          {description ? (\n            <div className=\"line-clamp-2 break-words text-xs text-muted-foreground\">\n              {description}\n            </div>\n          ) : null}\n          <div className=\"mt-auto truncate pt-2 text-xs text-muted-foreground/60\">\n            {siteName} · {url}\n          </div>\n        </div>\n        {image ? (\n          <div className=\"ml-auto w-36 shrink-0 self-stretch bg-muted sm:w-48 md:w-64\">\n            <Img\n              src={image}\n              alt=\"\"\n              loading=\"lazy\"\n              referrerPolicy=\"no-referrer\"\n              className=\"not-prose m-0 h-full w-full object-cover\"\n            />\n          </div>\n        ) : null}\n      </Card>\n    </LinkComp>\n  );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useNotionContext } from \"../context.js\";\nimport type { OgCardData } from \"./OgCard.js\";\n\ninterface OgpEndpointResponse {\n  ok: boolean;\n  ogp?: OgCardData;\n}\n\n/**\n * ページアクセス時に `{ogpEndpoint}?url=...` から OGP メタデータを取得する。\n * `ogpEndpoint` が Context に無い場合・`url` が falsy（`block.ogp` を既に持つ場合に\n * 呼び出し側が渡す）な場合は何もしない。\n *\n * `@notion-headless-cms/cms` の `createOgpHandler()` が返す\n * `{ ok: boolean, ogp?: OgCardData }` 形式のレスポンスを期待する。\n */\nexport function useOgp(url: string | null | undefined): OgCardData | undefined {\n  const { ogpEndpoint } = useNotionContext();\n  const [ogp, setOgp] = useState<OgCardData | undefined>(undefined);\n\n  useEffect(() => {\n    if (!ogpEndpoint || !url) return;\n    let cancelled = false;\n    (async () => {\n      try {\n        const res = await fetch(\n          `${ogpEndpoint}?url=${encodeURIComponent(url)}`,\n        );\n        if (!res.ok) return;\n        const body = (await res.json()) as OgpEndpointResponse;\n        if (!cancelled && body.ok && body.ogp) setOgp(body.ogp);\n      } catch {\n        // 取得失敗時はシェル(シンプルなリンクカード)のまま。\n      }\n    })();\n    return () => {\n      cancelled = true;\n    };\n  }, [ogpEndpoint, url]);\n\n  return ogp;\n}\n","\"use client\";\n\nimport type { BookmarkBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { OgCard, type OgCardData } from \"../embeds/OgCard\";\nimport { useOgp } from \"../embeds/useOgp.js\";\nimport { cn } from \"../lib/utils\";\nimport { Caption } from \"../rich-text/Caption\";\nimport type { BlockComponentProps } from \"../types\";\n\ntype BookmarkBlockMaybeWithOgp = BookmarkBlockObjectResponse & {\n  ogp?: OgCardData;\n};\n\n/**\n * bookmark ブロックの既定描画。`block.ogp`（同期時に付与済みの OGP メタデータ）が\n * あればそれを最優先で使う。無ければ `useOgp` がページアクセス時にクライアントから\n * `ogpEndpoint` を叩いて取得する（それも無ければシェルのリンクカードのまま）。\n */\nexport function Bookmark({\n  block,\n  className,\n}: BlockComponentProps<BookmarkBlockObjectResponse>) {\n  const url = block.bookmark.url;\n  const preloadedOgp = (block as BookmarkBlockMaybeWithOgp).ogp;\n  const fetchedOgp = useOgp(preloadedOgp ? null : url);\n  const ogp = preloadedOgp ?? fetchedOgp;\n  return (\n    <div className={cn(\"my-3\", className)}>\n      <OgCard url={url} ogp={ogp} />\n      <Caption value={block.bookmark.caption} variant=\"block\" />\n    </div>\n  );\n}\n","import * as React from \"react\"\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"src/lib/utils\"\n\nfunction Breadcrumb({ ...props }: React.ComponentProps<\"nav\">) {\n  return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n  return (\n    <ol\n      data-slot=\"breadcrumb-list\"\n      className={cn(\n        \"flex flex-wrap items-center gap-1.5 text-sm break-words text-muted-foreground sm:gap-2.5\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n  return (\n    <li\n      data-slot=\"breadcrumb-item\"\n      className={cn(\"inline-flex items-center gap-1.5\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction BreadcrumbLink({\n  asChild,\n  className,\n  ...props\n}: React.ComponentProps<\"a\"> & {\n  asChild?: boolean\n}) {\n  const Comp = asChild ? Slot.Root : \"a\"\n\n  return (\n    <Comp\n      data-slot=\"breadcrumb-link\"\n      className={cn(\"transition-colors hover:text-foreground\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n  return (\n    <span\n      data-slot=\"breadcrumb-page\"\n      role=\"link\"\n      aria-disabled=\"true\"\n      aria-current=\"page\"\n      className={cn(\"font-normal text-foreground\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction BreadcrumbSeparator({\n  children,\n  className,\n  ...props\n}: React.ComponentProps<\"li\">) {\n  return (\n    <li\n      data-slot=\"breadcrumb-separator\"\n      role=\"presentation\"\n      aria-hidden=\"true\"\n      className={cn(\"[&>svg]:size-3.5\", className)}\n      {...props}\n    >\n      {children ?? <ChevronRight />}\n    </li>\n  )\n}\n\nfunction BreadcrumbEllipsis({\n  className,\n  ...props\n}: React.ComponentProps<\"span\">) {\n  return (\n    <span\n      data-slot=\"breadcrumb-ellipsis\"\n      role=\"presentation\"\n      aria-hidden=\"true\"\n      className={cn(\"flex size-9 items-center justify-center\", className)}\n      {...props}\n    >\n      <MoreHorizontal className=\"size-4\" />\n      <span className=\"sr-only\">More</span>\n    </span>\n  )\n}\n\nexport {\n  Breadcrumb,\n  BreadcrumbList,\n  BreadcrumbItem,\n  BreadcrumbLink,\n  BreadcrumbPage,\n  BreadcrumbSeparator,\n  BreadcrumbEllipsis,\n}\n","\"use client\";\n\nimport {\n  BreadcrumbItem,\n  BreadcrumbList,\n  BreadcrumbPage,\n  BreadcrumbSeparator,\n  Breadcrumb as UiBreadcrumb,\n} from \"../components/ui/breadcrumb.js\";\nimport { cn } from \"../lib/utils\";\nimport type { BlockComponentProps } from \"../types\";\n\n// Notion API は breadcrumb で実際のパスを返さないため、最低限のプレースホルダ表示にとどめる。\nexport function Breadcrumb({\n  className,\n}: Pick<BlockComponentProps, \"className\"> = {}) {\n  return (\n    <UiBreadcrumb className={cn(\"my-2\", className)}>\n      <BreadcrumbList>\n        <BreadcrumbItem>…</BreadcrumbItem>\n        <BreadcrumbSeparator />\n        <BreadcrumbItem>\n          <BreadcrumbPage>page</BreadcrumbPage>\n        </BreadcrumbItem>\n      </BreadcrumbList>\n    </UiBreadcrumb>\n  );\n}\n","import type { NotionBlock } from \"../types\";\n\nexport type ListGroup =\n  | { kind: \"ul\"; items: NotionBlock[] }\n  | { kind: \"ol\"; items: NotionBlock[] }\n  | { kind: \"block\"; block: NotionBlock };\n\nexport function groupListItems(blocks: NotionBlock[]): ListGroup[] {\n  const groups: ListGroup[] = [];\n  for (const block of blocks) {\n    const last = groups[groups.length - 1];\n    if (block.type === \"bulleted_list_item\") {\n      if (last?.kind === \"ul\") {\n        last.items.push(block);\n      } else {\n        groups.push({ kind: \"ul\", items: [block] });\n      }\n      continue;\n    }\n    if (block.type === \"numbered_list_item\") {\n      if (last?.kind === \"ol\") {\n        last.items.push(block);\n      } else {\n        groups.push({ kind: \"ol\", items: [block] });\n      }\n      continue;\n    }\n    groups.push({ kind: \"block\", block });\n  }\n  return groups;\n}\n","\"use client\";\n\nimport { type ReactNode, useMemo } from \"react\";\nimport { BlockSwitch } from \"./BlockSwitch.js\";\nimport { NotionContext, useNotionContext } from \"./context.js\";\nimport { groupListItems } from \"./lib/group-list-items.js\";\nimport type { NotionBlock } from \"./types.js\";\n\nconst OL_STYLES = [\"list-decimal\", \"list-[lower-alpha]\", \"list-[lower-roman]\"];\n\n/**\n * ブロック配列を描画する。連続する `bulleted_list_item` / `numbered_list_item` は\n * 1 つの `<ul>` / `<ol>` にまとめてから子要素を `BlockSwitch` で描画する。\n * `<ol>` の list-style は `listDepth` でローテートさせ、ネスト時に\n * `decimal → lower-alpha → lower-roman` を循環する（Notion 本家挙動）。\n *\n * `NotionRenderer` の内側、既に `NotionContext` が確立された状態で使う。\n * トップレベルでは {@link NotionRenderer} を使う。\n *\n * @example\n * ```tsx\n * function Toggle({ children }: { children: NotionBlock[] }) {\n *   return <details><NotionBlocks blocks={children} /></details>;\n * }\n * ```\n *\n * @see {@link NotionRenderer} Context を確立するトップレベルエントリ。\n */\nexport function NotionBlocks({ blocks }: { blocks: NotionBlock[] }): ReactNode {\n  const ctx = useNotionContext();\n  const depth = ctx.listDepth ?? 0;\n  const olClass = OL_STYLES[depth % OL_STYLES.length] ?? \"list-decimal\";\n\n  const nestedCtx = useMemo(\n    () => ({ ...ctx, listDepth: depth + 1 }),\n    [ctx, depth],\n  );\n\n  const groups = groupListItems(blocks);\n  return (\n    <NotionContext.Provider value={nestedCtx}>\n      {groups.map((group, idx) => {\n        if (group.kind === \"ul\") {\n          return (\n            // biome-ignore lint/suspicious/noArrayIndexKey: グループ順序は安定\n            <ul key={`ul-${idx}`} className=\"my-2 list-disc pl-6\">\n              {group.items.map((item) => (\n                <BlockSwitch key={item.id} block={item} />\n              ))}\n            </ul>\n          );\n        }\n        if (group.kind === \"ol\") {\n          return (\n            // biome-ignore lint/suspicious/noArrayIndexKey: グループ順序は安定\n            <ol key={`ol-${idx}`} className={`my-2 pl-6 ${olClass}`}>\n              {group.items.map((item) => (\n                <BlockSwitch key={item.id} block={item} />\n              ))}\n            </ol>\n          );\n        }\n        return <BlockSwitch key={group.block.id} block={group.block} />;\n      })}\n    </NotionContext.Provider>\n  );\n}\n","\"use client\";\n\nimport type { BulletedListItemBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { notionBlockColorClass } from \"../lib/notion-color.js\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport { RichText } from \"../rich-text/RichText.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function BulletedListItem({\n  block,\n  className,\n}: BlockComponentProps<BulletedListItemBlockObjectResponse>) {\n  return (\n    <li\n      className={cn(\n        \"leading-7\",\n        notionBlockColorClass(block.bulleted_list_item.color),\n        className,\n      )}\n    >\n      <RichText value={block.bulleted_list_item.rich_text} />\n      {block.children ? (\n        <div className=\"ml-2\">\n          <NotionBlocks blocks={block.children} />\n        </div>\n      ) : null}\n    </li>\n  );\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"src/lib/utils\"\n\nconst alertVariants = cva(\n  \"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-card text-card-foreground\",\n        destructive:\n          \"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nfunction Alert({\n  className,\n  variant,\n  ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n  return (\n    <div\n      data-slot=\"alert\"\n      role=\"alert\"\n      className={cn(alertVariants({ variant }), className)}\n      {...props}\n    />\n  )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"alert-title\"\n      className={cn(\n        \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction AlertDescription({\n  className,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"alert-description\"\n      className={cn(\n        \"col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n","import type * as React from \"react\";\nimport { cn } from \"../lib/utils.js\";\nimport { Alert, AlertDescription, AlertTitle } from \"./ui/alert.js\";\n\n/**\n * shadcn 公式 docs の `callout` 相当。`Alert` を docs 風の surface トーンで包む\n * プレゼンテーション専用コンポーネント。Notion の callout ブロックは\n * `blocks/Callout.tsx` がこれをラップして描画する。\n */\nexport function Callout({\n  title,\n  children,\n  icon,\n  className,\n  variant = \"default\",\n  ...props\n}: Omit<React.ComponentProps<typeof Alert>, \"variant\"> & {\n  icon?: React.ReactNode;\n  variant?: \"default\" | \"info\" | \"warning\";\n}) {\n  return (\n    <Alert\n      data-variant={variant}\n      className={cn(\n        \"mt-6 w-auto rounded-xl border-surface bg-surface text-surface-foreground md:-mx-1 **:[code]:border\",\n        className,\n      )}\n      {...props}\n    >\n      {icon}\n      {title && <AlertTitle>{title}</AlertTitle>}\n      <AlertDescription className=\"text-card-foreground/80\">\n        {children}\n      </AlertDescription>\n    </Alert>\n  );\n}\n","\"use client\";\n\nimport type { CalloutBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { Callout as CalloutCard } from \"../components/callout.js\";\nimport { notionBlockColorClass } from \"../lib/notion-color.js\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport { RichText } from \"../rich-text/RichText.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function Callout({\n  block,\n  className,\n}: BlockComponentProps<CalloutBlockObjectResponse>) {\n  const icon = block.callout.icon;\n  const colorClass = notionBlockColorClass(block.callout.color);\n  return (\n    <CalloutCard\n      // Notion のアイコンは svg ではなく emoji/画像なので、Alert の `has-[>svg]`\n      // ではアイコン列幅が確保されない。grid-cols を明示してアイコン列を空ける。\n      className={cn(\n        \"my-3 grid-cols-[calc(var(--spacing)*6)_1fr] gap-x-3\",\n        colorClass,\n        className,\n      )}\n      icon={\n        <span\n          className=\"col-start-1 row-span-2 row-start-1 self-start text-base leading-none\"\n          aria-hidden\n        >\n          {icon?.type === \"emoji\" ? icon.emoji : null}\n          {icon?.type === \"external\" ? (\n            <img src={icon.external.url} alt=\"\" className=\"size-5\" />\n          ) : null}\n          {icon?.type === \"file\" ? (\n            <img src={icon.file.url} alt=\"\" className=\"size-5\" />\n          ) : null}\n        </span>\n      }\n    >\n      <RichText value={block.callout.rich_text} />\n      {block.children ? (\n        <div className=\"mt-2 w-full\">\n          <NotionBlocks blocks={block.children} />\n        </div>\n      ) : null}\n    </CalloutCard>\n  );\n}\n","\"use client\";\n\nimport type { ChildDatabaseBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { Database } from \"lucide-react\";\nimport { Card, CardHeader, CardTitle } from \"../components/ui/card.js\";\nimport { cn } from \"../lib/utils\";\nimport type { BlockComponentProps } from \"../types\";\n\nexport function ChildDatabase({\n  block,\n  className,\n}: BlockComponentProps<ChildDatabaseBlockObjectResponse>) {\n  return (\n    <Card className={cn(\"my-2 py-3\", className)}>\n      <CardHeader className=\"flex flex-row items-center gap-2\">\n        <Database\n          className=\"size-4 shrink-0 text-muted-foreground\"\n          aria-hidden\n        />\n        <CardTitle className=\"text-base\">\n          {block.child_database.title}\n        </CardTitle>\n      </CardHeader>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport type { ChildPageBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { FileText } from \"lucide-react\";\nimport type { ElementType } from \"react\";\nimport { Card, CardHeader, CardTitle } from \"../components/ui/card.js\";\nimport { useNotionContext } from \"../context\";\nimport { normalizePageId } from \"../lib/normalize-page-id.js\";\nimport { cn } from \"../lib/utils\";\nimport type { BlockComponentProps } from \"../types\";\n\nexport function ChildPage({\n  block,\n  className,\n}: BlockComponentProps<ChildPageBlockObjectResponse>) {\n  const { pageLinks, resolvePageUrl, Link: LinkSlot } = useNotionContext();\n  // child_page の id はその子ページ自身の pageId。pageLinks → 関数の順で解決。\n  const href =\n    pageLinks?.[normalizePageId(block.id)]?.href ?? resolvePageUrl?.(block.id);\n\n  const inner = (\n    <CardHeader className=\"flex flex-row items-center gap-2\">\n      <FileText className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n      <CardTitle className=\"text-base\">{block.child_page.title}</CardTitle>\n    </CardHeader>\n  );\n\n  if (href) {\n    const LinkComp = (LinkSlot ?? \"a\") as ElementType<\n      React.AnchorHTMLAttributes<HTMLAnchorElement>\n    >;\n    return (\n      <LinkComp\n        href={href}\n        className={cn(\"my-2 block no-underline\", className)}\n      >\n        <Card className=\"py-3 transition-colors hover:bg-muted/40\">\n          {inner}\n        </Card>\n      </LinkComp>\n    );\n  }\n\n  return <Card className={cn(\"my-2 py-3\", className)}>{inner}</Card>;\n}\n","\"use client\";\n\nimport type { ColumnBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function Column({\n  block,\n  className,\n}: BlockComponentProps<ColumnBlockObjectResponse>) {\n  return (\n    <div className={cn(\"min-w-0\", className)}>\n      {block.children ? <NotionBlocks blocks={block.children} /> : null}\n    </div>\n  );\n}\n","\"use client\";\n\nimport type { ColumnListBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function ColumnList({\n  block,\n  className,\n}: BlockComponentProps<ColumnListBlockObjectResponse>) {\n  const cols = block.children ?? [];\n  return (\n    <div\n      className={cn(\"my-3 grid gap-4\", className)}\n      style={{\n        // 各 column を等幅で並べる。column_ratio は親では取れないため利用側で調整できるよう class 委譲\n        gridTemplateColumns: `repeat(${Math.max(cols.length, 1)}, minmax(0, 1fr))`,\n      }}\n    >\n      {cols.length > 0 ? <NotionBlocks blocks={cols} /> : null}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { Separator } from \"../components/ui/separator\";\nimport { cn } from \"../lib/utils\";\nimport type { BlockComponentProps } from \"../types\";\n\nexport function Divider({\n  className,\n}: Pick<BlockComponentProps, \"className\"> = {}) {\n  // CSS 変数 (--border) 未定義の環境でも線が見えるよう h-px と bg-border を明示。\n  return <Separator className={cn(\"my-6 h-px bg-border\", className)} />;\n}\n","\"use client\"\n\nimport { AspectRatio as AspectRatioPrimitive } from \"radix-ui\"\n\nfunction AspectRatio({\n  ...props\n}: React.ComponentProps<typeof AspectRatioPrimitive.Root>) {\n  return <AspectRatioPrimitive.Root data-slot=\"aspect-ratio\" {...props} />\n}\n\nexport { AspectRatio }\n","\"use client\";\n\nimport type { EmbedBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { AspectRatio } from \"../components/ui/aspect-ratio.js\";\nimport { cn } from \"../lib/utils\";\nimport { Caption } from \"../rich-text/Caption\";\nimport type { BlockComponentProps } from \"../types\";\n\nconst YOUTUBE_RE =\n  /(?:youtube\\.com\\/(?:watch\\?v=|embed\\/)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/;\n\n/** YouTube の watch URL を embed URL（?rel=0 付き）に変換する。非 YouTube URL はそのまま返す。 */\nfunction toYoutubeEmbedUrl(url: string): string {\n  const m = url.match(YOUTUBE_RE);\n  if (m?.[1]) {\n    return `https://www.youtube.com/embed/${m[1]}?rel=0`;\n  }\n  return url;\n}\n\nconst NOTION_SANDBOX =\n  \"allow-scripts allow-popups allow-top-navigation-by-user-activation allow-forms allow-same-origin allow-storage-access-by-user-activation allow-popups-to-escape-sandbox\";\n\n/**\n * 埋め込み URL ごとの推奨サイズ。クロスオリジン iframe は中身の実寸を取得できず\n * Notion API も寸法を返さないため、ホスト別のテンプレ値で近似する。\n */\nfunction resolveEmbedSize(url: string): {\n  width?: number;\n  height?: number;\n  ratio?: number;\n} {\n  try {\n    const { hostname, pathname } = new URL(url);\n    if (\n      hostname === \"store.steampowered.com\" &&\n      pathname.startsWith(\"/widget/\")\n    ) {\n      // Steam ウィジェットは幅を指定すると埋め込み幅より狭くなるため、幅は全幅（w-full）に委ねる\n      return { height: 190 };\n    }\n  } catch {\n    // URL parse 失敗時は既定にフォールバック\n  }\n  return { ratio: 16 / 9 };\n}\n\nexport function Embed({\n  block,\n  className,\n}: BlockComponentProps<EmbedBlockObjectResponse>) {\n  const url = toYoutubeEmbedUrl(block.embed.url);\n  const size = resolveEmbedSize(url);\n  const caption = <Caption value={block.embed.caption} />;\n\n  if (size.ratio) {\n    return (\n      <figure className={cn(\"my-4\", className)}>\n        <AspectRatio\n          ratio={size.ratio}\n          className=\"overflow-hidden rounded-lg border\"\n        >\n          <iframe\n            src={url}\n            title=\"Embed\"\n            className=\"h-full w-full\"\n            sandbox={NOTION_SANDBOX}\n            allowFullScreen\n            loading=\"lazy\"\n          />\n        </AspectRatio>\n        {caption}\n      </figure>\n    );\n  }\n\n  return (\n    <figure className={cn(\"my-4\", className)}>\n      <iframe\n        src={url}\n        title=\"Embed\"\n        width={size.width}\n        height={size.height}\n        className={cn(\"max-w-full\", !size.width && \"w-full\")}\n        sandbox={NOTION_SANDBOX}\n        allowFullScreen\n        loading=\"lazy\"\n      />\n      {caption}\n    </figure>\n  );\n}\n","\"use client\";\n\nimport type { EquationBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { useEffect, useState } from \"react\";\nimport { cn } from \"../lib/utils.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\n/**\n * ブロック equation の既定描画。\n * `notion-katex` enricher が付与した `__cachedHtml` があればそれを使い、無ければ\n * クライアントで `katex` を動的 import して `displayMode: true` で組版する。\n * peer に `katex` が無いか KaTeX が失敗したら原文を `<pre>` で出す。\n */\nexport function Equation({\n  block,\n  className,\n}: BlockComponentProps<EquationBlockObjectResponse>) {\n  const cachedHtml = (\n    block.equation as { expression: string; __cachedHtml?: string }\n  ).__cachedHtml;\n  const expression = block.equation.expression;\n  const [html, setHtml] = useState<string | null>(cachedHtml ?? null);\n\n  useEffect(() => {\n    // import.meta.env.SSR は Vite が静的に置換する定数のため、この early return により\n    // 後続の katex の動的 import が SSR/Worker バンドルの到達可能グラフから外れ、\n    // tree-shaking で除外される。\n    if (import.meta.env.SSR || cachedHtml) return;\n    let cancelled = false;\n    (async () => {\n      try {\n        const katex = (await import(\"katex\")).default;\n        const out = katex.renderToString(expression, {\n          displayMode: true,\n          throwOnError: false,\n        });\n        if (!cancelled) setHtml(out);\n      } catch {\n        // katex 未インストール時は <pre> フォールバックのまま。\n      }\n    })();\n    return () => {\n      cancelled = true;\n    };\n  }, [cachedHtml, expression]);\n\n  if (html) {\n    return (\n      <div\n        className={cn(\"my-3 overflow-x-auto\", className)}\n        // biome-ignore lint/security/noDangerouslySetInnerHtml: katex の整形済み HTML\n        dangerouslySetInnerHTML={{ __html: html }}\n      />\n    );\n  }\n\n  return (\n    <pre\n      className={cn(\n        \"my-3 overflow-x-auto rounded-lg bg-muted p-4 font-mono text-sm\",\n        className,\n      )}\n    >\n      {expression}\n    </pre>\n  );\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"src/lib/utils\"\nimport { Separator } from \"src/components/ui/separator\"\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      role=\"list\"\n      data-slot=\"item-group\"\n      className={cn(\"group/item-group flex flex-col\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction ItemSeparator({\n  className,\n  ...props\n}: React.ComponentProps<typeof Separator>) {\n  return (\n    <Separator\n      data-slot=\"item-separator\"\n      orientation=\"horizontal\"\n      className={cn(\"my-0\", className)}\n      {...props}\n    />\n  )\n}\n\nconst itemVariants = cva(\n  \"group/item flex flex-wrap items-center rounded-md border border-transparent text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-accent/50\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-transparent\",\n        outline: \"border-border\",\n        muted: \"bg-muted/50\",\n      },\n      size: {\n        default: \"gap-4 p-4\",\n        sm: \"gap-2.5 px-4 py-3\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n)\n\nfunction Item({\n  className,\n  variant = \"default\",\n  size = \"default\",\n  asChild = false,\n  ...props\n}: React.ComponentProps<\"div\"> &\n  VariantProps<typeof itemVariants> & { asChild?: boolean }) {\n  const Comp = asChild ? Slot.Root : \"div\"\n  return (\n    <Comp\n      data-slot=\"item\"\n      data-variant={variant}\n      data-size={size}\n      className={cn(itemVariants({ variant, size, className }))}\n      {...props}\n    />\n  )\n}\n\nconst itemMediaVariants = cva(\n  \"flex shrink-0 items-center justify-center gap-2 group-has-[[data-slot=item-description]]/item:translate-y-0.5 group-has-[[data-slot=item-description]]/item:self-start [&_svg]:pointer-events-none\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-transparent\",\n        icon: \"size-8 rounded-sm border bg-muted [&_svg:not([class*='size-'])]:size-4\",\n        image:\n          \"size-10 overflow-hidden rounded-sm [&_img]:size-full [&_img]:object-cover\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nfunction ItemMedia({\n  className,\n  variant = \"default\",\n  ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n  return (\n    <div\n      data-slot=\"item-media\"\n      data-variant={variant}\n      className={cn(itemMediaVariants({ variant, className }))}\n      {...props}\n    />\n  )\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"item-content\"\n      className={cn(\n        \"flex flex-1 flex-col gap-1 [&+[data-slot=item-content]]:flex-none\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"item-title\"\n      className={cn(\n        \"flex w-fit items-center gap-2 text-sm leading-snug font-medium\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n  return (\n    <p\n      data-slot=\"item-description\"\n      className={cn(\n        \"line-clamp-2 text-sm leading-normal font-normal text-balance text-muted-foreground\",\n        \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"item-actions\"\n      className={cn(\"flex items-center gap-2\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"item-header\"\n      className={cn(\n        \"flex basis-full items-center justify-between gap-2\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"item-footer\"\n      className={cn(\n        \"flex basis-full items-center justify-between gap-2\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport {\n  Item,\n  ItemMedia,\n  ItemContent,\n  ItemActions,\n  ItemGroup,\n  ItemSeparator,\n  ItemTitle,\n  ItemDescription,\n  ItemHeader,\n  ItemFooter,\n}\n","\"use client\";\n\nimport type { FileBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { FileIcon } from \"lucide-react\";\nimport type { ElementType } from \"react\";\nimport {\n  Item,\n  ItemContent,\n  ItemMedia,\n  ItemTitle,\n} from \"../components/ui/item.js\";\nimport { useNotionContext } from \"../context\";\nimport { getFileUrl } from \"../lib/notion-file\";\nimport { cn } from \"../lib/utils\";\nimport { Caption } from \"../rich-text/Caption\";\nimport type { BlockComponentProps } from \"../types\";\n\nfunction fileName(block: FileBlockObjectResponse): string {\n  if (block.file.name) return block.file.name;\n  try {\n    const u = new URL(getFileUrl(block.file));\n    return u.pathname.split(\"/\").pop() ?? u.pathname;\n  } catch {\n    return \"file\";\n  }\n}\n\nexport function File({\n  block,\n  className,\n}: BlockComponentProps<FileBlockObjectResponse>) {\n  const { resolveImageUrl, Link: LinkSlot } = useNotionContext();\n  const rawUrl = getFileUrl(block.file);\n  const href = resolveImageUrl ? resolveImageUrl(rawUrl, block) : rawUrl;\n  const LinkComp = (LinkSlot ?? \"a\") as ElementType<\n    React.AnchorHTMLAttributes<HTMLAnchorElement>\n  >;\n  return (\n    <figure className={cn(\"my-3\", className)}>\n      <Item variant=\"outline\" asChild>\n        <LinkComp href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n          <ItemMedia variant=\"icon\">\n            <FileIcon aria-hidden />\n          </ItemMedia>\n          <ItemContent>\n            <ItemTitle>{fileName(block)}</ItemTitle>\n          </ItemContent>\n        </LinkComp>\n      </Item>\n      {block.file.caption.length > 0 ? (\n        <Caption value={block.file.caption} variant=\"block\" />\n      ) : null}\n    </figure>\n  );\n}\n","\"use client\";\n\nimport type {\n  Heading1BlockObjectResponse,\n  Heading2BlockObjectResponse,\n  Heading3BlockObjectResponse,\n  Heading4BlockObjectResponse,\n} from \"@notionhq/client/build/src/api-endpoints\";\nimport { ChevronRight } from \"lucide-react\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"../components/ui/collapsible.js\";\nimport { notionBlockColorClass } from \"../lib/notion-color.js\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport { RichText } from \"../rich-text/RichText.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\ntype HeadingBlock =\n  | Heading1BlockObjectResponse\n  | Heading2BlockObjectResponse\n  | Heading3BlockObjectResponse\n  | Heading4BlockObjectResponse;\n\ntype HeadingMeta = {\n  Tag: \"h1\" | \"h2\" | \"h3\" | \"h4\";\n  /** 文字サイズ・太さ・ scroll-margin 等。マージンは含めない（外側コンテナで管理）。 */\n  size: string;\n  /** ブロック全体の上下マージン。toggle 時は Collapsible の外枠側に付ける。 */\n  margin: string;\n  payload: Heading1BlockObjectResponse[\"heading_1\"]; // shape は heading_1/2/3/4 共通\n};\n\nfunction meta(block: HeadingBlock): HeadingMeta {\n  switch (block.type) {\n    case \"heading_1\":\n      return {\n        Tag: \"h1\",\n        size: \"scroll-m-20 text-3xl font-bold tracking-tight\",\n        margin: \"mt-6 mb-2\",\n        payload: block.heading_1,\n      };\n    case \"heading_2\":\n      return {\n        Tag: \"h2\",\n        size: \"scroll-m-20 text-2xl font-semibold tracking-tight\",\n        margin: \"mt-5 mb-2\",\n        payload: block.heading_2,\n      };\n    case \"heading_3\":\n      return {\n        Tag: \"h3\",\n        size: \"scroll-m-20 text-xl font-semibold tracking-tight\",\n        margin: \"mt-4 mb-2\",\n        payload: block.heading_3,\n      };\n    case \"heading_4\":\n      return {\n        Tag: \"h4\",\n        size: \"scroll-m-20 text-lg font-semibold tracking-tight\",\n        margin: \"mt-3 mb-2\",\n        payload: block.heading_4,\n      };\n  }\n}\n\nexport function Heading({\n  block,\n  className: extra,\n}: BlockComponentProps<HeadingBlock>) {\n  const { Tag, size, margin, payload } = meta(block);\n  const color = notionBlockColorClass(payload.color);\n  const inner = <RichText value={payload.rich_text} />;\n\n  if (payload.is_toggleable && block.children) {\n    // toggle 時はマージンを Collapsible 側に寄せ、内側の h タグからは外す。\n    // Trigger は items-baseline で chevron と heading の baseline を揃え、\n    // 大きな heading 文字でもズレないようにする。\n    return (\n      <Collapsible className={cn(margin, \"block\")}>\n        <CollapsibleTrigger className=\"group flex w-full items-baseline gap-2 text-left\">\n          <ChevronRight\n            aria-hidden\n            className=\"size-4 shrink-0 translate-y-[0.15em] text-muted-foreground transition-transform group-data-[state=open]:rotate-90\"\n          />\n          <Tag\n            id={block.id}\n            className={cn(\"m-0 flex-1 min-w-0\", size, color, extra)}\n          >\n            {inner}\n          </Tag>\n        </CollapsibleTrigger>\n        <CollapsibleContent className=\"ml-6\">\n          <NotionBlocks blocks={block.children} />\n        </CollapsibleContent>\n      </Collapsible>\n    );\n  }\n\n  return (\n    <Tag id={block.id} className={cn(margin, size, color, extra)}>\n      {inner}\n    </Tag>\n  );\n}\n","import * as React from \"react\"\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"src/lib/utils\"\nimport { Button } from \"src/components/ui/button\"\n\nfunction Dialog({\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n  return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n  return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n  return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n  return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n  className,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n  return (\n    <DialogPrimitive.Overlay\n      data-slot=\"dialog-overlay\"\n      className={cn(\n        \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction DialogContent({\n  className,\n  children,\n  showCloseButton = true,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n  showCloseButton?: boolean\n}) {\n  return (\n    <DialogPortal data-slot=\"dialog-portal\">\n      <DialogOverlay />\n      <DialogPrimitive.Content\n        data-slot=\"dialog-content\"\n        className={cn(\n          \"fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg\",\n          className\n        )}\n        {...props}\n      >\n        {children}\n        {showCloseButton && (\n          <DialogPrimitive.Close\n            data-slot=\"dialog-close\"\n            className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n          >\n            <XIcon />\n            <span className=\"sr-only\">Close</span>\n          </DialogPrimitive.Close>\n        )}\n      </DialogPrimitive.Content>\n    </DialogPortal>\n  )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"dialog-header\"\n      className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction DialogFooter({\n  className,\n  showCloseButton = false,\n  children,\n  ...props\n}: React.ComponentProps<\"div\"> & {\n  showCloseButton?: boolean\n}) {\n  return (\n    <div\n      data-slot=\"dialog-footer\"\n      className={cn(\n        \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n      {showCloseButton && (\n        <DialogPrimitive.Close asChild>\n          <Button variant=\"outline\">Close</Button>\n        </DialogPrimitive.Close>\n      )}\n    </div>\n  )\n}\n\nfunction DialogTitle({\n  className,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n  return (\n    <DialogPrimitive.Title\n      data-slot=\"dialog-title\"\n      className={cn(\"text-lg leading-none font-semibold\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction DialogDescription({\n  className,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n  return (\n    <DialogPrimitive.Description\n      data-slot=\"dialog-description\"\n      className={cn(\"text-sm text-muted-foreground\", className)}\n      {...props}\n    />\n  )\n}\n\nexport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogOverlay,\n  DialogPortal,\n  DialogTitle,\n  DialogTrigger,\n}\n","\"use client\";\n\nimport type { ImageBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport type { ElementType } from \"react\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogTitle,\n  DialogTrigger,\n} from \"../components/ui/dialog.js\";\nimport { useNotionContext } from \"../context\";\nimport { getFileUrl } from \"../lib/notion-file\";\nimport { Caption } from \"../rich-text/Caption\";\nimport type { BlockComponentProps } from \"../types\";\n\n/**\n * `src` に対して `?w={width}` クエリ付きの srcSet を生成する。\n * 既存のクエリと衝突しないよう URL コンストラクタを使って構築する。\n * URL コンストラクタが失敗した場合 (相対パスなど) は素朴に `?w=` を末尾に付ける。\n */\nfunction buildSrcSet(\n  src: string,\n  sizes: readonly number[],\n): string | undefined {\n  if (sizes.length === 0) return undefined;\n  return sizes\n    .map((w) => {\n      let url: string;\n      try {\n        const u = new URL(src, \"http://__nhc.local\");\n        u.searchParams.set(\"w\", String(w));\n        url =\n          u.origin === \"http://__nhc.local\"\n            ? `${u.pathname}${u.search}`\n            : u.toString();\n      } catch {\n        url = src.includes(\"?\") ? `${src}&w=${w}` : `${src}?w=${w}`;\n      }\n      return `${url} ${w}w`;\n    })\n    .join(\", \");\n}\n\n/**\n * caption が「単一の URL のみ」で構成される場合に、そのリンク URL を返す。\n * Notion の image ブロックには画像自体のリンクを表す API フィールドが無いため、\n * caption に URL だけを入れる規約で「クリックでリンクへ飛ぶ画像」を表現する。\n * 説明テキスト付きリンク (plain_text ≠ URL) は従来どおり caption として扱うため除外する。\n */\nfunction captionLinkUrl(\n  caption: ImageBlockObjectResponse[\"image\"][\"caption\"],\n): string | null {\n  const item = caption.length === 1 ? caption[0] : undefined;\n  if (!item) return null;\n  const href =\n    item.type === \"text\" ? (item.text.link?.url ?? item.href) : item.href;\n  if (!href) return null;\n  if (item.plain_text.trim() !== href.trim()) return null;\n  return href;\n}\n\nexport function Image({\n  block,\n  className,\n}: BlockComponentProps<ImageBlockObjectResponse>) {\n  const {\n    resolveImageUrl,\n    Image: ImageSlot,\n    imageSizes,\n    imageSizesAttr,\n  } = useNotionContext();\n  const rawUrl = getFileUrl(block.image);\n  const src = resolveImageUrl ? resolveImageUrl(rawUrl, block) : rawUrl;\n  const alt = block.image.caption.map((rt) => rt.plain_text).join(\"\") || \"\";\n  const Img = (ImageSlot ?? \"img\") as ElementType<\n    React.ImgHTMLAttributes<HTMLImageElement>\n  >;\n  // v3 パイプライン(resolveImageUrls)が焼き込む寸法。Notion API 本来の image オブジェクトには\n  // 無いフィールドなので、存在する場合のみ CLS ゼロ化のため width/height を付与する。\n  const dimensions = (\n    block.image as unknown as {\n      _dimensions?: { width: number | null; height: number | null };\n    }\n  )._dimensions;\n\n  // Notion 署名 URL は失効するため srcSet 化しない (resolveImageUrl で proxy 化された場合のみ意味がある)。\n  // 「proxy 化されたかどうか」は src と rawUrl の比較で判定する。\n  const isProxied = !!resolveImageUrl && src !== rawUrl;\n  const srcSet =\n    isProxied && imageSizes ? buildSrcSet(src, imageSizes) : undefined;\n\n  const linkUrl = captionLinkUrl(block.image.caption);\n  if (linkUrl) {\n    // クリックでリンクへ遷移させるため、ズーム用 Dialog は使わない。\n    // caption は URL のみのため説明文 alt も持たせない。\n    return (\n      <figure className={className}>\n        <a\n          href={linkUrl}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"block\"\n        >\n          <Img\n            src={src}\n            srcSet={srcSet}\n            sizes={srcSet ? imageSizesAttr : undefined}\n            alt=\"\"\n            width={dimensions?.width ?? undefined}\n            height={dimensions?.height ?? undefined}\n            loading=\"lazy\"\n            className=\"h-auto max-w-full rounded-lg\"\n          />\n        </a>\n      </figure>\n    );\n  }\n\n  return (\n    <figure className={className}>\n      <Dialog>\n        <DialogTrigger\n          className=\"block cursor-zoom-in border-0 bg-transparent p-0\"\n          aria-label=\"画像を拡大表示\"\n        >\n          <Img\n            src={src}\n            srcSet={srcSet}\n            sizes={srcSet ? imageSizesAttr : undefined}\n            alt={alt}\n            width={dimensions?.width ?? undefined}\n            height={dimensions?.height ?? undefined}\n            loading=\"lazy\"\n            className=\"h-auto max-w-full rounded-lg\"\n          />\n        </DialogTrigger>\n        <DialogContent\n          showCloseButton={false}\n          className=\"max-w-[calc(100%-2rem)] border-0 bg-transparent p-0 shadow-none sm:max-w-[90vw]\"\n        >\n          <DialogTitle className=\"sr-only\">{alt || \"画像\"}</DialogTitle>\n          <img\n            src={src}\n            alt={alt}\n            className=\"max-h-[90vh] max-w-full object-contain\"\n          />\n        </DialogContent>\n      </Dialog>\n      <Caption value={block.image.caption} />\n    </figure>\n  );\n}\n","import * as React from \"react\"\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\"\n\nimport { cn } from \"src/lib/utils\"\n\nfunction HoverCard({\n  ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n  return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({\n  ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n  return (\n    <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n  )\n}\n\nfunction HoverCardContent({\n  className,\n  align = \"center\",\n  sideOffset = 4,\n  ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n  return (\n    <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n      <HoverCardPrimitive.Content\n        data-slot=\"hover-card-content\"\n        align={align}\n        sideOffset={sideOffset}\n        className={cn(\n          \"z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n          className\n        )}\n        {...props}\n      />\n    </HoverCardPrimitive.Portal>\n  )\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","\"use client\";\n\nimport type { LinkPreviewBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { Link as LinkIcon } from \"lucide-react\";\nimport type { ElementType } from \"react\";\nimport {\n  HoverCard,\n  HoverCardContent,\n  HoverCardTrigger,\n} from \"../components/ui/hover-card.js\";\nimport { useNotionContext } from \"../context\";\nimport { OgCard, type OgCardData } from \"../embeds/OgCard\";\nimport { useOgp } from \"../embeds/useOgp.js\";\nimport { cn } from \"../lib/utils\";\nimport type { BlockComponentProps } from \"../types\";\n\ntype LinkPreviewBlockMaybeWithOgp = LinkPreviewBlockObjectResponse & {\n  ogp?: OgCardData;\n};\n\n/**\n * link_preview ブロックの既定描画。`block.ogp`（同期時付与）優先、無ければ `useOgp`\n * がページアクセス時にクライアントから取得する。それも無ければリンクのみの\n * HoverCard にフォールバックする。\n */\nexport function LinkPreview({\n  block,\n  className,\n}: BlockComponentProps<LinkPreviewBlockObjectResponse>) {\n  const { Link: LinkSlot } = useNotionContext();\n  const url = block.link_preview.url;\n  const preloadedOgp = (block as LinkPreviewBlockMaybeWithOgp).ogp;\n  const fetchedOgp = useOgp(preloadedOgp ? null : url);\n  const ogp = preloadedOgp ?? fetchedOgp;\n\n  if (ogp) {\n    return (\n      <div className={cn(\"my-3\", className)}>\n        <OgCard url={url} ogp={ogp} />\n      </div>\n    );\n  }\n\n  const LinkComp = (LinkSlot ?? \"a\") as ElementType<\n    React.AnchorHTMLAttributes<HTMLAnchorElement>\n  >;\n  return (\n    <HoverCard>\n      <HoverCardTrigger asChild>\n        <LinkComp\n          href={url}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className={cn(\n            \"my-2 inline-flex items-center gap-1 text-primary hover:underline\",\n            className,\n          )}\n        >\n          <LinkIcon className=\"size-3.5\" aria-hidden />\n          <span className=\"truncate\">{url}</span>\n        </LinkComp>\n      </HoverCardTrigger>\n      <HoverCardContent className=\"text-xs break-all\">{url}</HoverCardContent>\n    </HoverCard>\n  );\n}\n","\"use client\";\n\nimport type { LinkToPageBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { FileText } from \"lucide-react\";\nimport type { ElementType } from \"react\";\nimport { Button } from \"../components/ui/button.js\";\nimport { useNotionContext } from \"../context.js\";\nimport { normalizePageId } from \"../lib/normalize-page-id.js\";\nimport { cn } from \"../lib/utils.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function LinkToPage({\n  block,\n  className,\n}: BlockComponentProps<LinkToPageBlockObjectResponse>) {\n  const {\n    pageLinks,\n    resolvePageUrl,\n    resolvePageTitle,\n    Link: LinkSlot,\n  } = useNotionContext();\n  const target = block.link_to_page;\n  const id =\n    target.type === \"page_id\"\n      ? target.page_id\n      : target.type === \"database_id\"\n        ? target.database_id\n        : \"comment\";\n  const resolved = pageLinks?.[normalizePageId(id)];\n  const href = resolved?.href ?? resolvePageUrl?.(id) ?? `#${id}`;\n  const title = resolved?.title || resolvePageTitle?.(id) || \"Open page\";\n  const LinkComp = (LinkSlot ?? \"a\") as ElementType<\n    React.AnchorHTMLAttributes<HTMLAnchorElement>\n  >;\n  return (\n    <Button\n      asChild\n      variant=\"link\"\n      size=\"sm\"\n      className={cn(\"my-2 px-0\", className)}\n    >\n      <LinkComp href={href}>\n        <FileText aria-hidden />\n        {title}\n      </LinkComp>\n    </Button>\n  );\n}\n","\"use client\";\n\nimport type { NumberedListItemBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { notionBlockColorClass } from \"../lib/notion-color.js\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport { RichText } from \"../rich-text/RichText.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function NumberedListItem({\n  block,\n  className,\n}: BlockComponentProps<NumberedListItemBlockObjectResponse>) {\n  return (\n    <li\n      className={cn(\n        \"leading-7\",\n        notionBlockColorClass(block.numbered_list_item.color),\n        className,\n      )}\n    >\n      <RichText value={block.numbered_list_item.rich_text} />\n      {block.children ? (\n        <div className=\"ml-2\">\n          <NotionBlocks blocks={block.children} />\n        </div>\n      ) : null}\n    </li>\n  );\n}\n","\"use client\";\n\nimport type { ParagraphBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { notionBlockColorClass } from \"../lib/notion-color.js\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport { RichText } from \"../rich-text/RichText.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function Paragraph({\n  block,\n  className,\n}: BlockComponentProps<ParagraphBlockObjectResponse>) {\n  return (\n    <div\n      className={cn(\n        \"my-2\",\n        notionBlockColorClass(block.paragraph.color),\n        className,\n      )}\n    >\n      <p className=\"leading-7\">\n        {block.paragraph.rich_text.length === 0 ? (\n          <br />\n        ) : (\n          <RichText value={block.paragraph.rich_text} />\n        )}\n      </p>\n      {block.children ? (\n        <div className=\"ml-6\">\n          <NotionBlocks blocks={block.children} />\n        </div>\n      ) : null}\n    </div>\n  );\n}\n","\"use client\";\n\nimport type { PdfBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { AspectRatio } from \"../components/ui/aspect-ratio\";\nimport { useNotionContext } from \"../context\";\nimport { getFileUrl } from \"../lib/notion-file\";\nimport { cn } from \"../lib/utils\";\nimport { Caption } from \"../rich-text/Caption\";\nimport type { BlockComponentProps } from \"../types\";\n\nexport function Pdf({\n  block,\n  className,\n}: BlockComponentProps<PdfBlockObjectResponse>) {\n  const { resolveImageUrl } = useNotionContext();\n  const rawUrl = getFileUrl(block.pdf);\n  const src = resolveImageUrl ? resolveImageUrl(rawUrl, block) : rawUrl;\n  return (\n    <figure className={cn(\"my-4\", className)}>\n      <AspectRatio ratio={4 / 3} className=\"overflow-hidden rounded-lg border\">\n        <iframe\n          src={src}\n          title=\"PDF preview\"\n          className=\"h-full w-full\"\n          sandbox=\"allow-scripts allow-same-origin\"\n        />\n      </AspectRatio>\n      <Caption value={block.pdf.caption} />\n    </figure>\n  );\n}\n","\"use client\";\n\nimport type { QuoteBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { notionBlockColorClass } from \"../lib/notion-color.js\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport { RichText } from \"../rich-text/RichText.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function Quote({\n  block,\n  className,\n}: BlockComponentProps<QuoteBlockObjectResponse>) {\n  return (\n    <blockquote\n      className={cn(\n        \"my-3 border-l-4 border-muted-foreground/30 pl-4 italic text-muted-foreground\",\n        notionBlockColorClass(block.quote.color),\n        className,\n      )}\n    >\n      <RichText value={block.quote.rich_text} />\n      {block.children ? (\n        <div className=\"mt-2\">\n          <NotionBlocks blocks={block.children} />\n        </div>\n      ) : null}\n    </blockquote>\n  );\n}\n","\"use client\";\n\nimport type { SyncedBlockBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\n// synced_block は original / duplicate どちらでも children を素通しで描画すれば見た目は等価。\nexport function SyncedBlock({\n  block,\n}: BlockComponentProps<SyncedBlockBlockObjectResponse>) {\n  if (!block.children) return null;\n  return <NotionBlocks blocks={block.children} />;\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"src/lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n  return (\n    <div\n      data-slot=\"table-container\"\n      className=\"relative w-full overflow-x-auto\"\n    >\n      <table\n        data-slot=\"table\"\n        className={cn(\"w-full caption-bottom text-sm\", className)}\n        {...props}\n      />\n    </div>\n  )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n  return (\n    <thead\n      data-slot=\"table-header\"\n      className={cn(\"[&_tr]:border-b\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n  return (\n    <tbody\n      data-slot=\"table-body\"\n      className={cn(\"[&_tr:last-child]:border-0\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n  return (\n    <tfoot\n      data-slot=\"table-footer\"\n      className={cn(\n        \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n  return (\n    <tr\n      data-slot=\"table-row\"\n      className={cn(\n        \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n  return (\n    <th\n      data-slot=\"table-head\"\n      className={cn(\n        \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n  return (\n    <td\n      data-slot=\"table-cell\"\n      className={cn(\n        \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TableCaption({\n  className,\n  ...props\n}: React.ComponentProps<\"caption\">) {\n  return (\n    <caption\n      data-slot=\"table-caption\"\n      className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n      {...props}\n    />\n  )\n}\n\nexport {\n  Table,\n  TableHeader,\n  TableBody,\n  TableFooter,\n  TableHead,\n  TableRow,\n  TableCell,\n  TableCaption,\n}\n","\"use client\";\n\nimport type {\n  TableBlockObjectResponse,\n  TableRowBlockObjectResponse,\n} from \"@notionhq/client/build/src/api-endpoints\";\nimport {\n  TableBody,\n  TableCell,\n  TableHead,\n  TableHeader,\n  TableRow,\n  Table as UiTable,\n} from \"../components/ui/table\";\nimport { cn } from \"../lib/utils\";\nimport { RichText } from \"../rich-text/RichText\";\nimport type { BlockComponentProps, NotionBlock } from \"../types\";\n\nfunction isTableRow(b: NotionBlock): b is TableRowBlockObjectResponse {\n  return b.type === \"table_row\";\n}\n\nexport function Table({\n  block,\n  className,\n}: BlockComponentProps<TableBlockObjectResponse>) {\n  const rows = (block.children ?? []).filter(isTableRow);\n  const hasHeaderRow = block.table.has_column_header && rows.length > 0;\n  const headerCells = hasHeaderRow ? (rows[0]?.table_row.cells ?? []) : [];\n  const bodyRows = hasHeaderRow ? rows.slice(1) : rows;\n\n  return (\n    <UiTable className={cn(\"my-3 w-full\", className)}>\n      {hasHeaderRow ? (\n        <TableHeader>\n          <TableRow>\n            {headerCells.map((cell, idx) => (\n              // biome-ignore lint/suspicious/noArrayIndexKey: 列順は安定\n              <TableHead key={idx}>\n                <RichText value={cell} />\n              </TableHead>\n            ))}\n          </TableRow>\n        </TableHeader>\n      ) : null}\n      <TableBody>\n        {bodyRows.map((row) => (\n          <TableRow key={row.id}>\n            {row.table_row.cells.map((cell, idx) => (\n              // biome-ignore lint/suspicious/noArrayIndexKey: 列順は安定\n              <TableCell key={idx}>\n                <RichText value={cell} />\n              </TableCell>\n            ))}\n          </TableRow>\n        ))}\n      </TableBody>\n    </UiTable>\n  );\n}\n","\"use client\";\n\nimport type { ElementType } from \"react\";\nimport { useNotionContext } from \"../context.js\";\nimport { cn } from \"../lib/utils.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nconst INDENT_BY_LEVEL: Record<1 | 2 | 3 | 4, string> = {\n  1: \"pl-0\",\n  2: \"pl-4\",\n  3: \"pl-8\",\n  4: \"pl-12\",\n};\n\n/**\n * ページ内の heading_1..4 をリンクリストとして描画する。\n * 見出しは NotionRenderer が抽出して Context に流すため、ここでは読み取るだけ。\n *\n * ScrollArea を使わずに `overflow-y-auto` 直書きにしているのは、Radix の\n * 内部ラッパが `display:table` を被せるため `truncate` が機能しなくなり、\n * 長い見出しテキストが横に溢れて視覚的に重なるのを避けるため。\n */\nexport function TableOfContents({\n  className,\n}: Pick<BlockComponentProps, \"className\"> = {}) {\n  const { headings, Link: LinkSlot } = useNotionContext();\n  const items = headings ?? [];\n  if (items.length === 0) return null;\n  const LinkComp = (LinkSlot ?? \"a\") as ElementType<\n    React.AnchorHTMLAttributes<HTMLAnchorElement>\n  >;\n  return (\n    <nav\n      aria-label=\"table of contents\"\n      className={cn(\n        \"my-3 max-h-64 w-full overflow-y-auto rounded-lg border p-3 text-sm\",\n        className,\n      )}\n    >\n      <ul className=\"space-y-1\">\n        {items.map((h) => (\n          <li key={h.id} className={cn(\"min-w-0\", INDENT_BY_LEVEL[h.level])}>\n            <LinkComp\n              href={`#${h.id}`}\n              className=\"block truncate text-muted-foreground hover:text-foreground hover:underline\"\n            >\n              {h.text}\n            </LinkComp>\n          </li>\n        ))}\n      </ul>\n    </nav>\n  );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon } from \"lucide-react\"\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\"\n\nimport { cn } from \"src/lib/utils\"\n\nfunction Checkbox({\n  className,\n  ...props\n}: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n  return (\n    <CheckboxPrimitive.Root\n      data-slot=\"checkbox\"\n      className={cn(\n        \"peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs transition-shadow outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary\",\n        className\n      )}\n      {...props}\n    >\n      <CheckboxPrimitive.Indicator\n        data-slot=\"checkbox-indicator\"\n        className=\"grid place-content-center text-current transition-none\"\n      >\n        <CheckIcon className=\"size-3.5\" />\n      </CheckboxPrimitive.Indicator>\n    </CheckboxPrimitive.Root>\n  )\n}\n\nexport { Checkbox }\n","import * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"src/lib/utils\"\n\nfunction Label({\n  className,\n  ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n  return (\n    <LabelPrimitive.Root\n      data-slot=\"label\"\n      className={cn(\n        \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport { Label }\n","\"use client\";\n\nimport type { ToDoBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { Checkbox } from \"../components/ui/checkbox.js\";\nimport { Label } from \"../components/ui/label.js\";\nimport { notionBlockColorClass } from \"../lib/notion-color.js\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport { RichText } from \"../rich-text/RichText.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function ToDo({\n  block,\n  className,\n}: BlockComponentProps<ToDoBlockObjectResponse>) {\n  const checked = block.to_do.checked;\n  const id = `todo-${block.id}`;\n  return (\n    <div\n      className={cn(\n        \"my-1\",\n        notionBlockColorClass(block.to_do.color),\n        className,\n      )}\n    >\n      <Label htmlFor={id} className=\"items-start gap-2 leading-7 font-normal\">\n        <Checkbox\n          id={id}\n          checked={checked}\n          // Notion 由来の表示専用なのでクリック不可（disabled だと色が薄くなりすぎるため pointer-events のみ抑止）\n          aria-readonly\n          className=\"mt-1.5 pointer-events-none\"\n          tabIndex={-1}\n        />\n        <span\n          className={checked ? \"text-muted-foreground line-through\" : undefined}\n        >\n          <RichText value={block.to_do.rich_text} />\n        </span>\n      </Label>\n      {block.children ? (\n        <div className=\"ml-6\">\n          <NotionBlocks blocks={block.children} />\n        </div>\n      ) : null}\n    </div>\n  );\n}\n","\"use client\";\n\nimport type { ToggleBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { ChevronRight } from \"lucide-react\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"../components/ui/collapsible.js\";\nimport { notionBlockColorClass } from \"../lib/notion-color.js\";\nimport { cn } from \"../lib/utils.js\";\nimport { NotionBlocks } from \"../NotionBlocks.js\";\nimport { RichText } from \"../rich-text/RichText.js\";\nimport type { BlockComponentProps } from \"../types.js\";\n\nexport function Toggle({\n  block,\n  className,\n}: BlockComponentProps<ToggleBlockObjectResponse>) {\n  return (\n    <Collapsible\n      className={cn(\n        \"my-2\",\n        notionBlockColorClass(block.toggle.color),\n        className,\n      )}\n    >\n      <CollapsibleTrigger className=\"group flex items-center gap-2 text-left\">\n        <ChevronRight\n          aria-hidden\n          className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\"\n        />\n        <span className=\"leading-7\">\n          <RichText value={block.toggle.rich_text} />\n        </span>\n      </CollapsibleTrigger>\n      {block.children ? (\n        <CollapsibleContent className=\"ml-6\">\n          <NotionBlocks blocks={block.children} />\n        </CollapsibleContent>\n      ) : null}\n    </Collapsible>\n  );\n}\n","import { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"src/lib/utils\"\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"empty\"\n      className={cn(\n        \"flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"empty-header\"\n      className={cn(\n        \"flex max-w-sm flex-col items-center gap-2 text-center\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nconst emptyMediaVariants = cva(\n  \"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-transparent\",\n        icon: \"flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nfunction EmptyMedia({\n  className,\n  variant = \"default\",\n  ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n  return (\n    <div\n      data-slot=\"empty-icon\"\n      data-variant={variant}\n      className={cn(emptyMediaVariants({ variant, className }))}\n      {...props}\n    />\n  )\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"empty-title\"\n      className={cn(\"text-lg font-medium tracking-tight\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n  return (\n    <div\n      data-slot=\"empty-description\"\n      className={cn(\n        \"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"empty-content\"\n      className={cn(\n        \"flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport {\n  Empty,\n  EmptyHeader,\n  EmptyTitle,\n  EmptyDescription,\n  EmptyContent,\n  EmptyMedia,\n}\n","\"use client\";\n\nimport type { BlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport {\n  Empty,\n  EmptyDescription,\n  EmptyHeader,\n  EmptyTitle,\n} from \"../components/ui/empty.js\";\nimport { cn } from \"../lib/utils\";\nimport type { BlockComponentProps } from \"../types\";\n\nexport function Unsupported({\n  block,\n  className,\n}: BlockComponentProps<BlockObjectResponse>) {\n  return (\n    <Empty className={cn(\"my-2 border p-4\", className)}>\n      <EmptyHeader>\n        <EmptyTitle>Unsupported block</EmptyTitle>\n        <EmptyDescription>{block.type}</EmptyDescription>\n      </EmptyHeader>\n    </Empty>\n  );\n}\n","\"use client\";\n\nimport type { VideoBlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { AspectRatio } from \"../components/ui/aspect-ratio\";\nimport { useNotionContext } from \"../context\";\nimport { getFileUrl } from \"../lib/notion-file\";\nimport { cn } from \"../lib/utils\";\nimport { Caption } from \"../rich-text/Caption\";\nimport type { BlockComponentProps } from \"../types\";\n\nconst YOUTUBE_RE =\n  /(?:youtube\\.com\\/(?:watch\\?v=|embed\\/)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/;\n\n/** YouTube の watch URL を embed URL（?rel=0 付き）に変換する。既に embed 形式か非 YouTube URL はそのまま返す。 */\nfunction toYoutubeEmbedUrl(url: string): string {\n  const m = url.match(YOUTUBE_RE);\n  if (m?.[1]) {\n    return `https://www.youtube.com/embed/${m[1]}?rel=0`;\n  }\n  return url;\n}\n\nconst NOTION_SANDBOX =\n  \"allow-scripts allow-popups allow-top-navigation-by-user-activation allow-forms allow-same-origin allow-storage-access-by-user-activation allow-popups-to-escape-sandbox\";\n\nexport function Video({\n  block,\n  className,\n}: BlockComponentProps<VideoBlockObjectResponse>) {\n  const { resolveImageUrl } = useNotionContext();\n  const rawUrl = getFileUrl(block.video);\n  const resolved = resolveImageUrl ? resolveImageUrl(rawUrl, block) : rawUrl;\n  const src =\n    block.video.type === \"external\" ? toYoutubeEmbedUrl(resolved) : resolved;\n  const caption = <Caption value={block.video.caption} />;\n\n  if (block.video.type === \"external\") {\n    return (\n      <figure className={cn(\"my-4\", className)}>\n        <AspectRatio\n          ratio={16 / 9}\n          className=\"overflow-hidden rounded-lg border\"\n        >\n          <iframe\n            src={src}\n            title=\"Video\"\n            className=\"h-full w-full\"\n            sandbox={NOTION_SANDBOX}\n            allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n            allowFullScreen\n          />\n        </AspectRatio>\n        {caption}\n      </figure>\n    );\n  }\n\n  return (\n    <figure className={cn(\"my-4\", className)}>\n      <video src={src} controls className=\"w-full rounded-lg\">\n        <track kind=\"captions\" />\n      </video>\n      {caption}\n    </figure>\n  );\n}\n","export { Audio } from \"./Audio\";\nexport { Bookmark } from \"./Bookmark\";\nexport { Breadcrumb } from \"./Breadcrumb\";\nexport { BulletedListItem } from \"./BulletedListItem\";\nexport { Callout } from \"./Callout\";\nexport { ChildDatabase } from \"./ChildDatabase\";\nexport { ChildPage } from \"./ChildPage\";\nexport { Code } from \"./Code\";\nexport { Column } from \"./Column\";\nexport { ColumnList } from \"./ColumnList\";\nexport { Divider } from \"./Divider\";\nexport { Embed } from \"./Embed\";\nexport { Equation } from \"./Equation\";\nexport { File } from \"./File\";\nexport { Heading } from \"./Heading\";\nexport { Image } from \"./Image\";\nexport { LinkPreview } from \"./LinkPreview\";\nexport { LinkToPage } from \"./LinkToPage\";\nexport { NumberedListItem } from \"./NumberedListItem\";\nexport { Paragraph } from \"./Paragraph\";\nexport { Pdf } from \"./Pdf\";\nexport { Quote } from \"./Quote\";\nexport { SyncedBlock } from \"./SyncedBlock\";\nexport { Table } from \"./Table\";\nexport { TableOfContents } from \"./TableOfContents\";\nexport { ToDo } from \"./ToDo\";\nexport { Toggle } from \"./Toggle\";\nexport { Unsupported } from \"./Unsupported\";\nexport { Video } from \"./Video\";\n","\"use client\";\n\nimport type { BlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport type { ComponentType } from \"react\";\nimport * as Defaults from \"./blocks/index.js\";\nimport { useNotionContext } from \"./context.js\";\nimport type {\n  BlockComponentProps,\n  ComponentOverrides,\n  NotionBlock,\n} from \"./types.js\";\n\n/** {@link BlockSwitch} の props。`block` 1 個を Context 経由で対応コンポーネントに振り分ける。 */\nexport interface BlockSwitchProps {\n  block: NotionBlock;\n}\n\ntype AnyBlockComponent = ComponentType<BlockComponentProps>;\n\n/**\n * `block.type` から対応するコンポーネントを Context 経由で引き当てて描画する。\n * カスタムコンポーネントは `NotionRenderer` の `components` props で渡す。\n *\n * @example\n * ```tsx\n * <NotionRenderer\n *   blocks={blocks}\n *   components={{ Code: MyCustomCodeBlock }}\n * />\n * // 内部で <BlockSwitch block={...} /> が MyCustomCodeBlock を引き当てる\n * ```\n *\n * @see {@link NotionRenderer} カスタムコンポーネント注入を含むトップレベル API。\n */\nexport function BlockSwitch({ block }: BlockSwitchProps) {\n  const { components, classNames } = useNotionContext();\n  const C = pickComponent(block, components) as AnyBlockComponent;\n  return <C block={block} className={classNames?.[block.type]} />;\n}\n\n// `@notionhq/client` 側で BlockObjectResponse の union に新 type が増えると\n// satisfies が型エラーになる (= ライブラリ追従漏れの検知)。自前の type-test を\n// 置かずに @notionhq/client の型を直接使って網羅性を保証する。\nfunction pickComponent(block: NotionBlock, o?: ComponentOverrides): unknown {\n  const map = {\n    paragraph: o?.Paragraph ?? Defaults.Paragraph,\n    heading_1: o?.Heading ?? Defaults.Heading,\n    heading_2: o?.Heading ?? Defaults.Heading,\n    heading_3: o?.Heading ?? Defaults.Heading,\n    heading_4: o?.Heading ?? Defaults.Heading,\n    bulleted_list_item: o?.BulletedListItem ?? Defaults.BulletedListItem,\n    numbered_list_item: o?.NumberedListItem ?? Defaults.NumberedListItem,\n    to_do: o?.ToDo ?? Defaults.ToDo,\n    toggle: o?.Toggle ?? Defaults.Toggle,\n    callout: o?.Callout ?? Defaults.Callout,\n    quote: o?.Quote ?? Defaults.Quote,\n    code: o?.Code ?? Defaults.Code,\n    equation: o?.Equation ?? Defaults.Equation,\n    divider: o?.Divider ?? Defaults.Divider,\n    image: o?.Image ?? Defaults.Image,\n    video: o?.Video ?? Defaults.Video,\n    audio: o?.Audio ?? Defaults.Audio,\n    file: o?.File ?? Defaults.File,\n    pdf: o?.Pdf ?? Defaults.Pdf,\n    bookmark: o?.Bookmark ?? Defaults.Bookmark,\n    link_preview: o?.LinkPreview ?? Defaults.LinkPreview,\n    link_to_page: o?.LinkToPage ?? Defaults.LinkToPage,\n    child_page: o?.ChildPage ?? Defaults.ChildPage,\n    child_database: o?.ChildDatabase ?? Defaults.ChildDatabase,\n    embed: o?.Embed ?? Defaults.Embed,\n    table: o?.Table ?? Defaults.Table,\n    table_row: o?.TableRow ?? Defaults.Unsupported,\n    column_list: o?.ColumnList ?? Defaults.ColumnList,\n    column: o?.Column ?? Defaults.Column,\n    synced_block: o?.SyncedBlock ?? Defaults.SyncedBlock,\n    breadcrumb: o?.Breadcrumb ?? Defaults.Breadcrumb,\n    table_of_contents: o?.TableOfContents ?? Defaults.TableOfContents,\n    tab: o?.Tab ?? Defaults.Unsupported,\n    template: o?.Template ?? Defaults.Unsupported,\n    meeting_notes: o?.MeetingNotes ?? Defaults.Unsupported,\n    transcription: Defaults.Unsupported,\n    unsupported: o?.Unsupported ?? Defaults.Unsupported,\n  } satisfies Record<BlockObjectResponse[\"type\"], unknown>;\n  // 型より新しいランタイム値 (lib 未追従の Notion 新 block type) は Unsupported に倒す\n  return (\n    (map as Record<string, unknown>)[block.type] ??\n    o?.Unsupported ??\n    Defaults.Unsupported\n  );\n}\n","export type { OgCardData, OgCardProps } from \"./OgCard\";\nexport { OgCard } from \"./OgCard\";\nexport { useOgp } from \"./useOgp.js\";\n","import type { NotionBlock } from \"../types\";\n\nexport interface ExtractedHeading {\n  id: string;\n  level: 1 | 2 | 3 | 4;\n  text: string;\n}\n\nconst LEVEL_BY_TYPE: Record<string, 1 | 2 | 3 | 4> = {\n  heading_1: 1,\n  heading_2: 2,\n  heading_3: 3,\n  heading_4: 4,\n};\n\n/** heading_1..4 を DFS 順に抽出する。is_toggleable 配下の見出しも含める（Notion 本家挙動）。 */\nexport function extractHeadings(blocks: NotionBlock[]): ExtractedHeading[] {\n  const out: ExtractedHeading[] = [];\n  walk(blocks, out);\n  return out;\n}\n\nfunction walk(blocks: NotionBlock[], out: ExtractedHeading[]): void {\n  for (const block of blocks) {\n    const level = LEVEL_BY_TYPE[block.type];\n    if (level) {\n      const payload = (\n        block as unknown as Record<\n          string,\n          { rich_text: { plain_text: string }[] }\n        >\n      )[block.type];\n      const text = payload?.rich_text.map((rt) => rt.plain_text).join(\"\") ?? \"\";\n      out.push({ id: block.id, level, text });\n    }\n    if (block.children?.length) walk(block.children, out);\n  }\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { NotionContext } from \"./context.js\";\nimport { extractHeadings } from \"./lib/extract-headings.js\";\nimport { cn } from \"./lib/utils.js\";\nimport { NotionBlocks } from \"./NotionBlocks.js\";\nimport type { ComponentOverrides, NotionRendererProps } from \"./types.js\";\n\n/**\n * Notion ブロック木 (`NotionBlockTreeNode[]`) を React で描画するエントリ。\n * `components` / `classNames` を Context に注入して各ブロックコンポーネントへ伝搬する。\n * TOC のために heading_1..4 を抽出して Context へ流す。\n *\n * @example\n * ```tsx\n * import { NotionRenderer } from \"@notion-headless-cms/react-renderer\";\n *\n * export function Article({ blocks }: { blocks: NotionBlock[] }) {\n *   return (\n *     <NotionRenderer\n *       blocks={blocks}\n *       className=\"prose dark:prose-invert\"\n *       imageSizes={[400, 800, 1200]}\n *     />\n *   );\n * }\n * ```\n *\n * @see {@link NotionThemeProvider} ダークモード切替を組み合わせる場合。\n * @see {@link NotionBlocks} 既に Context が確立されている子ツリー描画用。\n */\nexport function NotionRenderer({\n  blocks,\n  components,\n  extensions,\n  className,\n  classNames,\n  resolveImageUrl,\n  pageLinks,\n  resolvePageUrl,\n  resolvePageTitle,\n  Image: ImageSlot,\n  Link: LinkSlot,\n  imageSizes,\n  imageSizesAttr,\n  ogpEndpoint,\n}: NotionRendererProps) {\n  const headings = useMemo(() => extractHeadings(blocks), [blocks]);\n  const mergedComponents = useMemo(() => {\n    const fromExt = Object.assign(\n      {},\n      ...(extensions ?? []).map((e) => e.getBlockComponents?.() ?? {}),\n    );\n    return { ...fromExt, ...(components ?? {}) } as ComponentOverrides;\n  }, [extensions, components]);\n  const contextValue = useMemo(\n    () => ({\n      components: mergedComponents,\n      classNames,\n      resolveImageUrl,\n      pageLinks,\n      resolvePageUrl,\n      resolvePageTitle,\n      Image: ImageSlot,\n      Link: LinkSlot,\n      headings,\n      listDepth: 0,\n      imageSizes,\n      imageSizesAttr,\n      ogpEndpoint,\n    }),\n    [\n      mergedComponents,\n      classNames,\n      resolveImageUrl,\n      pageLinks,\n      resolvePageUrl,\n      resolvePageTitle,\n      ImageSlot,\n      LinkSlot,\n      headings,\n      imageSizes,\n      imageSizesAttr,\n      ogpEndpoint,\n    ],\n  );\n  return (\n    <NotionContext.Provider value={contextValue}>\n      <div className={cn(\"notion-renderer\", className)}>\n        <NotionBlocks blocks={blocks} />\n      </div>\n    </NotionContext.Provider>\n  );\n}\n","\"use client\";\n\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\";\n\n/**\n * テーマ識別子。\n * - `\"light\"` / `\"dark\"` は明示モード\n * - `\"system\"` は `prefers-color-scheme: dark` に追従 (SSR 中は light)\n */\nexport type NotionTheme = \"light\" | \"dark\" | \"system\";\n\nexport interface NotionThemeProviderProps {\n  /** 既定 `\"system\"`。 */\n  theme?: NotionTheme;\n  /**\n   * `theme === \"dark\"` または `theme === \"system\"` でダークが選ばれているとき、\n   * ルート div に付与するクラス名。Tailwind v4 のデフォルトは `\"dark\"`。\n   */\n  darkClassName?: string;\n  /**\n   * `light` テーマ時にルート div に付与するクラス名。指定しない場合はクラスを足さない。\n   * 例: `\"light\"` を指定すれば `[data-theme=light]` セレクタを使うサイトとも互換になる。\n   */\n  lightClassName?: string;\n  /** 追加で付けたい className。 */\n  className?: string;\n  children?: ReactNode;\n}\n\n/**\n * Notion ブロックを描画するルート要素に theme クラスを付与する Provider。\n * `<NotionRenderer>` をこの中に置くと、`prose dark:prose-invert` のような\n * Tailwind v4 のダークモードクラスが効くようになる。\n *\n * SSR 中は `system` でも light として描画し、hydration 後に `prefers-color-scheme`\n * を見て切り替える。チラつきを完全に避けたい場合は `next-themes` などのライブラリと\n * 併用して、`theme` props で明示的に渡すこと。\n *\n * @example\n * <NotionThemeProvider theme=\"system\">\n *   <NotionRenderer blocks={blocks} className=\"prose dark:prose-invert\" />\n * </NotionThemeProvider>\n */\nexport function NotionThemeProvider({\n  theme = \"system\",\n  darkClassName = \"dark\",\n  lightClassName,\n  className,\n  children,\n}: NotionThemeProviderProps) {\n  const [systemPrefersDark, setSystemPrefersDark] = useState(false);\n\n  useEffect(() => {\n    if (theme !== \"system\") return;\n    if (typeof window === \"undefined\") return;\n    const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n    const update = () => setSystemPrefersDark(media.matches);\n    update();\n    media.addEventListener(\"change\", update);\n    return () => media.removeEventListener(\"change\", update);\n  }, [theme]);\n\n  const resolved = useMemo<\"light\" | \"dark\">(() => {\n    if (theme === \"dark\") return \"dark\";\n    if (theme === \"light\") return \"light\";\n    return systemPrefersDark ? \"dark\" : \"light\";\n  }, [theme, systemPrefersDark]);\n\n  const classes = [\n    \"notion-theme\",\n    resolved === \"dark\" ? darkClassName : lightClassName,\n    className,\n  ]\n    .filter(Boolean)\n    .join(\" \");\n\n  return (\n    <div className={classes} data-notion-theme={resolved}>\n      {children}\n    </div>\n  );\n}\n"],"mappings":"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"}