@@ -144,53 +144,74 @@ export function ExtensionDetailClient({
144144 </ motion . div >
145145
146146 { /* Hero Section */ }
147- < div className = "flex flex-col md:flex-row gap-8 md:gap-12 items-start mb-16 relative" >
147+ < div className = "flex flex-col md:flex-row gap-6 md:gap-12 items-start mb-10 md:mb- 16 relative w-full " >
148148 { /* Background Glow */ }
149149 < div className = "absolute top-1/2 left-0 -translate-y-1/2 -ml-20 w-64 h-64 bg-primary-500/10 rounded-full blur-[80px] pointer-events-none" />
150150
151- < motion . div
152- initial = { { opacity : 0 , scale : 0.9 } }
153- animate = { { opacity : 1 , scale : 1 } }
154- transition = { { duration : 0.5 , delay : 0.1 } }
155- className = "shrink-0 relative z-10"
156- >
157- < div className = "w-28 h-28 sm:w-40 sm:h-40 rounded-[32px] bg-white dark:bg-[#111111] border border-gray-200 dark:border-white/10 shadow-sm flex items-center justify-center p-4 relative overflow-hidden group" >
158- { extension . icon && ! iconError ? (
159- < Image
160- src = { extension . icon }
161- alt = { displayTitle }
162- width = { 128 }
163- height = { 128 }
164- className = "w-full h-full object-contain group-hover:scale-105 transition-transform duration-500"
165- onError = { ( ) => setIconError ( true ) }
166- />
167- ) : (
168- < svg
169- aria-hidden = "true"
170- className = "w-12 h-12 text-gray-300 dark:text-gray-600"
171- fill = "none"
172- viewBox = "0 0 24 24"
173- stroke = "currentColor"
174- >
175- < path
176- strokeLinecap = "round"
177- strokeLinejoin = "round"
178- strokeWidth = { 1.5 }
179- d = "M17 14v6m-3-3h6M6 10h2a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v2a2 2 0 002 2zm10 0h2a2 2 0 002-2V6a2 2 0 00-2-2h-2a2 2 0 00-2 2v2a2 2 0 002 2zM6 20h2a2 2 0 002-2v-2a2 2 0 00-2-2H6a2 2 0 00-2 2v2a2 2 0 002 2z"
151+ { /* Icon & Mobile Title Wrapper */ }
152+ < div className = "flex flex-row items-center md:items-start gap-4 md:gap-0 w-full md:w-auto relative z-10 shrink-0" >
153+ < motion . div
154+ initial = { { opacity : 0 , scale : 0.9 } }
155+ animate = { { opacity : 1 , scale : 1 } }
156+ transition = { { duration : 0.5 , delay : 0.1 } }
157+ className = "shrink-0 relative z-10"
158+ >
159+ < div className = "w-20 h-20 sm:w-28 sm:h-28 md:w-40 md:h-40 rounded-[20px] sm:rounded-[28px] md:rounded-[32px] bg-white dark:bg-[#111111] border border-gray-200 dark:border-white/10 shadow-sm flex items-center justify-center p-3 md:p-4 relative overflow-hidden group" >
160+ { extension . icon && ! iconError ? (
161+ < Image
162+ src = { extension . icon }
163+ alt = { displayTitle }
164+ width = { 128 }
165+ height = { 128 }
166+ className = "w-full h-full object-contain group-hover:scale-105 transition-transform duration-500"
167+ onError = { ( ) => setIconError ( true ) }
180168 />
181- </ svg >
182- ) }
183- < div className = "absolute inset-0 border border-black/5 dark:border-white/5 rounded-[32px] pointer-events-none" />
184- </ div >
185- </ motion . div >
169+ ) : (
170+ < svg
171+ aria-hidden = "true"
172+ className = "w-10 h-10 md:w-12 md:h-12 text-gray-300 dark:text-gray-600"
173+ fill = "none"
174+ viewBox = "0 0 24 24"
175+ stroke = "currentColor"
176+ >
177+ < path
178+ strokeLinecap = "round"
179+ strokeLinejoin = "round"
180+ strokeWidth = { 1.5 }
181+ d = "M17 14v6m-3-3h6M6 10h2a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v2a2 2 0 002 2zm10 0h2a2 2 0 002-2V6a2 2 0 00-2-2h-2a2 2 0 00-2 2v2a2 2 0 002 2zM6 20h2a2 2 0 002-2v-2a2 2 0 00-2-2H6a2 2 0 00-2 2v2a2 2 0 002 2z"
182+ />
183+ </ svg >
184+ ) }
185+ < div className = "absolute inset-0 border border-black/5 dark:border-white/5 rounded-[20px] sm:rounded-[28px] md:rounded-[32px] pointer-events-none" />
186+ </ div >
187+ </ motion . div >
188+
189+ { /* Mobile Title */ }
190+ < motion . div
191+ initial = { { opacity : 0 , y : 15 } }
192+ animate = { { opacity : 1 , y : 0 } }
193+ transition = { { duration : 0.5 , delay : 0.2 } }
194+ className = "flex-1 min-w-0 md:hidden"
195+ >
196+ < div className = "flex flex-col gap-1.5" >
197+ < h1 className = "text-[20px] sm:text-[24px] font-extrabold text-gray-900 dark:text-white tracking-tight leading-tight line-clamp-2" >
198+ { displayTitle }
199+ </ h1 >
200+ < span className = "self-start px-2 py-0.5 rounded-full text-[12px] font-mono font-bold bg-primary-50 text-primary-600 dark:bg-primary-500/10 dark:text-primary-400 border border-primary-100 dark:border-primary-500/20" >
201+ v{ extension . version }
202+ </ span >
203+ </ div >
204+ </ motion . div >
205+ </ div >
186206
187207 < motion . div
188208 initial = { { opacity : 0 , y : 20 } }
189209 animate = { { opacity : 1 , y : 0 } }
190210 transition = { { duration : 0.5 , delay : 0.2 } }
191- className = "flex-1 min-w-0 pt-2 relative z-10"
211+ className = "flex-1 min-w-0 md: pt-2 relative z-10 w-full "
192212 >
193- < div className = "flex flex-wrap items-center gap-4 mb-4" >
213+ { /* Desktop Title */ }
214+ < div className = "hidden md:flex flex-wrap items-center gap-4 mb-4" >
194215 < h1 className = "text-3xl sm:text-4xl font-extrabold text-gray-900 dark:text-white tracking-tight leading-tight" >
195216 { displayTitle }
196217 </ h1 >
@@ -199,12 +220,14 @@ export function ExtensionDetailClient({
199220 </ span >
200221 </ div >
201222
202- < div className = "flex flex-wrap items-center gap-x-4 gap-y-2 text-[14px] font-medium mb-6" >
223+ < div className = "flex flex-wrap items-center gap-x-3 gap-y-2 md:gap-x-4 text-[13px] md:text-[ 14px] font-medium mb-5 md: mb-6" >
203224 < div className = "flex items-center gap-1.5 text-gray-700 dark:text-gray-300" >
204225 < span className = "text-gray-400 dark:text-gray-500" >
205226 { t . author }
206227 </ span >
207- { authorName }
228+ < span className = "truncate max-w-[120px] sm:max-w-none" >
229+ { authorName }
230+ </ span >
208231 </ div >
209232 < span className = "text-gray-300 dark:text-gray-700" > •</ span >
210233 < div
@@ -252,18 +275,18 @@ export function ExtensionDetailClient({
252275 </ div >
253276
254277 { extension . description && (
255- < p className = "text-[16px ] sm:text-[17px] text-gray-600 dark:text-gray-400 leading-relaxed mb-8 max-w-2xl" >
278+ < p className = "text-[15px ] sm:text-[17px] text-gray-600 dark:text-gray-400 leading-relaxed mb-6 md: mb-8 max-w-2xl" >
256279 { extension . description }
257280 </ p >
258281 ) }
259282
260- < div className = "flex flex-wrap items-center gap-3" >
283+ < div className = "flex flex-col sm:flex-row sm:flex- wrap items-stretch sm: items-center gap-3" >
261284 < motion . button
262285 type = "button"
263286 onClick = { handleInstall }
264287 disabled = { installing }
265288 whileTap = { { scale : 0.98 } }
266- className = "h-12 px-8 rounded-2xl bg-primary-500 hover:bg-primary-600 text-white font-semibold text-[15px] shadow-lg shadow-primary-500/25 transition-all flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
289+ className = "h-12 w-full sm:w-auto px-8 rounded-2xl bg-primary-500 hover:bg-primary-600 text-white font-semibold text-[15px] shadow-lg shadow-primary-500/25 transition-all flex items-center justify -center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
267290 >
268291 { installing ? (
269292 < svg
@@ -309,7 +332,7 @@ export function ExtensionDetailClient({
309332 type = "button"
310333 onClick = { handleCopy }
311334 whileTap = { { scale : 0.98 } }
312- className = "h-12 px-6 rounded-2xl bg-gray-50 hover:bg-gray-100 dark:bg-white/5 dark:hover:bg-white/10 text-gray-700 dark:text-gray-200 font-medium text-[15px] border border-gray-200 dark:border-white/10 transition-all flex items-center gap-2"
335+ className = "h-12 w-full sm:w-auto px-6 rounded-2xl bg-gray-50 hover:bg-gray-100 dark:bg-white/5 dark:hover:bg-white/10 text-gray-700 dark:text-gray-200 font-medium text-[15px] border border-gray-200 dark:border-white/10 transition-all flex items-center justify -center gap-2"
313336 >
314337 { copied ? (
315338 < svg
@@ -350,7 +373,7 @@ export function ExtensionDetailClient({
350373 target = "_blank"
351374 rel = "noopener noreferrer"
352375 whileTap = { { scale : 0.98 } }
353- className = "h-12 px-6 rounded-2xl bg-gray-50 hover:bg-gray-100 dark:bg-white/5 dark:hover:bg-white/10 text-gray-700 dark:text-gray-200 font-medium text-[15px] border border-gray-200 dark:border-white/10 transition-all flex items-center gap-2"
376+ className = "h-12 w-full sm:w-auto px-6 rounded-2xl bg-gray-50 hover:bg-gray-100 dark:bg-white/5 dark:hover:bg-white/10 text-gray-700 dark:text-gray-200 font-medium text-[15px] border border-gray-200 dark:border-white/10 transition-all flex items-center justify -center gap-2"
354377 >
355378 < svg
356379 aria-hidden = "true"
0 commit comments