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.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/components/Renderer/index.tsx
|
|
2
|
-
import
|
|
2
|
+
import React7, { useState as useState5, useMemo as useMemo2, useCallback } from "react";
|
|
3
3
|
|
|
4
4
|
// src/components/Renderer/styles.css.ts
|
|
5
5
|
var container = "styles_container__epva5u0";
|
|
@@ -38,19 +38,29 @@ var richText = _7a4682({ defaultClassName: "styles_richText__fdf3tw0", variantCl
|
|
|
38
38
|
|
|
39
39
|
// src/components/Renderer/components/RichText/RichTexts.tsx
|
|
40
40
|
import { Fragment, jsx as jsx2 } from "react/jsx-runtime";
|
|
41
|
+
var renderLink = (href, content3) => /* @__PURE__ */ jsx2("a", { href, target: "_blank", rel: "noopener noreferrer", className: link, children: content3 });
|
|
41
42
|
var RichTexts = ({ richTexts }) => {
|
|
42
43
|
return /* @__PURE__ */ jsx2(Fragment, { children: richTexts.map((text, index) => {
|
|
43
|
-
const { bold, italic, strikethrough, underline, code
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
const { bold, italic, strikethrough, underline, code } = text.annotations;
|
|
45
|
+
let content3;
|
|
46
|
+
switch (text.type) {
|
|
47
|
+
case "text": {
|
|
48
|
+
if (text.text) {
|
|
49
|
+
const { text: textData } = text;
|
|
50
|
+
content3 = textData.link ? renderLink(textData.link, textData.content) : textData.content;
|
|
51
|
+
} else {
|
|
52
|
+
content3 = text.plain_text;
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case "mention": {
|
|
57
|
+
content3 = text.href ? renderLink(text.href, text.plain_text) : text.plain_text;
|
|
58
|
+
break;
|
|
52
59
|
}
|
|
53
|
-
|
|
60
|
+
default: {
|
|
61
|
+
content3 = text.plain_text;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
54
64
|
return /* @__PURE__ */ jsx2(
|
|
55
65
|
"span",
|
|
56
66
|
{
|
|
@@ -247,8 +257,8 @@ var fetchOpenGraphData = async (url) => {
|
|
|
247
257
|
if (!response.ok) {
|
|
248
258
|
throw new Error("Failed to fetch metadata");
|
|
249
259
|
}
|
|
250
|
-
const { status, data: metaData } = data;
|
|
251
|
-
if (status !== "success") {
|
|
260
|
+
const { status, data: metaData, statusCode } = data;
|
|
261
|
+
if (status !== "success" || statusCode !== 200) {
|
|
252
262
|
throw new Error("API returned error status");
|
|
253
263
|
}
|
|
254
264
|
const parsedUrl = new URL(url);
|
|
@@ -321,13 +331,15 @@ var Bookmark_default = Bookmark;
|
|
|
321
331
|
import { useState as useState3, useEffect as useEffect3 } from "react";
|
|
322
332
|
|
|
323
333
|
// src/components/Renderer/components/LinkPreview/styles.css.ts
|
|
324
|
-
var card2 = "styles_card__o1p3m11";
|
|
325
334
|
var content2 = "styles_content__o1p3m12";
|
|
335
|
+
var description2 = "styles_description__o1p3m16";
|
|
336
|
+
var githubContent = "styles_githubContent__o1p3m18";
|
|
337
|
+
var githubPreview = "styles_githubPreview__o1p3m17";
|
|
326
338
|
var icon = "styles_icon__o1p3m14";
|
|
327
339
|
var iconContainer = "styles_iconContainer__o1p3m13";
|
|
328
340
|
var link3 = "styles_link__o1p3m10";
|
|
341
|
+
var preview = "styles_preview__o1p3m11";
|
|
329
342
|
var title2 = "styles_title__o1p3m15";
|
|
330
|
-
var updatedText = "styles_updatedText__o1p3m16";
|
|
331
343
|
|
|
332
344
|
// src/components/Renderer/components/LinkPreview/LinkPreview.tsx
|
|
333
345
|
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
@@ -345,6 +357,48 @@ var fetchGitHubRepoData = async (repoPath) => {
|
|
|
345
357
|
return null;
|
|
346
358
|
}
|
|
347
359
|
};
|
|
360
|
+
var extractFigmaData = (url) => {
|
|
361
|
+
try {
|
|
362
|
+
const parsedUrl = new URL(url);
|
|
363
|
+
if (parsedUrl.hostname.includes("figma.com")) {
|
|
364
|
+
const pathSegments = parsedUrl.pathname.split("/");
|
|
365
|
+
const fileSegment = pathSegments.find(
|
|
366
|
+
(segment) => segment.includes("file")
|
|
367
|
+
);
|
|
368
|
+
if (!fileSegment) return null;
|
|
369
|
+
const fileIdMatch = fileSegment.match(/file\/([^/]+)/);
|
|
370
|
+
const fileId = fileIdMatch ? fileIdMatch[1] : "";
|
|
371
|
+
let fileName = "";
|
|
372
|
+
let mode = "";
|
|
373
|
+
if (pathSegments.length > 3) {
|
|
374
|
+
const encodedName = pathSegments[3];
|
|
375
|
+
if (encodedName) {
|
|
376
|
+
fileName = decodeURIComponent(encodedName).replace(/-/g, " ");
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (!fileName && parsedUrl.pathname.includes("-")) {
|
|
380
|
+
const nameMatch = parsedUrl.pathname.match(/\/([^/]+)(?:\?|$)/);
|
|
381
|
+
if (nameMatch && nameMatch[1]) {
|
|
382
|
+
fileName = decodeURIComponent(nameMatch[1].replace(/-/g, " "));
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (parsedUrl.search) {
|
|
386
|
+
const searchParams = new URLSearchParams(parsedUrl.search);
|
|
387
|
+
mode = searchParams.get("mode") || "";
|
|
388
|
+
}
|
|
389
|
+
fileName = fileName || "Figma Design";
|
|
390
|
+
return {
|
|
391
|
+
name: fileName,
|
|
392
|
+
url,
|
|
393
|
+
thumbnailUrl: "https://static.figma.com/app/icon/1/favicon.svg"
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
return null;
|
|
397
|
+
} catch (error) {
|
|
398
|
+
console.error("Error parsing Figma URL:", error);
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
};
|
|
348
402
|
var extractRepoPathFromUrl = (url) => {
|
|
349
403
|
try {
|
|
350
404
|
const parsedUrl = new URL(url);
|
|
@@ -361,6 +415,19 @@ var extractRepoPathFromUrl = (url) => {
|
|
|
361
415
|
return null;
|
|
362
416
|
}
|
|
363
417
|
};
|
|
418
|
+
var getLinkType = (url) => {
|
|
419
|
+
try {
|
|
420
|
+
const parsedUrl = new URL(url);
|
|
421
|
+
if (parsedUrl.hostname === "github.com") {
|
|
422
|
+
return "github";
|
|
423
|
+
} else if (parsedUrl.hostname.includes("figma.com")) {
|
|
424
|
+
return "figma";
|
|
425
|
+
}
|
|
426
|
+
return "unknown";
|
|
427
|
+
} catch {
|
|
428
|
+
return "unknown";
|
|
429
|
+
}
|
|
430
|
+
};
|
|
364
431
|
var formatUpdatedTime = (dateString) => {
|
|
365
432
|
const date = new Date(dateString);
|
|
366
433
|
const now = /* @__PURE__ */ new Date();
|
|
@@ -396,35 +463,77 @@ var formatUpdatedTime = (dateString) => {
|
|
|
396
463
|
};
|
|
397
464
|
var LinkPreview = ({ url }) => {
|
|
398
465
|
const [repoData, setRepoData] = useState3(null);
|
|
466
|
+
const [figmaData, setFigmaData] = useState3(null);
|
|
399
467
|
const [loading, setLoading] = useState3(true);
|
|
468
|
+
const [linkType, setLinkType] = useState3(
|
|
469
|
+
"unknown"
|
|
470
|
+
);
|
|
400
471
|
useEffect3(() => {
|
|
401
|
-
const
|
|
472
|
+
const loadLinkData = async () => {
|
|
402
473
|
setLoading(true);
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
474
|
+
const type = getLinkType(url);
|
|
475
|
+
setLinkType(type);
|
|
476
|
+
if (type === "github") {
|
|
477
|
+
const repoPath = extractRepoPathFromUrl(url);
|
|
478
|
+
if (repoPath) {
|
|
479
|
+
const data = await fetchGitHubRepoData(repoPath);
|
|
480
|
+
setRepoData(data);
|
|
481
|
+
}
|
|
482
|
+
} else if (type === "figma") {
|
|
483
|
+
const data = extractFigmaData(url);
|
|
484
|
+
setFigmaData(data);
|
|
407
485
|
}
|
|
408
486
|
setLoading(false);
|
|
409
487
|
};
|
|
410
|
-
|
|
488
|
+
loadLinkData();
|
|
411
489
|
}, [url]);
|
|
412
490
|
const repoName = repoData?.name || extractRepoPathFromUrl(url)?.split("/")[1] || "Repository";
|
|
413
491
|
const updatedTimeText = repoData?.updated_at ? formatUpdatedTime(repoData.updated_at) : "";
|
|
414
|
-
return /* @__PURE__ */ jsx5(
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
492
|
+
return /* @__PURE__ */ jsx5(
|
|
493
|
+
"a",
|
|
494
|
+
{
|
|
495
|
+
href: url,
|
|
496
|
+
target: "_blank",
|
|
497
|
+
rel: "noopener noreferrer",
|
|
498
|
+
className: link3,
|
|
499
|
+
children: linkType === "figma" && figmaData ? (
|
|
500
|
+
// Figma 프리뷰 렌더링
|
|
501
|
+
/* @__PURE__ */ jsxs3("div", { className: preview, children: [
|
|
502
|
+
/* @__PURE__ */ jsx5("div", { className: iconContainer, children: /* @__PURE__ */ jsx5(
|
|
503
|
+
"img",
|
|
504
|
+
{
|
|
505
|
+
src: figmaData.thumbnailUrl || "https://static.figma.com/app/icon/1/favicon.svg",
|
|
506
|
+
alt: "Figma icon",
|
|
507
|
+
className: icon
|
|
508
|
+
}
|
|
509
|
+
) }),
|
|
510
|
+
/* @__PURE__ */ jsxs3("div", { className: content2, children: [
|
|
511
|
+
/* @__PURE__ */ jsx5("div", { className: title2, children: figmaData.name }),
|
|
512
|
+
/* @__PURE__ */ jsx5("div", { className: description2, children: "www.figma.com" })
|
|
513
|
+
] })
|
|
514
|
+
] })
|
|
515
|
+
) : linkType === "github" ? (
|
|
516
|
+
// GitHub 프리뷰 렌더링
|
|
517
|
+
/* @__PURE__ */ jsxs3("div", { className: `${preview} ${githubPreview}`, children: [
|
|
518
|
+
/* @__PURE__ */ jsx5("div", { className: iconContainer, children: /* @__PURE__ */ jsx5(
|
|
519
|
+
"img",
|
|
520
|
+
{
|
|
521
|
+
src: repoData?.owner?.avatar_url || "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
|
|
522
|
+
alt: "Repository icon",
|
|
523
|
+
className: icon
|
|
524
|
+
}
|
|
525
|
+
) }),
|
|
526
|
+
/* @__PURE__ */ jsxs3("div", { className: `${content2} ${githubContent}`, children: [
|
|
527
|
+
/* @__PURE__ */ jsx5("div", { className: title2, children: repoName }),
|
|
528
|
+
/* @__PURE__ */ jsx5("div", { className: description2, children: loading ? "Loading..." : `${repoName} \u2022 ${updatedTimeText}` })
|
|
529
|
+
] })
|
|
530
|
+
] })
|
|
531
|
+
) : (
|
|
532
|
+
// 기본 링크 프리뷰 렌더링
|
|
533
|
+
/* @__PURE__ */ jsx5("div", { className: preview, children: /* @__PURE__ */ jsx5("div", { className: content2, children: /* @__PURE__ */ jsx5("div", { className: title2, children: url }) }) })
|
|
534
|
+
)
|
|
535
|
+
}
|
|
536
|
+
);
|
|
428
537
|
};
|
|
429
538
|
var LinkPreview_default = LinkPreview;
|
|
430
539
|
|
|
@@ -455,8 +564,7 @@ var MemoizedLinkPreview = React4.memo(
|
|
|
455
564
|
import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
456
565
|
var RecursiveListItem = ({ block, index }) => {
|
|
457
566
|
const blockProps = {
|
|
458
|
-
tabIndex: 0
|
|
459
|
-
"data-block-id": block.id
|
|
567
|
+
tabIndex: 0
|
|
460
568
|
};
|
|
461
569
|
const blockType = block.type;
|
|
462
570
|
const richTexts = block[blockType]?.rich_text;
|
|
@@ -528,11 +636,6 @@ var codeBlock = "styles_codeBlock__1qn42yc0";
|
|
|
528
636
|
|
|
529
637
|
// src/components/Renderer/components/Code/CodeBlock.tsx
|
|
530
638
|
import Prism from "prismjs";
|
|
531
|
-
import "prismjs/themes/prism.css";
|
|
532
|
-
import "prismjs/components/prism-typescript";
|
|
533
|
-
import "prismjs/components/prism-javascript";
|
|
534
|
-
import "prismjs/components/prism-jsx";
|
|
535
|
-
import "prismjs/components/prism-tsx";
|
|
536
639
|
import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
537
640
|
if (typeof window !== "undefined") {
|
|
538
641
|
window.Prism = Prism;
|
|
@@ -586,34 +689,195 @@ var Heading3 = ({
|
|
|
586
689
|
return /* @__PURE__ */ jsx8("h3", { className: heading3, ...props, children });
|
|
587
690
|
};
|
|
588
691
|
|
|
589
|
-
// src/components/Renderer/components/
|
|
692
|
+
// src/components/Renderer/components/Column/styles.css.ts
|
|
693
|
+
var columnContainer = "styles_columnContainer__wle6we0";
|
|
694
|
+
var columnListContainer = "styles_columnListContainer__wle6we1";
|
|
695
|
+
|
|
696
|
+
// src/components/Renderer/components/Column/Column.tsx
|
|
590
697
|
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
698
|
+
var Column = ({ block, onFocus }) => {
|
|
699
|
+
if (!block || !block.children) return null;
|
|
700
|
+
return /* @__PURE__ */ jsx9("div", { className: columnContainer, children: block.children.map((childBlock, index) => /* @__PURE__ */ jsx9(
|
|
701
|
+
BlockRenderer_default,
|
|
702
|
+
{
|
|
703
|
+
block: childBlock,
|
|
704
|
+
onFocus,
|
|
705
|
+
index
|
|
706
|
+
},
|
|
707
|
+
childBlock.id
|
|
708
|
+
)) });
|
|
709
|
+
};
|
|
710
|
+
var Column_default = Column;
|
|
711
|
+
|
|
712
|
+
// src/components/Renderer/components/Column/ColumnList.tsx
|
|
713
|
+
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
714
|
+
var ColumnList = ({ block, onFocus }) => {
|
|
715
|
+
if (!block || !block.children) return null;
|
|
716
|
+
return /* @__PURE__ */ jsx10("div", { className: columnListContainer, children: block.children.map((column) => /* @__PURE__ */ jsx10(Column_default, { block: column, onFocus }, column.id)) });
|
|
717
|
+
};
|
|
718
|
+
var ColumnList_default = ColumnList;
|
|
719
|
+
|
|
720
|
+
// src/components/Renderer/components/Quote/styles.css.ts
|
|
721
|
+
var container2 = "styles_container__mra9n0";
|
|
722
|
+
|
|
723
|
+
// src/components/Renderer/components/Quote/Quote.tsx
|
|
724
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
725
|
+
var Quote = ({ richTexts, tabIndex }) => {
|
|
726
|
+
return /* @__PURE__ */ jsx11("blockquote", { className: container2, tabIndex, children: /* @__PURE__ */ jsx11(MemoizedRichText, { richTexts }) });
|
|
727
|
+
};
|
|
728
|
+
var Quote_default = Quote;
|
|
729
|
+
|
|
730
|
+
// src/components/Renderer/components/Table/styles.css.ts
|
|
731
|
+
var firstCell = "styles_firstCell__1rvbzfo4";
|
|
732
|
+
var hasRowHeader = "styles_hasRowHeader__1rvbzfo6";
|
|
733
|
+
var headerCell = "styles_headerCell__1rvbzfo2";
|
|
734
|
+
var lastCell = "styles_lastCell__1rvbzfo5";
|
|
735
|
+
var table = "styles_table__1rvbzfo1";
|
|
736
|
+
var tableCell = "styles_tableCell__1rvbzfo3";
|
|
737
|
+
var tableContainer = "styles_tableContainer__1rvbzfo0";
|
|
738
|
+
|
|
739
|
+
// src/components/Renderer/components/Table/TableRow.tsx
|
|
740
|
+
import { jsx as jsx12 } from "react/jsx-runtime";
|
|
741
|
+
var TableRow = ({
|
|
742
|
+
rowBlock,
|
|
743
|
+
cellClassName = "",
|
|
744
|
+
rowHeaderIndex = -1
|
|
745
|
+
}) => {
|
|
746
|
+
if (!rowBlock.table_row?.cells) {
|
|
747
|
+
return null;
|
|
748
|
+
}
|
|
749
|
+
const { cells } = rowBlock.table_row;
|
|
750
|
+
return /* @__PURE__ */ jsx12("tr", { children: cells.map((cell, index) => {
|
|
751
|
+
const isFirstCell = index === 0;
|
|
752
|
+
const isLastCell = index === cells.length - 1;
|
|
753
|
+
const isRowHeader = index === rowHeaderIndex;
|
|
754
|
+
let cellClasses = [tableCell, cellClassName];
|
|
755
|
+
if (isFirstCell) cellClasses.push(firstCell);
|
|
756
|
+
if (isLastCell) cellClasses.push(lastCell);
|
|
757
|
+
if (isRowHeader) cellClasses.push(hasRowHeader);
|
|
758
|
+
return /* @__PURE__ */ jsx12(
|
|
759
|
+
"td",
|
|
760
|
+
{
|
|
761
|
+
className: cellClasses.filter(Boolean).join(" "),
|
|
762
|
+
children: /* @__PURE__ */ jsx12(MemoizedRichText, { richTexts: cell })
|
|
763
|
+
},
|
|
764
|
+
`${rowBlock.id}-cell-${index}`
|
|
765
|
+
);
|
|
766
|
+
}) });
|
|
767
|
+
};
|
|
768
|
+
var TableRow_default = TableRow;
|
|
769
|
+
|
|
770
|
+
// src/components/Renderer/components/Table/Table.tsx
|
|
771
|
+
import { Fragment as Fragment3, jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
772
|
+
var Table = ({ block, tabIndex = 0 }) => {
|
|
773
|
+
if (!block.table || !block.children) {
|
|
774
|
+
return null;
|
|
775
|
+
}
|
|
776
|
+
const { table_width, has_column_header, has_row_header } = block.table;
|
|
777
|
+
const rows = block.children?.filter(
|
|
778
|
+
(child) => child.type === "table_row"
|
|
779
|
+
) || [];
|
|
780
|
+
return /* @__PURE__ */ jsx13("div", { className: tableContainer, children: /* @__PURE__ */ jsx13("table", { className: table, tabIndex, children: rows.length > 0 && /* @__PURE__ */ jsxs6(Fragment3, { children: [
|
|
781
|
+
has_column_header && rows[0] && /* @__PURE__ */ jsx13("thead", { children: /* @__PURE__ */ jsx13(TableRow_default, { rowBlock: rows[0], cellClassName: headerCell }) }),
|
|
782
|
+
/* @__PURE__ */ jsx13("tbody", { children: rows.filter(
|
|
783
|
+
(row) => row !== void 0 && row.type === "table_row"
|
|
784
|
+
).map((row, rowIndex) => {
|
|
785
|
+
if (has_column_header && rowIndex === 0) {
|
|
786
|
+
return null;
|
|
787
|
+
}
|
|
788
|
+
const actualRowIndex = has_column_header ? rowIndex - 1 : rowIndex;
|
|
789
|
+
return /* @__PURE__ */ jsx13(
|
|
790
|
+
TableRow_default,
|
|
791
|
+
{
|
|
792
|
+
rowBlock: row,
|
|
793
|
+
rowHeaderIndex: has_row_header ? 0 : -1
|
|
794
|
+
},
|
|
795
|
+
row.id
|
|
796
|
+
);
|
|
797
|
+
}) })
|
|
798
|
+
] }) }) });
|
|
799
|
+
};
|
|
800
|
+
var Table_default = Table;
|
|
801
|
+
|
|
802
|
+
// src/components/Renderer/components/Table/index.ts
|
|
803
|
+
var Table_default2 = Table_default;
|
|
804
|
+
|
|
805
|
+
// src/components/Renderer/components/Toggle/Toggle.tsx
|
|
806
|
+
import { useState as useState4 } from "react";
|
|
807
|
+
|
|
808
|
+
// src/components/Renderer/components/Toggle/styles.css.ts
|
|
809
|
+
var toggleContainer = "styles_toggleContainer__p7ue1z0";
|
|
810
|
+
var toggleContent = "styles_toggleContent__p7ue1z4";
|
|
811
|
+
var toggleHeader = "styles_toggleHeader__p7ue1z1";
|
|
812
|
+
var toggleIcon = "styles_toggleIcon__p7ue1z2";
|
|
813
|
+
var toggleIconOpen = "styles_toggleIconOpen__p7ue1z3";
|
|
814
|
+
|
|
815
|
+
// src/components/Renderer/components/Toggle/Toggle.tsx
|
|
816
|
+
import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
817
|
+
var Toggle = ({ block, tabIndex = 0, onFocus }) => {
|
|
818
|
+
const [isOpen, setIsOpen] = useState4(false);
|
|
819
|
+
if (!block.toggle || !block.children) {
|
|
820
|
+
return null;
|
|
821
|
+
}
|
|
822
|
+
const handleToggle = () => {
|
|
823
|
+
setIsOpen(!isOpen);
|
|
824
|
+
};
|
|
825
|
+
const handleKeyDown = (e) => {
|
|
826
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
827
|
+
e.preventDefault();
|
|
828
|
+
handleToggle();
|
|
829
|
+
}
|
|
830
|
+
};
|
|
831
|
+
return /* @__PURE__ */ jsxs7("div", { className: toggleContainer, children: [
|
|
832
|
+
/* @__PURE__ */ jsxs7(
|
|
833
|
+
"div",
|
|
834
|
+
{
|
|
835
|
+
className: toggleHeader,
|
|
836
|
+
onClick: handleToggle,
|
|
837
|
+
onKeyDown: handleKeyDown,
|
|
838
|
+
tabIndex,
|
|
839
|
+
onFocus,
|
|
840
|
+
role: "button",
|
|
841
|
+
"aria-expanded": isOpen,
|
|
842
|
+
children: [
|
|
843
|
+
/* @__PURE__ */ jsx14("span", { className: `${toggleIcon} ${isOpen ? toggleIconOpen : ""}`, children: "\u25B6" }),
|
|
844
|
+
/* @__PURE__ */ jsx14(RichTexts_default, { richTexts: block.toggle.rich_text })
|
|
845
|
+
]
|
|
846
|
+
}
|
|
847
|
+
),
|
|
848
|
+
isOpen && block.children && /* @__PURE__ */ jsx14("div", { className: toggleContent, children: block.children.map((childBlock, index) => /* @__PURE__ */ jsx14(
|
|
849
|
+
BlockRenderer_default,
|
|
850
|
+
{
|
|
851
|
+
block: childBlock,
|
|
852
|
+
index
|
|
853
|
+
},
|
|
854
|
+
childBlock.id
|
|
855
|
+
)) })
|
|
856
|
+
] });
|
|
857
|
+
};
|
|
858
|
+
var Toggle_default = Toggle;
|
|
859
|
+
|
|
860
|
+
// src/components/Renderer/components/Block/BlockRenderer.tsx
|
|
861
|
+
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
591
862
|
var BlockRenderer = ({ block, onFocus, index }) => {
|
|
592
863
|
if (!block) return null;
|
|
593
864
|
const blockProps = {
|
|
594
865
|
tabIndex: 0,
|
|
595
|
-
onFocus
|
|
596
|
-
"data-block-id": block.id
|
|
866
|
+
onFocus
|
|
597
867
|
};
|
|
598
868
|
switch (block.type) {
|
|
599
869
|
case "link_preview":
|
|
600
|
-
return /* @__PURE__ */
|
|
601
|
-
MemoizedLinkPreview,
|
|
602
|
-
{
|
|
603
|
-
url: block.link_preview.url,
|
|
604
|
-
...blockProps
|
|
605
|
-
}
|
|
606
|
-
);
|
|
870
|
+
return /* @__PURE__ */ jsx15(MemoizedLinkPreview, { url: block.link_preview.url, ...blockProps });
|
|
607
871
|
case "paragraph":
|
|
608
|
-
return /* @__PURE__ */
|
|
872
|
+
return /* @__PURE__ */ jsx15(Paragraph, { ...blockProps, children: /* @__PURE__ */ jsx15(MemoizedRichText, { richTexts: block.paragraph.rich_text }) });
|
|
609
873
|
case "heading_1":
|
|
610
|
-
return /* @__PURE__ */
|
|
874
|
+
return /* @__PURE__ */ jsx15(Heading1, { ...blockProps, children: /* @__PURE__ */ jsx15(MemoizedRichText, { richTexts: block.heading_1.rich_text }) });
|
|
611
875
|
case "heading_2":
|
|
612
|
-
return /* @__PURE__ */
|
|
876
|
+
return /* @__PURE__ */ jsx15(Heading2, { ...blockProps, children: /* @__PURE__ */ jsx15(MemoizedRichText, { richTexts: block.heading_2.rich_text }) });
|
|
613
877
|
case "heading_3":
|
|
614
|
-
return /* @__PURE__ */
|
|
878
|
+
return /* @__PURE__ */ jsx15(Heading3, { ...blockProps, children: /* @__PURE__ */ jsx15(MemoizedRichText, { richTexts: block.heading_3.rich_text }) });
|
|
615
879
|
case "code":
|
|
616
|
-
return /* @__PURE__ */
|
|
880
|
+
return /* @__PURE__ */ jsx15("div", { ...blockProps, children: /* @__PURE__ */ jsx15(
|
|
617
881
|
CodeBlock_default,
|
|
618
882
|
{
|
|
619
883
|
code: block.code.rich_text[0].text.content,
|
|
@@ -622,7 +886,7 @@ var BlockRenderer = ({ block, onFocus, index }) => {
|
|
|
622
886
|
}
|
|
623
887
|
) });
|
|
624
888
|
case "image":
|
|
625
|
-
return /* @__PURE__ */
|
|
889
|
+
return /* @__PURE__ */ jsx15("figure", { ...blockProps, children: /* @__PURE__ */ jsx15(
|
|
626
890
|
MemoizedImage,
|
|
627
891
|
{
|
|
628
892
|
src: block.image.file?.url || block.image.external?.url,
|
|
@@ -632,8 +896,19 @@ var BlockRenderer = ({ block, onFocus, index }) => {
|
|
|
632
896
|
}
|
|
633
897
|
) });
|
|
634
898
|
case "bookmark":
|
|
635
|
-
return /* @__PURE__ */
|
|
899
|
+
return /* @__PURE__ */ jsx15(MemoizedBookmark, { url: block.bookmark.url });
|
|
900
|
+
case "column_list":
|
|
901
|
+
return /* @__PURE__ */ jsx15(ColumnList_default, { block, onFocus });
|
|
902
|
+
case "column":
|
|
903
|
+
return null;
|
|
904
|
+
case "quote":
|
|
905
|
+
return /* @__PURE__ */ jsx15(Quote_default, { richTexts: block.quote.rich_text, ...blockProps });
|
|
906
|
+
case "table":
|
|
907
|
+
return /* @__PURE__ */ jsx15(Table_default2, { block, tabIndex: blockProps.tabIndex });
|
|
908
|
+
case "toggle":
|
|
909
|
+
return /* @__PURE__ */ jsx15(Toggle_default, { block, tabIndex: blockProps.tabIndex, onFocus });
|
|
636
910
|
default:
|
|
911
|
+
console.log(`\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uBE14\uB85D \uD0C0\uC785: ${block.type}`, block);
|
|
637
912
|
return null;
|
|
638
913
|
}
|
|
639
914
|
};
|
|
@@ -644,9 +919,9 @@ var darkTheme = "theme_darkTheme__sq3jkb15";
|
|
|
644
919
|
var lightTheme = "theme_lightTheme__sq3jkb14";
|
|
645
920
|
|
|
646
921
|
// src/components/Title/index.tsx
|
|
647
|
-
import { jsx as
|
|
922
|
+
import { jsx as jsx16 } from "react/jsx-runtime";
|
|
648
923
|
var Title = ({ title: title3 }) => {
|
|
649
|
-
return /* @__PURE__ */
|
|
924
|
+
return /* @__PURE__ */ jsx16(Heading1, { children: title3 });
|
|
650
925
|
};
|
|
651
926
|
var Title_default = Title;
|
|
652
927
|
|
|
@@ -654,18 +929,18 @@ var Title_default = Title;
|
|
|
654
929
|
var cover = "styles_cover__p0cp8d0";
|
|
655
930
|
|
|
656
931
|
// src/components/Cover/index.tsx
|
|
657
|
-
import { jsx as
|
|
932
|
+
import { jsx as jsx17 } from "react/jsx-runtime";
|
|
658
933
|
var Cover = ({ src, alt }) => {
|
|
659
|
-
return /* @__PURE__ */
|
|
934
|
+
return /* @__PURE__ */ jsx17("img", { src, alt, className: cover });
|
|
660
935
|
};
|
|
661
936
|
var Cover_default = Cover;
|
|
662
937
|
|
|
663
938
|
// src/components/Renderer/index.tsx
|
|
664
|
-
import { Fragment as
|
|
665
|
-
var Renderer =
|
|
939
|
+
import { Fragment as Fragment4, jsx as jsx18, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
940
|
+
var Renderer = React7.memo(
|
|
666
941
|
({ blocks, isDarkMode = false, title: title3, cover: cover2, onBlockFocus }) => {
|
|
667
942
|
const theme = isDarkMode ? darkTheme : lightTheme;
|
|
668
|
-
const [focusedIndex, setFocusedIndex] =
|
|
943
|
+
const [focusedIndex, setFocusedIndex] = useState5(-1);
|
|
669
944
|
const handleBlockFocus = useCallback(
|
|
670
945
|
(index) => {
|
|
671
946
|
setFocusedIndex(index);
|
|
@@ -682,7 +957,7 @@ var Renderer = React6.memo(
|
|
|
682
957
|
const listItemType = `${listType}_list_item`;
|
|
683
958
|
if (block.type === listItemType && (i === 0 || blocks[i - 1]?.type !== listItemType)) {
|
|
684
959
|
result.push(
|
|
685
|
-
/* @__PURE__ */
|
|
960
|
+
/* @__PURE__ */ jsx18(
|
|
686
961
|
ListBlocksRenderer_default,
|
|
687
962
|
{
|
|
688
963
|
blocks,
|
|
@@ -703,7 +978,7 @@ var Renderer = React6.memo(
|
|
|
703
978
|
continue;
|
|
704
979
|
} else {
|
|
705
980
|
result.push(
|
|
706
|
-
/* @__PURE__ */
|
|
981
|
+
/* @__PURE__ */ jsx18(
|
|
707
982
|
BlockRenderer_default,
|
|
708
983
|
{
|
|
709
984
|
block,
|
|
@@ -717,15 +992,15 @@ var Renderer = React6.memo(
|
|
|
717
992
|
}
|
|
718
993
|
return result;
|
|
719
994
|
}, [blocks, handleBlockFocus]);
|
|
720
|
-
return /* @__PURE__ */
|
|
721
|
-
cover2 && /* @__PURE__ */
|
|
722
|
-
/* @__PURE__ */
|
|
995
|
+
return /* @__PURE__ */ jsxs8(Fragment4, { children: [
|
|
996
|
+
cover2 && /* @__PURE__ */ jsx18(Cover_default, { src: cover2, alt: title3 || "Notion page content" }),
|
|
997
|
+
/* @__PURE__ */ jsxs8(
|
|
723
998
|
"article",
|
|
724
999
|
{
|
|
725
1000
|
className: `${theme} ${container}`,
|
|
726
1001
|
"aria-label": title3 || "Notion page content",
|
|
727
1002
|
children: [
|
|
728
|
-
title3 && /* @__PURE__ */
|
|
1003
|
+
title3 && /* @__PURE__ */ jsx18(Title_default, { title: title3 }),
|
|
729
1004
|
renderedBlocks
|
|
730
1005
|
]
|
|
731
1006
|
}
|