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.css +121 -11
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +28 -8
- package/dist/index.d.ts +28 -8
- package/dist/index.js +349 -69
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +347 -67
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
{
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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
|
|
508
|
+
const loadLinkData = async () => {
|
|
438
509
|
setLoading(true);
|
|
439
|
-
const
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
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
|
-
|
|
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)(
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
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/
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
958
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
679
959
|
var Title = ({ title: title3 }) => {
|
|
680
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
968
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
689
969
|
var Cover = ({ src, alt }) => {
|
|
690
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
696
|
-
var Renderer =
|
|
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,
|
|
700
|
-
const handleBlockFocus = (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
752
|
-
cover2 && /* @__PURE__ */ (0,
|
|
753
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1039
|
+
title3 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Title_default, { title: title3 }),
|
|
760
1040
|
renderedBlocks
|
|
761
1041
|
]
|
|
762
1042
|
}
|