11'use client'
22
33import { type CSSProperties , useEffect , useState } from 'react'
4+ import { cn } from '@sim/emcn'
45import * as Icons from '@sim/emcn/icons'
56import { ComponentPreview } from '@studio/_components/component-fixtures'
67import type { StudioSample } from '@studio/_lib/manifest'
@@ -30,17 +31,6 @@ interface StudioFixtureProps {
3031 sample ?: StudioSample
3132}
3233
33- const SAMPLE_RADII : Record < string , string > = {
34- 'rounded-none' : '0' ,
35- 'rounded-sm' : '2px' ,
36- 'rounded-md' : '6px' ,
37- 'rounded-lg' : '8px' ,
38- 'rounded-xl' : '12px' ,
39- 'rounded-2xl' : '16px' ,
40- 'rounded-3xl' : '24px' ,
41- 'rounded-full' : '9999px' ,
42- }
43-
4434function GenericSample ( { sample } : { sample : StudioSample } ) {
4535 const authoredStyle : CSSProperties = { }
4636 if ( / ^ (?: \d + (?: \. \d + ) ? (?: p x | r e m | e m | % ) | 0 ) $ / . test ( sample . value ) ) {
@@ -55,8 +45,6 @@ function GenericSample({ sample }: { sample: StudioSample }) {
5545 const classTokens = sample . className . split ( / \s + / )
5646 for ( const token of classTokens ) {
5747 if ( token . includes ( ':' ) ) continue
58- const radius = SAMPLE_RADII [ token ]
59- if ( radius ) authoredStyle . borderRadius = radius
6048 const arbitrary = / ^ ( [ \w - ] + ) - \[ ( .+ ) \] ! ? $ / . exec ( token )
6149 if ( ! arbitrary ) continue
6250 const [ , utility , raw ] = arbitrary
@@ -124,7 +112,7 @@ function GenericSample({ sample }: { sample: StudioSample }) {
124112 if ( sample . kind === 'text' ) {
125113 return (
126114 < p
127- className = { ` max-w-80 text-center text-[var(--text-body)] ${ visualClasses } ` }
115+ className = { cn ( ' max-w-80 text-center text-[var(--text-body)]' , visualClasses ) }
128116 style = { authoredStyle }
129117 >
130118 The quick brown fox jumps over the lazy dog.
@@ -137,7 +125,7 @@ function GenericSample({ sample }: { sample: StudioSample }) {
137125 return (
138126 < label
139127 style = { authoredStyle }
140- className = { ` inline-flex items-center gap-3 text-[var(--text-body)] ${ visualClasses } ` }
128+ className = { cn ( ' inline-flex items-center gap-3 text-[var(--text-body)]' , visualClasses ) }
141129 >
142130 < input type = 'checkbox' defaultChecked />
143131 Example label
@@ -151,7 +139,10 @@ function GenericSample({ sample }: { sample: StudioSample }) {
151139 readOnly
152140 value = 'Example text'
153141 style = { authoredStyle }
154- className = { `max-w-60 rounded-md border border-[var(--border)] bg-[var(--surface-3)] px-3 py-2 text-[var(--text-body)] ${ visualClasses } ` }
142+ className = { cn (
143+ 'max-w-60 rounded-md border border-[var(--border)] bg-[var(--surface-3)] px-3 py-2 text-[var(--text-body)]' ,
144+ visualClasses
145+ ) }
155146 />
156147 )
157148 }
@@ -162,7 +153,10 @@ function GenericSample({ sample }: { sample: StudioSample }) {
162153 readOnly
163154 value = 'Example input'
164155 style = { authoredStyle }
165- className = { `max-w-60 rounded-md border border-[var(--border)] bg-[var(--surface-3)] px-3 py-2 text-[var(--text-body)] ${ visualClasses } ` }
156+ className = { cn (
157+ 'max-w-60 rounded-md border border-[var(--border)] bg-[var(--surface-3)] px-3 py-2 text-[var(--text-body)]' ,
158+ visualClasses
159+ ) }
166160 />
167161 )
168162 }
@@ -171,7 +165,7 @@ function GenericSample({ sample }: { sample: StudioSample }) {
171165 < a
172166 href = '#sample-link'
173167 style = { authoredStyle }
174- className = { ` text-[var(--text-body)] underline underline-offset-4 ${ visualClasses } ` }
168+ className = { cn ( ' text-[var(--text-body)] underline underline-offset-4' , visualClasses ) }
175169 >
176170 Example link ↗
177171 </ a >
@@ -181,7 +175,10 @@ function GenericSample({ sample }: { sample: StudioSample }) {
181175 return (
182176 < span
183177 style = { authoredStyle }
184- className = { `flex size-10 items-center justify-center rounded-full border border-[var(--border)] bg-[var(--surface-3)] text-[var(--text-body)] text-xs ${ visualClasses } ` }
178+ className = { cn (
179+ 'flex size-10 items-center justify-center rounded-full border border-[var(--border)] bg-[var(--surface-3)] text-[var(--text-body)] text-xs' ,
180+ visualClasses
181+ ) }
185182 >
186183 AL
187184 </ span >
@@ -191,7 +188,10 @@ function GenericSample({ sample }: { sample: StudioSample }) {
191188 return (
192189 < span
193190 style = { authoredStyle }
194- className = { `inline-flex items-center rounded-full border border-[var(--border)] bg-[var(--surface-3)] px-3 py-1 text-[var(--text-body)] text-xs ${ visualClasses } ` }
191+ className = { cn (
192+ 'inline-flex items-center rounded-full border border-[var(--border)] bg-[var(--surface-3)] px-3 py-1 text-[var(--text-body)] text-xs' ,
193+ visualClasses
194+ ) }
195195 >
196196 Example tag
197197 </ span >
@@ -202,7 +202,7 @@ function GenericSample({ sample }: { sample: StudioSample }) {
202202 < div
203203 role = 'menuitem'
204204 style = { authoredStyle }
205- className = { ` rounded-md px-3 py-2 text-[var(--text-body)] text-sm ${ visualClasses } ` }
205+ className = { cn ( ' rounded-md px-3 py-2 text-[var(--text-body)] text-sm' , visualClasses ) }
206206 >
207207 Example menu item
208208 </ div >
@@ -212,7 +212,10 @@ function GenericSample({ sample }: { sample: StudioSample }) {
212212 return (
213213 < div
214214 style = { authoredStyle }
215- className = { `min-w-40 rounded-lg border border-[var(--border)] bg-[var(--surface-3)] p-3 text-[var(--text-body)] text-sm shadow-sm ${ visualClasses } ` }
215+ className = { cn (
216+ 'min-w-40 rounded-lg border border-[var(--border)] bg-[var(--surface-3)] p-3 text-[var(--text-body)] text-sm shadow-sm' ,
217+ visualClasses
218+ ) }
216219 >
217220 Example content
218221 </ div >
@@ -222,7 +225,10 @@ function GenericSample({ sample }: { sample: StudioSample }) {
222225 return (
223226 < div
224227 style = { authoredStyle }
225- className = { `min-w-40 rounded-lg border border-[var(--border)] bg-[var(--surface-3)] px-4 py-3 text-[var(--text-body)] text-sm ${ visualClasses } ` }
228+ className = { cn (
229+ 'min-w-40 rounded-lg border border-[var(--border)] bg-[var(--surface-3)] px-4 py-3 text-[var(--text-body)] text-sm' ,
230+ visualClasses
231+ ) }
226232 >
227233 Example content
228234 </ div >
@@ -232,7 +238,10 @@ function GenericSample({ sample }: { sample: StudioSample }) {
232238 < button
233239 type = 'button'
234240 style = { authoredStyle }
235- className = { `min-h-9 rounded-md border border-[var(--border)] bg-[var(--surface-3)] px-3 py-2 text-[var(--text-body)] ${ visualClasses } ` }
241+ className = { cn (
242+ 'min-h-9 rounded-md border border-[var(--border)] bg-[var(--surface-3)] px-3 py-2 text-[var(--text-body)]' ,
243+ visualClasses
244+ ) }
236245 >
237246 { visualClasses . includes ( 'size-' ) ? '●' : 'Example action' }
238247 </ button >
@@ -241,7 +250,10 @@ function GenericSample({ sample }: { sample: StudioSample }) {
241250 return (
242251 < div
243252 style = { authoredStyle }
244- className = { `flex h-24 w-48 items-center justify-center rounded-lg border border-[var(--border)] bg-[var(--surface-3)] text-[var(--text-body)] ${ visualClasses } ` }
253+ className = { cn (
254+ 'flex h-24 w-48 items-center justify-center rounded-lg border border-[var(--border)] bg-[var(--surface-3)] text-[var(--text-body)]' ,
255+ visualClasses
256+ ) }
245257 >
246258 < span className = 'text-xs' > Sample surface</ span >
247259 </ div >
0 commit comments