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