futsuno-ui 0.1.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.
@@ -0,0 +1,1136 @@
1
+ import React6, { useState } from 'react';
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
+
6
+ // src/lp/atoms/Button/Button.tsx
7
+ function cn(...inputs) {
8
+ return twMerge(clsx(inputs));
9
+ }
10
+ var variantStyles = {
11
+ black: "bg-[#464646] text-white border-transparent",
12
+ red: "bg-[#CC5E58] text-white border-transparent",
13
+ gold: "bg-[#978E5F] text-white border-transparent",
14
+ white: "bg-white text-[#464646] border-[#BDC1C2]"
15
+ };
16
+ var sizeStyles = {
17
+ lg: "px-[24px] py-[24px] text-[20px]",
18
+ md: "px-[24px] py-[16px] text-[18px]"
19
+ };
20
+ var Button = React6.forwardRef(
21
+ ({
22
+ variant = "black",
23
+ size = "lg",
24
+ showArrow = true,
25
+ fullWidth = false,
26
+ className,
27
+ children,
28
+ ...props
29
+ }, ref) => {
30
+ return /* @__PURE__ */ jsxs(
31
+ "button",
32
+ {
33
+ ref,
34
+ className: cn(
35
+ // Base styles
36
+ "relative inline-flex items-center justify-center",
37
+ 'font-bold font-["Noto_Sans_JP",sans-serif]',
38
+ "rounded-[3px] border border-solid",
39
+ "shadow-[0px_4px_16px_0px_rgba(4,4,4,0.4)]",
40
+ "tracking-[0.05em] leading-[1.45]",
41
+ "transition-opacity hover:opacity-90",
42
+ "disabled:opacity-50 disabled:cursor-not-allowed",
43
+ // Variant styles
44
+ variantStyles[variant],
45
+ // Size styles
46
+ sizeStyles[size],
47
+ // Full width
48
+ fullWidth && "w-full",
49
+ className
50
+ ),
51
+ ...props,
52
+ children: [
53
+ /* @__PURE__ */ jsx("span", { className: "flex-1 text-center", children }),
54
+ showArrow && /* @__PURE__ */ jsx("span", { className: "absolute right-[24px] top-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsx(ArrowIcon, { variant }) })
55
+ ]
56
+ }
57
+ );
58
+ }
59
+ );
60
+ Button.displayName = "Button";
61
+ function ArrowIcon({ variant }) {
62
+ const color = variant === "white" ? "#464646" : "#FFFFFF";
63
+ return /* @__PURE__ */ jsxs(
64
+ "svg",
65
+ {
66
+ width: "24",
67
+ height: "24",
68
+ viewBox: "0 0 24 24",
69
+ fill: "none",
70
+ xmlns: "http://www.w3.org/2000/svg",
71
+ className: "-rotate-90",
72
+ children: [
73
+ /* @__PURE__ */ jsx(
74
+ "path",
75
+ {
76
+ d: "M12 6L12 17",
77
+ stroke: color,
78
+ strokeWidth: "1.5",
79
+ strokeLinecap: "round"
80
+ }
81
+ ),
82
+ /* @__PURE__ */ jsx(
83
+ "path",
84
+ {
85
+ d: "M7 13L12 18L17 13",
86
+ stroke: color,
87
+ strokeWidth: "1.5",
88
+ strokeLinecap: "round",
89
+ strokeLinejoin: "round"
90
+ }
91
+ )
92
+ ]
93
+ }
94
+ );
95
+ }
96
+ var variantStyles2 = {
97
+ outline: "bg-white text-[#040404] border-[#464646]",
98
+ filled: "bg-[#464646] text-white border-[#464646]"
99
+ };
100
+ var AnchorButton = React6.forwardRef(({ variant = "outline", multiline = false, className, children, ...props }, ref) => {
101
+ return /* @__PURE__ */ jsxs(
102
+ "a",
103
+ {
104
+ ref,
105
+ className: cn(
106
+ // Base styles
107
+ "inline-flex items-center justify-between gap-[16px]",
108
+ 'font-["Noto_Sans_JP",sans-serif] font-bold',
109
+ "text-[15px] leading-[1.8] tracking-[0.08em]",
110
+ "px-[16px] py-[16px] md:px-[24px]",
111
+ "rounded-[3px] border border-solid",
112
+ "transition-opacity hover:opacity-80",
113
+ "cursor-pointer no-underline",
114
+ // Variant styles
115
+ variantStyles2[variant],
116
+ // Width handling
117
+ !multiline && "whitespace-nowrap",
118
+ className
119
+ ),
120
+ ...props,
121
+ children: [
122
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children }),
123
+ /* @__PURE__ */ jsx(ChevronDownIcon, { variant })
124
+ ]
125
+ }
126
+ );
127
+ });
128
+ AnchorButton.displayName = "AnchorButton";
129
+ function ChevronDownIcon({ variant }) {
130
+ const color = variant === "outline" ? "#040404" : "#FFFFFF";
131
+ return /* @__PURE__ */ jsx(
132
+ "svg",
133
+ {
134
+ width: "12",
135
+ height: "6",
136
+ viewBox: "0 0 12 6",
137
+ fill: "none",
138
+ xmlns: "http://www.w3.org/2000/svg",
139
+ className: "shrink-0",
140
+ children: /* @__PURE__ */ jsx(
141
+ "path",
142
+ {
143
+ d: "M1 1L6 5L11 1",
144
+ stroke: color,
145
+ strokeWidth: "1.5",
146
+ strokeLinecap: "round",
147
+ strokeLinejoin: "round"
148
+ }
149
+ )
150
+ }
151
+ );
152
+ }
153
+ var aspectRatioStyles = {
154
+ "1:1": "aspect-square",
155
+ "4:3": "aspect-[4/3]",
156
+ "16:9": "aspect-video",
157
+ auto: ""
158
+ };
159
+ var Image = React6.forwardRef(
160
+ ({
161
+ aspectRatio = "auto",
162
+ objectFit = "cover",
163
+ placeholderColor = "#D9D9D9",
164
+ className,
165
+ style,
166
+ alt = "",
167
+ ...props
168
+ }, ref) => {
169
+ return /* @__PURE__ */ jsx(
170
+ "div",
171
+ {
172
+ className: cn(
173
+ "relative overflow-hidden",
174
+ aspectRatioStyles[aspectRatio],
175
+ className
176
+ ),
177
+ style: { backgroundColor: placeholderColor, ...style },
178
+ children: /* @__PURE__ */ jsx(
179
+ "img",
180
+ {
181
+ ref,
182
+ alt,
183
+ className: cn(
184
+ "w-full h-full",
185
+ objectFit === "cover" && "object-cover",
186
+ objectFit === "contain" && "object-contain",
187
+ objectFit === "fill" && "object-fill"
188
+ ),
189
+ ...props
190
+ }
191
+ )
192
+ }
193
+ );
194
+ }
195
+ );
196
+ Image.displayName = "Image";
197
+ var sizeStyles2 = {
198
+ sm: "w-[90px] h-[90px]",
199
+ md: "w-[100px] h-[100px]",
200
+ lg: "w-[130px] h-[130px]"
201
+ };
202
+ var ProductImage = React6.forwardRef(
203
+ ({
204
+ productName = "Product",
205
+ size = "md",
206
+ circular = false,
207
+ className,
208
+ src,
209
+ ...props
210
+ }, ref) => {
211
+ const hasImage = Boolean(src);
212
+ return /* @__PURE__ */ jsx(
213
+ "div",
214
+ {
215
+ className: cn(
216
+ "relative overflow-hidden flex-shrink-0",
217
+ sizeStyles2[size],
218
+ circular ? "rounded-full" : "rounded-[2px]",
219
+ !hasImage && "bg-[#D4D4D4]",
220
+ className
221
+ ),
222
+ children: hasImage && /* @__PURE__ */ jsx(
223
+ "img",
224
+ {
225
+ ref,
226
+ src,
227
+ alt: productName,
228
+ className: "w-full h-full object-cover",
229
+ ...props
230
+ }
231
+ )
232
+ }
233
+ );
234
+ }
235
+ );
236
+ ProductImage.displayName = "ProductImage";
237
+ var iconPaths = {
238
+ "arrow-right": /* @__PURE__ */ jsxs(Fragment, { children: [
239
+ /* @__PURE__ */ jsx("path", { d: "M6 12H17", strokeWidth: "1.5", strokeLinecap: "round" }),
240
+ /* @__PURE__ */ jsx(
241
+ "path",
242
+ {
243
+ d: "M13 7L18 12L13 17",
244
+ strokeWidth: "1.5",
245
+ strokeLinecap: "round",
246
+ strokeLinejoin: "round"
247
+ }
248
+ )
249
+ ] }),
250
+ "arrow-down": /* @__PURE__ */ jsxs(Fragment, { children: [
251
+ /* @__PURE__ */ jsx("path", { d: "M12 6V17", strokeWidth: "1.5", strokeLinecap: "round" }),
252
+ /* @__PURE__ */ jsx(
253
+ "path",
254
+ {
255
+ d: "M7 13L12 18L17 13",
256
+ strokeWidth: "1.5",
257
+ strokeLinecap: "round",
258
+ strokeLinejoin: "round"
259
+ }
260
+ )
261
+ ] }),
262
+ "chevron-down": /* @__PURE__ */ jsx(
263
+ "path",
264
+ {
265
+ d: "M6 9L12 15L18 9",
266
+ strokeWidth: "1.5",
267
+ strokeLinecap: "round",
268
+ strokeLinejoin: "round"
269
+ }
270
+ ),
271
+ "chevron-up": /* @__PURE__ */ jsx(
272
+ "path",
273
+ {
274
+ d: "M6 15L12 9L18 15",
275
+ strokeWidth: "1.5",
276
+ strokeLinecap: "round",
277
+ strokeLinejoin: "round"
278
+ }
279
+ ),
280
+ check: /* @__PURE__ */ jsx(
281
+ "path",
282
+ {
283
+ d: "M5 12L10 17L19 7",
284
+ strokeWidth: "1.5",
285
+ strokeLinecap: "round",
286
+ strokeLinejoin: "round"
287
+ }
288
+ ),
289
+ plus: /* @__PURE__ */ jsxs(Fragment, { children: [
290
+ /* @__PURE__ */ jsx("path", { d: "M12 5V19", strokeWidth: "1.5", strokeLinecap: "round" }),
291
+ /* @__PURE__ */ jsx("path", { d: "M5 12H19", strokeWidth: "1.5", strokeLinecap: "round" })
292
+ ] }),
293
+ minus: /* @__PURE__ */ jsx("path", { d: "M5 12H19", strokeWidth: "1.5", strokeLinecap: "round" })
294
+ };
295
+ var Icon = React6.forwardRef(
296
+ ({ name, size = 24, color = "currentColor", className, ...props }, ref) => {
297
+ return /* @__PURE__ */ jsx(
298
+ "svg",
299
+ {
300
+ ref,
301
+ width: size,
302
+ height: size,
303
+ viewBox: "0 0 24 24",
304
+ fill: "none",
305
+ stroke: color,
306
+ xmlns: "http://www.w3.org/2000/svg",
307
+ className: cn("inline-block", className),
308
+ ...props,
309
+ children: iconPaths[name]
310
+ }
311
+ );
312
+ }
313
+ );
314
+ Icon.displayName = "Icon";
315
+ var variantStyles3 = {
316
+ h1: "text-[24px] leading-[1.55] tracking-[0.16em] font-medium",
317
+ h2: "text-[22px] leading-[1.55] tracking-[0.16em] font-medium",
318
+ h3: "text-[20px] leading-[1.35] tracking-[0.16em] font-medium",
319
+ h4: "text-[18px] leading-[1.45] tracking-[0.16em] font-medium",
320
+ "body-lg": "text-[16px] leading-[1.95] tracking-[0.08em] font-medium",
321
+ "body-md": "text-[15px] leading-[1.85] tracking-[0.08em] font-medium",
322
+ "body-sm": "text-[13px] leading-[1.85] tracking-[0.08em] font-medium",
323
+ "caption-lg": "text-[12px] leading-[1.45] tracking-[0.08em] font-medium",
324
+ "caption-md": "text-[11px] leading-[1.45] tracking-[0.08em] font-medium",
325
+ "caption-sm": "text-[10px] leading-[1.45] tracking-[0.08em] font-medium",
326
+ "caption-xs": "text-[8px] leading-[1.45] tracking-[0.08em] font-medium"
327
+ };
328
+ var colorStyles = {
329
+ primary: "text-[#040404]",
330
+ secondary: "text-[#464646]",
331
+ inverse: "text-white",
332
+ accent: "text-[#CC5E58]",
333
+ gold: "text-[#978E5F]",
334
+ inherit: "text-inherit"
335
+ };
336
+ var alignStyles = {
337
+ left: "text-left",
338
+ center: "text-center",
339
+ right: "text-right",
340
+ justify: "text-justify"
341
+ };
342
+ var weightStyles = {
343
+ regular: "font-normal",
344
+ medium: "font-medium",
345
+ bold: "font-bold"
346
+ };
347
+ var defaultTags = {
348
+ h1: "h1",
349
+ h2: "h2",
350
+ h3: "h3",
351
+ h4: "h4",
352
+ "body-lg": "p",
353
+ "body-md": "p",
354
+ "body-sm": "p",
355
+ "caption-lg": "span",
356
+ "caption-md": "span",
357
+ "caption-sm": "span",
358
+ "caption-xs": "span"
359
+ };
360
+ var Text = React6.forwardRef(
361
+ ({
362
+ variant = "body-md",
363
+ color = "primary",
364
+ align = "left",
365
+ as,
366
+ weight,
367
+ className,
368
+ children,
369
+ ...props
370
+ }, ref) => {
371
+ const Component = as || defaultTags[variant];
372
+ return React6.createElement(
373
+ Component,
374
+ {
375
+ ref,
376
+ className: cn(
377
+ 'font-["Noto_Sans_JP",sans-serif]',
378
+ variantStyles3[variant],
379
+ colorStyles[color],
380
+ alignStyles[align],
381
+ weight && weightStyles[weight],
382
+ className
383
+ ),
384
+ ...props
385
+ },
386
+ children
387
+ );
388
+ }
389
+ );
390
+ Text.displayName = "Text";
391
+ var UserVoice = React6.forwardRef(
392
+ ({
393
+ avatarSrc,
394
+ userName = "\u304A\u5BA2\u69D8",
395
+ userAttribute,
396
+ content,
397
+ rating = 5,
398
+ className,
399
+ ...props
400
+ }, ref) => {
401
+ return /* @__PURE__ */ jsxs(
402
+ "div",
403
+ {
404
+ ref,
405
+ className: cn(
406
+ "flex flex-col gap-[16px] p-[24px]",
407
+ "bg-white rounded-[2px]",
408
+ 'font-["Noto_Sans_JP",sans-serif]',
409
+ className
410
+ ),
411
+ ...props,
412
+ children: [
413
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[12px]", children: [
414
+ /* @__PURE__ */ jsx(
415
+ "div",
416
+ {
417
+ className: cn(
418
+ "w-[48px] h-[48px] rounded-full flex-shrink-0 overflow-hidden",
419
+ !avatarSrc && "bg-[#D4D4D4]"
420
+ ),
421
+ children: avatarSrc && /* @__PURE__ */ jsx(
422
+ "img",
423
+ {
424
+ src: avatarSrc,
425
+ alt: userName,
426
+ className: "w-full h-full object-cover"
427
+ }
428
+ )
429
+ }
430
+ ),
431
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[4px]", children: [
432
+ /* @__PURE__ */ jsx("span", { className: "text-[14px] font-medium text-[#040404] leading-[1.45] tracking-[0.08em]", children: userName }),
433
+ userAttribute && /* @__PURE__ */ jsx("span", { className: "text-[12px] font-medium text-[#464646] leading-[1.45] tracking-[0.08em]", children: userAttribute })
434
+ ] })
435
+ ] }),
436
+ rating > 0 && /* @__PURE__ */ jsx("div", { className: "flex gap-[4px]", children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx(StarIcon, { filled: i < rating }, i)) }),
437
+ /* @__PURE__ */ jsx("p", { className: "text-[13px] font-medium text-[#040404] leading-[1.85] tracking-[0.08em]", children: content })
438
+ ]
439
+ }
440
+ );
441
+ }
442
+ );
443
+ UserVoice.displayName = "UserVoice";
444
+ function StarIcon({ filled }) {
445
+ return /* @__PURE__ */ jsx(
446
+ "svg",
447
+ {
448
+ width: "16",
449
+ height: "16",
450
+ viewBox: "0 0 16 16",
451
+ fill: filled ? "#978E5F" : "none",
452
+ stroke: filled ? "#978E5F" : "#BDC1C2",
453
+ xmlns: "http://www.w3.org/2000/svg",
454
+ children: /* @__PURE__ */ jsx(
455
+ "path",
456
+ {
457
+ d: "M8 1L10.163 5.279L15 5.94L11.5 9.318L12.326 14L8 11.779L3.674 14L4.5 9.318L1 5.94L5.837 5.279L8 1Z",
458
+ strokeWidth: "1",
459
+ strokeLinecap: "round",
460
+ strokeLinejoin: "round"
461
+ }
462
+ )
463
+ }
464
+ );
465
+ }
466
+ var FaqParts = React6.forwardRef(
467
+ ({
468
+ question,
469
+ answer,
470
+ defaultOpen = false,
471
+ open: controlledOpen,
472
+ onOpenChange,
473
+ className,
474
+ ...props
475
+ }, ref) => {
476
+ const [internalOpen, setInternalOpen] = useState(defaultOpen);
477
+ const isOpen = controlledOpen !== void 0 ? controlledOpen : internalOpen;
478
+ const handleToggle = () => {
479
+ const newOpen = !isOpen;
480
+ setInternalOpen(newOpen);
481
+ onOpenChange?.(newOpen);
482
+ };
483
+ return /* @__PURE__ */ jsxs(
484
+ "div",
485
+ {
486
+ ref,
487
+ className: cn(
488
+ "border-b border-[#E5E6E6]",
489
+ 'font-["Noto_Sans_JP",sans-serif]',
490
+ className
491
+ ),
492
+ ...props,
493
+ children: [
494
+ /* @__PURE__ */ jsxs(
495
+ "button",
496
+ {
497
+ type: "button",
498
+ onClick: handleToggle,
499
+ className: cn(
500
+ "w-full flex items-center justify-between gap-[16px]",
501
+ "py-[16px] px-[8px]",
502
+ "text-left cursor-pointer",
503
+ "transition-colors hover:bg-[#F2F3F1]"
504
+ ),
505
+ "aria-expanded": isOpen,
506
+ children: [
507
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-[12px]", children: [
508
+ /* @__PURE__ */ jsx("span", { className: "text-[15px] font-bold text-[#978E5F] leading-[1.45] tracking-[0.08em]", children: "Q" }),
509
+ /* @__PURE__ */ jsx("span", { className: "text-[15px] font-medium text-[#040404] leading-[1.8] tracking-[0.08em]", children: question })
510
+ ] }),
511
+ /* @__PURE__ */ jsx(ChevronIcon, { isOpen })
512
+ ]
513
+ }
514
+ ),
515
+ /* @__PURE__ */ jsx(
516
+ "div",
517
+ {
518
+ className: cn(
519
+ "grid transition-[grid-template-rows] duration-300 ease-in-out",
520
+ isOpen ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
521
+ ),
522
+ children: /* @__PURE__ */ jsx("div", { className: "overflow-hidden", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-[12px] py-[16px] px-[8px]", children: [
523
+ /* @__PURE__ */ jsx("span", { className: "text-[15px] font-bold text-[#CC5E58] leading-[1.45] tracking-[0.08em]", children: "A" }),
524
+ /* @__PURE__ */ jsx("p", { className: "text-[13px] font-medium text-[#464646] leading-[1.85] tracking-[0.08em]", children: answer })
525
+ ] }) })
526
+ }
527
+ )
528
+ ]
529
+ }
530
+ );
531
+ }
532
+ );
533
+ FaqParts.displayName = "FaqParts";
534
+ function ChevronIcon({ isOpen }) {
535
+ return /* @__PURE__ */ jsx(
536
+ "svg",
537
+ {
538
+ width: "24",
539
+ height: "24",
540
+ viewBox: "0 0 24 24",
541
+ fill: "none",
542
+ stroke: "#464646",
543
+ xmlns: "http://www.w3.org/2000/svg",
544
+ className: cn(
545
+ "flex-shrink-0 transition-transform duration-300",
546
+ isOpen && "rotate-180"
547
+ ),
548
+ children: /* @__PURE__ */ jsx(
549
+ "path",
550
+ {
551
+ d: "M6 9L12 15L18 9",
552
+ strokeWidth: "1.5",
553
+ strokeLinecap: "round",
554
+ strokeLinejoin: "round"
555
+ }
556
+ )
557
+ }
558
+ );
559
+ }
560
+ var KeyVisual = React6.forwardRef(
561
+ ({
562
+ backgroundImage,
563
+ copyLines = [],
564
+ badges = [],
565
+ footnotes = [],
566
+ isVideo = false,
567
+ videoSrc,
568
+ className,
569
+ ...props
570
+ }, ref) => {
571
+ return /* @__PURE__ */ jsxs(
572
+ "div",
573
+ {
574
+ ref,
575
+ className: cn(
576
+ "relative w-full min-h-[548px] overflow-hidden",
577
+ "flex flex-col",
578
+ 'font-["Noto_Sans_JP",sans-serif]',
579
+ className
580
+ ),
581
+ ...props,
582
+ children: [
583
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0", children: isVideo && videoSrc ? /* @__PURE__ */ jsx(
584
+ "video",
585
+ {
586
+ src: videoSrc,
587
+ autoPlay: true,
588
+ loop: true,
589
+ muted: true,
590
+ playsInline: true,
591
+ className: "w-full h-full object-cover"
592
+ }
593
+ ) : backgroundImage ? /* @__PURE__ */ jsx(
594
+ "img",
595
+ {
596
+ src: backgroundImage,
597
+ alt: "Key Visual",
598
+ className: "w-full h-full object-cover"
599
+ }
600
+ ) : /* @__PURE__ */ jsx("div", { className: "w-full h-full bg-[#D9D9D9]" }) }),
601
+ /* @__PURE__ */ jsxs("div", { className: "relative flex-1 flex flex-col justify-between px-[20px] pt-[40px] pb-[20px]", children: [
602
+ copyLines.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-[8px] items-start", children: copyLines.map((line, index) => /* @__PURE__ */ jsx(
603
+ "div",
604
+ {
605
+ className: "bg-white px-[8px] pt-[4px] pb-[8px]",
606
+ children: /* @__PURE__ */ jsx("span", { className: "text-[24px] font-medium text-[#040404] leading-[1.55] tracking-[0.16em]", children: line })
607
+ },
608
+ index
609
+ )) }),
610
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[10px]", children: [
611
+ badges.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-between", children: badges.map((badge, index) => /* @__PURE__ */ jsx(BadgeItem, { badge }, index)) }),
612
+ footnotes.length > 0 && /* @__PURE__ */ jsx("div", { className: "text-[10px] font-normal text-[#464646] leading-[1.5]", children: footnotes.map((footnote, index) => /* @__PURE__ */ jsx("p", { className: "m-0", children: footnote }, index)) })
613
+ ] })
614
+ ] })
615
+ ]
616
+ }
617
+ );
618
+ }
619
+ );
620
+ KeyVisual.displayName = "KeyVisual";
621
+ function BadgeItem({ badge }) {
622
+ return /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col gap-[10px] items-start w-[106px]", children: [
623
+ /* @__PURE__ */ jsxs(
624
+ "div",
625
+ {
626
+ className: cn(
627
+ "size-[106px] rounded-full",
628
+ "bg-white border border-[#978E5F]",
629
+ "flex flex-col items-center justify-center",
630
+ "relative"
631
+ ),
632
+ children: [
633
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-[2px] rounded-full border border-dashed border-[#978E5F] opacity-50" }),
634
+ /* @__PURE__ */ jsx("span", { className: "text-[12px] font-bold text-[#978E5F] leading-[1.45] tracking-[0.05em] text-center", children: badge.title }),
635
+ /* @__PURE__ */ jsx("div", { className: "text-[15px] font-bold text-[#978E5F] leading-[1.45] tracking-[0.05em] text-center whitespace-pre-line", children: badge.text })
636
+ ]
637
+ }
638
+ ),
639
+ badge.footnote && /* @__PURE__ */ jsx("span", { className: "absolute -right-[0.5px] top-0 text-[7.7px] font-normal text-[#464646] leading-none tracking-[0.05em]", children: badge.footnote })
640
+ ] });
641
+ }
642
+ var backgroundStyles = {
643
+ white: "bg-white",
644
+ gray: "bg-[#F2F3F1]",
645
+ gold: "bg-[#978E5F]",
646
+ custom: ""
647
+ };
648
+ var paddingStyles = {
649
+ sm: "py-[24px] px-[20px]",
650
+ md: "py-[48px] px-[20px]",
651
+ lg: "py-[64px] px-[20px]"
652
+ };
653
+ var maxWidthStyles = {
654
+ sm: "max-w-[335px]",
655
+ md: "max-w-[375px]",
656
+ lg: "max-w-[500px]",
657
+ full: "max-w-full"
658
+ };
659
+ var Section = React6.forwardRef(
660
+ ({
661
+ title,
662
+ subtitle,
663
+ background = "white",
664
+ customBgColor,
665
+ padding = "md",
666
+ centered = true,
667
+ maxWidth = "md",
668
+ className,
669
+ style,
670
+ children,
671
+ ...props
672
+ }, ref) => {
673
+ return /* @__PURE__ */ jsx(
674
+ "section",
675
+ {
676
+ ref,
677
+ className: cn(
678
+ "w-full",
679
+ 'font-["Noto_Sans_JP",sans-serif]',
680
+ backgroundStyles[background],
681
+ paddingStyles[padding],
682
+ className
683
+ ),
684
+ style: {
685
+ backgroundColor: background === "custom" ? customBgColor : void 0,
686
+ ...style
687
+ },
688
+ ...props,
689
+ children: /* @__PURE__ */ jsxs(
690
+ "div",
691
+ {
692
+ className: cn(
693
+ "w-full mx-auto",
694
+ maxWidthStyles[maxWidth],
695
+ centered && "flex flex-col items-center"
696
+ ),
697
+ children: [
698
+ (title || subtitle) && /* @__PURE__ */ jsxs(
699
+ "div",
700
+ {
701
+ className: cn(
702
+ "flex flex-col gap-[8px] mb-[24px]",
703
+ centered && "items-center text-center"
704
+ ),
705
+ children: [
706
+ title && /* @__PURE__ */ jsx(
707
+ "h2",
708
+ {
709
+ className: cn(
710
+ "text-[22px] font-medium leading-[1.55] tracking-[0.16em]",
711
+ background === "gold" ? "text-white" : "text-[#040404]"
712
+ ),
713
+ children: title
714
+ }
715
+ ),
716
+ subtitle && /* @__PURE__ */ jsx(
717
+ "p",
718
+ {
719
+ className: cn(
720
+ "text-[13px] font-medium leading-[1.85] tracking-[0.08em]",
721
+ background === "gold" ? "text-white" : "text-[#464646]"
722
+ ),
723
+ children: subtitle
724
+ }
725
+ )
726
+ ]
727
+ }
728
+ ),
729
+ /* @__PURE__ */ jsx("div", { className: cn("w-full", centered && "flex flex-col items-center"), children })
730
+ ]
731
+ }
732
+ )
733
+ }
734
+ );
735
+ }
736
+ );
737
+ Section.displayName = "Section";
738
+ var Spec = React6.forwardRef(
739
+ ({
740
+ productName,
741
+ productImage,
742
+ items = [],
743
+ ingredients,
744
+ notes = [],
745
+ className,
746
+ ...props
747
+ }, ref) => {
748
+ return /* @__PURE__ */ jsxs(
749
+ "div",
750
+ {
751
+ ref,
752
+ className: cn(
753
+ "w-full bg-white rounded-[2px] overflow-hidden",
754
+ 'font-["Noto_Sans_JP",sans-serif]',
755
+ className
756
+ ),
757
+ ...props,
758
+ children: [
759
+ productImage && /* @__PURE__ */ jsx("div", { className: "w-full aspect-[4/3] bg-[#D9D9D9]", children: /* @__PURE__ */ jsx(
760
+ "img",
761
+ {
762
+ src: productImage,
763
+ alt: productName || "Product",
764
+ className: "w-full h-full object-cover"
765
+ }
766
+ ) }),
767
+ /* @__PURE__ */ jsxs("div", { className: "p-[24px] flex flex-col gap-[16px]", children: [
768
+ productName && /* @__PURE__ */ jsx("h3", { className: "text-[18px] font-medium text-[#040404] leading-[1.45] tracking-[0.16em] text-center", children: productName }),
769
+ items.length > 0 && /* @__PURE__ */ jsx("table", { className: "w-full border-collapse", children: /* @__PURE__ */ jsx("tbody", { children: items.map((item, index) => /* @__PURE__ */ jsxs("tr", { className: "border-b border-[#E5E6E6]", children: [
770
+ /* @__PURE__ */ jsx("th", { className: "py-[12px] px-[8px] text-left text-[13px] font-medium text-[#464646] leading-[1.85] tracking-[0.08em] w-[100px]", children: item.label }),
771
+ /* @__PURE__ */ jsx("td", { className: "py-[12px] px-[8px] text-[13px] font-medium text-[#040404] leading-[1.85] tracking-[0.08em]", children: item.value })
772
+ ] }, index)) }) }),
773
+ ingredients && /* @__PURE__ */ jsx("div", { className: "pt-[16px] border-t border-[#E5E6E6]", children: /* @__PURE__ */ jsxs("p", { className: "text-[12px] font-medium text-[#464646] leading-[1.5] tracking-[0.08em]", children: [
774
+ /* @__PURE__ */ jsx("span", { className: "font-bold", children: "\u539F\u6750\u6599\uFF1A" }),
775
+ ingredients
776
+ ] }) }),
777
+ notes.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-[4px]", children: notes.map((note, index) => /* @__PURE__ */ jsx(
778
+ "p",
779
+ {
780
+ className: "text-[10px] font-medium text-[#464646] leading-[1.5] tracking-[0.08em]",
781
+ children: note
782
+ },
783
+ index
784
+ )) })
785
+ ] })
786
+ ]
787
+ }
788
+ );
789
+ }
790
+ );
791
+ Spec.displayName = "Spec";
792
+ var backgroundStyles2 = {
793
+ gold: "bg-[#978E5F]",
794
+ gray: "bg-[#F2F3F1]"
795
+ };
796
+ var Cta = React6.forwardRef(
797
+ ({
798
+ background = "gold",
799
+ productImage,
800
+ productName,
801
+ productPrice,
802
+ productQuantity,
803
+ features = [],
804
+ promotionLabel,
805
+ promotionTitle = [],
806
+ productOptions = [],
807
+ note,
808
+ ctaMessage,
809
+ buttonText = "\u8CFC\u5165\u3059\u308B",
810
+ buttonVariant = "red",
811
+ onButtonClick,
812
+ footerLinkText,
813
+ footerLinkHref,
814
+ className,
815
+ ...props
816
+ }, ref) => {
817
+ return /* @__PURE__ */ jsx(
818
+ "div",
819
+ {
820
+ ref,
821
+ className: cn(
822
+ "w-full py-[48px] px-[20px]",
823
+ 'font-["Noto_Sans_JP",sans-serif]',
824
+ backgroundStyles2[background],
825
+ className
826
+ ),
827
+ ...props,
828
+ children: /* @__PURE__ */ jsx("div", { className: "w-full max-w-[375px] mx-auto", children: /* @__PURE__ */ jsxs("div", { className: "bg-white rounded-[2px] overflow-hidden", children: [
829
+ productImage && /* @__PURE__ */ jsx("div", { className: "w-full aspect-[4/3] bg-[#D9D9D9]", children: /* @__PURE__ */ jsx(
830
+ "img",
831
+ {
832
+ src: productImage,
833
+ alt: productName || "Product",
834
+ className: "w-full h-full object-cover"
835
+ }
836
+ ) }),
837
+ features.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex justify-center gap-[8px] py-[24px] px-[16px]", children: features.map((feature, index) => /* @__PURE__ */ jsxs(
838
+ "div",
839
+ {
840
+ className: "flex flex-col items-center gap-[8px] w-[101px]",
841
+ children: [
842
+ /* @__PURE__ */ jsx(
843
+ "div",
844
+ {
845
+ className: cn(
846
+ "size-[90px] rounded-full",
847
+ !feature.image && "bg-[#D4D4D4]"
848
+ ),
849
+ children: feature.image && /* @__PURE__ */ jsx(
850
+ "img",
851
+ {
852
+ src: feature.image,
853
+ alt: "",
854
+ className: "w-full h-full object-cover rounded-full"
855
+ }
856
+ )
857
+ }
858
+ ),
859
+ /* @__PURE__ */ jsx("span", { className: "text-[13px] font-medium text-[#040404] leading-[1.2] tracking-[0.08em] text-center", children: feature.text })
860
+ ]
861
+ },
862
+ index
863
+ )) }),
864
+ /* @__PURE__ */ jsxs("div", { className: "px-[16px] pb-[24px]", children: [
865
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-[24px] items-center mb-[24px]", children: [
866
+ productImage && /* @__PURE__ */ jsx("div", { className: "w-[130px] aspect-square bg-[#D9D9D9] flex-shrink-0", children: /* @__PURE__ */ jsx(
867
+ "img",
868
+ {
869
+ src: productImage,
870
+ alt: productName || "",
871
+ className: "w-full h-full object-cover"
872
+ }
873
+ ) }),
874
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[8px]", children: [
875
+ productName && /* @__PURE__ */ jsx("span", { className: "text-[16px] font-bold text-[#040404] leading-[1.5] tracking-[0.05em]", children: productName }),
876
+ productPrice && /* @__PURE__ */ jsxs("span", { className: "text-[25px] font-bold text-[#040404] leading-[1.45] tracking-[0.05em]", children: [
877
+ productPrice,
878
+ /* @__PURE__ */ jsx("span", { className: "text-[12px]", children: "[\u7A0E\u8FBC]" })
879
+ ] }),
880
+ productQuantity && /* @__PURE__ */ jsx("span", { className: "text-[13px] font-bold text-[#040404] leading-[1.8] tracking-[0.05em]", children: productQuantity })
881
+ ] })
882
+ ] }),
883
+ (promotionLabel || promotionTitle.length > 0) && /* @__PURE__ */ jsxs("div", { className: "bg-[#F2F3F1] rounded-[2px] p-[16px] mb-[24px]", children: [
884
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-[8px] mb-[16px]", children: [
885
+ promotionLabel && /* @__PURE__ */ jsx("span", { className: "bg-[#CC5E58] text-white text-[13px] font-bold px-[8px] py-[4px] leading-[1.55] tracking-[0.05em]", children: promotionLabel }),
886
+ promotionTitle.map((line, index) => /* @__PURE__ */ jsx(
887
+ "span",
888
+ {
889
+ className: cn(
890
+ "font-bold leading-[1.55] text-center",
891
+ index === 0 ? "text-[18px] text-[#040404] tracking-[0.05em]" : "text-[22px] text-[#CC5E58] tracking-[0.05em]"
892
+ ),
893
+ children: line
894
+ },
895
+ index
896
+ ))
897
+ ] }),
898
+ productOptions.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-[16px]", children: productOptions.map((option, index) => /* @__PURE__ */ jsxs("div", { className: "flex gap-[16px] items-center", children: [
899
+ /* @__PURE__ */ jsx(
900
+ "div",
901
+ {
902
+ className: cn(
903
+ "w-[100px] aspect-square flex-shrink-0",
904
+ !option.image && "bg-[#D9D9D9]"
905
+ ),
906
+ children: option.image && /* @__PURE__ */ jsx(
907
+ "img",
908
+ {
909
+ src: option.image,
910
+ alt: "",
911
+ className: "w-full h-full object-cover"
912
+ }
913
+ )
914
+ }
915
+ ),
916
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[4px]", children: [
917
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-[5px] items-start", children: [
918
+ /* @__PURE__ */ jsx("span", { className: "text-[14px] font-bold text-[#040404] leading-[1.45] tracking-[0.05em]", children: option.label }),
919
+ option.discount && /* @__PURE__ */ jsx("span", { className: "text-[14px] font-bold text-[#CC5E58] leading-[1.45] tracking-[0.05em]", children: option.discount })
920
+ ] }),
921
+ option.pricePerUnit && /* @__PURE__ */ jsxs("span", { className: "text-[25px] font-bold text-[#040404] leading-[1.45] tracking-[0.05em]", children: [
922
+ option.pricePerUnit,
923
+ /* @__PURE__ */ jsx("span", { className: "text-[12px]", children: "/\u672C[\u7A0E\u8FBC]" })
924
+ ] }),
925
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-[4px] text-[12px] font-bold text-[#040404] tracking-[0.05em]", children: [
926
+ option.quantity && /* @__PURE__ */ jsx("span", { children: option.quantity }),
927
+ option.totalPrice && /* @__PURE__ */ jsxs("span", { children: [
928
+ option.totalPrice,
929
+ /* @__PURE__ */ jsx("span", { className: "text-[9px]", children: "[\u7A0E\u8FBC]" })
930
+ ] })
931
+ ] })
932
+ ] })
933
+ ] }, index)) })
934
+ ] }),
935
+ note && /* @__PURE__ */ jsx("p", { className: "text-[12px] font-medium text-[#464646] leading-[1.5] tracking-[0.08em] text-center mb-[16px]", children: note })
936
+ ] }),
937
+ /* @__PURE__ */ jsxs("div", { className: "px-[16px] pb-[24px] flex flex-col items-center gap-[16px]", children: [
938
+ ctaMessage && /* @__PURE__ */ jsx("p", { className: "text-[15px] font-bold text-[#CC5E58] leading-[1.8] tracking-[0.08em] text-center", children: ctaMessage }),
939
+ /* @__PURE__ */ jsx(
940
+ Button,
941
+ {
942
+ variant: buttonVariant,
943
+ size: "md",
944
+ fullWidth: true,
945
+ onClick: onButtonClick,
946
+ className: "max-w-[310px]",
947
+ children: buttonText
948
+ }
949
+ ),
950
+ footerLinkText && /* @__PURE__ */ jsx(
951
+ "a",
952
+ {
953
+ href: footerLinkHref || "#",
954
+ className: "text-[12px] font-medium text-[#040404] leading-[1.5] tracking-[0.05em] underline",
955
+ children: footerLinkText
956
+ }
957
+ )
958
+ ] })
959
+ ] }) })
960
+ }
961
+ );
962
+ }
963
+ );
964
+ Cta.displayName = "Cta";
965
+ var backgroundStyles3 = {
966
+ white: "bg-white",
967
+ gray: "bg-[#F2F3F1]"
968
+ };
969
+ var Faq = React6.forwardRef(
970
+ ({
971
+ title = "\u3088\u304F\u3042\u308B\u3054\u8CEA\u554F",
972
+ items = [],
973
+ background = "white",
974
+ className,
975
+ ...props
976
+ }, ref) => {
977
+ return /* @__PURE__ */ jsx(
978
+ "div",
979
+ {
980
+ ref,
981
+ className: cn(
982
+ "w-full py-[48px] px-[20px]",
983
+ 'font-["Noto_Sans_JP",sans-serif]',
984
+ backgroundStyles3[background],
985
+ className
986
+ ),
987
+ ...props,
988
+ children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-[375px] mx-auto", children: [
989
+ title && /* @__PURE__ */ jsx("h2", { className: "text-[22px] font-medium text-[#040404] leading-[1.55] tracking-[0.16em] text-center mb-[24px]", children: title }),
990
+ /* @__PURE__ */ jsx("div", { className: "border-t border-[#E5E6E6]", children: items.map((item, index) => /* @__PURE__ */ jsx(
991
+ FaqParts,
992
+ {
993
+ question: item.question,
994
+ answer: item.answer,
995
+ defaultOpen: item.defaultOpen
996
+ },
997
+ index
998
+ )) })
999
+ ] })
1000
+ }
1001
+ );
1002
+ }
1003
+ );
1004
+ Faq.displayName = "Faq";
1005
+ var sizeStyles3 = {
1006
+ xs: "h-[16px]",
1007
+ sm: "h-[24px]",
1008
+ md: "h-[48px]",
1009
+ lg: "h-[64px]",
1010
+ xl: "h-[96px]"
1011
+ };
1012
+ var backgroundStyles4 = {
1013
+ transparent: "bg-transparent",
1014
+ white: "bg-white",
1015
+ gray: "bg-[#F2F3F1]"
1016
+ };
1017
+ var Blank = React6.forwardRef(
1018
+ ({ size = "md", height, background = "transparent", className, style, ...props }, ref) => {
1019
+ return /* @__PURE__ */ jsx(
1020
+ "div",
1021
+ {
1022
+ ref,
1023
+ className: cn(
1024
+ "w-full",
1025
+ !height && sizeStyles3[size],
1026
+ backgroundStyles4[background],
1027
+ className
1028
+ ),
1029
+ style: {
1030
+ height: height ? `${height}px` : void 0,
1031
+ ...style
1032
+ },
1033
+ ...props
1034
+ }
1035
+ );
1036
+ }
1037
+ );
1038
+ Blank.displayName = "Blank";
1039
+ var LpTemplate = React6.forwardRef(
1040
+ ({
1041
+ sections = [],
1042
+ maxWidth = 375,
1043
+ centered = true,
1044
+ className,
1045
+ style,
1046
+ children,
1047
+ ...props
1048
+ }, ref) => {
1049
+ return /* @__PURE__ */ jsx(
1050
+ "div",
1051
+ {
1052
+ ref,
1053
+ className: cn(
1054
+ "min-h-screen bg-white",
1055
+ 'font-["Noto_Sans_JP",sans-serif]',
1056
+ className
1057
+ ),
1058
+ ...props,
1059
+ children: /* @__PURE__ */ jsx(
1060
+ "div",
1061
+ {
1062
+ className: cn(
1063
+ "w-full",
1064
+ centered && "mx-auto"
1065
+ ),
1066
+ style: {
1067
+ maxWidth: `${maxWidth}px`,
1068
+ ...style
1069
+ },
1070
+ children: sections.length > 0 ? sections.map((section) => /* @__PURE__ */ jsx("div", { "data-section-id": section.id, children: section.component }, section.id)) : children
1071
+ }
1072
+ )
1073
+ }
1074
+ );
1075
+ }
1076
+ );
1077
+ LpTemplate.displayName = "LpTemplate";
1078
+ var ProductLpTemplate = React6.forwardRef(
1079
+ ({
1080
+ keyVisual,
1081
+ contentSections,
1082
+ cta,
1083
+ faqItems = [],
1084
+ footer,
1085
+ className,
1086
+ ...props
1087
+ }, ref) => {
1088
+ return /* @__PURE__ */ jsxs(LpTemplate, { ref, className, ...props, children: [
1089
+ keyVisual && /* @__PURE__ */ jsx(
1090
+ KeyVisual,
1091
+ {
1092
+ backgroundImage: keyVisual.backgroundImage,
1093
+ copyLines: keyVisual.copyLines,
1094
+ badges: keyVisual.badges,
1095
+ footnotes: keyVisual.footnotes
1096
+ }
1097
+ ),
1098
+ contentSections,
1099
+ cta && /* @__PURE__ */ jsxs(Fragment, { children: [
1100
+ /* @__PURE__ */ jsx(Blank, { size: "md" }),
1101
+ /* @__PURE__ */ jsx(
1102
+ Cta,
1103
+ {
1104
+ background: cta.background,
1105
+ productImage: cta.productImage,
1106
+ productName: cta.productName,
1107
+ productPrice: cta.productPrice,
1108
+ productQuantity: cta.productQuantity,
1109
+ promotionLabel: cta.promotionLabel,
1110
+ promotionTitle: cta.promotionTitle,
1111
+ productOptions: cta.productOptions,
1112
+ note: cta.note,
1113
+ ctaMessage: cta.ctaMessage,
1114
+ buttonText: cta.buttonText,
1115
+ onButtonClick: cta.onButtonClick,
1116
+ footerLinkText: cta.footerLinkText,
1117
+ footerLinkHref: cta.footerLinkHref
1118
+ }
1119
+ )
1120
+ ] }),
1121
+ faqItems.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
1122
+ /* @__PURE__ */ jsx(Blank, { size: "md" }),
1123
+ /* @__PURE__ */ jsx(Faq, { items: faqItems })
1124
+ ] }),
1125
+ footer && /* @__PURE__ */ jsxs(Fragment, { children: [
1126
+ /* @__PURE__ */ jsx(Blank, { size: "md" }),
1127
+ footer
1128
+ ] })
1129
+ ] });
1130
+ }
1131
+ );
1132
+ ProductLpTemplate.displayName = "ProductLpTemplate";
1133
+
1134
+ export { AnchorButton, Blank, Button, Cta, Faq, FaqParts, Icon, Image, KeyVisual, LpTemplate, ProductImage, ProductLpTemplate, Section, Spec, Text, UserVoice };
1135
+ //# sourceMappingURL=index.js.map
1136
+ //# sourceMappingURL=index.js.map