feat : dreamgineer ask me try to use this and now im ran out of token sad [no ci]

This commit is contained in:
2026-09-14 18:54:32 +07:00 Unverified
parent dc7f61aa6e
commit 4a6bfd599a
34 changed files with 3222 additions and 332 deletions
+110
View File
@@ -0,0 +1,110 @@
import {
createElement,
isValidElement,
type ReactNode,
type ReactElement,
} from "react";
import type { ExportRequest } from "../types";
import { ConstellationImage } from "./constellation";
import { WeaponComparisonImage } from "./weapon";
import { TeamExportImage } from "./team";
import { MaterialPoster } from "./materials";
import { OverviewPoster } from "./overview";
import { ArtifactSectionContent } from "./artifact";
type Props = {
children?: ReactNode;
className?: string;
[key: string]: unknown;
};
// Resolve only our pure functions. Filter sections and notes before layout, without DOM mutation.
export function resolveTemplate(
node: ReactNode,
request: ExportRequest,
): ReactNode {
if (Array.isArray(node))
return node.map((child) => resolveTemplate(child, request));
if (!isValidElement<Props>(node)) return node;
if (typeof node.type === "function") {
return resolveTemplate(
(node.type as (props: Props) => ReactNode)(node.props),
request,
);
}
const props = { ...node.props };
if (request.withoutNotes && "data-export-note" in props) return null;
if (request.kind === "artifact") {
const { sections, recommendedCondition, targetCondition, includeNote } =
request.data;
const section = props["data-artifact-export-section"];
if (
section &&
(section === "note"
? !includeNote
: !sections.includes(section as (typeof sections)[number]))
)
return null;
if (
props["data-recommended-condition"] !== undefined &&
Number(props["data-recommended-condition"]) !== recommendedCondition
)
return null;
if (
props["data-target-condition"] !== undefined &&
Number(props["data-target-condition"]) !== targetCondition
)
return null;
const profile = request.data.guide.artifactProfile;
const hasNote =
includeNote && !request.withoutNotes && Boolean(profile?.note);
const hasTargets =
sections.includes("target-stats") &&
Boolean(
profile?.targetConditions.filter((condition) => condition.rows.length)[
targetCondition
],
);
const hasTalents =
sections.includes("talents") && Boolean(profile?.talents.length);
if (
props.className?.includes("artifact-export-right") &&
!hasNote &&
!hasTargets &&
!hasTalents
)
return null;
}
props.children = resolveTemplate(props.children, request);
return createElement(node.type, { ...props, key: node.key });
}
export function exportTemplate(request: ExportRequest): ReactElement {
let content: ReactNode;
switch (request.kind) {
case "constellation":
content = <ConstellationImage {...request.data} />;
break;
case "weapon":
content = <WeaponComparisonImage {...request.data} />;
break;
case "team":
content = <TeamExportImage {...request.data} />;
break;
case "materials":
content = <MaterialPoster {...request.data} />;
break;
case "overview":
content = <OverviewPoster {...request.data} />;
break;
case "artifact":
content = <ArtifactSectionContent guide={request.data.guide} />;
break;
}
return (
<div
className="export-root"
style={{ display: "block", width: request.width, height: request.height }}
>
{resolveTemplate(content, request)}
</div>
);
}