@@ -103,11 +116,11 @@ export function Around() {
const shown = spots.filter((p) => inRange(spotRange)(meters(p)));
return (
<>
-
{shown.slice(0, firstSpots).map((p, i) => row(p, i))}
+
{shown.slice(0, firstSpots).map(spot)}
{shown.length > firstSpots && (
{shown.length - firstSpots}곳 더 보기
- {shown.slice(firstSpots).map((p, i) => row(p, i + firstSpots))}
+ {shown.slice(firstSpots).map(spot)}
)}
>
diff --git a/solution/site/src/layouts/graphic/Festival.tsx b/solution/site/src/layouts/graphic/Festival.tsx
index 5be93e8..0a65f39 100644
--- a/solution/site/src/layouts/graphic/Festival.tsx
+++ b/solution/site/src/layouts/graphic/Festival.tsx
@@ -2,6 +2,7 @@ import {useState} from 'react';
import type {FestivalEntry} from '@o2o/shared';
import {useSite} from '@site/lib/site-context';
import {naverSearchUrl} from '@site/lib/format';
+import {PhotoCard} from '../kit/Card';
import {Sheet} from '../paper/Sheet';
const SEASONS = ['봄', '여름', '가을', '겨울'];
@@ -40,15 +41,13 @@ export function Festival() {
)}
{shown.map((f) => (
-
+
setOpen(f)}
+ />
))}
diff --git a/solution/site/src/layouts/graphic/graphic.css b/solution/site/src/layouts/graphic/graphic.css
index 265bffd..e6a5d4c 100644
--- a/solution/site/src/layouts/graphic/graphic.css
+++ b/solution/site/src/layouts/graphic/graphic.css
@@ -334,3 +334,7 @@
@media(max-width:1023px){.w4-graphic #location .btns{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.w4-graphic #location .btns>:first-child{grid-column:1/-1}
.w4-graphic #location .btns>*{white-space:nowrap;min-width:0}}
+.w4-graphic{--kc-r:0;--kc-box-r:22px;--kc-bg:var(--card);--kc-shadow:0 2px 0 rgba(29,43,36,.08);--kc-px:12px;--kc-pb:14px;--kc-tf:var(--k-head);--kc-tw:400;--kc-ts:17px;--kc-mc:var(--accent);--kc-sub:var(--sub);--kc-soft:#fff1c9}
+.w4-graphic .rail>.kcard{flex:0 0 72%;height:auto}
+.w4-graphic .guide--card{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px 14px}
+@media (min-width:1024px){.w4-graphic .rail>.kcard{flex:0 0 calc((100% - 48px) / 4)}.w4-graphic .guide--card{grid-template-columns:repeat(4,minmax(0,1fr));gap:32px 16px}}
diff --git a/solution/site/src/layouts/kit/Card.tsx b/solution/site/src/layouts/kit/Card.tsx
new file mode 100644
index 0000000..d2e4b56
--- /dev/null
+++ b/solution/site/src/layouts/kit/Card.tsx
@@ -0,0 +1,31 @@
+import type {ReactNode} from 'react';
+import './card.css';
+
+export function PhotoCard({
+ image,
+ title,
+ meta,
+ desc,
+ fallback,
+ ratio,
+ onClick,
+}: {
+ image?: string | null;
+ title: string;
+ meta?: string | null;
+ desc?: string | null;
+ fallback?: ReactNode;
+ ratio?: string;
+ onClick: () => void;
+}) {
+ return (
+
+ );
+}
diff --git a/solution/site/src/layouts/kit/card.css b/solution/site/src/layouts/kit/card.css
new file mode 100644
index 0000000..ec7e615
--- /dev/null
+++ b/solution/site/src/layouts/kit/card.css
@@ -0,0 +1,13 @@
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kcard{display:flex;flex-direction:column;width:100%;height:100%;min-width:0;margin:0;padding:0 0 var(--kc-pb,0);border:0;border-radius:var(--kc-box-r,0);overflow:hidden;background:var(--kc-bg,none);box-shadow:var(--kc-shadow,none);color:inherit;font:inherit;text-align:left;cursor:pointer;-webkit-appearance:none;appearance:none}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kcard-ph{position:relative;display:block;width:100%;aspect-ratio:var(--kc-ar,3/2);border-radius:var(--kc-r,14px);overflow:hidden;background:var(--kc-soft,rgba(127,127,127,.1))}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kcard-ph img{display:block;width:100%;height:100%;object-fit:cover;transition:transform .5s ease}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kcard:hover .kcard-ph img{transform:scale(1.03)}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kcard-no{display:grid;place-items:center;width:100%;height:100%;padding:0 16px;font-family:var(--kc-tf,inherit);font-size:17px;line-height:1.4;text-align:center;color:var(--kc-sub,inherit)}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kcard-no svg{width:40px;height:40px}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kcard-t{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;margin-top:12px;padding:0 var(--kc-px,2px);font-family:var(--kc-tf,inherit);font-size:var(--kc-ts,16px);font-weight:var(--kc-tw,600);line-height:1.45;letter-spacing:-.01em}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kcard-m{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;margin-top:4px;padding:0 var(--kc-px,2px);font-size:14px;font-weight:500;line-height:1.5;color:var(--kc-mc,inherit)}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kcard-d{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-top:6px;padding:0 var(--kc-px,2px);font-size:15px;line-height:1.6;color:var(--kc-sub,inherit)}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px 14px}
+@media (min-width:1024px){:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .kgrid{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:32px 20px}}
+:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .car--multi:has(.kcard) .arrow{top:calc(50% - 30px)}
+@media (max-width:1023px){:is(.w4p,.w4-round,.w4-cinema,.w4-bigtype,.w4-boutique,.w4-graphic,.w4-coral,.w4-minimal,.w4-pine) .car--multi:has(.kcard) .arrow{display:none}}
diff --git a/solution/site/src/layouts/minimal/Around.tsx b/solution/site/src/layouts/minimal/Around.tsx
index 138f8c2..24e58a2 100644
--- a/solution/site/src/layouts/minimal/Around.tsx
+++ b/solution/site/src/layouts/minimal/Around.tsx
@@ -2,6 +2,7 @@ import {useState} from 'react';
import type {LocalPlace} from '@o2o/shared';
import {useSite} from '@site/lib/site-context';
import {naverMapSearchUrl} from '@site/lib/format';
+import {PhotoCard} from '../kit/Card';
import {Sheet} from '../paper/Sheet';
import {useWide} from './useWide';
@@ -66,18 +67,14 @@ export function Around() {
);
const card = (place: LocalPlace) => (
-
+
setOpen(place)}
+ />
);
return (
@@ -94,15 +91,13 @@ export function Around() {