notion-to-jsx 1.1.1 → 1.2.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.
package/dist/index.js CHANGED
@@ -35,7 +35,7 @@ __export(index_exports, {
35
35
  module.exports = __toCommonJS(index_exports);
36
36
 
37
37
  // src/components/Renderer/index.tsx
38
- var import_react6 = __toESM(require("react"));
38
+ var import_react7 = __toESM(require("react"));
39
39
 
40
40
  // src/components/Renderer/styles.css.ts
41
41
  var container = "styles_container__epva5u0";
@@ -74,19 +74,29 @@ var richText = (0, import_createRuntimeFn2.createRuntimeFn)({ defaultClassName:
74
74
 
75
75
  // src/components/Renderer/components/RichText/RichTexts.tsx
76
76
  var import_jsx_runtime2 = require("react/jsx-runtime");
77
+ var renderLink = (href, content3) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("a", { href, target: "_blank", rel: "noopener noreferrer", className: link, children: content3 });
77
78
  var RichTexts = ({ richTexts }) => {
78
79
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children: richTexts.map((text, index) => {
79
- const { bold, italic, strikethrough, underline, code, color } = text.annotations;
80
- const content3 = text.text.link ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
81
- "a",
82
- {
83
- href: text.text.link,
84
- target: "_blank",
85
- rel: "noopener noreferrer",
86
- className: link,
87
- children: text.text.content
80
+ const { bold, italic, strikethrough, underline, code } = text.annotations;
81
+ let content3;
82
+ switch (text.type) {
83
+ case "text": {
84
+ if (text.text) {
85
+ const { text: textData } = text;
86
+ content3 = textData.link ? renderLink(textData.link, textData.content) : textData.content;
87
+ } else {
88
+ content3 = text.plain_text;
89
+ }
90
+ break;
91
+ }
92
+ case "mention": {
93
+ content3 = text.href ? renderLink(text.href, text.plain_text) : text.plain_text;
94
+ break;
88
95
  }
89
- ) : text.text.content;
96
+ default: {
97
+ content3 = text.plain_text;
98
+ }
99
+ }
90
100
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
91
101
  "span",
92
102
  {
@@ -283,8 +293,8 @@ var fetchOpenGraphData = async (url) => {
283
293
  if (!response.ok) {
284
294
  throw new Error("Failed to fetch metadata");
285
295
  }
286
- const { status, data: metaData } = data;
287
- if (status !== "success") {
296
+ const { status, data: metaData, statusCode } = data;
297
+ if (status !== "success" || statusCode !== 200) {
288
298
  throw new Error("API returned error status");
289
299
  }
290
300
  const parsedUrl = new URL(url);
@@ -357,13 +367,15 @@ var Bookmark_default = Bookmark;
357
367
  var import_react3 = require("react");
358
368
 
359
369
  // src/components/Renderer/components/LinkPreview/styles.css.ts
360
- var card2 = "styles_card__o1p3m11";
361
370
  var content2 = "styles_content__o1p3m12";
371
+ var description2 = "styles_description__o1p3m16";
372
+ var githubContent = "styles_githubContent__o1p3m18";
373
+ var githubPreview = "styles_githubPreview__o1p3m17";
362
374
  var icon = "styles_icon__o1p3m14";
363
375
  var iconContainer = "styles_iconContainer__o1p3m13";
364
376
  var link3 = "styles_link__o1p3m10";
377
+ var preview = "styles_preview__o1p3m11";
365
378
  var title2 = "styles_title__o1p3m15";
366
- var updatedText = "styles_updatedText__o1p3m16";
367
379
 
368
380
  // src/components/Renderer/components/LinkPreview/LinkPreview.tsx
369
381
  var import_jsx_runtime5 = require("react/jsx-runtime");
@@ -381,6 +393,48 @@ var fetchGitHubRepoData = async (repoPath) => {
381
393
  return null;
382
394
  }
383
395
  };
396
+ var extractFigmaData = (url) => {
397
+ try {
398
+ const parsedUrl = new URL(url);
399
+ if (parsedUrl.hostname.includes("figma.com")) {
400
+ const pathSegments = parsedUrl.pathname.split("/");
401
+ const fileSegment = pathSegments.find(
402
+ (segment) => segment.includes("file")
403
+ );
404
+ if (!fileSegment) return null;
405
+ const fileIdMatch = fileSegment.match(/file\/([^/]+)/);
406
+ const fileId = fileIdMatch ? fileIdMatch[1] : "";
407
+ let fileName = "";
408
+ let mode = "";
409
+ if (pathSegments.length > 3) {
410
+ const encodedName = pathSegments[3];
411
+ if (encodedName) {
412
+ fileName = decodeURIComponent(encodedName).replace(/-/g, " ");
413
+ }
414
+ }
415
+ if (!fileName && parsedUrl.pathname.includes("-")) {
416
+ const nameMatch = parsedUrl.pathname.match(/\/([^/]+)(?:\?|$)/);
417
+ if (nameMatch && nameMatch[1]) {
418
+ fileName = decodeURIComponent(nameMatch[1].replace(/-/g, " "));
419
+ }
420
+ }
421
+ if (parsedUrl.search) {
422
+ const searchParams = new URLSearchParams(parsedUrl.search);
423
+ mode = searchParams.get("mode") || "";
424
+ }
425
+ fileName = fileName || "Figma Design";
426
+ return {
427
+ name: fileName,
428
+ url,
429
+ thumbnailUrl: "https://static.figma.com/app/icon/1/favicon.svg"
430
+ };
431
+ }
432
+ return null;
433
+ } catch (error) {
434
+ console.error("Error parsing Figma URL:", error);
435
+ return null;
436
+ }
437
+ };
384
438
  var extractRepoPathFromUrl = (url) => {
385
439
  try {
386
440
  const parsedUrl = new URL(url);
@@ -397,6 +451,19 @@ var extractRepoPathFromUrl = (url) => {
397
451
  return null;
398
452
  }
399
453
  };
454
+ var getLinkType = (url) => {
455
+ try {
456
+ const parsedUrl = new URL(url);
457
+ if (parsedUrl.hostname === "github.com") {
458
+ return "github";
459
+ } else if (parsedUrl.hostname.includes("figma.com")) {
460
+ return "figma";
461
+ }
462
+ return "unknown";
463
+ } catch {
464
+ return "unknown";
465
+ }
466
+ };
400
467
  var formatUpdatedTime = (dateString) => {
401
468
  const date = new Date(dateString);
402
469
  const now = /* @__PURE__ */ new Date();
@@ -432,35 +499,77 @@ var formatUpdatedTime = (dateString) => {
432
499
  };
433
500
  var LinkPreview = ({ url }) => {
434
501
  const [repoData, setRepoData] = (0, import_react3.useState)(null);
502
+ const [figmaData, setFigmaData] = (0, import_react3.useState)(null);
435
503
  const [loading, setLoading] = (0, import_react3.useState)(true);
504
+ const [linkType, setLinkType] = (0, import_react3.useState)(
505
+ "unknown"
506
+ );
436
507
  (0, import_react3.useEffect)(() => {
437
- const loadRepoData = async () => {
508
+ const loadLinkData = async () => {
438
509
  setLoading(true);
439
- const repoPath = extractRepoPathFromUrl(url);
440
- if (repoPath) {
441
- const data = await fetchGitHubRepoData(repoPath);
442
- setRepoData(data);
510
+ const type = getLinkType(url);
511
+ setLinkType(type);
512
+ if (type === "github") {
513
+ const repoPath = extractRepoPathFromUrl(url);
514
+ if (repoPath) {
515
+ const data = await fetchGitHubRepoData(repoPath);
516
+ setRepoData(data);
517
+ }
518
+ } else if (type === "figma") {
519
+ const data = extractFigmaData(url);
520
+ setFigmaData(data);
443
521
  }
444
522
  setLoading(false);
445
523
  };
446
- loadRepoData();
524
+ loadLinkData();
447
525
  }, [url]);
448
526
  const repoName = repoData?.name || extractRepoPathFromUrl(url)?.split("/")[1] || "Repository";
449
527
  const updatedTimeText = repoData?.updated_at ? formatUpdatedTime(repoData.updated_at) : "";
450
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: link3, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: card2, children: [
451
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: iconContainer, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
452
- "img",
453
- {
454
- src: repoData?.owner?.avatar_url || "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
455
- alt: "Repository icon",
456
- className: icon
457
- }
458
- ) }),
459
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: content2, children: [
460
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: title2, children: repoName }),
461
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: updatedText, children: loading ? "Loading..." : `NotionX \u2022 ${updatedTimeText}` })
462
- ] })
463
- ] }) });
528
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
529
+ "a",
530
+ {
531
+ href: url,
532
+ target: "_blank",
533
+ rel: "noopener noreferrer",
534
+ className: link3,
535
+ children: linkType === "figma" && figmaData ? (
536
+ // Figma 프리뷰 렌더링
537
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: preview, children: [
538
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: iconContainer, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
539
+ "img",
540
+ {
541
+ src: figmaData.thumbnailUrl || "https://static.figma.com/app/icon/1/favicon.svg",
542
+ alt: "Figma icon",
543
+ className: icon
544
+ }
545
+ ) }),
546
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: content2, children: [
547
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: title2, children: figmaData.name }),
548
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: description2, children: "www.figma.com" })
549
+ ] })
550
+ ] })
551
+ ) : linkType === "github" ? (
552
+ // GitHub 프리뷰 렌더링
553
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: `${preview} ${githubPreview}`, children: [
554
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: iconContainer, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
555
+ "img",
556
+ {
557
+ src: repoData?.owner?.avatar_url || "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
558
+ alt: "Repository icon",
559
+ className: icon
560
+ }
561
+ ) }),
562
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: `${content2} ${githubContent}`, children: [
563
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: title2, children: repoName }),
564
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: description2, children: loading ? "Loading..." : `${repoName} \u2022 ${updatedTimeText}` })
565
+ ] })
566
+ ] })
567
+ ) : (
568
+ // 기본 링크 프리뷰 렌더링
569
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: preview, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: content2, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: title2, children: url }) }) })
570
+ )
571
+ }
572
+ );
464
573
  };
465
574
  var LinkPreview_default = LinkPreview;
466
575
 
@@ -491,8 +600,7 @@ var MemoizedLinkPreview = import_react4.default.memo(
491
600
  var import_jsx_runtime6 = require("react/jsx-runtime");
492
601
  var RecursiveListItem = ({ block, index }) => {
493
602
  const blockProps = {
494
- tabIndex: 0,
495
- "data-block-id": block.id
603
+ tabIndex: 0
496
604
  };
497
605
  const blockType = block.type;
498
606
  const richTexts = block[blockType]?.rich_text;
@@ -617,34 +725,195 @@ var Heading3 = ({
617
725
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", { className: heading3, ...props, children });
618
726
  };
619
727
 
620
- // src/components/Renderer/components/Block/BlockRenderer.tsx
728
+ // src/components/Renderer/components/Column/styles.css.ts
729
+ var columnContainer = "styles_columnContainer__wle6we0";
730
+ var columnListContainer = "styles_columnListContainer__wle6we1";
731
+
732
+ // src/components/Renderer/components/Column/Column.tsx
621
733
  var import_jsx_runtime9 = require("react/jsx-runtime");
734
+ var Column = ({ block, onFocus }) => {
735
+ if (!block || !block.children) return null;
736
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: columnContainer, children: block.children.map((childBlock, index) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
737
+ BlockRenderer_default,
738
+ {
739
+ block: childBlock,
740
+ onFocus,
741
+ index
742
+ },
743
+ childBlock.id
744
+ )) });
745
+ };
746
+ var Column_default = Column;
747
+
748
+ // src/components/Renderer/components/Column/ColumnList.tsx
749
+ var import_jsx_runtime10 = require("react/jsx-runtime");
750
+ var ColumnList = ({ block, onFocus }) => {
751
+ if (!block || !block.children) return null;
752
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: columnListContainer, children: block.children.map((column) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Column_default, { block: column, onFocus }, column.id)) });
753
+ };
754
+ var ColumnList_default = ColumnList;
755
+
756
+ // src/components/Renderer/components/Quote/styles.css.ts
757
+ var container2 = "styles_container__mra9n0";
758
+
759
+ // src/components/Renderer/components/Quote/Quote.tsx
760
+ var import_jsx_runtime11 = require("react/jsx-runtime");
761
+ var Quote = ({ richTexts, tabIndex }) => {
762
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("blockquote", { className: container2, tabIndex, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(MemoizedRichText, { richTexts }) });
763
+ };
764
+ var Quote_default = Quote;
765
+
766
+ // src/components/Renderer/components/Table/styles.css.ts
767
+ var firstCell = "styles_firstCell__1rvbzfo4";
768
+ var hasRowHeader = "styles_hasRowHeader__1rvbzfo6";
769
+ var headerCell = "styles_headerCell__1rvbzfo2";
770
+ var lastCell = "styles_lastCell__1rvbzfo5";
771
+ var table = "styles_table__1rvbzfo1";
772
+ var tableCell = "styles_tableCell__1rvbzfo3";
773
+ var tableContainer = "styles_tableContainer__1rvbzfo0";
774
+
775
+ // src/components/Renderer/components/Table/TableRow.tsx
776
+ var import_jsx_runtime12 = require("react/jsx-runtime");
777
+ var TableRow = ({
778
+ rowBlock,
779
+ cellClassName = "",
780
+ rowHeaderIndex = -1
781
+ }) => {
782
+ if (!rowBlock.table_row?.cells) {
783
+ return null;
784
+ }
785
+ const { cells } = rowBlock.table_row;
786
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("tr", { children: cells.map((cell, index) => {
787
+ const isFirstCell = index === 0;
788
+ const isLastCell = index === cells.length - 1;
789
+ const isRowHeader = index === rowHeaderIndex;
790
+ let cellClasses = [tableCell, cellClassName];
791
+ if (isFirstCell) cellClasses.push(firstCell);
792
+ if (isLastCell) cellClasses.push(lastCell);
793
+ if (isRowHeader) cellClasses.push(hasRowHeader);
794
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
795
+ "td",
796
+ {
797
+ className: cellClasses.filter(Boolean).join(" "),
798
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(MemoizedRichText, { richTexts: cell })
799
+ },
800
+ `${rowBlock.id}-cell-${index}`
801
+ );
802
+ }) });
803
+ };
804
+ var TableRow_default = TableRow;
805
+
806
+ // src/components/Renderer/components/Table/Table.tsx
807
+ var import_jsx_runtime13 = require("react/jsx-runtime");
808
+ var Table = ({ block, tabIndex = 0 }) => {
809
+ if (!block.table || !block.children) {
810
+ return null;
811
+ }
812
+ const { table_width, has_column_header, has_row_header } = block.table;
813
+ const rows = block.children?.filter(
814
+ (child) => child.type === "table_row"
815
+ ) || [];
816
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: tableContainer, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("table", { className: table, tabIndex, children: rows.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
817
+ has_column_header && rows[0] && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TableRow_default, { rowBlock: rows[0], cellClassName: headerCell }) }),
818
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("tbody", { children: rows.filter(
819
+ (row) => row !== void 0 && row.type === "table_row"
820
+ ).map((row, rowIndex) => {
821
+ if (has_column_header && rowIndex === 0) {
822
+ return null;
823
+ }
824
+ const actualRowIndex = has_column_header ? rowIndex - 1 : rowIndex;
825
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
826
+ TableRow_default,
827
+ {
828
+ rowBlock: row,
829
+ rowHeaderIndex: has_row_header ? 0 : -1
830
+ },
831
+ row.id
832
+ );
833
+ }) })
834
+ ] }) }) });
835
+ };
836
+ var Table_default = Table;
837
+
838
+ // src/components/Renderer/components/Table/index.ts
839
+ var Table_default2 = Table_default;
840
+
841
+ // src/components/Renderer/components/Toggle/Toggle.tsx
842
+ var import_react6 = require("react");
843
+
844
+ // src/components/Renderer/components/Toggle/styles.css.ts
845
+ var toggleContainer = "styles_toggleContainer__p7ue1z0";
846
+ var toggleContent = "styles_toggleContent__p7ue1z4";
847
+ var toggleHeader = "styles_toggleHeader__p7ue1z1";
848
+ var toggleIcon = "styles_toggleIcon__p7ue1z2";
849
+ var toggleIconOpen = "styles_toggleIconOpen__p7ue1z3";
850
+
851
+ // src/components/Renderer/components/Toggle/Toggle.tsx
852
+ var import_jsx_runtime14 = require("react/jsx-runtime");
853
+ var Toggle = ({ block, tabIndex = 0, onFocus }) => {
854
+ const [isOpen, setIsOpen] = (0, import_react6.useState)(false);
855
+ if (!block.toggle || !block.children) {
856
+ return null;
857
+ }
858
+ const handleToggle = () => {
859
+ setIsOpen(!isOpen);
860
+ };
861
+ const handleKeyDown = (e) => {
862
+ if (e.key === "Enter" || e.key === " ") {
863
+ e.preventDefault();
864
+ handleToggle();
865
+ }
866
+ };
867
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: toggleContainer, children: [
868
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
869
+ "div",
870
+ {
871
+ className: toggleHeader,
872
+ onClick: handleToggle,
873
+ onKeyDown: handleKeyDown,
874
+ tabIndex,
875
+ onFocus,
876
+ role: "button",
877
+ "aria-expanded": isOpen,
878
+ children: [
879
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: `${toggleIcon} ${isOpen ? toggleIconOpen : ""}`, children: "\u25B6" }),
880
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(RichTexts_default, { richTexts: block.toggle.rich_text })
881
+ ]
882
+ }
883
+ ),
884
+ isOpen && block.children && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: toggleContent, children: block.children.map((childBlock, index) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
885
+ BlockRenderer_default,
886
+ {
887
+ block: childBlock,
888
+ index
889
+ },
890
+ childBlock.id
891
+ )) })
892
+ ] });
893
+ };
894
+ var Toggle_default = Toggle;
895
+
896
+ // src/components/Renderer/components/Block/BlockRenderer.tsx
897
+ var import_jsx_runtime15 = require("react/jsx-runtime");
622
898
  var BlockRenderer = ({ block, onFocus, index }) => {
623
899
  if (!block) return null;
624
900
  const blockProps = {
625
901
  tabIndex: 0,
626
- onFocus,
627
- "data-block-id": block.id
902
+ onFocus
628
903
  };
629
904
  switch (block.type) {
630
905
  case "link_preview":
631
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
632
- MemoizedLinkPreview,
633
- {
634
- url: block.link_preview.url,
635
- ...blockProps
636
- }
637
- );
906
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MemoizedLinkPreview, { url: block.link_preview.url, ...blockProps });
638
907
  case "paragraph":
639
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Paragraph, { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(MemoizedRichText, { richTexts: block.paragraph.rich_text }) });
908
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Paragraph, { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MemoizedRichText, { richTexts: block.paragraph.rich_text }) });
640
909
  case "heading_1":
641
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Heading1, { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(MemoizedRichText, { richTexts: block.heading_1.rich_text }) });
910
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Heading1, { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MemoizedRichText, { richTexts: block.heading_1.rich_text }) });
642
911
  case "heading_2":
643
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Heading2, { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(MemoizedRichText, { richTexts: block.heading_2.rich_text }) });
912
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Heading2, { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MemoizedRichText, { richTexts: block.heading_2.rich_text }) });
644
913
  case "heading_3":
645
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Heading3, { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(MemoizedRichText, { richTexts: block.heading_3.rich_text }) });
914
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Heading3, { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MemoizedRichText, { richTexts: block.heading_3.rich_text }) });
646
915
  case "code":
647
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
916
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
648
917
  CodeBlock_default,
649
918
  {
650
919
  code: block.code.rich_text[0].text.content,
@@ -653,7 +922,7 @@ var BlockRenderer = ({ block, onFocus, index }) => {
653
922
  }
654
923
  ) });
655
924
  case "image":
656
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("figure", { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
925
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("figure", { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
657
926
  MemoizedImage,
658
927
  {
659
928
  src: block.image.file?.url || block.image.external?.url,
@@ -663,8 +932,19 @@ var BlockRenderer = ({ block, onFocus, index }) => {
663
932
  }
664
933
  ) });
665
934
  case "bookmark":
666
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(MemoizedBookmark, { url: block.bookmark.url });
935
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MemoizedBookmark, { url: block.bookmark.url });
936
+ case "column_list":
937
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ColumnList_default, { block, onFocus });
938
+ case "column":
939
+ return null;
940
+ case "quote":
941
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Quote_default, { richTexts: block.quote.rich_text, ...blockProps });
942
+ case "table":
943
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Table_default2, { block, tabIndex: blockProps.tabIndex });
944
+ case "toggle":
945
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Toggle_default, { block, tabIndex: blockProps.tabIndex, onFocus });
667
946
  default:
947
+ console.log(`\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uBE14\uB85D \uD0C0\uC785: ${block.type}`, block);
668
948
  return null;
669
949
  }
670
950
  };
@@ -675,9 +955,9 @@ var darkTheme = "theme_darkTheme__sq3jkb15";
675
955
  var lightTheme = "theme_lightTheme__sq3jkb14";
676
956
 
677
957
  // src/components/Title/index.tsx
678
- var import_jsx_runtime10 = require("react/jsx-runtime");
958
+ var import_jsx_runtime16 = require("react/jsx-runtime");
679
959
  var Title = ({ title: title3 }) => {
680
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Heading1, { children: title3 });
960
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Heading1, { children: title3 });
681
961
  };
682
962
  var Title_default = Title;
683
963
 
@@ -685,26 +965,26 @@ var Title_default = Title;
685
965
  var cover = "styles_cover__p0cp8d0";
686
966
 
687
967
  // src/components/Cover/index.tsx
688
- var import_jsx_runtime11 = require("react/jsx-runtime");
968
+ var import_jsx_runtime17 = require("react/jsx-runtime");
689
969
  var Cover = ({ src, alt }) => {
690
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { src, alt, className: cover });
970
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src, alt, className: cover });
691
971
  };
692
972
  var Cover_default = Cover;
693
973
 
694
974
  // src/components/Renderer/index.tsx
695
- var import_jsx_runtime12 = require("react/jsx-runtime");
696
- var Renderer = import_react6.default.memo(
975
+ var import_jsx_runtime18 = require("react/jsx-runtime");
976
+ var Renderer = import_react7.default.memo(
697
977
  ({ blocks, isDarkMode = false, title: title3, cover: cover2, onBlockFocus }) => {
698
978
  const theme = isDarkMode ? darkTheme : lightTheme;
699
- const [focusedIndex, setFocusedIndex] = (0, import_react6.useState)(-1);
700
- const handleBlockFocus = (0, import_react6.useCallback)(
979
+ const [focusedIndex, setFocusedIndex] = (0, import_react7.useState)(-1);
980
+ const handleBlockFocus = (0, import_react7.useCallback)(
701
981
  (index) => {
702
982
  setFocusedIndex(index);
703
983
  onBlockFocus?.(index);
704
984
  },
705
985
  [onBlockFocus]
706
986
  );
707
- const renderedBlocks = (0, import_react6.useMemo)(() => {
987
+ const renderedBlocks = (0, import_react7.useMemo)(() => {
708
988
  const result = [];
709
989
  for (let i = 0; i < blocks.length; i++) {
710
990
  const block = blocks[i];
@@ -713,7 +993,7 @@ var Renderer = import_react6.default.memo(
713
993
  const listItemType = `${listType}_list_item`;
714
994
  if (block.type === listItemType && (i === 0 || blocks[i - 1]?.type !== listItemType)) {
715
995
  result.push(
716
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
996
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
717
997
  ListBlocksRenderer_default,
718
998
  {
719
999
  blocks,
@@ -734,7 +1014,7 @@ var Renderer = import_react6.default.memo(
734
1014
  continue;
735
1015
  } else {
736
1016
  result.push(
737
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1017
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
738
1018
  BlockRenderer_default,
739
1019
  {
740
1020
  block,
@@ -748,15 +1028,15 @@ var Renderer = import_react6.default.memo(
748
1028
  }
749
1029
  return result;
750
1030
  }, [blocks, handleBlockFocus]);
751
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
752
- cover2 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Cover_default, { src: cover2, alt: title3 || "Notion page content" }),
753
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1031
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
1032
+ cover2 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Cover_default, { src: cover2, alt: title3 || "Notion page content" }),
1033
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
754
1034
  "article",
755
1035
  {
756
1036
  className: `${theme} ${container}`,
757
1037
  "aria-label": title3 || "Notion page content",
758
1038
  children: [
759
- title3 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Title_default, { title: title3 }),
1039
+ title3 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Title_default, { title: title3 }),
760
1040
  renderedBlocks
761
1041
  ]
762
1042
  }