notion-to-jsx 1.1.1 → 1.2.1
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 +355 -69
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +353 -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,7 +932,24 @@ 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)(
|
|
946
|
+
Toggle_default,
|
|
947
|
+
{
|
|
948
|
+
block,
|
|
949
|
+
tabIndex: blockProps.tabIndex,
|
|
950
|
+
onFocus
|
|
951
|
+
}
|
|
952
|
+
);
|
|
667
953
|
default:
|
|
668
954
|
return null;
|
|
669
955
|
}
|
|
@@ -675,9 +961,9 @@ var darkTheme = "theme_darkTheme__sq3jkb15";
|
|
|
675
961
|
var lightTheme = "theme_lightTheme__sq3jkb14";
|
|
676
962
|
|
|
677
963
|
// src/components/Title/index.tsx
|
|
678
|
-
var
|
|
964
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
679
965
|
var Title = ({ title: title3 }) => {
|
|
680
|
-
return /* @__PURE__ */ (0,
|
|
966
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Heading1, { children: title3 });
|
|
681
967
|
};
|
|
682
968
|
var Title_default = Title;
|
|
683
969
|
|
|
@@ -685,26 +971,26 @@ var Title_default = Title;
|
|
|
685
971
|
var cover = "styles_cover__p0cp8d0";
|
|
686
972
|
|
|
687
973
|
// src/components/Cover/index.tsx
|
|
688
|
-
var
|
|
974
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
689
975
|
var Cover = ({ src, alt }) => {
|
|
690
|
-
return /* @__PURE__ */ (0,
|
|
976
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src, alt, className: cover });
|
|
691
977
|
};
|
|
692
978
|
var Cover_default = Cover;
|
|
693
979
|
|
|
694
980
|
// src/components/Renderer/index.tsx
|
|
695
|
-
var
|
|
696
|
-
var Renderer =
|
|
981
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
982
|
+
var Renderer = import_react7.default.memo(
|
|
697
983
|
({ blocks, isDarkMode = false, title: title3, cover: cover2, onBlockFocus }) => {
|
|
698
984
|
const theme = isDarkMode ? darkTheme : lightTheme;
|
|
699
|
-
const [focusedIndex, setFocusedIndex] = (0,
|
|
700
|
-
const handleBlockFocus = (0,
|
|
985
|
+
const [focusedIndex, setFocusedIndex] = (0, import_react7.useState)(-1);
|
|
986
|
+
const handleBlockFocus = (0, import_react7.useCallback)(
|
|
701
987
|
(index) => {
|
|
702
988
|
setFocusedIndex(index);
|
|
703
989
|
onBlockFocus?.(index);
|
|
704
990
|
},
|
|
705
991
|
[onBlockFocus]
|
|
706
992
|
);
|
|
707
|
-
const renderedBlocks = (0,
|
|
993
|
+
const renderedBlocks = (0, import_react7.useMemo)(() => {
|
|
708
994
|
const result = [];
|
|
709
995
|
for (let i = 0; i < blocks.length; i++) {
|
|
710
996
|
const block = blocks[i];
|
|
@@ -713,7 +999,7 @@ var Renderer = import_react6.default.memo(
|
|
|
713
999
|
const listItemType = `${listType}_list_item`;
|
|
714
1000
|
if (block.type === listItemType && (i === 0 || blocks[i - 1]?.type !== listItemType)) {
|
|
715
1001
|
result.push(
|
|
716
|
-
/* @__PURE__ */ (0,
|
|
1002
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
717
1003
|
ListBlocksRenderer_default,
|
|
718
1004
|
{
|
|
719
1005
|
blocks,
|
|
@@ -734,7 +1020,7 @@ var Renderer = import_react6.default.memo(
|
|
|
734
1020
|
continue;
|
|
735
1021
|
} else {
|
|
736
1022
|
result.push(
|
|
737
|
-
/* @__PURE__ */ (0,
|
|
1023
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
738
1024
|
BlockRenderer_default,
|
|
739
1025
|
{
|
|
740
1026
|
block,
|
|
@@ -748,15 +1034,15 @@ var Renderer = import_react6.default.memo(
|
|
|
748
1034
|
}
|
|
749
1035
|
return result;
|
|
750
1036
|
}, [blocks, handleBlockFocus]);
|
|
751
|
-
return /* @__PURE__ */ (0,
|
|
752
|
-
cover2 && /* @__PURE__ */ (0,
|
|
753
|
-
/* @__PURE__ */ (0,
|
|
1037
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
|
|
1038
|
+
cover2 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Cover_default, { src: cover2, alt: title3 || "Notion page content" }),
|
|
1039
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
754
1040
|
"article",
|
|
755
1041
|
{
|
|
756
1042
|
className: `${theme} ${container}`,
|
|
757
1043
|
"aria-label": title3 || "Notion page content",
|
|
758
1044
|
children: [
|
|
759
|
-
title3 && /* @__PURE__ */ (0,
|
|
1045
|
+
title3 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Title_default, { title: title3 }),
|
|
760
1046
|
renderedBlocks
|
|
761
1047
|
]
|
|
762
1048
|
}
|