notion-to-jsx 1.3.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Renderer/index.tsx","../src/components/Renderer/components/List/ListItemGroup.tsx","../src/components/Renderer/components/List/List.tsx","../src/components/Renderer/components/List/styles.css.ts","../src/components/Renderer/components/MemoizedComponents.tsx","../src/components/Renderer/components/RichText/styles.css.ts","../src/components/Renderer/components/RichText/RichTexts.tsx","../src/components/Renderer/components/Image/styles.css.ts","../src/components/Skeleton/styles.css.ts","../src/components/Skeleton/index.tsx","../src/hooks/useImageLoad.ts","../src/components/Renderer/components/Image/Image.tsx","../src/components/Renderer/components/Bookmark/styles.css.ts","../src/components/Renderer/components/Bookmark/Bookmark.tsx","../src/components/Renderer/components/LinkPreview/LinkPreview.tsx","../src/components/Renderer/components/LinkPreview/styles.css.ts","../src/components/Renderer/components/Block/BlockRenderer.tsx","../src/components/Renderer/components/Code/CodeBlock.tsx","../src/components/Renderer/components/Code/styles.css.ts","../src/components/Renderer/components/Typography/Typography.tsx","../src/components/Renderer/components/Typography/styles.css.ts","../src/components/Renderer/components/Column/Column.tsx","../src/components/Renderer/components/Column/styles.css.ts","../src/components/Renderer/components/Column/ColumnList.tsx","../src/components/Renderer/components/Quote/Quote.tsx","../src/components/Renderer/components/Quote/styles.css.ts","../src/components/Renderer/components/Table/Table.tsx","../src/components/Renderer/components/Table/styles.css.ts","../src/components/Renderer/components/Table/TableRow.tsx","../src/components/Renderer/components/Table/index.ts","../src/components/Renderer/components/Toggle/Toggle.tsx","../src/components/Renderer/components/Toggle/styles.css.ts","../src/components/Renderer/components/Video/Video.tsx","../src/components/Renderer/components/Video/styles.css.ts","../src/components/Title/index.tsx","../src/components/Cover/styles.css.ts","../src/components/Cover/index.tsx","../src/components/Renderer/styles.css.ts","../src/styles/theme.css.ts"],"sourcesContent":["import { useMemo, memo, useCallback } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { ListGroup } from './components/List';\nimport { BlockRenderer } from './components/Block';\nimport Title from '../Title';\nimport Cover from '../Cover';\n\nimport {\n BulletedListItemBlock,\n NotionBlock,\n NumberedListItemBlock,\n} from '../../types';\nimport { container } from './styles.css';\nimport { darkTheme, lightTheme } from '../../styles/theme.css';\n\ninterface Props {\n blocks: NotionBlock[];\n title?: string;\n cover?: string;\n isDarkMode?: boolean;\n}\n\nconst Renderer = memo(({ blocks, isDarkMode = false, title, cover }: Props) => {\n const theme = isDarkMode ? darkTheme : lightTheme;\n\n // useCallback으로 안정적인 참조 유지 - 리스트 리렌더 방지\n const renderBlock = useCallback(\n (childBlock: NotionBlock) => <BlockRenderer block={childBlock} />,\n []\n );\n\n const renderedBlocks = useMemo(() => {\n const result: ReactNode[] = [];\n\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n if (!block) break;\n\n // 리스트 아이템 타입 처리를 위한 공통 함수\n const handleListItem = (listType: 'bulleted' | 'numbered') => {\n const listItemType = `${listType}_list_item` as (\n | BulletedListItemBlock\n | NumberedListItemBlock\n )['type'];\n\n if (\n block.type === listItemType &&\n (i === 0 || blocks[i - 1]?.type !== listItemType)\n ) {\n // 연속된 리스트 아이템 수집\n const listItems: (BulletedListItemBlock | NumberedListItemBlock)[] =\n [];\n let j = i;\n while (\n j < blocks.length &&\n blocks[j] &&\n blocks[j]?.type === listItemType\n ) {\n listItems.push(\n blocks[j] as BulletedListItemBlock | NumberedListItemBlock\n );\n j++;\n }\n\n result.push(\n <ListGroup\n key={block.id}\n blocks={listItems}\n type={listItemType}\n renderBlock={renderBlock}\n />\n );\n\n // 이미 처리된 리스트 아이템 건너뛰기 (j는 다음 블록의 인덱스)\n i = j - 1;\n\n return true;\n }\n\n return false;\n };\n\n // 순서대로 각 리스트 타입 처리 시도\n if (handleListItem('bulleted') || handleListItem('numbered')) {\n // 리스트 아이템이 처리되었으므로 다음 블록으로 진행\n continue;\n } else {\n // 리스트 아이템이 아닌 일반 블록 처리\n result.push(<BlockRenderer key={block.id} block={block} />);\n }\n }\n\n return result;\n }, [blocks, renderBlock]);\n\n return (\n <>\n {cover && <Cover src={cover} alt={title || 'Notion page content'} />}\n <article\n className={`${theme} ${container}`}\n aria-label={title || 'Notion page content'}\n >\n {title && <Title title={title} />}\n {renderedBlocks}\n </article>\n </>\n );\n});\n\nRenderer.displayName = 'Renderer';\n\nexport default Renderer;\n","import React, { memo } from 'react';\nimport { List, ListItem } from './List';\n\nimport { MemoizedRichText } from '../MemoizedComponents';\nimport {\n BulletedListItemBlock,\n NotionBlock,\n NumberedListItemBlock,\n} from '../../../../types';\n\ninterface RecursiveListItemProps {\n block: BulletedListItemBlock | NumberedListItemBlock;\n renderBlock: (block: NotionBlock, parentBlockId?: string) => React.ReactNode;\n}\n\n// 리스트 아이템을 렌더링하는 컴포넌트 (중첩 리스트 지원)\nconst RecursiveListItem = memo(({ block, renderBlock }: RecursiveListItemProps) => {\n let content:\n | BulletedListItemBlock['bulleted_list_item']\n | NumberedListItemBlock['numbered_list_item'];\n\n if (block.type === 'bulleted_list_item') {\n content = block.bulleted_list_item;\n } else {\n // block.type이 'numbered_list_item'이라고 가정 (props 타입에 의해 보장됨)\n content = (block as NumberedListItemBlock).numbered_list_item;\n }\n\n const richTexts = content.rich_text;\n\n const renderedChildren: JSX.Element[] = [];\n const children: NotionBlock[] = block.children ?? [];\n\n if (children.length > 0) {\n let i = 0;\n while (i < children.length) {\n const currentChild = children[i];\n if (!currentChild) {\n i++;\n continue;\n }\n\n if (\n currentChild.type === 'bulleted_list_item' ||\n currentChild.type === 'numbered_list_item'\n ) {\n const groupType = currentChild.type;\n const currentGroup: (BulletedListItemBlock | NumberedListItemBlock)[] =\n [currentChild as BulletedListItemBlock | NumberedListItemBlock];\n let j = i + 1;\n while (j < children.length) {\n const nextChildInGroup = children[j];\n if (!nextChildInGroup) {\n // 타입스크립트 만족용 null 체크\n break;\n }\n if (nextChildInGroup.type === groupType) {\n currentGroup.push(\n nextChildInGroup as BulletedListItemBlock | NumberedListItemBlock\n );\n j++;\n } else {\n break; // 다른 타입 만나면 그룹 종료\n }\n }\n renderedChildren.push(\n <ListGroup\n key={`${currentChild.id}-group`}\n blocks={currentGroup}\n type={groupType} // 그룹의 실제 타입 전달\n renderBlock={renderBlock}\n />\n );\n i = j; // 다음 순회 시작 위치 업데이트\n } else {\n // 리스트 아이템이 아닌 블록은 renderBlock으로 직접 렌더링\n renderedChildren.push(\n <div key={currentChild.id}>{renderBlock(currentChild, block.id)}</div>\n );\n i++; // 다음 자식으로 이동\n }\n }\n }\n\n return (\n <ListItem>\n <MemoizedRichText richTexts={richTexts} />\n {renderedChildren.length > 0 && renderedChildren}\n </ListItem>\n );\n});\n\nRecursiveListItem.displayName = 'RecursiveListItem';\n\ninterface ListGroupProps {\n blocks: (BulletedListItemBlock | NumberedListItemBlock)[];\n type: 'bulleted_list_item' | 'numbered_list_item';\n renderBlock: (block: NotionBlock, parentBlockId?: string) => React.ReactNode;\n}\n\nexport const ListGroup = memo(({ blocks, type, renderBlock }: ListGroupProps) => {\n if (blocks.length === 0) return null;\n\n return (\n <List\n as={type === 'numbered_list_item' ? 'ol' : 'ul'}\n type={type}\n role=\"list\"\n aria-label={type}\n >\n {blocks.map((block) => (\n <RecursiveListItem\n key={block.id}\n block={block}\n renderBlock={renderBlock}\n />\n ))}\n </List>\n );\n});\n\nListGroup.displayName = 'ListGroup';\n","import { PropsWithChildren, HTMLAttributes, memo } from 'react';\nimport { list, listItem } from './styles.css';\n\ninterface ListProps\n extends HTMLAttributes<HTMLUListElement | HTMLOListElement> {\n as?: 'ul' | 'ol';\n type: 'bulleted_list_item' | 'numbered_list_item';\n}\n\nexport const List = memo(({\n as: Component = 'ul',\n type,\n children,\n ...props\n}: PropsWithChildren<ListProps>) => {\n return (\n <Component className={list({ type })} {...props}>\n {children}\n </Component>\n );\n});\n\nList.displayName = 'List';\n\nexport const ListItem = memo(({\n children,\n ...props\n}: PropsWithChildren<HTMLAttributes<HTMLLIElement>>) => {\n return (\n <li className={listItem} {...props}>\n {children}\n </li>\n );\n});\n\nListItem.displayName = 'ListItem';\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/List/styles.css.ts.vanilla.css?source=LnN0eWxlc19saXN0X19lczh2aW0wIHsKICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLXhzX19zcTNqa2IxOCkgdmFyKC0tc3BhY2luZy14eHNfX3NxM2prYjE3KTsKICBwYWRkaW5nLWxlZnQ6IHZhcigtLXNwYWNpbmctbGdfX3NxM2prYjFjKTsKICBjb2xvcjogdmFyKC0tY29sb3JzLXRleHRfX3NxM2prYjEpOwp9Ci5zdHlsZXNfbGlzdF90eXBlX2J1bGxldGVkX2xpc3RfaXRlbV9fZXM4dmltMSB7CiAgbGlzdC1zdHlsZS10eXBlOiBkaXNjOwp9Ci5zdHlsZXNfbGlzdF90eXBlX251bWJlcmVkX2xpc3RfaXRlbV9fZXM4dmltMiB7CiAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwp9Ci5zdHlsZXNfbGlzdEl0ZW1fX2VzOHZpbTMgewogIHBhZGRpbmc6IHZhcigtLXNwYWNpbmcteHhzX19zcTNqa2IxNykgMDsKfQ';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var list = _7a468({defaultClassName:'styles_list__es8vim0',variantClassNames:{type:{bulleted_list_item:'styles_list_type_bulleted_list_item__es8vim1',numbered_list_item:'styles_list_type_numbered_list_item__es8vim2'}},defaultVariants:{},compoundVariants:[]});\nexport var listItem = 'styles_listItem__es8vim3';","import { memo } from 'react';\nimport RichText, { RichTextItem, RichTextProps } from './RichText/RichTexts';\nimport { Image, ImageProps } from './Image';\nimport Bookmark, { type Props as BookmarkProps } from './Bookmark/Bookmark';\n\nimport LinkPreview, { type LinkPreviewProps } from './LinkPreview/LinkPreview';\n\n/**\n * RichTextItem 배열의 얕은 비교\n * JSON.stringify보다 효율적인 O(n) 비교\n */\nconst areRichTextsEqual = (\n prev: RichTextItem[] | undefined,\n next: RichTextItem[] | undefined\n): boolean => {\n if (prev === next) return true;\n if (!prev || !next) return prev === next;\n if (prev.length !== next.length) return false;\n\n return prev.every(\n (item, i) =>\n item.plain_text === next[i]?.plain_text &&\n item.href === next[i]?.href &&\n item.annotations?.bold === next[i]?.annotations?.bold &&\n item.annotations?.italic === next[i]?.annotations?.italic &&\n item.annotations?.code === next[i]?.annotations?.code &&\n item.annotations?.color === next[i]?.annotations?.color\n );\n};\n\nexport const MemoizedRichText = memo<RichTextProps>(RichText, (prev, next) => {\n return areRichTextsEqual(prev.richTexts, next.richTexts);\n});\n\nexport const MemoizedImage = memo<ImageProps>(Image, (prev, next) => {\n return (\n prev.src === next.src &&\n prev.alt === next.alt &&\n areRichTextsEqual(prev.caption, next.caption)\n );\n});\n\nexport const MemoizedBookmark = memo<BookmarkProps>(Bookmark, (prev, next) => {\n return prev.url === next.url;\n});\n\nexport const MemoizedLinkPreview = memo<LinkPreviewProps>(\n LinkPreview,\n (prev, next) => {\n return prev.url === next.url;\n }\n);\n\n// 타입 가드 유틸리티\nexport const isRichTextArray = (value: unknown): value is RichTextItem[] => {\n if (!Array.isArray(value)) return false;\n return value.every(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n item.type === 'text'\n );\n};\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/RichText/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA5WWwXKbMBCG734KHZuDPHHdTBxyy6EPkOlMj4xACygIiSzChHb67h0kyw4Go3DyjPbf75d2WVnbxvQSmhhFWvyCDxMnWvLYYAtxnPFsb7od-bshJNPK0A5EXpiIDJrnzb_N9jpZGCZFOkr_fkm36og40Wx-Y1CUYArUbV6MMHuLMfBhKIdUIzNCq4hIoYCe9LPEVnHAQTWi_ZinncWzqFTzMeXBUhKWljnqVvGIHBl-ozTVUmNDBz0VauC9nDVx3Lzv38rkcPe8IaRmnAuVR-R-u4OK3G_3D1ANgUQjB6TIuGgbz3WLr3aNNpVH7cCyRh1yCaavdY6sLno6RH_bIK2Ai_aSvbtkZ6wSsr-R_dMG7al8bnNJbcQfGI5xOB3A1uB2QTzh0RK4aGrJ-oi4IE2kTsshcAQ0ImWSMilyFZFKcC5vdUdqjHNkvW_Po23P3EaUHvpNndht5OlugZqg7pTHHkLYk9px2RJXI1P5-XN6CoG93JGTJXIPUurOk1mI7OWOnC6RcwQ41yIJl9iqHZcv1lheBisNltiKHRWWqHWLtTxzeYjr5Y6cLZKFKj0XglwrdtR8iYrAPTQLQa3WMYvljrE-Tj7dQI6fX91eNDQpyeQSE-GhmfoWK3ynDGf89oWpmjqLFc4zEGddfmHsptZvK6xnIM5ahudy6lyuavM1wxlXwcGd-so1bb5GOFv1hcmeGlcrjGcgzloHR39qrNYYXyOcbR26G6aueoXrNcGZvt8yrWoru_dWdfgNNv-Ekp_uyvfP15pQBaAwz4HHGCGdRk4TBFZGxP7QYWWI6CNgJnVHO2T1OHjZAFS16V_9yU47QbuTYvRiamqWCpVTmZ_fR_bf8D8Eymk_JwsAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var emptyRichText = 'styles_emptyRichText__fdf3twr';\nexport var link = 'styles_link__fdf3twq';\nexport var richText = _7a468({defaultClassName:'styles__fdf3tw0',variantClassNames:{bold:{true:'styles_richText_bold_true__fdf3tw1'},italic:{true:'styles_richText_italic_true__fdf3tw2'},strikethrough:{true:'styles_richText_strikethrough_true__fdf3tw3'},underline:{true:'styles_richText_underline_true__fdf3tw4'},code:{true:'styles_richText_code_true__fdf3tw5'},color:{'default':'styles_richText_color_default__fdf3tw6',gray:'styles_richText_color_gray__fdf3tw7',brown:'styles_richText_color_brown__fdf3tw8',orange:'styles_richText_color_orange__fdf3tw9',yellow:'styles_richText_color_yellow__fdf3twa',green:'styles_richText_color_green__fdf3twb',blue:'styles_richText_color_blue__fdf3twc',purple:'styles_richText_color_purple__fdf3twd',pink:'styles_richText_color_pink__fdf3twe',red:'styles_richText_color_red__fdf3twf',gray_background:'styles_richText_color_gray_background__fdf3twg',brown_background:'styles_richText_color_brown_background__fdf3twh',orange_background:'styles_richText_color_orange_background__fdf3twi',yellow_background:'styles_richText_color_yellow_background__fdf3twj',green_background:'styles_richText_color_green_background__fdf3twk',blue_background:'styles_richText_color_blue_background__fdf3twl',purple_background:'styles_richText_color_purple_background__fdf3twm',pink_background:'styles_richText_color_pink_background__fdf3twn',red_background:'styles_richText_color_red_background__fdf3two'}},defaultVariants:{},compoundVariants:[[{strikethrough:true,underline:true},'styles_richText_compound_0__fdf3twp']]});","import { ReactNode } from 'react';\nimport { richText, link, emptyRichText } from './styles.css';\n\n// 지원하는 Notion 색상 타입 정의\ntype NotionColor =\n | 'default'\n | 'gray'\n | 'brown'\n | 'orange'\n | 'yellow'\n | 'green'\n | 'blue'\n | 'purple'\n | 'pink'\n | 'red'\n | 'gray_background'\n | 'brown_background'\n | 'orange_background'\n | 'yellow_background'\n | 'green_background'\n | 'blue_background'\n | 'purple_background'\n | 'pink_background'\n | 'red_background';\n\n// 모듈 스코프로 이동 - 매 렌더마다 배열 재생성 방지\nconst NOTION_COLORS: NotionColor[] = [\n 'default',\n 'gray',\n 'brown',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'purple',\n 'pink',\n 'red',\n 'gray_background',\n 'brown_background',\n 'orange_background',\n 'yellow_background',\n 'green_background',\n 'blue_background',\n 'purple_background',\n 'pink_background',\n 'red_background',\n] as const;\n\n// 타입 가드 함수\nconst isNotionColor = (color: string): color is NotionColor => {\n return NOTION_COLORS.includes(color as NotionColor);\n};\n\nexport interface RichTextItem {\n type: 'text' | 'mention' | string;\n annotations: {\n bold: boolean;\n italic: boolean;\n strikethrough: boolean;\n underline: boolean;\n code: boolean;\n color: string;\n };\n bold: boolean;\n italic: boolean;\n strikethrough: boolean;\n underline: boolean;\n code: boolean;\n color: string;\n plain_text: string;\n href: string | null;\n\n text?: {\n content: string;\n link: {\n url: string | null;\n } | null;\n };\n}\n\n/**\n * 링크 컴포넌트를 생성하는 함수\n */\nconst renderLink = (href: string, content: ReactNode) => (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={link}>\n {content}\n </a>\n);\n\nexport interface RichTextProps {\n richTexts: RichTextItem[];\n}\n\nconst EmptyRichText = () => <div className={emptyRichText} />;\n\nconst RichTexts = ({ richTexts }: RichTextProps) => {\n if (richTexts.length === 0) {\n return <EmptyRichText />;\n }\n\n return (\n <>\n {richTexts.map((text, index) => {\n const { bold, italic, strikethrough, underline, code, color } =\n text.annotations;\n\n // 컨텐츠 렌더링 로직\n let content: React.ReactNode;\n\n // TODO: Refactor\n switch (text.type) {\n case 'text': {\n if (text.text) {\n const { text: textData } = text;\n\n content = textData.link?.url\n ? renderLink(textData.link.url, textData.content)\n : textData.content;\n } else {\n content = text.plain_text;\n }\n break;\n }\n\n case 'mention': {\n content = text.href\n ? renderLink(text.href, text.plain_text)\n : text.plain_text;\n break;\n }\n\n default: {\n content = text.plain_text;\n }\n }\n\n // NOTION COLOR 적용\n // 타입 가드를 사용하여 지원하는 색상인지 검증\n const safeColor = isNotionColor(color) ? color : undefined;\n\n return (\n <span\n key={index}\n className={richText({\n bold,\n italic,\n strikethrough,\n underline,\n code,\n color: safeColor,\n })}\n >\n {content}\n </span>\n );\n })}\n </>\n );\n};\n\nexport default RichTexts;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Image/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA4VTsW7bMBDd_RVcCtQDDTku2kaZiq6dkqGjcBZP0sUUyfJOjuWi_16QiezYhp1J5JHv8d29pwXLaJEr6qHFn94JkMNYVXfNytVNof7OlAqeSci7UkW0ILTFh5lSL2SkK9WyKD6lbQBjyLWl2kL8rDUHqMm1mvuq4j-r5816eT9XRbq59tFg1BEMDTzdfy0-5pruzQHUzBPEbzE21r-UqiNj0KVaD7ElV6pCwSA-VQxxsDCWqrG4S4X01YYi1q_ya2-HPoPBUus0CfZcqhqdYHyY_Zst3k_jd4QQjrNY3phFDzt9Mo8zqqe0nojuMtHZ-DqktpPyspe19fUmVSSCm972aboyqmKxYoXAWYRfP2MtuiFJnWYnrwixHgyaSuJwELXKot54S7W8jWzA8gH65RRaXIF2wD84YC2PIORPKb5mCsjHOqbzaRJHqhpCan6CfMsQwZ3obObRRpV89nFKVt6wZqy9MxDHKVqr-TFFWny4mdycJu9EM-1xuilj8G2E0I06nT3RHjX3YO0EHObvG-ANWhTvznL1_SxXsGZvB8mWZln5p7HYyNvySnKm_V6TM7jLHn6YmuvqiH9dpuT-htVXCU6chsuc_Qd6kFP2gwQAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var caption = 'styles_caption__2f3ncf7';\nexport var imageContainer = 'styles_imageContainer__2f3ncf0';\nexport var imageStyle = _7a468({defaultClassName:'styles_imageStyle__2f3ncf2',variantClassNames:{loaded:{true:'styles_imageStyle_loaded_true__2f3ncf3',false:'styles_imageStyle_loaded_false__2f3ncf4'},hasAspectRatio:{true:'styles_imageStyle_hasAspectRatio_true__2f3ncf5',false:'styles_imageStyle_hasAspectRatio_false__2f3ncf6'}},defaultVariants:{loaded:false,hasAspectRatio:false},compoundVariants:[]});\nexport var imageWrapper = 'styles_imageWrapper__2f3ncf1';\nexport var skeletonWrapper = _7a468({defaultClassName:'styles_skeletonWrapper__2f3ncf8',variantClassNames:{isLoaded:{true:'styles_skeletonWrapper_isLoaded_true__2f3ncf9',false:'styles_skeletonWrapper_isLoaded_false__2f3ncfa'}},defaultVariants:{isLoaded:false},compoundVariants:[]});","import 'src/components/Skeleton/styles.css.ts.vanilla.css?source=QGtleWZyYW1lcyBzdHlsZXNfc2hpbW1lcl9fYTNnOHE5MCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7CiAgfQp9Ci5zdHlsZXNfc2tlbGV0b25fX2EzZzhxOTEgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBoZWlnaHQ6IDEwMCU7CiAgd2lkdGg6IDEwMCU7CiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKICBib3JkZXItcmFkaXVzOiA0cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KLnN0eWxlc19za2VsZXRvbl9fYTNnOHE5MTo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIiOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgYm90dG9tOiAwOwogIGxlZnQ6IDA7CiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDApIDAsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAyMCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSA2MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMCkpOwogIGFuaW1hdGlvbjogc3R5bGVzX3NoaW1tZXJfX2EzZzhxOTAgLjhzIGluZmluaXRlIGxpbmVhcjsKICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTsKICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Owp9Ci5zdHlsZXNfcmVjdF9fYTNnOHE5MiB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAyMHB4OwogIG1hcmdpbi1ib3R0b206IDhweDsKfQouc3R5bGVzX2NpcmNsZV9fYTNnOHE5MyB7CiAgd2lkdGg6IDUwcHg7CiAgaGVpZ2h0OiA1MHB4OwogIGJvcmRlci1yYWRpdXM6IDUwJTsKfQouc3R5bGVzX2ltYWdlX19hM2c4cTk0IHsKICB3aWR0aDogMTAwJTsKICBib3JkZXItcmFkaXVzOiA4cHg7Cn0';\nexport var circle = 'styles_circle__a3g8q93';\nexport var image = 'styles_image__a3g8q94';\nexport var rect = 'styles_rect__a3g8q92';\nexport var skeleton = 'styles_skeleton__a3g8q91';","import * as styles from './styles.css';\n\ntype SkeletonProps = {\n /**\n * 스켈레톤 형태 - 직사각형, 원형, 이미지 크기\n * @default 'rect'\n */\n variant?: 'rect' | 'circle' | 'image';\n /**\n * 커스텀 너비 (px 또는 %)\n */\n width?: string;\n /**\n * 커스텀 높이 (px 또는 %)\n */\n height?: string;\n /**\n * 추가 CSS 클래스명\n */\n className?: string;\n /**\n * 로딩 상태\n */\n isLoading?: boolean;\n};\n\n/**\n * 콘텐츠 로딩 중에 표시되는 물결 효과가 있는 스켈레톤 컴포넌트입니다.\n * 이미지, 텍스트 등의 로딩 상태를 표시하는 데 사용합니다.\n */\nconst Skeleton = ({\n variant = 'rect',\n width,\n height,\n className,\n isLoading = true,\n}: SkeletonProps) => {\n const getVariantClass = () => {\n switch (variant) {\n case 'circle':\n return styles.circle;\n case 'image':\n return styles.image;\n case 'rect':\n default:\n return styles.rect;\n }\n };\n\n if (!isLoading) {\n return null;\n }\n\n return (\n <div\n className={`${styles.skeleton} ${getVariantClass()} ${className || ''}`}\n style={{\n width: width || undefined,\n height: height || undefined,\n }}\n />\n );\n};\n\nexport default Skeleton;\n","import { useState, useRef, useEffect, useCallback } from 'react';\n\n/**\n * 이미지 로딩 상태를 관리하는 커스텀 훅\n * Cover와 Image 컴포넌트에서 공통으로 사용\n *\n * @param src - 이미지 소스 URL\n * @returns isLoaded, imgRef, handleLoad\n */\nexport const useImageLoad = (src: string) => {\n const [isLoaded, setIsLoaded] = useState(false);\n const imgRef = useRef<HTMLImageElement>(null);\n\n useEffect(() => {\n // src 변경 시 먼저 로딩 상태 리셋\n setIsLoaded(false);\n\n // 브라우저 캐시로 이미 로드된 경우 체크\n const img = imgRef.current;\n if (img && img.complete && img.naturalHeight !== 0) {\n setIsLoaded(true);\n }\n }, [src]);\n\n const handleLoad = useCallback(() => {\n setIsLoaded(true);\n }, []);\n\n return { isLoaded, imgRef, handleLoad };\n};\n","import { MemoizedRichText } from '../MemoizedComponents';\nimport {\n imageContainer,\n imageWrapper,\n imageStyle,\n caption,\n skeletonWrapper,\n} from './styles.css';\nimport { RichTextItem } from '../RichText/RichTexts';\nimport Skeleton from '../../../Skeleton';\nimport { useImageLoad } from '../../../../hooks/useImageLoad';\n\nexport interface ImageFormat {\n block_width?: number;\n block_height?: number;\n block_aspect_ratio?: number;\n}\n\nconst MAX_WIDTH = 720;\n\n// 이미지 태그에 사용되는 aspectRatio 스타일\nconst getImageTagStyle = (format?: ImageFormat) => {\n return format?.block_aspect_ratio\n ? { aspectRatio: `${format.block_aspect_ratio}` }\n : undefined;\n};\n\nexport interface Props {\n src: string;\n alt: string;\n caption?: RichTextItem[];\n priority?: boolean;\n format?: ImageFormat;\n isColumn?: boolean;\n}\n\nconst Image = ({\n src,\n alt,\n caption: imageCaption,\n format,\n isColumn = false,\n}: Props) => {\n const { isLoaded, imgRef, handleLoad } = useImageLoad(src);\n\n return (\n <div className={imageContainer}>\n <div className={imageWrapper} style={getImageStyles(format, isColumn)}>\n <div className={skeletonWrapper({ isLoaded })}>\n <Skeleton variant=\"image\" isLoading={!isLoaded} />\n </div>\n <img\n ref={imgRef}\n className={imageStyle({\n loaded: isLoaded,\n hasAspectRatio: !!format?.block_aspect_ratio,\n })}\n src={src}\n alt={alt}\n loading=\"lazy\"\n onLoad={handleLoad}\n width={format?.block_width}\n height={format?.block_height}\n style={getImageTagStyle(format)}\n />\n </div>\n {imageCaption && imageCaption.length > 0 && (\n <figcaption className={caption}>\n <MemoizedRichText richTexts={imageCaption} />\n </figcaption>\n )}\n </div>\n );\n};\n\nexport default Image;\n\n// 이미지 스타일 유틸리티 함수\nconst getImageStyles = (format?: ImageFormat, isColumn: boolean = false) => {\n // width 계산 로직\n const getWidthStyle = () => {\n if (\n !isColumn &&\n format?.block_aspect_ratio &&\n format.block_aspect_ratio < 1\n ) {\n return `${format.block_aspect_ratio * 100}%`;\n }\n\n if (format?.block_width) {\n return format.block_width > MAX_WIDTH\n ? '100%'\n : `${format.block_width}px`;\n }\n\n return '100%';\n };\n\n // aspectRatio 계산 로직\n const getAspectRatioStyle = () => {\n return format?.block_aspect_ratio ? `${format.block_aspect_ratio}` : 'auto';\n };\n\n return {\n width: getWidthStyle(),\n aspectRatio: getAspectRatioStyle(),\n };\n};\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Bookmark/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA71WPW_bMBDd_Su4FIgHGpLito6yFOjUpUNboKNBiSfrYopkSNqyUuS_F6S-EztJi6KTwfvi47t3J6-sawTYrUC5327vzf2mKSLya0GIg5OjHHJlmEMlUyKVhNsFIRytFqxJSSZUvvcWzThHuaNO6ZQcmbmi1GqWe9PJbrf2_vpun8Wb5TQ2U86p6pXwx8Wqw5czw3t8ccA3wCgEnHzlTBkOJiWxPhGrBPKudq6EMpa27r78ejmmUMM4HmyPpTV-CzZa8QFQEVLUEUwhVJ2SEjkH6W3OMGmxZSlTJ2pLxlVNolViCTAbWKvYiZaAu9KlZGOguvi4tPRXhCeOtQaewmkGaz_nSUkH0vXVklCn4_wp2RmzMJRhy9tzpPrflKxJTOJNpAcT5Wggb1-cK3GoAg93B-uwaGgHIiX-JqAZuBpapp6zN0LXBo4I9WclHUPpW9W-4fp8u1tk8RQZE7iTFB1UNiU5SAfmLKzR9bwrb8L4pWI76PGtA74auStTEkfRO1-kL9qfVXYHuaMF-uv9DROjVr14RmCvK9NWQ-9gJgGHTgzg3s8FEP3xCBJSKOmoxQfoI12j1c4wXTbU-77jA8y0dBzT6o6Gs4k_g5NaqDBTYlR0EvLD2KbzGfY7aQgLURXKoYHx6v3FFnb7bHSAEKgtWu-qS3QQCAC_5mrD9JRQDjY3qH2Lelo__Cdaxyx3kRQLuZKcmaYPvV5OFZiskr-kZRg5WkO2R0czFcasPwqUQHPBKp2SZOrwe0sZDLN2BOMwZ2JKqEUHX1k1iPRjYHPWyg7xC1-Wif5v_i2h2mA1oTM5vxkvLJsdex3pbFeMtBTsiPmosc1sr3SEPCUoLGNbGpT7IMOx2sGIH2Fc2mo3odo5BZxV_4vC8FvzyRs-VcCRkauJa51E-rQM175txU9I7v9rPC4efwM4QP1joggAAA';\nexport var card = 'styles_card__qrq8yf1';\nexport var content = 'styles_content__qrq8yf2';\nexport var description = 'styles_description__qrq8yf6';\nexport var favicon = 'styles_favicon__qrq8yf8';\nexport var link = 'styles_link__qrq8yf0';\nexport var previewContainer = 'styles_previewContainer__qrq8yf3';\nexport var previewImage = 'styles_previewImage__qrq8yf4';\nexport var siteName = 'styles_siteName__qrq8yf7';\nexport var title = 'styles_title__qrq8yf5';\nexport var urlText = 'styles_urlText__qrq8yf9';","import {\n link,\n card,\n content,\n previewContainer,\n previewImage,\n title,\n description,\n siteName,\n favicon,\n urlText,\n} from './styles.css';\nimport { OpenGraphData } from './type';\n\nexport interface Props {\n url: string;\n metadata?: OpenGraphData;\n}\n\nconst Bookmark = ({ url, metadata }: Props) => {\n return (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className={link}>\n <div className={card}>\n <div className={content}>\n <div>\n <h4 className={title}>{metadata?.title || url}</h4>\n <p className={description}>{metadata?.description || ''}</p>\n </div>\n <div className={siteName}>\n {metadata?.favicon && (\n <img src={metadata.favicon} alt=\"\" className={favicon} />\n )}\n <span className={urlText}>{metadata?.url || ''}</span>\n </div>\n </div>\n {metadata?.image && (\n <div className={previewContainer}>\n <img\n className={previewImage}\n src={metadata.image}\n alt={metadata.title}\n loading=\"lazy\"\n onError={(e) => {\n // 이미지 로드 실패 시 처리\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n }}\n />\n </div>\n )}\n </div>\n </a>\n );\n};\n\nexport default Bookmark;\n","import { useState, useEffect, memo } from 'react';\nimport * as styles from './styles.css';\n\ninterface RepoData {\n name: string;\n full_name: string;\n owner: {\n avatar_url: string;\n };\n updated_at: string;\n}\n\ninterface FigmaData {\n name: string;\n url: string;\n thumbnailUrl?: string;\n}\n\n// GitHub 레포지토리 데이터를 가져오는 함수\nconst fetchGitHubRepoData = async (\n repoPath: string,\n signal?: AbortSignal\n): Promise<RepoData | null> => {\n try {\n const apiUrl = `https://api.github.com/repos/${repoPath}`;\n const response = await fetch(apiUrl, { signal });\n\n if (!response.ok) {\n throw new Error('Failed to fetch GitHub repo data');\n }\n\n const data = await response.json();\n return data;\n } catch (error) {\n // AbortError는 정상적인 cleanup이므로 무시\n if (error instanceof Error && error.name === 'AbortError') {\n return null;\n }\n console.error('Error fetching GitHub repo data:', error);\n return null;\n }\n};\n\n// Figma 파일 정보 추출 함수\nconst extractFigmaData = (url: string): FigmaData | null => {\n try {\n const parsedUrl = new URL(url);\n if (parsedUrl.hostname.includes('figma.com')) {\n // URL에서 파일 이름 추출\n const pathSegments = parsedUrl.pathname.split('/');\n const fileSegment = pathSegments.find((segment) =>\n segment.includes('file')\n );\n\n if (!fileSegment) return null;\n\n // URL 경로에서 파일 이름 추출 (/file/ID/NAME 형식)\n let fileName = '';\n if (pathSegments.length > 3) {\n const encodedName = pathSegments[3];\n if (encodedName) {\n fileName = decodeURIComponent(encodedName).replace(/-/g, ' ');\n }\n }\n\n // 파일 이름이 추출되지 않았으면 URL에서 직접 찾기\n if (!fileName && parsedUrl.pathname.includes('-')) {\n const nameMatch = parsedUrl.pathname.match(/\\/([^/]+)(?:\\?|$)/);\n if (nameMatch?.[1]) {\n fileName = decodeURIComponent(nameMatch[1].replace(/-/g, ' '));\n }\n }\n\n fileName = fileName || 'Figma Design';\n\n return {\n name: fileName,\n url: url,\n thumbnailUrl: 'https://static.figma.com/app/icon/1/favicon.svg',\n };\n }\n return null;\n } catch (error) {\n console.error('Error parsing Figma URL:', error);\n return null;\n }\n};\n\n// GitHub URL에서 레포지토리 경로 추출\nconst extractRepoPathFromUrl = (url: string): string | null => {\n try {\n const parsedUrl = new URL(url);\n if (parsedUrl.hostname === 'github.com') {\n // URL 경로에서 첫 번째 '/'를 제거하고 나머지 경로 반환\n const path = parsedUrl.pathname.substring(1);\n // 레포지토리 경로는 일반적으로 'username/repo-name' 형식\n const pathParts = path.split('/');\n if (pathParts.length >= 2) {\n return `${pathParts[0]}/${pathParts[1]}`;\n }\n }\n return null;\n } catch (error) {\n console.error('Error parsing URL:', error);\n return null;\n }\n};\n\n// URL이 어떤 타입의 링크인지 확인\nconst getLinkType = (url: string): 'github' | 'figma' | 'unknown' => {\n try {\n const parsedUrl = new URL(url);\n if (parsedUrl.hostname === 'github.com') {\n return 'github';\n } else if (parsedUrl.hostname.includes('figma.com')) {\n return 'figma';\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n};\n\n// 월 이름 배열을 모듈 스코프로 이동 - 매 호출마다 재생성 방지\nconst MONTH_NAMES = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n] as const;\n\n// 날짜 포맷팅 함수\nconst formatUpdatedTime = (dateString: string): string => {\n const date = new Date(dateString);\n const now = new Date();\n const diffInHours = Math.floor(\n (now.getTime() - date.getTime()) / (1000 * 60 * 60)\n );\n\n if (diffInHours < 24) {\n return `Updated ${diffInHours} hours ago`;\n }\n\n const diffInDays = Math.floor(diffInHours / 24);\n if (diffInDays === 1) {\n return 'Updated yesterday';\n }\n if (diffInDays < 30) {\n return `Updated ${diffInDays} days ago`;\n }\n\n return `Updated on ${MONTH_NAMES[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;\n};\n\n// ============ 서브 컴포넌트 ============\n\ninterface FigmaPreviewProps {\n data: FigmaData;\n}\n\nconst FigmaPreview = memo(({ data }: FigmaPreviewProps) => (\n <div className={styles.preview}>\n <div className={styles.iconContainer}>\n <img\n src={data.thumbnailUrl || 'https://static.figma.com/app/icon/1/favicon.svg'}\n alt=\"Figma icon\"\n className={styles.icon}\n />\n </div>\n <div className={styles.content}>\n <div className={styles.title}>{data.name}</div>\n <div className={styles.description}>www.figma.com</div>\n </div>\n </div>\n));\n\nFigmaPreview.displayName = 'FigmaPreview';\n\ninterface GitHubPreviewProps {\n repoData: RepoData | null;\n repoName: string;\n updatedTimeText: string;\n loading: boolean;\n}\n\nconst GitHubPreview = memo(({ repoData, repoName, updatedTimeText, loading }: GitHubPreviewProps) => (\n <div className={`${styles.preview} ${styles.githubPreview}`}>\n <div className={styles.iconContainer}>\n <img\n src={\n repoData?.owner?.avatar_url ||\n 'https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png'\n }\n alt=\"Repository icon\"\n className={styles.icon}\n />\n </div>\n <div className={`${styles.content} ${styles.githubContent}`}>\n <div className={styles.title}>{repoName}</div>\n <div className={styles.description}>\n {loading ? 'Loading...' : `${repoName} • ${updatedTimeText}`}\n </div>\n </div>\n </div>\n));\n\nGitHubPreview.displayName = 'GitHubPreview';\n\ninterface DefaultPreviewProps {\n url: string;\n}\n\nconst DefaultPreview = memo(({ url }: DefaultPreviewProps) => (\n <div className={styles.preview}>\n <div className={styles.content}>\n <div className={styles.title}>{url}</div>\n </div>\n </div>\n));\n\nDefaultPreview.displayName = 'DefaultPreview';\n\n// ============ 메인 컴포넌트 ============\n\nexport interface LinkPreviewProps {\n url: string;\n}\n\nconst LinkPreview = ({ url }: LinkPreviewProps) => {\n const [repoData, setRepoData] = useState<RepoData | null>(null);\n const [figmaData, setFigmaData] = useState<FigmaData | null>(null);\n const [loading, setLoading] = useState(true);\n const [linkType, setLinkType] = useState<'github' | 'figma' | 'unknown'>(\n 'unknown'\n );\n\n useEffect(() => {\n const abortController = new AbortController();\n\n const loadLinkData = async () => {\n setLoading(true);\n const type = getLinkType(url);\n setLinkType(type);\n\n if (type === 'github') {\n const repoPath = extractRepoPathFromUrl(url);\n if (repoPath) {\n const data = await fetchGitHubRepoData(repoPath, abortController.signal);\n // 취소된 요청이면 state 업데이트 하지 않음\n if (!abortController.signal.aborted) {\n setRepoData(data);\n }\n }\n } else if (type === 'figma') {\n const data = extractFigmaData(url);\n if (!abortController.signal.aborted) {\n setFigmaData(data);\n }\n }\n\n if (!abortController.signal.aborted) {\n setLoading(false);\n }\n };\n\n loadLinkData();\n\n // Cleanup: 컴포넌트 언마운트 또는 url 변경 시 요청 취소\n return () => {\n abortController.abort();\n };\n }, [url]);\n\n // 레포지토리 이름 추출 (full_name에서 organization/repo 형식)\n const repoName =\n repoData?.name ||\n extractRepoPathFromUrl(url)?.split('/')[1] ||\n 'Repository';\n\n // 업데이트 시간 포맷팅\n const updatedTimeText = repoData?.updated_at\n ? formatUpdatedTime(repoData.updated_at)\n : '';\n\n const renderPreview = () => {\n if (linkType === 'figma' && figmaData) {\n return <FigmaPreview data={figmaData} />;\n }\n if (linkType === 'github') {\n return (\n <GitHubPreview\n repoData={repoData}\n repoName={repoName}\n updatedTimeText={updatedTimeText}\n loading={loading}\n />\n );\n }\n return <DefaultPreview url={url} />;\n };\n\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.link}\n >\n {renderPreview()}\n </a>\n );\n};\n\nexport default LinkPreview;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/LinkPreview/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7WUwZLaMAyG7_sUvnSmezBDgO120uO-QKc99Mg4sUIEjpXagoTt9N07djAku9By6SkTyZY-_ZY083w04NcG7W69pqxdNtlc_HoQgqFnqaEkpxjJ5sKShS8PQmj0rVHHXBSGyl2wtEprtBvJ1ObioNxHKX2rymDqe79e-5_L7a7Inh_HhwtipuZf538_zE6ErYMDQpcgswh5ZqkM9CF6QU6Dy0XW9sKTQX2KX5Ih5-XgThlWj5cr0imNe594BuO3aJONPjNV8QodwFWGulzUqDXYYGOnrMdBqoJ66WulqRPz2cILUD5KpwxurESGxueiBMvgRpK81aJQHs6JVUy8Ue8UHsEVfxUsrwN2lO3Cd44W_yal7ibRSrIMllO0xXX5wzcXmciE2jMli9TooBykKcnsG3tdxEs2LMm-kGWFNjzXkHN5PecNUbd7z1gd5Ql87OpQc52LxezJQRMMNeCm5rElYvvaod3lYv4WLRGtItEpXDaffxgHS_9UbKFkWWFgGGq6r-18c34LmLwFIxtIDE-RoSLL0uMrpEh8bGnjVFsfZfB9x1eYNNQh9lO81p2Ar178EZ3SQ4MFmUt3LOL9OFb5dMbC4jgfuz0uYb1cHGAMth59fJ4aGWJ_Q9g6nVPtuHoNvnTYhnZKGny6X4PLfuGbFXgoyWrljuno8j-UsUGu98XX6ZA-x0Ia1cvURatTQ6a1aaDiu1fAkONlOrqfY4534xFBZQHcQZzFPykHOzkaBgAA';\nexport var content = 'styles_content__o1p3m12';\nexport var description = 'styles_description__o1p3m16';\nexport var githubContent = 'styles_githubContent__o1p3m18';\nexport var githubPreview = 'styles_githubPreview__o1p3m17';\nexport var icon = 'styles_icon__o1p3m14';\nexport var iconContainer = 'styles_iconContainer__o1p3m13';\nexport var link = 'styles_link__o1p3m10';\nexport var preview = 'styles_preview__o1p3m11';\nexport var title = 'styles_title__o1p3m15';","import { memo } from 'react';\nimport {\n MemoizedRichText,\n MemoizedImage,\n MemoizedBookmark,\n MemoizedLinkPreview,\n} from '../MemoizedComponents';\nimport { CodeBlock } from '../Code';\nimport { Heading1, Heading2, Heading3, Paragraph } from '../Typography';\nimport { ColumnList } from '../Column';\nimport { Quote } from '../Quote';\nimport Table from '../Table';\nimport { Toggle } from '../Toggle';\nimport { Video } from '../Video';\nimport { NotionBlock } from '../../../../types';\n\nexport interface Props {\n block: NotionBlock;\n isColumn?: boolean;\n}\n\nconst BlockRenderer = memo(({ block, isColumn = false }: Props) => {\n if (!block) return null;\n\n switch (block.type) {\n case 'link_preview':\n return <MemoizedLinkPreview url={block.link_preview.url} />;\n case 'paragraph':\n return (\n <Paragraph>\n <MemoizedRichText richTexts={block.paragraph.rich_text} />\n </Paragraph>\n );\n\n case 'heading_1':\n return (\n <Heading1>\n <MemoizedRichText richTexts={block.heading_1.rich_text} />\n </Heading1>\n );\n\n case 'heading_2':\n return (\n <Heading2>\n <MemoizedRichText richTexts={block.heading_2.rich_text} />\n </Heading2>\n );\n\n case 'heading_3':\n return (\n <Heading3>\n <MemoizedRichText richTexts={block.heading_3.rich_text} />\n </Heading3>\n );\n\n case 'code':\n return (\n <div>\n <CodeBlock\n code={block.code.rich_text[0]?.text?.content || ''}\n language={block.code.language}\n caption={block.code.caption}\n />\n </div>\n );\n\n case 'image':\n return (\n <figure>\n <MemoizedImage\n src={block.image.file?.url || block.image.external?.url || ''}\n alt={block.image.caption?.[0]?.plain_text || ''}\n caption={block.image.caption}\n format={block.image.format}\n isColumn={isColumn}\n />\n </figure>\n );\n\n case 'bookmark':\n return (\n <MemoizedBookmark\n url={block.bookmark.url}\n metadata={block.bookmark.metadata}\n />\n );\n\n case 'column_list':\n return <ColumnList block={block} />;\n\n case 'column':\n // 개별 column은 ColumnList에서 처리됩니다\n return null;\n\n case 'quote':\n return <Quote richTexts={block.quote.rich_text} />;\n\n case 'table':\n return <Table block={block} />;\n\n case 'toggle':\n return <Toggle block={block} />;\n\n case 'video':\n return <Video block={block} />;\n\n default:\n return null;\n }\n});\n\nBlockRenderer.displayName = 'BlockRenderer';\n\nexport default BlockRenderer;\n","import { ReactNode, useMemo, memo } from 'react';\nimport { codeBlock } from './styles.css';\nimport Prism, { Grammar, Token } from 'prismjs';\nimport { MemoizedRichText } from '../MemoizedComponents';\nimport { RichTextItem } from '../RichText/RichTexts';\n\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-jsx';\nimport 'prismjs/components/prism-tsx';\n\nif (typeof window !== 'undefined') {\n window.Prism = Prism;\n}\n\nconst renderToken = (token: string | Token, i: number): ReactNode => {\n if (typeof token === 'string') {\n return <span key={i}>{token}</span>;\n }\n\n const content = token.content;\n let tokenContent: ReactNode;\n\n if (Array.isArray(content)) {\n tokenContent = content.map((subToken, j) => renderToken(subToken, j));\n } else if (typeof content === 'object' && content !== null) {\n tokenContent = renderToken(content as Token, 0);\n } else {\n tokenContent = content;\n }\n\n return (\n <span key={i} className={`token ${token.type}`}>\n {tokenContent}\n </span>\n );\n};\n\nexport interface Props {\n code: string;\n language: string;\n caption?: RichTextItem[];\n}\n\nconst CodeBlock = memo(({ code, language, caption }: Props) => {\n const tokens = useMemo(() => {\n const prismLanguage =\n Prism.languages[language] || Prism.languages.plaintext;\n return Prism.tokenize(code, prismLanguage as Grammar);\n }, [code, language]);\n\n return (\n <>\n <pre className={`${codeBlock} language-${language}`}>\n <code className={`language-${language}`}>\n {tokens.map((token, i) => renderToken(token, i))}\n </code>\n </pre>\n {caption && caption.length > 0 && (\n <figcaption>\n <MemoizedRichText richTexts={caption} />\n </figcaption>\n )}\n </>\n );\n});\n\nCodeBlock.displayName = 'CodeBlock';\n\nexport default CodeBlock;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Code/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb2RlQmxvY2tfXzFxbjQyeWMwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvcnMtY29kZS1iYWNrZ3JvdW5kX19zcTNqa2I1KTsKICBjb2xvcjogdmFyKC0tY29sb3JzLWNvZGUtdGV4dF9fc3EzamtiNik7CiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy1tZF9fc3EzamtiMWIpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclJhZGl1cy1tZF9fc3EzamtiMWYpOwogIG92ZXJmbG93OiBhdXRvOwogIGZvbnQtZmFtaWx5OiB2YXIoLS10eXBvZ3JhcGh5LWZvbnRGYW1pbHktY29kZV9fc3Ezamticyk7CiAgbGluZS1oZWlnaHQ6IHZhcigtLXR5cG9ncmFwaHktbGluZUhlaWdodC1yZWxheGVkX19zcTNqa2IxNik7CiAgbWFyZ2luOiB2YXIoLS1zcGFjaW5nLXNtX19zcTNqa2IxOSkgMDsKfQ';\nexport var codeBlock = 'styles_codeBlock__1qn42yc0';","import { HTMLAttributes, PropsWithChildren, memo } from 'react';\nimport { paragraph, heading1, heading2, heading3 } from './styles.css';\n\ntype TypographyProps = PropsWithChildren<HTMLAttributes<HTMLElement>>;\n\nexport const Paragraph = memo(({ children, ...props }: TypographyProps) => {\n return (\n <p className={paragraph} {...props}>\n {children}\n </p>\n );\n});\n\nParagraph.displayName = 'Paragraph';\n\nexport const Heading1 = memo(({ children, ...props }: TypographyProps) => {\n return (\n <h1 className={heading1} {...props}>\n {children}\n </h1>\n );\n});\n\nHeading1.displayName = 'Heading1';\n\nexport const Heading2 = memo(({ children, ...props }: TypographyProps) => {\n return (\n <h2 className={heading2} {...props}>\n {children}\n </h2>\n );\n});\n\nHeading2.displayName = 'Heading2';\n\nexport const Heading3 = memo(({ children, ...props }: TypographyProps) => {\n return (\n <h3 className={heading3} {...props}>\n {children}\n </h3>\n );\n});\n\nHeading3.displayName = 'Heading3';\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Typography/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA82VvW6DMBSFd57CYxkc8aOoDXmBzu3QERl8AbcGu7aTQKq-e4VTk5A0qB1SMeLj43t8PksstOk46FQSRUpFZJWmq4CslmWAPjyEcsGFStCWqDuM7YfGBlqTpvo9fn3LQn_tIcRZA7gCVlbG7TWdFPa8DvfqoxVxRjQM1qX1SkIpa0rn05LkrClxq4d9D_65diLe20MK0Ris2R5-GN9rz2wPo-Hbo213LXevvhxyN0LVhA9DA-veVcyADQUJkgrwThG59j69xdVOk0LkG423TLOMg21YbExfUIIi2SItOKPjtqViNVGdmx3Z0d8mLIpCg7HefjkTioLCilC20e5Gh8Unu4Z1PVwC_NOsFZAeQ-iihv-E_1fkqtC52r9xywSnw8B48r0d6VIfBWdqfTwlm65t9oQjFzWaFeHIubpbEeblsC-_JHxS22q6ttkTjl3UeFaEY-fa34rwKBq5ZDz6p0wWNzvGXy21e5-nBwAA';\nexport var heading1 = 'styles_heading1__90a95g1';\nexport var heading2 = 'styles_heading2__90a95g2';\nexport var heading3 = 'styles_heading3__90a95g3';\nexport var paragraph = 'styles_paragraph__90a95g0';","import { memo } from 'react';\nimport { ColumnBlock } from '../../../../types';\nimport BlockRenderer from '../Block/BlockRenderer';\nimport { columnContainer } from './styles.css';\n\nexport interface ColumnProps {\n block: ColumnBlock;\n}\n\nconst Column = memo(({ block }: ColumnProps) => {\n if (!block || !block.children) return null;\n\n return (\n <div className={columnContainer}>\n {block.children.map((childBlock) => (\n <BlockRenderer key={childBlock.id} block={childBlock} isColumn />\n ))}\n </div>\n );\n});\n\nColumn.displayName = 'Column';\n\nexport default Column;\n","import 'src/components/Renderer/components/Column/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb2x1bW5Db250YWluZXJfX3dsZTZ3ZTAgewogIGZsZXg6IDE7CiAgbWluLXdpZHRoOiAwOwp9Ci5zdHlsZXNfY29sdW1uTGlzdENvbnRhaW5lcl9fd2xlNndlMSB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogcm93OwogIGdhcDogMXJlbTsKICBtYXJnaW4tYm90dG9tOiAxcmVtOwogIHdpZHRoOiAxMDAlOwp9CkBtZWRpYSAobWF4LXdpZHRoOiA0MjBweCkgewogIC5zdHlsZXNfY29sdW1uTGlzdENvbnRhaW5lcl9fd2xlNndlMSB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIH0KfQ';\nexport var columnContainer = 'styles_columnContainer__wle6we0';\nexport var columnListContainer = 'styles_columnListContainer__wle6we1';","import { memo } from 'react';\nimport Column from './Column';\nimport { columnListContainer } from './styles.css';\nimport { ColumnListBlock } from '../../../../types';\n\nexport interface ColumnListProps {\n block: ColumnListBlock;\n}\n\nconst ColumnList = memo(({ block }: ColumnListProps) => {\n if (!block || !block.children) return null;\n\n return (\n <div className={columnListContainer}>\n {block.children.map((column) => (\n <Column key={column.id} block={column} />\n ))}\n </div>\n );\n});\n\nColumnList.displayName = 'ColumnList';\n\nexport default ColumnList;\n","import { memo } from 'react';\nimport { MemoizedRichText } from '../MemoizedComponents';\nimport { container } from './styles.css';\nimport { RichTextItem } from '../RichText/RichTexts';\n\nexport interface QuoteProps {\n richTexts: RichTextItem[];\n tabIndex?: number;\n}\n\nconst Quote = memo(({ richTexts, tabIndex }: QuoteProps) => {\n return (\n <blockquote className={container} tabIndex={tabIndex}>\n <MemoizedRichText richTexts={richTexts} />\n </blockquote>\n );\n});\n\nQuote.displayName = 'Quote';\n\nexport default Quote;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Quote/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb250YWluZXJfX21yYTluMCB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG1hcmdpbjogdmFyKC0tc3BhY2luZy14c19fc3EzamtiMTgpIDA7CiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy14c19fc3EzamtiMTgpIDAgdmFyKC0tc3BhY2luZy14c19fc3EzamtiMTgpIDFyZW07CiAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZTFlMWUxOwogIGNvbG9yOiB2YXIoLS1jb2xvcnMtdGV4dF9fc3EzamtiMSk7CiAgZm9udC1zaXplOiB2YXIoLS10eXBvZ3JhcGh5LWZvbnRTaXplLWJhc2VfX3NxM2prYnYpOwogIGxpbmUtaGVpZ2h0OiB2YXIoLS10eXBvZ3JhcGh5LWxpbmVIZWlnaHQtYmFzZV9fc3EzamtiMTUpOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQ';\nexport var container = 'styles_container__mra9n0';","import { memo } from 'react';\nimport { tableContainer, table, headerCell } from './styles.css';\nimport TableRow from './TableRow';\nimport { TableBlock } from '../../../../types';\n\ninterface TableProps {\n block: TableBlock;\n}\n\nconst Table = memo(({ block }: TableProps) => {\n if (!block.table || !block.children) {\n return null;\n }\n\n const { table_width, has_column_header, has_row_header } = block.table;\n const rows =\n block.children?.filter((child) => child.type === 'table_row') || [];\n\n return (\n <div className={tableContainer}>\n <table className={table}>\n {rows.length > 0 && (\n <>\n {has_column_header && rows[0] && (\n <thead>\n <TableRow rowBlock={rows[0]} cellClassName={headerCell} />\n </thead>\n )}\n <tbody>\n {/* 유효한 row만 매핑하도록 필터링 추가 */}\n {rows\n .filter((row) => row !== undefined && row.type === 'table_row')\n .map((row, rowIndex: number) => {\n // 열 헤더가 있고 첫 번째 행이면 이미 thead에서 렌더링되었으므로 건너뜁니다\n if (has_column_header && rowIndex === 0) {\n return null;\n }\n\n return (\n <TableRow\n key={row.id}\n rowBlock={row}\n rowHeaderIndex={has_row_header ? 0 : -1}\n />\n );\n })}\n </tbody>\n </>\n )}\n </table>\n </div>\n );\n});\n\nTable.displayName = 'Table';\n\nexport default Table;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Table/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7VSy27bMBC8-ysIFAUSwDQkO86DOebSc3roUaDElbQJxVXJtfwo-u-FZElhkrZBD70Rs7vD2ZldBT5aCBnr3MIDOdbowGdZ6rv8VFIifiyE2KPhWok0ST7fL4RotK_QSaZWiU77CylDqwt0lTyELAvfN0_PeXp7GbXmxEzNh905eQNeem1wF6buM_g4YDI08wgMI9SBLy3tlajRGHD3i5-LVbzTvEr6u1XGHwuyVrcBlJheUXGUq0TSgyU5lgFPMOnjY0uV1219lH3tK55AhkZbOyndDUILsuSVQFeDR45l1qAN-AfoJ0at60FrrovnytPOGTlOfypvyutyM-vYA1Y1_0HJt6EoAzSYkzWzcevLdya9-nwzfN5SQEZySniwmrEbLGm1MYMXf0nyTS2K7O58E-hkPQpfe2herFYibQ8ikEUjfJXri-12Kbabpbi6WYpkldzFV2KhZCUcuTgrf6ad0A48Y6Gt1BYrpwRT28MMB56gnqbHdqGPGiwUrIaG2KQSfeBXJl2dE4qlfKz9hdDqN3zbmG_c4l8Iax0eaf9lOKWZ9Pq_n9EvZDpjHT8EAAA';\nexport var firstCell = 'styles_firstCell__1rvbzfo4';\nexport var hasRowHeader = 'styles_hasRowHeader__1rvbzfo6';\nexport var headerCell = 'styles_headerCell__1rvbzfo2';\nexport var lastCell = 'styles_lastCell__1rvbzfo5';\nexport var table = 'styles_table__1rvbzfo1';\nexport var tableCell = 'styles_tableCell__1rvbzfo3';\nexport var tableContainer = 'styles_tableContainer__1rvbzfo0';","import { memo } from 'react';\nimport { tableCell, firstCell, lastCell, hasRowHeader } from './styles.css';\nimport { MemoizedRichText } from '../MemoizedComponents';\nimport { TableRowBlock } from '../../../../types';\nimport { RichTextItem } from '../RichText/RichTexts';\n\ninterface TableRowProps {\n rowBlock: TableRowBlock;\n cellClassName?: string;\n rowHeaderIndex?: number;\n}\n\nconst TableRow = memo(({\n rowBlock,\n cellClassName = '',\n rowHeaderIndex = -1,\n}: TableRowProps) => {\n if (!rowBlock.table_row?.cells) {\n return null;\n }\n\n const { cells } = rowBlock.table_row;\n\n return (\n <tr>\n {cells.map((cell: RichTextItem[], index: number) => {\n const isFirstCell = index === 0;\n const isLastCell = index === cells.length - 1;\n const isRowHeader = index === rowHeaderIndex;\n\n let cellClasses = [tableCell, cellClassName];\n\n if (isFirstCell) cellClasses.push(firstCell);\n if (isLastCell) cellClasses.push(lastCell);\n if (isRowHeader) cellClasses.push(hasRowHeader);\n\n return (\n <td\n key={`${rowBlock.id}-cell-${index}`}\n className={cellClasses.filter(Boolean).join(' ')}\n >\n <MemoizedRichText richTexts={cell} />\n </td>\n );\n })}\n </tr>\n );\n});\n\nTableRow.displayName = 'TableRow';\n\nexport default TableRow;\n","import Table from './Table';\nexport { default as TableRow } from './TableRow';\nexport default Table;\n","import { useState, KeyboardEvent } from 'react';\nimport { ToggleBlock } from '../../../../types';\nimport {\n toggleContainer,\n toggleHeader,\n toggleIcon,\n toggleIconOpen,\n toggleContent,\n} from './styles.css';\nimport { RichTexts } from '../../components/RichText';\nimport BlockRenderer from '../../components/Block/BlockRenderer';\n\ninterface ToggleProps {\n block: ToggleBlock;\n}\n\nconst Toggle = ({ block }: ToggleProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Toggle이 없거나 children이 없는 경우 렌더링하지 않음\n if (!block.toggle || !block.children) {\n return null;\n }\n\n const handleToggle = () => {\n setIsOpen(!isOpen);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n };\n\n return (\n <div className={toggleContainer}>\n <div\n className={toggleHeader}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n role=\"button\"\n aria-expanded={isOpen}\n >\n <span className={`${toggleIcon} ${isOpen ? toggleIconOpen : ''}`}>\n ▶\n </span>\n <RichTexts richTexts={block.toggle.rich_text} />\n </div>\n\n {isOpen && block.children && (\n <div className={toggleContent}>\n {block.children.map((childBlock) => (\n <BlockRenderer key={childBlock.id} block={childBlock} />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default Toggle;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Toggle/styles.css.ts.vanilla.css?source=LnN0eWxlc190b2dnbGVDb250YWluZXJfX3A3dWUxejAgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQouc3R5bGVzX3RvZ2dsZUhlYWRlcl9fcDd1ZTF6MSB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXNpemU6IHZhcigtLXR5cG9ncmFwaHktZm9udFNpemUtYmFzZV9fc3Ezamtidik7CiAgZm9udC13ZWlnaHQ6IHZhcigtLXR5cG9ncmFwaHktZm9udFdlaWdodC1ub3JtYWxfX3NxM2prYjEwKTsKICBjb2xvcjogaW5oZXJpdDsKICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLXhzX19zcTNqa2IxOCkgMDsKICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSYWRpdXMtc21fX3NxM2prYjFlKTsKfQouc3R5bGVzX3RvZ2dsZUhlYWRlcl9fcDd1ZTF6MTpob3ZlciB7CiAgYmFja2dyb3VuZDogcmdiYSg1NSwgNTMsIDQ3LCAwLjA4KTsKfQouc3R5bGVzX3RvZ2dsZUljb25fX3A3dWUxejIgewogIG1hcmdpbi1yaWdodDogdmFyKC0tc3BhY2luZy1zbV9fc3EzamtiMTkpOwogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgZWFzZTsKfQouc3R5bGVzX3RvZ2dsZUljb25PcGVuX19wN3VlMXozIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7Cn0KLnN0eWxlc190b2dnbGVDb250ZW50X19wN3VlMXo0IHsKICBwYWRkaW5nLWxlZnQ6IHZhcigtLXNwYWNpbmctbGdfX3NxM2prYjFjKTsKICBtYXJnaW4tdG9wOiB2YXIoLS1zcGFjaW5nLXhzX19zcTNqa2IxOCk7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQ';\nexport var toggleContainer = 'styles_toggleContainer__p7ue1z0';\nexport var toggleContent = 'styles_toggleContent__p7ue1z4';\nexport var toggleHeader = 'styles_toggleHeader__p7ue1z1';\nexport var toggleIcon = 'styles_toggleIcon__p7ue1z2';\nexport var toggleIconOpen = 'styles_toggleIconOpen__p7ue1z3';","import { memo } from 'react';\nimport { VideoBlock } from '../../../../types';\nimport { RichTextItem } from '../RichText/RichTexts'; // Caption을 위해 추가\nimport { videoContainer, videoPlayer, videoCaption } from './styles.css'; // 스타일 임포트\n\ninterface VideoProps {\n block: VideoBlock;\n}\n\nconst Video = memo(({ block }: VideoProps) => {\n if (block.type !== 'video' || !block.video) {\n return null;\n }\n\n const { type, external, caption } = block.video;\n\n let videoUrl = '';\n // TODO: 'file' 타입 비디오 처리 (Notion 내부 업로드 비디오)\n if (type === 'external') {\n videoUrl = getVideoEmbedUrl(external?.url);\n }\n\n if (!videoUrl) {\n return <p>비디오를 불러올 수 없습니다.</p>;\n }\n\n return (\n <div className={videoContainer}>\n {videoUrl.includes('youtube.com/embed/') ? (\n <iframe\n className={videoPlayer}\n src={videoUrl}\n title=\"YouTube video player\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n ></iframe>\n ) : (\n <p>\n 외부 비디오 링크:{' '}\n <a href={videoUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {videoUrl}\n </a>\n </p>\n )}\n {caption && caption.length > 0 && (\n <figcaption className={videoCaption}>\n {caption.map((c: RichTextItem, i: number) => (\n <span key={i}>{c.plain_text}</span>\n ))}\n </figcaption>\n )}\n </div>\n );\n});\n\nVideo.displayName = 'Video';\n\n// 정규식을 모듈 스코프에 정의하여 매번 생성하지 않도록 최적화\nconst YOUTUBE_SHORT_URL_REGEX = /youtu\\.be\\/([a-zA-Z0-9_-]+)/;\nconst YOUTUBE_WATCH_URL_REGEX = /youtube\\.com\\/watch\\?v=([a-zA-Z0-9_-]+)/;\n\nconst getVideoEmbedUrl = (url?: string): string => {\n if (!url) return '';\n\n // YouTube 짧은 URL (youtu.be)\n const shortMatch = url.match(YOUTUBE_SHORT_URL_REGEX);\n if (shortMatch?.[1]) {\n return `https://www.youtube.com/embed/${shortMatch[1]}`;\n }\n\n // YouTube 일반 URL (youtube.com/watch?v=)\n const watchMatch = url.match(YOUTUBE_WATCH_URL_REGEX);\n if (watchMatch?.[1]) {\n return `https://www.youtube.com/embed/${watchMatch[1]}`;\n }\n\n // 다른 외부 비디오 URL\n return url;\n};\n\nexport default Video;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Video/styles.css.ts.vanilla.css?source=LnN0eWxlc192aWRlb0NvbnRhaW5lcl9fMTViOXZrYjAgewogIG1hcmdpbjogMTBweCAwOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwp9Ci5zdHlsZXNfdmlkZW9QbGF5ZXJfXzE1Yjl2a2IxIHsKICB3aWR0aDogMTAwJTsKICBhc3BlY3QtcmF0aW86IDE2IC8gOTsKICBib3JkZXI6IG5vbmU7Cn0KLnN0eWxlc192aWRlb0NhcHRpb25fXzE1Yjl2a2IyIHsKICBtYXJnaW4tdG9wOiB2YXIoLS1zcGFjaW5nLXNtX19zcTNqa2IxOSk7CiAgZm9udC1zaXplOiB2YXIoLS10eXBvZ3JhcGh5LWZvbnRTaXplLXNtYWxsX19zcTNqa2J1KTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IDEwMCU7CiAgY29sb3I6IHZhcigtLWNvbG9ycy1zZWNvbmRhcnlfX3NxM2prYjMpOwp9';\nexport var videoCaption = 'styles_videoCaption__15b9vkb2';\nexport var videoContainer = 'styles_videoContainer__15b9vkb0';\nexport var videoPlayer = 'styles_videoPlayer__15b9vkb1';","import { Heading1 } from '../Renderer/components/Typography';\n\ninterface Props {\n title: string;\n}\nconst Title = ({ title }: Props) => {\n return <Heading1>{title}</Heading1>;\n};\n\nexport default Title;\n","import 'src/components/Cover/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb3ZlckNvbnRhaW5lcl9fcDBjcDhkMCB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHdpZHRoOiAxMDAlOwogIG1heC13aWR0aDogNTYuMjVyZW07CiAgaGVpZ2h0OiAzMHZoOwogIG1hcmdpbjogMCBhdXRvOwogIGJvcmRlci1yYWRpdXM6IDEuNXJlbTsKICBvdmVyZmxvdzogaGlkZGVuOwogIGJveC1zaGFkb3c6IDJweCAycHggOHB4IDRweCBoc2xhKDAsMCUsNiUsLjEpOwp9Ci5zdHlsZXNfc2tlbGV0b25XcmFwcGVyX19wMGNwOGQxIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwOwogIGxlZnQ6IDA7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIHotaW5kZXg6IDE7CiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2U7Cn0KLnN0eWxlc19za2VsZXRvbldyYXBwZXJfaXNMb2FkZWRfdHJ1ZV9fcDBjcDhkMiB7CiAgb3BhY2l0eTogMDsKfQouc3R5bGVzX3NrZWxldG9uV3JhcHBlcl9pc0xvYWRlZF9mYWxzZV9fcDBjcDhkMyB7CiAgb3BhY2l0eTogMTsKfQouc3R5bGVzX2ltYWdlU3R5bGVfX3AwY3A4ZDQgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICBvYmplY3QtZml0OiBjb3ZlcjsKICBvYmplY3QtcG9zaXRpb246IGNlbnRlciA1MCU7CiAgZGlzcGxheTogYmxvY2s7CiAgei1pbmRleDogMjsKICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZTsKfQouc3R5bGVzX2ltYWdlU3R5bGVfaXNMb2FkZWRfdHJ1ZV9fcDBjcDhkNSB7CiAgb3BhY2l0eTogMTsKfQouc3R5bGVzX2ltYWdlU3R5bGVfaXNMb2FkZWRfZmFsc2VfX3AwY3A4ZDYgewogIG9wYWNpdHk6IDA7Cn0KQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgLnN0eWxlc19jb3ZlckNvbnRhaW5lcl9fcDBjcDhkMCB7CiAgICBib3JkZXItcmFkaXVzOiAwLjVyZW07CiAgICBoZWlnaHQ6IDI1dmg7CiAgfQp9';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var coverContainer = 'styles_coverContainer__p0cp8d0';\nexport var imageStyle = _7a468({defaultClassName:'styles_imageStyle__p0cp8d4',variantClassNames:{isLoaded:{true:'styles_imageStyle_isLoaded_true__p0cp8d5',false:'styles_imageStyle_isLoaded_false__p0cp8d6'}},defaultVariants:{isLoaded:false},compoundVariants:[]});\nexport var skeletonWrapper = _7a468({defaultClassName:'styles_skeletonWrapper__p0cp8d1',variantClassNames:{isLoaded:{true:'styles_skeletonWrapper_isLoaded_true__p0cp8d2',false:'styles_skeletonWrapper_isLoaded_false__p0cp8d3'}},defaultVariants:{isLoaded:false},compoundVariants:[]});","import { coverContainer, skeletonWrapper, imageStyle } from './styles.css';\nimport Skeleton from '../Skeleton';\nimport { useImageLoad } from '../../hooks/useImageLoad';\n\ninterface Props {\n src: string;\n alt: string;\n}\n\n/**\n * 노션 페이지 상단에 표시되는 커버 이미지 컴포넌트\n * 이미지 로딩 중에는 스켈레톤 UI를 표시하고, 로딩 완료 시 자연스럽게 이미지로 전환됩니다.\n */\nconst Cover = ({ src, alt }: Props) => {\n const { isLoaded, imgRef, handleLoad } = useImageLoad(src);\n\n return (\n <div className={coverContainer}>\n <div className={skeletonWrapper({ isLoaded })}>\n <Skeleton variant=\"image\" isLoading={!isLoaded} />\n </div>\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n className={imageStyle({ isLoaded })}\n onLoad={handleLoad}\n loading=\"lazy\"\n />\n </div>\n );\n};\n\nexport default Cover;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb250YWluZXJfX2VwdmE1dTAgewogIG1heC13aWR0aDogNzIwcHg7CiAgbWFyZ2luOiAwIGF1dG87CiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy14bF9fc3EzamtiMWQpOwp9CkBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkgewogIC5zdHlsZXNfY29udGFpbmVyX19lcHZhNXUwIHsKICAgIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctbWRfX3NxM2prYjFiKTsKICB9Cn0';\nexport var container = 'styles_container__epva5u0';","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nexport var darkTheme = 'theme_darkTheme__sq3jkb1n';\nexport var lightTheme = 'theme_lightTheme__sq3jkb1m';\nexport var vars = {colors:{background:'var(--colors-background__sq3jkb0)',text:'var(--colors-text__sq3jkb1)',primary:'var(--colors-primary__sq3jkb2)',secondary:'var(--colors-secondary__sq3jkb3)',border:'var(--colors-border__sq3jkb4)',code:{background:'var(--colors-code-background__sq3jkb5)',text:'var(--colors-code-text__sq3jkb6)',inline:'var(--colors-code-inline__sq3jkb7)',inlineBackground:'var(--colors-code-inlineBackground__sq3jkb8)'},notion:{gray:'var(--colors-notion-gray__sq3jkb9)',brown:'var(--colors-notion-brown__sq3jkba)',orange:'var(--colors-notion-orange__sq3jkbb)',yellow:'var(--colors-notion-yellow__sq3jkbc)',green:'var(--colors-notion-green__sq3jkbd)',blue:'var(--colors-notion-blue__sq3jkbe)',purple:'var(--colors-notion-purple__sq3jkbf)',pink:'var(--colors-notion-pink__sq3jkbg)',red:'var(--colors-notion-red__sq3jkbh)',gray_background:'var(--colors-notion-gray_background__sq3jkbi)',brown_background:'var(--colors-notion-brown_background__sq3jkbj)',orange_background:'var(--colors-notion-orange_background__sq3jkbk)',yellow_background:'var(--colors-notion-yellow_background__sq3jkbl)',green_background:'var(--colors-notion-green_background__sq3jkbm)',blue_background:'var(--colors-notion-blue_background__sq3jkbn)',purple_background:'var(--colors-notion-purple_background__sq3jkbo)',pink_background:'var(--colors-notion-pink_background__sq3jkbp)',red_background:'var(--colors-notion-red_background__sq3jkbq)'}},typography:{fontFamily:{base:'var(--typography-fontFamily-base__sq3jkbr)',code:'var(--typography-fontFamily-code__sq3jkbs)'},fontSize:{xs:'var(--typography-fontSize-xs__sq3jkbt)',small:'var(--typography-fontSize-small__sq3jkbu)',base:'var(--typography-fontSize-base__sq3jkbv)',large:'var(--typography-fontSize-large__sq3jkbw)',h1:'var(--typography-fontSize-h1__sq3jkbx)',h2:'var(--typography-fontSize-h2__sq3jkby)',h3:'var(--typography-fontSize-h3__sq3jkbz)'},fontWeight:{normal:'var(--typography-fontWeight-normal__sq3jkb10)',medium:'var(--typography-fontWeight-medium__sq3jkb11)',semibold:'var(--typography-fontWeight-semibold__sq3jkb12)',bold:'var(--typography-fontWeight-bold__sq3jkb13)'},lineHeight:{tight:'var(--typography-lineHeight-tight__sq3jkb14)',base:'var(--typography-lineHeight-base__sq3jkb15)',relaxed:'var(--typography-lineHeight-relaxed__sq3jkb16)'}},spacing:{xxs:'var(--spacing-xxs__sq3jkb17)',xs:'var(--spacing-xs__sq3jkb18)',sm:'var(--spacing-sm__sq3jkb19)',base:'var(--spacing-base__sq3jkb1a)',md:'var(--spacing-md__sq3jkb1b)',lg:'var(--spacing-lg__sq3jkb1c)',xl:'var(--spacing-xl__sq3jkb1d)'},borderRadius:{sm:'var(--borderRadius-sm__sq3jkb1e)',md:'var(--borderRadius-md__sq3jkb1f)',lg:'var(--borderRadius-lg__sq3jkb1g)',xl:'var(--borderRadius-xl__sq3jkb1h)',xxl:'var(--borderRadius-xxl__sq3jkb1i)'},shadows:{sm:'var(--shadows-sm__sq3jkb1j)',md:'var(--shadows-md__sq3jkb1k)',lg:'var(--shadows-lg__sq3jkb1l)'}};"],"mappings":"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","names":["useMemo","memo","useCallback","memo","memo","_7a468","jsx","content","_7a468","jsx","jsx","link","jsx","jsxs","link","useState","useEffect","memo","content","description","link","title","jsx","jsxs","memo","content","title","description","useState","useEffect","link","memo","jsx","jsxs","memo","content","memo","memo","Fragment","jsx","jsxs","content","memo","caption","memo","jsx","memo","memo","jsx","memo","memo","jsx","memo","memo","jsx","memo","memo","memo","jsx","memo","Fragment","jsx","jsxs","memo","Table_default","useState","jsx","jsxs","useState","memo","jsx","jsxs","memo","caption","jsx","memo","Table_default","jsx","title","_7a468","imageStyle","skeletonWrapper","jsx","jsxs","skeletonWrapper","imageStyle","container","Fragment","jsx","jsxs","memo","title","useCallback","useMemo","container"]}
1
+ {"version":3,"sources":["../src/components/Renderer/index.tsx","../src/components/Renderer/components/List/ListItemGroup.tsx","../src/components/Renderer/components/List/List.tsx","../src/components/Renderer/components/List/styles.css.ts","../src/components/Renderer/components/MemoizedComponents.tsx","../src/components/Renderer/components/RichText/styles.css.ts","../src/components/Renderer/components/RichText/RichTexts.tsx","../src/components/Renderer/components/Image/styles.css.ts","../src/components/Skeleton/styles.css.ts","../src/components/Skeleton/index.tsx","../src/hooks/useImageLoad.ts","../src/components/Renderer/components/Image/Image.tsx","../src/components/Renderer/components/Bookmark/styles.css.ts","../src/components/Renderer/components/Bookmark/Bookmark.tsx","../src/components/Renderer/components/LinkPreview/LinkPreview.tsx","../src/components/Renderer/components/LinkPreview/styles.css.ts","../src/components/Renderer/components/Block/BlockRenderer.tsx","../src/components/Renderer/components/Code/CodeBlock.tsx","../src/components/Renderer/components/Code/styles.css.ts","../src/components/Renderer/components/Typography/Typography.tsx","../src/components/Renderer/components/Typography/styles.css.ts","../src/components/Renderer/components/Column/Column.tsx","../src/components/Renderer/components/Column/styles.css.ts","../src/components/Renderer/components/Column/ColumnList.tsx","../src/components/Renderer/components/Quote/Quote.tsx","../src/components/Renderer/components/Quote/styles.css.ts","../src/components/Renderer/components/Table/Table.tsx","../src/components/Renderer/components/Table/styles.css.ts","../src/components/Renderer/components/Table/TableRow.tsx","../src/components/Renderer/components/Table/index.ts","../src/components/Renderer/components/Toggle/Toggle.tsx","../src/components/Renderer/components/Toggle/styles.css.ts","../src/components/Renderer/components/Video/Video.tsx","../src/components/Renderer/components/Video/styles.css.ts","../src/components/Title/index.tsx","../src/components/Cover/styles.css.ts","../src/components/Cover/index.tsx","../src/components/Renderer/styles.css.ts","../src/styles/theme.css.ts"],"sourcesContent":["import { useMemo, memo, useCallback } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { ListGroup } from './components/List';\nimport { BlockRenderer } from './components/Block';\nimport Title from '../Title';\nimport Cover from '../Cover';\n\nimport {\n BulletedListItemBlock,\n NotionBlock,\n NumberedListItemBlock,\n} from '../../types';\nimport { container } from './styles.css';\nimport { darkTheme, lightTheme } from '../../styles/theme.css';\n\ninterface Props {\n blocks: NotionBlock[];\n title?: string;\n cover?: string;\n isDarkMode?: boolean;\n}\n\nconst Renderer = memo(({ blocks, isDarkMode = false, title, cover }: Props) => {\n const theme = isDarkMode ? darkTheme : lightTheme;\n\n // useCallback으로 안정적인 참조 유지 - 리스트 리렌더 방지\n const renderBlock = useCallback(\n (childBlock: NotionBlock) => <BlockRenderer block={childBlock} />,\n []\n );\n\n const renderedBlocks = useMemo(() => {\n const result: ReactNode[] = [];\n\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n if (!block) break;\n\n // 리스트 아이템 타입 처리를 위한 공통 함수\n const handleListItem = (listType: 'bulleted' | 'numbered') => {\n const listItemType = `${listType}_list_item` as (\n | BulletedListItemBlock\n | NumberedListItemBlock\n )['type'];\n\n if (\n block.type === listItemType &&\n (i === 0 || blocks[i - 1]?.type !== listItemType)\n ) {\n // 연속된 리스트 아이템 수집\n const listItems: (BulletedListItemBlock | NumberedListItemBlock)[] =\n [];\n let j = i;\n while (\n j < blocks.length &&\n blocks[j] &&\n blocks[j]?.type === listItemType\n ) {\n listItems.push(\n blocks[j] as BulletedListItemBlock | NumberedListItemBlock\n );\n j++;\n }\n\n result.push(\n <ListGroup\n key={block.id}\n blocks={listItems}\n type={listItemType}\n renderBlock={renderBlock}\n />\n );\n\n // 이미 처리된 리스트 아이템 건너뛰기 (j는 다음 블록의 인덱스)\n i = j - 1;\n\n return true;\n }\n\n return false;\n };\n\n // 순서대로 각 리스트 타입 처리 시도\n if (handleListItem('bulleted') || handleListItem('numbered')) {\n // 리스트 아이템이 처리되었으므로 다음 블록으로 진행\n continue;\n } else {\n // 리스트 아이템이 아닌 일반 블록 처리\n result.push(<BlockRenderer key={block.id} block={block} />);\n }\n }\n\n return result;\n }, [blocks, renderBlock]);\n\n return (\n <>\n {cover && <Cover src={cover} alt={title || 'Notion page content'} />}\n <article\n className={`${theme} ${container}`}\n aria-label={title || 'Notion page content'}\n >\n {title && <Title title={title} />}\n {renderedBlocks}\n </article>\n </>\n );\n});\n\nRenderer.displayName = 'Renderer';\n\nexport default Renderer;\n","import React, { memo } from 'react';\nimport { List, ListItem } from './List';\n\nimport { MemoizedRichText } from '../MemoizedComponents';\nimport {\n BulletedListItemBlock,\n NotionBlock,\n NumberedListItemBlock,\n} from '../../../../types';\n\ninterface RecursiveListItemProps {\n block: BulletedListItemBlock | NumberedListItemBlock;\n renderBlock: (block: NotionBlock, parentBlockId?: string) => React.ReactNode;\n}\n\n// 리스트 아이템을 렌더링하는 컴포넌트 (중첩 리스트 지원)\nconst RecursiveListItem = memo(({ block, renderBlock }: RecursiveListItemProps) => {\n let content:\n | BulletedListItemBlock['bulleted_list_item']\n | NumberedListItemBlock['numbered_list_item'];\n\n if (block.type === 'bulleted_list_item') {\n content = block.bulleted_list_item;\n } else {\n // block.type이 'numbered_list_item'이라고 가정 (props 타입에 의해 보장됨)\n content = (block as NumberedListItemBlock).numbered_list_item;\n }\n\n const richTexts = content.rich_text;\n\n const renderedChildren: JSX.Element[] = [];\n const children: NotionBlock[] = block.children ?? [];\n\n if (children.length > 0) {\n let i = 0;\n while (i < children.length) {\n const currentChild = children[i];\n if (!currentChild) {\n i++;\n continue;\n }\n\n if (\n currentChild.type === 'bulleted_list_item' ||\n currentChild.type === 'numbered_list_item'\n ) {\n const groupType = currentChild.type;\n const currentGroup: (BulletedListItemBlock | NumberedListItemBlock)[] =\n [currentChild as BulletedListItemBlock | NumberedListItemBlock];\n let j = i + 1;\n while (j < children.length) {\n const nextChildInGroup = children[j];\n if (!nextChildInGroup) {\n // 타입스크립트 만족용 null 체크\n break;\n }\n if (nextChildInGroup.type === groupType) {\n currentGroup.push(\n nextChildInGroup as BulletedListItemBlock | NumberedListItemBlock\n );\n j++;\n } else {\n break; // 다른 타입 만나면 그룹 종료\n }\n }\n renderedChildren.push(\n <ListGroup\n key={`${currentChild.id}-group`}\n blocks={currentGroup}\n type={groupType} // 그룹의 실제 타입 전달\n renderBlock={renderBlock}\n />\n );\n i = j; // 다음 순회 시작 위치 업데이트\n } else {\n // 리스트 아이템이 아닌 블록은 renderBlock으로 직접 렌더링\n renderedChildren.push(\n <div key={currentChild.id}>{renderBlock(currentChild, block.id)}</div>\n );\n i++; // 다음 자식으로 이동\n }\n }\n }\n\n return (\n <ListItem>\n <MemoizedRichText richTexts={richTexts} />\n {renderedChildren.length > 0 && renderedChildren}\n </ListItem>\n );\n});\n\nRecursiveListItem.displayName = 'RecursiveListItem';\n\ninterface ListGroupProps {\n blocks: (BulletedListItemBlock | NumberedListItemBlock)[];\n type: 'bulleted_list_item' | 'numbered_list_item';\n renderBlock: (block: NotionBlock, parentBlockId?: string) => React.ReactNode;\n}\n\nexport const ListGroup = memo(({ blocks, type, renderBlock }: ListGroupProps) => {\n if (blocks.length === 0) return null;\n\n return (\n <List\n as={type === 'numbered_list_item' ? 'ol' : 'ul'}\n type={type}\n role=\"list\"\n aria-label={type}\n >\n {blocks.map((block) => (\n <RecursiveListItem\n key={block.id}\n block={block}\n renderBlock={renderBlock}\n />\n ))}\n </List>\n );\n});\n\nListGroup.displayName = 'ListGroup';\n","import { PropsWithChildren, HTMLAttributes, memo } from 'react';\nimport { list, listItem } from './styles.css';\n\ninterface ListProps\n extends HTMLAttributes<HTMLUListElement | HTMLOListElement> {\n as?: 'ul' | 'ol';\n type: 'bulleted_list_item' | 'numbered_list_item';\n}\n\nexport const List = memo(({\n as: Component = 'ul',\n type,\n children,\n ...props\n}: PropsWithChildren<ListProps>) => {\n return (\n <Component className={list({ type })} {...props}>\n {children}\n </Component>\n );\n});\n\nList.displayName = 'List';\n\nexport const ListItem = memo(({\n children,\n ...props\n}: PropsWithChildren<HTMLAttributes<HTMLLIElement>>) => {\n return (\n <li className={listItem} {...props}>\n {children}\n </li>\n );\n});\n\nListItem.displayName = 'ListItem';\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/List/styles.css.ts.vanilla.css?source=LnN0eWxlc19saXN0X19lczh2aW0wIHsKICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLXhzX19zcTNqa2IxOCkgdmFyKC0tc3BhY2luZy14eHNfX3NxM2prYjE3KTsKICBwYWRkaW5nLWxlZnQ6IHZhcigtLXNwYWNpbmctbGdfX3NxM2prYjFjKTsKICBjb2xvcjogdmFyKC0tY29sb3JzLXRleHRfX3NxM2prYjEpOwp9Ci5zdHlsZXNfbGlzdF90eXBlX2J1bGxldGVkX2xpc3RfaXRlbV9fZXM4dmltMSB7CiAgbGlzdC1zdHlsZS10eXBlOiBkaXNjOwp9Ci5zdHlsZXNfbGlzdF90eXBlX251bWJlcmVkX2xpc3RfaXRlbV9fZXM4dmltMiB7CiAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwp9Ci5zdHlsZXNfbGlzdEl0ZW1fX2VzOHZpbTMgewogIHBhZGRpbmc6IHZhcigtLXNwYWNpbmcteHhzX19zcTNqa2IxNykgMDsKfQ';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var list = _7a468({defaultClassName:'styles_list__es8vim0',variantClassNames:{type:{bulleted_list_item:'styles_list_type_bulleted_list_item__es8vim1',numbered_list_item:'styles_list_type_numbered_list_item__es8vim2'}},defaultVariants:{},compoundVariants:[]});\nexport var listItem = 'styles_listItem__es8vim3';","import { memo } from 'react';\nimport RichText, { RichTextItem, RichTextProps } from './RichText/RichTexts';\nimport { Image, ImageProps } from './Image';\nimport Bookmark, { type Props as BookmarkProps } from './Bookmark/Bookmark';\n\nimport LinkPreview, { type LinkPreviewProps } from './LinkPreview/LinkPreview';\n\n/**\n * RichTextItem 배열의 얕은 비교\n * JSON.stringify보다 효율적인 O(n) 비교\n */\nconst areRichTextsEqual = (\n prev: RichTextItem[] | undefined,\n next: RichTextItem[] | undefined\n): boolean => {\n if (prev === next) return true;\n if (!prev || !next) return prev === next;\n if (prev.length !== next.length) return false;\n\n return prev.every(\n (item, i) =>\n item.plain_text === next[i]?.plain_text &&\n item.href === next[i]?.href &&\n item.annotations?.bold === next[i]?.annotations?.bold &&\n item.annotations?.italic === next[i]?.annotations?.italic &&\n item.annotations?.code === next[i]?.annotations?.code &&\n item.annotations?.color === next[i]?.annotations?.color\n );\n};\n\nexport const MemoizedRichText = memo<RichTextProps>(RichText, (prev, next) => {\n return areRichTextsEqual(prev.richTexts, next.richTexts);\n});\n\nexport const MemoizedImage = memo<ImageProps>(Image, (prev, next) => {\n return (\n prev.src === next.src &&\n prev.alt === next.alt &&\n areRichTextsEqual(prev.caption, next.caption)\n );\n});\n\nexport const MemoizedBookmark = memo<BookmarkProps>(Bookmark, (prev, next) => {\n return prev.url === next.url;\n});\n\nexport const MemoizedLinkPreview = memo<LinkPreviewProps>(\n LinkPreview,\n (prev, next) => {\n return prev.url === next.url;\n }\n);\n\n// 타입 가드 유틸리티\nexport const isRichTextArray = (value: unknown): value is RichTextItem[] => {\n if (!Array.isArray(value)) return false;\n return value.every(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n item.type === 'text'\n );\n};\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/RichText/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA5WWwXKbMBCG734KHZuDPHHdTBxyy6EPkOlMj4xACygIiSzChHb67h0kyw4Go3DyjPbf75d2WVnbxvQSmhhFWvyCDxMnWvLYYAtxnPFsb7od-bshJNPK0A5EXpiIDJrnzb_N9jpZGCZFOkr_fkm36og40Wx-Y1CUYArUbV6MMHuLMfBhKIdUIzNCq4hIoYCe9LPEVnHAQTWi_ZinncWzqFTzMeXBUhKWljnqVvGIHBl-ozTVUmNDBz0VauC9nDVx3Lzv38rkcPe8IaRmnAuVR-R-u4OK3G_3D1ANgUQjB6TIuGgbz3WLr3aNNpVH7cCyRh1yCaavdY6sLno6RH_bIK2Ai_aSvbtkZ6wSsr-R_dMG7al8bnNJbcQfGI5xOB3A1uB2QTzh0RK4aGrJ-oi4IE2kTsshcAQ0ImWSMilyFZFKcC5vdUdqjHNkvW_Po23P3EaUHvpNndht5OlugZqg7pTHHkLYk9px2RJXI1P5-XN6CoG93JGTJXIPUurOk1mI7OWOnC6RcwQ41yIJl9iqHZcv1lheBisNltiKHRWWqHWLtTxzeYjr5Y6cLZKFKj0XglwrdtR8iYrAPTQLQa3WMYvljrE-Tj7dQI6fX91eNDQpyeQSE-GhmfoWK3ynDGf89oWpmjqLFc4zEGddfmHsptZvK6xnIM5ahudy6lyuavM1wxlXwcGd-so1bb5GOFv1hcmeGlcrjGcgzloHR39qrNYYXyOcbR26G6aueoXrNcGZvt8yrWoru_dWdfgNNv-Ekp_uyvfP15pQBaAwz4HHGCGdRk4TBFZGxP7QYWWI6CNgJnVHO2T1OHjZAFS16V_9yU47QbuTYvRiamqWCpVTmZ_fR_bf8D8Eymk_JwsAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var emptyRichText = 'styles_emptyRichText__fdf3twr';\nexport var link = 'styles_link__fdf3twq';\nexport var richText = _7a468({defaultClassName:'styles__fdf3tw0',variantClassNames:{bold:{true:'styles_richText_bold_true__fdf3tw1'},italic:{true:'styles_richText_italic_true__fdf3tw2'},strikethrough:{true:'styles_richText_strikethrough_true__fdf3tw3'},underline:{true:'styles_richText_underline_true__fdf3tw4'},code:{true:'styles_richText_code_true__fdf3tw5'},color:{'default':'styles_richText_color_default__fdf3tw6',gray:'styles_richText_color_gray__fdf3tw7',brown:'styles_richText_color_brown__fdf3tw8',orange:'styles_richText_color_orange__fdf3tw9',yellow:'styles_richText_color_yellow__fdf3twa',green:'styles_richText_color_green__fdf3twb',blue:'styles_richText_color_blue__fdf3twc',purple:'styles_richText_color_purple__fdf3twd',pink:'styles_richText_color_pink__fdf3twe',red:'styles_richText_color_red__fdf3twf',gray_background:'styles_richText_color_gray_background__fdf3twg',brown_background:'styles_richText_color_brown_background__fdf3twh',orange_background:'styles_richText_color_orange_background__fdf3twi',yellow_background:'styles_richText_color_yellow_background__fdf3twj',green_background:'styles_richText_color_green_background__fdf3twk',blue_background:'styles_richText_color_blue_background__fdf3twl',purple_background:'styles_richText_color_purple_background__fdf3twm',pink_background:'styles_richText_color_pink_background__fdf3twn',red_background:'styles_richText_color_red_background__fdf3two'}},defaultVariants:{},compoundVariants:[[{strikethrough:true,underline:true},'styles_richText_compound_0__fdf3twp']]});","import { ReactNode } from 'react';\nimport type { RichTextItem } from 'notion-types';\nimport { richText, link, emptyRichText } from './styles.css';\n\nexport type { RichTextItem };\n\n// 지원하는 Notion 색상 타입 정의\ntype NotionColor =\n | 'default'\n | 'gray'\n | 'brown'\n | 'orange'\n | 'yellow'\n | 'green'\n | 'blue'\n | 'purple'\n | 'pink'\n | 'red'\n | 'gray_background'\n | 'brown_background'\n | 'orange_background'\n | 'yellow_background'\n | 'green_background'\n | 'blue_background'\n | 'purple_background'\n | 'pink_background'\n | 'red_background';\n\n// 모듈 스코프로 이동 - 매 렌더마다 배열 재생성 방지\nconst NOTION_COLORS: NotionColor[] = [\n 'default',\n 'gray',\n 'brown',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'purple',\n 'pink',\n 'red',\n 'gray_background',\n 'brown_background',\n 'orange_background',\n 'yellow_background',\n 'green_background',\n 'blue_background',\n 'purple_background',\n 'pink_background',\n 'red_background',\n] as const;\n\n// 타입 가드 함수\nconst isNotionColor = (color: string): color is NotionColor => {\n return NOTION_COLORS.includes(color as NotionColor);\n};\n\n/**\n * 링크 컴포넌트를 생성하는 함수\n */\nconst renderLink = (href: string, content: ReactNode) => (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={link}>\n {content}\n </a>\n);\n\nexport interface RichTextProps {\n richTexts: RichTextItem[];\n}\n\nconst EmptyRichText = () => <div className={emptyRichText} />;\n\nconst RichTexts = ({ richTexts }: RichTextProps) => {\n if (richTexts.length === 0) {\n return <EmptyRichText />;\n }\n\n return (\n <>\n {richTexts.map((text, index) => {\n const { bold, italic, strikethrough, underline, code, color } =\n text.annotations;\n\n // 컨텐츠 렌더링 로직\n let content: React.ReactNode;\n\n // TODO: Refactor\n switch (text.type) {\n case 'text': {\n if (text.text) {\n const { text: textData } = text;\n\n content = textData.link?.url\n ? renderLink(textData.link.url, textData.content)\n : textData.content;\n } else {\n content = text.plain_text;\n }\n break;\n }\n\n case 'mention': {\n content = text.href\n ? renderLink(text.href, text.plain_text)\n : text.plain_text;\n break;\n }\n\n default: {\n content = text.plain_text;\n }\n }\n\n // NOTION COLOR 적용\n // 타입 가드를 사용하여 지원하는 색상인지 검증\n const safeColor = isNotionColor(color) ? color : undefined;\n\n return (\n <span\n key={index}\n className={richText({\n bold,\n italic,\n strikethrough,\n underline,\n code,\n color: safeColor,\n })}\n >\n {content}\n </span>\n );\n })}\n </>\n );\n};\n\nexport default RichTexts;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Image/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA4VTsW7bMBDd_RVcCtQDDTku2kaZiq6dkqGjcBZP0sUUyfJOjuWi_16QiezYhp1J5JHv8d29pwXLaJEr6qHFn94JkMNYVXfNytVNof7OlAqeSci7UkW0ILTFh5lSL2SkK9WyKD6lbQBjyLWl2kL8rDUHqMm1mvuq4j-r5816eT9XRbq59tFg1BEMDTzdfy0-5pruzQHUzBPEbzE21r-UqiNj0KVaD7ElV6pCwSA-VQxxsDCWqrG4S4X01YYi1q_ya2-HPoPBUus0CfZcqhqdYHyY_Zst3k_jd4QQjrNY3phFDzt9Mo8zqqe0nojuMtHZ-DqktpPyspe19fUmVSSCm972aboyqmKxYoXAWYRfP2MtuiFJnWYnrwixHgyaSuJwELXKot54S7W8jWzA8gH65RRaXIF2wD84YC2PIORPKb5mCsjHOqbzaRJHqhpCan6CfMsQwZ3obObRRpV89nFKVt6wZqy9MxDHKVqr-TFFWny4mdycJu9EM-1xuilj8G2E0I06nT3RHjX3YO0EHObvG-ANWhTvznL1_SxXsGZvB8mWZln5p7HYyNvySnKm_V6TM7jLHn6YmuvqiH9dpuT-htVXCU6chsuc_Qd6kFP2gwQAAA';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var caption = 'styles_caption__2f3ncf7';\nexport var imageContainer = 'styles_imageContainer__2f3ncf0';\nexport var imageStyle = _7a468({defaultClassName:'styles_imageStyle__2f3ncf2',variantClassNames:{loaded:{true:'styles_imageStyle_loaded_true__2f3ncf3',false:'styles_imageStyle_loaded_false__2f3ncf4'},hasAspectRatio:{true:'styles_imageStyle_hasAspectRatio_true__2f3ncf5',false:'styles_imageStyle_hasAspectRatio_false__2f3ncf6'}},defaultVariants:{loaded:false,hasAspectRatio:false},compoundVariants:[]});\nexport var imageWrapper = 'styles_imageWrapper__2f3ncf1';\nexport var skeletonWrapper = _7a468({defaultClassName:'styles_skeletonWrapper__2f3ncf8',variantClassNames:{isLoaded:{true:'styles_skeletonWrapper_isLoaded_true__2f3ncf9',false:'styles_skeletonWrapper_isLoaded_false__2f3ncfa'}},defaultVariants:{isLoaded:false},compoundVariants:[]});","import 'src/components/Skeleton/styles.css.ts.vanilla.css?source=QGtleWZyYW1lcyBzdHlsZXNfc2hpbW1lcl9fYTNnOHE5MCB7CiAgMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7CiAgfQp9Ci5zdHlsZXNfc2tlbGV0b25fX2EzZzhxOTEgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBoZWlnaHQ6IDEwMCU7CiAgd2lkdGg6IDEwMCU7CiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKICBib3JkZXItcmFkaXVzOiA0cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KLnN0eWxlc19za2VsZXRvbl9fYTNnOHE5MTo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIiOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgYm90dG9tOiAwOwogIGxlZnQ6IDA7CiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDApIDAsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAyMCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSA2MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMCkpOwogIGFuaW1hdGlvbjogc3R5bGVzX3NoaW1tZXJfX2EzZzhxOTAgLjhzIGluZmluaXRlIGxpbmVhcjsKICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTsKICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Owp9Ci5zdHlsZXNfcmVjdF9fYTNnOHE5MiB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAyMHB4OwogIG1hcmdpbi1ib3R0b206IDhweDsKfQouc3R5bGVzX2NpcmNsZV9fYTNnOHE5MyB7CiAgd2lkdGg6IDUwcHg7CiAgaGVpZ2h0OiA1MHB4OwogIGJvcmRlci1yYWRpdXM6IDUwJTsKfQouc3R5bGVzX2ltYWdlX19hM2c4cTk0IHsKICB3aWR0aDogMTAwJTsKICBib3JkZXItcmFkaXVzOiA4cHg7Cn0';\nexport var circle = 'styles_circle__a3g8q93';\nexport var image = 'styles_image__a3g8q94';\nexport var rect = 'styles_rect__a3g8q92';\nexport var skeleton = 'styles_skeleton__a3g8q91';","import * as styles from './styles.css';\n\ntype SkeletonProps = {\n /**\n * 스켈레톤 형태 - 직사각형, 원형, 이미지 크기\n * @default 'rect'\n */\n variant?: 'rect' | 'circle' | 'image';\n /**\n * 커스텀 너비 (px 또는 %)\n */\n width?: string;\n /**\n * 커스텀 높이 (px 또는 %)\n */\n height?: string;\n /**\n * 추가 CSS 클래스명\n */\n className?: string;\n /**\n * 로딩 상태\n */\n isLoading?: boolean;\n};\n\n/**\n * 콘텐츠 로딩 중에 표시되는 물결 효과가 있는 스켈레톤 컴포넌트입니다.\n * 이미지, 텍스트 등의 로딩 상태를 표시하는 데 사용합니다.\n */\nconst Skeleton = ({\n variant = 'rect',\n width,\n height,\n className,\n isLoading = true,\n}: SkeletonProps) => {\n const getVariantClass = () => {\n switch (variant) {\n case 'circle':\n return styles.circle;\n case 'image':\n return styles.image;\n case 'rect':\n default:\n return styles.rect;\n }\n };\n\n if (!isLoading) {\n return null;\n }\n\n return (\n <div\n className={`${styles.skeleton} ${getVariantClass()} ${className || ''}`}\n style={{\n width: width || undefined,\n height: height || undefined,\n }}\n />\n );\n};\n\nexport default Skeleton;\n","import { useState, useRef, useEffect, useCallback } from 'react';\n\n/**\n * 이미지 로딩 상태를 관리하는 커스텀 훅\n * Cover와 Image 컴포넌트에서 공통으로 사용\n *\n * @param src - 이미지 소스 URL\n * @returns isLoaded, imgRef, handleLoad\n */\nexport const useImageLoad = (src: string) => {\n const [isLoaded, setIsLoaded] = useState(false);\n const imgRef = useRef<HTMLImageElement>(null);\n\n useEffect(() => {\n // src 변경 시 먼저 로딩 상태 리셋\n setIsLoaded(false);\n\n // 브라우저 캐시로 이미 로드된 경우 체크\n const img = imgRef.current;\n if (img && img.complete && img.naturalHeight !== 0) {\n setIsLoaded(true);\n }\n }, [src]);\n\n const handleLoad = useCallback(() => {\n setIsLoaded(true);\n }, []);\n\n return { isLoaded, imgRef, handleLoad };\n};\n","import { MemoizedRichText } from '../MemoizedComponents';\nimport {\n imageContainer,\n imageWrapper,\n imageStyle,\n caption,\n skeletonWrapper,\n} from './styles.css';\nimport { RichTextItem } from '../RichText/RichTexts';\nimport Skeleton from '../../../Skeleton';\nimport { useImageLoad } from '../../../../hooks/useImageLoad';\n\nexport interface ImageFormat {\n block_width?: number;\n block_height?: number;\n block_aspect_ratio?: number;\n}\n\nconst MAX_WIDTH = 720;\n\n// 이미지 태그에 사용되는 aspectRatio 스타일\nconst getImageTagStyle = (format?: ImageFormat) => {\n return format?.block_aspect_ratio\n ? { aspectRatio: `${format.block_aspect_ratio}` }\n : undefined;\n};\n\nexport interface Props {\n src: string;\n alt: string;\n caption?: RichTextItem[];\n priority?: boolean;\n format?: ImageFormat;\n isColumn?: boolean;\n}\n\nconst Image = ({\n src,\n alt,\n caption: imageCaption,\n format,\n isColumn = false,\n}: Props) => {\n const { isLoaded, imgRef, handleLoad } = useImageLoad(src);\n\n return (\n <div className={imageContainer}>\n <div className={imageWrapper} style={getImageStyles(format, isColumn)}>\n <div className={skeletonWrapper({ isLoaded })}>\n <Skeleton variant=\"image\" isLoading={!isLoaded} />\n </div>\n <img\n ref={imgRef}\n className={imageStyle({\n loaded: isLoaded,\n hasAspectRatio: !!format?.block_aspect_ratio,\n })}\n src={src}\n alt={alt}\n loading=\"lazy\"\n onLoad={handleLoad}\n width={format?.block_width}\n height={format?.block_height}\n style={getImageTagStyle(format)}\n />\n </div>\n {imageCaption && imageCaption.length > 0 && (\n <figcaption className={caption}>\n <MemoizedRichText richTexts={imageCaption} />\n </figcaption>\n )}\n </div>\n );\n};\n\nexport default Image;\n\n// 이미지 스타일 유틸리티 함수\nconst getImageStyles = (format?: ImageFormat, isColumn: boolean = false) => {\n // width 계산 로직\n const getWidthStyle = () => {\n if (\n !isColumn &&\n format?.block_aspect_ratio &&\n format.block_aspect_ratio < 1\n ) {\n return `${format.block_aspect_ratio * 100}%`;\n }\n\n if (format?.block_width) {\n return format.block_width > MAX_WIDTH\n ? '100%'\n : `${format.block_width}px`;\n }\n\n return '100%';\n };\n\n // aspectRatio 계산 로직\n const getAspectRatioStyle = () => {\n return format?.block_aspect_ratio ? `${format.block_aspect_ratio}` : 'auto';\n };\n\n return {\n width: getWidthStyle(),\n aspectRatio: getAspectRatioStyle(),\n };\n};\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Bookmark/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA71WPW_bMBDd_Su4FIgHGpLito6yFOjUpUNboKNBiSfrYopkSNqyUuS_F6S-EztJi6KTwfvi47t3J6-sawTYrUC5327vzf2mKSLya0GIg5OjHHJlmEMlUyKVhNsFIRytFqxJSSZUvvcWzThHuaNO6ZQcmbmi1GqWe9PJbrf2_vpun8Wb5TQ2U86p6pXwx8Wqw5czw3t8ccA3wCgEnHzlTBkOJiWxPhGrBPKudq6EMpa27r78ejmmUMM4HmyPpTV-CzZa8QFQEVLUEUwhVJ2SEjkH6W3OMGmxZSlTJ2pLxlVNolViCTAbWKvYiZaAu9KlZGOguvi4tPRXhCeOtQaewmkGaz_nSUkH0vXVklCn4_wp2RmzMJRhy9tzpPrflKxJTOJNpAcT5Wggb1-cK3GoAg93B-uwaGgHIiX-JqAZuBpapp6zN0LXBo4I9WclHUPpW9W-4fp8u1tk8RQZE7iTFB1UNiU5SAfmLKzR9bwrb8L4pWI76PGtA74auStTEkfRO1-kL9qfVXYHuaMF-uv9DROjVr14RmCvK9NWQ-9gJgGHTgzg3s8FEP3xCBJSKOmoxQfoI12j1c4wXTbU-77jA8y0dBzT6o6Gs4k_g5NaqDBTYlR0EvLD2KbzGfY7aQgLURXKoYHx6v3FFnb7bHSAEKgtWu-qS3QQCAC_5mrD9JRQDjY3qH2Lelo__Cdaxyx3kRQLuZKcmaYPvV5OFZiskr-kZRg5WkO2R0czFcasPwqUQHPBKp2SZOrwe0sZDLN2BOMwZ2JKqEUHX1k1iPRjYHPWyg7xC1-Wif5v_i2h2mA1oTM5vxkvLJsdex3pbFeMtBTsiPmosc1sr3SEPCUoLGNbGpT7IMOx2sGIH2Fc2mo3odo5BZxV_4vC8FvzyRs-VcCRkauJa51E-rQM175txU9I7v9rPC4efwM4QP1joggAAA';\nexport var card = 'styles_card__qrq8yf1';\nexport var content = 'styles_content__qrq8yf2';\nexport var description = 'styles_description__qrq8yf6';\nexport var favicon = 'styles_favicon__qrq8yf8';\nexport var link = 'styles_link__qrq8yf0';\nexport var previewContainer = 'styles_previewContainer__qrq8yf3';\nexport var previewImage = 'styles_previewImage__qrq8yf4';\nexport var siteName = 'styles_siteName__qrq8yf7';\nexport var title = 'styles_title__qrq8yf5';\nexport var urlText = 'styles_urlText__qrq8yf9';","import {\n link,\n card,\n content,\n previewContainer,\n previewImage,\n title,\n description,\n siteName,\n favicon,\n urlText,\n} from './styles.css';\nimport { OpenGraphData } from './type';\n\nexport interface Props {\n url: string;\n metadata?: OpenGraphData;\n}\n\nconst Bookmark = ({ url, metadata }: Props) => {\n return (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className={link}>\n <div className={card}>\n <div className={content}>\n <div>\n <h4 className={title}>{metadata?.title || url}</h4>\n <p className={description}>{metadata?.description || ''}</p>\n </div>\n <div className={siteName}>\n {metadata?.favicon && (\n <img src={metadata.favicon} alt=\"\" className={favicon} />\n )}\n <span className={urlText}>{metadata?.url || ''}</span>\n </div>\n </div>\n {metadata?.image && (\n <div className={previewContainer}>\n <img\n className={previewImage}\n src={metadata.image}\n alt={metadata.title}\n loading=\"lazy\"\n onError={(e) => {\n // 이미지 로드 실패 시 처리\n const target = e.target as HTMLImageElement;\n target.style.display = 'none';\n }}\n />\n </div>\n )}\n </div>\n </a>\n );\n};\n\nexport default Bookmark;\n","import { useState, useEffect, memo } from 'react';\nimport * as styles from './styles.css';\n\ninterface RepoData {\n name: string;\n full_name: string;\n owner: {\n avatar_url: string;\n };\n updated_at: string;\n}\n\ninterface FigmaData {\n name: string;\n url: string;\n thumbnailUrl?: string;\n}\n\n// GitHub 레포지토리 데이터를 가져오는 함수\nconst fetchGitHubRepoData = async (\n repoPath: string,\n signal?: AbortSignal\n): Promise<RepoData | null> => {\n try {\n const apiUrl = `https://api.github.com/repos/${repoPath}`;\n const response = await fetch(apiUrl, { signal });\n\n if (!response.ok) {\n throw new Error('Failed to fetch GitHub repo data');\n }\n\n const data = await response.json();\n return data;\n } catch (error) {\n // AbortError는 정상적인 cleanup이므로 무시\n if (error instanceof Error && error.name === 'AbortError') {\n return null;\n }\n console.error('Error fetching GitHub repo data:', error);\n return null;\n }\n};\n\n// Figma 파일 정보 추출 함수\nconst extractFigmaData = (url: string): FigmaData | null => {\n try {\n const parsedUrl = new URL(url);\n if (parsedUrl.hostname.includes('figma.com')) {\n // URL에서 파일 이름 추출\n const pathSegments = parsedUrl.pathname.split('/');\n const fileSegment = pathSegments.find((segment) =>\n segment.includes('file')\n );\n\n if (!fileSegment) return null;\n\n // URL 경로에서 파일 이름 추출 (/file/ID/NAME 형식)\n let fileName = '';\n if (pathSegments.length > 3) {\n const encodedName = pathSegments[3];\n if (encodedName) {\n fileName = decodeURIComponent(encodedName).replace(/-/g, ' ');\n }\n }\n\n // 파일 이름이 추출되지 않았으면 URL에서 직접 찾기\n if (!fileName && parsedUrl.pathname.includes('-')) {\n const nameMatch = parsedUrl.pathname.match(/\\/([^/]+)(?:\\?|$)/);\n if (nameMatch?.[1]) {\n fileName = decodeURIComponent(nameMatch[1].replace(/-/g, ' '));\n }\n }\n\n fileName = fileName || 'Figma Design';\n\n return {\n name: fileName,\n url: url,\n thumbnailUrl: 'https://static.figma.com/app/icon/1/favicon.svg',\n };\n }\n return null;\n } catch (error) {\n console.error('Error parsing Figma URL:', error);\n return null;\n }\n};\n\n// GitHub URL에서 레포지토리 경로 추출\nconst extractRepoPathFromUrl = (url: string): string | null => {\n try {\n const parsedUrl = new URL(url);\n if (parsedUrl.hostname === 'github.com') {\n // URL 경로에서 첫 번째 '/'를 제거하고 나머지 경로 반환\n const path = parsedUrl.pathname.substring(1);\n // 레포지토리 경로는 일반적으로 'username/repo-name' 형식\n const pathParts = path.split('/');\n if (pathParts.length >= 2) {\n return `${pathParts[0]}/${pathParts[1]}`;\n }\n }\n return null;\n } catch (error) {\n console.error('Error parsing URL:', error);\n return null;\n }\n};\n\n// URL이 어떤 타입의 링크인지 확인\nconst getLinkType = (url: string): 'github' | 'figma' | 'unknown' => {\n try {\n const parsedUrl = new URL(url);\n if (parsedUrl.hostname === 'github.com') {\n return 'github';\n } else if (parsedUrl.hostname.includes('figma.com')) {\n return 'figma';\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n};\n\n// 월 이름 배열을 모듈 스코프로 이동 - 매 호출마다 재생성 방지\nconst MONTH_NAMES = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n] as const;\n\n// 날짜 포맷팅 함수\nconst formatUpdatedTime = (dateString: string): string => {\n const date = new Date(dateString);\n const now = new Date();\n const diffInHours = Math.floor(\n (now.getTime() - date.getTime()) / (1000 * 60 * 60)\n );\n\n if (diffInHours < 24) {\n return `Updated ${diffInHours} hours ago`;\n }\n\n const diffInDays = Math.floor(diffInHours / 24);\n if (diffInDays === 1) {\n return 'Updated yesterday';\n }\n if (diffInDays < 30) {\n return `Updated ${diffInDays} days ago`;\n }\n\n return `Updated on ${MONTH_NAMES[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;\n};\n\n// ============ 서브 컴포넌트 ============\n\ninterface FigmaPreviewProps {\n data: FigmaData;\n}\n\nconst FigmaPreview = memo(({ data }: FigmaPreviewProps) => (\n <div className={styles.preview}>\n <div className={styles.iconContainer}>\n <img\n src={data.thumbnailUrl || 'https://static.figma.com/app/icon/1/favicon.svg'}\n alt=\"Figma icon\"\n className={styles.icon}\n />\n </div>\n <div className={styles.content}>\n <div className={styles.title}>{data.name}</div>\n <div className={styles.description}>www.figma.com</div>\n </div>\n </div>\n));\n\nFigmaPreview.displayName = 'FigmaPreview';\n\ninterface GitHubPreviewProps {\n repoData: RepoData | null;\n repoName: string;\n updatedTimeText: string;\n loading: boolean;\n}\n\nconst GitHubPreview = memo(({ repoData, repoName, updatedTimeText, loading }: GitHubPreviewProps) => (\n <div className={`${styles.preview} ${styles.githubPreview}`}>\n <div className={styles.iconContainer}>\n <img\n src={\n repoData?.owner?.avatar_url ||\n 'https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png'\n }\n alt=\"Repository icon\"\n className={styles.icon}\n />\n </div>\n <div className={`${styles.content} ${styles.githubContent}`}>\n <div className={styles.title}>{repoName}</div>\n <div className={styles.description}>\n {loading ? 'Loading...' : `${repoName} • ${updatedTimeText}`}\n </div>\n </div>\n </div>\n));\n\nGitHubPreview.displayName = 'GitHubPreview';\n\ninterface DefaultPreviewProps {\n url: string;\n}\n\nconst DefaultPreview = memo(({ url }: DefaultPreviewProps) => (\n <div className={styles.preview}>\n <div className={styles.content}>\n <div className={styles.title}>{url}</div>\n </div>\n </div>\n));\n\nDefaultPreview.displayName = 'DefaultPreview';\n\n// ============ 메인 컴포넌트 ============\n\nexport interface LinkPreviewProps {\n url: string;\n}\n\nconst LinkPreview = ({ url }: LinkPreviewProps) => {\n const [repoData, setRepoData] = useState<RepoData | null>(null);\n const [figmaData, setFigmaData] = useState<FigmaData | null>(null);\n const [loading, setLoading] = useState(true);\n const [linkType, setLinkType] = useState<'github' | 'figma' | 'unknown'>(\n 'unknown'\n );\n\n useEffect(() => {\n const abortController = new AbortController();\n\n const loadLinkData = async () => {\n setLoading(true);\n const type = getLinkType(url);\n setLinkType(type);\n\n if (type === 'github') {\n const repoPath = extractRepoPathFromUrl(url);\n if (repoPath) {\n const data = await fetchGitHubRepoData(repoPath, abortController.signal);\n // 취소된 요청이면 state 업데이트 하지 않음\n if (!abortController.signal.aborted) {\n setRepoData(data);\n }\n }\n } else if (type === 'figma') {\n const data = extractFigmaData(url);\n if (!abortController.signal.aborted) {\n setFigmaData(data);\n }\n }\n\n if (!abortController.signal.aborted) {\n setLoading(false);\n }\n };\n\n loadLinkData();\n\n // Cleanup: 컴포넌트 언마운트 또는 url 변경 시 요청 취소\n return () => {\n abortController.abort();\n };\n }, [url]);\n\n // 레포지토리 이름 추출 (full_name에서 organization/repo 형식)\n const repoName =\n repoData?.name ||\n extractRepoPathFromUrl(url)?.split('/')[1] ||\n 'Repository';\n\n // 업데이트 시간 포맷팅\n const updatedTimeText = repoData?.updated_at\n ? formatUpdatedTime(repoData.updated_at)\n : '';\n\n const renderPreview = () => {\n if (linkType === 'figma' && figmaData) {\n return <FigmaPreview data={figmaData} />;\n }\n if (linkType === 'github') {\n return (\n <GitHubPreview\n repoData={repoData}\n repoName={repoName}\n updatedTimeText={updatedTimeText}\n loading={loading}\n />\n );\n }\n return <DefaultPreview url={url} />;\n };\n\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.link}\n >\n {renderPreview()}\n </a>\n );\n};\n\nexport default LinkPreview;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/LinkPreview/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7WUwZLaMAyG7_sUvnSmezBDgO120uO-QKc99Mg4sUIEjpXagoTt9N07djAku9By6SkTyZY-_ZY083w04NcG7W69pqxdNtlc_HoQgqFnqaEkpxjJ5sKShS8PQmj0rVHHXBSGyl2wtEprtBvJ1ObioNxHKX2rymDqe79e-5_L7a7Inh_HhwtipuZf538_zE6ErYMDQpcgswh5ZqkM9CF6QU6Dy0XW9sKTQX2KX5Ih5-XgThlWj5cr0imNe594BuO3aJONPjNV8QodwFWGulzUqDXYYGOnrMdBqoJ66WulqRPz2cILUD5KpwxurESGxueiBMvgRpK81aJQHs6JVUy8Ue8UHsEVfxUsrwN2lO3Cd44W_yal7ibRSrIMllO0xXX5wzcXmciE2jMli9TooBykKcnsG3tdxEs2LMm-kGWFNjzXkHN5PecNUbd7z1gd5Ql87OpQc52LxezJQRMMNeCm5rElYvvaod3lYv4WLRGtItEpXDaffxgHS_9UbKFkWWFgGGq6r-18c34LmLwFIxtIDE-RoSLL0uMrpEh8bGnjVFsfZfB9x1eYNNQh9lO81p2Ar178EZ3SQ4MFmUt3LOL9OFb5dMbC4jgfuz0uYb1cHGAMth59fJ4aGWJ_Q9g6nVPtuHoNvnTYhnZKGny6X4PLfuGbFXgoyWrljuno8j-UsUGu98XX6ZA-x0Ia1cvURatTQ6a1aaDiu1fAkONlOrqfY4534xFBZQHcQZzFPykHOzkaBgAA';\nexport var content = 'styles_content__o1p3m12';\nexport var description = 'styles_description__o1p3m16';\nexport var githubContent = 'styles_githubContent__o1p3m18';\nexport var githubPreview = 'styles_githubPreview__o1p3m17';\nexport var icon = 'styles_icon__o1p3m14';\nexport var iconContainer = 'styles_iconContainer__o1p3m13';\nexport var link = 'styles_link__o1p3m10';\nexport var preview = 'styles_preview__o1p3m11';\nexport var title = 'styles_title__o1p3m15';","import { memo } from 'react';\nimport {\n MemoizedRichText,\n MemoizedImage,\n MemoizedBookmark,\n MemoizedLinkPreview,\n} from '../MemoizedComponents';\nimport { CodeBlock } from '../Code';\nimport { Heading1, Heading2, Heading3, Paragraph } from '../Typography';\nimport { ColumnList } from '../Column';\nimport { Quote } from '../Quote';\nimport Table from '../Table';\nimport { Toggle } from '../Toggle';\nimport { Video } from '../Video';\nimport { NotionBlock } from '../../../../types';\n\nexport interface Props {\n block: NotionBlock;\n isColumn?: boolean;\n}\n\nconst BlockRenderer = memo(({ block, isColumn = false }: Props) => {\n if (!block) return null;\n\n switch (block.type) {\n case 'link_preview':\n return <MemoizedLinkPreview url={block.link_preview.url} />;\n case 'paragraph':\n return (\n <Paragraph>\n <MemoizedRichText richTexts={block.paragraph.rich_text} />\n </Paragraph>\n );\n\n case 'heading_1':\n return (\n <Heading1>\n <MemoizedRichText richTexts={block.heading_1.rich_text} />\n </Heading1>\n );\n\n case 'heading_2':\n return (\n <Heading2>\n <MemoizedRichText richTexts={block.heading_2.rich_text} />\n </Heading2>\n );\n\n case 'heading_3':\n return (\n <Heading3>\n <MemoizedRichText richTexts={block.heading_3.rich_text} />\n </Heading3>\n );\n\n case 'code':\n return (\n <div>\n <CodeBlock\n code={block.code.rich_text[0]?.text?.content || ''}\n language={block.code.language}\n caption={block.code.caption}\n />\n </div>\n );\n\n case 'image':\n return (\n <figure>\n <MemoizedImage\n src={block.image.file?.url || block.image.external?.url || ''}\n alt={block.image.caption?.[0]?.plain_text || ''}\n caption={block.image.caption}\n format={block.image.format}\n isColumn={isColumn}\n />\n </figure>\n );\n\n case 'bookmark':\n return (\n <MemoizedBookmark\n url={block.bookmark.url}\n metadata={block.bookmark.metadata}\n />\n );\n\n case 'column_list':\n return <ColumnList block={block} />;\n\n case 'column':\n // 개별 column은 ColumnList에서 처리됩니다\n return null;\n\n case 'quote':\n return <Quote richTexts={block.quote.rich_text} />;\n\n case 'table':\n return <Table block={block} />;\n\n case 'toggle':\n return <Toggle block={block} />;\n\n case 'video':\n return <Video block={block} />;\n\n default:\n return null;\n }\n});\n\nBlockRenderer.displayName = 'BlockRenderer';\n\nexport default BlockRenderer;\n","import { ReactNode, useMemo, memo } from 'react';\nimport { codeBlock } from './styles.css';\nimport Prism, { Grammar, Token } from 'prismjs';\nimport { MemoizedRichText } from '../MemoizedComponents';\nimport { RichTextItem } from '../RichText/RichTexts';\n\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-jsx';\nimport 'prismjs/components/prism-tsx';\n\nif (typeof window !== 'undefined') {\n window.Prism = Prism;\n}\n\nconst renderToken = (token: string | Token, i: number): ReactNode => {\n if (typeof token === 'string') {\n return <span key={i}>{token}</span>;\n }\n\n const content = token.content;\n let tokenContent: ReactNode;\n\n if (Array.isArray(content)) {\n tokenContent = content.map((subToken, j) => renderToken(subToken, j));\n } else if (typeof content === 'object' && content !== null) {\n tokenContent = renderToken(content as Token, 0);\n } else {\n tokenContent = content;\n }\n\n return (\n <span key={i} className={`token ${token.type}`}>\n {tokenContent}\n </span>\n );\n};\n\nexport interface Props {\n code: string;\n language: string;\n caption?: RichTextItem[];\n}\n\nconst CodeBlock = memo(({ code, language, caption }: Props) => {\n const tokens = useMemo(() => {\n const prismLanguage =\n Prism.languages[language] || Prism.languages.plaintext;\n return Prism.tokenize(code, prismLanguage as Grammar);\n }, [code, language]);\n\n return (\n <>\n <pre className={`${codeBlock} language-${language}`}>\n <code className={`language-${language}`}>\n {tokens.map((token, i) => renderToken(token, i))}\n </code>\n </pre>\n {caption && caption.length > 0 && (\n <figcaption>\n <MemoizedRichText richTexts={caption} />\n </figcaption>\n )}\n </>\n );\n});\n\nCodeBlock.displayName = 'CodeBlock';\n\nexport default CodeBlock;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Code/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb2RlQmxvY2tfXzFxbjQyeWMwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvcnMtY29kZS1iYWNrZ3JvdW5kX19zcTNqa2I1KTsKICBjb2xvcjogdmFyKC0tY29sb3JzLWNvZGUtdGV4dF9fc3EzamtiNik7CiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy1tZF9fc3EzamtiMWIpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclJhZGl1cy1tZF9fc3EzamtiMWYpOwogIG92ZXJmbG93OiBhdXRvOwogIGZvbnQtZmFtaWx5OiB2YXIoLS10eXBvZ3JhcGh5LWZvbnRGYW1pbHktY29kZV9fc3Ezamticyk7CiAgbGluZS1oZWlnaHQ6IHZhcigtLXR5cG9ncmFwaHktbGluZUhlaWdodC1yZWxheGVkX19zcTNqa2IxNik7CiAgbWFyZ2luOiB2YXIoLS1zcGFjaW5nLXNtX19zcTNqa2IxOSkgMDsKfQ';\nexport var codeBlock = 'styles_codeBlock__1qn42yc0';","import { HTMLAttributes, PropsWithChildren, memo } from 'react';\nimport { paragraph, heading1, heading2, heading3 } from './styles.css';\n\ntype TypographyProps = PropsWithChildren<HTMLAttributes<HTMLElement>>;\n\nexport const Paragraph = memo(({ children, ...props }: TypographyProps) => {\n return (\n <p className={paragraph} {...props}>\n {children}\n </p>\n );\n});\n\nParagraph.displayName = 'Paragraph';\n\nexport const Heading1 = memo(({ children, ...props }: TypographyProps) => {\n return (\n <h1 className={heading1} {...props}>\n {children}\n </h1>\n );\n});\n\nHeading1.displayName = 'Heading1';\n\nexport const Heading2 = memo(({ children, ...props }: TypographyProps) => {\n return (\n <h2 className={heading2} {...props}>\n {children}\n </h2>\n );\n});\n\nHeading2.displayName = 'Heading2';\n\nexport const Heading3 = memo(({ children, ...props }: TypographyProps) => {\n return (\n <h3 className={heading3} {...props}>\n {children}\n </h3>\n );\n});\n\nHeading3.displayName = 'Heading3';\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Typography/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA82VvW6DMBSFd57CYxkc8aOoDXmBzu3QERl8AbcGu7aTQKq-e4VTk5A0qB1SMeLj43t8PksstOk46FQSRUpFZJWmq4CslmWAPjyEcsGFStCWqDuM7YfGBlqTpvo9fn3LQn_tIcRZA7gCVlbG7TWdFPa8DvfqoxVxRjQM1qX1SkIpa0rn05LkrClxq4d9D_65diLe20MK0Ris2R5-GN9rz2wPo-Hbo213LXevvhxyN0LVhA9DA-veVcyADQUJkgrwThG59j69xdVOk0LkG423TLOMg21YbExfUIIi2SItOKPjtqViNVGdmx3Z0d8mLIpCg7HefjkTioLCilC20e5Gh8Unu4Z1PVwC_NOsFZAeQ-iihv-E_1fkqtC52r9xywSnw8B48r0d6VIfBWdqfTwlm65t9oQjFzWaFeHIubpbEeblsC-_JHxS22q6ttkTjl3UeFaEY-fa34rwKBq5ZDz6p0wWNzvGXy21e5-nBwAA';\nexport var heading1 = 'styles_heading1__90a95g1';\nexport var heading2 = 'styles_heading2__90a95g2';\nexport var heading3 = 'styles_heading3__90a95g3';\nexport var paragraph = 'styles_paragraph__90a95g0';","import { memo } from 'react';\nimport { ColumnBlock } from '../../../../types';\nimport BlockRenderer from '../Block/BlockRenderer';\nimport { columnContainer } from './styles.css';\n\nexport interface ColumnProps {\n block: ColumnBlock;\n}\n\nconst Column = memo(({ block }: ColumnProps) => {\n if (!block || !block.children) return null;\n\n return (\n <div className={columnContainer}>\n {block.children.map((childBlock) => (\n <BlockRenderer key={childBlock.id} block={childBlock} isColumn />\n ))}\n </div>\n );\n});\n\nColumn.displayName = 'Column';\n\nexport default Column;\n","import 'src/components/Renderer/components/Column/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb2x1bW5Db250YWluZXJfX3dsZTZ3ZTAgewogIGZsZXg6IDE7CiAgbWluLXdpZHRoOiAwOwp9Ci5zdHlsZXNfY29sdW1uTGlzdENvbnRhaW5lcl9fd2xlNndlMSB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogcm93OwogIGdhcDogMXJlbTsKICBtYXJnaW4tYm90dG9tOiAxcmVtOwogIHdpZHRoOiAxMDAlOwp9CkBtZWRpYSAobWF4LXdpZHRoOiA0MjBweCkgewogIC5zdHlsZXNfY29sdW1uTGlzdENvbnRhaW5lcl9fd2xlNndlMSB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIH0KfQ';\nexport var columnContainer = 'styles_columnContainer__wle6we0';\nexport var columnListContainer = 'styles_columnListContainer__wle6we1';","import { memo } from 'react';\nimport Column from './Column';\nimport { columnListContainer } from './styles.css';\nimport { ColumnListBlock } from '../../../../types';\n\nexport interface ColumnListProps {\n block: ColumnListBlock;\n}\n\nconst ColumnList = memo(({ block }: ColumnListProps) => {\n if (!block || !block.children) return null;\n\n return (\n <div className={columnListContainer}>\n {block.children.map((column) => (\n <Column key={column.id} block={column} />\n ))}\n </div>\n );\n});\n\nColumnList.displayName = 'ColumnList';\n\nexport default ColumnList;\n","import { memo } from 'react';\nimport { MemoizedRichText } from '../MemoizedComponents';\nimport { container } from './styles.css';\nimport { RichTextItem } from '../RichText/RichTexts';\n\nexport interface QuoteProps {\n richTexts: RichTextItem[];\n tabIndex?: number;\n}\n\nconst Quote = memo(({ richTexts, tabIndex }: QuoteProps) => {\n return (\n <blockquote className={container} tabIndex={tabIndex}>\n <MemoizedRichText richTexts={richTexts} />\n </blockquote>\n );\n});\n\nQuote.displayName = 'Quote';\n\nexport default Quote;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Quote/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb250YWluZXJfX21yYTluMCB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG1hcmdpbjogdmFyKC0tc3BhY2luZy14c19fc3EzamtiMTgpIDA7CiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy14c19fc3EzamtiMTgpIDAgdmFyKC0tc3BhY2luZy14c19fc3EzamtiMTgpIDFyZW07CiAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZTFlMWUxOwogIGNvbG9yOiB2YXIoLS1jb2xvcnMtdGV4dF9fc3EzamtiMSk7CiAgZm9udC1zaXplOiB2YXIoLS10eXBvZ3JhcGh5LWZvbnRTaXplLWJhc2VfX3NxM2prYnYpOwogIGxpbmUtaGVpZ2h0OiB2YXIoLS10eXBvZ3JhcGh5LWxpbmVIZWlnaHQtYmFzZV9fc3EzamtiMTUpOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQ';\nexport var container = 'styles_container__mra9n0';","import { memo } from 'react';\nimport { tableContainer, table, headerCell } from './styles.css';\nimport TableRow from './TableRow';\nimport { TableBlock } from '../../../../types';\n\ninterface TableProps {\n block: TableBlock;\n}\n\nconst Table = memo(({ block }: TableProps) => {\n if (!block.table || !block.children) {\n return null;\n }\n\n const { table_width, has_column_header, has_row_header } = block.table;\n const rows =\n block.children?.filter((child) => child.type === 'table_row') || [];\n\n return (\n <div className={tableContainer}>\n <table className={table}>\n {rows.length > 0 && (\n <>\n {has_column_header && rows[0] && (\n <thead>\n <TableRow rowBlock={rows[0]} cellClassName={headerCell} />\n </thead>\n )}\n <tbody>\n {/* 유효한 row만 매핑하도록 필터링 추가 */}\n {rows\n .filter((row) => row !== undefined && row.type === 'table_row')\n .map((row, rowIndex: number) => {\n // 열 헤더가 있고 첫 번째 행이면 이미 thead에서 렌더링되었으므로 건너뜁니다\n if (has_column_header && rowIndex === 0) {\n return null;\n }\n\n return (\n <TableRow\n key={row.id}\n rowBlock={row}\n rowHeaderIndex={has_row_header ? 0 : -1}\n />\n );\n })}\n </tbody>\n </>\n )}\n </table>\n </div>\n );\n});\n\nTable.displayName = 'Table';\n\nexport default Table;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Table/styles.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7VSy27bMBC8-ysIFAUSwDQkO86DOebSc3roUaDElbQJxVXJtfwo-u-FZElhkrZBD70Rs7vD2ZldBT5aCBnr3MIDOdbowGdZ6rv8VFIifiyE2KPhWok0ST7fL4RotK_QSaZWiU77CylDqwt0lTyELAvfN0_PeXp7GbXmxEzNh905eQNeem1wF6buM_g4YDI08wgMI9SBLy3tlajRGHD3i5-LVbzTvEr6u1XGHwuyVrcBlJheUXGUq0TSgyU5lgFPMOnjY0uV1219lH3tK55AhkZbOyndDUILsuSVQFeDR45l1qAN-AfoJ0at60FrrovnytPOGTlOfypvyutyM-vYA1Y1_0HJt6EoAzSYkzWzcevLdya9-nwzfN5SQEZySniwmrEbLGm1MYMXf0nyTS2K7O58E-hkPQpfe2herFYibQ8ikEUjfJXri-12Kbabpbi6WYpkldzFV2KhZCUcuTgrf6ad0A48Y6Gt1BYrpwRT28MMB56gnqbHdqGPGiwUrIaG2KQSfeBXJl2dE4qlfKz9hdDqN3zbmG_c4l8Iax0eaf9lOKWZ9Pq_n9EvZDpjHT8EAAA';\nexport var firstCell = 'styles_firstCell__1rvbzfo4';\nexport var hasRowHeader = 'styles_hasRowHeader__1rvbzfo6';\nexport var headerCell = 'styles_headerCell__1rvbzfo2';\nexport var lastCell = 'styles_lastCell__1rvbzfo5';\nexport var table = 'styles_table__1rvbzfo1';\nexport var tableCell = 'styles_tableCell__1rvbzfo3';\nexport var tableContainer = 'styles_tableContainer__1rvbzfo0';","import { memo } from 'react';\nimport { tableCell, firstCell, lastCell, hasRowHeader } from './styles.css';\nimport { MemoizedRichText } from '../MemoizedComponents';\nimport { TableRowBlock } from '../../../../types';\nimport { RichTextItem } from '../RichText/RichTexts';\n\ninterface TableRowProps {\n rowBlock: TableRowBlock;\n cellClassName?: string;\n rowHeaderIndex?: number;\n}\n\nconst TableRow = memo(({\n rowBlock,\n cellClassName = '',\n rowHeaderIndex = -1,\n}: TableRowProps) => {\n if (!rowBlock.table_row?.cells) {\n return null;\n }\n\n const { cells } = rowBlock.table_row;\n\n return (\n <tr>\n {cells.map((cell: RichTextItem[], index: number) => {\n const isFirstCell = index === 0;\n const isLastCell = index === cells.length - 1;\n const isRowHeader = index === rowHeaderIndex;\n\n let cellClasses = [tableCell, cellClassName];\n\n if (isFirstCell) cellClasses.push(firstCell);\n if (isLastCell) cellClasses.push(lastCell);\n if (isRowHeader) cellClasses.push(hasRowHeader);\n\n return (\n <td\n key={`${rowBlock.id}-cell-${index}`}\n className={cellClasses.filter(Boolean).join(' ')}\n >\n <MemoizedRichText richTexts={cell} />\n </td>\n );\n })}\n </tr>\n );\n});\n\nTableRow.displayName = 'TableRow';\n\nexport default TableRow;\n","import Table from './Table';\nexport { default as TableRow } from './TableRow';\nexport default Table;\n","import { useState, KeyboardEvent } from 'react';\nimport { ToggleBlock } from '../../../../types';\nimport {\n toggleContainer,\n toggleHeader,\n toggleIcon,\n toggleIconOpen,\n toggleContent,\n} from './styles.css';\nimport { RichTexts } from '../../components/RichText';\nimport BlockRenderer from '../../components/Block/BlockRenderer';\n\ninterface ToggleProps {\n block: ToggleBlock;\n}\n\nconst Toggle = ({ block }: ToggleProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Toggle이 없거나 children이 없는 경우 렌더링하지 않음\n if (!block.toggle || !block.children) {\n return null;\n }\n\n const handleToggle = () => {\n setIsOpen(!isOpen);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n };\n\n return (\n <div className={toggleContainer}>\n <div\n className={toggleHeader}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n role=\"button\"\n aria-expanded={isOpen}\n >\n <span className={`${toggleIcon} ${isOpen ? toggleIconOpen : ''}`}>\n ▶\n </span>\n <RichTexts richTexts={block.toggle.rich_text} />\n </div>\n\n {isOpen && block.children && (\n <div className={toggleContent}>\n {block.children.map((childBlock) => (\n <BlockRenderer key={childBlock.id} block={childBlock} />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default Toggle;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Toggle/styles.css.ts.vanilla.css?source=LnN0eWxlc190b2dnbGVDb250YWluZXJfX3A3dWUxejAgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQouc3R5bGVzX3RvZ2dsZUhlYWRlcl9fcDd1ZTF6MSB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXNpemU6IHZhcigtLXR5cG9ncmFwaHktZm9udFNpemUtYmFzZV9fc3Ezamtidik7CiAgZm9udC13ZWlnaHQ6IHZhcigtLXR5cG9ncmFwaHktZm9udFdlaWdodC1ub3JtYWxfX3NxM2prYjEwKTsKICBjb2xvcjogaW5oZXJpdDsKICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLXhzX19zcTNqa2IxOCkgMDsKICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSYWRpdXMtc21fX3NxM2prYjFlKTsKfQouc3R5bGVzX3RvZ2dsZUhlYWRlcl9fcDd1ZTF6MTpob3ZlciB7CiAgYmFja2dyb3VuZDogcmdiYSg1NSwgNTMsIDQ3LCAwLjA4KTsKfQouc3R5bGVzX3RvZ2dsZUljb25fX3A3dWUxejIgewogIG1hcmdpbi1yaWdodDogdmFyKC0tc3BhY2luZy1zbV9fc3EzamtiMTkpOwogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgZWFzZTsKfQouc3R5bGVzX3RvZ2dsZUljb25PcGVuX19wN3VlMXozIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7Cn0KLnN0eWxlc190b2dnbGVDb250ZW50X19wN3VlMXo0IHsKICBwYWRkaW5nLWxlZnQ6IHZhcigtLXNwYWNpbmctbGdfX3NxM2prYjFjKTsKICBtYXJnaW4tdG9wOiB2YXIoLS1zcGFjaW5nLXhzX19zcTNqa2IxOCk7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQ';\nexport var toggleContainer = 'styles_toggleContainer__p7ue1z0';\nexport var toggleContent = 'styles_toggleContent__p7ue1z4';\nexport var toggleHeader = 'styles_toggleHeader__p7ue1z1';\nexport var toggleIcon = 'styles_toggleIcon__p7ue1z2';\nexport var toggleIconOpen = 'styles_toggleIconOpen__p7ue1z3';","import { memo } from 'react';\nimport { VideoBlock } from '../../../../types';\nimport { RichTextItem } from '../RichText/RichTexts'; // Caption을 위해 추가\nimport { videoContainer, videoPlayer, videoCaption } from './styles.css'; // 스타일 임포트\n\ninterface VideoProps {\n block: VideoBlock;\n}\n\nconst Video = memo(({ block }: VideoProps) => {\n if (block.type !== 'video' || !block.video) {\n return null;\n }\n\n const { type, external, caption } = block.video;\n\n let videoUrl = '';\n // TODO: 'file' 타입 비디오 처리 (Notion 내부 업로드 비디오)\n if (type === 'external') {\n videoUrl = getVideoEmbedUrl(external?.url);\n }\n\n if (!videoUrl) {\n return <p>비디오를 불러올 수 없습니다.</p>;\n }\n\n return (\n <div className={videoContainer}>\n {videoUrl.includes('youtube.com/embed/') ? (\n <iframe\n className={videoPlayer}\n src={videoUrl}\n title=\"YouTube video player\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n ></iframe>\n ) : (\n <p>\n 외부 비디오 링크:{' '}\n <a href={videoUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {videoUrl}\n </a>\n </p>\n )}\n {caption && caption.length > 0 && (\n <figcaption className={videoCaption}>\n {caption.map((c: RichTextItem, i: number) => (\n <span key={i}>{c.plain_text}</span>\n ))}\n </figcaption>\n )}\n </div>\n );\n});\n\nVideo.displayName = 'Video';\n\n// 정규식을 모듈 스코프에 정의하여 매번 생성하지 않도록 최적화\nconst YOUTUBE_SHORT_URL_REGEX = /youtu\\.be\\/([a-zA-Z0-9_-]+)/;\nconst YOUTUBE_WATCH_URL_REGEX = /youtube\\.com\\/watch\\?v=([a-zA-Z0-9_-]+)/;\n\nconst getVideoEmbedUrl = (url?: string): string => {\n if (!url) return '';\n\n // YouTube 짧은 URL (youtu.be)\n const shortMatch = url.match(YOUTUBE_SHORT_URL_REGEX);\n if (shortMatch?.[1]) {\n return `https://www.youtube.com/embed/${shortMatch[1]}`;\n }\n\n // YouTube 일반 URL (youtube.com/watch?v=)\n const watchMatch = url.match(YOUTUBE_WATCH_URL_REGEX);\n if (watchMatch?.[1]) {\n return `https://www.youtube.com/embed/${watchMatch[1]}`;\n }\n\n // 다른 외부 비디오 URL\n return url;\n};\n\nexport default Video;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/components/Video/styles.css.ts.vanilla.css?source=LnN0eWxlc192aWRlb0NvbnRhaW5lcl9fMTViOXZrYjAgewogIG1hcmdpbjogMTBweCAwOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwp9Ci5zdHlsZXNfdmlkZW9QbGF5ZXJfXzE1Yjl2a2IxIHsKICB3aWR0aDogMTAwJTsKICBhc3BlY3QtcmF0aW86IDE2IC8gOTsKICBib3JkZXI6IG5vbmU7Cn0KLnN0eWxlc192aWRlb0NhcHRpb25fXzE1Yjl2a2IyIHsKICBtYXJnaW4tdG9wOiB2YXIoLS1zcGFjaW5nLXNtX19zcTNqa2IxOSk7CiAgZm9udC1zaXplOiB2YXIoLS10eXBvZ3JhcGh5LWZvbnRTaXplLXNtYWxsX19zcTNqa2J1KTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IDEwMCU7CiAgY29sb3I6IHZhcigtLWNvbG9ycy1zZWNvbmRhcnlfX3NxM2prYjMpOwp9';\nexport var videoCaption = 'styles_videoCaption__15b9vkb2';\nexport var videoContainer = 'styles_videoContainer__15b9vkb0';\nexport var videoPlayer = 'styles_videoPlayer__15b9vkb1';","import { Heading1 } from '../Renderer/components/Typography';\n\ninterface Props {\n title: string;\n}\nconst Title = ({ title }: Props) => {\n return <Heading1>{title}</Heading1>;\n};\n\nexport default Title;\n","import 'src/components/Cover/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb3ZlckNvbnRhaW5lcl9fcDBjcDhkMCB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHdpZHRoOiAxMDAlOwogIG1heC13aWR0aDogNTYuMjVyZW07CiAgaGVpZ2h0OiAzMHZoOwogIG1hcmdpbjogMCBhdXRvOwogIGJvcmRlci1yYWRpdXM6IDEuNXJlbTsKICBvdmVyZmxvdzogaGlkZGVuOwogIGJveC1zaGFkb3c6IDJweCAycHggOHB4IDRweCBoc2xhKDAsMCUsNiUsLjEpOwp9Ci5zdHlsZXNfc2tlbGV0b25XcmFwcGVyX19wMGNwOGQxIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwOwogIGxlZnQ6IDA7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIHotaW5kZXg6IDE7CiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2U7Cn0KLnN0eWxlc19za2VsZXRvbldyYXBwZXJfaXNMb2FkZWRfdHJ1ZV9fcDBjcDhkMiB7CiAgb3BhY2l0eTogMDsKfQouc3R5bGVzX3NrZWxldG9uV3JhcHBlcl9pc0xvYWRlZF9mYWxzZV9fcDBjcDhkMyB7CiAgb3BhY2l0eTogMTsKfQouc3R5bGVzX2ltYWdlU3R5bGVfX3AwY3A4ZDQgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICBvYmplY3QtZml0OiBjb3ZlcjsKICBvYmplY3QtcG9zaXRpb246IGNlbnRlciA1MCU7CiAgZGlzcGxheTogYmxvY2s7CiAgei1pbmRleDogMjsKICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZTsKfQouc3R5bGVzX2ltYWdlU3R5bGVfaXNMb2FkZWRfdHJ1ZV9fcDBjcDhkNSB7CiAgb3BhY2l0eTogMTsKfQouc3R5bGVzX2ltYWdlU3R5bGVfaXNMb2FkZWRfZmFsc2VfX3AwY3A4ZDYgewogIG9wYWNpdHk6IDA7Cn0KQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgLnN0eWxlc19jb3ZlckNvbnRhaW5lcl9fcDBjcDhkMCB7CiAgICBib3JkZXItcmFkaXVzOiAwLjVyZW07CiAgICBoZWlnaHQ6IDI1dmg7CiAgfQp9';\nimport { createRuntimeFn as _7a468 } from '@vanilla-extract/recipes/createRuntimeFn';\nexport var coverContainer = 'styles_coverContainer__p0cp8d0';\nexport var imageStyle = _7a468({defaultClassName:'styles_imageStyle__p0cp8d4',variantClassNames:{isLoaded:{true:'styles_imageStyle_isLoaded_true__p0cp8d5',false:'styles_imageStyle_isLoaded_false__p0cp8d6'}},defaultVariants:{isLoaded:false},compoundVariants:[]});\nexport var skeletonWrapper = _7a468({defaultClassName:'styles_skeletonWrapper__p0cp8d1',variantClassNames:{isLoaded:{true:'styles_skeletonWrapper_isLoaded_true__p0cp8d2',false:'styles_skeletonWrapper_isLoaded_false__p0cp8d3'}},defaultVariants:{isLoaded:false},compoundVariants:[]});","import { coverContainer, skeletonWrapper, imageStyle } from './styles.css';\nimport Skeleton from '../Skeleton';\nimport { useImageLoad } from '../../hooks/useImageLoad';\n\ninterface Props {\n src: string;\n alt: string;\n}\n\n/**\n * 노션 페이지 상단에 표시되는 커버 이미지 컴포넌트\n * 이미지 로딩 중에는 스켈레톤 UI를 표시하고, 로딩 완료 시 자연스럽게 이미지로 전환됩니다.\n */\nconst Cover = ({ src, alt }: Props) => {\n const { isLoaded, imgRef, handleLoad } = useImageLoad(src);\n\n return (\n <div className={coverContainer}>\n <div className={skeletonWrapper({ isLoaded })}>\n <Skeleton variant=\"image\" isLoading={!isLoaded} />\n </div>\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n className={imageStyle({ isLoaded })}\n onLoad={handleLoad}\n loading=\"lazy\"\n />\n </div>\n );\n};\n\nexport default Cover;\n","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nimport 'src/components/Renderer/styles.css.ts.vanilla.css?source=LnN0eWxlc19jb250YWluZXJfX2VwdmE1dTAgewogIG1heC13aWR0aDogNzIwcHg7CiAgbWFyZ2luOiAwIGF1dG87CiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy14bF9fc3EzamtiMWQpOwp9CkBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkgewogIC5zdHlsZXNfY29udGFpbmVyX19lcHZhNXUwIHsKICAgIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctbWRfX3NxM2prYjFiKTsKICB9Cn0';\nexport var container = 'styles_container__epva5u0';","import 'src/styles/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAA-2XT4-jNhiH7_sprOXSSiHyPwy4p5CAeuhediv1uDLBkzABzJqkk2zV775yMhAIDjOVtrdkRtFIeX7w2u-L88x8v5Wl_Frkm-3-z_OfX5tv5HmXohL88wEA192farXRot6e3CdV7RNR5sXJTUXToZqDvNpKne9_m0isVdYlGg6-JJ9UpdzPcnMohJ6BpaoaVYhmBj7-kadSi32uKmCYjzPwSVaFmoFSVaqpxVpa7_Ml_y7dY9PeY88BnPueluV9uilFUbSBgwkEbyT66_6bAzQJF0JvOvqFAzTH01ffopY-coCnUdyiJ3PhN65LWvj7dBV_STMIbqV0KbqNQZADCuFUoJRZfii7AOLAmw40ssxTVWRdBHPApiMDnHDgW_Air-TvF3xv3jueXtY9Fei3FnnnTZ3CtSzEUV4rYibhv0bMlObVxj1e5xH5Zr5Qb-876MoEhrEgzXVvQ4OMiUH14mb2W6i8lpv2h7f9vNh0n6-HU9XVep2KrD-iqdKZ1J9Flh-afrXyZkEDrlfOk-GIfwfs1bUZLn-A9Yrb3uzAkOuBeX8f1qpQunFTsd5ttDpUXX2QA-fp_BqAe3m8jhgHDvGJh4dIrfNS6FNLYQ4cSBjL2IBq5FpVWY8jHDhewCALh5Wdl9FClANHIkllMIDMSWtZg8eB3qTiF0S8GSJohjCczdGv42h_VYwDB1McYjnm8so8Di3pc-DEked7_j0yGpUUWEvyhjVVynwVuBstut0JOXD8wPd9aiNTrV6qFhUcOGHCIo_YUKVFdT2iUw6cVegTuLKxJ1kU6qVl1xw4yyhEOLEXK2VXQsaBQ2lAGLJWWxy6AqSZIeLHi9BG1gddFx37ZBYGmRdBK5tXu5bcmFIRXQYLG6mvZ9jWrJ_SJfXvNmA8Vvm57_Eytm7apRfj1LNJhbEXT7VlHNtx4CSLOFpNdWgcK0wsSsgqut-scao0Na4SEi_v9m0cqkwIJTDxJlo4jilTIY3jxDpO526OQ7UJhXGcWDfRNHac-WYyK9Ow14N9KzL1MjiznzmAANVHgOsjgJcnFM7A6-8cts9nG-0d4zsTpfURsPoIXHON2zS6CfeO9uJ8X1gfAfJMnNyJ__thfrHWTOjdUFqrh7Q-pPUhrQ9pfUjrRVphhhAafp3fSus6zFA2FA6LtHqBYDf2a5XWIA1pOJTFsbQSSBjJ3imtDmIoxfhtT7Us5Od5qq2KO2Yanl_vMtNoES6CwIaOzTT2gwWN32emq2gRUau2jMyUBQvmW0u4NVMPh8ul1SHHZhqhwLPb1q2ZrhgLFlaPvzHTmLEFs1rVhJmSxPz8VzOlhEJq9epJM6WUYGx150kzNXezx6bMFIdkRez__9w3U-xRaJ-hSTMlDC-pdUYmzJRCTLH1XvfNlFK8xNH_ZqbGKKk1-jO09Aew0NpYTBUAAA';\nexport var darkTheme = 'theme_darkTheme__sq3jkb1n';\nexport var lightTheme = 'theme_lightTheme__sq3jkb1m';\nexport var vars = {colors:{background:'var(--colors-background__sq3jkb0)',text:'var(--colors-text__sq3jkb1)',primary:'var(--colors-primary__sq3jkb2)',secondary:'var(--colors-secondary__sq3jkb3)',border:'var(--colors-border__sq3jkb4)',code:{background:'var(--colors-code-background__sq3jkb5)',text:'var(--colors-code-text__sq3jkb6)',inline:'var(--colors-code-inline__sq3jkb7)',inlineBackground:'var(--colors-code-inlineBackground__sq3jkb8)'},notion:{gray:'var(--colors-notion-gray__sq3jkb9)',brown:'var(--colors-notion-brown__sq3jkba)',orange:'var(--colors-notion-orange__sq3jkbb)',yellow:'var(--colors-notion-yellow__sq3jkbc)',green:'var(--colors-notion-green__sq3jkbd)',blue:'var(--colors-notion-blue__sq3jkbe)',purple:'var(--colors-notion-purple__sq3jkbf)',pink:'var(--colors-notion-pink__sq3jkbg)',red:'var(--colors-notion-red__sq3jkbh)',gray_background:'var(--colors-notion-gray_background__sq3jkbi)',brown_background:'var(--colors-notion-brown_background__sq3jkbj)',orange_background:'var(--colors-notion-orange_background__sq3jkbk)',yellow_background:'var(--colors-notion-yellow_background__sq3jkbl)',green_background:'var(--colors-notion-green_background__sq3jkbm)',blue_background:'var(--colors-notion-blue_background__sq3jkbn)',purple_background:'var(--colors-notion-purple_background__sq3jkbo)',pink_background:'var(--colors-notion-pink_background__sq3jkbp)',red_background:'var(--colors-notion-red_background__sq3jkbq)'}},typography:{fontFamily:{base:'var(--typography-fontFamily-base__sq3jkbr)',code:'var(--typography-fontFamily-code__sq3jkbs)'},fontSize:{xs:'var(--typography-fontSize-xs__sq3jkbt)',small:'var(--typography-fontSize-small__sq3jkbu)',base:'var(--typography-fontSize-base__sq3jkbv)',large:'var(--typography-fontSize-large__sq3jkbw)',h1:'var(--typography-fontSize-h1__sq3jkbx)',h2:'var(--typography-fontSize-h2__sq3jkby)',h3:'var(--typography-fontSize-h3__sq3jkbz)'},fontWeight:{normal:'var(--typography-fontWeight-normal__sq3jkb10)',medium:'var(--typography-fontWeight-medium__sq3jkb11)',semibold:'var(--typography-fontWeight-semibold__sq3jkb12)',bold:'var(--typography-fontWeight-bold__sq3jkb13)'},lineHeight:{tight:'var(--typography-lineHeight-tight__sq3jkb14)',base:'var(--typography-lineHeight-base__sq3jkb15)',relaxed:'var(--typography-lineHeight-relaxed__sq3jkb16)'}},spacing:{xxs:'var(--spacing-xxs__sq3jkb17)',xs:'var(--spacing-xs__sq3jkb18)',sm:'var(--spacing-sm__sq3jkb19)',base:'var(--spacing-base__sq3jkb1a)',md:'var(--spacing-md__sq3jkb1b)',lg:'var(--spacing-lg__sq3jkb1c)',xl:'var(--spacing-xl__sq3jkb1d)'},borderRadius:{sm:'var(--borderRadius-sm__sq3jkb1e)',md:'var(--borderRadius-md__sq3jkb1f)',lg:'var(--borderRadius-lg__sq3jkb1g)',xl:'var(--borderRadius-xl__sq3jkb1h)',xxl:'var(--borderRadius-xxl__sq3jkb1i)'},shadows:{sm:'var(--shadows-sm__sq3jkb1j)',md:'var(--shadows-md__sq3jkb1k)',lg:'var(--shadows-lg__sq3jkb1l)'}};"],"mappings":"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","names":["useMemo","memo","useCallback","memo","memo","_7a468","jsx","content","_7a468","jsx","jsx","link","jsx","jsxs","link","useState","useEffect","memo","content","description","link","title","jsx","jsxs","memo","content","title","description","useState","useEffect","link","memo","jsx","jsxs","memo","content","memo","memo","Fragment","jsx","jsxs","content","memo","caption","memo","jsx","memo","memo","jsx","memo","memo","jsx","memo","memo","jsx","memo","memo","memo","jsx","memo","Fragment","jsx","jsxs","memo","Table_default","useState","jsx","jsxs","useState","memo","jsx","jsxs","memo","caption","jsx","memo","Table_default","jsx","title","_7a468","imageStyle","skeletonWrapper","jsx","jsxs","skeletonWrapper","imageStyle","container","Fragment","jsx","jsxs","memo","title","useCallback","useMemo","container"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "notion-to-jsx",
3
- "version": "1.3.2",
3
+ "version": "2.0.0",
4
4
  "description": "Notion blocks to JSX renderer",
5
5
  "private": false,
6
6
  "repository": {
@@ -43,6 +43,7 @@
43
43
  "@vanilla-extract/esbuild-plugin": "^2.3.21",
44
44
  "tsup": "^8.5.1",
45
45
  "typescript": "^5.9.3",
46
+ "notion-types": "1.0.0",
46
47
  "@repo/eslint-config": "0.0.0",
47
48
  "@repo/typescript-config": "0.0.0"
48
49
  },