@designbasekorea/figma-ui 0.6.9 → 0.6.10
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 +14 -2
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +41 -5
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.css.map +1 -1
- package/dist/index.esm.js +672 -269
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +812 -402
- package/dist/index.js.map +1 -1
- package/package.json +9 -6
package/dist/index.js
CHANGED
|
@@ -3,9 +3,426 @@
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var react = require('@designbasekorea/ui-wc/react');
|
|
5
5
|
var icons = require('@designbasekorea/icons');
|
|
6
|
+
var figmaLicenseCore = require('@designbasekorea/figma-license-core');
|
|
6
7
|
|
|
7
8
|
function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
|
|
8
9
|
|
|
10
|
+
const FIGMA_UI_TRANSLATIONS = {
|
|
11
|
+
ko: {
|
|
12
|
+
close: '닫기',
|
|
13
|
+
back: '뒤로가기',
|
|
14
|
+
officialWebsite: '공식 웹사이트',
|
|
15
|
+
youtube: '유튜브',
|
|
16
|
+
instagram: '인스타그램',
|
|
17
|
+
figmaCommunity: '피그마 커뮤니티',
|
|
18
|
+
contact: '문의하기',
|
|
19
|
+
languageSettings: '언어 설정',
|
|
20
|
+
languageSettingsDescription: '플러그인에 표시할 언어를 선택하세요.',
|
|
21
|
+
'language.korean': '한국어',
|
|
22
|
+
'language.english': 'English',
|
|
23
|
+
'language.japanese': '日本語',
|
|
24
|
+
unlimitedUsage: '무제한 사용',
|
|
25
|
+
proUser: '프로',
|
|
26
|
+
usingFree: '무료 사용',
|
|
27
|
+
free: '무료',
|
|
28
|
+
trialPlan: '체험판',
|
|
29
|
+
planSuffix: '플랜',
|
|
30
|
+
usageDetails: '사용량 상세',
|
|
31
|
+
dailyUsage: '오늘 사용량',
|
|
32
|
+
usedToday: '오늘 사용',
|
|
33
|
+
remainingToday: '오늘 남은 사용량',
|
|
34
|
+
remainingUsage: '오늘 남은 사용량',
|
|
35
|
+
managePlan: '플랜 관리',
|
|
36
|
+
upgradePlan: '플랜 업그레이드',
|
|
37
|
+
remainingShort: '남음',
|
|
38
|
+
usageCountCaption: '오늘 사용',
|
|
39
|
+
remainingCopy: '{{count}}회 남음 · 매일 리셋',
|
|
40
|
+
usageUnavailable: '사용량 제한이 없습니다',
|
|
41
|
+
unlimitedUsageTooltip: '모든 기능을 제한 없이 사용할 수 있습니다',
|
|
42
|
+
betaUsageDescription: '베타 기간에는 사용량 제한이 적용되지 않습니다',
|
|
43
|
+
perDay: '일',
|
|
44
|
+
resetsDaily: '매일 리셋',
|
|
45
|
+
donationPrompt: '이 플러그인이 유용했나요?',
|
|
46
|
+
betaStatus: 'BETA',
|
|
47
|
+
'donation.buy_me_a_coffee': '커피 한 잔 사기',
|
|
48
|
+
'donation.prompt': '도움이 되었다면 커피 한 잔 사주세요!',
|
|
49
|
+
'form.license_key': '라이선스 키',
|
|
50
|
+
'form.license_placeholder': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
|
|
51
|
+
'form.submit': '제출',
|
|
52
|
+
'form.verifying': '확인 중...',
|
|
53
|
+
'license.youtube_membership': 'YouTube 멤버십',
|
|
54
|
+
'license.pro_account': '프로 계정',
|
|
55
|
+
'license.upgrade_to_pro': '프로로 업그레이드',
|
|
56
|
+
'license.all_features_available': '모든 기능을 사용할 수 있습니다.',
|
|
57
|
+
'license.youtube_membership_description': 'YouTube 멤버십에 가입하면 Designbase 플러그인을 무제한으로 사용할 수 있습니다.',
|
|
58
|
+
'license.purchase_for_unlimited': '디자인베이스 멤버십 또는 라이선스로 무제한 이용이 가능합니다.',
|
|
59
|
+
'license.usage_unlimited': '사용 횟수 제한 없음',
|
|
60
|
+
'license.usage_daily': '오늘 남은 횟수 {{remaining}}/{{limit}}',
|
|
61
|
+
'license.usage_weekly': '이번 주 남은 횟수 {{remaining}}/{{limit}}',
|
|
62
|
+
'license.usage_monthly': '이번 달 남은 횟수 {{remaining}}/{{limit}}',
|
|
63
|
+
'license.usage_generic': '남은 횟수 {{remaining}}/{{limit}}',
|
|
64
|
+
'license.activated': '라이선스 활성화됨',
|
|
65
|
+
'license.activations_remaining': '활성',
|
|
66
|
+
'license.spots_remaining': '자리 남음',
|
|
67
|
+
'license.deactivating': '비활성화 중...',
|
|
68
|
+
'license.deactivate': '라이선스 비활성화',
|
|
69
|
+
'license.designbase_account': '디자인베이스 계정',
|
|
70
|
+
'license.designbase_account_hint': 'WordPress 계정으로 로그인하거나 멤버십을 구매하면 플러그인이 자동으로 활성화됩니다.',
|
|
71
|
+
'license.authenticating': '인증 중...',
|
|
72
|
+
'license.login_with_designbase': '디자인베이스로 로그인',
|
|
73
|
+
'license.purchase_membership': '멤버십 안내',
|
|
74
|
+
'license.manage_account': '계정·멤버십 관리',
|
|
75
|
+
'license.enter_key': '라이선스 키 입력',
|
|
76
|
+
'license.key': '라이선스 키',
|
|
77
|
+
'license.submit': '활성화',
|
|
78
|
+
'license.verifying': '확인 중...',
|
|
79
|
+
'license.enter_from_email': '이메일로 받은 라이선스 키를 입력하세요.',
|
|
80
|
+
'license.enter_from_youtube': '멤버 전용 커뮤니티에서 받은 키를 입력하세요.',
|
|
81
|
+
'license.help_link': '라이선스·결제 도움말',
|
|
82
|
+
'license.youtube_membership_howto': '이용 방법',
|
|
83
|
+
'license.youtube_membership_step_1': 'Designbase YouTube 채널 멤버십에 가입합니다.',
|
|
84
|
+
'license.youtube_membership_step_2': '멤버 전용 커뮤니티에서 이번 달 키를 복사합니다.',
|
|
85
|
+
'license.youtube_membership_step_3': '아래 입력창에 키를 붙여 넣고 활성화합니다.',
|
|
86
|
+
'license.youtube_membership_join': '멤버십 가입',
|
|
87
|
+
'license.youtube_membership_guide': '안내보기',
|
|
88
|
+
'license.all_plugins': '모든 플러그인',
|
|
89
|
+
'license.source_youtube_membership': 'YouTube 멤버십',
|
|
90
|
+
'license.source_purchase': '구매 라이선스',
|
|
91
|
+
'license.status_active': '활성',
|
|
92
|
+
'license.status_inactive': '라이선스 확인 실패',
|
|
93
|
+
'license.status_label': '라이선스 상태',
|
|
94
|
+
'license.key_label': '라이선스 키',
|
|
95
|
+
'license.hide_key': '숨기기',
|
|
96
|
+
'license.reveal_key': '보기',
|
|
97
|
+
'license.source': '출처',
|
|
98
|
+
'license.access': '접근 범위',
|
|
99
|
+
'license.expires': '만료일',
|
|
100
|
+
'license.last_checked': '최근 확인',
|
|
101
|
+
'payment.license_key_label': '라이선스 키',
|
|
102
|
+
'payment.activations_remaining': '활성',
|
|
103
|
+
'payment.spots_remaining': '자리 남음',
|
|
104
|
+
'payment.deactivating': '비활성화 중...',
|
|
105
|
+
'payment.deactivate_license': '라이선스 비활성화',
|
|
106
|
+
lifetimeAccess: '평생 이용',
|
|
107
|
+
perYear: '년',
|
|
108
|
+
perMonth: '월',
|
|
109
|
+
monthlyBilling: '월간 결제',
|
|
110
|
+
yearlyBilling: '연간 결제',
|
|
111
|
+
oneTimePaymentLifetime: '평생 이용을 위한 일회성 결제입니다.',
|
|
112
|
+
feature: '기능',
|
|
113
|
+
freePrice: '$0',
|
|
114
|
+
pro: '프로',
|
|
115
|
+
recommended: '추천',
|
|
116
|
+
'pricing.usage_limit': '사용 제한',
|
|
117
|
+
'pricing.daily_limit': '일일 제한',
|
|
118
|
+
'pricing.unlimited': '무제한',
|
|
119
|
+
'pricing.all_topics': '모든 주제 사용',
|
|
120
|
+
'pricing.max_selection': '최대 선택 제한',
|
|
121
|
+
'pricing.max_selection_free': '최대 5개',
|
|
122
|
+
'pricing.max_selection_pro': '최대 30개',
|
|
123
|
+
'pricing.dummy_count': '더미 개수',
|
|
124
|
+
'pricing.dummy_count_free': '1,400개',
|
|
125
|
+
'pricing.dummy_count_pro': '4,400개 이상',
|
|
126
|
+
'pricing.custom_number': '커스텀 숫자 사용',
|
|
127
|
+
'pricing.discount_suffix': '절약',
|
|
128
|
+
'settings.modal_title': '목록 변경',
|
|
129
|
+
'settings.modal_description': '드래그하여 순서를 변경하거나, 토글하여 카테고리를 숨길 수 있습니다.',
|
|
130
|
+
'settings.reset': '초기화',
|
|
131
|
+
'settings.cancel': '취소',
|
|
132
|
+
'settings.save': '저장',
|
|
133
|
+
'progress.working': '작업 중',
|
|
134
|
+
'progress.processing': '처리 중...',
|
|
135
|
+
'progress.completed': '완료되었습니다',
|
|
136
|
+
'progress.stop': '중지',
|
|
137
|
+
'progress.confirm': '확인',
|
|
138
|
+
'banner.upgrade_title': '프로로 업그레이드하세요',
|
|
139
|
+
'banner.upgrade_description': '무제한 기능을 사용하고 더 많은 혜택을 누리세요.',
|
|
140
|
+
'banner.upgrade_button': '지금 업그레이드',
|
|
141
|
+
loading: '불러오는 중',
|
|
142
|
+
},
|
|
143
|
+
en: {
|
|
144
|
+
close: 'Close',
|
|
145
|
+
back: 'Back',
|
|
146
|
+
officialWebsite: 'Official website',
|
|
147
|
+
youtube: 'YouTube',
|
|
148
|
+
instagram: 'Instagram',
|
|
149
|
+
figmaCommunity: 'Figma Community',
|
|
150
|
+
contact: 'Contact',
|
|
151
|
+
languageSettings: 'Language settings',
|
|
152
|
+
languageSettingsDescription: 'Choose the language to display in the plugin.',
|
|
153
|
+
'language.korean': 'Korean',
|
|
154
|
+
'language.english': 'English',
|
|
155
|
+
'language.japanese': 'Japanese',
|
|
156
|
+
unlimitedUsage: 'Unlimited use',
|
|
157
|
+
proUser: 'Pro',
|
|
158
|
+
usingFree: 'Free use',
|
|
159
|
+
free: 'Free',
|
|
160
|
+
trialPlan: 'Trial',
|
|
161
|
+
planSuffix: 'plan',
|
|
162
|
+
usageDetails: 'Usage details',
|
|
163
|
+
dailyUsage: "Today's usage",
|
|
164
|
+
usedToday: 'Used today',
|
|
165
|
+
remainingToday: 'Remaining today',
|
|
166
|
+
remainingUsage: 'Remaining today',
|
|
167
|
+
managePlan: 'Manage plan',
|
|
168
|
+
upgradePlan: 'Upgrade plan',
|
|
169
|
+
remainingShort: 'left',
|
|
170
|
+
usageCountCaption: 'Used today',
|
|
171
|
+
remainingCopy: '{{count}} remaining · resets daily',
|
|
172
|
+
usageUnavailable: 'No usage limit',
|
|
173
|
+
unlimitedUsageTooltip: 'Use every feature without limits',
|
|
174
|
+
betaUsageDescription: 'Usage limits are not applied during the beta period',
|
|
175
|
+
perDay: 'day',
|
|
176
|
+
resetsDaily: 'Resets daily',
|
|
177
|
+
donationPrompt: 'Is this plugin useful?',
|
|
178
|
+
betaStatus: 'BETA',
|
|
179
|
+
'donation.buy_me_a_coffee': 'Buy me a coffee',
|
|
180
|
+
'donation.prompt': 'If this helped, buy me a coffee!',
|
|
181
|
+
'form.license_key': 'License key',
|
|
182
|
+
'form.license_placeholder': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
|
|
183
|
+
'form.submit': 'Activate',
|
|
184
|
+
'form.verifying': 'Verifying...',
|
|
185
|
+
'license.youtube_membership': 'YouTube Membership',
|
|
186
|
+
'license.pro_account': 'Pro account',
|
|
187
|
+
'license.upgrade_to_pro': 'Upgrade to Pro',
|
|
188
|
+
'license.all_features_available': 'All features are available.',
|
|
189
|
+
'license.youtube_membership_description': 'Join YouTube Membership to use Designbase plugins without limits.',
|
|
190
|
+
'license.purchase_for_unlimited': 'Get unlimited access with a Designbase membership or license.',
|
|
191
|
+
'license.usage_unlimited': 'Unlimited usage',
|
|
192
|
+
'license.usage_daily': '{{remaining}}/{{limit}} remaining today',
|
|
193
|
+
'license.usage_weekly': '{{remaining}}/{{limit}} remaining this week',
|
|
194
|
+
'license.usage_monthly': '{{remaining}}/{{limit}} remaining this month',
|
|
195
|
+
'license.usage_generic': '{{remaining}}/{{limit}} remaining',
|
|
196
|
+
'license.activated': 'License activated',
|
|
197
|
+
'license.activations_remaining': 'activations',
|
|
198
|
+
'license.spots_remaining': 'spots remaining',
|
|
199
|
+
'license.deactivating': 'Deactivating...',
|
|
200
|
+
'license.deactivate': 'Deactivate license',
|
|
201
|
+
'license.designbase_account': 'Designbase account',
|
|
202
|
+
'license.designbase_account_hint': 'Sign in with your WordPress account or purchase a membership to activate the plugin automatically.',
|
|
203
|
+
'license.authenticating': 'Authenticating...',
|
|
204
|
+
'license.login_with_designbase': 'Sign in with Designbase',
|
|
205
|
+
'license.purchase_membership': 'Membership details',
|
|
206
|
+
'license.manage_account': 'Manage account · membership',
|
|
207
|
+
'license.enter_key': 'Enter license key',
|
|
208
|
+
'license.key': 'License key',
|
|
209
|
+
'license.submit': 'Activate',
|
|
210
|
+
'license.verifying': 'Verifying...',
|
|
211
|
+
'license.enter_from_email': 'Enter the license key you received by email.',
|
|
212
|
+
'license.enter_from_youtube': 'Enter the key from the members-only community.',
|
|
213
|
+
'license.help_link': 'License · payment help',
|
|
214
|
+
'license.youtube_membership_howto': 'How to use',
|
|
215
|
+
'license.youtube_membership_step_1': 'Join the Designbase YouTube channel membership.',
|
|
216
|
+
'license.youtube_membership_step_2': 'Copy this month’s key from the members-only community.',
|
|
217
|
+
'license.youtube_membership_step_3': 'Paste the key below and activate it.',
|
|
218
|
+
'license.youtube_membership_join': 'Join membership',
|
|
219
|
+
'license.youtube_membership_guide': 'View guide',
|
|
220
|
+
'license.all_plugins': 'All plugins',
|
|
221
|
+
'license.source_youtube_membership': 'YouTube Membership',
|
|
222
|
+
'license.source_purchase': 'Purchased license',
|
|
223
|
+
'license.status_active': 'Active',
|
|
224
|
+
'license.status_inactive': 'License check failed',
|
|
225
|
+
'license.status_label': 'License status',
|
|
226
|
+
'license.key_label': 'License key',
|
|
227
|
+
'license.hide_key': 'Hide',
|
|
228
|
+
'license.reveal_key': 'Show',
|
|
229
|
+
'license.source': 'Source',
|
|
230
|
+
'license.access': 'Access',
|
|
231
|
+
'license.expires': 'Expires',
|
|
232
|
+
'license.last_checked': 'Last checked',
|
|
233
|
+
'payment.license_key_label': 'License key',
|
|
234
|
+
'payment.activations_remaining': 'activations',
|
|
235
|
+
'payment.spots_remaining': 'spots remaining',
|
|
236
|
+
'payment.deactivating': 'Deactivating...',
|
|
237
|
+
'payment.deactivate_license': 'Deactivate license',
|
|
238
|
+
lifetimeAccess: 'Lifetime access',
|
|
239
|
+
perYear: 'year',
|
|
240
|
+
perMonth: 'month',
|
|
241
|
+
monthlyBilling: 'Monthly billing',
|
|
242
|
+
yearlyBilling: 'Yearly billing',
|
|
243
|
+
oneTimePaymentLifetime: 'One-time payment for lifetime access.',
|
|
244
|
+
feature: 'Feature',
|
|
245
|
+
freePrice: '$0',
|
|
246
|
+
pro: 'Pro',
|
|
247
|
+
recommended: 'Recommended',
|
|
248
|
+
'pricing.usage_limit': 'Usage limit',
|
|
249
|
+
'pricing.daily_limit': 'Daily limit',
|
|
250
|
+
'pricing.unlimited': 'Unlimited',
|
|
251
|
+
'pricing.all_topics': 'All topics',
|
|
252
|
+
'pricing.max_selection': 'Selection limit',
|
|
253
|
+
'pricing.max_selection_free': 'Up to 5',
|
|
254
|
+
'pricing.max_selection_pro': 'Up to 30',
|
|
255
|
+
'pricing.dummy_count': 'Dummy count',
|
|
256
|
+
'pricing.dummy_count_free': '1,400',
|
|
257
|
+
'pricing.dummy_count_pro': '4,400+',
|
|
258
|
+
'pricing.custom_number': 'Custom numbers',
|
|
259
|
+
'pricing.discount_suffix': 'saved',
|
|
260
|
+
'settings.modal_title': 'Change list',
|
|
261
|
+
'settings.modal_description': 'Drag to reorder or toggle a category to hide it.',
|
|
262
|
+
'settings.reset': 'Reset',
|
|
263
|
+
'settings.cancel': 'Cancel',
|
|
264
|
+
'settings.save': 'Save',
|
|
265
|
+
'progress.working': 'Working',
|
|
266
|
+
'progress.processing': 'Processing...',
|
|
267
|
+
'progress.completed': 'Completed',
|
|
268
|
+
'progress.stop': 'Stop',
|
|
269
|
+
'progress.confirm': 'Done',
|
|
270
|
+
'banner.upgrade_title': 'Upgrade to Pro',
|
|
271
|
+
'banner.upgrade_description': 'Unlock unlimited features and more benefits.',
|
|
272
|
+
'banner.upgrade_button': 'Upgrade now',
|
|
273
|
+
loading: 'Loading',
|
|
274
|
+
},
|
|
275
|
+
ja: {
|
|
276
|
+
close: '閉じる',
|
|
277
|
+
back: '戻る',
|
|
278
|
+
officialWebsite: '公式ウェブサイト',
|
|
279
|
+
youtube: 'YouTube',
|
|
280
|
+
instagram: 'Instagram',
|
|
281
|
+
figmaCommunity: 'Figmaコミュニティ',
|
|
282
|
+
contact: 'お問い合わせ',
|
|
283
|
+
languageSettings: '言語設定',
|
|
284
|
+
languageSettingsDescription: 'プラグインに表示する言語を選択してください。',
|
|
285
|
+
'language.korean': '韓国語',
|
|
286
|
+
'language.english': '英語',
|
|
287
|
+
'language.japanese': '日本語',
|
|
288
|
+
unlimitedUsage: '無制限で使用',
|
|
289
|
+
proUser: 'Pro',
|
|
290
|
+
usingFree: '無料で使用中',
|
|
291
|
+
free: '無料',
|
|
292
|
+
trialPlan: 'トライアル',
|
|
293
|
+
planSuffix: 'プラン',
|
|
294
|
+
usageDetails: '使用量の詳細',
|
|
295
|
+
dailyUsage: '今日の使用量',
|
|
296
|
+
usedToday: '今日の使用',
|
|
297
|
+
remainingToday: '今日の残り使用量',
|
|
298
|
+
remainingUsage: '今日の残り使用量',
|
|
299
|
+
managePlan: 'プランを管理',
|
|
300
|
+
upgradePlan: 'プランをアップグレード',
|
|
301
|
+
remainingShort: '残り',
|
|
302
|
+
usageCountCaption: '今日の使用',
|
|
303
|
+
remainingCopy: '{{count}}回残り · 毎日リセット',
|
|
304
|
+
usageUnavailable: '使用制限はありません',
|
|
305
|
+
unlimitedUsageTooltip: 'すべての機能を無制限で使用できます',
|
|
306
|
+
betaUsageDescription: 'ベータ期間中は使用制限がありません',
|
|
307
|
+
perDay: '日',
|
|
308
|
+
resetsDaily: '毎日リセット',
|
|
309
|
+
donationPrompt: 'このプラグインは役に立ちましたか?',
|
|
310
|
+
betaStatus: 'BETA',
|
|
311
|
+
'donation.buy_me_a_coffee': 'コーヒーを一杯おごる',
|
|
312
|
+
'donation.prompt': '役に立ったらコーヒーを一杯おごってください!',
|
|
313
|
+
'form.license_key': 'ライセンスキー',
|
|
314
|
+
'form.license_placeholder': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
|
|
315
|
+
'form.submit': '有効化',
|
|
316
|
+
'form.verifying': '確認中...',
|
|
317
|
+
'license.youtube_membership': 'YouTubeメンバーシップ',
|
|
318
|
+
'license.pro_account': 'Proアカウント',
|
|
319
|
+
'license.upgrade_to_pro': 'Proにアップグレード',
|
|
320
|
+
'license.all_features_available': 'すべての機能を使用できます。',
|
|
321
|
+
'license.youtube_membership_description': 'YouTubeメンバーシップに参加すると、Designbaseプラグインを無制限で使用できます。',
|
|
322
|
+
'license.purchase_for_unlimited': 'Designbaseのメンバーシップまたはライセンスで無制限に利用できます。',
|
|
323
|
+
'license.usage_unlimited': '使用回数の制限なし',
|
|
324
|
+
'license.usage_daily': '今日の残り {{remaining}}/{{limit}}回',
|
|
325
|
+
'license.usage_weekly': '今週の残り {{remaining}}/{{limit}}回',
|
|
326
|
+
'license.usage_monthly': '今月の残り {{remaining}}/{{limit}}回',
|
|
327
|
+
'license.usage_generic': '残り {{remaining}}/{{limit}}回',
|
|
328
|
+
'license.activated': 'ライセンス有効化済み',
|
|
329
|
+
'license.activations_remaining': '有効化',
|
|
330
|
+
'license.spots_remaining': '枠残り',
|
|
331
|
+
'license.deactivating': '無効化中...',
|
|
332
|
+
'license.deactivate': 'ライセンスを無効化',
|
|
333
|
+
'license.designbase_account': 'Designbaseアカウント',
|
|
334
|
+
'license.designbase_account_hint': 'WordPressアカウントでサインインするか、メンバーシップを購入するとプラグインが自動的に有効化されます。',
|
|
335
|
+
'license.authenticating': '認証中...',
|
|
336
|
+
'license.login_with_designbase': 'Designbaseでサインイン',
|
|
337
|
+
'license.purchase_membership': 'メンバーシップの詳細',
|
|
338
|
+
'license.manage_account': 'アカウント・メンバーシップを管理',
|
|
339
|
+
'license.enter_key': 'ライセンスキーを入力',
|
|
340
|
+
'license.key': 'ライセンスキー',
|
|
341
|
+
'license.submit': '有効化',
|
|
342
|
+
'license.verifying': '確認中...',
|
|
343
|
+
'license.enter_from_email': 'メールで受け取ったライセンスキーを入力してください。',
|
|
344
|
+
'license.enter_from_youtube': 'メンバー限定コミュニティのキーを入力してください。',
|
|
345
|
+
'license.help_link': 'ライセンス・支払いヘルプ',
|
|
346
|
+
'license.youtube_membership_howto': '利用方法',
|
|
347
|
+
'license.youtube_membership_step_1': 'Designbase YouTubeチャンネルのメンバーシップに参加します。',
|
|
348
|
+
'license.youtube_membership_step_2': 'メンバー限定コミュニティから今月のキーをコピーします。',
|
|
349
|
+
'license.youtube_membership_step_3': '下の入力欄にキーを貼り付けて有効化します。',
|
|
350
|
+
'license.youtube_membership_join': 'メンバーシップに参加',
|
|
351
|
+
'license.youtube_membership_guide': 'ガイドを見る',
|
|
352
|
+
'license.all_plugins': 'すべてのプラグイン',
|
|
353
|
+
'license.source_youtube_membership': 'YouTubeメンバーシップ',
|
|
354
|
+
'license.source_purchase': '購入ライセンス',
|
|
355
|
+
'license.status_active': '有効',
|
|
356
|
+
'license.status_inactive': 'ライセンス確認に失敗しました',
|
|
357
|
+
'license.status_label': 'ライセンス状態',
|
|
358
|
+
'license.key_label': 'ライセンスキー',
|
|
359
|
+
'license.hide_key': '隠す',
|
|
360
|
+
'license.reveal_key': '表示',
|
|
361
|
+
'license.source': '取得元',
|
|
362
|
+
'license.access': 'アクセス範囲',
|
|
363
|
+
'license.expires': '有効期限',
|
|
364
|
+
'license.last_checked': '最終確認',
|
|
365
|
+
'payment.license_key_label': 'ライセンスキー',
|
|
366
|
+
'payment.activations_remaining': '有効化',
|
|
367
|
+
'payment.spots_remaining': '枠残り',
|
|
368
|
+
'payment.deactivating': '無効化中...',
|
|
369
|
+
'payment.deactivate_license': 'ライセンスを無効化',
|
|
370
|
+
lifetimeAccess: '生涯利用',
|
|
371
|
+
perYear: '年',
|
|
372
|
+
perMonth: '月',
|
|
373
|
+
monthlyBilling: '月払い',
|
|
374
|
+
yearlyBilling: '年払い',
|
|
375
|
+
oneTimePaymentLifetime: '生涯利用のための一括払いです。',
|
|
376
|
+
feature: '機能',
|
|
377
|
+
freePrice: '$0',
|
|
378
|
+
pro: 'Pro',
|
|
379
|
+
recommended: 'おすすめ',
|
|
380
|
+
'pricing.usage_limit': '使用制限',
|
|
381
|
+
'pricing.daily_limit': '1日の制限',
|
|
382
|
+
'pricing.unlimited': '無制限',
|
|
383
|
+
'pricing.all_topics': 'すべてのトピック',
|
|
384
|
+
'pricing.max_selection': '選択上限',
|
|
385
|
+
'pricing.max_selection_free': '最大5個',
|
|
386
|
+
'pricing.max_selection_pro': '最大30個',
|
|
387
|
+
'pricing.dummy_count': 'ダミー数',
|
|
388
|
+
'pricing.dummy_count_free': '1,400個',
|
|
389
|
+
'pricing.dummy_count_pro': '4,400個以上',
|
|
390
|
+
'pricing.custom_number': 'カスタム数値',
|
|
391
|
+
'pricing.discount_suffix': '割引',
|
|
392
|
+
'settings.modal_title': 'リストを変更',
|
|
393
|
+
'settings.modal_description': 'ドラッグして並べ替えるか、トグルでカテゴリを非表示にできます。',
|
|
394
|
+
'settings.reset': 'リセット',
|
|
395
|
+
'settings.cancel': 'キャンセル',
|
|
396
|
+
'settings.save': '保存',
|
|
397
|
+
'progress.working': '処理中',
|
|
398
|
+
'progress.processing': '処理しています...',
|
|
399
|
+
'progress.completed': '完了しました',
|
|
400
|
+
'progress.stop': '停止',
|
|
401
|
+
'progress.confirm': '完了',
|
|
402
|
+
'banner.upgrade_title': 'Proにアップグレード',
|
|
403
|
+
'banner.upgrade_description': '無制限の機能とさらに多くの特典を利用できます。',
|
|
404
|
+
'banner.upgrade_button': '今すぐアップグレード',
|
|
405
|
+
loading: '読み込み中',
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
function normalizeFigmaUiLocale(locale) {
|
|
409
|
+
const normalized = (locale || '').toLowerCase().split(/[-_]/)[0];
|
|
410
|
+
if (normalized === 'en' || normalized === 'ja')
|
|
411
|
+
return normalized;
|
|
412
|
+
return 'ko';
|
|
413
|
+
}
|
|
414
|
+
function createFigmaUiTranslator(locale = 'ko', parentT) {
|
|
415
|
+
const normalizedLocale = normalizeFigmaUiLocale(locale);
|
|
416
|
+
const translations = FIGMA_UI_TRANSLATIONS[normalizedLocale];
|
|
417
|
+
return (key, values) => {
|
|
418
|
+
const parentValue = parentT?.(key, values);
|
|
419
|
+
if (parentValue && parentValue !== key) {
|
|
420
|
+
return interpolateText(parentValue, values);
|
|
421
|
+
}
|
|
422
|
+
const value = translations[key] ?? FIGMA_UI_TRANSLATIONS.ko[key] ?? key;
|
|
423
|
+
return interpolateText(value, values);
|
|
424
|
+
};
|
|
425
|
+
}
|
|
9
426
|
function interpolateText(template, values) {
|
|
10
427
|
if (!values)
|
|
11
428
|
return template;
|
|
@@ -32,11 +449,34 @@ function resolveText(t, input, fallback) {
|
|
|
32
449
|
return input.key;
|
|
33
450
|
}
|
|
34
451
|
|
|
452
|
+
const defaultContextValue = {
|
|
453
|
+
locale: 'ko',
|
|
454
|
+
t: createFigmaUiTranslator('ko'),
|
|
455
|
+
};
|
|
456
|
+
const FigmaUiI18nContext = React.createContext(defaultContextValue);
|
|
457
|
+
const FigmaUiI18nProvider = ({ locale = 'ko', t: parentT, children, }) => {
|
|
458
|
+
const normalizedLocale = normalizeFigmaUiLocale(locale);
|
|
459
|
+
const value = React.useMemo(() => ({
|
|
460
|
+
locale: normalizedLocale,
|
|
461
|
+
parentT,
|
|
462
|
+
t: createFigmaUiTranslator(normalizedLocale, parentT),
|
|
463
|
+
}), [normalizedLocale, parentT]);
|
|
464
|
+
return React.createElement(FigmaUiI18nContext.Provider, { value: value }, children);
|
|
465
|
+
};
|
|
466
|
+
function useFigmaUiI18n(localeOverride, tOverride) {
|
|
467
|
+
const context = React.useContext(FigmaUiI18nContext);
|
|
468
|
+
const locale = normalizeFigmaUiLocale(localeOverride ?? context.locale);
|
|
469
|
+
const parentT = tOverride ?? context.parentT;
|
|
470
|
+
const t = React.useMemo(() => createFigmaUiTranslator(locale, parentT), [locale, parentT]);
|
|
471
|
+
return { locale, parentT, t };
|
|
472
|
+
}
|
|
473
|
+
|
|
35
474
|
const DONATION_ICON_NAMES = {
|
|
36
475
|
heart: 'star-filled',
|
|
37
476
|
coffee: 'cart',
|
|
38
477
|
};
|
|
39
|
-
const DonationBadge = ({ donationUrl = 'https://buymeacoffee.com/designbase', text = { key: 'donation.buy_me_a_coffee' }, iconType = 'heart', size = 's', variant = 'tertiary', fullWidth = false, iconOnly = false, disabled = false, showPrompt = false, promptText = { key: 'donation.prompt' }, className, onClick, t }) => {
|
|
478
|
+
const DonationBadge = ({ donationUrl = 'https://buymeacoffee.com/designbase', text = { key: 'donation.buy_me_a_coffee' }, iconType = 'heart', size = 's', variant = 'tertiary', fullWidth = false, iconOnly = false, disabled = false, showPrompt = false, promptText = { key: 'donation.prompt' }, className, onClick, t, locale, }) => {
|
|
479
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
40
480
|
const handleClick = () => {
|
|
41
481
|
if (onClick) {
|
|
42
482
|
onClick();
|
|
@@ -45,8 +485,8 @@ const DonationBadge = ({ donationUrl = 'https://buymeacoffee.com/designbase', te
|
|
|
45
485
|
window.open(donationUrl, '_blank', 'noopener,noreferrer');
|
|
46
486
|
}
|
|
47
487
|
};
|
|
48
|
-
const displayText = resolveText(
|
|
49
|
-
const displayPromptText = resolveText(
|
|
488
|
+
const displayText = resolveText(translate, text, 'Buy me a coffee');
|
|
489
|
+
const displayPromptText = resolveText(translate, promptText, '도움이 되었다면 커피 한 잔 사주세요!');
|
|
50
490
|
const buttonSize = size;
|
|
51
491
|
return (React.createElement("div", { className: clsx('designbase-figma-donation-badge-container', className) },
|
|
52
492
|
showPrompt && !iconOnly && (React.createElement("div", { className: "designbase-figma-donation-badge__prompt" }, displayPromptText)),
|
|
@@ -97,13 +537,14 @@ const FigmaHeader = ({ children, actions = [], searchBar, sticky = true, classNa
|
|
|
97
537
|
};
|
|
98
538
|
FigmaHeader.displayName = 'FigmaHeader';
|
|
99
539
|
|
|
100
|
-
const FigmaPageHead = ({ onBack, title, description, actions = [], moreActions = [], className, t }) => {
|
|
540
|
+
const FigmaPageHead = ({ onBack, title, description, actions = [], moreActions = [], className, t, locale, }) => {
|
|
541
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
101
542
|
const classes = clsx('designbase-figma-page-head', className);
|
|
102
|
-
const displayTitle = resolveText(
|
|
103
|
-
const displayDescription = description ? resolveText(
|
|
543
|
+
const displayTitle = resolveText(translate, title);
|
|
544
|
+
const displayDescription = description ? resolveText(translate, description) : undefined;
|
|
104
545
|
const dropdownItems = moreActions.map((action) => ({
|
|
105
546
|
id: action.id,
|
|
106
|
-
label: resolveText(
|
|
547
|
+
label: resolveText(translate, action.label),
|
|
107
548
|
}));
|
|
108
549
|
const handleDropdownChange = (event) => {
|
|
109
550
|
const actionId = event.detail?.id ?? event.detail?.value;
|
|
@@ -112,7 +553,7 @@ const FigmaPageHead = ({ onBack, title, description, actions = [], moreActions =
|
|
|
112
553
|
};
|
|
113
554
|
return (React.createElement("div", { className: classes },
|
|
114
555
|
React.createElement("div", { className: "designbase-figma-page-head__left" },
|
|
115
|
-
React.createElement(react.Button, { variant: "tertiary", size: "s", iconOnly: true, startIcon: "chevron-left", onPress: onBack, "aria-label":
|
|
556
|
+
React.createElement(react.Button, { variant: "tertiary", size: "s", iconOnly: true, startIcon: "chevron-left", onPress: onBack, "aria-label": translate('back') }),
|
|
116
557
|
React.createElement("div", { className: "designbase-figma-page-head__titles" },
|
|
117
558
|
React.createElement("h2", null, displayTitle),
|
|
118
559
|
displayDescription && React.createElement("p", null, displayDescription))),
|
|
@@ -122,7 +563,8 @@ const FigmaPageHead = ({ onBack, title, description, actions = [], moreActions =
|
|
|
122
563
|
};
|
|
123
564
|
FigmaPageHead.displayName = 'FigmaPageHead';
|
|
124
565
|
|
|
125
|
-
const FigmaSection = ({ title, dataCategory, iconButton, children, marginBottom, isEnabled = true, onToggle, className, enableScrollNavigation = false, headerHeight = 94, onActiveSectionChange, t, collapsible = false, defaultCollapsed = false, onCollapseChange, badge, overflowVisible = false, }) => {
|
|
566
|
+
const FigmaSection = ({ title, dataCategory, iconButton, children, marginBottom, isEnabled = true, onToggle, className, enableScrollNavigation = false, headerHeight = 94, onActiveSectionChange, t, locale, collapsible = false, defaultCollapsed = false, onCollapseChange, badge, overflowVisible = false, }) => {
|
|
567
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
126
568
|
const sectionRef = React.useRef(null);
|
|
127
569
|
const clipRef = React.useRef(null);
|
|
128
570
|
const innerRef = React.useRef(null);
|
|
@@ -242,7 +684,7 @@ const FigmaSection = ({ title, dataCategory, iconButton, children, marginBottom,
|
|
|
242
684
|
React.createElement("div", { className: "designbase-figma-section__title-area" },
|
|
243
685
|
React.createElement("h2", { className: "designbase-figma-section__title" },
|
|
244
686
|
typeof title === 'string' || (typeof title === 'object' && 'key' in title)
|
|
245
|
-
? resolveText(
|
|
687
|
+
? resolveText(translate, title)
|
|
246
688
|
: title,
|
|
247
689
|
badge && (React.createElement(react.Badge, { variant: "secondary", size: "s" }, badge)))),
|
|
248
690
|
React.createElement("div", { className: "designbase-figma-section__controls", onClick: (e) => e.stopPropagation() },
|
|
@@ -395,54 +837,30 @@ const FigmaSidebar = ({ categories, categoryGroups = {}, categoryLabels = {}, ac
|
|
|
395
837
|
};
|
|
396
838
|
FigmaSidebar.displayName = 'FigmaSidebar';
|
|
397
839
|
|
|
398
|
-
let useTranslation$2 = null;
|
|
399
|
-
try {
|
|
400
|
-
const reactI18next = require('react-i18next');
|
|
401
|
-
useTranslation$2 = reactI18next.useTranslation;
|
|
402
|
-
}
|
|
403
|
-
catch (e) {
|
|
404
|
-
}
|
|
405
840
|
const DEFAULT_LANGUAGES$1 = [
|
|
406
|
-
{ code: 'ko', label: '
|
|
407
|
-
{ code: 'en', label: '
|
|
408
|
-
{ code: 'ja', label: '
|
|
841
|
+
{ code: 'ko', label: { key: 'language.korean' } },
|
|
842
|
+
{ code: 'en', label: { key: 'language.english' } },
|
|
843
|
+
{ code: 'ja', label: { key: 'language.japanese' } },
|
|
409
844
|
];
|
|
410
|
-
const
|
|
411
|
-
const
|
|
412
|
-
|
|
413
|
-
languageSettingsDescription: '플러그인에 표시할 언어를 선택하세요.',
|
|
414
|
-
'language.korean': '한국어',
|
|
415
|
-
'language.english': 'English',
|
|
416
|
-
'language.japanese': '日本語',
|
|
417
|
-
};
|
|
418
|
-
return translations[key] || key;
|
|
419
|
-
};
|
|
420
|
-
const LanguageSettingsModal = ({ isOpen, onClose, languages = DEFAULT_LANGUAGES$1, currentLanguage, onLanguageChange, title, description, className, t = defaultT$2, }) => {
|
|
421
|
-
const i18n = useTranslation$2 ? useTranslation$2().i18n : null;
|
|
422
|
-
const resolvedCurrentLanguage = currentLanguage || i18n?.language || languages[0]?.code;
|
|
845
|
+
const LanguageSettingsModal = ({ isOpen, onClose, languages = DEFAULT_LANGUAGES$1, currentLanguage, onLanguageChange, title, description, className, t, }) => {
|
|
846
|
+
const { t: translate } = useFigmaUiI18n(currentLanguage, t);
|
|
847
|
+
const resolvedCurrentLanguage = currentLanguage || languages[0]?.code;
|
|
423
848
|
const [pendingLanguage, setPendingLanguage] = React.useState(resolvedCurrentLanguage);
|
|
424
849
|
React.useEffect(() => {
|
|
425
850
|
if (isOpen) {
|
|
426
851
|
setPendingLanguage(resolvedCurrentLanguage);
|
|
427
852
|
}
|
|
428
853
|
}, [isOpen, resolvedCurrentLanguage]);
|
|
429
|
-
const translate = (key, fallback) => {
|
|
430
|
-
const translated = t(key);
|
|
431
|
-
return translated && translated !== key ? translated : fallback;
|
|
432
|
-
};
|
|
433
854
|
const handleSelect = React.useCallback((languageCode) => {
|
|
434
855
|
setPendingLanguage(languageCode);
|
|
435
|
-
if (i18n) {
|
|
436
|
-
i18n.changeLanguage(languageCode);
|
|
437
|
-
}
|
|
438
856
|
onLanguageChange?.(languageCode);
|
|
439
857
|
onClose();
|
|
440
|
-
}, [
|
|
441
|
-
return (React.createElement(react.Modal, { isOpen: isOpen, onClose: onClose, title: title || translate('languageSettings'
|
|
858
|
+
}, [onClose, onLanguageChange]);
|
|
859
|
+
return (React.createElement(react.Modal, { isOpen: isOpen, onClose: onClose, title: title || translate('languageSettings'), size: "s", className: clsx('designbase-figma-language-settings-modal', className) },
|
|
442
860
|
React.createElement(react.ModalBody, { className: "designbase-figma-language-settings-modal__content" },
|
|
443
|
-
React.createElement("p", { className: "designbase-figma-language-settings-modal__description" }, description || translate('languageSettingsDescription'
|
|
444
|
-
React.createElement("ul", { className: "designbase-figma-language-settings-modal__list", role: "listbox", "aria-label": translate('languageSettings'
|
|
445
|
-
const label = resolveText(
|
|
861
|
+
React.createElement("p", { className: "designbase-figma-language-settings-modal__description" }, description || translate('languageSettingsDescription')),
|
|
862
|
+
React.createElement("ul", { className: "designbase-figma-language-settings-modal__list", role: "listbox", "aria-label": translate('languageSettings') }, languages.map((language) => {
|
|
863
|
+
const label = resolveText(translate, language.label, language.code.toUpperCase());
|
|
446
864
|
const isActive = language.code === pendingLanguage;
|
|
447
865
|
return (React.createElement("li", { key: language.code, role: "presentation" },
|
|
448
866
|
React.createElement(react.Button, { type: "button", variant: "tertiary", size: "m", fullWidth: true, className: clsx('designbase-figma-language-settings-modal__option', { 'designbase-figma-language-settings-modal__option--active': isActive }), role: "option", "aria-selected": isActive, onPress: () => handleSelect(language.code) },
|
|
@@ -452,13 +870,6 @@ const LanguageSettingsModal = ({ isOpen, onClose, languages = DEFAULT_LANGUAGES$
|
|
|
452
870
|
};
|
|
453
871
|
LanguageSettingsModal.displayName = 'LanguageSettingsModal';
|
|
454
872
|
|
|
455
|
-
let useTranslation$1 = null;
|
|
456
|
-
try {
|
|
457
|
-
const reactI18next = require('react-i18next');
|
|
458
|
-
useTranslation$1 = reactI18next.useTranslation;
|
|
459
|
-
}
|
|
460
|
-
catch (e) {
|
|
461
|
-
}
|
|
462
873
|
const defaultLinks = [
|
|
463
874
|
{
|
|
464
875
|
name: 'officialWebsite',
|
|
@@ -486,33 +897,20 @@ const defaultLinks = [
|
|
|
486
897
|
icon: React.createElement(icons.MailIcon, { size: 20 }),
|
|
487
898
|
},
|
|
488
899
|
];
|
|
489
|
-
const defaultTranslations$1 = {
|
|
490
|
-
officialWebsite: '공식 웹사이트',
|
|
491
|
-
youtube: '유튜브',
|
|
492
|
-
instagram: '인스타그램',
|
|
493
|
-
figmaCommunity: '피그마 커뮤니티',
|
|
494
|
-
contact: '문의하기',
|
|
495
|
-
languageSettings: '언어 설정',
|
|
496
|
-
};
|
|
497
|
-
const defaultT$1 = (key) => defaultTranslations$1[key] || key;
|
|
498
900
|
const defaultLanguages = [
|
|
499
|
-
{ code: 'ko', label: '
|
|
500
|
-
{ code: 'en', label: '
|
|
501
|
-
{ code: 'ja', label: '
|
|
901
|
+
{ code: 'ko', label: { key: 'language.korean' } },
|
|
902
|
+
{ code: 'en', label: { key: 'language.english' } },
|
|
903
|
+
{ code: 'ja', label: { key: 'language.japanese' } },
|
|
502
904
|
];
|
|
503
|
-
const LogoDropdown = ({ logoSrc, logoAlt = 'DesignBase', logoType = 'designbase', logoSize = 'xs', links = defaultLinks, position = 'top-left', className, t
|
|
905
|
+
const LogoDropdown = ({ logoSrc, logoAlt = 'DesignBase', logoType = 'designbase', logoSize = 'xs', links = defaultLinks, position = 'top-left', className, t, showLanguageSelector = true, languages = defaultLanguages, currentLanguage, onLanguageChange, }) => {
|
|
504
906
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
505
907
|
const [isLanguageModalOpen, setIsLanguageModalOpen] = React.useState(false);
|
|
506
908
|
const [internalLanguage, setInternalLanguage] = React.useState();
|
|
507
|
-
const
|
|
909
|
+
const { t: translate } = useFigmaUiI18n(currentLanguage ?? internalLanguage, t);
|
|
508
910
|
const rootRef = React.useRef(null);
|
|
509
911
|
const triggerRef = React.useRef(null);
|
|
510
912
|
const menuId = `designbase-figma-logo-menu-${React.useId().replace(/:/g, '')}`;
|
|
511
|
-
const activeLanguage = currentLanguage ?? internalLanguage ??
|
|
512
|
-
const translate = (key, fallback) => {
|
|
513
|
-
const translated = t(key);
|
|
514
|
-
return translated && translated !== key ? translated : fallback;
|
|
515
|
-
};
|
|
913
|
+
const activeLanguage = currentLanguage ?? internalLanguage ?? languages[0]?.code;
|
|
516
914
|
React.useEffect(() => {
|
|
517
915
|
if (!isOpen) {
|
|
518
916
|
return undefined;
|
|
@@ -551,9 +949,6 @@ const LogoDropdown = ({ logoSrc, logoAlt = 'DesignBase', logoType = 'designbase'
|
|
|
551
949
|
if (currentLanguage === undefined) {
|
|
552
950
|
setInternalLanguage(languageCode);
|
|
553
951
|
}
|
|
554
|
-
if (i18n) {
|
|
555
|
-
i18n.changeLanguage(languageCode);
|
|
556
|
-
}
|
|
557
952
|
onLanguageChange?.(languageCode);
|
|
558
953
|
};
|
|
559
954
|
const classes = clsx('designbase-figma-logo-dropdown', `designbase-figma-logo-dropdown--${position}`, {
|
|
@@ -568,14 +963,14 @@ const LogoDropdown = ({ logoSrc, logoAlt = 'DesignBase', logoType = 'designbase'
|
|
|
568
963
|
links.map((link, index) => (React.createElement("li", { key: index, className: "designbase-figma-logo-dropdown__item", role: "none" },
|
|
569
964
|
React.createElement("button", { type: "button", className: "designbase-figma-logo-dropdown__link", role: "menuitem", onClick: () => handleLinkClick(link.url) },
|
|
570
965
|
link.icon && (React.createElement("span", { className: "designbase-figma-logo-dropdown__icon" }, link.icon)),
|
|
571
|
-
React.createElement("span", { className: "designbase-figma-logo-dropdown__text" },
|
|
966
|
+
React.createElement("span", { className: "designbase-figma-logo-dropdown__text" }, translate(link.name)),
|
|
572
967
|
React.createElement(icons.ExternalLinkIcon, { size: 16, className: "designbase-figma-logo-dropdown__arrow" }))))),
|
|
573
968
|
showLanguageSelector && (React.createElement("li", { className: "designbase-figma-logo-dropdown__item designbase-figma-logo-dropdown__language-item", role: "none" },
|
|
574
969
|
React.createElement("button", { type: "button", className: "designbase-figma-logo-dropdown__link", role: "menuitem", onClick: handleLanguageSettingsClick },
|
|
575
970
|
React.createElement("span", { className: "designbase-figma-logo-dropdown__icon" },
|
|
576
971
|
React.createElement(icons.TranslateIcon, { size: 20, "aria-hidden": "true" })),
|
|
577
|
-
React.createElement("span", { className: "designbase-figma-logo-dropdown__text" }, translate('languageSettings'
|
|
578
|
-
showLanguageSelector && (React.createElement(LanguageSettingsModal, { isOpen: isLanguageModalOpen, onClose: () => setIsLanguageModalOpen(false), languages: languages, currentLanguage: activeLanguage, onLanguageChange: handleLanguageChange, t:
|
|
972
|
+
React.createElement("span", { className: "designbase-figma-logo-dropdown__text" }, translate('languageSettings'))))))),
|
|
973
|
+
showLanguageSelector && (React.createElement(LanguageSettingsModal, { isOpen: isLanguageModalOpen, onClose: () => setIsLanguageModalOpen(false), languages: languages, currentLanguage: activeLanguage, onLanguageChange: handleLanguageChange, t: translate }))));
|
|
579
974
|
};
|
|
580
975
|
LogoDropdown.displayName = 'LogoDropdown';
|
|
581
976
|
|
|
@@ -583,7 +978,8 @@ const fallbackText = (t, key, fallback) => {
|
|
|
583
978
|
const translated = t?.(key);
|
|
584
979
|
return translated && translated !== key ? translated : fallback;
|
|
585
980
|
};
|
|
586
|
-
const UsageStatusPopover = ({ paymentStatus, usageCount = 0, maxDailyUsage = 20, showUsage = true, showPlan = true, isLoading = false, onLicensePageClick, t, className, }) => {
|
|
981
|
+
const UsageStatusPopover = ({ paymentStatus, usageCount = 0, maxDailyUsage = 20, showUsage = true, showPlan = true, isLoading = false, onLicensePageClick, t, locale, className, }) => {
|
|
982
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
587
983
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
588
984
|
const rootRef = React.useRef(null);
|
|
589
985
|
const triggerRef = React.useRef(null);
|
|
@@ -597,25 +993,25 @@ const UsageStatusPopover = ({ paymentStatus, usageCount = 0, maxDailyUsage = 20,
|
|
|
597
993
|
const usedPercent = hasDailyLimit ? Math.round((used / limit) * 100) : 0;
|
|
598
994
|
const hasControl = showUsage || showPlan;
|
|
599
995
|
const planLabel = isPaid
|
|
600
|
-
? fallbackText(
|
|
996
|
+
? fallbackText(translate, 'proUser', '프로')
|
|
601
997
|
: isBeta
|
|
602
|
-
? fallbackText(
|
|
998
|
+
? fallbackText(translate, 'betaStatus', 'BETA')
|
|
603
999
|
: paymentStatus === 'TRIAL'
|
|
604
|
-
? fallbackText(
|
|
605
|
-
: fallbackText(
|
|
1000
|
+
? fallbackText(translate, 'trialPlan', '체험판')
|
|
1001
|
+
: fallbackText(translate, 'free', '무료');
|
|
606
1002
|
const planTitle = isBeta
|
|
607
1003
|
? planLabel
|
|
608
|
-
: `${planLabel} ${fallbackText(
|
|
1004
|
+
: `${planLabel} ${fallbackText(translate, 'planSuffix', '플랜')}`;
|
|
609
1005
|
const triggerLabel = isPaid
|
|
610
|
-
? `${planLabel}, ${fallbackText(
|
|
1006
|
+
? `${planLabel}, ${fallbackText(translate, 'unlimitedUsage', '무제한 사용 가능')}`
|
|
611
1007
|
: isBeta
|
|
612
1008
|
? planLabel
|
|
613
1009
|
: hasDailyLimit
|
|
614
|
-
? `${remaining}/${limit} ${fallbackText(
|
|
1010
|
+
? `${remaining}/${limit} ${fallbackText(translate, 'remainingShort', '남음')}`
|
|
615
1011
|
: planLabel;
|
|
616
1012
|
const upgradeLabel = isPaid
|
|
617
|
-
? fallbackText(
|
|
618
|
-
: fallbackText(
|
|
1013
|
+
? fallbackText(translate, 'managePlan', '플랜 관리')
|
|
1014
|
+
: fallbackText(translate, 'upgradePlan', '플랜 업그레이드');
|
|
619
1015
|
React.useEffect(() => {
|
|
620
1016
|
if (!isOpen)
|
|
621
1017
|
return undefined;
|
|
@@ -650,7 +1046,7 @@ const UsageStatusPopover = ({ paymentStatus, usageCount = 0, maxDailyUsage = 20,
|
|
|
650
1046
|
'designbase-figma-usage-status--loading': isLoading,
|
|
651
1047
|
}, className) },
|
|
652
1048
|
React.createElement("div", { className: "designbase-figma-usage-status__control" },
|
|
653
|
-
showUsage && (React.createElement("button", { ref: triggerRef, type: "button", className: "designbase-figma-usage-status__trigger", "aria-expanded": isOpen, "aria-controls": popoverId, "aria-haspopup": "dialog", "aria-label": isLoading ? fallbackText(
|
|
1049
|
+
showUsage && (React.createElement("button", { ref: triggerRef, type: "button", className: "designbase-figma-usage-status__trigger", "aria-expanded": isOpen, "aria-controls": popoverId, "aria-haspopup": "dialog", "aria-label": isLoading ? fallbackText(translate, 'loading', '불러오는 중') : triggerLabel, disabled: isLoading, onClick: togglePopover }, isLoading ? (React.createElement("span", { className: "designbase-figma-usage-status__skeleton", "aria-hidden": "true" })) : isPaid ? (React.createElement("span", { className: "designbase-figma-usage-status__unlimited-mark", "aria-hidden": "true" }, "\u221E")) : hasDailyLimit ? (React.createElement(React.Fragment, null,
|
|
654
1050
|
React.createElement("span", { className: "designbase-figma-usage-status__mini-progress", "aria-hidden": "true" },
|
|
655
1051
|
React.createElement("span", { style: { width: `${usedPercent}%` } })),
|
|
656
1052
|
React.createElement("span", { className: "designbase-figma-usage-status__usage-value" },
|
|
@@ -659,53 +1055,27 @@ const UsageStatusPopover = ({ paymentStatus, usageCount = 0, maxDailyUsage = 20,
|
|
|
659
1055
|
"/",
|
|
660
1056
|
limit)))) : (React.createElement("span", { className: "designbase-figma-usage-status__plan-label" }, planLabel)))),
|
|
661
1057
|
showPlan && !isLoading && (React.createElement("button", { type: "button", className: "designbase-figma-usage-status__plan-badge", "aria-expanded": isOpen, "aria-controls": popoverId, "aria-haspopup": "dialog", "aria-label": planTitle, onClick: togglePopover }, planLabel))),
|
|
662
|
-
isOpen && (React.createElement("div", { id: popoverId, className: "designbase-figma-usage-status__popover", role: "dialog", "aria-label": fallbackText(
|
|
1058
|
+
isOpen && (React.createElement("div", { id: popoverId, className: "designbase-figma-usage-status__popover", role: "dialog", "aria-label": fallbackText(translate, 'usageDetails', '사용량 상세') },
|
|
663
1059
|
React.createElement("div", { className: "designbase-figma-usage-status__popover-header" },
|
|
664
1060
|
React.createElement("span", { className: "designbase-figma-usage-status__plan-title" }, planTitle),
|
|
665
1061
|
!isBeta && (React.createElement(react.Button, { className: "designbase-figma-usage-status__upgrade", variant: isPaid ? 'secondary' : 'primary', size: "s", endIcon: "chevron-right", onPress: handleManageClick }, upgradeLabel))),
|
|
666
1062
|
isPaid ? (React.createElement("div", { className: "designbase-figma-usage-status__unlimited-copy" },
|
|
667
1063
|
React.createElement("span", { className: "designbase-figma-usage-status__unlimited-mark", "aria-hidden": "true" }, "\u221E"),
|
|
668
|
-
React.createElement("span", null, fallbackText(
|
|
1064
|
+
React.createElement("span", null, fallbackText(translate, 'unlimitedUsageTooltip', '모든 기능을 제한 없이 사용할 수 있습니다')))) : isBeta ? (React.createElement("p", { className: "designbase-figma-usage-status__note" }, fallbackText(translate, 'betaUsageDescription', '베타 기간에는 사용량 제한이 적용되지 않습니다'))) : hasDailyLimit ? (React.createElement("div", { className: "designbase-figma-usage-status__usage-detail" },
|
|
669
1065
|
React.createElement("div", { className: "designbase-figma-usage-status__usage-summary" },
|
|
670
1066
|
React.createElement("strong", { className: "designbase-figma-usage-status__usage-count" },
|
|
671
1067
|
used,
|
|
672
1068
|
React.createElement("span", { className: "designbase-figma-usage-status__usage-divider" }, "/"),
|
|
673
1069
|
limit),
|
|
674
|
-
React.createElement("span", { className: "designbase-figma-usage-status__usage-caption" }, fallbackText(
|
|
675
|
-
React.createElement("div", { className: "designbase-figma-usage-status__progress", role: "progressbar", "aria-label": fallbackText(
|
|
1070
|
+
React.createElement("span", { className: "designbase-figma-usage-status__usage-caption" }, fallbackText(translate, 'usageCountCaption', '오늘 사용'))),
|
|
1071
|
+
React.createElement("div", { className: "designbase-figma-usage-status__progress", role: "progressbar", "aria-label": fallbackText(translate, 'usageCountCaption', '오늘 사용'), "aria-valuemin": 0, "aria-valuemax": limit, "aria-valuenow": used, "aria-valuetext": `${used} / ${limit}` },
|
|
676
1072
|
React.createElement("span", { style: { width: `${usedPercent}%` } })),
|
|
677
|
-
React.createElement("p", { className: "designbase-figma-usage-status__remaining-copy" }, resolveText(
|
|
1073
|
+
React.createElement("p", { className: "designbase-figma-usage-status__remaining-copy" }, resolveText(translate, { key: 'remainingCopy', values: { count: remaining } }, `${remaining}회 남음 · 매일 리셋`)))) : (React.createElement("p", { className: "designbase-figma-usage-status__note" }, fallbackText(translate, 'usageUnavailable', '사용량 제한이 없습니다')))))));
|
|
678
1074
|
};
|
|
679
1075
|
UsageStatusPopover.displayName = 'UsageStatusPopover';
|
|
680
1076
|
|
|
681
|
-
const
|
|
682
|
-
|
|
683
|
-
proUser: '프로',
|
|
684
|
-
free: '무료',
|
|
685
|
-
trialPlan: '체험판',
|
|
686
|
-
planSuffix: '플랜',
|
|
687
|
-
usageDetails: '사용량 상세',
|
|
688
|
-
dailyUsage: '오늘 사용량',
|
|
689
|
-
usedToday: '오늘 사용',
|
|
690
|
-
remainingToday: '오늘 남은 사용량',
|
|
691
|
-
remainingUsage: '오늘 남은 사용량',
|
|
692
|
-
managePlan: '플랜 관리',
|
|
693
|
-
upgradePlan: '플랜 업그레이드',
|
|
694
|
-
remainingShort: '남음',
|
|
695
|
-
usageCountCaption: '오늘 사용',
|
|
696
|
-
remainingCopy: '{{count}}회 남음 · 매일 리셋',
|
|
697
|
-
usageUnavailable: '사용량 제한이 없습니다',
|
|
698
|
-
betaUsageDescription: '베타 기간에는 사용량 제한이 적용되지 않습니다',
|
|
699
|
-
perDay: '일',
|
|
700
|
-
resetsDaily: '매일 리셋',
|
|
701
|
-
donationPrompt: '이 플러그인이 유용했나요?',
|
|
702
|
-
betaStatus: 'BETA',
|
|
703
|
-
};
|
|
704
|
-
const defaultT = (key, values) => {
|
|
705
|
-
const template = defaultTranslations[key] || key;
|
|
706
|
-
return interpolateText(template, values);
|
|
707
|
-
};
|
|
708
|
-
const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount = 0, isLoading = false, showPaymentStatus = true, showUsageInfo = true, maxDailyUsage = 20, showPaymentBadge = true, showDonation = true, donationUrl = 'https://buymeacoffee.com/designbase', donationText = 'Buy me a coffee', showDonationText = true, donationPromptText, showLanguageSelector = true, currentLanguage = 'ko', languages, onLanguageChange, logoSrc, logoAlt = 'DesignBase', logoType = 'designbase', logoSize = 'xs', logoLinks, className, t = defaultT, children, }) => {
|
|
1077
|
+
const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount = 0, isLoading = false, showPaymentStatus = true, showUsageInfo = true, maxDailyUsage = 20, showPaymentBadge = true, showDonation = true, donationUrl = 'https://buymeacoffee.com/designbase', donationText = { key: 'donation.buy_me_a_coffee' }, showDonationText = true, donationPromptText, showLanguageSelector = true, currentLanguage = 'ko', languages, onLanguageChange, logoSrc, logoAlt = 'DesignBase', logoType = 'designbase', logoSize = 'xs', logoLinks, className, t, children, }) => {
|
|
1078
|
+
const { t: translate } = useFigmaUiI18n(currentLanguage, t);
|
|
709
1079
|
const resolvedShowUsageInfo = showPaymentStatus && showUsageInfo;
|
|
710
1080
|
const resolvedShowPaymentBadge = showPaymentStatus && showPaymentBadge;
|
|
711
1081
|
const resolvedLicensePageClick = paymentStatus === 'BETA' ? undefined : onLicensePageClick;
|
|
@@ -716,10 +1086,10 @@ const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount =
|
|
|
716
1086
|
return (React.createElement("footer", { className: classes },
|
|
717
1087
|
React.createElement("div", { className: "designbase-figma-footer__wrap" },
|
|
718
1088
|
React.createElement("div", { className: "designbase-figma-footer__left" },
|
|
719
|
-
React.createElement(LogoDropdown, { logoSrc: logoSrc, logoAlt: logoAlt, logoType: logoType, logoSize: logoSize, links: logoLinks, languages: languages, currentLanguage: currentLanguage, showLanguageSelector: showLanguageSelector, onLanguageChange: onLanguageChange, t:
|
|
1089
|
+
React.createElement(LogoDropdown, { logoSrc: logoSrc, logoAlt: logoAlt, logoType: logoType, logoSize: logoSize, links: logoLinks, languages: languages, currentLanguage: currentLanguage, showLanguageSelector: showLanguageSelector, onLanguageChange: onLanguageChange, t: translate })),
|
|
720
1090
|
React.createElement("div", { className: "designbase-figma-footer__right" },
|
|
721
|
-
(resolvedShowUsageInfo || resolvedShowPaymentBadge) && (React.createElement(UsageStatusPopover, { paymentStatus: paymentStatus, usageCount: usageCount, maxDailyUsage: maxDailyUsage, showUsage: resolvedShowUsageInfo, showPlan: resolvedShowPaymentBadge, isLoading: isLoading, onLicensePageClick: resolvedLicensePageClick, t:
|
|
722
|
-
showDonation && (React.createElement(DonationBadge, { donationUrl: donationUrl, text: donationText, iconType: "heart", size: "s", iconOnly: true, showPrompt: false, t:
|
|
1091
|
+
(resolvedShowUsageInfo || resolvedShowPaymentBadge) && (React.createElement(UsageStatusPopover, { paymentStatus: paymentStatus, usageCount: usageCount, maxDailyUsage: maxDailyUsage, showUsage: resolvedShowUsageInfo, showPlan: resolvedShowPaymentBadge, isLoading: isLoading, onLicensePageClick: resolvedLicensePageClick, t: translate })),
|
|
1092
|
+
showDonation && (React.createElement(DonationBadge, { donationUrl: donationUrl, text: donationText, iconType: "heart", size: "s", iconOnly: true, showPrompt: false, t: translate })))),
|
|
723
1093
|
children));
|
|
724
1094
|
};
|
|
725
1095
|
FigmaFooter.displayName = 'FigmaFooter';
|
|
@@ -795,7 +1165,8 @@ const useFigmaToast = () => {
|
|
|
795
1165
|
FigmaToastProvider.displayName = 'FigmaToastProvider';
|
|
796
1166
|
FigmaToast.displayName = 'FigmaToast';
|
|
797
1167
|
|
|
798
|
-
const FormWithSubmit = ({ onLicenseSubmit, disabled = false, isSubmitting = false, value = '', onValueChange, label = { key: 'form.license_key' }, placeholder = { key: 'form.license_placeholder' }, submitText = { key: 'form.submit' }, submittingText = { key: 'form.verifying' }, helperText, className, t }) => {
|
|
1168
|
+
const FormWithSubmit = ({ onLicenseSubmit, disabled = false, isSubmitting = false, value = '', onValueChange, label = { key: 'form.license_key' }, placeholder = { key: 'form.license_placeholder' }, submitText = { key: 'form.submit' }, submittingText = { key: 'form.verifying' }, helperText, className, t, locale, }) => {
|
|
1169
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
799
1170
|
const [inputValue, setInputValue] = React.useState(value);
|
|
800
1171
|
React.useEffect(() => {
|
|
801
1172
|
setInputValue(value);
|
|
@@ -808,11 +1179,11 @@ const FormWithSubmit = ({ onLicenseSubmit, disabled = false, isSubmitting = fals
|
|
|
808
1179
|
setInputValue(value);
|
|
809
1180
|
onValueChange?.(value);
|
|
810
1181
|
};
|
|
811
|
-
const displayLabel = resolveText(
|
|
812
|
-
const displayPlaceholder = resolveText(
|
|
813
|
-
const displaySubmitText = resolveText(
|
|
814
|
-
const displaySubmittingText = resolveText(
|
|
815
|
-
const displayHelperText = helperText ? resolveText(
|
|
1182
|
+
const displayLabel = resolveText(translate, label, 'License Key');
|
|
1183
|
+
const displayPlaceholder = resolveText(translate, placeholder, 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
|
|
1184
|
+
const displaySubmitText = resolveText(translate, submitText, 'Submit');
|
|
1185
|
+
const displaySubmittingText = resolveText(translate, submittingText, 'Verifying...');
|
|
1186
|
+
const displayHelperText = helperText ? resolveText(translate, helperText, '') : undefined;
|
|
816
1187
|
return (React.createElement("form", { className: `designbase-figma-form-with-submit ${className || ''}`, onSubmit: handleSubmit },
|
|
817
1188
|
React.createElement("div", { className: "designbase-figma-form-with-submit__field" },
|
|
818
1189
|
React.createElement("label", { className: "designbase-figma-form-with-submit__label" }, displayLabel),
|
|
@@ -826,7 +1197,8 @@ const FormWithSubmit = ({ onLicenseSubmit, disabled = false, isSubmitting = fals
|
|
|
826
1197
|
};
|
|
827
1198
|
FormWithSubmit.displayName = 'FormWithSubmit';
|
|
828
1199
|
|
|
829
|
-
const InteractionFeedback = ({ status = 'default', message, statusMessage, leftContent, rightAction, visible = true, className, t }) => {
|
|
1200
|
+
const InteractionFeedback = ({ status = 'default', message, statusMessage, leftContent, rightAction, visible = true, className, t, locale, }) => {
|
|
1201
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
830
1202
|
const feedbackClasses = clsx('designbase-figma-interaction', `designbase-figma-interaction--${status}`, {
|
|
831
1203
|
'designbase-figma-interaction--visible': visible,
|
|
832
1204
|
}, className);
|
|
@@ -835,38 +1207,28 @@ const InteractionFeedback = ({ status = 'default', message, statusMessage, leftC
|
|
|
835
1207
|
return (React.createElement("div", { className: feedbackClasses },
|
|
836
1208
|
React.createElement("div", { className: "designbase-figma-interaction__content" },
|
|
837
1209
|
React.createElement("div", { className: "designbase-figma-interaction__left" }, leftContent || (React.createElement("div", { className: "designbase-figma-interaction__message" },
|
|
838
|
-
status === 'loading' && (React.createElement(react.Spinner, { size: "s", type: "circular", label:
|
|
839
|
-
(message || status === 'loading') && (React.createElement("span", { className: "designbase-figma-interaction__text" }, resolveText(
|
|
840
|
-
statusMessage && (React.createElement("span", { className: "designbase-figma-interaction__status-text" }, resolveText(
|
|
1210
|
+
status === 'loading' && (React.createElement(react.Spinner, { size: "s", type: "circular", label: translate('loading'), showLabel: false })),
|
|
1211
|
+
(message || status === 'loading') && (React.createElement("span", { className: "designbase-figma-interaction__text" }, resolveText(translate, message || { key: 'loading' }))),
|
|
1212
|
+
statusMessage && (React.createElement("span", { className: "designbase-figma-interaction__status-text" }, resolveText(translate, statusMessage)))))),
|
|
841
1213
|
rightAction && (React.createElement("div", { className: "designbase-figma-interaction__right" }, rightAction)))));
|
|
842
1214
|
};
|
|
843
1215
|
InteractionFeedback.displayName = 'InteractionFeedback';
|
|
844
1216
|
|
|
845
|
-
let useTranslation = null;
|
|
846
|
-
try {
|
|
847
|
-
const reactI18next = require('react-i18next');
|
|
848
|
-
useTranslation = reactI18next.useTranslation;
|
|
849
|
-
}
|
|
850
|
-
catch (e) {
|
|
851
|
-
}
|
|
852
1217
|
const DEFAULT_LANGUAGES = [
|
|
853
1218
|
{ code: 'ko', label: 'KO' },
|
|
854
1219
|
{ code: 'en', label: 'EN' },
|
|
855
1220
|
];
|
|
856
1221
|
const LanguageSelector = ({ currentLanguage, languages = DEFAULT_LANGUAGES, onLanguageChange, size = 's', className, t }) => {
|
|
857
|
-
const
|
|
858
|
-
const activeLanguage = currentLanguage ||
|
|
1222
|
+
const { locale, t: translate } = useFigmaUiI18n(currentLanguage, t);
|
|
1223
|
+
const activeLanguage = currentLanguage || locale;
|
|
859
1224
|
const handleLanguageChange = (languageCode) => {
|
|
860
|
-
if (i18n) {
|
|
861
|
-
i18n.changeLanguage(languageCode);
|
|
862
|
-
}
|
|
863
1225
|
if (onLanguageChange) {
|
|
864
1226
|
onLanguageChange(languageCode);
|
|
865
1227
|
}
|
|
866
1228
|
};
|
|
867
1229
|
const segmentOptions = languages.map((language) => ({
|
|
868
1230
|
value: language.code,
|
|
869
|
-
label: resolveText(
|
|
1231
|
+
label: resolveText(translate, language.label, language.code.toUpperCase()),
|
|
870
1232
|
disabled: false,
|
|
871
1233
|
}));
|
|
872
1234
|
return (React.createElement("div", { className: `designbase-figma-language-selector ${className || ''}` },
|
|
@@ -898,25 +1260,26 @@ function openExternalUrl(url) {
|
|
|
898
1260
|
}
|
|
899
1261
|
}
|
|
900
1262
|
|
|
901
|
-
const LicenseOffer = ({ joinUrl, guideUrl, membershipUrl, t, className, }) => {
|
|
1263
|
+
const LicenseOffer = ({ joinUrl, guideUrl, membershipUrl, t, locale, className, }) => {
|
|
1264
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
902
1265
|
const titleId = `designbase-license-offer-title-${React.useId().replace(/:/g, '')}`;
|
|
903
1266
|
const resolvedJoinUrl = joinUrl || membershipUrl;
|
|
904
1267
|
const steps = [
|
|
905
|
-
resolveText(
|
|
906
|
-
resolveText(
|
|
907
|
-
resolveText(
|
|
1268
|
+
resolveText(translate, { key: 'license.youtube_membership_step_1' }, 'Designbase YouTube 채널 멤버십에 가입합니다.'),
|
|
1269
|
+
resolveText(translate, { key: 'license.youtube_membership_step_2' }, '멤버 전용 커뮤니티에서 이번 달 키를 복사합니다.'),
|
|
1270
|
+
resolveText(translate, { key: 'license.youtube_membership_step_3' }, '아래 입력창에 키를 붙여 넣고 활성화합니다.'),
|
|
908
1271
|
];
|
|
909
1272
|
return (React.createElement("section", { className: `designbase-figma-license-offer ${className || ''}`, "aria-labelledby": titleId },
|
|
910
|
-
React.createElement("h3", { id: titleId, className: "designbase-figma-license-offer__title" }, resolveText(
|
|
1273
|
+
React.createElement("h3", { id: titleId, className: "designbase-figma-license-offer__title" }, resolveText(translate, { key: 'license.youtube_membership_howto' }, '이용 방법')),
|
|
911
1274
|
React.createElement("ol", { className: "designbase-figma-license-offer__steps" }, steps.map((step, index) => (React.createElement("li", { key: index },
|
|
912
1275
|
React.createElement("span", { className: "designbase-figma-license-offer__step-index", "aria-hidden": "true" },
|
|
913
1276
|
index + 1,
|
|
914
1277
|
"."),
|
|
915
1278
|
React.createElement("span", null, step))))),
|
|
916
1279
|
(resolvedJoinUrl || guideUrl) && (React.createElement("div", { className: "designbase-figma-license-offer__actions" },
|
|
917
|
-
resolvedJoinUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(resolvedJoinUrl), variant: "primary", size: "m", fullWidth: true }, resolveText(
|
|
1280
|
+
resolvedJoinUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(resolvedJoinUrl), variant: "primary", size: "m", fullWidth: true }, resolveText(translate, { key: 'license.youtube_membership_join' }, '멤버십 가입'))),
|
|
918
1281
|
guideUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(guideUrl), variant: "secondary", size: "m", fullWidth: true },
|
|
919
|
-
React.createElement("span", null, resolveText(
|
|
1282
|
+
React.createElement("span", null, resolveText(translate, { key: 'license.youtube_membership_guide' }, '안내보기')),
|
|
920
1283
|
React.createElement(icons.ExternalLinkIcon, { size: 16, "aria-hidden": "true" })))))));
|
|
921
1284
|
};
|
|
922
1285
|
LicenseOffer.displayName = 'LicenseOffer';
|
|
@@ -926,13 +1289,13 @@ function maskLicenseKey(value) {
|
|
|
926
1289
|
return '••••••••';
|
|
927
1290
|
return `${value.slice(0, 4)}••••${value.slice(-4)}`;
|
|
928
1291
|
}
|
|
929
|
-
function formatDate(value) {
|
|
1292
|
+
function formatDate(value, locale) {
|
|
930
1293
|
if (!value)
|
|
931
1294
|
return undefined;
|
|
932
1295
|
const date = new Date(value);
|
|
933
1296
|
if (Number.isNaN(date.getTime()))
|
|
934
1297
|
return value;
|
|
935
|
-
return new Intl.DateTimeFormat(
|
|
1298
|
+
return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(date);
|
|
936
1299
|
}
|
|
937
1300
|
function formatScope(value, t) {
|
|
938
1301
|
if (!value)
|
|
@@ -953,43 +1316,44 @@ function formatSource(value, t) {
|
|
|
953
1316
|
}
|
|
954
1317
|
return value;
|
|
955
1318
|
}
|
|
956
|
-
const LicenseStatusCard = ({ status, licenseKey = '', licenseStatus, licenseSource, accessScope, expiresAt, lastVerifiedAt, validationMessage, allowRevealKey = false, t, className, }) => {
|
|
1319
|
+
const LicenseStatusCard = ({ status, licenseKey = '', licenseStatus, licenseSource, accessScope, expiresAt, lastVerifiedAt, validationMessage, allowRevealKey = false, t, locale, className, }) => {
|
|
1320
|
+
const { locale: resolvedLocale, t: translate } = useFigmaUiI18n(locale, t);
|
|
957
1321
|
const [isKeyRevealed, setIsKeyRevealed] = React.useState(false);
|
|
958
1322
|
const normalizedLicenseStatus = licenseStatus?.toLowerCase();
|
|
959
1323
|
const isInactiveStatus = ['expired', 'revoked', 'invalid', 'inactive'].includes(normalizedLicenseStatus || '');
|
|
960
1324
|
const isActive = status === 'PAID' && !isInactiveStatus;
|
|
961
1325
|
const statusText = isActive
|
|
962
|
-
? resolveText(
|
|
963
|
-
: resolveText(
|
|
1326
|
+
? resolveText(translate, { key: 'license.status_active' }, 'Active')
|
|
1327
|
+
: resolveText(translate, { key: 'license.status_inactive' }, 'License check failed');
|
|
964
1328
|
const statusClass = isActive ? 'active' : 'inactive';
|
|
965
1329
|
return (React.createElement("section", { className: `designbase-figma-license-status-card designbase-figma-license-status-card--${statusClass} ${className || ''}`, "aria-label": statusText },
|
|
966
1330
|
React.createElement("div", { className: "designbase-figma-license-status-card__header" },
|
|
967
1331
|
React.createElement("div", null,
|
|
968
1332
|
React.createElement("div", { className: "designbase-figma-license-status-card__eyebrow" }, isActive
|
|
969
|
-
? resolveText(
|
|
970
|
-
: resolveText(
|
|
1333
|
+
? resolveText(translate, { key: 'license.activated' }, '라이선스 활성화됨')
|
|
1334
|
+
: resolveText(translate, { key: 'license.status_label' }, '라이선스 상태')),
|
|
971
1335
|
React.createElement("h3", null, statusText)),
|
|
972
1336
|
React.createElement("span", { className: "designbase-figma-license-status-card__badge" }, licenseStatus || (isActive ? 'active' : 'inactive'))),
|
|
973
1337
|
validationMessage && !isActive && (React.createElement("p", { className: "designbase-figma-license-status-card__message" }, validationMessage)),
|
|
974
1338
|
licenseKey && (React.createElement("div", { className: "designbase-figma-license-status-card__key-row" },
|
|
975
|
-
React.createElement("span", null, resolveText(
|
|
1339
|
+
React.createElement("span", null, resolveText(translate, { key: 'license.key_label' }, '라이선스 키')),
|
|
976
1340
|
React.createElement("code", null, allowRevealKey && isKeyRevealed ? licenseKey : maskLicenseKey(licenseKey)),
|
|
977
1341
|
allowRevealKey && (React.createElement(react.Button, { type: "button", onPress: () => setIsKeyRevealed((value) => !value), variant: "tertiary", size: "s" }, isKeyRevealed
|
|
978
|
-
? resolveText(
|
|
979
|
-
: resolveText(
|
|
1342
|
+
? resolveText(translate, { key: 'license.hide_key' }, '숨기기')
|
|
1343
|
+
: resolveText(translate, { key: 'license.reveal_key' }, '보기'))))),
|
|
980
1344
|
(licenseSource || accessScope || expiresAt || lastVerifiedAt) && (React.createElement("dl", { className: "designbase-figma-license-status-card__meta" },
|
|
981
|
-
formatSource(licenseSource,
|
|
982
|
-
React.createElement("dt", null, resolveText(
|
|
983
|
-
React.createElement("dd", null, formatSource(licenseSource,
|
|
984
|
-
formatScope(accessScope,
|
|
985
|
-
React.createElement("dt", null, resolveText(
|
|
986
|
-
React.createElement("dd", null, formatScope(accessScope,
|
|
1345
|
+
formatSource(licenseSource, translate) && React.createElement(React.Fragment, null,
|
|
1346
|
+
React.createElement("dt", null, resolveText(translate, { key: 'license.source' }, '출처')),
|
|
1347
|
+
React.createElement("dd", null, formatSource(licenseSource, translate))),
|
|
1348
|
+
formatScope(accessScope, translate) && React.createElement(React.Fragment, null,
|
|
1349
|
+
React.createElement("dt", null, resolveText(translate, { key: 'license.access' }, '접근 범위')),
|
|
1350
|
+
React.createElement("dd", null, formatScope(accessScope, translate))),
|
|
987
1351
|
expiresAt && React.createElement(React.Fragment, null,
|
|
988
|
-
React.createElement("dt", null, resolveText(
|
|
989
|
-
React.createElement("dd", null, formatDate(expiresAt) || expiresAt)),
|
|
1352
|
+
React.createElement("dt", null, resolveText(translate, { key: 'license.expires' }, '만료일')),
|
|
1353
|
+
React.createElement("dd", null, formatDate(expiresAt, resolvedLocale) || expiresAt)),
|
|
990
1354
|
lastVerifiedAt && React.createElement(React.Fragment, null,
|
|
991
|
-
React.createElement("dt", null, resolveText(
|
|
992
|
-
React.createElement("dd", null, formatDate(lastVerifiedAt) || lastVerifiedAt))))));
|
|
1355
|
+
React.createElement("dt", null, resolveText(translate, { key: 'license.last_checked' }, '최근 확인')),
|
|
1356
|
+
React.createElement("dd", null, formatDate(lastVerifiedAt, resolvedLocale) || lastVerifiedAt))))));
|
|
993
1357
|
};
|
|
994
1358
|
LicenseStatusCard.displayName = 'LicenseStatusCard';
|
|
995
1359
|
|
|
@@ -1010,15 +1374,16 @@ function resolvePaymentFeedbackVariant(errorCode, explicitVariant) {
|
|
|
1010
1374
|
}
|
|
1011
1375
|
return 'error';
|
|
1012
1376
|
}
|
|
1013
|
-
const PaymentStatusSection = ({ activationLimit, activationUsage, licenseKey, onDeactivate, isDeactivating = false, showDetails = false, actionMessage, actionMessageVariant, errorCode, className, t, }) => {
|
|
1377
|
+
const PaymentStatusSection = ({ activationLimit, activationUsage, licenseKey, onDeactivate, isDeactivating = false, showDetails = false, actionMessage, actionMessageVariant, errorCode, className, t, locale, }) => {
|
|
1378
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
1014
1379
|
const remainingActivations = Math.max(0, activationLimit - activationUsage);
|
|
1015
|
-
const resolvedActionMessage = actionMessage ? resolveText(
|
|
1380
|
+
const resolvedActionMessage = actionMessage ? resolveText(translate, actionMessage) : undefined;
|
|
1016
1381
|
const feedbackVariant = resolvedActionMessage
|
|
1017
1382
|
? resolvePaymentFeedbackVariant(errorCode, actionMessageVariant)
|
|
1018
1383
|
: undefined;
|
|
1019
1384
|
return (React.createElement("div", { className: clsx('designbase-figma-payment-status', className) },
|
|
1020
1385
|
React.createElement("div", { className: "designbase-figma-payment-status__license-key" },
|
|
1021
|
-
resolveText(
|
|
1386
|
+
resolveText(translate, { key: 'payment.license_key_label' }, '라이선스 키'),
|
|
1022
1387
|
": ",
|
|
1023
1388
|
React.createElement("span", null, licenseKey)),
|
|
1024
1389
|
showDetails && (React.createElement("div", { className: "designbase-figma-payment-status__details" },
|
|
@@ -1026,41 +1391,60 @@ const PaymentStatusSection = ({ activationLimit, activationUsage, licenseKey, on
|
|
|
1026
1391
|
React.createElement("div", { className: "designbase-figma-payment-status__remaining" },
|
|
1027
1392
|
remainingActivations,
|
|
1028
1393
|
' ',
|
|
1029
|
-
resolveText(
|
|
1394
|
+
resolveText(translate, { key: 'payment.activations_remaining' }, '활성'),
|
|
1030
1395
|
' ',
|
|
1031
|
-
resolveText(
|
|
1396
|
+
resolveText(translate, { key: 'payment.spots_remaining' }, '자리 남음')),
|
|
1032
1397
|
React.createElement("div", { className: "designbase-figma-payment-status__usage" },
|
|
1033
1398
|
activationUsage,
|
|
1034
1399
|
"/",
|
|
1035
1400
|
activationLimit)),
|
|
1036
1401
|
React.createElement("div", { className: "designbase-figma-payment-status__action" },
|
|
1037
1402
|
React.createElement(react.Button, { onPress: onDeactivate, variant: "secondary", size: "s", fullWidth: true, disabled: isDeactivating }, isDeactivating
|
|
1038
|
-
? resolveText(
|
|
1039
|
-
: resolveText(
|
|
1403
|
+
? resolveText(translate, { key: 'payment.deactivating' }, '비활성화중...')
|
|
1404
|
+
: resolveText(translate, { key: 'payment.deactivate_license' }, '라이선스 비활성화')),
|
|
1040
1405
|
resolvedActionMessage && feedbackVariant && (React.createElement("p", { className: clsx('designbase-figma-payment-status__feedback', `designbase-figma-payment-status__feedback--${feedbackVariant}`), role: feedbackVariant === 'error' ? 'alert' : 'status', "aria-live": "polite" }, resolvedActionMessage)))))));
|
|
1041
1406
|
};
|
|
1042
1407
|
PaymentStatusSection.displayName = 'PaymentStatusSection';
|
|
1043
1408
|
|
|
1044
|
-
const
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1409
|
+
const defaultFeaturesByLocale = {
|
|
1410
|
+
ko: [
|
|
1411
|
+
{ name: '사용 제한', free: '일일 제한', pro: '무제한' },
|
|
1412
|
+
{ name: '모든 주제 사용', free: false, pro: true },
|
|
1413
|
+
{ name: '최대 선택 제한', free: '최대 5개', pro: '최대 30개' },
|
|
1414
|
+
{ name: '더미 개수', free: '1,400개', pro: '4,400개 이상' },
|
|
1415
|
+
{ name: '커스텀 숫자 사용', free: false, pro: true },
|
|
1416
|
+
],
|
|
1417
|
+
en: [
|
|
1418
|
+
{ name: 'Usage limit', free: 'Daily limit', pro: 'Unlimited' },
|
|
1419
|
+
{ name: 'All topics', free: false, pro: true },
|
|
1420
|
+
{ name: 'Selection limit', free: 'Up to 5', pro: 'Up to 30' },
|
|
1421
|
+
{ name: 'Dummy count', free: '1,400', pro: '4,400+' },
|
|
1422
|
+
{ name: 'Custom numbers', free: false, pro: true },
|
|
1423
|
+
],
|
|
1424
|
+
ja: [
|
|
1425
|
+
{ name: '使用制限', free: '1日の制限', pro: '無制限' },
|
|
1426
|
+
{ name: 'すべてのトピック', free: false, pro: true },
|
|
1427
|
+
{ name: '選択上限', free: '最大5個', pro: '最大30個' },
|
|
1428
|
+
{ name: 'ダミー数', free: '1,400個', pro: '4,400個以上' },
|
|
1429
|
+
{ name: 'カスタム数値', free: false, pro: true },
|
|
1430
|
+
],
|
|
1431
|
+
};
|
|
1051
1432
|
const defaultPricing = {
|
|
1052
1433
|
monthly: 2,
|
|
1053
1434
|
yearly: 21.6,
|
|
1054
1435
|
lifetime: 50,
|
|
1055
1436
|
};
|
|
1056
|
-
const PricingComparison = ({ features
|
|
1437
|
+
const PricingComparison = ({ features, pricing = defaultPricing, paymentType = 'subscription', t, locale, className, }) => {
|
|
1438
|
+
const { locale: resolvedLocale, t: translate } = useFigmaUiI18n(locale, t);
|
|
1057
1439
|
const [isYearly, setIsYearly] = React.useState(false);
|
|
1440
|
+
const resolvedFeatures = features ?? defaultFeaturesByLocale[resolvedLocale];
|
|
1441
|
+
const resolveFeatureValue = (value) => typeof value === 'boolean' ? (value ? '✓' : '✗') : value;
|
|
1058
1442
|
const getPrice = () => {
|
|
1059
1443
|
if (paymentType === 'lifetime') {
|
|
1060
|
-
return `$${pricing.lifetime?.toLocaleString()} - ${
|
|
1444
|
+
return `$${pricing.lifetime?.toLocaleString()} - ${translate('lifetimeAccess')}`;
|
|
1061
1445
|
}
|
|
1062
1446
|
const price = isYearly ? pricing.yearly : pricing.monthly;
|
|
1063
|
-
return `$${price?.toLocaleString()} / ${isYearly ?
|
|
1447
|
+
return `$${price?.toLocaleString()} / ${isYearly ? translate('perYear') : translate('perMonth')}`;
|
|
1064
1448
|
};
|
|
1065
1449
|
const getDiscountPercentage = () => {
|
|
1066
1450
|
if (paymentType === 'lifetime') {
|
|
@@ -1083,46 +1467,34 @@ const PricingComparison = ({ features = defaultFeatures, pricing = defaultPricin
|
|
|
1083
1467
|
}, options: [
|
|
1084
1468
|
{
|
|
1085
1469
|
value: 'monthly',
|
|
1086
|
-
label:
|
|
1470
|
+
label: translate('monthlyBilling'),
|
|
1087
1471
|
},
|
|
1088
1472
|
{
|
|
1089
1473
|
value: 'yearly',
|
|
1090
|
-
label: `${
|
|
1474
|
+
label: `${translate('yearlyBilling')} (${getDiscountPercentage()}% ${translate('pricing.discount_suffix')})`,
|
|
1091
1475
|
},
|
|
1092
1476
|
], size: "s" }))),
|
|
1093
1477
|
paymentType === 'lifetime' && (React.createElement("div", { className: "designbase-figma-pricing-comparison__lifetime-info" },
|
|
1094
|
-
React.createElement("p", { className: "designbase-figma-pricing-comparison__lifetime-text" },
|
|
1478
|
+
React.createElement("p", { className: "designbase-figma-pricing-comparison__lifetime-text" }, translate('oneTimePaymentLifetime')))),
|
|
1095
1479
|
React.createElement("table", { className: "designbase-figma-pricing-comparison__table" },
|
|
1096
1480
|
React.createElement("thead", null,
|
|
1097
1481
|
React.createElement("tr", null,
|
|
1098
|
-
React.createElement("th", null,
|
|
1482
|
+
React.createElement("th", null, translate('feature')),
|
|
1099
1483
|
React.createElement("th", null,
|
|
1100
|
-
React.createElement("div", { className: "designbase-figma-pricing-comparison__plan-name" },
|
|
1101
|
-
React.createElement("div", null,
|
|
1484
|
+
React.createElement("div", { className: "designbase-figma-pricing-comparison__plan-name" }, translate('free')),
|
|
1485
|
+
React.createElement("div", null, translate('freePrice'))),
|
|
1102
1486
|
React.createElement("th", { className: "designbase-figma-pricing-comparison__recommended" },
|
|
1103
1487
|
React.createElement("div", { className: "designbase-figma-pricing-comparison__plan-name" },
|
|
1104
|
-
|
|
1105
|
-
React.createElement("span", { className: "designbase-figma-pricing-comparison__recommended-badge" },
|
|
1488
|
+
translate('pro'),
|
|
1489
|
+
React.createElement("span", { className: "designbase-figma-pricing-comparison__recommended-badge" }, translate('recommended'))),
|
|
1106
1490
|
React.createElement("div", null, getPrice())))),
|
|
1107
|
-
React.createElement("tbody", null,
|
|
1491
|
+
React.createElement("tbody", null, resolvedFeatures.map((feature, index) => (React.createElement("tr", { key: index },
|
|
1108
1492
|
React.createElement("td", null, feature.name),
|
|
1109
|
-
React.createElement("td", null,
|
|
1110
|
-
|
|
1111
|
-
: feature.free),
|
|
1112
|
-
React.createElement("td", null, typeof feature.pro === 'boolean'
|
|
1113
|
-
? (feature.pro ? '✓' : '✗')
|
|
1114
|
-
: feature.pro))))))));
|
|
1493
|
+
React.createElement("td", null, resolveFeatureValue(feature.free)),
|
|
1494
|
+
React.createElement("td", null, resolveFeatureValue(feature.pro)))))))));
|
|
1115
1495
|
};
|
|
1116
1496
|
PricingComparison.displayName = 'PricingComparison';
|
|
1117
1497
|
|
|
1118
|
-
const DEFAULT_LICENSE_MESSAGE_TYPES = {
|
|
1119
|
-
initialize: 'initialize',
|
|
1120
|
-
verifyLicense: 'verify-license',
|
|
1121
|
-
deactivateLicense: 'deactivate-license',
|
|
1122
|
-
updateStatus: 'update-plugin-status',
|
|
1123
|
-
verifyResult: 'license-verification-result',
|
|
1124
|
-
deactivateResult: 'license-deactivation-result',
|
|
1125
|
-
};
|
|
1126
1498
|
const START_DESIGNBASE_AUTH_MESSAGE = 'start-designbase-auth';
|
|
1127
1499
|
const INITIAL_LICENSE_PAGE_STATE = {
|
|
1128
1500
|
paymentStatus: 'FREE',
|
|
@@ -1196,7 +1568,7 @@ function parseLicenseMessage(data) {
|
|
|
1196
1568
|
};
|
|
1197
1569
|
}
|
|
1198
1570
|
function useFigmaLicenseBridge(options = {}) {
|
|
1199
|
-
const messageTypes = React.useMemo(() => ({ ...DEFAULT_LICENSE_MESSAGE_TYPES, ...options.messageTypes }), [options.messageTypes]);
|
|
1571
|
+
const messageTypes = React.useMemo(() => ({ ...figmaLicenseCore.DEFAULT_LICENSE_MESSAGE_TYPES, ...options.messageTypes }), [options.messageTypes]);
|
|
1200
1572
|
const [state, setState] = React.useState({
|
|
1201
1573
|
...INITIAL_LICENSE_PAGE_STATE,
|
|
1202
1574
|
...options.initialState,
|
|
@@ -1277,6 +1649,9 @@ function useFigmaLicenseBridge(options = {}) {
|
|
|
1277
1649
|
applyPatch({ lastMessage: payload.message });
|
|
1278
1650
|
}
|
|
1279
1651
|
}
|
|
1652
|
+
if (type === messageTypes.featureAccessResult || type === messageTypes.usageConsumeResult) {
|
|
1653
|
+
applyPatch(parseLicenseMessage(payload));
|
|
1654
|
+
}
|
|
1280
1655
|
};
|
|
1281
1656
|
window.addEventListener('message', handleMessage);
|
|
1282
1657
|
postPluginMessage({ type: messageTypes.initialize });
|
|
@@ -1301,6 +1676,20 @@ function useFigmaLicenseBridge(options = {}) {
|
|
|
1301
1676
|
setIsStartingAuth(true);
|
|
1302
1677
|
postPluginMessage({ type: START_DESIGNBASE_AUTH_MESSAGE });
|
|
1303
1678
|
}, []);
|
|
1679
|
+
const checkFeatureAccess = React.useCallback((featureKey, amount = 1) => {
|
|
1680
|
+
postPluginMessage({
|
|
1681
|
+
type: messageTypes.checkFeatureAccess,
|
|
1682
|
+
...(featureKey ? { featureKey } : {}),
|
|
1683
|
+
amount,
|
|
1684
|
+
});
|
|
1685
|
+
}, [messageTypes.checkFeatureAccess]);
|
|
1686
|
+
const consumeUsage = React.useCallback((amount = 1, featureKey) => {
|
|
1687
|
+
postPluginMessage({
|
|
1688
|
+
type: messageTypes.consumeUsage,
|
|
1689
|
+
amount,
|
|
1690
|
+
...(featureKey ? { featureKey } : {}),
|
|
1691
|
+
});
|
|
1692
|
+
}, [messageTypes.consumeUsage]);
|
|
1304
1693
|
return {
|
|
1305
1694
|
state,
|
|
1306
1695
|
isVerifying,
|
|
@@ -1309,6 +1698,8 @@ function useFigmaLicenseBridge(options = {}) {
|
|
|
1309
1698
|
verifyLicense,
|
|
1310
1699
|
deactivateLicense,
|
|
1311
1700
|
startDesignbaseAuth,
|
|
1701
|
+
checkFeatureAccess,
|
|
1702
|
+
consumeUsage,
|
|
1312
1703
|
setLicenseKeyInput: (licenseKey) => applyPatch({ licenseKey }),
|
|
1313
1704
|
};
|
|
1314
1705
|
}
|
|
@@ -1322,17 +1713,23 @@ function formatUsageLabel(state, t) {
|
|
|
1322
1713
|
const remaining = remainingUsage ?? Math.max(0, limit - usageUsed);
|
|
1323
1714
|
if (usageReset === 'daily') {
|
|
1324
1715
|
const fallback = `오늘 남은 횟수 ${remaining}/${limit}`;
|
|
1325
|
-
const translated = resolveText(t, { key: 'license.usage_daily' }, fallback) ?? fallback;
|
|
1716
|
+
const translated = resolveText(t, { key: 'license.usage_daily', values: { remaining, limit } }, fallback) ?? fallback;
|
|
1326
1717
|
return translated.includes(String(remaining)) ? translated : fallback;
|
|
1327
1718
|
}
|
|
1328
1719
|
if (usageReset === 'monthly') {
|
|
1329
1720
|
const fallback = `이번 달 남은 횟수 ${remaining}/${limit}`;
|
|
1330
|
-
const translated = resolveText(t, { key: 'license.usage_monthly' }, fallback) ?? fallback;
|
|
1721
|
+
const translated = resolveText(t, { key: 'license.usage_monthly', values: { remaining, limit } }, fallback) ?? fallback;
|
|
1722
|
+
return translated.includes(String(remaining)) ? translated : fallback;
|
|
1723
|
+
}
|
|
1724
|
+
if (usageReset === 'weekly') {
|
|
1725
|
+
const fallback = `이번 주 남은 횟수 ${remaining}/${limit}`;
|
|
1726
|
+
const translated = resolveText(t, { key: 'license.usage_weekly', values: { remaining, limit } }, fallback) ?? fallback;
|
|
1331
1727
|
return translated.includes(String(remaining)) ? translated : fallback;
|
|
1332
1728
|
}
|
|
1333
|
-
return `남은 횟수 ${remaining}/${limit}`;
|
|
1729
|
+
return resolveText(t, { key: 'license.usage_generic', values: { remaining, limit } }, `남은 횟수 ${remaining}/${limit}`) ?? `남은 횟수 ${remaining}/${limit}`;
|
|
1334
1730
|
}
|
|
1335
|
-
const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicenseKey = '', wordpressLinks, paymentPageUrl, mode = 'pricing', membershipUrl, enableAccountAuth = true, showLicenseKeyInput = true, pricingFeatures, pricing, paymentType = 'subscription', messageTypes, onStateChange, setPaymentStatus, setUsageCount, onLicenseSubmit, usageCount: initialUsageCount = 0, t, className, }) => {
|
|
1731
|
+
const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicenseKey = '', wordpressLinks, paymentPageUrl, mode = 'pricing', membershipUrl, enableAccountAuth = true, showLicenseKeyInput = true, pricingFeatures, pricing, paymentType = 'subscription', messageTypes, onStateChange, setPaymentStatus, setUsageCount, onLicenseSubmit, usageCount: initialUsageCount = 0, t, locale, className, }) => {
|
|
1732
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
1336
1733
|
const links = React.useMemo(() => ({
|
|
1337
1734
|
purchaseUrl: wordpressLinks?.purchaseUrl ?? paymentPageUrl,
|
|
1338
1735
|
membershipUrl: membershipUrl ?? wordpressLinks?.membershipUrl,
|
|
@@ -1354,7 +1751,7 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
|
|
|
1354
1751
|
const [licenseKeyDraft, setLicenseKeyDraft] = React.useState(initialLicenseKey);
|
|
1355
1752
|
const isPaid = state.isLicenseRegistered && state.paymentStatus === 'PAID';
|
|
1356
1753
|
const isMembershipMode = mode === 'youtube-membership';
|
|
1357
|
-
const usageLabel = formatUsageLabel(state,
|
|
1754
|
+
const usageLabel = formatUsageLabel(state, translate);
|
|
1358
1755
|
const handleLicenseSubmit = async (submittedLicenseKey) => {
|
|
1359
1756
|
if (onLicenseSubmit) {
|
|
1360
1757
|
await onLicenseSubmit(submittedLicenseKey);
|
|
@@ -1371,79 +1768,80 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
|
|
|
1371
1768
|
React.createElement("div", { className: "designbase-figma-page-license__header" },
|
|
1372
1769
|
React.createElement("div", { className: "designbase-figma-page-license__title" },
|
|
1373
1770
|
React.createElement("h2", null, isMembershipMode
|
|
1374
|
-
? resolveText(
|
|
1771
|
+
? resolveText(translate, { key: 'license.youtube_membership' }, 'YouTube 멤버십')
|
|
1375
1772
|
: isPaid
|
|
1376
|
-
? resolveText(
|
|
1377
|
-
: resolveText(
|
|
1773
|
+
? resolveText(translate, { key: 'license.pro_account' }, '프로 계정')
|
|
1774
|
+
: resolveText(translate, { key: 'license.upgrade_to_pro' }, '프로로 업그레이드')),
|
|
1378
1775
|
state.planTier && state.planTier !== 'FREE' && (React.createElement("span", { className: "designbase-figma-page-license__tier" }, state.planTier))),
|
|
1379
1776
|
React.createElement("p", { className: "designbase-figma-page-license__description" }, isPaid
|
|
1380
|
-
? resolveText(
|
|
1777
|
+
? resolveText(translate, { key: 'license.all_features_available' }, '모든 기능을 사용할 수 있습니다.')
|
|
1381
1778
|
: isMembershipMode
|
|
1382
|
-
? resolveText(
|
|
1383
|
-
: resolveText(
|
|
1779
|
+
? resolveText(translate, { key: 'license.youtube_membership_description' }, 'YouTube 멤버십에 가입하면 Designbase 플러그인을 무제한으로 사용할 수 있습니다.')
|
|
1780
|
+
: resolveText(translate, { key: 'license.purchase_for_unlimited' }, '디자인베이스 멤버십 또는 라이선스로 무제한 이용이 가능합니다.')),
|
|
1384
1781
|
!isPaid && !isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__usage" }, usageLabel))),
|
|
1385
|
-
!isMembershipMode && (React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t:
|
|
1782
|
+
!isMembershipMode && (React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t: translate })),
|
|
1386
1783
|
state.lastMessage && !state.deactivateMessage && (React.createElement("p", { className: `designbase-figma-page-license__feedback ${state.lastErrorCode ? 'designbase-figma-page-license__feedback--error' : ''}`, "aria-live": "polite" }, state.lastMessage)),
|
|
1387
1784
|
isPaid && (React.createElement("div", { className: "designbase-figma-page-license__section" },
|
|
1388
1785
|
React.createElement("div", { className: "designbase-figma-page-license__section-header" },
|
|
1389
|
-
React.createElement("h3", null, resolveText(
|
|
1786
|
+
React.createElement("h3", null, resolveText(translate, { key: 'license.activated' }, '라이선스 활성화됨')),
|
|
1390
1787
|
React.createElement(react.Button, { onPress: () => setShowDetails(!showDetails), variant: "tertiary", size: "s", iconOnly: true },
|
|
1391
1788
|
React.createElement(icons.MoreHorizontalIcon, { size: 16 }))),
|
|
1392
|
-
React.createElement(LicenseStatusCard, { status: state.paymentStatus, licenseKey: state.licenseKey, licenseStatus: state.licenseStatus, licenseSource: state.licenseSource, accessScope: state.accessScope, expiresAt: state.expiresAt, lastVerifiedAt: state.lastVerifiedAt, validationMessage: state.validationMessage, allowRevealKey: false, t:
|
|
1789
|
+
React.createElement(LicenseStatusCard, { status: state.paymentStatus, licenseKey: state.licenseKey, licenseStatus: state.licenseStatus, licenseSource: state.licenseSource, accessScope: state.accessScope, expiresAt: state.expiresAt, lastVerifiedAt: state.lastVerifiedAt, validationMessage: state.validationMessage, allowRevealKey: false, t: translate }),
|
|
1393
1790
|
React.createElement("p", { className: "designbase-figma-page-license__usage" }, usageLabel),
|
|
1394
1791
|
showDetails && (React.createElement("div", { className: "designbase-figma-page-license__details" },
|
|
1395
1792
|
React.createElement("div", { className: "designbase-figma-page-license__activation-info" },
|
|
1396
1793
|
React.createElement("div", { className: "designbase-figma-page-license__remaining" },
|
|
1397
1794
|
Math.max(0, state.activationLimit - state.activationUsage),
|
|
1398
1795
|
' ',
|
|
1399
|
-
resolveText(
|
|
1796
|
+
resolveText(translate, { key: 'license.activations_remaining' }, '활성'),
|
|
1400
1797
|
' ',
|
|
1401
|
-
resolveText(
|
|
1798
|
+
resolveText(translate, { key: 'license.spots_remaining' }, '자리 남음')),
|
|
1402
1799
|
React.createElement("div", { className: "designbase-figma-page-license__usage-count" },
|
|
1403
1800
|
state.activationUsage,
|
|
1404
1801
|
"/",
|
|
1405
1802
|
state.activationLimit)),
|
|
1406
1803
|
React.createElement("div", { className: "designbase-figma-page-license__action" },
|
|
1407
1804
|
React.createElement(react.Button, { onPress: deactivateLicense, variant: "secondary", size: "s", fullWidth: true, disabled: isDeactivating }, isDeactivating
|
|
1408
|
-
? resolveText(
|
|
1409
|
-
: resolveText(
|
|
1805
|
+
? resolveText(translate, { key: 'license.deactivating' }, '비활성화 중...')
|
|
1806
|
+
: resolveText(translate, { key: 'license.deactivate' }, '라이선스 비활성화')),
|
|
1410
1807
|
state.deactivateMessage && (React.createElement("p", { className: `designbase-figma-page-license__action-feedback designbase-figma-page-license__action-feedback--${resolvePaymentFeedbackVariant(state.deactivateErrorCode)}`, role: state.deactivateErrorCode ? 'alert' : 'status', "aria-live": "polite" }, state.deactivateMessage))))))),
|
|
1411
1808
|
!isPaid && (React.createElement(React.Fragment, null,
|
|
1412
|
-
isMembershipMode && (React.createElement(LicenseOffer, { joinUrl: links.membershipUrl || links.purchaseUrl, guideUrl: links.helpUrl || links.purchaseUrl, t:
|
|
1809
|
+
isMembershipMode && (React.createElement(LicenseOffer, { joinUrl: links.membershipUrl || links.purchaseUrl, guideUrl: links.helpUrl || links.purchaseUrl, t: translate })),
|
|
1413
1810
|
!isMembershipMode && (enableAccountAuth || links.purchaseUrl || links.accountUrl) && (React.createElement("div", { className: "designbase-figma-page-license__section" },
|
|
1414
1811
|
React.createElement("div", { className: "designbase-figma-page-license__section-header" },
|
|
1415
|
-
React.createElement("h3", null, resolveText(
|
|
1416
|
-
React.createElement("p", { className: "designbase-figma-page-license__hint" }, resolveText(
|
|
1812
|
+
React.createElement("h3", null, resolveText(translate, { key: 'license.designbase_account' }, '디자인베이스 계정'))),
|
|
1813
|
+
React.createElement("p", { className: "designbase-figma-page-license__hint" }, resolveText(translate, { key: 'license.designbase_account_hint' }, 'WordPress 계정으로 로그인하거나 멤버십을 구매하면 플러그인이 자동으로 활성화됩니다.')),
|
|
1417
1814
|
React.createElement("div", { className: "designbase-figma-page-license__actions" },
|
|
1418
1815
|
enableAccountAuth && (React.createElement(react.Button, { onPress: startDesignbaseAuth, variant: "primary", size: "m", disabled: isStartingAuth || isVerifying, fullWidth: true }, isStartingAuth
|
|
1419
|
-
? resolveText(
|
|
1420
|
-
: resolveText(
|
|
1816
|
+
? resolveText(translate, { key: 'license.authenticating' }, '인증 중...')
|
|
1817
|
+
: resolveText(translate, { key: 'license.login_with_designbase' }, '디자인베이스로 로그인'))),
|
|
1421
1818
|
links.purchaseUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(links.purchaseUrl), variant: "secondary", size: "m", fullWidth: true },
|
|
1422
|
-
React.createElement("span", null, resolveText(
|
|
1819
|
+
React.createElement("span", null, resolveText(translate, { key: 'license.purchase_membership' }, '멤버십 안내')),
|
|
1423
1820
|
React.createElement(icons.ExternalLinkIcon, { size: 16 }))),
|
|
1424
1821
|
links.accountUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(links.accountUrl), variant: "tertiary", size: "s", fullWidth: true },
|
|
1425
|
-
React.createElement("span", null, resolveText(
|
|
1822
|
+
React.createElement("span", null, resolveText(translate, { key: 'license.manage_account' }, '계정·멤버십 관리')),
|
|
1426
1823
|
React.createElement(icons.ExternalLinkIcon, { size: 16 })))))),
|
|
1427
1824
|
showLicenseKeyInput && (React.createElement("div", { className: isMembershipMode
|
|
1428
1825
|
? 'designbase-figma-page-license__key-form'
|
|
1429
1826
|
: 'designbase-figma-page-license__section' },
|
|
1430
1827
|
React.createElement("div", { className: "designbase-figma-page-license__section-header" },
|
|
1431
|
-
React.createElement("h3", null, resolveText(
|
|
1432
|
-
React.createElement(FormWithSubmit, { onLicenseSubmit: handleLicenseSubmit, disabled: false, isSubmitting: isVerifying, value: licenseKeyDraft, onValueChange: handleLicenseKeyChange, label: { key: 'license.key' }, submitText: { key: 'license.submit' }, submittingText: { key: 'license.verifying' }, helperText: { key: isMembershipMode ? 'license.enter_from_youtube' : 'license.enter_from_email' }, t:
|
|
1828
|
+
React.createElement("h3", null, resolveText(translate, { key: 'license.enter_key' }, '라이선스 키 입력'))),
|
|
1829
|
+
React.createElement(FormWithSubmit, { onLicenseSubmit: handleLicenseSubmit, disabled: false, isSubmitting: isVerifying, value: licenseKeyDraft, onValueChange: handleLicenseKeyChange, label: { key: 'license.key' }, submitText: { key: 'license.submit' }, submittingText: { key: 'license.verifying' }, helperText: { key: isMembershipMode ? 'license.enter_from_youtube' : 'license.enter_from_email' }, t: translate }))))),
|
|
1433
1830
|
links.helpUrl && !isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__disclaimer" },
|
|
1434
|
-
React.createElement("button", { type: "button", className: "designbase-figma-page-license__link", onClick: () => openExternalUrl(links.helpUrl) }, resolveText(
|
|
1435
|
-
React.createElement(react.Button, { className: "designbase-figma-page-license__close", onPress: onClose, variant: "tertiary", size: "s", iconOnly: true, "aria-label":
|
|
1831
|
+
React.createElement("button", { type: "button", className: "designbase-figma-page-license__link", onClick: () => openExternalUrl(links.helpUrl) }, resolveText(translate, { key: 'license.help_link' }, '라이선스·결제 도움말'))))),
|
|
1832
|
+
React.createElement(react.Button, { className: "designbase-figma-page-license__close", onPress: onClose, variant: "tertiary", size: "s", iconOnly: true, "aria-label": translate('close') },
|
|
1436
1833
|
React.createElement(icons.CloseIcon, { size: 16 }))));
|
|
1437
1834
|
};
|
|
1438
1835
|
PageLicense.displayName = 'PageLicense';
|
|
1439
1836
|
|
|
1440
|
-
const PaymentBadge = ({ isActive, onClick, isLoading = false, text, t
|
|
1837
|
+
const PaymentBadge = ({ isActive, onClick, isLoading = false, text, t, locale, className, }) => {
|
|
1838
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
1441
1839
|
const getBadgeText = () => {
|
|
1442
1840
|
if (text)
|
|
1443
1841
|
return text;
|
|
1444
1842
|
return isActive
|
|
1445
|
-
? (
|
|
1446
|
-
: (
|
|
1843
|
+
? translate('proUser')
|
|
1844
|
+
: translate('usingFree');
|
|
1447
1845
|
};
|
|
1448
1846
|
const getBadgeVariant = () => {
|
|
1449
1847
|
return isActive ? 'success' : 'secondary';
|
|
@@ -1452,7 +1850,8 @@ const PaymentBadge = ({ isActive, onClick, isLoading = false, text, t = (key) =>
|
|
|
1452
1850
|
};
|
|
1453
1851
|
PaymentBadge.displayName = 'PaymentBadge';
|
|
1454
1852
|
|
|
1455
|
-
const ProgressModal = ({ isOpen, onClose, progress, title = { key: 'progress.working' }, completedMessage = { key: 'progress.completed' }, processingMessage = { key: 'progress.processing' }, stopButtonText = { key: 'progress.stop' }, confirmButtonText = { key: 'progress.confirm' }, helpText, onStop, onComplete, loadingIcon, completeIcon, className, t, autoComplete = true, autoCloseOnComplete = false }) => {
|
|
1853
|
+
const ProgressModal = ({ isOpen, onClose, progress, title = { key: 'progress.working' }, completedMessage = { key: 'progress.completed' }, processingMessage = { key: 'progress.processing' }, stopButtonText = { key: 'progress.stop' }, confirmButtonText = { key: 'progress.confirm' }, helpText, onStop, onComplete, loadingIcon, completeIcon, className, t, locale, autoComplete = true, autoCloseOnComplete = false }) => {
|
|
1854
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
1456
1855
|
const [isCompleted, setIsCompleted] = React.useState(false);
|
|
1457
1856
|
const completeFiredRef = React.useRef(false);
|
|
1458
1857
|
const { processedNodes, totalNodes } = progress;
|
|
@@ -1482,11 +1881,11 @@ const ProgressModal = ({ isOpen, onClose, progress, title = { key: 'progress.wor
|
|
|
1482
1881
|
onClose();
|
|
1483
1882
|
};
|
|
1484
1883
|
const modalClasses = clsx('designbase-figma-progress-modal', className);
|
|
1485
|
-
const displayTitle = resolveText(
|
|
1486
|
-
const displayMessage = resolveText(
|
|
1487
|
-
const displayStopText = resolveText(
|
|
1488
|
-
const displayConfirmText = resolveText(
|
|
1489
|
-
const displayHelpText = resolveText(
|
|
1884
|
+
const displayTitle = resolveText(translate, isCompleted ? completedMessage : title, isCompleted ? '완료되었습니다' : '작업 중');
|
|
1885
|
+
const displayMessage = resolveText(translate, isCompleted ? completedMessage : processingMessage, isCompleted ? '완료되었습니다' : '처리 중...');
|
|
1886
|
+
const displayStopText = resolveText(translate, stopButtonText, '중지');
|
|
1887
|
+
const displayConfirmText = resolveText(translate, confirmButtonText, '확인');
|
|
1888
|
+
const displayHelpText = resolveText(translate, helpText);
|
|
1490
1889
|
return (React.createElement(react.Modal, { isOpen: isOpen, onClose: isCompleted ? onClose : undefined, title: displayTitle, size: "s", className: modalClasses, showCloseButton: false },
|
|
1491
1890
|
React.createElement("div", { className: "designbase-figma-progress-modal__content" },
|
|
1492
1891
|
React.createElement("div", { className: "designbase-figma-progress-modal__icon", "aria-hidden": "true" }, isCompleted ? (completeIcon || (React.createElement("div", { className: "designbase-figma-progress-modal__icon-success" },
|
|
@@ -1540,7 +1939,8 @@ const ResizablePlugin = ({ children, minWidth = 360, maxWidth = 460, minHeight =
|
|
|
1540
1939
|
};
|
|
1541
1940
|
ResizablePlugin.displayName = 'ResizablePlugin';
|
|
1542
1941
|
|
|
1543
|
-
const SettingsModal = ({ isOpen, onClose, categories: initialCategories, categoryGroups, onSave, onReset, title = { key: 'settings.modal_title' }, description = { key: 'settings.modal_description' }, className, t }) => {
|
|
1942
|
+
const SettingsModal = ({ isOpen, onClose, categories: initialCategories, categoryGroups, onSave, onReset, title = { key: 'settings.modal_title' }, description = { key: 'settings.modal_description' }, className, t, locale, }) => {
|
|
1943
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
1544
1944
|
const [tempCategories, setTempCategories] = React.useState(initialCategories);
|
|
1545
1945
|
const [draggedIndex, setDraggedIndex] = React.useState(null);
|
|
1546
1946
|
React.useEffect(() => {
|
|
@@ -1633,8 +2033,8 @@ const SettingsModal = ({ isOpen, onClose, categories: initialCategories, categor
|
|
|
1633
2033
|
}
|
|
1634
2034
|
};
|
|
1635
2035
|
const modalClasses = clsx('designbase-figma-settings-modal', className);
|
|
1636
|
-
const displayTitle = resolveText(
|
|
1637
|
-
const displayDescription = resolveText(
|
|
2036
|
+
const displayTitle = resolveText(translate, title, '목록 변경');
|
|
2037
|
+
const displayDescription = resolveText(translate, description, '드래그하여 순서를 변경하거나, 토글하여 카테고리를 숨길 수 있습니다.');
|
|
1638
2038
|
return (React.createElement(react.Modal, { isOpen: isOpen, onClose: onClose, title: displayTitle, size: "m", className: modalClasses },
|
|
1639
2039
|
React.createElement("div", { className: "designbase-figma-settings-modal__content" },
|
|
1640
2040
|
displayDescription && (React.createElement("p", { className: "designbase-figma-settings-modal__description" }, displayDescription)),
|
|
@@ -1646,32 +2046,33 @@ const SettingsModal = ({ isOpen, onClose, categories: initialCategories, categor
|
|
|
1646
2046
|
React.createElement("span", { className: "designbase-figma-settings-modal__drag-handle" },
|
|
1647
2047
|
React.createElement(icons.GripVerticalIcon, { size: 16 })),
|
|
1648
2048
|
category.icon && (React.createElement("span", { className: "designbase-figma-settings-modal__category-icon" }, category.icon)),
|
|
1649
|
-
React.createElement("span", { className: "designbase-figma-settings-modal__category-title" }, resolveText(
|
|
2049
|
+
React.createElement("span", { className: "designbase-figma-settings-modal__category-title" }, resolveText(translate, category.title))),
|
|
1650
2050
|
React.createElement(react.Toggle, { checked: category.enabled, onChange: () => handleToggle(category.id), size: "s" })))))),
|
|
1651
2051
|
React.createElement("div", { className: "designbase-figma-settings-modal__footer" },
|
|
1652
|
-
onReset && (React.createElement(react.Button, { onPress: handleReset, variant: "tertiary", size: "s" }, resolveText(
|
|
2052
|
+
onReset && (React.createElement(react.Button, { onPress: handleReset, variant: "tertiary", size: "s" }, resolveText(translate, { key: 'settings.reset' }, '초기화'))),
|
|
1653
2053
|
React.createElement("div", { className: "designbase-figma-settings-modal__footer-right" },
|
|
1654
|
-
React.createElement(react.Button, { onPress: handleCancel, variant: "tertiary", size: "s" }, resolveText(
|
|
1655
|
-
React.createElement(react.Button, { onPress: handleSave, variant: "primary", size: "s" }, resolveText(
|
|
2054
|
+
React.createElement(react.Button, { onPress: handleCancel, variant: "tertiary", size: "s" }, resolveText(translate, { key: 'settings.cancel' }, '취소')),
|
|
2055
|
+
React.createElement(react.Button, { onPress: handleSave, variant: "primary", size: "s" }, resolveText(translate, { key: 'settings.save' }, '저장'))))));
|
|
1656
2056
|
};
|
|
1657
2057
|
SettingsModal.displayName = 'SettingsModal';
|
|
1658
2058
|
|
|
1659
|
-
const TitleDescription = ({ iconSrc, iconAlt = 'Icon', title, description, button, features, className, t }) => {
|
|
2059
|
+
const TitleDescription = ({ iconSrc, iconAlt = 'Icon', title, description, button, features, className, t, locale, }) => {
|
|
2060
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
1660
2061
|
const classes = [
|
|
1661
2062
|
'designbase-figma-title-description',
|
|
1662
2063
|
className,
|
|
1663
2064
|
]
|
|
1664
2065
|
.filter(Boolean)
|
|
1665
2066
|
.join(' ');
|
|
1666
|
-
const displayTitle = resolveText(
|
|
1667
|
-
const displayDescription = resolveText(
|
|
2067
|
+
const displayTitle = resolveText(translate, title);
|
|
2068
|
+
const displayDescription = resolveText(translate, description);
|
|
1668
2069
|
return (React.createElement("div", { className: classes },
|
|
1669
2070
|
iconSrc && (React.createElement("img", { className: "designbase-figma-title-description__icon", src: iconSrc, alt: iconAlt })),
|
|
1670
2071
|
React.createElement("h5", { className: "designbase-figma-title-description__title" }, displayTitle),
|
|
1671
2072
|
React.createElement("p", { className: "designbase-figma-title-description__description" }, displayDescription),
|
|
1672
2073
|
button && React.createElement("div", { className: "designbase-figma-title-description__button" }, button),
|
|
1673
2074
|
features && features.length > 0 && (React.createElement("ul", { className: "designbase-figma-title-description__features" }, features.map((feature, index) => {
|
|
1674
|
-
const displayFeature = resolveText(
|
|
2075
|
+
const displayFeature = resolveText(translate, feature);
|
|
1675
2076
|
return (React.createElement("li", { key: index, className: "designbase-figma-title-description__feature-item" },
|
|
1676
2077
|
React.createElement("span", { className: "designbase-figma-title-description__check-icon" },
|
|
1677
2078
|
React.createElement("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
@@ -1682,10 +2083,11 @@ const TitleDescription = ({ iconSrc, iconAlt = 'Icon', title, description, butto
|
|
|
1682
2083
|
};
|
|
1683
2084
|
TitleDescription.displayName = 'TitleDescription';
|
|
1684
2085
|
|
|
1685
|
-
const UpgradeBanner = ({ onClick, variant = 'button', isLoading = false, title = { key: 'banner.upgrade_title' }, description = { key: 'banner.upgrade_description' }, buttonText = { key: 'banner.upgrade_button' }, useGradient = false, gradientScheme = 'primary', gradientTone = 'light', gradientAnimated = true, className, t }) => {
|
|
1686
|
-
const
|
|
1687
|
-
const
|
|
1688
|
-
const
|
|
2086
|
+
const UpgradeBanner = ({ onClick, variant = 'button', isLoading = false, title = { key: 'banner.upgrade_title' }, description = { key: 'banner.upgrade_description' }, buttonText = { key: 'banner.upgrade_button' }, useGradient = false, gradientScheme = 'primary', gradientTone = 'light', gradientAnimated = true, className, t, locale, }) => {
|
|
2087
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
2088
|
+
const displayTitle = resolveText(translate, title, '프로로 업그레이드하세요');
|
|
2089
|
+
const displayDescription = resolveText(translate, description, '무제한 기능을 사용하고 더 많은 혜택을 누리세요.');
|
|
2090
|
+
const displayButtonText = resolveText(translate, buttonText, '지금 업그레이드');
|
|
1689
2091
|
const bannerContent = (React.createElement("div", { className: `designbase-figma-upgrade-banner__content designbase-figma-upgrade-banner__content--${variant}`, onClick: variant === 'clickable' ? onClick : undefined, role: variant === 'clickable' ? 'button' : undefined, tabIndex: variant === 'clickable' ? 0 : undefined, onKeyDown: variant === 'clickable' ? (e) => {
|
|
1690
2092
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
1691
2093
|
e.preventDefault();
|
|
@@ -1701,540 +2103,544 @@ const UpgradeBanner = ({ onClick, variant = 'button', isLoading = false, title =
|
|
|
1701
2103
|
};
|
|
1702
2104
|
UpgradeBanner.displayName = 'UpgradeBanner';
|
|
1703
2105
|
|
|
1704
|
-
Object.defineProperty(exports,
|
|
2106
|
+
Object.defineProperty(exports, "Accordion", {
|
|
1705
2107
|
enumerable: true,
|
|
1706
2108
|
get: function () { return react.Accordion; }
|
|
1707
2109
|
});
|
|
1708
|
-
Object.defineProperty(exports,
|
|
2110
|
+
Object.defineProperty(exports, "ActivityHeatmap", {
|
|
1709
2111
|
enumerable: true,
|
|
1710
2112
|
get: function () { return react.ActivityHeatmap; }
|
|
1711
2113
|
});
|
|
1712
|
-
Object.defineProperty(exports,
|
|
2114
|
+
Object.defineProperty(exports, "AdBanner", {
|
|
1713
2115
|
enumerable: true,
|
|
1714
2116
|
get: function () { return react.AdBanner; }
|
|
1715
2117
|
});
|
|
1716
|
-
Object.defineProperty(exports,
|
|
2118
|
+
Object.defineProperty(exports, "AiChat", {
|
|
1717
2119
|
enumerable: true,
|
|
1718
2120
|
get: function () { return react.AiChat; }
|
|
1719
2121
|
});
|
|
1720
|
-
Object.defineProperty(exports,
|
|
2122
|
+
Object.defineProperty(exports, "AiChatList", {
|
|
1721
2123
|
enumerable: true,
|
|
1722
2124
|
get: function () { return react.AiChatList; }
|
|
1723
2125
|
});
|
|
1724
|
-
Object.defineProperty(exports,
|
|
2126
|
+
Object.defineProperty(exports, "Alert", {
|
|
1725
2127
|
enumerable: true,
|
|
1726
2128
|
get: function () { return react.Alert; }
|
|
1727
2129
|
});
|
|
1728
|
-
Object.defineProperty(exports,
|
|
2130
|
+
Object.defineProperty(exports, "AnimationBackground", {
|
|
1729
2131
|
enumerable: true,
|
|
1730
2132
|
get: function () { return react.AnimationBackground; }
|
|
1731
2133
|
});
|
|
1732
|
-
Object.defineProperty(exports,
|
|
2134
|
+
Object.defineProperty(exports, "AnimationText", {
|
|
1733
2135
|
enumerable: true,
|
|
1734
2136
|
get: function () { return react.AnimationText; }
|
|
1735
2137
|
});
|
|
1736
|
-
Object.defineProperty(exports,
|
|
2138
|
+
Object.defineProperty(exports, "AppBadge", {
|
|
1737
2139
|
enumerable: true,
|
|
1738
2140
|
get: function () { return react.AppBadge; }
|
|
1739
2141
|
});
|
|
1740
|
-
Object.defineProperty(exports,
|
|
2142
|
+
Object.defineProperty(exports, "AudioPlayer", {
|
|
1741
2143
|
enumerable: true,
|
|
1742
2144
|
get: function () { return react.AudioPlayer; }
|
|
1743
2145
|
});
|
|
1744
|
-
Object.defineProperty(exports,
|
|
2146
|
+
Object.defineProperty(exports, "Avatar", {
|
|
1745
2147
|
enumerable: true,
|
|
1746
2148
|
get: function () { return react.Avatar; }
|
|
1747
2149
|
});
|
|
1748
|
-
Object.defineProperty(exports,
|
|
2150
|
+
Object.defineProperty(exports, "Backdrop", {
|
|
1749
2151
|
enumerable: true,
|
|
1750
2152
|
get: function () { return react.Backdrop; }
|
|
1751
2153
|
});
|
|
1752
|
-
Object.defineProperty(exports,
|
|
2154
|
+
Object.defineProperty(exports, "Badge", {
|
|
1753
2155
|
enumerable: true,
|
|
1754
2156
|
get: function () { return react.Badge; }
|
|
1755
2157
|
});
|
|
1756
|
-
Object.defineProperty(exports,
|
|
2158
|
+
Object.defineProperty(exports, "Banner", {
|
|
1757
2159
|
enumerable: true,
|
|
1758
2160
|
get: function () { return react.Banner; }
|
|
1759
2161
|
});
|
|
1760
|
-
Object.defineProperty(exports,
|
|
2162
|
+
Object.defineProperty(exports, "BottomNavigation", {
|
|
1761
2163
|
enumerable: true,
|
|
1762
2164
|
get: function () { return react.BottomNavigation; }
|
|
1763
2165
|
});
|
|
1764
|
-
Object.defineProperty(exports,
|
|
2166
|
+
Object.defineProperty(exports, "BottomSheet", {
|
|
1765
2167
|
enumerable: true,
|
|
1766
2168
|
get: function () { return react.BottomSheet; }
|
|
1767
2169
|
});
|
|
1768
|
-
Object.defineProperty(exports,
|
|
2170
|
+
Object.defineProperty(exports, "Breadcrumbs", {
|
|
1769
2171
|
enumerable: true,
|
|
1770
2172
|
get: function () { return react.Breadcrumbs; }
|
|
1771
2173
|
});
|
|
1772
|
-
Object.defineProperty(exports,
|
|
2174
|
+
Object.defineProperty(exports, "Button", {
|
|
1773
2175
|
enumerable: true,
|
|
1774
2176
|
get: function () { return react.Button; }
|
|
1775
2177
|
});
|
|
1776
|
-
Object.defineProperty(exports,
|
|
2178
|
+
Object.defineProperty(exports, "Calendar", {
|
|
1777
2179
|
enumerable: true,
|
|
1778
2180
|
get: function () { return react.Calendar; }
|
|
1779
2181
|
});
|
|
1780
|
-
Object.defineProperty(exports,
|
|
2182
|
+
Object.defineProperty(exports, "Card", {
|
|
1781
2183
|
enumerable: true,
|
|
1782
2184
|
get: function () { return react.Card; }
|
|
1783
2185
|
});
|
|
1784
|
-
Object.defineProperty(exports,
|
|
2186
|
+
Object.defineProperty(exports, "Carousel", {
|
|
1785
2187
|
enumerable: true,
|
|
1786
2188
|
get: function () { return react.Carousel; }
|
|
1787
2189
|
});
|
|
1788
|
-
Object.defineProperty(exports,
|
|
2190
|
+
Object.defineProperty(exports, "ChatComposer", {
|
|
1789
2191
|
enumerable: true,
|
|
1790
2192
|
get: function () { return react.ChatComposer; }
|
|
1791
2193
|
});
|
|
1792
|
-
Object.defineProperty(exports,
|
|
2194
|
+
Object.defineProperty(exports, "ChatList", {
|
|
1793
2195
|
enumerable: true,
|
|
1794
2196
|
get: function () { return react.ChatList; }
|
|
1795
2197
|
});
|
|
1796
|
-
Object.defineProperty(exports,
|
|
2198
|
+
Object.defineProperty(exports, "ChatMessage", {
|
|
1797
2199
|
enumerable: true,
|
|
1798
2200
|
get: function () { return react.ChatMessage; }
|
|
1799
2201
|
});
|
|
1800
|
-
Object.defineProperty(exports,
|
|
2202
|
+
Object.defineProperty(exports, "ChatOrb", {
|
|
1801
2203
|
enumerable: true,
|
|
1802
2204
|
get: function () { return react.ChatOrb; }
|
|
1803
2205
|
});
|
|
1804
|
-
Object.defineProperty(exports,
|
|
2206
|
+
Object.defineProperty(exports, "ChatRoom", {
|
|
1805
2207
|
enumerable: true,
|
|
1806
2208
|
get: function () { return react.ChatRoom; }
|
|
1807
2209
|
});
|
|
1808
|
-
Object.defineProperty(exports,
|
|
2210
|
+
Object.defineProperty(exports, "ChatSuggestions", {
|
|
1809
2211
|
enumerable: true,
|
|
1810
2212
|
get: function () { return react.ChatSuggestions; }
|
|
1811
2213
|
});
|
|
1812
|
-
Object.defineProperty(exports,
|
|
2214
|
+
Object.defineProperty(exports, "ChatTyping", {
|
|
1813
2215
|
enumerable: true,
|
|
1814
2216
|
get: function () { return react.ChatTyping; }
|
|
1815
2217
|
});
|
|
1816
|
-
Object.defineProperty(exports,
|
|
2218
|
+
Object.defineProperty(exports, "ChatWelcome", {
|
|
1817
2219
|
enumerable: true,
|
|
1818
2220
|
get: function () { return react.ChatWelcome; }
|
|
1819
2221
|
});
|
|
1820
|
-
Object.defineProperty(exports,
|
|
2222
|
+
Object.defineProperty(exports, "ChatWidget", {
|
|
1821
2223
|
enumerable: true,
|
|
1822
2224
|
get: function () { return react.ChatWidget; }
|
|
1823
2225
|
});
|
|
1824
|
-
Object.defineProperty(exports,
|
|
2226
|
+
Object.defineProperty(exports, "Checkbox", {
|
|
1825
2227
|
enumerable: true,
|
|
1826
2228
|
get: function () { return react.Checkbox; }
|
|
1827
2229
|
});
|
|
1828
|
-
Object.defineProperty(exports,
|
|
2230
|
+
Object.defineProperty(exports, "Chip", {
|
|
1829
2231
|
enumerable: true,
|
|
1830
2232
|
get: function () { return react.Chip; }
|
|
1831
2233
|
});
|
|
1832
|
-
Object.defineProperty(exports,
|
|
2234
|
+
Object.defineProperty(exports, "CodeBlock", {
|
|
1833
2235
|
enumerable: true,
|
|
1834
2236
|
get: function () { return react.CodeBlock; }
|
|
1835
2237
|
});
|
|
1836
|
-
Object.defineProperty(exports,
|
|
2238
|
+
Object.defineProperty(exports, "ColorPicker", {
|
|
1837
2239
|
enumerable: true,
|
|
1838
2240
|
get: function () { return react.ColorPicker; }
|
|
1839
2241
|
});
|
|
1840
|
-
Object.defineProperty(exports,
|
|
2242
|
+
Object.defineProperty(exports, "ColorSwatch", {
|
|
1841
2243
|
enumerable: true,
|
|
1842
2244
|
get: function () { return react.ColorSwatch; }
|
|
1843
2245
|
});
|
|
1844
|
-
Object.defineProperty(exports,
|
|
2246
|
+
Object.defineProperty(exports, "Confirm", {
|
|
1845
2247
|
enumerable: true,
|
|
1846
2248
|
get: function () { return react.Confirm; }
|
|
1847
2249
|
});
|
|
1848
|
-
Object.defineProperty(exports,
|
|
2250
|
+
Object.defineProperty(exports, "Container", {
|
|
1849
2251
|
enumerable: true,
|
|
1850
2252
|
get: function () { return react.Container; }
|
|
1851
2253
|
});
|
|
1852
|
-
Object.defineProperty(exports,
|
|
2254
|
+
Object.defineProperty(exports, "ContextMenu", {
|
|
1853
2255
|
enumerable: true,
|
|
1854
2256
|
get: function () { return react.ContextMenu; }
|
|
1855
2257
|
});
|
|
1856
|
-
Object.defineProperty(exports,
|
|
2258
|
+
Object.defineProperty(exports, "CookieBanner", {
|
|
1857
2259
|
enumerable: true,
|
|
1858
2260
|
get: function () { return react.CookieBanner; }
|
|
1859
2261
|
});
|
|
1860
|
-
Object.defineProperty(exports,
|
|
2262
|
+
Object.defineProperty(exports, "Countdown", {
|
|
1861
2263
|
enumerable: true,
|
|
1862
2264
|
get: function () { return react.Countdown; }
|
|
1863
2265
|
});
|
|
1864
|
-
Object.defineProperty(exports,
|
|
2266
|
+
Object.defineProperty(exports, "CursorFollower", {
|
|
1865
2267
|
enumerable: true,
|
|
1866
2268
|
get: function () { return react.CursorFollower; }
|
|
1867
2269
|
});
|
|
1868
|
-
Object.defineProperty(exports,
|
|
2270
|
+
Object.defineProperty(exports, "DatePicker", {
|
|
1869
2271
|
enumerable: true,
|
|
1870
2272
|
get: function () { return react.DatePicker; }
|
|
1871
2273
|
});
|
|
1872
|
-
Object.defineProperty(exports,
|
|
2274
|
+
Object.defineProperty(exports, "Divider", {
|
|
1873
2275
|
enumerable: true,
|
|
1874
2276
|
get: function () { return react.Divider; }
|
|
1875
2277
|
});
|
|
1876
|
-
Object.defineProperty(exports,
|
|
2278
|
+
Object.defineProperty(exports, "DownloadProgress", {
|
|
1877
2279
|
enumerable: true,
|
|
1878
2280
|
get: function () { return react.DownloadProgress; }
|
|
1879
2281
|
});
|
|
1880
|
-
Object.defineProperty(exports,
|
|
2282
|
+
Object.defineProperty(exports, "Drawer", {
|
|
1881
2283
|
enumerable: true,
|
|
1882
2284
|
get: function () { return react.Drawer; }
|
|
1883
2285
|
});
|
|
1884
|
-
Object.defineProperty(exports,
|
|
2286
|
+
Object.defineProperty(exports, "Dropdown", {
|
|
1885
2287
|
enumerable: true,
|
|
1886
2288
|
get: function () { return react.Dropdown; }
|
|
1887
2289
|
});
|
|
1888
|
-
Object.defineProperty(exports,
|
|
2290
|
+
Object.defineProperty(exports, "Dropzone", {
|
|
1889
2291
|
enumerable: true,
|
|
1890
2292
|
get: function () { return react.Dropzone; }
|
|
1891
2293
|
});
|
|
1892
|
-
Object.defineProperty(exports,
|
|
2294
|
+
Object.defineProperty(exports, "EmailVerify", {
|
|
1893
2295
|
enumerable: true,
|
|
1894
2296
|
get: function () { return react.EmailVerify; }
|
|
1895
2297
|
});
|
|
1896
|
-
Object.defineProperty(exports,
|
|
2298
|
+
Object.defineProperty(exports, "EmptyState", {
|
|
1897
2299
|
enumerable: true,
|
|
1898
2300
|
get: function () { return react.EmptyState; }
|
|
1899
2301
|
});
|
|
1900
|
-
Object.defineProperty(exports,
|
|
2302
|
+
Object.defineProperty(exports, "FileUploader", {
|
|
1901
2303
|
enumerable: true,
|
|
1902
2304
|
get: function () { return react.FileUploader; }
|
|
1903
2305
|
});
|
|
1904
|
-
Object.defineProperty(exports,
|
|
2306
|
+
Object.defineProperty(exports, "FloatingActionButton", {
|
|
1905
2307
|
enumerable: true,
|
|
1906
2308
|
get: function () { return react.FloatingActionButton; }
|
|
1907
2309
|
});
|
|
1908
|
-
Object.defineProperty(exports,
|
|
2310
|
+
Object.defineProperty(exports, "Footer", {
|
|
1909
2311
|
enumerable: true,
|
|
1910
2312
|
get: function () { return react.Footer; }
|
|
1911
2313
|
});
|
|
1912
|
-
Object.defineProperty(exports,
|
|
2314
|
+
Object.defineProperty(exports, "Form", {
|
|
1913
2315
|
enumerable: true,
|
|
1914
2316
|
get: function () { return react.Form; }
|
|
1915
2317
|
});
|
|
1916
|
-
Object.defineProperty(exports,
|
|
2318
|
+
Object.defineProperty(exports, "Gantt", {
|
|
1917
2319
|
enumerable: true,
|
|
1918
2320
|
get: function () { return react.Gantt; }
|
|
1919
2321
|
});
|
|
1920
|
-
Object.defineProperty(exports,
|
|
2322
|
+
Object.defineProperty(exports, "Gradient", {
|
|
1921
2323
|
enumerable: true,
|
|
1922
2324
|
get: function () { return react.Gradient; }
|
|
1923
2325
|
});
|
|
1924
|
-
Object.defineProperty(exports,
|
|
2326
|
+
Object.defineProperty(exports, "Grid", {
|
|
1925
2327
|
enumerable: true,
|
|
1926
2328
|
get: function () { return react.Grid; }
|
|
1927
2329
|
});
|
|
1928
|
-
Object.defineProperty(exports,
|
|
2330
|
+
Object.defineProperty(exports, "GridBackground", {
|
|
1929
2331
|
enumerable: true,
|
|
1930
2332
|
get: function () { return react.GridBackground; }
|
|
1931
2333
|
});
|
|
1932
|
-
Object.defineProperty(exports,
|
|
2334
|
+
Object.defineProperty(exports, "GridItem", {
|
|
1933
2335
|
enumerable: true,
|
|
1934
2336
|
get: function () { return react.GridItem; }
|
|
1935
2337
|
});
|
|
1936
|
-
Object.defineProperty(exports,
|
|
2338
|
+
Object.defineProperty(exports, "Image", {
|
|
1937
2339
|
enumerable: true,
|
|
1938
2340
|
get: function () { return react.Image; }
|
|
1939
2341
|
});
|
|
1940
|
-
Object.defineProperty(exports,
|
|
2342
|
+
Object.defineProperty(exports, "ImageList", {
|
|
1941
2343
|
enumerable: true,
|
|
1942
2344
|
get: function () { return react.ImageList; }
|
|
1943
2345
|
});
|
|
1944
|
-
Object.defineProperty(exports,
|
|
2346
|
+
Object.defineProperty(exports, "ImagePlaceholder", {
|
|
1945
2347
|
enumerable: true,
|
|
1946
2348
|
get: function () { return react.ImagePlaceholder; }
|
|
1947
2349
|
});
|
|
1948
|
-
Object.defineProperty(exports,
|
|
2350
|
+
Object.defineProperty(exports, "Indicator", {
|
|
1949
2351
|
enumerable: true,
|
|
1950
2352
|
get: function () { return react.Indicator; }
|
|
1951
2353
|
});
|
|
1952
|
-
Object.defineProperty(exports,
|
|
2354
|
+
Object.defineProperty(exports, "Input", {
|
|
1953
2355
|
enumerable: true,
|
|
1954
2356
|
get: function () { return react.Input; }
|
|
1955
2357
|
});
|
|
1956
|
-
Object.defineProperty(exports,
|
|
2358
|
+
Object.defineProperty(exports, "Kanban", {
|
|
1957
2359
|
enumerable: true,
|
|
1958
2360
|
get: function () { return react.Kanban; }
|
|
1959
2361
|
});
|
|
1960
|
-
Object.defineProperty(exports,
|
|
2362
|
+
Object.defineProperty(exports, "Label", {
|
|
1961
2363
|
enumerable: true,
|
|
1962
2364
|
get: function () { return react.Label; }
|
|
1963
2365
|
});
|
|
1964
|
-
Object.defineProperty(exports,
|
|
2366
|
+
Object.defineProperty(exports, "Lightbox", {
|
|
1965
2367
|
enumerable: true,
|
|
1966
2368
|
get: function () { return react.Lightbox; }
|
|
1967
2369
|
});
|
|
1968
|
-
Object.defineProperty(exports,
|
|
2370
|
+
Object.defineProperty(exports, "List", {
|
|
1969
2371
|
enumerable: true,
|
|
1970
2372
|
get: function () { return react.List; }
|
|
1971
2373
|
});
|
|
1972
|
-
Object.defineProperty(exports,
|
|
2374
|
+
Object.defineProperty(exports, "Logo", {
|
|
1973
2375
|
enumerable: true,
|
|
1974
2376
|
get: function () { return react.Logo; }
|
|
1975
2377
|
});
|
|
1976
|
-
Object.defineProperty(exports,
|
|
2378
|
+
Object.defineProperty(exports, "MarkdownEditor", {
|
|
1977
2379
|
enumerable: true,
|
|
1978
2380
|
get: function () { return react.MarkdownEditor; }
|
|
1979
2381
|
});
|
|
1980
|
-
Object.defineProperty(exports,
|
|
2382
|
+
Object.defineProperty(exports, "Marquee", {
|
|
1981
2383
|
enumerable: true,
|
|
1982
2384
|
get: function () { return react.Marquee; }
|
|
1983
2385
|
});
|
|
1984
|
-
Object.defineProperty(exports,
|
|
2386
|
+
Object.defineProperty(exports, "Masonry", {
|
|
1985
2387
|
enumerable: true,
|
|
1986
2388
|
get: function () { return react.Masonry; }
|
|
1987
2389
|
});
|
|
1988
|
-
Object.defineProperty(exports,
|
|
2390
|
+
Object.defineProperty(exports, "MenuItem", {
|
|
1989
2391
|
enumerable: true,
|
|
1990
2392
|
get: function () { return react.MenuItem; }
|
|
1991
2393
|
});
|
|
1992
|
-
Object.defineProperty(exports,
|
|
2394
|
+
Object.defineProperty(exports, "Modal", {
|
|
1993
2395
|
enumerable: true,
|
|
1994
2396
|
get: function () { return react.Modal; }
|
|
1995
2397
|
});
|
|
1996
|
-
Object.defineProperty(exports,
|
|
2398
|
+
Object.defineProperty(exports, "ModalBody", {
|
|
1997
2399
|
enumerable: true,
|
|
1998
2400
|
get: function () { return react.ModalBody; }
|
|
1999
2401
|
});
|
|
2000
|
-
Object.defineProperty(exports,
|
|
2402
|
+
Object.defineProperty(exports, "ModalFooter", {
|
|
2001
2403
|
enumerable: true,
|
|
2002
2404
|
get: function () { return react.ModalFooter; }
|
|
2003
2405
|
});
|
|
2004
|
-
Object.defineProperty(exports,
|
|
2406
|
+
Object.defineProperty(exports, "ModalHeader", {
|
|
2005
2407
|
enumerable: true,
|
|
2006
2408
|
get: function () { return react.ModalHeader; }
|
|
2007
2409
|
});
|
|
2008
|
-
Object.defineProperty(exports,
|
|
2410
|
+
Object.defineProperty(exports, "Navbar", {
|
|
2009
2411
|
enumerable: true,
|
|
2010
2412
|
get: function () { return react.Navbar; }
|
|
2011
2413
|
});
|
|
2012
|
-
Object.defineProperty(exports,
|
|
2414
|
+
Object.defineProperty(exports, "OnboardingModal", {
|
|
2013
2415
|
enumerable: true,
|
|
2014
2416
|
get: function () { return react.OnboardingModal; }
|
|
2015
2417
|
});
|
|
2016
|
-
Object.defineProperty(exports,
|
|
2418
|
+
Object.defineProperty(exports, "OtpInput", {
|
|
2017
2419
|
enumerable: true,
|
|
2018
2420
|
get: function () { return react.OtpInput; }
|
|
2019
2421
|
});
|
|
2020
|
-
Object.defineProperty(exports,
|
|
2422
|
+
Object.defineProperty(exports, "PageHeader", {
|
|
2021
2423
|
enumerable: true,
|
|
2022
2424
|
get: function () { return react.PageHeader; }
|
|
2023
2425
|
});
|
|
2024
|
-
Object.defineProperty(exports,
|
|
2426
|
+
Object.defineProperty(exports, "Pagination", {
|
|
2025
2427
|
enumerable: true,
|
|
2026
2428
|
get: function () { return react.Pagination; }
|
|
2027
2429
|
});
|
|
2028
|
-
Object.defineProperty(exports,
|
|
2430
|
+
Object.defineProperty(exports, "PhoneVerify", {
|
|
2029
2431
|
enumerable: true,
|
|
2030
2432
|
get: function () { return react.PhoneVerify; }
|
|
2031
2433
|
});
|
|
2032
|
-
Object.defineProperty(exports,
|
|
2434
|
+
Object.defineProperty(exports, "Popover", {
|
|
2033
2435
|
enumerable: true,
|
|
2034
2436
|
get: function () { return react.Popover; }
|
|
2035
2437
|
});
|
|
2036
|
-
Object.defineProperty(exports,
|
|
2438
|
+
Object.defineProperty(exports, "Progress", {
|
|
2037
2439
|
enumerable: true,
|
|
2038
2440
|
get: function () { return react.Progress; }
|
|
2039
2441
|
});
|
|
2040
|
-
Object.defineProperty(exports,
|
|
2442
|
+
Object.defineProperty(exports, "ProgressStep", {
|
|
2041
2443
|
enumerable: true,
|
|
2042
2444
|
get: function () { return react.ProgressStep; }
|
|
2043
2445
|
});
|
|
2044
|
-
Object.defineProperty(exports,
|
|
2446
|
+
Object.defineProperty(exports, "Progressbar", {
|
|
2045
2447
|
enumerable: true,
|
|
2046
2448
|
get: function () { return react.Progressbar; }
|
|
2047
2449
|
});
|
|
2048
|
-
Object.defineProperty(exports,
|
|
2450
|
+
Object.defineProperty(exports, "Radio", {
|
|
2049
2451
|
enumerable: true,
|
|
2050
2452
|
get: function () { return react.Radio; }
|
|
2051
2453
|
});
|
|
2052
|
-
Object.defineProperty(exports,
|
|
2454
|
+
Object.defineProperty(exports, "RandomGradient", {
|
|
2053
2455
|
enumerable: true,
|
|
2054
2456
|
get: function () { return react.RandomGradient; }
|
|
2055
2457
|
});
|
|
2056
|
-
Object.defineProperty(exports,
|
|
2458
|
+
Object.defineProperty(exports, "RangeSlider", {
|
|
2057
2459
|
enumerable: true,
|
|
2058
2460
|
get: function () { return react.RangeSlider; }
|
|
2059
2461
|
});
|
|
2060
|
-
Object.defineProperty(exports,
|
|
2462
|
+
Object.defineProperty(exports, "Rating", {
|
|
2061
2463
|
enumerable: true,
|
|
2062
2464
|
get: function () { return react.Rating; }
|
|
2063
2465
|
});
|
|
2064
|
-
Object.defineProperty(exports,
|
|
2466
|
+
Object.defineProperty(exports, "Reorder", {
|
|
2065
2467
|
enumerable: true,
|
|
2066
2468
|
get: function () { return react.Reorder; }
|
|
2067
2469
|
});
|
|
2068
|
-
Object.defineProperty(exports,
|
|
2470
|
+
Object.defineProperty(exports, "ResizablePanels", {
|
|
2069
2471
|
enumerable: true,
|
|
2070
2472
|
get: function () { return react.ResizablePanels; }
|
|
2071
2473
|
});
|
|
2072
|
-
Object.defineProperty(exports,
|
|
2474
|
+
Object.defineProperty(exports, "ScrollArea", {
|
|
2073
2475
|
enumerable: true,
|
|
2074
2476
|
get: function () { return react.ScrollArea; }
|
|
2075
2477
|
});
|
|
2076
|
-
Object.defineProperty(exports,
|
|
2478
|
+
Object.defineProperty(exports, "SearchBar", {
|
|
2077
2479
|
enumerable: true,
|
|
2078
2480
|
get: function () { return react.SearchBar; }
|
|
2079
2481
|
});
|
|
2080
|
-
Object.defineProperty(exports,
|
|
2482
|
+
Object.defineProperty(exports, "Section", {
|
|
2081
2483
|
enumerable: true,
|
|
2082
2484
|
get: function () { return react.Section; }
|
|
2083
2485
|
});
|
|
2084
|
-
Object.defineProperty(exports,
|
|
2486
|
+
Object.defineProperty(exports, "SectionAppDownload", {
|
|
2085
2487
|
enumerable: true,
|
|
2086
2488
|
get: function () { return react.SectionAppDownload; }
|
|
2087
2489
|
});
|
|
2088
|
-
Object.defineProperty(exports,
|
|
2490
|
+
Object.defineProperty(exports, "SectionContact", {
|
|
2089
2491
|
enumerable: true,
|
|
2090
2492
|
get: function () { return react.SectionContact; }
|
|
2091
2493
|
});
|
|
2092
|
-
Object.defineProperty(exports,
|
|
2494
|
+
Object.defineProperty(exports, "SectionCta", {
|
|
2093
2495
|
enumerable: true,
|
|
2094
2496
|
get: function () { return react.SectionCta; }
|
|
2095
2497
|
});
|
|
2096
|
-
Object.defineProperty(exports,
|
|
2498
|
+
Object.defineProperty(exports, "SectionFaq", {
|
|
2097
2499
|
enumerable: true,
|
|
2098
2500
|
get: function () { return react.SectionFaq; }
|
|
2099
2501
|
});
|
|
2100
|
-
Object.defineProperty(exports,
|
|
2502
|
+
Object.defineProperty(exports, "SectionFeature", {
|
|
2101
2503
|
enumerable: true,
|
|
2102
2504
|
get: function () { return react.SectionFeature; }
|
|
2103
2505
|
});
|
|
2104
|
-
Object.defineProperty(exports,
|
|
2506
|
+
Object.defineProperty(exports, "SectionFeatureGrid", {
|
|
2105
2507
|
enumerable: true,
|
|
2106
2508
|
get: function () { return react.SectionFeatureGrid; }
|
|
2107
2509
|
});
|
|
2108
|
-
Object.defineProperty(exports,
|
|
2510
|
+
Object.defineProperty(exports, "SectionHero", {
|
|
2109
2511
|
enumerable: true,
|
|
2110
2512
|
get: function () { return react.SectionHero; }
|
|
2111
2513
|
});
|
|
2112
|
-
Object.defineProperty(exports,
|
|
2514
|
+
Object.defineProperty(exports, "SectionLogoCloud", {
|
|
2113
2515
|
enumerable: true,
|
|
2114
2516
|
get: function () { return react.SectionLogoCloud; }
|
|
2115
2517
|
});
|
|
2116
|
-
Object.defineProperty(exports,
|
|
2518
|
+
Object.defineProperty(exports, "SectionPricing", {
|
|
2117
2519
|
enumerable: true,
|
|
2118
2520
|
get: function () { return react.SectionPricing; }
|
|
2119
2521
|
});
|
|
2120
|
-
Object.defineProperty(exports,
|
|
2522
|
+
Object.defineProperty(exports, "SectionStats", {
|
|
2121
2523
|
enumerable: true,
|
|
2122
2524
|
get: function () { return react.SectionStats; }
|
|
2123
2525
|
});
|
|
2124
|
-
Object.defineProperty(exports,
|
|
2526
|
+
Object.defineProperty(exports, "SectionTestimonials", {
|
|
2125
2527
|
enumerable: true,
|
|
2126
2528
|
get: function () { return react.SectionTestimonials; }
|
|
2127
2529
|
});
|
|
2128
|
-
Object.defineProperty(exports,
|
|
2530
|
+
Object.defineProperty(exports, "SegmentControl", {
|
|
2129
2531
|
enumerable: true,
|
|
2130
2532
|
get: function () { return react.SegmentControl; }
|
|
2131
2533
|
});
|
|
2132
|
-
Object.defineProperty(exports,
|
|
2534
|
+
Object.defineProperty(exports, "Select", {
|
|
2133
2535
|
enumerable: true,
|
|
2134
2536
|
get: function () { return react.Select; }
|
|
2135
2537
|
});
|
|
2136
|
-
Object.defineProperty(exports,
|
|
2538
|
+
Object.defineProperty(exports, "Share", {
|
|
2137
2539
|
enumerable: true,
|
|
2138
2540
|
get: function () { return react.Share; }
|
|
2139
2541
|
});
|
|
2140
|
-
Object.defineProperty(exports,
|
|
2542
|
+
Object.defineProperty(exports, "Sidebar", {
|
|
2141
2543
|
enumerable: true,
|
|
2142
2544
|
get: function () { return react.Sidebar; }
|
|
2143
2545
|
});
|
|
2144
|
-
Object.defineProperty(exports,
|
|
2546
|
+
Object.defineProperty(exports, "Signature", {
|
|
2145
2547
|
enumerable: true,
|
|
2146
2548
|
get: function () { return react.Signature; }
|
|
2147
2549
|
});
|
|
2148
|
-
Object.defineProperty(exports,
|
|
2550
|
+
Object.defineProperty(exports, "Skeleton", {
|
|
2149
2551
|
enumerable: true,
|
|
2150
2552
|
get: function () { return react.Skeleton; }
|
|
2151
2553
|
});
|
|
2152
|
-
Object.defineProperty(exports,
|
|
2554
|
+
Object.defineProperty(exports, "Spinner", {
|
|
2153
2555
|
enumerable: true,
|
|
2154
2556
|
get: function () { return react.Spinner; }
|
|
2155
2557
|
});
|
|
2156
|
-
Object.defineProperty(exports,
|
|
2558
|
+
Object.defineProperty(exports, "SplitView", {
|
|
2157
2559
|
enumerable: true,
|
|
2158
2560
|
get: function () { return react.SplitView; }
|
|
2159
2561
|
});
|
|
2160
|
-
Object.defineProperty(exports,
|
|
2562
|
+
Object.defineProperty(exports, "Stack", {
|
|
2161
2563
|
enumerable: true,
|
|
2162
2564
|
get: function () { return react.Stack; }
|
|
2163
2565
|
});
|
|
2164
|
-
Object.defineProperty(exports,
|
|
2566
|
+
Object.defineProperty(exports, "Stat", {
|
|
2165
2567
|
enumerable: true,
|
|
2166
2568
|
get: function () { return react.Stat; }
|
|
2167
2569
|
});
|
|
2168
|
-
Object.defineProperty(exports,
|
|
2570
|
+
Object.defineProperty(exports, "Stepper", {
|
|
2169
2571
|
enumerable: true,
|
|
2170
2572
|
get: function () { return react.Stepper; }
|
|
2171
2573
|
});
|
|
2172
|
-
Object.defineProperty(exports,
|
|
2574
|
+
Object.defineProperty(exports, "Table", {
|
|
2173
2575
|
enumerable: true,
|
|
2174
2576
|
get: function () { return react.Table; }
|
|
2175
2577
|
});
|
|
2176
|
-
Object.defineProperty(exports,
|
|
2578
|
+
Object.defineProperty(exports, "Tabs", {
|
|
2177
2579
|
enumerable: true,
|
|
2178
2580
|
get: function () { return react.Tabs; }
|
|
2179
2581
|
});
|
|
2180
|
-
Object.defineProperty(exports,
|
|
2582
|
+
Object.defineProperty(exports, "Testimonial", {
|
|
2181
2583
|
enumerable: true,
|
|
2182
2584
|
get: function () { return react.Testimonial; }
|
|
2183
2585
|
});
|
|
2184
|
-
Object.defineProperty(exports,
|
|
2586
|
+
Object.defineProperty(exports, "Textarea", {
|
|
2185
2587
|
enumerable: true,
|
|
2186
2588
|
get: function () { return react.Textarea; }
|
|
2187
2589
|
});
|
|
2188
|
-
Object.defineProperty(exports,
|
|
2590
|
+
Object.defineProperty(exports, "TimePicker", {
|
|
2189
2591
|
enumerable: true,
|
|
2190
2592
|
get: function () { return react.TimePicker; }
|
|
2191
2593
|
});
|
|
2192
|
-
Object.defineProperty(exports,
|
|
2594
|
+
Object.defineProperty(exports, "Timeline", {
|
|
2193
2595
|
enumerable: true,
|
|
2194
2596
|
get: function () { return react.Timeline; }
|
|
2195
2597
|
});
|
|
2196
|
-
Object.defineProperty(exports,
|
|
2598
|
+
Object.defineProperty(exports, "Toast", {
|
|
2197
2599
|
enumerable: true,
|
|
2198
2600
|
get: function () { return react.Toast; }
|
|
2199
2601
|
});
|
|
2200
|
-
Object.defineProperty(exports,
|
|
2602
|
+
Object.defineProperty(exports, "Toggle", {
|
|
2201
2603
|
enumerable: true,
|
|
2202
2604
|
get: function () { return react.Toggle; }
|
|
2203
2605
|
});
|
|
2204
|
-
Object.defineProperty(exports,
|
|
2606
|
+
Object.defineProperty(exports, "Toolbar", {
|
|
2205
2607
|
enumerable: true,
|
|
2206
2608
|
get: function () { return react.Toolbar; }
|
|
2207
2609
|
});
|
|
2208
|
-
Object.defineProperty(exports,
|
|
2610
|
+
Object.defineProperty(exports, "Tooltip", {
|
|
2209
2611
|
enumerable: true,
|
|
2210
2612
|
get: function () { return react.Tooltip; }
|
|
2211
2613
|
});
|
|
2212
|
-
Object.defineProperty(exports,
|
|
2614
|
+
Object.defineProperty(exports, "TopBanner", {
|
|
2213
2615
|
enumerable: true,
|
|
2214
2616
|
get: function () { return react.TopBanner; }
|
|
2215
2617
|
});
|
|
2216
|
-
Object.defineProperty(exports,
|
|
2618
|
+
Object.defineProperty(exports, "Tutorial", {
|
|
2217
2619
|
enumerable: true,
|
|
2218
2620
|
get: function () { return react.Tutorial; }
|
|
2219
2621
|
});
|
|
2220
|
-
Object.defineProperty(exports,
|
|
2622
|
+
Object.defineProperty(exports, "TwoFactor", {
|
|
2221
2623
|
enumerable: true,
|
|
2222
2624
|
get: function () { return react.TwoFactor; }
|
|
2223
2625
|
});
|
|
2224
|
-
Object.defineProperty(exports,
|
|
2626
|
+
Object.defineProperty(exports, "VideoPlayer", {
|
|
2225
2627
|
enumerable: true,
|
|
2226
2628
|
get: function () { return react.VideoPlayer; }
|
|
2227
2629
|
});
|
|
2228
|
-
Object.defineProperty(exports,
|
|
2630
|
+
Object.defineProperty(exports, "YouTubePlayer", {
|
|
2229
2631
|
enumerable: true,
|
|
2230
2632
|
get: function () { return react.YouTubePlayer; }
|
|
2231
2633
|
});
|
|
2232
|
-
Object.defineProperty(exports,
|
|
2634
|
+
Object.defineProperty(exports, "useContextMenu", {
|
|
2233
2635
|
enumerable: true,
|
|
2234
2636
|
get: function () { return react.useContextMenu; }
|
|
2235
2637
|
});
|
|
2236
|
-
exports
|
|
2638
|
+
Object.defineProperty(exports, "DEFAULT_LICENSE_MESSAGE_TYPES", {
|
|
2639
|
+
enumerable: true,
|
|
2640
|
+
get: function () { return figmaLicenseCore.DEFAULT_LICENSE_MESSAGE_TYPES; }
|
|
2641
|
+
});
|
|
2237
2642
|
exports.DonationBadge = DonationBadge;
|
|
2643
|
+
exports.FIGMA_UI_TRANSLATIONS = FIGMA_UI_TRANSLATIONS;
|
|
2238
2644
|
exports.FigmaContainer = FigmaContainer;
|
|
2239
2645
|
exports.FigmaFooter = FigmaFooter;
|
|
2240
2646
|
exports.FigmaHeader = FigmaHeader;
|
|
@@ -2243,6 +2649,7 @@ exports.FigmaSection = FigmaSection;
|
|
|
2243
2649
|
exports.FigmaSidebar = FigmaSidebar;
|
|
2244
2650
|
exports.FigmaToast = FigmaToast;
|
|
2245
2651
|
exports.FigmaToastProvider = FigmaToastProvider;
|
|
2652
|
+
exports.FigmaUiI18nProvider = FigmaUiI18nProvider;
|
|
2246
2653
|
exports.FormWithSubmit = FormWithSubmit;
|
|
2247
2654
|
exports.InteractionFeedback = InteractionFeedback;
|
|
2248
2655
|
exports.LanguageSelector = LanguageSelector;
|
|
@@ -2261,13 +2668,16 @@ exports.SettingsModal = SettingsModal;
|
|
|
2261
2668
|
exports.TitleDescription = TitleDescription;
|
|
2262
2669
|
exports.UpgradeBanner = UpgradeBanner;
|
|
2263
2670
|
exports.UsageStatusPopover = UsageStatusPopover;
|
|
2671
|
+
exports.createFigmaUiTranslator = createFigmaUiTranslator;
|
|
2264
2672
|
exports.getActiveSection = getActiveSection;
|
|
2265
2673
|
exports.interpolateText = interpolateText;
|
|
2674
|
+
exports.normalizeFigmaUiLocale = normalizeFigmaUiLocale;
|
|
2266
2675
|
exports.resolvePaymentFeedbackVariant = resolvePaymentFeedbackVariant;
|
|
2267
2676
|
exports.resolveText = resolveText;
|
|
2268
2677
|
exports.scrollToSection = scrollToSection;
|
|
2269
2678
|
exports.useFigmaLicenseBridge = useFigmaLicenseBridge;
|
|
2270
2679
|
exports.useFigmaToast = useFigmaToast;
|
|
2680
|
+
exports.useFigmaUiI18n = useFigmaUiI18n;
|
|
2271
2681
|
exports.useToast = useToast;
|
|
2272
2682
|
Object.keys(react).forEach(function (k) {
|
|
2273
2683
|
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|