notion-to-jsx 1.1.0 → 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 -74
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +347 -72
- 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;
|
|
@@ -564,11 +672,6 @@ var codeBlock = "styles_codeBlock__1qn42yc0";
|
|
|
564
672
|
|
|
565
673
|
// src/components/Renderer/components/Code/CodeBlock.tsx
|
|
566
674
|
var import_prismjs = __toESM(require("prismjs"));
|
|
567
|
-
var import_prism = require("prismjs/themes/prism.css");
|
|
568
|
-
var import_prism_typescript = require("prismjs/components/prism-typescript");
|
|
569
|
-
var import_prism_javascript = require("prismjs/components/prism-javascript");
|
|
570
|
-
var import_prism_jsx = require("prismjs/components/prism-jsx");
|
|
571
|
-
var import_prism_tsx = require("prismjs/components/prism-tsx");
|
|
572
675
|
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
573
676
|
if (typeof window !== "undefined") {
|
|
574
677
|
window.Prism = import_prismjs.default;
|
|
@@ -622,34 +725,195 @@ var Heading3 = ({
|
|
|
622
725
|
return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", { className: heading3, ...props, children });
|
|
623
726
|
};
|
|
624
727
|
|
|
625
|
-
// 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
|
|
626
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");
|
|
627
898
|
var BlockRenderer = ({ block, onFocus, index }) => {
|
|
628
899
|
if (!block) return null;
|
|
629
900
|
const blockProps = {
|
|
630
901
|
tabIndex: 0,
|
|
631
|
-
onFocus
|
|
632
|
-
"data-block-id": block.id
|
|
902
|
+
onFocus
|
|
633
903
|
};
|
|
634
904
|
switch (block.type) {
|
|
635
905
|
case "link_preview":
|
|
636
|
-
return /* @__PURE__ */ (0,
|
|
637
|
-
MemoizedLinkPreview,
|
|
638
|
-
{
|
|
639
|
-
url: block.link_preview.url,
|
|
640
|
-
...blockProps
|
|
641
|
-
}
|
|
642
|
-
);
|
|
906
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MemoizedLinkPreview, { url: block.link_preview.url, ...blockProps });
|
|
643
907
|
case "paragraph":
|
|
644
|
-
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 }) });
|
|
645
909
|
case "heading_1":
|
|
646
|
-
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 }) });
|
|
647
911
|
case "heading_2":
|
|
648
|
-
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 }) });
|
|
649
913
|
case "heading_3":
|
|
650
|
-
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 }) });
|
|
651
915
|
case "code":
|
|
652
|
-
return /* @__PURE__ */ (0,
|
|
916
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
653
917
|
CodeBlock_default,
|
|
654
918
|
{
|
|
655
919
|
code: block.code.rich_text[0].text.content,
|
|
@@ -658,7 +922,7 @@ var BlockRenderer = ({ block, onFocus, index }) => {
|
|
|
658
922
|
}
|
|
659
923
|
) });
|
|
660
924
|
case "image":
|
|
661
|
-
return /* @__PURE__ */ (0,
|
|
925
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("figure", { ...blockProps, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
662
926
|
MemoizedImage,
|
|
663
927
|
{
|
|
664
928
|
src: block.image.file?.url || block.image.external?.url,
|
|
@@ -668,8 +932,19 @@ var BlockRenderer = ({ block, onFocus, index }) => {
|
|
|
668
932
|
}
|
|
669
933
|
) });
|
|
670
934
|
case "bookmark":
|
|
671
|
-
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 });
|
|
672
946
|
default:
|
|
947
|
+
console.log(`\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uBE14\uB85D \uD0C0\uC785: ${block.type}`, block);
|
|
673
948
|
return null;
|
|
674
949
|
}
|
|
675
950
|
};
|
|
@@ -680,9 +955,9 @@ var darkTheme = "theme_darkTheme__sq3jkb15";
|
|
|
680
955
|
var lightTheme = "theme_lightTheme__sq3jkb14";
|
|
681
956
|
|
|
682
957
|
// src/components/Title/index.tsx
|
|
683
|
-
var
|
|
958
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
684
959
|
var Title = ({ title: title3 }) => {
|
|
685
|
-
return /* @__PURE__ */ (0,
|
|
960
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Heading1, { children: title3 });
|
|
686
961
|
};
|
|
687
962
|
var Title_default = Title;
|
|
688
963
|
|
|
@@ -690,26 +965,26 @@ var Title_default = Title;
|
|
|
690
965
|
var cover = "styles_cover__p0cp8d0";
|
|
691
966
|
|
|
692
967
|
// src/components/Cover/index.tsx
|
|
693
|
-
var
|
|
968
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
694
969
|
var Cover = ({ src, alt }) => {
|
|
695
|
-
return /* @__PURE__ */ (0,
|
|
970
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src, alt, className: cover });
|
|
696
971
|
};
|
|
697
972
|
var Cover_default = Cover;
|
|
698
973
|
|
|
699
974
|
// src/components/Renderer/index.tsx
|
|
700
|
-
var
|
|
701
|
-
var Renderer =
|
|
975
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
976
|
+
var Renderer = import_react7.default.memo(
|
|
702
977
|
({ blocks, isDarkMode = false, title: title3, cover: cover2, onBlockFocus }) => {
|
|
703
978
|
const theme = isDarkMode ? darkTheme : lightTheme;
|
|
704
|
-
const [focusedIndex, setFocusedIndex] = (0,
|
|
705
|
-
const handleBlockFocus = (0,
|
|
979
|
+
const [focusedIndex, setFocusedIndex] = (0, import_react7.useState)(-1);
|
|
980
|
+
const handleBlockFocus = (0, import_react7.useCallback)(
|
|
706
981
|
(index) => {
|
|
707
982
|
setFocusedIndex(index);
|
|
708
983
|
onBlockFocus?.(index);
|
|
709
984
|
},
|
|
710
985
|
[onBlockFocus]
|
|
711
986
|
);
|
|
712
|
-
const renderedBlocks = (0,
|
|
987
|
+
const renderedBlocks = (0, import_react7.useMemo)(() => {
|
|
713
988
|
const result = [];
|
|
714
989
|
for (let i = 0; i < blocks.length; i++) {
|
|
715
990
|
const block = blocks[i];
|
|
@@ -718,7 +993,7 @@ var Renderer = import_react6.default.memo(
|
|
|
718
993
|
const listItemType = `${listType}_list_item`;
|
|
719
994
|
if (block.type === listItemType && (i === 0 || blocks[i - 1]?.type !== listItemType)) {
|
|
720
995
|
result.push(
|
|
721
|
-
/* @__PURE__ */ (0,
|
|
996
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
722
997
|
ListBlocksRenderer_default,
|
|
723
998
|
{
|
|
724
999
|
blocks,
|
|
@@ -739,7 +1014,7 @@ var Renderer = import_react6.default.memo(
|
|
|
739
1014
|
continue;
|
|
740
1015
|
} else {
|
|
741
1016
|
result.push(
|
|
742
|
-
/* @__PURE__ */ (0,
|
|
1017
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
743
1018
|
BlockRenderer_default,
|
|
744
1019
|
{
|
|
745
1020
|
block,
|
|
@@ -753,15 +1028,15 @@ var Renderer = import_react6.default.memo(
|
|
|
753
1028
|
}
|
|
754
1029
|
return result;
|
|
755
1030
|
}, [blocks, handleBlockFocus]);
|
|
756
|
-
return /* @__PURE__ */ (0,
|
|
757
|
-
cover2 && /* @__PURE__ */ (0,
|
|
758
|
-
/* @__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)(
|
|
759
1034
|
"article",
|
|
760
1035
|
{
|
|
761
1036
|
className: `${theme} ${container}`,
|
|
762
1037
|
"aria-label": title3 || "Notion page content",
|
|
763
1038
|
children: [
|
|
764
|
-
title3 && /* @__PURE__ */ (0,
|
|
1039
|
+
title3 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Title_default, { title: title3 }),
|
|
765
1040
|
renderedBlocks
|
|
766
1041
|
]
|
|
767
1042
|
}
|