atomsystem 0.4.3 → 0.5.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 +112 -52
- package/components/blocks/BlockDetailPageContent.tsx +337 -0
- package/components/blocks/BlockViewerCard.tsx +123 -123
- package/components/blocks/BlocksSidebar.tsx +93 -0
- package/components/blocks/CardListBlock.tsx +101 -196
- package/components/blocks/FileExplorerBlock.tsx +114 -446
- package/components/blocks/InteractiveChatBlock.tsx +107 -123
- package/components/blocks/MetricStatsBlock.tsx +78 -106
- package/components/blocks/PricingPlanBlock.tsx +88 -144
- package/components/blocks/RealtimeChartBlock.tsx +131 -250
- package/components/blocks/SliderShowcaseBlock.tsx +105 -305
- package/components/ui/Container.tsx +45 -0
- package/components/ui/Layout.tsx +220 -0
- package/components/ui/Switch.tsx +39 -0
- package/components/ui/Table.tsx +88 -0
- package/components/ui/Tabs.tsx +58 -0
- package/components/ui/index.ts +5 -0
- package/css/atom-ui.css +41 -816
- package/dist/cli.cjs +633 -41
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +630 -39
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +176 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -4
- package/dist/index.d.ts +13 -4
- package/dist/index.js +176 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/presets/agents.guide.md +49 -0
- package/presets/blocks.md +101 -0
- package/presets/components.md +142 -0
- package/tokens/token.json +63 -1
- package/tokens/tokens.json +63 -1
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import React, { useState } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { Card, Button, Badge } from '@/components/ui';
|
|
5
|
+
import {
|
|
6
|
+
Check,
|
|
7
|
+
X,
|
|
8
|
+
Sparkles,
|
|
9
|
+
} from 'lucide-react';
|
|
5
10
|
|
|
6
11
|
interface PricingTier {
|
|
7
12
|
id: string;
|
|
@@ -11,7 +16,6 @@ interface PricingTier {
|
|
|
11
16
|
description: string;
|
|
12
17
|
monthlyPrice: number;
|
|
13
18
|
annualPrice: number;
|
|
14
|
-
icon: 'zap' | 'sparkles' | 'building';
|
|
15
19
|
features: { text: string; included: boolean }[];
|
|
16
20
|
ctaText: string;
|
|
17
21
|
}
|
|
@@ -20,191 +24,134 @@ const TIERS: PricingTier[] = [
|
|
|
20
24
|
{
|
|
21
25
|
id: 'starter',
|
|
22
26
|
name: 'Starter',
|
|
23
|
-
description: '개인 개발자 및
|
|
27
|
+
description: '개인 개발자 및 오픈소스 프로젝트를 위한 플랜.',
|
|
24
28
|
monthlyPrice: 0,
|
|
25
29
|
annualPrice: 0,
|
|
26
|
-
icon: 'zap',
|
|
27
30
|
ctaText: '무료로 시작하기',
|
|
28
31
|
features: [
|
|
29
32
|
{ text: '최대 3개 프로젝트 연동', included: true },
|
|
30
|
-
{ text: '
|
|
31
|
-
{ text: 'Tailwind v4 CSS
|
|
32
|
-
{ text: '커스텀
|
|
33
|
-
{ text: '
|
|
34
|
-
{ text: 'SSO 단일 로그인 및 감사 로그', included: false },
|
|
33
|
+
{ text: 'W3C DTCG 표준 토큰 규격', included: true },
|
|
34
|
+
{ text: 'Tailwind v4 CSS 즉시 컴파일', included: true },
|
|
35
|
+
{ text: '실시간 커스텀 테마 에디터', included: false },
|
|
36
|
+
{ text: '우선 기술 지원 SLA', included: false },
|
|
35
37
|
],
|
|
36
38
|
},
|
|
37
39
|
{
|
|
38
40
|
id: 'pro',
|
|
39
41
|
name: 'Pro',
|
|
40
42
|
isPopular: true,
|
|
41
|
-
badge: '
|
|
42
|
-
description: '
|
|
43
|
-
monthlyPrice:
|
|
44
|
-
annualPrice:
|
|
45
|
-
icon: 'sparkles',
|
|
43
|
+
badge: '추천 플랜',
|
|
44
|
+
description: '디자인 시스템 확장을 준비하는 프로덕트 팀.',
|
|
45
|
+
monthlyPrice: 29000,
|
|
46
|
+
annualPrice: 22000,
|
|
46
47
|
ctaText: '14일 무료 체험 시작',
|
|
47
48
|
features: [
|
|
48
49
|
{ text: '무제한 프로젝트 & 토큰 세트', included: true },
|
|
49
|
-
{ text: '
|
|
50
|
-
{ text: 'Tailwind v4
|
|
51
|
-
{ text: '커스텀
|
|
52
|
-
{ text: '
|
|
53
|
-
{ text: 'SSO 단일 로그인 및 감사 로그', included: false },
|
|
50
|
+
{ text: 'W3C DTCG 표준 토큰 규격', included: true },
|
|
51
|
+
{ text: 'Tailwind v4 CSS 즉시 컴파일', included: true },
|
|
52
|
+
{ text: '실시간 커스텀 테마 에디터', included: true },
|
|
53
|
+
{ text: 'Git 저장소 실시간 동기화', included: true },
|
|
54
54
|
],
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
id: 'enterprise',
|
|
58
58
|
name: 'Enterprise',
|
|
59
|
-
description: '
|
|
60
|
-
monthlyPrice:
|
|
61
|
-
annualPrice:
|
|
62
|
-
|
|
63
|
-
ctaText: '영업팀 문의하기',
|
|
59
|
+
description: '엄격한 보안과 거버넌스가 필요한 엔터프라이즈.',
|
|
60
|
+
monthlyPrice: 99000,
|
|
61
|
+
annualPrice: 79000,
|
|
62
|
+
ctaText: '영업팀 문의',
|
|
64
63
|
features: [
|
|
65
|
-
{ text: '
|
|
66
|
-
{ text: '
|
|
67
|
-
{ text: '
|
|
68
|
-
{ text: '
|
|
69
|
-
{ text: 'SSO
|
|
70
|
-
{ text: '맞춤형 계약 및 보안성 심사 지원', included: true },
|
|
64
|
+
{ text: '무제한 프로젝트 & 전용 빌드 코어', included: true },
|
|
65
|
+
{ text: 'W3C DTCG 표준 토큰 규격', included: true },
|
|
66
|
+
{ text: 'Tailwind v4 CSS 즉시 컴파일', included: true },
|
|
67
|
+
{ text: '실시간 커스텀 테마 에디터', included: true },
|
|
68
|
+
{ text: 'SSO, 감사 로그 & 99.99% SLA', included: true },
|
|
71
69
|
],
|
|
72
70
|
},
|
|
73
71
|
];
|
|
74
72
|
|
|
75
73
|
export function PricingPlanBlock() {
|
|
76
|
-
const [
|
|
77
|
-
const [selectedPlan, setSelectedPlan] = useState<string>('pro');
|
|
78
|
-
|
|
79
|
-
const getTierIcon = (icon: PricingTier['icon']) => {
|
|
80
|
-
switch (icon) {
|
|
81
|
-
case 'zap':
|
|
82
|
-
return <Zap className="w-5 h-5 text-blue-500" />;
|
|
83
|
-
case 'sparkles':
|
|
84
|
-
return <Sparkles className="w-5 h-5 text-amber-500" />;
|
|
85
|
-
case 'building':
|
|
86
|
-
return <Building2 className="w-5 h-5 text-purple-500" />;
|
|
87
|
-
}
|
|
88
|
-
};
|
|
74
|
+
const [billingCycle, setBillingCycle] = useState<'monthly' | 'annual'>('annual');
|
|
89
75
|
|
|
90
76
|
return (
|
|
91
|
-
<
|
|
92
|
-
{/* Header & Billing Toggle */}
|
|
93
|
-
<div className="
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
</p>
|
|
77
|
+
<Card className="p-5 sm:p-6 transition-colors">
|
|
78
|
+
{/* 1. Header & Billing Toggle (Using Button & Badge Component) */}
|
|
79
|
+
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4 mb-6">
|
|
80
|
+
<div>
|
|
81
|
+
<h3 className="text-base font-semibold text-(--text-primary)">
|
|
82
|
+
요금제 플랜 선택
|
|
83
|
+
</h3>
|
|
84
|
+
<p className="text-xs text-(--text-secondary) mt-0.5">
|
|
85
|
+
팀의 규모와 워크플로우에 맞는 플랜을 선택하세요.
|
|
86
|
+
</p>
|
|
87
|
+
</div>
|
|
103
88
|
|
|
104
|
-
{/*
|
|
105
|
-
<div className="
|
|
106
|
-
<
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
: 'text-(--text-secondary) hover:text-(--text-primary)'
|
|
112
|
-
}`}
|
|
89
|
+
{/* Billing Switch composed with Button components */}
|
|
90
|
+
<div className="flex items-center gap-1 p-0.5 rounded-(--radius-sm) bg-(--bg-secondary) border border-(--border-subtle) text-xs self-start sm:self-auto">
|
|
91
|
+
<Button
|
|
92
|
+
size="sm"
|
|
93
|
+
variant={billingCycle === 'monthly' ? 'primary' : 'ghost'}
|
|
94
|
+
onClick={() => setBillingCycle('monthly')}
|
|
95
|
+
className="text-xs py-1 px-3 h-auto"
|
|
113
96
|
>
|
|
114
97
|
월간 결제
|
|
115
|
-
</
|
|
116
|
-
<
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
: 'text-(--text-secondary) hover:text-(--text-primary)'
|
|
122
|
-
}`}
|
|
98
|
+
</Button>
|
|
99
|
+
<Button
|
|
100
|
+
size="sm"
|
|
101
|
+
variant={billingCycle === 'annual' ? 'primary' : 'ghost'}
|
|
102
|
+
onClick={() => setBillingCycle('annual')}
|
|
103
|
+
className="text-xs py-1 px-3 h-auto flex items-center gap-1"
|
|
123
104
|
>
|
|
124
105
|
<span>연간 결제</span>
|
|
125
|
-
<
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
>
|
|
130
|
-
20% OFF
|
|
131
|
-
</span>
|
|
132
|
-
</button>
|
|
106
|
+
<Badge variant="success" className="text-xs px-1.5 py-0 font-bold">
|
|
107
|
+
-20%
|
|
108
|
+
</Badge>
|
|
109
|
+
</Button>
|
|
133
110
|
</div>
|
|
134
111
|
</div>
|
|
135
112
|
|
|
136
|
-
{/*
|
|
137
|
-
<div className="grid grid-cols-1 md:grid-cols-3 gap-
|
|
113
|
+
{/* 2. Three Column Pricing Cards composed with Card & Button */}
|
|
114
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
138
115
|
{TIERS.map((tier) => {
|
|
139
|
-
const
|
|
140
|
-
const price = isAnnual ? tier.annualPrice : tier.monthlyPrice;
|
|
141
|
-
|
|
116
|
+
const price = billingCycle === 'annual' ? tier.annualPrice : tier.monthlyPrice;
|
|
142
117
|
return (
|
|
143
|
-
<
|
|
118
|
+
<Card
|
|
144
119
|
key={tier.id}
|
|
145
|
-
|
|
146
|
-
className={`relative flex flex-col justify-between rounded-2xl p-6 transition-all duration-200 cursor-pointer ${
|
|
120
|
+
className={`p-5 flex flex-col justify-between transition-colors bg-(--bg-primary) ${
|
|
147
121
|
tier.isPopular
|
|
148
|
-
? 'border-
|
|
149
|
-
: 'border
|
|
122
|
+
? 'border-(--text-primary)'
|
|
123
|
+
: 'border-(--border-subtle)'
|
|
150
124
|
}`}
|
|
151
125
|
>
|
|
152
|
-
{/* Popular Badge */}
|
|
153
|
-
{tier.badge && (
|
|
154
|
-
<div className="absolute -top-3.5 left-1/2 -translate-x-1/2 px-3 py-1 rounded-full text-[11px] font-bold bg-(--accent-primary) text-white shadow-sm flex items-center gap-1">
|
|
155
|
-
<Sparkles className="w-3 h-3" />
|
|
156
|
-
<span>{tier.badge}</span>
|
|
157
|
-
</div>
|
|
158
|
-
)}
|
|
159
|
-
|
|
160
126
|
<div>
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
<span className="text-[11px] font-bold px-2 py-0.5 rounded-full bg-emerald-500/10 text-emerald-600 dark:text-emerald-400">
|
|
168
|
-
선택됨
|
|
169
|
-
</span>
|
|
127
|
+
<div className="flex items-center justify-between mb-2">
|
|
128
|
+
<h4 className="font-semibold text-sm text-(--text-primary)">{tier.name}</h4>
|
|
129
|
+
{tier.badge && (
|
|
130
|
+
<Badge variant="primary" className="text-xs">
|
|
131
|
+
{tier.badge}
|
|
132
|
+
</Badge>
|
|
170
133
|
)}
|
|
171
134
|
</div>
|
|
172
|
-
|
|
173
|
-
<h4 className="text-lg font-bold text-(--text-primary)">{tier.name}</h4>
|
|
174
|
-
<p className="text-xs text-(--text-secondary) mt-1 min-h-[32px] leading-relaxed">
|
|
135
|
+
<p className="text-xs text-(--text-secondary) mb-4 leading-relaxed">
|
|
175
136
|
{tier.description}
|
|
176
137
|
</p>
|
|
177
138
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
</span>
|
|
184
|
-
<span className="text-xs text-(--text-muted)">/월 (계정당)</span>
|
|
185
|
-
</div>
|
|
186
|
-
<div className="text-[11px] text-(--text-muted) mt-1">
|
|
187
|
-
{isAnnual ? '연간 일괄 결제 기준' : '매월 자동 갱신'}
|
|
188
|
-
</div>
|
|
139
|
+
<div className="flex items-baseline gap-1 mb-5">
|
|
140
|
+
<span className="text-2xl font-bold tracking-tight text-(--text-primary)">
|
|
141
|
+
₩{price.toLocaleString()}
|
|
142
|
+
</span>
|
|
143
|
+
<span className="text-xs text-(--text-secondary)">/월</span>
|
|
189
144
|
</div>
|
|
190
145
|
|
|
191
|
-
|
|
192
|
-
<div className="space-y-3 mb-6">
|
|
193
|
-
<div className="text-[11px] font-semibold text-(--text-muted) uppercase tracking-wider">
|
|
194
|
-
포함된 핵심 기능
|
|
195
|
-
</div>
|
|
146
|
+
<div className="space-y-2.5 pt-4 border-t border-(--border-subtle) text-xs">
|
|
196
147
|
{tier.features.map((feat, idx) => (
|
|
197
|
-
<div key={idx} className="flex items-center gap-2
|
|
148
|
+
<div key={idx} className="flex items-center gap-2">
|
|
198
149
|
{feat.included ? (
|
|
199
|
-
<
|
|
200
|
-
<Check className="w-2.5 h-2.5 stroke-[3]" />
|
|
201
|
-
</div>
|
|
150
|
+
<Check className="w-3.5 h-3.5 text-emerald-600 dark:text-emerald-400 shrink-0" />
|
|
202
151
|
) : (
|
|
203
|
-
<
|
|
204
|
-
<X className="w-2.5 h-2.5" />
|
|
205
|
-
</div>
|
|
152
|
+
<X className="w-3.5 h-3.5 text-(--text-muted) shrink-0 opacity-40" />
|
|
206
153
|
)}
|
|
207
|
-
<span className={feat.included ? 'text-(--text-primary)' : 'text-(--text-muted) line-through'}>
|
|
154
|
+
<span className={feat.included ? 'text-(--text-primary)' : 'text-(--text-muted) line-through opacity-60'}>
|
|
208
155
|
{feat.text}
|
|
209
156
|
</span>
|
|
210
157
|
</div>
|
|
@@ -212,20 +159,17 @@ export function PricingPlanBlock() {
|
|
|
212
159
|
</div>
|
|
213
160
|
</div>
|
|
214
161
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
? 'bg-(--accent-primary) hover:bg-(--accent-hover) text-white'
|
|
220
|
-
: 'bg-(--bg-secondary) hover:bg-(--border-strong) text-(--text-primary) border border-(--border-subtle)'
|
|
221
|
-
}`}
|
|
162
|
+
<Button
|
|
163
|
+
variant={tier.isPopular ? 'primary' : 'secondary'}
|
|
164
|
+
size="md"
|
|
165
|
+
className="w-full mt-6 text-xs"
|
|
222
166
|
>
|
|
223
167
|
{tier.ctaText}
|
|
224
|
-
</
|
|
225
|
-
</
|
|
168
|
+
</Button>
|
|
169
|
+
</Card>
|
|
226
170
|
);
|
|
227
171
|
})}
|
|
228
172
|
</div>
|
|
229
|
-
</
|
|
173
|
+
</Card>
|
|
230
174
|
);
|
|
231
175
|
}
|