返回 presentation-ai
connected-circles-static.tsx
根目录 / src / components / notebook / presentation / editor / custom-elements / static / connected-circles-static.tsx
1 "use client";
2
3 import { SlateElement, type SlateElementProps } from "platejs/static";
4
5 import { cn } from "@/lib/utils";
6 import {
7 CONNECTED_CIRCLE_GAP_PX,
8 CONNECTED_CIRCLE_SIZE_PX,
9 } from "../connected-circles-layout";
10 import { getDiagramFitFrameStyle, useDiagramFitScale } from "../diagram-fit";
11 import {
12 getStaticDiagramJustifyClass,
13 type StaticDiagramElement,
14 } from "./diagram-static-utils";
15
16 const CONNECTED_CIRCLES_LAYOUT_WIDTH_PX =
17 CONNECTED_CIRCLE_SIZE_PX * 2 + CONNECTED_CIRCLE_GAP_PX;
18 const CONNECTED_CIRCLES_MIN_LAYOUT_HEIGHT_PX =
19 CONNECTED_CIRCLE_SIZE_PX * 2 + CONNECTED_CIRCLE_GAP_PX + 32;
20
21 export default function ConnectedCirclesStatic(props: SlateElementProps) {
22 const element = props.element as StaticDiagramElement;
23 const { containerRef, fitStyle, frameStyle, layoutRef } =
24 useDiagramFitScale<HTMLDivElement>(
25 CONNECTED_CIRCLES_LAYOUT_WIDTH_PX,
26 CONNECTED_CIRCLES_MIN_LAYOUT_HEIGHT_PX,
27 );
28
29 return (
30 <SlateElement {...props} className="my-4">
31 <div
32 ref={containerRef}
33 className={cn(
34 "w-full overflow-visible",
35 getStaticDiagramJustifyClass(element.alignment),
36 )}
37 >
38 <div
39 style={{
40 ...frameStyle,
41 ...getDiagramFitFrameStyle(element.alignment),
42 }}
43 >
44 <div
45 ref={layoutRef}
46 className="relative inline-grid place-items-center gap-1 overflow-visible py-4"
47 style={{
48 ...fitStyle,
49 alignContent: "center",
50 gridAutoRows: CONNECTED_CIRCLE_SIZE_PX,
51 gridTemplateColumns: `repeat(2, ${CONNECTED_CIRCLE_SIZE_PX}px)`,
52 minHeight: CONNECTED_CIRCLES_MIN_LAYOUT_HEIGHT_PX,
53 }}
54 >
55 {props.children}
56 </div>
57 </div>
58 </div>
59 </SlateElement>
60 );
61 }
62
62 lines Plain Text