@yadeck/slide-components-basic 0.0.0-stage → 0.1.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.
@@ -0,0 +1,220 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import hljs from "highlight.js";
3
+ import { z } from "zod";
4
+ import { Block, RichText, Slide, pick, pickAll, } from "@yadeck/slide-core";
5
+ import { Notes, PAGE, SlideHeading } from "./chrome.js";
6
+ // ---- deck ----
7
+ export const DefaultDeck = (deck) => (_jsx("main", { className: "yd-deck", children: deck.slides.map((s) => (_jsx(Slide, { data: s }, s.id))) }));
8
+ // ---- slide ----
9
+ /**
10
+ * `card` を付けた slide。item をカードで横並びにし、それ以外の block は前置きとして上に置く。
11
+ * この bind が無い構成では tags 無しの slide に fallback して縦に並ぶ。
12
+ */
13
+ /** カードの列数。3 枚までは 1 行、4 枚は 2×2、5 枚以上は 3 列で折り返す(1 枚に見出しと説明が入る分、columns より早く折り返す) */
14
+ export function cardColumns(n) {
15
+ if (n <= 3)
16
+ return Math.max(1, n);
17
+ return n === 4 ? 2 : 3;
18
+ }
19
+ export const CardSlide = (slide) => {
20
+ const [heading, rest] = pick(slide.items, ["heading"]);
21
+ const [entries, lead] = pickAll(rest, ["item"]);
22
+ return (_jsxs("div", { className: `${PAGE} b-card`, children: [heading && _jsx(SlideHeading, { block: heading, description: slide.description }), lead.length > 0 && (_jsx("div", { className: "flex flex-col gap-3", children: lead.map((b) => (_jsx(Block, { data: b }, b.id))) })), _jsx("div", { className: "grid min-h-0 flex-1 auto-rows-[minmax(0,1fr)] gap-6", style: { gridTemplateColumns: `repeat(${cardColumns(entries.length)}, minmax(0, 1fr))` }, children: entries.map((b) => (_jsx("div", { className: "flex min-h-0 flex-col justify-center rounded-2xl bg-ink/5 px-8 py-5 [&_.b-item]:items-center [&_.b-item]:text-center", children: _jsx(Block, { data: b }) }, b.id))) })] }));
23
+ };
24
+ export const headerType = z.object({
25
+ title: z.string().describe("発表タイトル"),
26
+ subtitle: z.string().optional().describe("副題"),
27
+ author: z.string().optional().describe("発表者名"),
28
+ affiliation: z.string().optional().describe("所属。author の下に小さく出す"),
29
+ event: z.string().optional().describe("イベント名。右下に date と並べる"),
30
+ date: z.string().optional().describe("日付"),
31
+ logo: z.string().optional().describe("ロゴ画像。public/ のファイルは ./logo.svg、外部は URL。右上に白抜きで出す"),
32
+ });
33
+ /**
34
+ * 表紙。title / subtitle を中央左寄せで大きく、発表者情報を左下、イベント情報を右下に置く。
35
+ * items は title の下に補足として並ぶ(通常は空)。
36
+ */
37
+ export const HeaderSlide = (slide) => (_jsxs("div", { className: "b-header absolute inset-0 flex flex-col overflow-hidden bg-linear-to-br from-primary to-primary-deep px-20 py-14 text-surface", children: [_jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute -right-40 -bottom-64 size-[640px] rounded-full bg-accent/10" }), _jsx("div", { "aria-hidden": "true", className: "absolute inset-x-0 bottom-0 h-3 bg-accent" }), slide.logo && _jsx("img", { className: "absolute top-14 right-20 h-12 w-auto brightness-0 invert", src: slide.logo, alt: "" }), _jsxs("div", { className: "relative flex flex-1 flex-col justify-center", children: [_jsxs("div", { className: "flex flex-col gap-5 border-l-[10px] border-accent pl-8", children: [_jsx("h1", { className: "m-0 text-h1 leading-[1.25] font-bold", children: _jsx(RichText, { text: slide.title }) }), slide.subtitle && (_jsx("p", { className: "m-0 text-h3 leading-snug font-normal text-accent", children: _jsx(RichText, { text: slide.subtitle }) }))] }), slide.items.length > 0 && (_jsx("div", { className: "mt-8 flex flex-col gap-3", children: slide.items.map((b) => (_jsx(Block, { data: b }, b.id))) }))] }), _jsxs("div", { className: "relative flex items-end justify-between gap-6 text-small leading-snug", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [slide.author && _jsx("span", { className: "text-h4 font-bold", children: slide.author }), slide.affiliation && _jsx("span", { className: "opacity-85", children: slide.affiliation })] }), _jsxs("div", { className: "flex flex-col items-end gap-1 opacity-85", children: [slide.event && _jsx("span", { children: slide.event }), slide.date && _jsx("span", { children: slide.date })] })] })] }));
38
+ export const profileType = z.object({
39
+ name: z.string().describe("名前"),
40
+ role: z.string().optional().describe("肩書き・役割"),
41
+ affiliation: z.string().optional().describe("所属"),
42
+ photo: z.string().optional().describe("顔写真。無ければ name の頭文字を accent の円で出す"),
43
+ accounts: z.record(z.string(), z.string()).optional().describe("SNS や GitHub の ID。{ x: id, github: id } の形"),
44
+ });
45
+ const ACCOUNT_LABEL = { x: "X", twitter: "X", github: "GitHub", bluesky: "Bluesky", mastodon: "Mastodon", zenn: "Zenn", qiita: "Qiita" };
46
+ /**
47
+ * 自己紹介。左に名前・肩書き・写真、右に items(heading があれば右上の見出しに)。
48
+ */
49
+ export const ProfileSlide = (slide) => {
50
+ const [heading, rest] = pick(slide.items, ["heading"]);
51
+ return (_jsxs("div", { className: `${PAGE} b-profile`, children: [heading && (_jsx(SlideHeading, { block: heading, description: slide.description })), _jsxs("div", { className: "grid min-h-0 flex-1 grid-cols-[380px_1fr] gap-12", children: [_jsxs("div", { className: "relative flex flex-col items-center justify-center gap-6 overflow-hidden rounded-2xl bg-linear-to-br from-primary to-primary-deep px-8 py-10 text-center text-surface", children: [_jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute -right-20 -bottom-24 size-72 rounded-full bg-accent/15" }), slide.photo ? (_jsx("img", { className: "relative size-52 rounded-full object-cover ring-6 ring-accent", src: slide.photo, alt: "" })) : (_jsx("div", { className: "relative flex size-52 items-center justify-center rounded-full bg-surface/10 text-display font-extrabold text-accent ring-6 ring-accent", children: Array.from(slide.name)[0] })), _jsxs("div", { className: "relative flex flex-col gap-1", children: [_jsx("span", { className: "text-h3 font-bold", children: slide.name }), slide.role && _jsx("span", { className: "text-body text-accent", children: slide.role }), slide.affiliation && _jsx("span", { className: "text-small opacity-85", children: slide.affiliation })] }), slide.accounts && (_jsx("div", { className: "relative flex flex-col gap-1 text-small", children: Object.entries(slide.accounts).map(([service, id]) => (_jsxs("span", { children: [_jsx("span", { className: "mr-2 text-accent", children: ACCOUNT_LABEL[service.toLowerCase()] ?? service }), "@", id] }, service))) }))] }), _jsx("div", { className: "flex min-w-0 flex-col justify-center gap-6", children: rest.map((b) => (_jsx(Block, { data: b }, b.id))) })] })] }));
52
+ };
53
+ export const sectionHeaderType = z.object({
54
+ number: z.string().optional().describe("章番号。\"01\" のように表示したい文字列"),
55
+ });
56
+ /**
57
+ * 章扉。表紙と同じ primary の地と accent の縦バーで、本文ページとの切り替わりを見せる。
58
+ * number は左上に accent で大きく、右下に透かしでもう一度出す
59
+ */
60
+ export const SectionHeaderSlide = (slide) => {
61
+ const [heading, rest] = pick(slide.items, ["heading"]);
62
+ const [bodies] = pickAll(rest, ["body"]);
63
+ return (_jsxs("div", { className: "b-section absolute inset-0 flex flex-col justify-center overflow-hidden bg-linear-to-br from-primary to-primary-deep px-20 py-14 text-surface [&_.b-heading]:m-0 [&_.b-heading]:text-[64px] [&_.b-heading]:leading-tight [&_.b-heading]:text-surface [&_.b-body]:m-0 [&_.b-body]:text-h3 [&_.b-body]:text-accent", children: [slide.number && (_jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute -right-6 -bottom-28 text-[420px] leading-none font-extrabold text-surface/5 select-none", children: slide.number })), _jsx("div", { "aria-hidden": "true", className: "absolute inset-x-0 bottom-0 h-3 bg-accent" }), _jsxs("div", { className: "relative flex flex-col gap-6", children: [slide.number && _jsx("div", { className: "text-display leading-none font-extrabold text-accent", children: slide.number }), _jsxs("div", { className: "flex flex-col gap-4 border-l-[10px] border-accent pl-8", children: [heading && _jsx(Block, { data: heading }), bodies.map((b) => (_jsx(Block, { data: b }, b.id)))] })] }), _jsx(Notes, { items: slide.items })] }));
64
+ };
65
+ /** 見出し + 前置き + left / right の 2 列。left / right の無い block は前置きとして列の上に置く */
66
+ export const TwoColumnSlide = (slide) => {
67
+ const [heading, rest] = pick(slide.items, ["heading"]);
68
+ const [right, rest2] = pickAll(rest, ["right"]);
69
+ const [left, lead] = pickAll(rest2, ["left"]);
70
+ // 列の中の code が収まるよう、pane 相当の寸法を渡す(幅は列幅、高さは列の半分程度を上限とみなす)
71
+ const column = (blocks) => (_jsx("div", { className: "flex min-w-0 flex-col gap-5 [&_.b-heading]:text-h3 [&_.b-heading]:text-primary", style: { "--pane-w": "540px", "--pane-h": "260px" }, children: blocks.map((b) => (_jsx(Block, { data: b }, b.id))) }));
72
+ return (_jsxs("div", { className: `${PAGE} b-two-column`, children: [heading && _jsx(SlideHeading, { block: heading, description: slide.description }), lead.length > 0 && (_jsx("div", { className: "flex flex-col gap-3", children: lead.map((b) => (_jsx(Block, { data: b }, b.id))) })), _jsxs("div", { className: "grid min-h-0 flex-1 grid-cols-2 gap-10", children: [column(left), column(right)] })] }));
73
+ };
74
+ // ---- block ----
75
+ export const DefaultBlock = (block) => _jsx(RichText, { as: "div", className: "b-body", text: block.text });
76
+ export const headingType = z.object({
77
+ level: z.number().int().min(1).max(4).optional().describe("見出しレベル 1〜4。既定 2"),
78
+ });
79
+ const HEADING_SIZE = { 1: "text-h1", 2: "text-h2", 3: "text-h3", 4: "text-h4" };
80
+ /** 見出し。文字サイズは level で決まるが、slide 側が `[&_.b-heading]:text-*` で上書きできる */
81
+ export const HeadingBlock = (block) => {
82
+ const level = (block.level ?? 2);
83
+ const Tag = `h${level}`;
84
+ return (_jsx(Tag, { className: `b-heading m-0 leading-tight font-bold ${HEADING_SIZE[level]}`, children: _jsx(RichText, { text: block.text }) }));
85
+ };
86
+ export const BodyBlock = (block) => _jsx(RichText, { as: "div", className: "b-body", text: block.text });
87
+ export const listType = z.object({
88
+ ordered: z.boolean().optional().describe("番号付きにする"),
89
+ focus: z.number().int().min(1).optional().describe("焦点にする項目の番号(1 始まり)。他の項目は薄くなる"),
90
+ });
91
+ /** text の各行を項目にする。markdown の箇条書きは body でも書けるので、こちらは行区切りの簡易記法 */
92
+ export const ListBlock = (block) => {
93
+ const lines = (block.text ?? "").split("\n").filter((l) => l.trim().length > 0);
94
+ const Tag = block.ordered ? "ol" : "ul";
95
+ return (_jsx(Tag, { className: `b-list m-0 pl-[1.2em] marker:text-accent ${block.ordered ? "list-decimal" : "list-disc"}`, children: lines.map((line, i) => (_jsx("li", { className: `my-1 ${block.focus ? (block.focus === i + 1 ? "font-bold text-primary" : "opacity-50") : ""}`, children: _jsx(RichText, { text: line }) }, i))) }));
96
+ };
97
+ export const codeType = z.object({
98
+ lang: z.string().optional().describe("言語。省略で自動判定、text でログなどを無色表示"),
99
+ caption: z.string().optional().describe("コードの下に添える 1 行"),
100
+ focus: z
101
+ .union([z.string(), z.number().int().min(1), z.array(z.union([z.string(), z.number().int().min(1)]))])
102
+ .optional()
103
+ .describe('焦点にする行。行番号(1 始まり)、"6-8" の範囲、または行に含まれる文字列。配列で複数可。他の行は薄くなる'),
104
+ });
105
+ /** focus の指定を行番号(0 始まり)の集合にする */
106
+ export function focusLines(lines, focus) {
107
+ const set = new Set();
108
+ if (focus === undefined)
109
+ return set;
110
+ for (const f of Array.isArray(focus) ? focus : [focus]) {
111
+ if (typeof f === "number") {
112
+ set.add(f - 1);
113
+ continue;
114
+ }
115
+ const range = f.match(/^(\d+)-(\d+)$/);
116
+ if (range) {
117
+ for (let i = Number(range[1]); i <= Number(range[2]); i++)
118
+ set.add(i - 1);
119
+ continue;
120
+ }
121
+ lines.forEach((l, i) => {
122
+ if (l.includes(f))
123
+ set.add(i);
124
+ });
125
+ }
126
+ return set;
127
+ }
128
+ /**
129
+ * ハイライト済み HTML を行ごとに分ける。行をまたぐ span(複数行コメントなど)は
130
+ * 行末で閉じて次の行頭で開き直す。
131
+ */
132
+ export function splitHighlighted(html) {
133
+ const out = [];
134
+ const open = [];
135
+ for (const raw of html.split("\n")) {
136
+ let line = open.join("");
137
+ for (const m of raw.matchAll(/<span[^>]*>|<\/span>/g)) {
138
+ if (m[0] === "</span>")
139
+ open.pop();
140
+ else
141
+ open.push(m[0]);
142
+ }
143
+ line += raw + "</span>".repeat(open.length);
144
+ out.push(line);
145
+ }
146
+ return out;
147
+ }
148
+ /**
149
+ * コード。highlight.js で SSG 時に色付けする。
150
+ * 行数と最大行長を CSS 変数で渡し、pane に収まるフォントサイズを CSS の calc で決める(styles.ts)。
151
+ */
152
+ /** コードの最大行幅(全角 2)と行数。フォントサイズの計算に使う */
153
+ export function codeSize(text) {
154
+ const lines = (text ?? "").replace(/\n$/, "").split("\n");
155
+ return { cols: Math.max(1, ...lines.map(displayWidth)), rows: lines.length };
156
+ }
157
+ /** 箱の上下余白(40px)と、caption があればその 1 行分(40px)。高さからこの分を引いた残りに行を収める */
158
+ export function codeChrome(caption) {
159
+ return caption ? 80 : 40;
160
+ }
161
+ export const CodeBlock = (block) => {
162
+ const code = (block.text ?? "").replace(/\n$/, "");
163
+ const lines = code.split("\n");
164
+ const { cols } = codeSize(code);
165
+ // lang 無しは自動判定、text / plain はログなどの無色表示
166
+ const plain = block.lang === "text" || block.lang === "plain" || block.lang === "plaintext";
167
+ const lang = block.lang && hljs.getLanguage(block.lang) ? block.lang : undefined;
168
+ const html = plain ? escapeHtml(code) : lang ? hljs.highlight(code, { language: lang }).value : hljs.highlightAuto(code).value;
169
+ const focus = focusLines(lines, block.focus);
170
+ const rows = splitHighlighted(html);
171
+ // 箱は内容の高さで止め、pane の中では縦中央に置く(短いコードで黒い箱が間延びしない)
172
+ return (_jsxs("figure", { className: "m-0 flex min-h-0 flex-1 flex-col justify-center gap-2", children: [_jsx("pre", { className: "b-code m-0 max-h-full min-h-0 overflow-hidden rounded-lg bg-code py-5 font-mono leading-snug text-code-ink", "data-lang": block.lang, style: { "--code-cols": cols, "--code-rows": lines.length, "--code-chrome": `${codeChrome(block.caption)}px` }, children: _jsx("code", { className: "hljs block", children: rows.map((row, i) => (_jsx("span", { className: `block border-l-4 px-5 ${focus.size === 0 ? "border-transparent" : focus.has(i) ? "border-accent bg-accent/15" : "border-transparent opacity-40"}`, dangerouslySetInnerHTML: { __html: row || " " } }, i))) }) }), block.caption && (_jsx("figcaption", { className: "shrink-0 text-small text-muted", children: _jsx(RichText, { text: block.caption }) }))] }));
173
+ };
174
+ export const imageType = z.object({
175
+ src: z.string().describe("画像のパス(public/ なら ./name.png)か URL"),
176
+ alt: z.string().optional().describe("代替テキスト"),
177
+ width: z.union([z.string(), z.number()]).optional().describe("幅を固定したいときだけ。既定は pane いっぱい"),
178
+ });
179
+ /** 画像。pane いっぱいにアスペクト比を保って収める。width 指定があればその幅にする */
180
+ export const ImageBlock = (block) => (_jsxs("figure", { className: "b-image m-0 flex min-h-0 flex-1 flex-col items-center gap-2", children: [_jsx("img", { className: block.width ? "max-h-full" : "min-h-0 w-full flex-1 object-contain", src: block.src, alt: block.alt ?? "", style: block.width ? { width: block.width } : undefined }), block.text && (_jsx("figcaption", { className: "shrink-0 text-small text-muted", children: _jsx(RichText, { text: block.text }) }))] }));
181
+ export const videoType = z.object({
182
+ url: z.string().describe("YouTube の watch / youtu.be / shorts の URL、または iframe で開ける URL"),
183
+ });
184
+ /** 動画。YouTube は embed URL に変換して iframe で埋め込む。text はキャプション */
185
+ export const VideoBlock = (block) => (_jsxs("figure", { className: "b-video m-0 flex min-h-0 flex-1 flex-col items-center gap-2", children: [_jsx("iframe", { className: "min-h-0 w-full flex-1 rounded-lg border-0 bg-code", src: toEmbedUrl(block.url), allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture", allowFullScreen: true }), block.text && (_jsx("figcaption", { className: "shrink-0 text-small text-muted", children: _jsx(RichText, { text: block.text }) }))] }));
186
+ /** 等幅フォントでの表示幅。全角(CJK や全角記号)は半角 2 つ分として数える */
187
+ function displayWidth(line) {
188
+ let w = 0;
189
+ for (const ch of line) {
190
+ const cp = ch.codePointAt(0);
191
+ w += cp >= 0x1100 && (cp <= 0x115f || (cp >= 0x2e80 && cp <= 0xa4cf) || (cp >= 0xac00 && cp <= 0xd7a3) || (cp >= 0xf900 && cp <= 0xfaff) || (cp >= 0xfe30 && cp <= 0xfe4f) || (cp >= 0xff00 && cp <= 0xff60) || (cp >= 0xffe0 && cp <= 0xffe6) || cp >= 0x20000) ? 2 : 1;
192
+ }
193
+ return w;
194
+ }
195
+ function escapeHtml(s) {
196
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
197
+ }
198
+ export function toEmbedUrl(url) {
199
+ const m = url.match(/(?:youtube\.com\/(?:watch\?v=|shorts\/)|youtu\.be\/)([\w-]{11})/);
200
+ return m ? `https://www.youtube.com/embed/${m[1]}` : url;
201
+ }
202
+ export const statType = z.object({
203
+ value: z.string().describe("大きく出す値。数字や固有名詞"),
204
+ label: z.string().optional().describe("値の説明。1 行"),
205
+ });
206
+ /** 数字や固有名詞を主役にする block。text は補足として小さく出す */
207
+ export const StatBlock = (block) => (_jsxs("div", { className: "b-stat flex items-baseline gap-5", children: [_jsx("span", { className: "w-[240px] shrink-0 text-right text-h1 leading-none font-extrabold text-primary", children: _jsx(RichText, { text: block.value }) }), _jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [block.label && (_jsx("span", { className: "text-h4 leading-tight font-bold", children: _jsx(RichText, { text: block.label }) })), block.text && (_jsx("span", { className: "text-small leading-snug text-muted", children: _jsx(RichText, { text: block.text }) }))] })] }));
208
+ export const itemType = z.object({
209
+ title: z.string().describe("項目名"),
210
+ logo: z.string().optional().describe("項目のロゴ画像"),
211
+ });
212
+ /** 並列の項目。タイトルと説明を持つ。見せ方(カードにするか等)は slide の Layout が決める */
213
+ export const ItemBlock = (block) => (_jsxs("div", { className: "b-item flex flex-col gap-2", children: [block.logo && _jsx("img", { className: "h-14 w-auto", src: block.logo, alt: "" }), _jsx("span", { className: "text-h4 leading-tight font-bold [word-break:keep-all]", children: _jsx(RichText, { text: block.title }) }), block.text && (_jsx("span", { className: "text-body leading-snug text-muted", children: _jsx(RichText, { text: block.text }) }))] }));
214
+ export const quoteType = z.object({
215
+ cite: z.string().optional().describe("出典"),
216
+ });
217
+ export const QuoteBlock = (block) => (_jsxs("blockquote", { className: "b-quote m-0 border-l-[6px] border-primary px-6 py-2 text-muted", children: [_jsx(RichText, { as: "div", className: "b-body", text: block.text }), block.cite && _jsx("cite", { className: "mt-2 block text-small text-faint", children: block.cite })] }));
218
+ /** 発表者ノート。画面・印刷には出さず、presenter モードが `.yd-notes` を拾って表示する */
219
+ export const NoteBlock = (block) => (_jsx("div", { className: "yd-notes b-note", hidden: true, children: _jsx(RichText, { as: "div", text: block.text }) }));
220
+ //# sourceMappingURL=layouts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layouts.js","sourceRoot":"","sources":["../src/layouts.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type BlockNode, type SlideNode } from "@yadeck/slide-core";
2
+ import type { CSSProperties } from "react";
3
+ type Pane = {
4
+ kind: "text";
5
+ blocks: BlockNode[];
6
+ } | {
7
+ kind: "block";
8
+ block: BlockNode;
9
+ };
10
+ /** 出現順を保ったまま pane に分ける。テキスト pane は最初のテキスト block の位置に置く */
11
+ export declare function toPanes(blocks: BlockNode[]): Pane[];
12
+ /** pane を左右の列に振り分ける。戻り値は [左の pane 数, 右の pane 数] */
13
+ export declare function splitColumns(n: number): [number, number];
14
+ interface PaneBox {
15
+ w: number;
16
+ h: number;
17
+ /** 縦に積んだときの高さの比(flex-grow) */
18
+ grow?: number;
19
+ }
20
+ /**
21
+ * 同じ slide に code が 2 つ以上あるとき、全部が収まる最小のフォントサイズを --code-fit で渡す。
22
+ * pane ごとに最大サイズを選ぶと、並んだコードの文字の大きさが揃わないため。式は styles.ts の .b-code と同じ
23
+ */
24
+ export declare function codeFitStyle(placed: {
25
+ pane: Pane;
26
+ box: PaneBox;
27
+ }[]): CSSProperties;
28
+ /**
29
+ * 縦に積む pane の高さの比。全部が code なら「行数 + caption などの余白」の比で分け、
30
+ * 行の多いコードが切れたり、短いコードの箱が間延びしたりしないようにする。それ以外は等分
31
+ */
32
+ export declare function paneWeights(panes: Pane[]): number[];
33
+ /** テキスト pane。body / list / tags 無しの block は行にまとめ、1 行なら中央に大きく、2 行以上なら箇条書きにする */
34
+ export declare const TextPane: ({ blocks }: {
35
+ blocks: BlockNode[];
36
+ }) => import("react").JSX.Element;
37
+ export declare const DefaultSlide: (slide: SlideNode) => import("react").JSX.Element;
38
+ /** columns の列数。4 までは横一列、5 以上は 3 列で折り返す */
39
+ export declare function columnsFor(n: number): number;
40
+ /** `columns` を付けた slide。pane を横に等分し、5 以上は 3 列 × 2 行に折り返す */
41
+ export declare const ColumnsSlide: (slide: SlideNode) => import("react").JSX.Element;
42
+ export {};
43
+ //# sourceMappingURL=panes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panes.d.ts","sourceRoot":"","sources":["../src/panes.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,OAAO,CAAC;AAuBtD,KAAK,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAMxF,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,CAgBnD;AAED,mDAAmD;AACnD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxD;AAED,UAAU,OAAO;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,GAAG,aAAa,CAQlF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAOnD;AAqBD,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,GAAI,YAAY;IAAE,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,gCAoC3D,CAAC;AAMF,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,gCAgC5C,CAAC;AAEF,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,4DAA4D;AAC5D,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,gCAqB5C,CAAC"}
package/dist/panes.js ADDED
@@ -0,0 +1,131 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Block, RichText, pick } from "@yadeck/slide-core";
3
+ import { Notes, PAGE, SlideHeading } from "./chrome.js";
4
+ import { codeChrome, codeSize } from "./layouts.js";
5
+ /**
6
+ * tags 無しの slide の自動レイアウト。
7
+ * 内容を pane に数え、数に応じて配置を決める。
8
+ * - テキスト(body / list / tags 無し / その他の block)は全部まとめて 1 pane
9
+ * - image / code / video は 1 つにつき 1 pane
10
+ * 1: 全面、2: 左右、3: ト型(左 1 + 右 2)、4: 十字、5 以上: 左 floor(N/2) + 右 残り(8 まで)
11
+ */
12
+ const SLIDE_W = 1280;
13
+ const SLIDE_H = 720;
14
+ const PAD_X = 80;
15
+ const PAD_Y = 56;
16
+ const HEADING_H = 69 + 24;
17
+ const DESCRIPTION_H = 36;
18
+ const GAP = 32;
19
+ /** 1 つで 1 pane になる block の tags */
20
+ const PANE_TAGS = ["image", "code", "video", "flow"];
21
+ function isPaneBlock(b) {
22
+ return b.tags.some((t) => PANE_TAGS.includes(t));
23
+ }
24
+ /** 出現順を保ったまま pane に分ける。テキスト pane は最初のテキスト block の位置に置く */
25
+ export function toPanes(blocks) {
26
+ const panes = [];
27
+ let text;
28
+ for (const b of blocks) {
29
+ if (b.tags.includes("note"))
30
+ continue;
31
+ if (isPaneBlock(b)) {
32
+ panes.push({ kind: "block", block: b });
33
+ continue;
34
+ }
35
+ if (!text) {
36
+ text = { kind: "text", blocks: [] };
37
+ panes.push(text);
38
+ }
39
+ text.blocks.push(b);
40
+ }
41
+ return panes;
42
+ }
43
+ /** pane を左右の列に振り分ける。戻り値は [左の pane 数, 右の pane 数] */
44
+ export function splitColumns(n) {
45
+ if (n <= 1)
46
+ return [n, 0];
47
+ const left = Math.floor(n / 2);
48
+ return [left, n - left];
49
+ }
50
+ /**
51
+ * 同じ slide に code が 2 つ以上あるとき、全部が収まる最小のフォントサイズを --code-fit で渡す。
52
+ * pane ごとに最大サイズを選ぶと、並んだコードの文字の大きさが揃わないため。式は styles.ts の .b-code と同じ
53
+ */
54
+ export function codeFitStyle(placed) {
55
+ const terms = placed.flatMap(({ pane, box }) => {
56
+ if (pane.kind !== "block" || !pane.block.tags.includes("code"))
57
+ return [];
58
+ const { cols, rows } = codeSize(pane.block.text);
59
+ const chrome = codeChrome(typeof pane.block.caption === "string" ? pane.block.caption : undefined);
60
+ return [`calc((${Math.round(box.w)}px - 48px) / ${cols} / 0.62)`, `calc((${Math.round(box.h)}px - ${chrome}px) / ${rows} / 1.375)`];
61
+ });
62
+ return terms.length >= 4 ? { "--code-fit": `min(${terms.join(", ")})` } : {};
63
+ }
64
+ /**
65
+ * 縦に積む pane の高さの比。全部が code なら「行数 + caption などの余白」の比で分け、
66
+ * 行の多いコードが切れたり、短いコードの箱が間延びしたりしないようにする。それ以外は等分
67
+ */
68
+ export function paneWeights(panes) {
69
+ const sizes = panes.map((p) => p.kind === "block" && p.block.tags.includes("code")
70
+ ? codeSize(p.block.text).rows + codeChrome(typeof p.block.caption === "string" ? p.block.caption : undefined) / 24
71
+ : undefined);
72
+ return sizes.every((x) => x !== undefined) ? sizes : panes.map(() => 1);
73
+ }
74
+ /** 1 列に縦に積んだ pane の寸法 */
75
+ function columnBoxes(contentH, columnCount, column) {
76
+ const w = columnCount === 1 ? SLIDE_W - PAD_X * 2 : (SLIDE_W - PAD_X * 2 - GAP) / 2;
77
+ const weights = paneWeights(column);
78
+ const total = weights.reduce((a, b) => a + b, 0);
79
+ const free = contentH - GAP * (column.length - 1);
80
+ return weights.map((wt) => ({ w, h: (free * wt) / total, grow: wt }));
81
+ }
82
+ /** pane の寸法を CSS 変数で渡す。code の自動フォントサイズなどが参照する */
83
+ const PaneFrame = ({ box, children }) => (_jsx("div", { className: "b-pane relative flex min-h-0 min-w-0 flex-1 flex-col", style: { "--pane-w": `${Math.round(box.w)}px`, "--pane-h": `${Math.round(box.h)}px`, flexGrow: box.grow ?? 1, flexBasis: 0 }, children: children }));
84
+ /** テキスト pane。body / list / tags 無しの block は行にまとめ、1 行なら中央に大きく、2 行以上なら箇条書きにする */
85
+ export const TextPane = ({ blocks }) => {
86
+ const lines = [];
87
+ const others = [];
88
+ for (const b of blocks) {
89
+ const isText = b.tags.length === 0 || b.tags.includes("body") || b.tags.includes("list");
90
+ if (!isText) {
91
+ others.push(b);
92
+ continue;
93
+ }
94
+ for (const line of (b.text ?? "").split("\n")) {
95
+ if (line.trim())
96
+ lines.push(_jsx(RichText, { text: line }, `${b.id}-${lines.length}`));
97
+ }
98
+ }
99
+ if (lines.length === 1 && others.length === 0) {
100
+ return (_jsx("div", { className: "b-center flex flex-1 items-center justify-center text-center text-h3 leading-relaxed", children: lines[0] }));
101
+ }
102
+ return (_jsxs("div", { className: "b-bullets flex flex-1 flex-col justify-center gap-5", children: [lines.length > 0 && (_jsx("ul", { className: "m-0 list-disc pl-[1.2em] marker:text-accent", children: lines.map((l, i) => (_jsx("li", { className: "my-2", children: l }, i))) })), others.map((b) => (_jsx(Block, { data: b }, b.id)))] }));
103
+ };
104
+ const PaneView = ({ pane, box }) => (_jsx(PaneFrame, { box: box, children: pane.kind === "text" ? _jsx(TextPane, { blocks: pane.blocks }) : _jsx(Block, { data: pane.block }) }));
105
+ export const DefaultSlide = (slide) => {
106
+ const [heading, rest] = pick(slide.items, ["heading"]);
107
+ const panes = toPanes(rest);
108
+ const contentH = SLIDE_H - PAD_Y * 2 - (heading ? HEADING_H : 0) - (heading && slide.description ? DESCRIPTION_H : 0);
109
+ const [leftCount, rightCount] = splitColumns(panes.length);
110
+ const left = panes.slice(0, leftCount);
111
+ const right = panes.slice(leftCount);
112
+ const columns = panes.length <= 1 ? [panes] : [left, right];
113
+ const boxes = columns.map((column) => columnBoxes(contentH, columns.length, column));
114
+ const placed = columns.flatMap((column, ci) => column.map((pane, i) => ({ pane, box: boxes[ci][i] })));
115
+ return (_jsxs("div", { className: `${PAGE} b-default`, style: codeFitStyle(placed), children: [heading && _jsx(SlideHeading, { block: heading, description: slide.description }), panes.length <= 1 ? (_jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: panes[0] && _jsx(PaneView, { pane: panes[0], box: boxes[0][0] }) })) : (_jsx("div", { className: "grid min-h-0 flex-1 grid-cols-2 gap-8", children: columns.map((column, ci) => (_jsx("div", { className: "flex min-h-0 min-w-0 flex-col gap-8", children: column.map((pane, i) => (_jsx(PaneView, { pane: pane, box: boxes[ci][i] }, i))) }, ci))) })), _jsx(Notes, { items: slide.items })] }));
116
+ };
117
+ /** columns の列数。4 までは横一列、5 以上は 3 列で折り返す */
118
+ export function columnsFor(n) {
119
+ return n <= 4 ? Math.max(1, n) : 3;
120
+ }
121
+ /** `columns` を付けた slide。pane を横に等分し、5 以上は 3 列 × 2 行に折り返す */
122
+ export const ColumnsSlide = (slide) => {
123
+ const [heading, rest] = pick(slide.items, ["heading"]);
124
+ const panes = toPanes(rest);
125
+ const contentH = SLIDE_H - PAD_Y * 2 - (heading ? HEADING_H : 0) - (heading && slide.description ? DESCRIPTION_H : 0);
126
+ const cols = columnsFor(panes.length);
127
+ const rows = Math.max(1, Math.ceil(panes.length / cols));
128
+ const box = { w: (SLIDE_W - PAD_X * 2 - GAP * (cols - 1)) / cols, h: (contentH - GAP * (rows - 1)) / rows };
129
+ return (_jsxs("div", { className: `${PAGE} b-columns`, style: codeFitStyle(panes.map((pane) => ({ pane, box }))), children: [heading && _jsx(SlideHeading, { block: heading, description: slide.description }), _jsx("div", { className: "grid min-h-0 flex-1 gap-8", style: { gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`, gridTemplateRows: `repeat(${rows}, minmax(0, 1fr))` }, children: panes.map((pane, i) => (_jsx(PaneView, { pane: pane, box: box }, i))) }), _jsx(Notes, { items: slide.items })] }));
130
+ };
131
+ //# sourceMappingURL=panes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panes.js","sourceRoot":"","sources":["../src/panes.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * basic の既定テーマ。Tailwind v4 の `@theme` トークンで、利用者は slide.config.ts の `theme` に
3
+ * 指定した CSS で同名トークンを上書きして色・フォント・文字サイズを差し替える。
4
+ * 色は `bg-primary` `text-ink`、フォントは `font-sans`、サイズは `text-h1` のように utility になる。
5
+ */
6
+ export declare const DEFAULT_THEME = "\n@theme {\n --color-primary: #2a5bd7;\n --color-primary-deep: #163a8f;\n --color-accent: #e8c547;\n --color-ink: #222222;\n --color-muted: #666666;\n --color-faint: #888888;\n --color-surface: #ffffff;\n --color-code: #1e1e1e;\n --color-code-ink: #eeeeee;\n\n --font-sans: \"Helvetica Neue\", Arial, \"Hiragino Sans\", \"Noto Sans JP\", sans-serif;\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\n --text-body: 28px;\n --text-small: 22px;\n --text-h1: 64px;\n --text-h2: 44px;\n --text-h3: 34px;\n --text-h4: 30px;\n --text-display: 96px;\n}\n";
7
+ /**
8
+ * utility を付けられない要素(RichText が生成する markdown 由来の p / ul / code など)のための最小 CSS。
9
+ * Layout 自体の見た目は layouts.tsx の className で持つ。
10
+ */
11
+ export declare const BASIC_CSS = "\n@layer components {\n .yd-slide { font-family: var(--font-sans); color: var(--color-ink); font-size: var(--text-body); line-height: 1.5; }\n .b-body p { margin: 0 0 .6em; }\n .b-body p:last-child { margin-bottom: 0; }\n .b-body ul { list-style: disc; padding-left: 1.2em; }\n .b-body ol { list-style: decimal; padding-left: 1.2em; }\n .b-body li::marker { color: var(--color-accent); }\n /* \u672C\u6587\u4E2D\u306E\u30B3\u30FC\u30C9\u3002\u5408\u5B57(-> \u304C \u2192 \u306B\u306A\u308B\u7B49)\u306F\u539F\u6587\u3068\u9055\u3063\u3066\u898B\u3048\u308B\u306E\u3067\u5207\u308B */\n .yd-slide :not(pre) > code { font-family: var(--font-mono); font-size: .9em; font-variant-ligatures: none; background: color-mix(in srgb, var(--color-ink) 8%, transparent); padding: 0 .3em; border-radius: 4px; }\n .b-body a { color: var(--color-primary); text-decoration: underline; }\n\n /* code: pane \u306E\u5BF8\u6CD5(--pane-w / --pane-h)\u3068\u884C\u6570\u30FB\u6700\u5927\u884C\u9577\u304B\u3089\u3001\u53CE\u307E\u308B\u6700\u5927\u306E\u30D5\u30A9\u30F3\u30C8\u30B5\u30A4\u30BA\u3092\u9078\u3076 */\n .yd-slide { --pane-w: 1120px; --pane-h: 500px; }\n .b-code {\n font-size: max(14px, min(\n var(--text-body),\n calc((var(--pane-w) - 48px) / var(--code-cols, 40) / 0.62),\n calc((var(--pane-h) - var(--code-chrome, 40px)) / var(--code-rows, 10) / 1.375),\n var(--code-fit, 9999px)\n ));\n /* \u4E0B\u9650\u307E\u3067\u7E2E\u3081\u3066\u3082\u5165\u3089\u306A\u3044\u9577\u3044\u884C\u306F\u6298\u308A\u8FD4\u3059\u3002\u306F\u307F\u51FA\u3057\u3066\u8AAD\u3081\u306A\u3044\u3088\u308A\u3088\u3044 */\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n font-variant-ligatures: none;\n }\n .b-code .hljs { color: var(--color-code-ink); }\n .hljs-comment, .hljs-quote { color: #8b949e; font-style: italic; }\n .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-type, .hljs-built_in, .hljs-doctag, .hljs-meta { color: #ff7b72; }\n .hljs-string, .hljs-regexp, .hljs-addition, .hljs-attr, .hljs-meta .hljs-string { color: #a5d6ff; }\n .hljs-number, .hljs-symbol, .hljs-bullet, .hljs-link, .hljs-variable, .hljs-template-variable { color: #79c0ff; }\n .hljs-title, .hljs-section, .hljs-name, .hljs-selector-id, .hljs-selector-class, .hljs-function .hljs-title { color: #d2a8ff; }\n .hljs-attribute, .hljs-params, .hljs-property { color: #ffa657; }\n .hljs-emphasis { font-style: italic; }\n .hljs-strong { font-weight: bold; }\n .hljs-deletion { color: #ffa198; }\n\n /* ---- flow(\u624B\u9806)\u3002https://www.ameamelog.com/css-flow/ \u306E 5 \u30D1\u30BF\u30FC\u30F3\u3092\u79FB\u690D\u3002\u5BF8\u6CD5\u306F\u30B9\u30E9\u30A4\u30C9\u5411\u3051\u306B 1.5 \u500D ---- */\n .b-flow { --flow-grad: linear-gradient(to right, var(--color-primary) 0%, color-mix(in srgb, var(--color-primary) 55%, white) 100%); margin: auto 0; padding: 0; list-style: none; width: 100%; }\n .b-flow > li { list-style: none; }\n .b-flow dl, .b-flow dd { margin: 0; }\n .b-flow dt { font-size: var(--text-h4); font-weight: 700; color: var(--color-primary); line-height: 1.3; }\n .b-flow dd { font-size: var(--text-small); color: color-mix(in srgb, var(--color-ink) 80%, transparent); line-height: 1.45; }\n .b-flow .phase { display: inline-block; margin-left: .6em; padding: .1em .7em; border-radius: 999px; background: color-mix(in srgb, var(--color-primary) 10%, transparent); font-size: var(--text-small); font-weight: 700; color: var(--color-primary); vertical-align: middle; }\n .b-flow .via { font-family: var(--font-mono); font-size: var(--text-small); font-weight: 700; color: var(--color-primary); white-space: nowrap; }\n .b-flow .icon { font-size: 18px; font-weight: 700; color: #fff; background: var(--flow-grad); }\n .b-flow.has-focus > li:not(.is-focus) { opacity: .35; }\n .b-flow > li.is-focus .icon { background: var(--color-accent); color: var(--color-ink); }\n .b-flow > li.is-focus dt { color: var(--color-ink); }\n\n /* 1 \u30AB\u30E9\u30E0\u69CB\u6210: \u5DE6\u306B STEP \u30D4\u30EB\u3001\u7E26\u30EC\u30FC\u30EB\u3001\u70B9\u3068\u70B9\u7DDA\u3001\u53F3\u306B\u898B\u51FA\u3057\u3068\u8AAC\u660E */\n .b-flow-rail { padding-left: 180px; position: relative; }\n .b-flow-rail::before { content: \"\"; width: 22px; height: 100%; background: color-mix(in srgb, var(--color-ink) 7%, transparent); margin-left: -11px; display: block; position: absolute; top: 0; left: 180px; }\n .b-flow-rail > li { position: relative; }\n .b-flow-rail > li:not(:last-child) { margin-bottom: 60px; }\n .b-flow-rail > li .icon { padding: 10px 28px; display: block; position: absolute; top: 0; left: -180px; z-index: 2; }\n .b-flow-rail > li .icon::after { content: \"\"; border-style: solid; border-width: 8px 0 8px 14px; border-color: transparent transparent transparent color-mix(in srgb, var(--color-primary) 55%, white); position: absolute; top: 50%; left: 100%; transform: translateY(-50%); }\n .b-flow-rail > li.is-focus .icon::after { border-left-color: var(--color-accent); }\n .b-flow-rail > li .via { position: absolute; top: -30px; left: 28px; transform: translateY(-50%); }\n .b-flow-rail > li dl { padding-left: 100px; position: relative; }\n .b-flow-rail > li dl::before, .b-flow-rail > li dl::after { content: \"\"; display: block; position: absolute; top: 24px; }\n .b-flow-rail > li dl::before { width: 11px; height: 11px; margin-top: -5px; background: var(--color-primary); border-radius: 50%; left: -6px; z-index: 1; }\n .b-flow-rail > li.is-focus dl::before { background: var(--color-accent); }\n .b-flow-rail > li dl::after { width: 72px; border-bottom: 2px dashed color-mix(in srgb, var(--color-ink) 40%, transparent); left: 8px; }\n .b-flow-rail > li dl dt { margin-bottom: 6px; }\n\n /* \u30DD\u30C3\u30D7: \u5439\u304D\u51FA\u3057\u306E\u756A\u53F7 + \u67A0\u30AB\u30FC\u30C9\u3092\u6A2A\u306B\u4E26\u3079\u3001\u9593\u306B \u203A */\n .b-flow-pop { --flow-gap: 56px; display: flex; justify-content: space-between; gap: var(--flow-gap); }\n .b-flow-pop > li { flex: 1 1 0; min-width: 0; position: relative; }\n .b-flow-pop > li .icon { font-family: var(--font-mono); font-size: 26px; line-height: 72px; width: 72px; background: var(--color-primary); margin: 0 auto 28px; display: block; border-radius: 50%; text-align: center; position: relative; letter-spacing: 2px; }\n .b-flow-pop > li .icon::before { content: \"\"; border: solid transparent; border-width: 12px; border-top-color: var(--color-primary); position: absolute; top: calc(100% - 3px); left: 50%; transform: translateX(-50%); }\n .b-flow-pop > li.is-focus .icon::before { border-top-color: var(--color-accent); }\n .b-flow-pop > li .via { position: absolute; top: 24px; right: calc(100% + var(--flow-gap) / 2 + 4px); transform: translateX(50%); }\n .b-flow-pop > li dl { padding: 32px 10px; word-break: auto-phrase; text-wrap: balance; border: 4px solid var(--color-primary); position: relative; text-align: center; height: calc(100% - 100px); }\n .b-flow-pop > li.is-focus dl { border-color: var(--color-accent); }\n /* \u7BB1\u306E\u9593\u306E \u203A\u3002\u9699\u9593(--flow-gap)\u306E\u4E2D\u592E\u306B\u7F6E\u304D\u3001\u67A0\u7DDA\u306B\u91CD\u306D\u306A\u3044 */\n .b-flow-pop > li:not(:last-child) dl::before { content: \"\"; width: 36px; height: 36px; display: block; border-top: 8px solid var(--color-primary); border-right: 8px solid var(--color-primary); position: absolute; top: 50%; left: calc(100% + var(--flow-gap) / 2 - 8px); transform: translate(-50%, -50%) rotate(45deg); }\n .b-flow-pop > li dl dt { margin-bottom: 10px; word-break: keep-all; }\n .b-flow-pop > li dl dt .phase { display: block; margin: 8px auto 0; padding: .15em .6em; font-size: 18px; width: fit-content; max-width: 100%; box-sizing: border-box; white-space: nowrap; }\n\n /* \u67A0\u7DDA\u3092\u4F7F\u3063\u305F\u30C7\u30B6\u30A4\u30F3: \u89D2\u4E38\u306E\u67A0\u3092\u7E26\u306B\u7A4D\u307F\u3001\u70B9\u7DDA\u3068 \u25BD \u3067\u3064\u306A\u3050 */\n .b-flow-boxed > li { position: relative; }\n .b-flow-boxed > li:not(:last-child) { margin-bottom: 40px; }\n .b-flow-boxed > li:not(:first-child)::before { content: \"\"; height: 60px; display: block; border-left: 5px dotted color-mix(in srgb, var(--color-ink) 15%, transparent); position: absolute; top: -40px; left: calc(12% + 40px); z-index: 1; }\n .b-flow-boxed > li .via { position: absolute; top: -20px; left: calc(12% + 72px); transform: translateY(-50%); }\n .b-flow-boxed > li dl { width: 100%; padding: 8px 36px; display: flex; align-items: center; border: 3px solid var(--color-primary); border-radius: 14px; position: relative; background: var(--color-surface); }\n .b-flow-boxed > li.is-focus dl { border-color: var(--color-accent); }\n .b-flow-boxed > li:not(:last-child) dl::before, .b-flow-boxed > li:not(:last-child) dl::after { content: \"\"; border: solid transparent; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); }\n .b-flow-boxed > li:not(:last-child) dl::before { border-width: 26px; border-top-color: var(--color-primary); }\n .b-flow-boxed > li.is-focus:not(:last-child) dl::before { border-top-color: var(--color-accent); }\n .b-flow-boxed > li:not(:last-child) dl::after { border-width: 23px; border-top-color: var(--color-surface); }\n .b-flow-boxed > li dl dt { flex: 0 0 24%; margin-right: 2vw; text-align: center; }\n .b-flow-boxed > li dl dt .icon { padding: 4px 14px; margin: 0 auto 6px; display: block; border-radius: 999px; width: fit-content; position: relative; z-index: 2; }\n .b-flow-boxed > li dl dd { flex: 1; }\n .b-flow-boxed > li dl dd .phase { display: block; width: fit-content; margin: 0 0 4px; }\n\n /* \u30B9\u30BF\u30A4\u30EA\u30C3\u30B7\u30E5: \u5168\u4F53\u3092 1 \u3064\u306E\u67A0\u3067\u56F2\u307F\u3001\u533A\u5207\u308A\u7DDA\u306B \u25BD */\n .b-flow-framed { border: 4px solid var(--color-primary); }\n .b-flow-framed > li { padding: 12px 36px; position: relative; }\n .b-flow-framed > li:not(:last-child) { border-bottom: 4px solid var(--color-primary); }\n .b-flow-framed > li:not(:last-child)::before, .b-flow-framed > li:not(:last-child)::after { content: \"\"; border: solid transparent; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); z-index: 1; }\n .b-flow-framed > li:not(:last-child)::before { border-width: 26px; border-top-color: var(--color-primary); }\n .b-flow-framed > li:not(:last-child)::after { border-width: 21px; border-top-color: var(--color-surface); }\n .b-flow-framed > li .via { position: absolute; top: 0; left: calc(50% + 44px); transform: translateY(-50%); background: var(--color-surface); padding: 0 10px; z-index: 2; }\n .b-flow-framed > li dl { display: flex; align-items: center; }\n .b-flow-framed > li dl dt { flex: 0 0 24%; margin-right: 1vw; text-align: center; }\n .b-flow-framed > li dl dt .icon { padding: 4px 14px; margin: 0 auto 6px; display: block; border-radius: 999px; width: fit-content; }\n .b-flow-framed > li dl dd { flex: 1; }\n .b-flow-framed > li dl dd .phase { display: block; width: fit-content; margin: 0 0 4px; }\n\n /* 2 \u30AB\u30E9\u30E0\u69CB\u6210: \u53F3\u7AEF\u304C\u77E2\u5370\u306E\u67A0\u3092 2 \u5217\u306B */\n .b-flow-grid { display: flex; flex-wrap: wrap; gap: 48px 4%; }\n .b-flow-grid > li { padding: 28px 44px 24px 36px; flex: 0 0 48%; border: 3px solid var(--color-primary); position: relative; background: var(--color-surface); }\n .b-flow-grid > li.is-focus { border-color: var(--color-accent); }\n .b-flow-grid > li:not(:last-child)::before, .b-flow-grid > li:not(:last-child)::after { content: \"\"; border: solid transparent; position: absolute; top: 50%; left: 100%; transform: translateY(-50%); }\n .b-flow-grid > li:not(:last-child)::before { border-width: 30px; border-left-color: var(--color-primary); }\n .b-flow-grid > li.is-focus:not(:last-child)::before { border-left-color: var(--color-accent); }\n .b-flow-grid > li:not(:last-child)::after { border-width: 27px; border-left-color: var(--color-surface); }\n .b-flow-grid > li .icon { padding: 7px 28px; display: block; border-radius: 999px; position: absolute; top: -18px; left: -14px; z-index: 2; }\n .b-flow-grid > li .via { display: none; }\n .b-flow-grid > li dl dt { margin-bottom: 6px; }\n}\n";
12
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,aAAa,mlBAuBzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,qgYA0HrB,CAAC"}