zark-design 1.0.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/README.md +60 -0
- package/bin/cli.js +177 -0
- package/package.json +31 -0
- package/templates/REFERENCE.md +376 -0
- package/templates/SHOWCASE.html +254 -0
- package/templates/assets/zark-icon.png +0 -0
- package/templates/assets/zark-logo.png +0 -0
- package/templates/brand.jsx +89 -0
- package/templates/components.jsx +385 -0
- package/templates/design-canvas.jsx +789 -0
- package/templates/foundations.jsx +363 -0
- package/templates/icons.jsx +65 -0
- package/templates/layouts.jsx +232 -0
- package/templates/patterns.jsx +268 -0
- package/templates/primitives.jsx +306 -0
- package/templates/tokens.css +306 -0
- package/templates/visual-references/icon-zark.png +0 -0
- package/templates/visual-references/logo-zark-principal.png +0 -0
- package/templates/visual-references/pasted-1777605750385-0.png +0 -0
- package/templates/visual-references/pasted-1777605766298-0.png +0 -0
- package/templates/visual-references/pasted-1777605775820-0.png +0 -0
- package/templates/visual-references/pasted-1777605789833-0.png +0 -0
- package/templates/visual-references/pasted-1777605802420-0.png +0 -0
- package/templates/visual-references/pasted-1777605812470-0.png +0 -0
- package/templates/visual-references/pasted-1777605817688-0.png +0 -0
- package/templates/visual-references/pasted-1777605828485-0.png +0 -0
- package/templates/visual-references/pasted-1777605837137-0.png +0 -0
- package/templates/visual-references/pasted-1777605849789-0.png +0 -0
- package/templates/visual-references/pasted-1777605864942-0.png +0 -0
- package/templates/visual-references/pasted-1777605877920-0.png +0 -0
- package/templates/visual-references/pasted-1777605897353-0.png +0 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
// Zark — Components showcase
|
|
2
|
+
|
|
3
|
+
const SubLabel = ({ children }) => (
|
|
4
|
+
<div style={{
|
|
5
|
+
fontFamily:'var(--font-mono)', fontSize: 10,
|
|
6
|
+
letterSpacing:'var(--ls-wider)', textTransform:'uppercase',
|
|
7
|
+
color:'var(--ink-300)', marginBottom: 12,
|
|
8
|
+
}}>{children}</div>
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
const ComponentRow = ({ label, children, style }) => (
|
|
12
|
+
<div style={{ marginBottom: 24 }}>
|
|
13
|
+
<SubLabel>{label}</SubLabel>
|
|
14
|
+
<div style={{ display:'flex', flexWrap:'wrap', alignItems:'center', gap: 10, ...style }}>
|
|
15
|
+
{children}
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
// ---------- BUTTONS ----------
|
|
21
|
+
const ButtonsShowcase = () => (
|
|
22
|
+
<Panel title="Buttons" kicker="5 variants × 4 sizes">
|
|
23
|
+
<ComponentRow label="Variants — md">
|
|
24
|
+
<Button variant="primary" icon={<Icons.Upgrade size={14}/>}>Upgrade</Button>
|
|
25
|
+
<Button variant="secondary">Get code</Button>
|
|
26
|
+
<Button variant="soft" icon={<Icons.Sparkles size={14}/>}>Try with AI</Button>
|
|
27
|
+
<Button variant="ghost" icon={<Icons.ChevLeft size={14}/>}>Back</Button>
|
|
28
|
+
<Button variant="danger" icon={<Icons.Stop size={14}/>}>Stop</Button>
|
|
29
|
+
</ComponentRow>
|
|
30
|
+
<ComponentRow label="Sizes — primary">
|
|
31
|
+
<Button variant="primary" size="xs">XS</Button>
|
|
32
|
+
<Button variant="primary" size="sm">Small</Button>
|
|
33
|
+
<Button variant="primary" size="md">Medium</Button>
|
|
34
|
+
<Button variant="primary" size="lg">Large</Button>
|
|
35
|
+
</ComponentRow>
|
|
36
|
+
<ComponentRow label="With icons">
|
|
37
|
+
<Button variant="primary" iconRight={<Icons.ChevRight size={14}/>}>Start scraping</Button>
|
|
38
|
+
<Button variant="secondary" icon={<Icons.Download size={14}/>}>JSON</Button>
|
|
39
|
+
<Button variant="secondary" icon={<Icons.Code size={14}/>}>Markdown</Button>
|
|
40
|
+
<Button variant="ghost" icon={<Icons.Plus size={14}/>}>Add</Button>
|
|
41
|
+
</ComponentRow>
|
|
42
|
+
<ComponentRow label="States">
|
|
43
|
+
<Button variant="primary">Default</Button>
|
|
44
|
+
<Button variant="primary" style={{ background:'var(--ember-700)' }}>Hover</Button>
|
|
45
|
+
<Button variant="primary" style={{ background:'var(--ember-800)' }}>Pressed</Button>
|
|
46
|
+
<Button variant="secondary" disabled style={{ opacity: 0.5, cursor:'not-allowed' }}>Disabled</Button>
|
|
47
|
+
<Button variant="primary" icon={<Icons.Spinner size={14} style={{ animation:'zark-spin 1s linear infinite' }}/>}>Loading…</Button>
|
|
48
|
+
</ComponentRow>
|
|
49
|
+
<Spec label="Heights" value="22 / 28 / 32 / 40 px" mono/>
|
|
50
|
+
<Spec label="Border radius" value="r-sm → r-lg" mono/>
|
|
51
|
+
<Spec label="Primary fill" value="ember-600 → ember-700 hover" mono/>
|
|
52
|
+
</Panel>
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
// ---------- INPUTS ----------
|
|
56
|
+
const InputsShowcase = () => {
|
|
57
|
+
const [v, setV] = React.useState('');
|
|
58
|
+
const [on, setOn] = React.useState(true);
|
|
59
|
+
const [tab, setTab] = React.useState('scrape');
|
|
60
|
+
return (
|
|
61
|
+
<Panel title="Inputs, toggles, segmented">
|
|
62
|
+
<ComponentRow label="Text inputs">
|
|
63
|
+
<div style={{ width: 280 }}>
|
|
64
|
+
<Input icon={<Icons.Search size={14}/>} placeholder="Search..." value={v} onChange={e=>setV(e.target.value)} suffix={<Kbd>⌘K</Kbd>}/>
|
|
65
|
+
</div>
|
|
66
|
+
<div style={{ width: 280 }}>
|
|
67
|
+
<Input icon={<Icons.Globe size={14}/>} placeholder="https://example.com"/>
|
|
68
|
+
</div>
|
|
69
|
+
<div style={{ width: 220 }}>
|
|
70
|
+
<Input mono value="fc-9••••••••••••aebf" readOnly suffix={<span style={{display:'inline-flex',gap:4}}><Icons.Eye size={14}/><Icons.Copy size={14}/></span>}/>
|
|
71
|
+
</div>
|
|
72
|
+
</ComponentRow>
|
|
73
|
+
|
|
74
|
+
<ComponentRow label="URL pill (search-style)">
|
|
75
|
+
<div style={{
|
|
76
|
+
display:'flex', alignItems:'center', width: 520, height: 44,
|
|
77
|
+
background:'var(--surface)',
|
|
78
|
+
border:'1px solid var(--line-300)',
|
|
79
|
+
borderRadius:'var(--r-pill)',
|
|
80
|
+
boxShadow:'var(--shadow-sm)',
|
|
81
|
+
overflow:'hidden',
|
|
82
|
+
}}>
|
|
83
|
+
<span style={{
|
|
84
|
+
display:'inline-flex', alignItems:'center', gap:6,
|
|
85
|
+
padding:'0 14px', height:'100%',
|
|
86
|
+
color:'var(--ink-400)', fontFamily:'var(--font-mono)', fontSize: 12,
|
|
87
|
+
borderRight:'1px solid var(--line-200)',
|
|
88
|
+
}}><Icons.Globe size={14}/> https://</span>
|
|
89
|
+
<input placeholder="www.nngroup.com/articles/..."
|
|
90
|
+
style={{
|
|
91
|
+
flex:1, border:'none', outline:'none', background:'transparent',
|
|
92
|
+
padding:'0 16px', fontSize: 13, color:'var(--ink-700)',
|
|
93
|
+
fontFamily:'var(--font-mono)',
|
|
94
|
+
}}/>
|
|
95
|
+
</div>
|
|
96
|
+
</ComponentRow>
|
|
97
|
+
|
|
98
|
+
<ComponentRow label="Segmented (Scrape / Search / Map / Crawl)">
|
|
99
|
+
<Segmented value={tab} onChange={setTab} items={[
|
|
100
|
+
{ value:'scrape', label:'Scrape', icon:<Icons.Drag size={14}/> },
|
|
101
|
+
{ value:'search', label:'Search', icon:<Icons.Search size={14}/>, tag:'New' },
|
|
102
|
+
{ value:'map', label:'Map', icon:<Icons.Filter size={14}/> },
|
|
103
|
+
{ value:'crawl', label:'Crawl', icon:<Icons.Close size={14}/> },
|
|
104
|
+
]}/>
|
|
105
|
+
</ComponentRow>
|
|
106
|
+
|
|
107
|
+
<ComponentRow label="Toggles">
|
|
108
|
+
<div style={{ display:'flex', alignItems:'center', gap: 12 }}>
|
|
109
|
+
<Toggle on={on} onChange={setOn}/>
|
|
110
|
+
<span style={{ fontSize: 13, color:'var(--ink-600)' }}>Main content only</span>
|
|
111
|
+
</div>
|
|
112
|
+
<div style={{ display:'flex', alignItems:'center', gap: 12 }}>
|
|
113
|
+
<Toggle on={!on} onChange={(v)=>setOn(!v)}/>
|
|
114
|
+
<span style={{ fontSize: 13, color:'var(--ink-600)' }}>Stealth mode</span>
|
|
115
|
+
<Tag tone="default" size="xs" square>5 cr / page</Tag>
|
|
116
|
+
</div>
|
|
117
|
+
</ComponentRow>
|
|
118
|
+
</Panel>
|
|
119
|
+
);
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// ---------- TAGS / BADGES ----------
|
|
123
|
+
const TagsShowcase = () => (
|
|
124
|
+
<Panel title="Tags, badges, kbd">
|
|
125
|
+
<ComponentRow label="Tags — pill">
|
|
126
|
+
<Tag tone="ember">New</Tag>
|
|
127
|
+
<Tag tone="default">Optional</Tag>
|
|
128
|
+
<Tag tone="success">Claimed</Tag>
|
|
129
|
+
<Tag tone="success">Completed</Tag>
|
|
130
|
+
<Tag tone="info">Live</Tag>
|
|
131
|
+
<Tag tone="warning">Pending</Tag>
|
|
132
|
+
<Tag tone="danger">Failed</Tag>
|
|
133
|
+
</ComponentRow>
|
|
134
|
+
<ComponentRow label="Tags — square (data labels)">
|
|
135
|
+
<Tag tone="mono" size="xs" square>TypeScript</Tag>
|
|
136
|
+
<Tag tone="mono" size="xs" square>Python</Tag>
|
|
137
|
+
<Tag tone="mono" size="xs" square>Next.js</Tag>
|
|
138
|
+
<Tag tone="mono" size="xs" square>Zark SDK</Tag>
|
|
139
|
+
<Tag tone="mono" size="xs" square>AI SDK</Tag>
|
|
140
|
+
</ComponentRow>
|
|
141
|
+
<ComponentRow label="Notification badges">
|
|
142
|
+
<div style={{ position:'relative', display:'inline-block' }}>
|
|
143
|
+
<Button variant="ghost" icon={<Icons.Bell size={16}/>}/>
|
|
144
|
+
<div style={{ position:'absolute', top: 2, right: 2 }}><Badge count={1}/></div>
|
|
145
|
+
</div>
|
|
146
|
+
<div style={{ position:'relative', display:'inline-block' }}>
|
|
147
|
+
<Button variant="ghost" icon={<Icons.Help size={16}/>}>Help</Button>
|
|
148
|
+
<div style={{ position:'absolute', top: -4, right: -4 }}><Badge count={6}/></div>
|
|
149
|
+
</div>
|
|
150
|
+
</ComponentRow>
|
|
151
|
+
<ComponentRow label="Keyboard shortcuts">
|
|
152
|
+
<span style={{ display:'inline-flex', gap:4 }}><Kbd>⌘</Kbd><Kbd>K</Kbd></span>
|
|
153
|
+
<span style={{ display:'inline-flex', gap:4 }}><Kbd>⇧</Kbd><Kbd>↵</Kbd></span>
|
|
154
|
+
<span style={{ display:'inline-flex', gap:4 }}><Kbd>Esc</Kbd></span>
|
|
155
|
+
</ComponentRow>
|
|
156
|
+
</Panel>
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
// ---------- ENDPOINT CARD ----------
|
|
160
|
+
const EndpointCard = ({ icon, label, tag, desc }) => (
|
|
161
|
+
<div style={{
|
|
162
|
+
flex:1, minWidth: 200,
|
|
163
|
+
border:'1px solid var(--line-200)',
|
|
164
|
+
background:'var(--surface)',
|
|
165
|
+
padding: 18,
|
|
166
|
+
cursor:'pointer',
|
|
167
|
+
transition:'border-color var(--t-fast)',
|
|
168
|
+
}}
|
|
169
|
+
onMouseEnter={e=>e.currentTarget.style.borderColor='var(--ink-300)'}
|
|
170
|
+
onMouseLeave={e=>e.currentTarget.style.borderColor='var(--line-200)'}>
|
|
171
|
+
<div style={{ display:'flex', alignItems:'center', gap: 8, marginBottom: 10 }}>
|
|
172
|
+
<span style={{ color:'var(--ember-600)' }}>{icon}</span>
|
|
173
|
+
<span style={{ fontSize: 14, fontWeight: 600, color:'var(--ink-700)' }}>{label}</span>
|
|
174
|
+
<Icons.ChevRight size={12}/>
|
|
175
|
+
{tag && <Tag tone="ember" size="xs">{tag}</Tag>}
|
|
176
|
+
</div>
|
|
177
|
+
<div style={{ fontSize: 12, color:'var(--ink-400)', lineHeight: 1.5 }}>{desc}</div>
|
|
178
|
+
</div>
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
const CardsShowcase = () => (
|
|
182
|
+
<Panel title="Cards" padded={false}>
|
|
183
|
+
<div style={{ padding: 24 }}>
|
|
184
|
+
<SubLabel>Endpoint cards — borderless row</SubLabel>
|
|
185
|
+
<div style={{ display:'flex', gap: 0, marginTop: 4 }}>
|
|
186
|
+
<EndpointCard icon={<Icons.Drag size={14}/>} label="Scrape" desc="Get llm-ready data from websites. Markdown, JSON, screenshot, etc."/>
|
|
187
|
+
<EndpointCard icon={<Icons.Search size={14}/>} label="Search" tag="NEW" desc="Search the web and get full content from results."/>
|
|
188
|
+
<EndpointCard icon={<Icons.Globe size={14}/>} label="Crawl" desc="Crawl all the pages on a website and get data for each page."/>
|
|
189
|
+
<EndpointCard icon={<Icons.Sparkles size={14}/>} label="Extract" desc="Get structured data from websites with AI."/>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<div style={{ borderTop:'1px solid var(--line-100)', padding: 24 }}>
|
|
194
|
+
<SubLabel>Stat / data card</SubLabel>
|
|
195
|
+
<div style={{
|
|
196
|
+
background:'var(--surface)', border:'1px solid var(--line-200)',
|
|
197
|
+
borderRadius:'var(--r-xl)', padding: 20, maxWidth: 460,
|
|
198
|
+
}}>
|
|
199
|
+
<div style={{ display:'flex', justifyContent:'space-between', alignItems:'baseline' }}>
|
|
200
|
+
<div>
|
|
201
|
+
<div style={{ fontSize: 14, fontWeight: 600, color:'var(--ink-700)' }}>Scraped pages — Last 7 days</div>
|
|
202
|
+
<div style={{ fontSize: 12, color:'var(--ink-400)', marginTop: 2 }}>Credit usage differs</div>
|
|
203
|
+
</div>
|
|
204
|
+
<div style={{ fontSize: 28, fontWeight: 600, color:'var(--ink-700)', fontFamily:'var(--font-display)' }}>2</div>
|
|
205
|
+
</div>
|
|
206
|
+
<div style={{ marginTop: 18, display:'flex', justifyContent:'center' }}>
|
|
207
|
+
<AsciiCurve width={62} height={10}/>
|
|
208
|
+
</div>
|
|
209
|
+
<div style={{ marginTop: 8, display:'flex', justifyContent:'space-between', fontFamily:'var(--font-mono)', fontSize: 9, color:'var(--ink-300)' }}>
|
|
210
|
+
<span>08/29</span><span>09/01</span><span>09/05</span>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
|
|
215
|
+
<div style={{ borderTop:'1px solid var(--line-100)', padding: 24 }}>
|
|
216
|
+
<SubLabel>Integration tile</SubLabel>
|
|
217
|
+
<div style={{ display:'grid', gridTemplateColumns:'repeat(3, 1fr)', gap: 0, maxWidth: 700, border:'1px solid var(--line-200)', borderRadius:'var(--r-xl)', overflow:'hidden' }}>
|
|
218
|
+
{[
|
|
219
|
+
['Python','snake','#3572A5'],
|
|
220
|
+
['JS/TS SDK','JS','#F7DF1E'],
|
|
221
|
+
['Langchain','🦜','#1D6F42'],
|
|
222
|
+
['Make','M','#7341FF'],
|
|
223
|
+
['Discord','D','#5865F2'],
|
|
224
|
+
['Pipedream','P','#42BD41'],
|
|
225
|
+
].map(([name,abbr,clr],i)=>(
|
|
226
|
+
<div key={name} style={{
|
|
227
|
+
display:'flex', alignItems:'center', justifyContent:'space-between',
|
|
228
|
+
padding:'14px 16px',
|
|
229
|
+
borderBottom: i < 3 ? '1px solid var(--line-100)' : 'none',
|
|
230
|
+
borderRight: (i % 3) < 2 ? '1px solid var(--line-100)' : 'none',
|
|
231
|
+
cursor:'pointer',
|
|
232
|
+
}}>
|
|
233
|
+
<div style={{ display:'flex', alignItems:'center', gap: 10 }}>
|
|
234
|
+
<span style={{ width: 22, height: 22, borderRadius:'var(--r-sm)', background: clr, color:'#fff', display:'flex', alignItems:'center', justifyContent:'center', fontSize: 10, fontWeight: 700 }}>{abbr.charAt(0)}</span>
|
|
235
|
+
<span style={{ fontSize: 13, color:'var(--ink-700)' }}>{name}</span>
|
|
236
|
+
</div>
|
|
237
|
+
<Icons.External size={12} style={{ color:'var(--ink-300)' }}/>
|
|
238
|
+
</div>
|
|
239
|
+
))}
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
|
|
243
|
+
<div style={{ borderTop:'1px solid var(--line-100)', padding: 24 }}>
|
|
244
|
+
<SubLabel>Project / example card with tags</SubLabel>
|
|
245
|
+
<div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap: 16, maxWidth: 700 }}>
|
|
246
|
+
{[
|
|
247
|
+
{t:'30+ Examples', d:'Collection of simple projects built with Zark', tags:['TypeScript','Python','Zark SDK']},
|
|
248
|
+
{t:'LLMs.txt Generator', d:'Generate an llms.txt with this web app built on Next.js', tags:['TypeScript','Next.js','Zark SDK']},
|
|
249
|
+
].map(p=>(
|
|
250
|
+
<div key={p.t} style={{
|
|
251
|
+
border:'1px solid var(--line-200)', borderRadius:'var(--r-xl)',
|
|
252
|
+
padding: 16, background:'var(--surface)', cursor:'pointer',
|
|
253
|
+
}}>
|
|
254
|
+
<div style={{ display:'flex', justifyContent:'space-between', alignItems:'flex-start', marginBottom: 6 }}>
|
|
255
|
+
<div style={{ fontSize: 14, fontWeight: 600, color:'var(--ink-700)' }}>{p.t}</div>
|
|
256
|
+
<Icons.External size={12} style={{ color:'var(--ink-300)' }}/>
|
|
257
|
+
</div>
|
|
258
|
+
<div style={{ fontSize: 12, color:'var(--ink-400)', lineHeight: 1.5, marginBottom: 12 }}>{p.d}</div>
|
|
259
|
+
<div style={{ display:'flex', flexWrap:'wrap', gap: 6 }}>
|
|
260
|
+
{p.tags.map(t=><Tag key={t} tone="mono" size="xs" square>{t}</Tag>)}
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
))}
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
</Panel>
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
// ---------- NAVIGATION ----------
|
|
270
|
+
const SidebarItem = ({ icon, label, active, sub, kbd }) => (
|
|
271
|
+
<div style={{
|
|
272
|
+
display:'flex', alignItems:'center', gap: 10,
|
|
273
|
+
padding:'7px 10px',
|
|
274
|
+
fontSize: 13,
|
|
275
|
+
color: active ? 'var(--ember-700)' : 'var(--ink-500)',
|
|
276
|
+
background: active ? 'var(--ember-50)' : 'transparent',
|
|
277
|
+
borderRadius:'var(--r-md)',
|
|
278
|
+
cursor:'pointer', userSelect:'none',
|
|
279
|
+
fontWeight: active ? 500 : 400,
|
|
280
|
+
}}>
|
|
281
|
+
<span style={{ color: active ? 'var(--ember-600)' : 'var(--ink-400)' }}>{icon}</span>
|
|
282
|
+
<span style={{ flex: 1 }}>{label}</span>
|
|
283
|
+
{kbd}
|
|
284
|
+
{sub && <Icons.ChevDown size={12}/>}
|
|
285
|
+
</div>
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
const NavShowcase = () => (
|
|
289
|
+
<Panel title="Navigation — sidebar" padded={false}>
|
|
290
|
+
<div style={{ display:'flex' }}>
|
|
291
|
+
<div style={{
|
|
292
|
+
width: 240, background:'var(--canvas)',
|
|
293
|
+
borderRight:'1px solid var(--line-200)',
|
|
294
|
+
padding: 12, display:'flex', flexDirection:'column', gap: 4,
|
|
295
|
+
minHeight: 480,
|
|
296
|
+
}}>
|
|
297
|
+
<div style={{ padding:'8px 10px 16px' }}>
|
|
298
|
+
<ZarkLogo/>
|
|
299
|
+
</div>
|
|
300
|
+
<div style={{ padding:'0 4px 8px' }}>
|
|
301
|
+
<Input size="sm" icon={<Icons.Search size={12}/>} placeholder="Search" suffix={<Kbd>⌘K</Kbd>}/>
|
|
302
|
+
</div>
|
|
303
|
+
<SidebarItem icon={<Icons.Home size={16}/>} label="Overview" active/>
|
|
304
|
+
<SidebarItem icon={<Icons.Play size={16}/>} label="Playground"/>
|
|
305
|
+
<SidebarItem icon={<Icons.Extract size={16}/>} label="Extract" sub/>
|
|
306
|
+
<div style={{ marginLeft: 26, display:'flex', flexDirection:'column', gap: 2 }}>
|
|
307
|
+
<SidebarItem label="Overview"/>
|
|
308
|
+
<SidebarItem label="Playground"/>
|
|
309
|
+
</div>
|
|
310
|
+
<SidebarItem icon={<Icons.Activity size={16}/>} label="Activity Logs"/>
|
|
311
|
+
<SidebarItem icon={<Icons.Usage size={16}/>} label="Usage"/>
|
|
312
|
+
<SidebarItem icon={<Icons.Key size={16}/>} label="API Keys"/>
|
|
313
|
+
<SidebarItem icon={<Icons.Settings size={16}/>} label="Settings"/>
|
|
314
|
+
|
|
315
|
+
<div style={{ flex: 1 }}/>
|
|
316
|
+
|
|
317
|
+
<div style={{
|
|
318
|
+
margin: 4, padding: 12,
|
|
319
|
+
background:'var(--surface)',
|
|
320
|
+
border:'1px solid var(--line-200)',
|
|
321
|
+
borderRadius:'var(--r-lg)',
|
|
322
|
+
}}>
|
|
323
|
+
<div style={{ display:'flex', alignItems:'center', gap: 6, marginBottom: 4 }}>
|
|
324
|
+
<Icons.Sparkles size={12} style={{ color:'var(--ember-500)' }}/>
|
|
325
|
+
<span style={{ fontSize: 12, fontWeight: 600, color:'var(--ink-700)' }}>What's New</span>
|
|
326
|
+
<span style={{ fontSize: 10, color:'var(--ember-600)', fontFamily:'var(--font-mono)' }}>(6)</span>
|
|
327
|
+
</div>
|
|
328
|
+
<div style={{ fontSize: 11, color:'var(--ink-400)' }}>View our latest update</div>
|
|
329
|
+
</div>
|
|
330
|
+
|
|
331
|
+
<div style={{ display:'flex', alignItems:'center', gap: 8, padding:'8px 10px' }}>
|
|
332
|
+
<Avatar name="S" size={22} square color="var(--ember-500)"/>
|
|
333
|
+
<span style={{ fontSize: 11, color:'var(--ink-500)', fontFamily:'var(--font-mono)', overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>sam@zark.app</span>
|
|
334
|
+
</div>
|
|
335
|
+
<div style={{ display:'flex', alignItems:'center', gap: 6, padding:'8px 10px', fontSize: 12, color:'var(--ink-400)', cursor:'pointer' }}>
|
|
336
|
+
<Icons.ChevLeft size={12}/> Collapse
|
|
337
|
+
</div>
|
|
338
|
+
</div>
|
|
339
|
+
|
|
340
|
+
{/* Topbar preview */}
|
|
341
|
+
<div style={{ flex: 1, padding: 0, background:'var(--paper)' }}>
|
|
342
|
+
<div style={{
|
|
343
|
+
height: 56, padding:'0 24px',
|
|
344
|
+
display:'flex', alignItems:'center', justifyContent:'space-between',
|
|
345
|
+
borderBottom:'1px solid var(--line-200)',
|
|
346
|
+
}}>
|
|
347
|
+
<div style={{
|
|
348
|
+
display:'inline-flex', alignItems:'center', gap: 8,
|
|
349
|
+
padding:'6px 12px', background:'var(--ember-50)',
|
|
350
|
+
border:'1px solid var(--ember-200)',
|
|
351
|
+
borderRadius:'var(--r-md)',
|
|
352
|
+
}}>
|
|
353
|
+
<Avatar name="P" size={18} square color="var(--ember-500)"/>
|
|
354
|
+
<span style={{ fontSize: 13, color:'var(--ember-700)', fontWeight: 500 }}>Personal Team</span>
|
|
355
|
+
<Icons.ChevDown size={12} style={{ color:'var(--ember-700)' }}/>
|
|
356
|
+
</div>
|
|
357
|
+
<div style={{ display:'flex', gap: 6, alignItems:'center' }}>
|
|
358
|
+
<Button variant="ghost" size="sm" icon={<Icons.Bell size={14}/>}/>
|
|
359
|
+
<Button variant="ghost" size="sm" icon={<Icons.Help size={14}/>}>Help</Button>
|
|
360
|
+
<Button variant="secondary" size="sm" icon={<Icons.Docs size={14}/>}>Docs</Button>
|
|
361
|
+
<Button variant="primary" size="sm" icon={<Icons.Upgrade size={14}/>}>Upgrade</Button>
|
|
362
|
+
</div>
|
|
363
|
+
</div>
|
|
364
|
+
<div style={{ padding: 32 }}>
|
|
365
|
+
<SubLabel>Sidebar states</SubLabel>
|
|
366
|
+
<div style={{ display:'flex', flexDirection:'column', gap: 4, maxWidth: 240, marginTop: 12 }}>
|
|
367
|
+
<SidebarItem icon={<Icons.Home size={16}/>} label="Default"/>
|
|
368
|
+
<SidebarItem icon={<Icons.Play size={16}/>} label="Hover" active={false} style={{ background:'var(--ink-50)' }}/>
|
|
369
|
+
<SidebarItem icon={<Icons.Activity size={16}/>} label="Active (selected)" active/>
|
|
370
|
+
</div>
|
|
371
|
+
<Spec mono label="Width" value="240px"/>
|
|
372
|
+
<Spec mono label="Background" value="canvas"/>
|
|
373
|
+
<Spec mono label="Active fill" value="ember-50 + ember-700"/>
|
|
374
|
+
<Spec mono label="Item height" value="32px (sp-8)"/>
|
|
375
|
+
</div>
|
|
376
|
+
</div>
|
|
377
|
+
</div>
|
|
378
|
+
</Panel>
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
window.ButtonsShowcase = ButtonsShowcase;
|
|
382
|
+
window.InputsShowcase = InputsShowcase;
|
|
383
|
+
window.TagsShowcase = TagsShowcase;
|
|
384
|
+
window.CardsShowcase = CardsShowcase;
|
|
385
|
+
window.NavShowcase = NavShowcase;
|