@designbasekorea/figma-ui 0.6.8 → 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 +686 -272
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +825 -404
- 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,63 +837,39 @@ 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
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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 activeLanguage = currentLanguage || i18n?.language || languages[0]?.code;
|
|
423
|
-
const translate = (key, fallback) => {
|
|
424
|
-
const translated = t(key);
|
|
425
|
-
return translated && translated !== key ? translated : fallback;
|
|
426
|
-
};
|
|
427
|
-
const handleSelect = (languageCode) => {
|
|
428
|
-
if (i18n) {
|
|
429
|
-
i18n.changeLanguage(languageCode);
|
|
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;
|
|
848
|
+
const [pendingLanguage, setPendingLanguage] = React.useState(resolvedCurrentLanguage);
|
|
849
|
+
React.useEffect(() => {
|
|
850
|
+
if (isOpen) {
|
|
851
|
+
setPendingLanguage(resolvedCurrentLanguage);
|
|
430
852
|
}
|
|
853
|
+
}, [isOpen, resolvedCurrentLanguage]);
|
|
854
|
+
const handleSelect = React.useCallback((languageCode) => {
|
|
855
|
+
setPendingLanguage(languageCode);
|
|
431
856
|
onLanguageChange?.(languageCode);
|
|
432
857
|
onClose();
|
|
433
|
-
};
|
|
434
|
-
return (React.createElement(react.Modal, { isOpen: isOpen, onClose: onClose, title: title || translate('languageSettings'
|
|
435
|
-
React.createElement(
|
|
436
|
-
React.createElement("p", { className: "designbase-figma-language-settings-modal__description" }, description || translate('languageSettingsDescription'
|
|
437
|
-
React.createElement("ul", { className: "designbase-figma-language-settings-modal__list", role: "listbox", "aria-label": translate('languageSettings'
|
|
438
|
-
const label = resolveText(
|
|
439
|
-
const isActive = language.code ===
|
|
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) },
|
|
860
|
+
React.createElement(react.ModalBody, { className: "designbase-figma-language-settings-modal__content" },
|
|
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());
|
|
864
|
+
const isActive = language.code === pendingLanguage;
|
|
440
865
|
return (React.createElement("li", { key: language.code, role: "presentation" },
|
|
441
|
-
React.createElement(
|
|
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) },
|
|
442
867
|
React.createElement("span", { className: "designbase-figma-language-settings-modal__option-label" }, label),
|
|
443
868
|
React.createElement("span", { className: "designbase-figma-language-settings-modal__option-indicator", "aria-hidden": "true" }))));
|
|
444
869
|
})))));
|
|
445
870
|
};
|
|
446
871
|
LanguageSettingsModal.displayName = 'LanguageSettingsModal';
|
|
447
872
|
|
|
448
|
-
let useTranslation$1 = null;
|
|
449
|
-
try {
|
|
450
|
-
const reactI18next = require('react-i18next');
|
|
451
|
-
useTranslation$1 = reactI18next.useTranslation;
|
|
452
|
-
}
|
|
453
|
-
catch (e) {
|
|
454
|
-
}
|
|
455
873
|
const defaultLinks = [
|
|
456
874
|
{
|
|
457
875
|
name: 'officialWebsite',
|
|
@@ -479,32 +897,20 @@ const defaultLinks = [
|
|
|
479
897
|
icon: React.createElement(icons.MailIcon, { size: 20 }),
|
|
480
898
|
},
|
|
481
899
|
];
|
|
482
|
-
const defaultTranslations$1 = {
|
|
483
|
-
officialWebsite: '공식 웹사이트',
|
|
484
|
-
youtube: '유튜브',
|
|
485
|
-
instagram: '인스타그램',
|
|
486
|
-
figmaCommunity: '피그마 커뮤니티',
|
|
487
|
-
contact: '문의하기',
|
|
488
|
-
languageSettings: '언어 설정',
|
|
489
|
-
};
|
|
490
|
-
const defaultT$1 = (key) => defaultTranslations$1[key] || key;
|
|
491
900
|
const defaultLanguages = [
|
|
492
|
-
{ code: 'ko', label: '
|
|
493
|
-
{ code: 'en', label: '
|
|
494
|
-
{ code: 'ja', label: '
|
|
901
|
+
{ code: 'ko', label: { key: 'language.korean' } },
|
|
902
|
+
{ code: 'en', label: { key: 'language.english' } },
|
|
903
|
+
{ code: 'ja', label: { key: 'language.japanese' } },
|
|
495
904
|
];
|
|
496
|
-
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, }) => {
|
|
497
906
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
498
907
|
const [isLanguageModalOpen, setIsLanguageModalOpen] = React.useState(false);
|
|
499
|
-
const
|
|
908
|
+
const [internalLanguage, setInternalLanguage] = React.useState();
|
|
909
|
+
const { t: translate } = useFigmaUiI18n(currentLanguage ?? internalLanguage, t);
|
|
500
910
|
const rootRef = React.useRef(null);
|
|
501
911
|
const triggerRef = React.useRef(null);
|
|
502
912
|
const menuId = `designbase-figma-logo-menu-${React.useId().replace(/:/g, '')}`;
|
|
503
|
-
const activeLanguage = currentLanguage
|
|
504
|
-
const translate = (key, fallback) => {
|
|
505
|
-
const translated = t(key);
|
|
506
|
-
return translated && translated !== key ? translated : fallback;
|
|
507
|
-
};
|
|
913
|
+
const activeLanguage = currentLanguage ?? internalLanguage ?? languages[0]?.code;
|
|
508
914
|
React.useEffect(() => {
|
|
509
915
|
if (!isOpen) {
|
|
510
916
|
return undefined;
|
|
@@ -540,8 +946,8 @@ const LogoDropdown = ({ logoSrc, logoAlt = 'DesignBase', logoType = 'designbase'
|
|
|
540
946
|
setIsLanguageModalOpen(true);
|
|
541
947
|
};
|
|
542
948
|
const handleLanguageChange = (languageCode) => {
|
|
543
|
-
if (
|
|
544
|
-
|
|
949
|
+
if (currentLanguage === undefined) {
|
|
950
|
+
setInternalLanguage(languageCode);
|
|
545
951
|
}
|
|
546
952
|
onLanguageChange?.(languageCode);
|
|
547
953
|
};
|
|
@@ -557,14 +963,14 @@ const LogoDropdown = ({ logoSrc, logoAlt = 'DesignBase', logoType = 'designbase'
|
|
|
557
963
|
links.map((link, index) => (React.createElement("li", { key: index, className: "designbase-figma-logo-dropdown__item", role: "none" },
|
|
558
964
|
React.createElement("button", { type: "button", className: "designbase-figma-logo-dropdown__link", role: "menuitem", onClick: () => handleLinkClick(link.url) },
|
|
559
965
|
link.icon && (React.createElement("span", { className: "designbase-figma-logo-dropdown__icon" }, link.icon)),
|
|
560
|
-
React.createElement("span", { className: "designbase-figma-logo-dropdown__text" },
|
|
966
|
+
React.createElement("span", { className: "designbase-figma-logo-dropdown__text" }, translate(link.name)),
|
|
561
967
|
React.createElement(icons.ExternalLinkIcon, { size: 16, className: "designbase-figma-logo-dropdown__arrow" }))))),
|
|
562
968
|
showLanguageSelector && (React.createElement("li", { className: "designbase-figma-logo-dropdown__item designbase-figma-logo-dropdown__language-item", role: "none" },
|
|
563
969
|
React.createElement("button", { type: "button", className: "designbase-figma-logo-dropdown__link", role: "menuitem", onClick: handleLanguageSettingsClick },
|
|
564
970
|
React.createElement("span", { className: "designbase-figma-logo-dropdown__icon" },
|
|
565
971
|
React.createElement(icons.TranslateIcon, { size: 20, "aria-hidden": "true" })),
|
|
566
|
-
React.createElement("span", { className: "designbase-figma-logo-dropdown__text" }, translate('languageSettings'
|
|
567
|
-
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 }))));
|
|
568
974
|
};
|
|
569
975
|
LogoDropdown.displayName = 'LogoDropdown';
|
|
570
976
|
|
|
@@ -572,7 +978,8 @@ const fallbackText = (t, key, fallback) => {
|
|
|
572
978
|
const translated = t?.(key);
|
|
573
979
|
return translated && translated !== key ? translated : fallback;
|
|
574
980
|
};
|
|
575
|
-
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);
|
|
576
983
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
577
984
|
const rootRef = React.useRef(null);
|
|
578
985
|
const triggerRef = React.useRef(null);
|
|
@@ -586,25 +993,25 @@ const UsageStatusPopover = ({ paymentStatus, usageCount = 0, maxDailyUsage = 20,
|
|
|
586
993
|
const usedPercent = hasDailyLimit ? Math.round((used / limit) * 100) : 0;
|
|
587
994
|
const hasControl = showUsage || showPlan;
|
|
588
995
|
const planLabel = isPaid
|
|
589
|
-
? fallbackText(
|
|
996
|
+
? fallbackText(translate, 'proUser', '프로')
|
|
590
997
|
: isBeta
|
|
591
|
-
? fallbackText(
|
|
998
|
+
? fallbackText(translate, 'betaStatus', 'BETA')
|
|
592
999
|
: paymentStatus === 'TRIAL'
|
|
593
|
-
? fallbackText(
|
|
594
|
-
: fallbackText(
|
|
1000
|
+
? fallbackText(translate, 'trialPlan', '체험판')
|
|
1001
|
+
: fallbackText(translate, 'free', '무료');
|
|
595
1002
|
const planTitle = isBeta
|
|
596
1003
|
? planLabel
|
|
597
|
-
: `${planLabel} ${fallbackText(
|
|
1004
|
+
: `${planLabel} ${fallbackText(translate, 'planSuffix', '플랜')}`;
|
|
598
1005
|
const triggerLabel = isPaid
|
|
599
|
-
? `${planLabel}, ${fallbackText(
|
|
1006
|
+
? `${planLabel}, ${fallbackText(translate, 'unlimitedUsage', '무제한 사용 가능')}`
|
|
600
1007
|
: isBeta
|
|
601
1008
|
? planLabel
|
|
602
1009
|
: hasDailyLimit
|
|
603
|
-
? `${remaining}/${limit} ${fallbackText(
|
|
1010
|
+
? `${remaining}/${limit} ${fallbackText(translate, 'remainingShort', '남음')}`
|
|
604
1011
|
: planLabel;
|
|
605
1012
|
const upgradeLabel = isPaid
|
|
606
|
-
? fallbackText(
|
|
607
|
-
: fallbackText(
|
|
1013
|
+
? fallbackText(translate, 'managePlan', '플랜 관리')
|
|
1014
|
+
: fallbackText(translate, 'upgradePlan', '플랜 업그레이드');
|
|
608
1015
|
React.useEffect(() => {
|
|
609
1016
|
if (!isOpen)
|
|
610
1017
|
return undefined;
|
|
@@ -639,7 +1046,7 @@ const UsageStatusPopover = ({ paymentStatus, usageCount = 0, maxDailyUsage = 20,
|
|
|
639
1046
|
'designbase-figma-usage-status--loading': isLoading,
|
|
640
1047
|
}, className) },
|
|
641
1048
|
React.createElement("div", { className: "designbase-figma-usage-status__control" },
|
|
642
|
-
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,
|
|
643
1050
|
React.createElement("span", { className: "designbase-figma-usage-status__mini-progress", "aria-hidden": "true" },
|
|
644
1051
|
React.createElement("span", { style: { width: `${usedPercent}%` } })),
|
|
645
1052
|
React.createElement("span", { className: "designbase-figma-usage-status__usage-value" },
|
|
@@ -648,53 +1055,27 @@ const UsageStatusPopover = ({ paymentStatus, usageCount = 0, maxDailyUsage = 20,
|
|
|
648
1055
|
"/",
|
|
649
1056
|
limit)))) : (React.createElement("span", { className: "designbase-figma-usage-status__plan-label" }, planLabel)))),
|
|
650
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))),
|
|
651
|
-
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', '사용량 상세') },
|
|
652
1059
|
React.createElement("div", { className: "designbase-figma-usage-status__popover-header" },
|
|
653
1060
|
React.createElement("span", { className: "designbase-figma-usage-status__plan-title" }, planTitle),
|
|
654
1061
|
!isBeta && (React.createElement(react.Button, { className: "designbase-figma-usage-status__upgrade", variant: isPaid ? 'secondary' : 'primary', size: "s", endIcon: "chevron-right", onPress: handleManageClick }, upgradeLabel))),
|
|
655
1062
|
isPaid ? (React.createElement("div", { className: "designbase-figma-usage-status__unlimited-copy" },
|
|
656
1063
|
React.createElement("span", { className: "designbase-figma-usage-status__unlimited-mark", "aria-hidden": "true" }, "\u221E"),
|
|
657
|
-
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" },
|
|
658
1065
|
React.createElement("div", { className: "designbase-figma-usage-status__usage-summary" },
|
|
659
1066
|
React.createElement("strong", { className: "designbase-figma-usage-status__usage-count" },
|
|
660
1067
|
used,
|
|
661
1068
|
React.createElement("span", { className: "designbase-figma-usage-status__usage-divider" }, "/"),
|
|
662
1069
|
limit),
|
|
663
|
-
React.createElement("span", { className: "designbase-figma-usage-status__usage-caption" }, fallbackText(
|
|
664
|
-
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}` },
|
|
665
1072
|
React.createElement("span", { style: { width: `${usedPercent}%` } })),
|
|
666
|
-
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', '사용량 제한이 없습니다')))))));
|
|
667
1074
|
};
|
|
668
1075
|
UsageStatusPopover.displayName = 'UsageStatusPopover';
|
|
669
1076
|
|
|
670
|
-
const
|
|
671
|
-
|
|
672
|
-
proUser: '프로',
|
|
673
|
-
free: '무료',
|
|
674
|
-
trialPlan: '체험판',
|
|
675
|
-
planSuffix: '플랜',
|
|
676
|
-
usageDetails: '사용량 상세',
|
|
677
|
-
dailyUsage: '오늘 사용량',
|
|
678
|
-
usedToday: '오늘 사용',
|
|
679
|
-
remainingToday: '오늘 남은 사용량',
|
|
680
|
-
remainingUsage: '오늘 남은 사용량',
|
|
681
|
-
managePlan: '플랜 관리',
|
|
682
|
-
upgradePlan: '플랜 업그레이드',
|
|
683
|
-
remainingShort: '남음',
|
|
684
|
-
usageCountCaption: '오늘 사용',
|
|
685
|
-
remainingCopy: '{{count}}회 남음 · 매일 리셋',
|
|
686
|
-
usageUnavailable: '사용량 제한이 없습니다',
|
|
687
|
-
betaUsageDescription: '베타 기간에는 사용량 제한이 적용되지 않습니다',
|
|
688
|
-
perDay: '일',
|
|
689
|
-
resetsDaily: '매일 리셋',
|
|
690
|
-
donationPrompt: '이 플러그인이 유용했나요?',
|
|
691
|
-
betaStatus: 'BETA',
|
|
692
|
-
};
|
|
693
|
-
const defaultT = (key, values) => {
|
|
694
|
-
const template = defaultTranslations[key] || key;
|
|
695
|
-
return interpolateText(template, values);
|
|
696
|
-
};
|
|
697
|
-
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);
|
|
698
1079
|
const resolvedShowUsageInfo = showPaymentStatus && showUsageInfo;
|
|
699
1080
|
const resolvedShowPaymentBadge = showPaymentStatus && showPaymentBadge;
|
|
700
1081
|
const resolvedLicensePageClick = paymentStatus === 'BETA' ? undefined : onLicensePageClick;
|
|
@@ -705,10 +1086,10 @@ const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount =
|
|
|
705
1086
|
return (React.createElement("footer", { className: classes },
|
|
706
1087
|
React.createElement("div", { className: "designbase-figma-footer__wrap" },
|
|
707
1088
|
React.createElement("div", { className: "designbase-figma-footer__left" },
|
|
708
|
-
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 })),
|
|
709
1090
|
React.createElement("div", { className: "designbase-figma-footer__right" },
|
|
710
|
-
(resolvedShowUsageInfo || resolvedShowPaymentBadge) && (React.createElement(UsageStatusPopover, { paymentStatus: paymentStatus, usageCount: usageCount, maxDailyUsage: maxDailyUsage, showUsage: resolvedShowUsageInfo, showPlan: resolvedShowPaymentBadge, isLoading: isLoading, onLicensePageClick: resolvedLicensePageClick, t:
|
|
711
|
-
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 })))),
|
|
712
1093
|
children));
|
|
713
1094
|
};
|
|
714
1095
|
FigmaFooter.displayName = 'FigmaFooter';
|
|
@@ -784,7 +1165,8 @@ const useFigmaToast = () => {
|
|
|
784
1165
|
FigmaToastProvider.displayName = 'FigmaToastProvider';
|
|
785
1166
|
FigmaToast.displayName = 'FigmaToast';
|
|
786
1167
|
|
|
787
|
-
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);
|
|
788
1170
|
const [inputValue, setInputValue] = React.useState(value);
|
|
789
1171
|
React.useEffect(() => {
|
|
790
1172
|
setInputValue(value);
|
|
@@ -797,11 +1179,11 @@ const FormWithSubmit = ({ onLicenseSubmit, disabled = false, isSubmitting = fals
|
|
|
797
1179
|
setInputValue(value);
|
|
798
1180
|
onValueChange?.(value);
|
|
799
1181
|
};
|
|
800
|
-
const displayLabel = resolveText(
|
|
801
|
-
const displayPlaceholder = resolveText(
|
|
802
|
-
const displaySubmitText = resolveText(
|
|
803
|
-
const displaySubmittingText = resolveText(
|
|
804
|
-
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;
|
|
805
1187
|
return (React.createElement("form", { className: `designbase-figma-form-with-submit ${className || ''}`, onSubmit: handleSubmit },
|
|
806
1188
|
React.createElement("div", { className: "designbase-figma-form-with-submit__field" },
|
|
807
1189
|
React.createElement("label", { className: "designbase-figma-form-with-submit__label" }, displayLabel),
|
|
@@ -815,7 +1197,8 @@ const FormWithSubmit = ({ onLicenseSubmit, disabled = false, isSubmitting = fals
|
|
|
815
1197
|
};
|
|
816
1198
|
FormWithSubmit.displayName = 'FormWithSubmit';
|
|
817
1199
|
|
|
818
|
-
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);
|
|
819
1202
|
const feedbackClasses = clsx('designbase-figma-interaction', `designbase-figma-interaction--${status}`, {
|
|
820
1203
|
'designbase-figma-interaction--visible': visible,
|
|
821
1204
|
}, className);
|
|
@@ -824,38 +1207,28 @@ const InteractionFeedback = ({ status = 'default', message, statusMessage, leftC
|
|
|
824
1207
|
return (React.createElement("div", { className: feedbackClasses },
|
|
825
1208
|
React.createElement("div", { className: "designbase-figma-interaction__content" },
|
|
826
1209
|
React.createElement("div", { className: "designbase-figma-interaction__left" }, leftContent || (React.createElement("div", { className: "designbase-figma-interaction__message" },
|
|
827
|
-
status === 'loading' && (React.createElement(react.Spinner, { size: "s", type: "circular", label:
|
|
828
|
-
(message || status === 'loading') && (React.createElement("span", { className: "designbase-figma-interaction__text" }, resolveText(
|
|
829
|
-
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)))))),
|
|
830
1213
|
rightAction && (React.createElement("div", { className: "designbase-figma-interaction__right" }, rightAction)))));
|
|
831
1214
|
};
|
|
832
1215
|
InteractionFeedback.displayName = 'InteractionFeedback';
|
|
833
1216
|
|
|
834
|
-
let useTranslation = null;
|
|
835
|
-
try {
|
|
836
|
-
const reactI18next = require('react-i18next');
|
|
837
|
-
useTranslation = reactI18next.useTranslation;
|
|
838
|
-
}
|
|
839
|
-
catch (e) {
|
|
840
|
-
}
|
|
841
1217
|
const DEFAULT_LANGUAGES = [
|
|
842
1218
|
{ code: 'ko', label: 'KO' },
|
|
843
1219
|
{ code: 'en', label: 'EN' },
|
|
844
1220
|
];
|
|
845
1221
|
const LanguageSelector = ({ currentLanguage, languages = DEFAULT_LANGUAGES, onLanguageChange, size = 's', className, t }) => {
|
|
846
|
-
const
|
|
847
|
-
const activeLanguage = currentLanguage ||
|
|
1222
|
+
const { locale, t: translate } = useFigmaUiI18n(currentLanguage, t);
|
|
1223
|
+
const activeLanguage = currentLanguage || locale;
|
|
848
1224
|
const handleLanguageChange = (languageCode) => {
|
|
849
|
-
if (i18n) {
|
|
850
|
-
i18n.changeLanguage(languageCode);
|
|
851
|
-
}
|
|
852
1225
|
if (onLanguageChange) {
|
|
853
1226
|
onLanguageChange(languageCode);
|
|
854
1227
|
}
|
|
855
1228
|
};
|
|
856
1229
|
const segmentOptions = languages.map((language) => ({
|
|
857
1230
|
value: language.code,
|
|
858
|
-
label: resolveText(
|
|
1231
|
+
label: resolveText(translate, language.label, language.code.toUpperCase()),
|
|
859
1232
|
disabled: false,
|
|
860
1233
|
}));
|
|
861
1234
|
return (React.createElement("div", { className: `designbase-figma-language-selector ${className || ''}` },
|
|
@@ -887,25 +1260,26 @@ function openExternalUrl(url) {
|
|
|
887
1260
|
}
|
|
888
1261
|
}
|
|
889
1262
|
|
|
890
|
-
const LicenseOffer = ({ joinUrl, guideUrl, membershipUrl, t, className, }) => {
|
|
1263
|
+
const LicenseOffer = ({ joinUrl, guideUrl, membershipUrl, t, locale, className, }) => {
|
|
1264
|
+
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
891
1265
|
const titleId = `designbase-license-offer-title-${React.useId().replace(/:/g, '')}`;
|
|
892
1266
|
const resolvedJoinUrl = joinUrl || membershipUrl;
|
|
893
1267
|
const steps = [
|
|
894
|
-
resolveText(
|
|
895
|
-
resolveText(
|
|
896
|
-
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' }, '아래 입력창에 키를 붙여 넣고 활성화합니다.'),
|
|
897
1271
|
];
|
|
898
1272
|
return (React.createElement("section", { className: `designbase-figma-license-offer ${className || ''}`, "aria-labelledby": titleId },
|
|
899
|
-
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' }, '이용 방법')),
|
|
900
1274
|
React.createElement("ol", { className: "designbase-figma-license-offer__steps" }, steps.map((step, index) => (React.createElement("li", { key: index },
|
|
901
1275
|
React.createElement("span", { className: "designbase-figma-license-offer__step-index", "aria-hidden": "true" },
|
|
902
1276
|
index + 1,
|
|
903
1277
|
"."),
|
|
904
1278
|
React.createElement("span", null, step))))),
|
|
905
1279
|
(resolvedJoinUrl || guideUrl) && (React.createElement("div", { className: "designbase-figma-license-offer__actions" },
|
|
906
|
-
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' }, '멤버십 가입'))),
|
|
907
1281
|
guideUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(guideUrl), variant: "secondary", size: "m", fullWidth: true },
|
|
908
|
-
React.createElement("span", null, resolveText(
|
|
1282
|
+
React.createElement("span", null, resolveText(translate, { key: 'license.youtube_membership_guide' }, '안내보기')),
|
|
909
1283
|
React.createElement(icons.ExternalLinkIcon, { size: 16, "aria-hidden": "true" })))))));
|
|
910
1284
|
};
|
|
911
1285
|
LicenseOffer.displayName = 'LicenseOffer';
|
|
@@ -915,13 +1289,13 @@ function maskLicenseKey(value) {
|
|
|
915
1289
|
return '••••••••';
|
|
916
1290
|
return `${value.slice(0, 4)}••••${value.slice(-4)}`;
|
|
917
1291
|
}
|
|
918
|
-
function formatDate(value) {
|
|
1292
|
+
function formatDate(value, locale) {
|
|
919
1293
|
if (!value)
|
|
920
1294
|
return undefined;
|
|
921
1295
|
const date = new Date(value);
|
|
922
1296
|
if (Number.isNaN(date.getTime()))
|
|
923
1297
|
return value;
|
|
924
|
-
return new Intl.DateTimeFormat(
|
|
1298
|
+
return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(date);
|
|
925
1299
|
}
|
|
926
1300
|
function formatScope(value, t) {
|
|
927
1301
|
if (!value)
|
|
@@ -942,43 +1316,44 @@ function formatSource(value, t) {
|
|
|
942
1316
|
}
|
|
943
1317
|
return value;
|
|
944
1318
|
}
|
|
945
|
-
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);
|
|
946
1321
|
const [isKeyRevealed, setIsKeyRevealed] = React.useState(false);
|
|
947
1322
|
const normalizedLicenseStatus = licenseStatus?.toLowerCase();
|
|
948
1323
|
const isInactiveStatus = ['expired', 'revoked', 'invalid', 'inactive'].includes(normalizedLicenseStatus || '');
|
|
949
1324
|
const isActive = status === 'PAID' && !isInactiveStatus;
|
|
950
1325
|
const statusText = isActive
|
|
951
|
-
? resolveText(
|
|
952
|
-
: resolveText(
|
|
1326
|
+
? resolveText(translate, { key: 'license.status_active' }, 'Active')
|
|
1327
|
+
: resolveText(translate, { key: 'license.status_inactive' }, 'License check failed');
|
|
953
1328
|
const statusClass = isActive ? 'active' : 'inactive';
|
|
954
1329
|
return (React.createElement("section", { className: `designbase-figma-license-status-card designbase-figma-license-status-card--${statusClass} ${className || ''}`, "aria-label": statusText },
|
|
955
1330
|
React.createElement("div", { className: "designbase-figma-license-status-card__header" },
|
|
956
1331
|
React.createElement("div", null,
|
|
957
1332
|
React.createElement("div", { className: "designbase-figma-license-status-card__eyebrow" }, isActive
|
|
958
|
-
? resolveText(
|
|
959
|
-
: resolveText(
|
|
1333
|
+
? resolveText(translate, { key: 'license.activated' }, '라이선스 활성화됨')
|
|
1334
|
+
: resolveText(translate, { key: 'license.status_label' }, '라이선스 상태')),
|
|
960
1335
|
React.createElement("h3", null, statusText)),
|
|
961
1336
|
React.createElement("span", { className: "designbase-figma-license-status-card__badge" }, licenseStatus || (isActive ? 'active' : 'inactive'))),
|
|
962
1337
|
validationMessage && !isActive && (React.createElement("p", { className: "designbase-figma-license-status-card__message" }, validationMessage)),
|
|
963
1338
|
licenseKey && (React.createElement("div", { className: "designbase-figma-license-status-card__key-row" },
|
|
964
|
-
React.createElement("span", null, resolveText(
|
|
1339
|
+
React.createElement("span", null, resolveText(translate, { key: 'license.key_label' }, '라이선스 키')),
|
|
965
1340
|
React.createElement("code", null, allowRevealKey && isKeyRevealed ? licenseKey : maskLicenseKey(licenseKey)),
|
|
966
1341
|
allowRevealKey && (React.createElement(react.Button, { type: "button", onPress: () => setIsKeyRevealed((value) => !value), variant: "tertiary", size: "s" }, isKeyRevealed
|
|
967
|
-
? resolveText(
|
|
968
|
-
: resolveText(
|
|
1342
|
+
? resolveText(translate, { key: 'license.hide_key' }, '숨기기')
|
|
1343
|
+
: resolveText(translate, { key: 'license.reveal_key' }, '보기'))))),
|
|
969
1344
|
(licenseSource || accessScope || expiresAt || lastVerifiedAt) && (React.createElement("dl", { className: "designbase-figma-license-status-card__meta" },
|
|
970
|
-
formatSource(licenseSource,
|
|
971
|
-
React.createElement("dt", null, resolveText(
|
|
972
|
-
React.createElement("dd", null, formatSource(licenseSource,
|
|
973
|
-
formatScope(accessScope,
|
|
974
|
-
React.createElement("dt", null, resolveText(
|
|
975
|
-
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))),
|
|
976
1351
|
expiresAt && React.createElement(React.Fragment, null,
|
|
977
|
-
React.createElement("dt", null, resolveText(
|
|
978
|
-
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)),
|
|
979
1354
|
lastVerifiedAt && React.createElement(React.Fragment, null,
|
|
980
|
-
React.createElement("dt", null, resolveText(
|
|
981
|
-
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))))));
|
|
982
1357
|
};
|
|
983
1358
|
LicenseStatusCard.displayName = 'LicenseStatusCard';
|
|
984
1359
|
|
|
@@ -999,15 +1374,16 @@ function resolvePaymentFeedbackVariant(errorCode, explicitVariant) {
|
|
|
999
1374
|
}
|
|
1000
1375
|
return 'error';
|
|
1001
1376
|
}
|
|
1002
|
-
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);
|
|
1003
1379
|
const remainingActivations = Math.max(0, activationLimit - activationUsage);
|
|
1004
|
-
const resolvedActionMessage = actionMessage ? resolveText(
|
|
1380
|
+
const resolvedActionMessage = actionMessage ? resolveText(translate, actionMessage) : undefined;
|
|
1005
1381
|
const feedbackVariant = resolvedActionMessage
|
|
1006
1382
|
? resolvePaymentFeedbackVariant(errorCode, actionMessageVariant)
|
|
1007
1383
|
: undefined;
|
|
1008
1384
|
return (React.createElement("div", { className: clsx('designbase-figma-payment-status', className) },
|
|
1009
1385
|
React.createElement("div", { className: "designbase-figma-payment-status__license-key" },
|
|
1010
|
-
resolveText(
|
|
1386
|
+
resolveText(translate, { key: 'payment.license_key_label' }, '라이선스 키'),
|
|
1011
1387
|
": ",
|
|
1012
1388
|
React.createElement("span", null, licenseKey)),
|
|
1013
1389
|
showDetails && (React.createElement("div", { className: "designbase-figma-payment-status__details" },
|
|
@@ -1015,41 +1391,60 @@ const PaymentStatusSection = ({ activationLimit, activationUsage, licenseKey, on
|
|
|
1015
1391
|
React.createElement("div", { className: "designbase-figma-payment-status__remaining" },
|
|
1016
1392
|
remainingActivations,
|
|
1017
1393
|
' ',
|
|
1018
|
-
resolveText(
|
|
1394
|
+
resolveText(translate, { key: 'payment.activations_remaining' }, '활성'),
|
|
1019
1395
|
' ',
|
|
1020
|
-
resolveText(
|
|
1396
|
+
resolveText(translate, { key: 'payment.spots_remaining' }, '자리 남음')),
|
|
1021
1397
|
React.createElement("div", { className: "designbase-figma-payment-status__usage" },
|
|
1022
1398
|
activationUsage,
|
|
1023
1399
|
"/",
|
|
1024
1400
|
activationLimit)),
|
|
1025
1401
|
React.createElement("div", { className: "designbase-figma-payment-status__action" },
|
|
1026
1402
|
React.createElement(react.Button, { onPress: onDeactivate, variant: "secondary", size: "s", fullWidth: true, disabled: isDeactivating }, isDeactivating
|
|
1027
|
-
? resolveText(
|
|
1028
|
-
: resolveText(
|
|
1403
|
+
? resolveText(translate, { key: 'payment.deactivating' }, '비활성화중...')
|
|
1404
|
+
: resolveText(translate, { key: 'payment.deactivate_license' }, '라이선스 비활성화')),
|
|
1029
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)))))));
|
|
1030
1406
|
};
|
|
1031
1407
|
PaymentStatusSection.displayName = 'PaymentStatusSection';
|
|
1032
1408
|
|
|
1033
|
-
const
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
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
|
+
};
|
|
1040
1432
|
const defaultPricing = {
|
|
1041
1433
|
monthly: 2,
|
|
1042
1434
|
yearly: 21.6,
|
|
1043
1435
|
lifetime: 50,
|
|
1044
1436
|
};
|
|
1045
|
-
const PricingComparison = ({ features
|
|
1437
|
+
const PricingComparison = ({ features, pricing = defaultPricing, paymentType = 'subscription', t, locale, className, }) => {
|
|
1438
|
+
const { locale: resolvedLocale, t: translate } = useFigmaUiI18n(locale, t);
|
|
1046
1439
|
const [isYearly, setIsYearly] = React.useState(false);
|
|
1440
|
+
const resolvedFeatures = features ?? defaultFeaturesByLocale[resolvedLocale];
|
|
1441
|
+
const resolveFeatureValue = (value) => typeof value === 'boolean' ? (value ? '✓' : '✗') : value;
|
|
1047
1442
|
const getPrice = () => {
|
|
1048
1443
|
if (paymentType === 'lifetime') {
|
|
1049
|
-
return `$${pricing.lifetime?.toLocaleString()} - ${
|
|
1444
|
+
return `$${pricing.lifetime?.toLocaleString()} - ${translate('lifetimeAccess')}`;
|
|
1050
1445
|
}
|
|
1051
1446
|
const price = isYearly ? pricing.yearly : pricing.monthly;
|
|
1052
|
-
return `$${price?.toLocaleString()} / ${isYearly ?
|
|
1447
|
+
return `$${price?.toLocaleString()} / ${isYearly ? translate('perYear') : translate('perMonth')}`;
|
|
1053
1448
|
};
|
|
1054
1449
|
const getDiscountPercentage = () => {
|
|
1055
1450
|
if (paymentType === 'lifetime') {
|
|
@@ -1072,46 +1467,34 @@ const PricingComparison = ({ features = defaultFeatures, pricing = defaultPricin
|
|
|
1072
1467
|
}, options: [
|
|
1073
1468
|
{
|
|
1074
1469
|
value: 'monthly',
|
|
1075
|
-
label:
|
|
1470
|
+
label: translate('monthlyBilling'),
|
|
1076
1471
|
},
|
|
1077
1472
|
{
|
|
1078
1473
|
value: 'yearly',
|
|
1079
|
-
label: `${
|
|
1474
|
+
label: `${translate('yearlyBilling')} (${getDiscountPercentage()}% ${translate('pricing.discount_suffix')})`,
|
|
1080
1475
|
},
|
|
1081
1476
|
], size: "s" }))),
|
|
1082
1477
|
paymentType === 'lifetime' && (React.createElement("div", { className: "designbase-figma-pricing-comparison__lifetime-info" },
|
|
1083
|
-
React.createElement("p", { className: "designbase-figma-pricing-comparison__lifetime-text" },
|
|
1478
|
+
React.createElement("p", { className: "designbase-figma-pricing-comparison__lifetime-text" }, translate('oneTimePaymentLifetime')))),
|
|
1084
1479
|
React.createElement("table", { className: "designbase-figma-pricing-comparison__table" },
|
|
1085
1480
|
React.createElement("thead", null,
|
|
1086
1481
|
React.createElement("tr", null,
|
|
1087
|
-
React.createElement("th", null,
|
|
1482
|
+
React.createElement("th", null, translate('feature')),
|
|
1088
1483
|
React.createElement("th", null,
|
|
1089
|
-
React.createElement("div", { className: "designbase-figma-pricing-comparison__plan-name" },
|
|
1090
|
-
React.createElement("div", null,
|
|
1484
|
+
React.createElement("div", { className: "designbase-figma-pricing-comparison__plan-name" }, translate('free')),
|
|
1485
|
+
React.createElement("div", null, translate('freePrice'))),
|
|
1091
1486
|
React.createElement("th", { className: "designbase-figma-pricing-comparison__recommended" },
|
|
1092
1487
|
React.createElement("div", { className: "designbase-figma-pricing-comparison__plan-name" },
|
|
1093
|
-
|
|
1094
|
-
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'))),
|
|
1095
1490
|
React.createElement("div", null, getPrice())))),
|
|
1096
|
-
React.createElement("tbody", null,
|
|
1491
|
+
React.createElement("tbody", null, resolvedFeatures.map((feature, index) => (React.createElement("tr", { key: index },
|
|
1097
1492
|
React.createElement("td", null, feature.name),
|
|
1098
|
-
React.createElement("td", null,
|
|
1099
|
-
|
|
1100
|
-
: feature.free),
|
|
1101
|
-
React.createElement("td", null, typeof feature.pro === 'boolean'
|
|
1102
|
-
? (feature.pro ? '✓' : '✗')
|
|
1103
|
-
: feature.pro))))))));
|
|
1493
|
+
React.createElement("td", null, resolveFeatureValue(feature.free)),
|
|
1494
|
+
React.createElement("td", null, resolveFeatureValue(feature.pro)))))))));
|
|
1104
1495
|
};
|
|
1105
1496
|
PricingComparison.displayName = 'PricingComparison';
|
|
1106
1497
|
|
|
1107
|
-
const DEFAULT_LICENSE_MESSAGE_TYPES = {
|
|
1108
|
-
initialize: 'initialize',
|
|
1109
|
-
verifyLicense: 'verify-license',
|
|
1110
|
-
deactivateLicense: 'deactivate-license',
|
|
1111
|
-
updateStatus: 'update-plugin-status',
|
|
1112
|
-
verifyResult: 'license-verification-result',
|
|
1113
|
-
deactivateResult: 'license-deactivation-result',
|
|
1114
|
-
};
|
|
1115
1498
|
const START_DESIGNBASE_AUTH_MESSAGE = 'start-designbase-auth';
|
|
1116
1499
|
const INITIAL_LICENSE_PAGE_STATE = {
|
|
1117
1500
|
paymentStatus: 'FREE',
|
|
@@ -1185,7 +1568,7 @@ function parseLicenseMessage(data) {
|
|
|
1185
1568
|
};
|
|
1186
1569
|
}
|
|
1187
1570
|
function useFigmaLicenseBridge(options = {}) {
|
|
1188
|
-
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]);
|
|
1189
1572
|
const [state, setState] = React.useState({
|
|
1190
1573
|
...INITIAL_LICENSE_PAGE_STATE,
|
|
1191
1574
|
...options.initialState,
|
|
@@ -1266,6 +1649,9 @@ function useFigmaLicenseBridge(options = {}) {
|
|
|
1266
1649
|
applyPatch({ lastMessage: payload.message });
|
|
1267
1650
|
}
|
|
1268
1651
|
}
|
|
1652
|
+
if (type === messageTypes.featureAccessResult || type === messageTypes.usageConsumeResult) {
|
|
1653
|
+
applyPatch(parseLicenseMessage(payload));
|
|
1654
|
+
}
|
|
1269
1655
|
};
|
|
1270
1656
|
window.addEventListener('message', handleMessage);
|
|
1271
1657
|
postPluginMessage({ type: messageTypes.initialize });
|
|
@@ -1290,6 +1676,20 @@ function useFigmaLicenseBridge(options = {}) {
|
|
|
1290
1676
|
setIsStartingAuth(true);
|
|
1291
1677
|
postPluginMessage({ type: START_DESIGNBASE_AUTH_MESSAGE });
|
|
1292
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]);
|
|
1293
1693
|
return {
|
|
1294
1694
|
state,
|
|
1295
1695
|
isVerifying,
|
|
@@ -1298,6 +1698,8 @@ function useFigmaLicenseBridge(options = {}) {
|
|
|
1298
1698
|
verifyLicense,
|
|
1299
1699
|
deactivateLicense,
|
|
1300
1700
|
startDesignbaseAuth,
|
|
1701
|
+
checkFeatureAccess,
|
|
1702
|
+
consumeUsage,
|
|
1301
1703
|
setLicenseKeyInput: (licenseKey) => applyPatch({ licenseKey }),
|
|
1302
1704
|
};
|
|
1303
1705
|
}
|
|
@@ -1311,17 +1713,23 @@ function formatUsageLabel(state, t) {
|
|
|
1311
1713
|
const remaining = remainingUsage ?? Math.max(0, limit - usageUsed);
|
|
1312
1714
|
if (usageReset === 'daily') {
|
|
1313
1715
|
const fallback = `오늘 남은 횟수 ${remaining}/${limit}`;
|
|
1314
|
-
const translated = resolveText(t, { key: 'license.usage_daily' }, fallback) ?? fallback;
|
|
1716
|
+
const translated = resolveText(t, { key: 'license.usage_daily', values: { remaining, limit } }, fallback) ?? fallback;
|
|
1315
1717
|
return translated.includes(String(remaining)) ? translated : fallback;
|
|
1316
1718
|
}
|
|
1317
1719
|
if (usageReset === 'monthly') {
|
|
1318
1720
|
const fallback = `이번 달 남은 횟수 ${remaining}/${limit}`;
|
|
1319
|
-
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;
|
|
1320
1727
|
return translated.includes(String(remaining)) ? translated : fallback;
|
|
1321
1728
|
}
|
|
1322
|
-
return `남은 횟수 ${remaining}/${limit}`;
|
|
1729
|
+
return resolveText(t, { key: 'license.usage_generic', values: { remaining, limit } }, `남은 횟수 ${remaining}/${limit}`) ?? `남은 횟수 ${remaining}/${limit}`;
|
|
1323
1730
|
}
|
|
1324
|
-
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);
|
|
1325
1733
|
const links = React.useMemo(() => ({
|
|
1326
1734
|
purchaseUrl: wordpressLinks?.purchaseUrl ?? paymentPageUrl,
|
|
1327
1735
|
membershipUrl: membershipUrl ?? wordpressLinks?.membershipUrl,
|
|
@@ -1343,7 +1751,7 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
|
|
|
1343
1751
|
const [licenseKeyDraft, setLicenseKeyDraft] = React.useState(initialLicenseKey);
|
|
1344
1752
|
const isPaid = state.isLicenseRegistered && state.paymentStatus === 'PAID';
|
|
1345
1753
|
const isMembershipMode = mode === 'youtube-membership';
|
|
1346
|
-
const usageLabel = formatUsageLabel(state,
|
|
1754
|
+
const usageLabel = formatUsageLabel(state, translate);
|
|
1347
1755
|
const handleLicenseSubmit = async (submittedLicenseKey) => {
|
|
1348
1756
|
if (onLicenseSubmit) {
|
|
1349
1757
|
await onLicenseSubmit(submittedLicenseKey);
|
|
@@ -1360,79 +1768,80 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
|
|
|
1360
1768
|
React.createElement("div", { className: "designbase-figma-page-license__header" },
|
|
1361
1769
|
React.createElement("div", { className: "designbase-figma-page-license__title" },
|
|
1362
1770
|
React.createElement("h2", null, isMembershipMode
|
|
1363
|
-
? resolveText(
|
|
1771
|
+
? resolveText(translate, { key: 'license.youtube_membership' }, 'YouTube 멤버십')
|
|
1364
1772
|
: isPaid
|
|
1365
|
-
? resolveText(
|
|
1366
|
-
: resolveText(
|
|
1773
|
+
? resolveText(translate, { key: 'license.pro_account' }, '프로 계정')
|
|
1774
|
+
: resolveText(translate, { key: 'license.upgrade_to_pro' }, '프로로 업그레이드')),
|
|
1367
1775
|
state.planTier && state.planTier !== 'FREE' && (React.createElement("span", { className: "designbase-figma-page-license__tier" }, state.planTier))),
|
|
1368
1776
|
React.createElement("p", { className: "designbase-figma-page-license__description" }, isPaid
|
|
1369
|
-
? resolveText(
|
|
1777
|
+
? resolveText(translate, { key: 'license.all_features_available' }, '모든 기능을 사용할 수 있습니다.')
|
|
1370
1778
|
: isMembershipMode
|
|
1371
|
-
? resolveText(
|
|
1372
|
-
: resolveText(
|
|
1779
|
+
? resolveText(translate, { key: 'license.youtube_membership_description' }, 'YouTube 멤버십에 가입하면 Designbase 플러그인을 무제한으로 사용할 수 있습니다.')
|
|
1780
|
+
: resolveText(translate, { key: 'license.purchase_for_unlimited' }, '디자인베이스 멤버십 또는 라이선스로 무제한 이용이 가능합니다.')),
|
|
1373
1781
|
!isPaid && !isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__usage" }, usageLabel))),
|
|
1374
|
-
!isMembershipMode && (React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t:
|
|
1782
|
+
!isMembershipMode && (React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t: translate })),
|
|
1375
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)),
|
|
1376
1784
|
isPaid && (React.createElement("div", { className: "designbase-figma-page-license__section" },
|
|
1377
1785
|
React.createElement("div", { className: "designbase-figma-page-license__section-header" },
|
|
1378
|
-
React.createElement("h3", null, resolveText(
|
|
1786
|
+
React.createElement("h3", null, resolveText(translate, { key: 'license.activated' }, '라이선스 활성화됨')),
|
|
1379
1787
|
React.createElement(react.Button, { onPress: () => setShowDetails(!showDetails), variant: "tertiary", size: "s", iconOnly: true },
|
|
1380
1788
|
React.createElement(icons.MoreHorizontalIcon, { size: 16 }))),
|
|
1381
|
-
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 }),
|
|
1382
1790
|
React.createElement("p", { className: "designbase-figma-page-license__usage" }, usageLabel),
|
|
1383
1791
|
showDetails && (React.createElement("div", { className: "designbase-figma-page-license__details" },
|
|
1384
1792
|
React.createElement("div", { className: "designbase-figma-page-license__activation-info" },
|
|
1385
1793
|
React.createElement("div", { className: "designbase-figma-page-license__remaining" },
|
|
1386
1794
|
Math.max(0, state.activationLimit - state.activationUsage),
|
|
1387
1795
|
' ',
|
|
1388
|
-
resolveText(
|
|
1796
|
+
resolveText(translate, { key: 'license.activations_remaining' }, '활성'),
|
|
1389
1797
|
' ',
|
|
1390
|
-
resolveText(
|
|
1798
|
+
resolveText(translate, { key: 'license.spots_remaining' }, '자리 남음')),
|
|
1391
1799
|
React.createElement("div", { className: "designbase-figma-page-license__usage-count" },
|
|
1392
1800
|
state.activationUsage,
|
|
1393
1801
|
"/",
|
|
1394
1802
|
state.activationLimit)),
|
|
1395
1803
|
React.createElement("div", { className: "designbase-figma-page-license__action" },
|
|
1396
1804
|
React.createElement(react.Button, { onPress: deactivateLicense, variant: "secondary", size: "s", fullWidth: true, disabled: isDeactivating }, isDeactivating
|
|
1397
|
-
? resolveText(
|
|
1398
|
-
: resolveText(
|
|
1805
|
+
? resolveText(translate, { key: 'license.deactivating' }, '비활성화 중...')
|
|
1806
|
+
: resolveText(translate, { key: 'license.deactivate' }, '라이선스 비활성화')),
|
|
1399
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))))))),
|
|
1400
1808
|
!isPaid && (React.createElement(React.Fragment, null,
|
|
1401
|
-
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 })),
|
|
1402
1810
|
!isMembershipMode && (enableAccountAuth || links.purchaseUrl || links.accountUrl) && (React.createElement("div", { className: "designbase-figma-page-license__section" },
|
|
1403
1811
|
React.createElement("div", { className: "designbase-figma-page-license__section-header" },
|
|
1404
|
-
React.createElement("h3", null, resolveText(
|
|
1405
|
-
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 계정으로 로그인하거나 멤버십을 구매하면 플러그인이 자동으로 활성화됩니다.')),
|
|
1406
1814
|
React.createElement("div", { className: "designbase-figma-page-license__actions" },
|
|
1407
1815
|
enableAccountAuth && (React.createElement(react.Button, { onPress: startDesignbaseAuth, variant: "primary", size: "m", disabled: isStartingAuth || isVerifying, fullWidth: true }, isStartingAuth
|
|
1408
|
-
? resolveText(
|
|
1409
|
-
: resolveText(
|
|
1816
|
+
? resolveText(translate, { key: 'license.authenticating' }, '인증 중...')
|
|
1817
|
+
: resolveText(translate, { key: 'license.login_with_designbase' }, '디자인베이스로 로그인'))),
|
|
1410
1818
|
links.purchaseUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(links.purchaseUrl), variant: "secondary", size: "m", fullWidth: true },
|
|
1411
|
-
React.createElement("span", null, resolveText(
|
|
1819
|
+
React.createElement("span", null, resolveText(translate, { key: 'license.purchase_membership' }, '멤버십 안내')),
|
|
1412
1820
|
React.createElement(icons.ExternalLinkIcon, { size: 16 }))),
|
|
1413
1821
|
links.accountUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(links.accountUrl), variant: "tertiary", size: "s", fullWidth: true },
|
|
1414
|
-
React.createElement("span", null, resolveText(
|
|
1822
|
+
React.createElement("span", null, resolveText(translate, { key: 'license.manage_account' }, '계정·멤버십 관리')),
|
|
1415
1823
|
React.createElement(icons.ExternalLinkIcon, { size: 16 })))))),
|
|
1416
1824
|
showLicenseKeyInput && (React.createElement("div", { className: isMembershipMode
|
|
1417
1825
|
? 'designbase-figma-page-license__key-form'
|
|
1418
1826
|
: 'designbase-figma-page-license__section' },
|
|
1419
1827
|
React.createElement("div", { className: "designbase-figma-page-license__section-header" },
|
|
1420
|
-
React.createElement("h3", null, resolveText(
|
|
1421
|
-
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 }))))),
|
|
1422
1830
|
links.helpUrl && !isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__disclaimer" },
|
|
1423
|
-
React.createElement("button", { type: "button", className: "designbase-figma-page-license__link", onClick: () => openExternalUrl(links.helpUrl) }, resolveText(
|
|
1424
|
-
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') },
|
|
1425
1833
|
React.createElement(icons.CloseIcon, { size: 16 }))));
|
|
1426
1834
|
};
|
|
1427
1835
|
PageLicense.displayName = 'PageLicense';
|
|
1428
1836
|
|
|
1429
|
-
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);
|
|
1430
1839
|
const getBadgeText = () => {
|
|
1431
1840
|
if (text)
|
|
1432
1841
|
return text;
|
|
1433
1842
|
return isActive
|
|
1434
|
-
? (
|
|
1435
|
-
: (
|
|
1843
|
+
? translate('proUser')
|
|
1844
|
+
: translate('usingFree');
|
|
1436
1845
|
};
|
|
1437
1846
|
const getBadgeVariant = () => {
|
|
1438
1847
|
return isActive ? 'success' : 'secondary';
|
|
@@ -1441,7 +1850,8 @@ const PaymentBadge = ({ isActive, onClick, isLoading = false, text, t = (key) =>
|
|
|
1441
1850
|
};
|
|
1442
1851
|
PaymentBadge.displayName = 'PaymentBadge';
|
|
1443
1852
|
|
|
1444
|
-
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);
|
|
1445
1855
|
const [isCompleted, setIsCompleted] = React.useState(false);
|
|
1446
1856
|
const completeFiredRef = React.useRef(false);
|
|
1447
1857
|
const { processedNodes, totalNodes } = progress;
|
|
@@ -1471,11 +1881,11 @@ const ProgressModal = ({ isOpen, onClose, progress, title = { key: 'progress.wor
|
|
|
1471
1881
|
onClose();
|
|
1472
1882
|
};
|
|
1473
1883
|
const modalClasses = clsx('designbase-figma-progress-modal', className);
|
|
1474
|
-
const displayTitle = resolveText(
|
|
1475
|
-
const displayMessage = resolveText(
|
|
1476
|
-
const displayStopText = resolveText(
|
|
1477
|
-
const displayConfirmText = resolveText(
|
|
1478
|
-
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);
|
|
1479
1889
|
return (React.createElement(react.Modal, { isOpen: isOpen, onClose: isCompleted ? onClose : undefined, title: displayTitle, size: "s", className: modalClasses, showCloseButton: false },
|
|
1480
1890
|
React.createElement("div", { className: "designbase-figma-progress-modal__content" },
|
|
1481
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" },
|
|
@@ -1529,7 +1939,8 @@ const ResizablePlugin = ({ children, minWidth = 360, maxWidth = 460, minHeight =
|
|
|
1529
1939
|
};
|
|
1530
1940
|
ResizablePlugin.displayName = 'ResizablePlugin';
|
|
1531
1941
|
|
|
1532
|
-
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);
|
|
1533
1944
|
const [tempCategories, setTempCategories] = React.useState(initialCategories);
|
|
1534
1945
|
const [draggedIndex, setDraggedIndex] = React.useState(null);
|
|
1535
1946
|
React.useEffect(() => {
|
|
@@ -1622,8 +2033,8 @@ const SettingsModal = ({ isOpen, onClose, categories: initialCategories, categor
|
|
|
1622
2033
|
}
|
|
1623
2034
|
};
|
|
1624
2035
|
const modalClasses = clsx('designbase-figma-settings-modal', className);
|
|
1625
|
-
const displayTitle = resolveText(
|
|
1626
|
-
const displayDescription = resolveText(
|
|
2036
|
+
const displayTitle = resolveText(translate, title, '목록 변경');
|
|
2037
|
+
const displayDescription = resolveText(translate, description, '드래그하여 순서를 변경하거나, 토글하여 카테고리를 숨길 수 있습니다.');
|
|
1627
2038
|
return (React.createElement(react.Modal, { isOpen: isOpen, onClose: onClose, title: displayTitle, size: "m", className: modalClasses },
|
|
1628
2039
|
React.createElement("div", { className: "designbase-figma-settings-modal__content" },
|
|
1629
2040
|
displayDescription && (React.createElement("p", { className: "designbase-figma-settings-modal__description" }, displayDescription)),
|
|
@@ -1635,32 +2046,33 @@ const SettingsModal = ({ isOpen, onClose, categories: initialCategories, categor
|
|
|
1635
2046
|
React.createElement("span", { className: "designbase-figma-settings-modal__drag-handle" },
|
|
1636
2047
|
React.createElement(icons.GripVerticalIcon, { size: 16 })),
|
|
1637
2048
|
category.icon && (React.createElement("span", { className: "designbase-figma-settings-modal__category-icon" }, category.icon)),
|
|
1638
|
-
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))),
|
|
1639
2050
|
React.createElement(react.Toggle, { checked: category.enabled, onChange: () => handleToggle(category.id), size: "s" })))))),
|
|
1640
2051
|
React.createElement("div", { className: "designbase-figma-settings-modal__footer" },
|
|
1641
|
-
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' }, '초기화'))),
|
|
1642
2053
|
React.createElement("div", { className: "designbase-figma-settings-modal__footer-right" },
|
|
1643
|
-
React.createElement(react.Button, { onPress: handleCancel, variant: "tertiary", size: "s" }, resolveText(
|
|
1644
|
-
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' }, '저장'))))));
|
|
1645
2056
|
};
|
|
1646
2057
|
SettingsModal.displayName = 'SettingsModal';
|
|
1647
2058
|
|
|
1648
|
-
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);
|
|
1649
2061
|
const classes = [
|
|
1650
2062
|
'designbase-figma-title-description',
|
|
1651
2063
|
className,
|
|
1652
2064
|
]
|
|
1653
2065
|
.filter(Boolean)
|
|
1654
2066
|
.join(' ');
|
|
1655
|
-
const displayTitle = resolveText(
|
|
1656
|
-
const displayDescription = resolveText(
|
|
2067
|
+
const displayTitle = resolveText(translate, title);
|
|
2068
|
+
const displayDescription = resolveText(translate, description);
|
|
1657
2069
|
return (React.createElement("div", { className: classes },
|
|
1658
2070
|
iconSrc && (React.createElement("img", { className: "designbase-figma-title-description__icon", src: iconSrc, alt: iconAlt })),
|
|
1659
2071
|
React.createElement("h5", { className: "designbase-figma-title-description__title" }, displayTitle),
|
|
1660
2072
|
React.createElement("p", { className: "designbase-figma-title-description__description" }, displayDescription),
|
|
1661
2073
|
button && React.createElement("div", { className: "designbase-figma-title-description__button" }, button),
|
|
1662
2074
|
features && features.length > 0 && (React.createElement("ul", { className: "designbase-figma-title-description__features" }, features.map((feature, index) => {
|
|
1663
|
-
const displayFeature = resolveText(
|
|
2075
|
+
const displayFeature = resolveText(translate, feature);
|
|
1664
2076
|
return (React.createElement("li", { key: index, className: "designbase-figma-title-description__feature-item" },
|
|
1665
2077
|
React.createElement("span", { className: "designbase-figma-title-description__check-icon" },
|
|
1666
2078
|
React.createElement("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
@@ -1671,10 +2083,11 @@ const TitleDescription = ({ iconSrc, iconAlt = 'Icon', title, description, butto
|
|
|
1671
2083
|
};
|
|
1672
2084
|
TitleDescription.displayName = 'TitleDescription';
|
|
1673
2085
|
|
|
1674
|
-
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 }) => {
|
|
1675
|
-
const
|
|
1676
|
-
const
|
|
1677
|
-
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, '지금 업그레이드');
|
|
1678
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) => {
|
|
1679
2092
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
1680
2093
|
e.preventDefault();
|
|
@@ -1690,540 +2103,544 @@ const UpgradeBanner = ({ onClick, variant = 'button', isLoading = false, title =
|
|
|
1690
2103
|
};
|
|
1691
2104
|
UpgradeBanner.displayName = 'UpgradeBanner';
|
|
1692
2105
|
|
|
1693
|
-
Object.defineProperty(exports,
|
|
2106
|
+
Object.defineProperty(exports, "Accordion", {
|
|
1694
2107
|
enumerable: true,
|
|
1695
2108
|
get: function () { return react.Accordion; }
|
|
1696
2109
|
});
|
|
1697
|
-
Object.defineProperty(exports,
|
|
2110
|
+
Object.defineProperty(exports, "ActivityHeatmap", {
|
|
1698
2111
|
enumerable: true,
|
|
1699
2112
|
get: function () { return react.ActivityHeatmap; }
|
|
1700
2113
|
});
|
|
1701
|
-
Object.defineProperty(exports,
|
|
2114
|
+
Object.defineProperty(exports, "AdBanner", {
|
|
1702
2115
|
enumerable: true,
|
|
1703
2116
|
get: function () { return react.AdBanner; }
|
|
1704
2117
|
});
|
|
1705
|
-
Object.defineProperty(exports,
|
|
2118
|
+
Object.defineProperty(exports, "AiChat", {
|
|
1706
2119
|
enumerable: true,
|
|
1707
2120
|
get: function () { return react.AiChat; }
|
|
1708
2121
|
});
|
|
1709
|
-
Object.defineProperty(exports,
|
|
2122
|
+
Object.defineProperty(exports, "AiChatList", {
|
|
1710
2123
|
enumerable: true,
|
|
1711
2124
|
get: function () { return react.AiChatList; }
|
|
1712
2125
|
});
|
|
1713
|
-
Object.defineProperty(exports,
|
|
2126
|
+
Object.defineProperty(exports, "Alert", {
|
|
1714
2127
|
enumerable: true,
|
|
1715
2128
|
get: function () { return react.Alert; }
|
|
1716
2129
|
});
|
|
1717
|
-
Object.defineProperty(exports,
|
|
2130
|
+
Object.defineProperty(exports, "AnimationBackground", {
|
|
1718
2131
|
enumerable: true,
|
|
1719
2132
|
get: function () { return react.AnimationBackground; }
|
|
1720
2133
|
});
|
|
1721
|
-
Object.defineProperty(exports,
|
|
2134
|
+
Object.defineProperty(exports, "AnimationText", {
|
|
1722
2135
|
enumerable: true,
|
|
1723
2136
|
get: function () { return react.AnimationText; }
|
|
1724
2137
|
});
|
|
1725
|
-
Object.defineProperty(exports,
|
|
2138
|
+
Object.defineProperty(exports, "AppBadge", {
|
|
1726
2139
|
enumerable: true,
|
|
1727
2140
|
get: function () { return react.AppBadge; }
|
|
1728
2141
|
});
|
|
1729
|
-
Object.defineProperty(exports,
|
|
2142
|
+
Object.defineProperty(exports, "AudioPlayer", {
|
|
1730
2143
|
enumerable: true,
|
|
1731
2144
|
get: function () { return react.AudioPlayer; }
|
|
1732
2145
|
});
|
|
1733
|
-
Object.defineProperty(exports,
|
|
2146
|
+
Object.defineProperty(exports, "Avatar", {
|
|
1734
2147
|
enumerable: true,
|
|
1735
2148
|
get: function () { return react.Avatar; }
|
|
1736
2149
|
});
|
|
1737
|
-
Object.defineProperty(exports,
|
|
2150
|
+
Object.defineProperty(exports, "Backdrop", {
|
|
1738
2151
|
enumerable: true,
|
|
1739
2152
|
get: function () { return react.Backdrop; }
|
|
1740
2153
|
});
|
|
1741
|
-
Object.defineProperty(exports,
|
|
2154
|
+
Object.defineProperty(exports, "Badge", {
|
|
1742
2155
|
enumerable: true,
|
|
1743
2156
|
get: function () { return react.Badge; }
|
|
1744
2157
|
});
|
|
1745
|
-
Object.defineProperty(exports,
|
|
2158
|
+
Object.defineProperty(exports, "Banner", {
|
|
1746
2159
|
enumerable: true,
|
|
1747
2160
|
get: function () { return react.Banner; }
|
|
1748
2161
|
});
|
|
1749
|
-
Object.defineProperty(exports,
|
|
2162
|
+
Object.defineProperty(exports, "BottomNavigation", {
|
|
1750
2163
|
enumerable: true,
|
|
1751
2164
|
get: function () { return react.BottomNavigation; }
|
|
1752
2165
|
});
|
|
1753
|
-
Object.defineProperty(exports,
|
|
2166
|
+
Object.defineProperty(exports, "BottomSheet", {
|
|
1754
2167
|
enumerable: true,
|
|
1755
2168
|
get: function () { return react.BottomSheet; }
|
|
1756
2169
|
});
|
|
1757
|
-
Object.defineProperty(exports,
|
|
2170
|
+
Object.defineProperty(exports, "Breadcrumbs", {
|
|
1758
2171
|
enumerable: true,
|
|
1759
2172
|
get: function () { return react.Breadcrumbs; }
|
|
1760
2173
|
});
|
|
1761
|
-
Object.defineProperty(exports,
|
|
2174
|
+
Object.defineProperty(exports, "Button", {
|
|
1762
2175
|
enumerable: true,
|
|
1763
2176
|
get: function () { return react.Button; }
|
|
1764
2177
|
});
|
|
1765
|
-
Object.defineProperty(exports,
|
|
2178
|
+
Object.defineProperty(exports, "Calendar", {
|
|
1766
2179
|
enumerable: true,
|
|
1767
2180
|
get: function () { return react.Calendar; }
|
|
1768
2181
|
});
|
|
1769
|
-
Object.defineProperty(exports,
|
|
2182
|
+
Object.defineProperty(exports, "Card", {
|
|
1770
2183
|
enumerable: true,
|
|
1771
2184
|
get: function () { return react.Card; }
|
|
1772
2185
|
});
|
|
1773
|
-
Object.defineProperty(exports,
|
|
2186
|
+
Object.defineProperty(exports, "Carousel", {
|
|
1774
2187
|
enumerable: true,
|
|
1775
2188
|
get: function () { return react.Carousel; }
|
|
1776
2189
|
});
|
|
1777
|
-
Object.defineProperty(exports,
|
|
2190
|
+
Object.defineProperty(exports, "ChatComposer", {
|
|
1778
2191
|
enumerable: true,
|
|
1779
2192
|
get: function () { return react.ChatComposer; }
|
|
1780
2193
|
});
|
|
1781
|
-
Object.defineProperty(exports,
|
|
2194
|
+
Object.defineProperty(exports, "ChatList", {
|
|
1782
2195
|
enumerable: true,
|
|
1783
2196
|
get: function () { return react.ChatList; }
|
|
1784
2197
|
});
|
|
1785
|
-
Object.defineProperty(exports,
|
|
2198
|
+
Object.defineProperty(exports, "ChatMessage", {
|
|
1786
2199
|
enumerable: true,
|
|
1787
2200
|
get: function () { return react.ChatMessage; }
|
|
1788
2201
|
});
|
|
1789
|
-
Object.defineProperty(exports,
|
|
2202
|
+
Object.defineProperty(exports, "ChatOrb", {
|
|
1790
2203
|
enumerable: true,
|
|
1791
2204
|
get: function () { return react.ChatOrb; }
|
|
1792
2205
|
});
|
|
1793
|
-
Object.defineProperty(exports,
|
|
2206
|
+
Object.defineProperty(exports, "ChatRoom", {
|
|
1794
2207
|
enumerable: true,
|
|
1795
2208
|
get: function () { return react.ChatRoom; }
|
|
1796
2209
|
});
|
|
1797
|
-
Object.defineProperty(exports,
|
|
2210
|
+
Object.defineProperty(exports, "ChatSuggestions", {
|
|
1798
2211
|
enumerable: true,
|
|
1799
2212
|
get: function () { return react.ChatSuggestions; }
|
|
1800
2213
|
});
|
|
1801
|
-
Object.defineProperty(exports,
|
|
2214
|
+
Object.defineProperty(exports, "ChatTyping", {
|
|
1802
2215
|
enumerable: true,
|
|
1803
2216
|
get: function () { return react.ChatTyping; }
|
|
1804
2217
|
});
|
|
1805
|
-
Object.defineProperty(exports,
|
|
2218
|
+
Object.defineProperty(exports, "ChatWelcome", {
|
|
1806
2219
|
enumerable: true,
|
|
1807
2220
|
get: function () { return react.ChatWelcome; }
|
|
1808
2221
|
});
|
|
1809
|
-
Object.defineProperty(exports,
|
|
2222
|
+
Object.defineProperty(exports, "ChatWidget", {
|
|
1810
2223
|
enumerable: true,
|
|
1811
2224
|
get: function () { return react.ChatWidget; }
|
|
1812
2225
|
});
|
|
1813
|
-
Object.defineProperty(exports,
|
|
2226
|
+
Object.defineProperty(exports, "Checkbox", {
|
|
1814
2227
|
enumerable: true,
|
|
1815
2228
|
get: function () { return react.Checkbox; }
|
|
1816
2229
|
});
|
|
1817
|
-
Object.defineProperty(exports,
|
|
2230
|
+
Object.defineProperty(exports, "Chip", {
|
|
1818
2231
|
enumerable: true,
|
|
1819
2232
|
get: function () { return react.Chip; }
|
|
1820
2233
|
});
|
|
1821
|
-
Object.defineProperty(exports,
|
|
2234
|
+
Object.defineProperty(exports, "CodeBlock", {
|
|
1822
2235
|
enumerable: true,
|
|
1823
2236
|
get: function () { return react.CodeBlock; }
|
|
1824
2237
|
});
|
|
1825
|
-
Object.defineProperty(exports,
|
|
2238
|
+
Object.defineProperty(exports, "ColorPicker", {
|
|
1826
2239
|
enumerable: true,
|
|
1827
2240
|
get: function () { return react.ColorPicker; }
|
|
1828
2241
|
});
|
|
1829
|
-
Object.defineProperty(exports,
|
|
2242
|
+
Object.defineProperty(exports, "ColorSwatch", {
|
|
1830
2243
|
enumerable: true,
|
|
1831
2244
|
get: function () { return react.ColorSwatch; }
|
|
1832
2245
|
});
|
|
1833
|
-
Object.defineProperty(exports,
|
|
2246
|
+
Object.defineProperty(exports, "Confirm", {
|
|
1834
2247
|
enumerable: true,
|
|
1835
2248
|
get: function () { return react.Confirm; }
|
|
1836
2249
|
});
|
|
1837
|
-
Object.defineProperty(exports,
|
|
2250
|
+
Object.defineProperty(exports, "Container", {
|
|
1838
2251
|
enumerable: true,
|
|
1839
2252
|
get: function () { return react.Container; }
|
|
1840
2253
|
});
|
|
1841
|
-
Object.defineProperty(exports,
|
|
2254
|
+
Object.defineProperty(exports, "ContextMenu", {
|
|
1842
2255
|
enumerable: true,
|
|
1843
2256
|
get: function () { return react.ContextMenu; }
|
|
1844
2257
|
});
|
|
1845
|
-
Object.defineProperty(exports,
|
|
2258
|
+
Object.defineProperty(exports, "CookieBanner", {
|
|
1846
2259
|
enumerable: true,
|
|
1847
2260
|
get: function () { return react.CookieBanner; }
|
|
1848
2261
|
});
|
|
1849
|
-
Object.defineProperty(exports,
|
|
2262
|
+
Object.defineProperty(exports, "Countdown", {
|
|
1850
2263
|
enumerable: true,
|
|
1851
2264
|
get: function () { return react.Countdown; }
|
|
1852
2265
|
});
|
|
1853
|
-
Object.defineProperty(exports,
|
|
2266
|
+
Object.defineProperty(exports, "CursorFollower", {
|
|
1854
2267
|
enumerable: true,
|
|
1855
2268
|
get: function () { return react.CursorFollower; }
|
|
1856
2269
|
});
|
|
1857
|
-
Object.defineProperty(exports,
|
|
2270
|
+
Object.defineProperty(exports, "DatePicker", {
|
|
1858
2271
|
enumerable: true,
|
|
1859
2272
|
get: function () { return react.DatePicker; }
|
|
1860
2273
|
});
|
|
1861
|
-
Object.defineProperty(exports,
|
|
2274
|
+
Object.defineProperty(exports, "Divider", {
|
|
1862
2275
|
enumerable: true,
|
|
1863
2276
|
get: function () { return react.Divider; }
|
|
1864
2277
|
});
|
|
1865
|
-
Object.defineProperty(exports,
|
|
2278
|
+
Object.defineProperty(exports, "DownloadProgress", {
|
|
1866
2279
|
enumerable: true,
|
|
1867
2280
|
get: function () { return react.DownloadProgress; }
|
|
1868
2281
|
});
|
|
1869
|
-
Object.defineProperty(exports,
|
|
2282
|
+
Object.defineProperty(exports, "Drawer", {
|
|
1870
2283
|
enumerable: true,
|
|
1871
2284
|
get: function () { return react.Drawer; }
|
|
1872
2285
|
});
|
|
1873
|
-
Object.defineProperty(exports,
|
|
2286
|
+
Object.defineProperty(exports, "Dropdown", {
|
|
1874
2287
|
enumerable: true,
|
|
1875
2288
|
get: function () { return react.Dropdown; }
|
|
1876
2289
|
});
|
|
1877
|
-
Object.defineProperty(exports,
|
|
2290
|
+
Object.defineProperty(exports, "Dropzone", {
|
|
1878
2291
|
enumerable: true,
|
|
1879
2292
|
get: function () { return react.Dropzone; }
|
|
1880
2293
|
});
|
|
1881
|
-
Object.defineProperty(exports,
|
|
2294
|
+
Object.defineProperty(exports, "EmailVerify", {
|
|
1882
2295
|
enumerable: true,
|
|
1883
2296
|
get: function () { return react.EmailVerify; }
|
|
1884
2297
|
});
|
|
1885
|
-
Object.defineProperty(exports,
|
|
2298
|
+
Object.defineProperty(exports, "EmptyState", {
|
|
1886
2299
|
enumerable: true,
|
|
1887
2300
|
get: function () { return react.EmptyState; }
|
|
1888
2301
|
});
|
|
1889
|
-
Object.defineProperty(exports,
|
|
2302
|
+
Object.defineProperty(exports, "FileUploader", {
|
|
1890
2303
|
enumerable: true,
|
|
1891
2304
|
get: function () { return react.FileUploader; }
|
|
1892
2305
|
});
|
|
1893
|
-
Object.defineProperty(exports,
|
|
2306
|
+
Object.defineProperty(exports, "FloatingActionButton", {
|
|
1894
2307
|
enumerable: true,
|
|
1895
2308
|
get: function () { return react.FloatingActionButton; }
|
|
1896
2309
|
});
|
|
1897
|
-
Object.defineProperty(exports,
|
|
2310
|
+
Object.defineProperty(exports, "Footer", {
|
|
1898
2311
|
enumerable: true,
|
|
1899
2312
|
get: function () { return react.Footer; }
|
|
1900
2313
|
});
|
|
1901
|
-
Object.defineProperty(exports,
|
|
2314
|
+
Object.defineProperty(exports, "Form", {
|
|
1902
2315
|
enumerable: true,
|
|
1903
2316
|
get: function () { return react.Form; }
|
|
1904
2317
|
});
|
|
1905
|
-
Object.defineProperty(exports,
|
|
2318
|
+
Object.defineProperty(exports, "Gantt", {
|
|
1906
2319
|
enumerable: true,
|
|
1907
2320
|
get: function () { return react.Gantt; }
|
|
1908
2321
|
});
|
|
1909
|
-
Object.defineProperty(exports,
|
|
2322
|
+
Object.defineProperty(exports, "Gradient", {
|
|
1910
2323
|
enumerable: true,
|
|
1911
2324
|
get: function () { return react.Gradient; }
|
|
1912
2325
|
});
|
|
1913
|
-
Object.defineProperty(exports,
|
|
2326
|
+
Object.defineProperty(exports, "Grid", {
|
|
1914
2327
|
enumerable: true,
|
|
1915
2328
|
get: function () { return react.Grid; }
|
|
1916
2329
|
});
|
|
1917
|
-
Object.defineProperty(exports,
|
|
2330
|
+
Object.defineProperty(exports, "GridBackground", {
|
|
1918
2331
|
enumerable: true,
|
|
1919
2332
|
get: function () { return react.GridBackground; }
|
|
1920
2333
|
});
|
|
1921
|
-
Object.defineProperty(exports,
|
|
2334
|
+
Object.defineProperty(exports, "GridItem", {
|
|
1922
2335
|
enumerable: true,
|
|
1923
2336
|
get: function () { return react.GridItem; }
|
|
1924
2337
|
});
|
|
1925
|
-
Object.defineProperty(exports,
|
|
2338
|
+
Object.defineProperty(exports, "Image", {
|
|
1926
2339
|
enumerable: true,
|
|
1927
2340
|
get: function () { return react.Image; }
|
|
1928
2341
|
});
|
|
1929
|
-
Object.defineProperty(exports,
|
|
2342
|
+
Object.defineProperty(exports, "ImageList", {
|
|
1930
2343
|
enumerable: true,
|
|
1931
2344
|
get: function () { return react.ImageList; }
|
|
1932
2345
|
});
|
|
1933
|
-
Object.defineProperty(exports,
|
|
2346
|
+
Object.defineProperty(exports, "ImagePlaceholder", {
|
|
1934
2347
|
enumerable: true,
|
|
1935
2348
|
get: function () { return react.ImagePlaceholder; }
|
|
1936
2349
|
});
|
|
1937
|
-
Object.defineProperty(exports,
|
|
2350
|
+
Object.defineProperty(exports, "Indicator", {
|
|
1938
2351
|
enumerable: true,
|
|
1939
2352
|
get: function () { return react.Indicator; }
|
|
1940
2353
|
});
|
|
1941
|
-
Object.defineProperty(exports,
|
|
2354
|
+
Object.defineProperty(exports, "Input", {
|
|
1942
2355
|
enumerable: true,
|
|
1943
2356
|
get: function () { return react.Input; }
|
|
1944
2357
|
});
|
|
1945
|
-
Object.defineProperty(exports,
|
|
2358
|
+
Object.defineProperty(exports, "Kanban", {
|
|
1946
2359
|
enumerable: true,
|
|
1947
2360
|
get: function () { return react.Kanban; }
|
|
1948
2361
|
});
|
|
1949
|
-
Object.defineProperty(exports,
|
|
2362
|
+
Object.defineProperty(exports, "Label", {
|
|
1950
2363
|
enumerable: true,
|
|
1951
2364
|
get: function () { return react.Label; }
|
|
1952
2365
|
});
|
|
1953
|
-
Object.defineProperty(exports,
|
|
2366
|
+
Object.defineProperty(exports, "Lightbox", {
|
|
1954
2367
|
enumerable: true,
|
|
1955
2368
|
get: function () { return react.Lightbox; }
|
|
1956
2369
|
});
|
|
1957
|
-
Object.defineProperty(exports,
|
|
2370
|
+
Object.defineProperty(exports, "List", {
|
|
1958
2371
|
enumerable: true,
|
|
1959
2372
|
get: function () { return react.List; }
|
|
1960
2373
|
});
|
|
1961
|
-
Object.defineProperty(exports,
|
|
2374
|
+
Object.defineProperty(exports, "Logo", {
|
|
1962
2375
|
enumerable: true,
|
|
1963
2376
|
get: function () { return react.Logo; }
|
|
1964
2377
|
});
|
|
1965
|
-
Object.defineProperty(exports,
|
|
2378
|
+
Object.defineProperty(exports, "MarkdownEditor", {
|
|
1966
2379
|
enumerable: true,
|
|
1967
2380
|
get: function () { return react.MarkdownEditor; }
|
|
1968
2381
|
});
|
|
1969
|
-
Object.defineProperty(exports,
|
|
2382
|
+
Object.defineProperty(exports, "Marquee", {
|
|
1970
2383
|
enumerable: true,
|
|
1971
2384
|
get: function () { return react.Marquee; }
|
|
1972
2385
|
});
|
|
1973
|
-
Object.defineProperty(exports,
|
|
2386
|
+
Object.defineProperty(exports, "Masonry", {
|
|
1974
2387
|
enumerable: true,
|
|
1975
2388
|
get: function () { return react.Masonry; }
|
|
1976
2389
|
});
|
|
1977
|
-
Object.defineProperty(exports,
|
|
2390
|
+
Object.defineProperty(exports, "MenuItem", {
|
|
1978
2391
|
enumerable: true,
|
|
1979
2392
|
get: function () { return react.MenuItem; }
|
|
1980
2393
|
});
|
|
1981
|
-
Object.defineProperty(exports,
|
|
2394
|
+
Object.defineProperty(exports, "Modal", {
|
|
1982
2395
|
enumerable: true,
|
|
1983
2396
|
get: function () { return react.Modal; }
|
|
1984
2397
|
});
|
|
1985
|
-
Object.defineProperty(exports,
|
|
2398
|
+
Object.defineProperty(exports, "ModalBody", {
|
|
1986
2399
|
enumerable: true,
|
|
1987
2400
|
get: function () { return react.ModalBody; }
|
|
1988
2401
|
});
|
|
1989
|
-
Object.defineProperty(exports,
|
|
2402
|
+
Object.defineProperty(exports, "ModalFooter", {
|
|
1990
2403
|
enumerable: true,
|
|
1991
2404
|
get: function () { return react.ModalFooter; }
|
|
1992
2405
|
});
|
|
1993
|
-
Object.defineProperty(exports,
|
|
2406
|
+
Object.defineProperty(exports, "ModalHeader", {
|
|
1994
2407
|
enumerable: true,
|
|
1995
2408
|
get: function () { return react.ModalHeader; }
|
|
1996
2409
|
});
|
|
1997
|
-
Object.defineProperty(exports,
|
|
2410
|
+
Object.defineProperty(exports, "Navbar", {
|
|
1998
2411
|
enumerable: true,
|
|
1999
2412
|
get: function () { return react.Navbar; }
|
|
2000
2413
|
});
|
|
2001
|
-
Object.defineProperty(exports,
|
|
2414
|
+
Object.defineProperty(exports, "OnboardingModal", {
|
|
2002
2415
|
enumerable: true,
|
|
2003
2416
|
get: function () { return react.OnboardingModal; }
|
|
2004
2417
|
});
|
|
2005
|
-
Object.defineProperty(exports,
|
|
2418
|
+
Object.defineProperty(exports, "OtpInput", {
|
|
2006
2419
|
enumerable: true,
|
|
2007
2420
|
get: function () { return react.OtpInput; }
|
|
2008
2421
|
});
|
|
2009
|
-
Object.defineProperty(exports,
|
|
2422
|
+
Object.defineProperty(exports, "PageHeader", {
|
|
2010
2423
|
enumerable: true,
|
|
2011
2424
|
get: function () { return react.PageHeader; }
|
|
2012
2425
|
});
|
|
2013
|
-
Object.defineProperty(exports,
|
|
2426
|
+
Object.defineProperty(exports, "Pagination", {
|
|
2014
2427
|
enumerable: true,
|
|
2015
2428
|
get: function () { return react.Pagination; }
|
|
2016
2429
|
});
|
|
2017
|
-
Object.defineProperty(exports,
|
|
2430
|
+
Object.defineProperty(exports, "PhoneVerify", {
|
|
2018
2431
|
enumerable: true,
|
|
2019
2432
|
get: function () { return react.PhoneVerify; }
|
|
2020
2433
|
});
|
|
2021
|
-
Object.defineProperty(exports,
|
|
2434
|
+
Object.defineProperty(exports, "Popover", {
|
|
2022
2435
|
enumerable: true,
|
|
2023
2436
|
get: function () { return react.Popover; }
|
|
2024
2437
|
});
|
|
2025
|
-
Object.defineProperty(exports,
|
|
2438
|
+
Object.defineProperty(exports, "Progress", {
|
|
2026
2439
|
enumerable: true,
|
|
2027
2440
|
get: function () { return react.Progress; }
|
|
2028
2441
|
});
|
|
2029
|
-
Object.defineProperty(exports,
|
|
2442
|
+
Object.defineProperty(exports, "ProgressStep", {
|
|
2030
2443
|
enumerable: true,
|
|
2031
2444
|
get: function () { return react.ProgressStep; }
|
|
2032
2445
|
});
|
|
2033
|
-
Object.defineProperty(exports,
|
|
2446
|
+
Object.defineProperty(exports, "Progressbar", {
|
|
2034
2447
|
enumerable: true,
|
|
2035
2448
|
get: function () { return react.Progressbar; }
|
|
2036
2449
|
});
|
|
2037
|
-
Object.defineProperty(exports,
|
|
2450
|
+
Object.defineProperty(exports, "Radio", {
|
|
2038
2451
|
enumerable: true,
|
|
2039
2452
|
get: function () { return react.Radio; }
|
|
2040
2453
|
});
|
|
2041
|
-
Object.defineProperty(exports,
|
|
2454
|
+
Object.defineProperty(exports, "RandomGradient", {
|
|
2042
2455
|
enumerable: true,
|
|
2043
2456
|
get: function () { return react.RandomGradient; }
|
|
2044
2457
|
});
|
|
2045
|
-
Object.defineProperty(exports,
|
|
2458
|
+
Object.defineProperty(exports, "RangeSlider", {
|
|
2046
2459
|
enumerable: true,
|
|
2047
2460
|
get: function () { return react.RangeSlider; }
|
|
2048
2461
|
});
|
|
2049
|
-
Object.defineProperty(exports,
|
|
2462
|
+
Object.defineProperty(exports, "Rating", {
|
|
2050
2463
|
enumerable: true,
|
|
2051
2464
|
get: function () { return react.Rating; }
|
|
2052
2465
|
});
|
|
2053
|
-
Object.defineProperty(exports,
|
|
2466
|
+
Object.defineProperty(exports, "Reorder", {
|
|
2054
2467
|
enumerable: true,
|
|
2055
2468
|
get: function () { return react.Reorder; }
|
|
2056
2469
|
});
|
|
2057
|
-
Object.defineProperty(exports,
|
|
2470
|
+
Object.defineProperty(exports, "ResizablePanels", {
|
|
2058
2471
|
enumerable: true,
|
|
2059
2472
|
get: function () { return react.ResizablePanels; }
|
|
2060
2473
|
});
|
|
2061
|
-
Object.defineProperty(exports,
|
|
2474
|
+
Object.defineProperty(exports, "ScrollArea", {
|
|
2062
2475
|
enumerable: true,
|
|
2063
2476
|
get: function () { return react.ScrollArea; }
|
|
2064
2477
|
});
|
|
2065
|
-
Object.defineProperty(exports,
|
|
2478
|
+
Object.defineProperty(exports, "SearchBar", {
|
|
2066
2479
|
enumerable: true,
|
|
2067
2480
|
get: function () { return react.SearchBar; }
|
|
2068
2481
|
});
|
|
2069
|
-
Object.defineProperty(exports,
|
|
2482
|
+
Object.defineProperty(exports, "Section", {
|
|
2070
2483
|
enumerable: true,
|
|
2071
2484
|
get: function () { return react.Section; }
|
|
2072
2485
|
});
|
|
2073
|
-
Object.defineProperty(exports,
|
|
2486
|
+
Object.defineProperty(exports, "SectionAppDownload", {
|
|
2074
2487
|
enumerable: true,
|
|
2075
2488
|
get: function () { return react.SectionAppDownload; }
|
|
2076
2489
|
});
|
|
2077
|
-
Object.defineProperty(exports,
|
|
2490
|
+
Object.defineProperty(exports, "SectionContact", {
|
|
2078
2491
|
enumerable: true,
|
|
2079
2492
|
get: function () { return react.SectionContact; }
|
|
2080
2493
|
});
|
|
2081
|
-
Object.defineProperty(exports,
|
|
2494
|
+
Object.defineProperty(exports, "SectionCta", {
|
|
2082
2495
|
enumerable: true,
|
|
2083
2496
|
get: function () { return react.SectionCta; }
|
|
2084
2497
|
});
|
|
2085
|
-
Object.defineProperty(exports,
|
|
2498
|
+
Object.defineProperty(exports, "SectionFaq", {
|
|
2086
2499
|
enumerable: true,
|
|
2087
2500
|
get: function () { return react.SectionFaq; }
|
|
2088
2501
|
});
|
|
2089
|
-
Object.defineProperty(exports,
|
|
2502
|
+
Object.defineProperty(exports, "SectionFeature", {
|
|
2090
2503
|
enumerable: true,
|
|
2091
2504
|
get: function () { return react.SectionFeature; }
|
|
2092
2505
|
});
|
|
2093
|
-
Object.defineProperty(exports,
|
|
2506
|
+
Object.defineProperty(exports, "SectionFeatureGrid", {
|
|
2094
2507
|
enumerable: true,
|
|
2095
2508
|
get: function () { return react.SectionFeatureGrid; }
|
|
2096
2509
|
});
|
|
2097
|
-
Object.defineProperty(exports,
|
|
2510
|
+
Object.defineProperty(exports, "SectionHero", {
|
|
2098
2511
|
enumerable: true,
|
|
2099
2512
|
get: function () { return react.SectionHero; }
|
|
2100
2513
|
});
|
|
2101
|
-
Object.defineProperty(exports,
|
|
2514
|
+
Object.defineProperty(exports, "SectionLogoCloud", {
|
|
2102
2515
|
enumerable: true,
|
|
2103
2516
|
get: function () { return react.SectionLogoCloud; }
|
|
2104
2517
|
});
|
|
2105
|
-
Object.defineProperty(exports,
|
|
2518
|
+
Object.defineProperty(exports, "SectionPricing", {
|
|
2106
2519
|
enumerable: true,
|
|
2107
2520
|
get: function () { return react.SectionPricing; }
|
|
2108
2521
|
});
|
|
2109
|
-
Object.defineProperty(exports,
|
|
2522
|
+
Object.defineProperty(exports, "SectionStats", {
|
|
2110
2523
|
enumerable: true,
|
|
2111
2524
|
get: function () { return react.SectionStats; }
|
|
2112
2525
|
});
|
|
2113
|
-
Object.defineProperty(exports,
|
|
2526
|
+
Object.defineProperty(exports, "SectionTestimonials", {
|
|
2114
2527
|
enumerable: true,
|
|
2115
2528
|
get: function () { return react.SectionTestimonials; }
|
|
2116
2529
|
});
|
|
2117
|
-
Object.defineProperty(exports,
|
|
2530
|
+
Object.defineProperty(exports, "SegmentControl", {
|
|
2118
2531
|
enumerable: true,
|
|
2119
2532
|
get: function () { return react.SegmentControl; }
|
|
2120
2533
|
});
|
|
2121
|
-
Object.defineProperty(exports,
|
|
2534
|
+
Object.defineProperty(exports, "Select", {
|
|
2122
2535
|
enumerable: true,
|
|
2123
2536
|
get: function () { return react.Select; }
|
|
2124
2537
|
});
|
|
2125
|
-
Object.defineProperty(exports,
|
|
2538
|
+
Object.defineProperty(exports, "Share", {
|
|
2126
2539
|
enumerable: true,
|
|
2127
2540
|
get: function () { return react.Share; }
|
|
2128
2541
|
});
|
|
2129
|
-
Object.defineProperty(exports,
|
|
2542
|
+
Object.defineProperty(exports, "Sidebar", {
|
|
2130
2543
|
enumerable: true,
|
|
2131
2544
|
get: function () { return react.Sidebar; }
|
|
2132
2545
|
});
|
|
2133
|
-
Object.defineProperty(exports,
|
|
2546
|
+
Object.defineProperty(exports, "Signature", {
|
|
2134
2547
|
enumerable: true,
|
|
2135
2548
|
get: function () { return react.Signature; }
|
|
2136
2549
|
});
|
|
2137
|
-
Object.defineProperty(exports,
|
|
2550
|
+
Object.defineProperty(exports, "Skeleton", {
|
|
2138
2551
|
enumerable: true,
|
|
2139
2552
|
get: function () { return react.Skeleton; }
|
|
2140
2553
|
});
|
|
2141
|
-
Object.defineProperty(exports,
|
|
2554
|
+
Object.defineProperty(exports, "Spinner", {
|
|
2142
2555
|
enumerable: true,
|
|
2143
2556
|
get: function () { return react.Spinner; }
|
|
2144
2557
|
});
|
|
2145
|
-
Object.defineProperty(exports,
|
|
2558
|
+
Object.defineProperty(exports, "SplitView", {
|
|
2146
2559
|
enumerable: true,
|
|
2147
2560
|
get: function () { return react.SplitView; }
|
|
2148
2561
|
});
|
|
2149
|
-
Object.defineProperty(exports,
|
|
2562
|
+
Object.defineProperty(exports, "Stack", {
|
|
2150
2563
|
enumerable: true,
|
|
2151
2564
|
get: function () { return react.Stack; }
|
|
2152
2565
|
});
|
|
2153
|
-
Object.defineProperty(exports,
|
|
2566
|
+
Object.defineProperty(exports, "Stat", {
|
|
2154
2567
|
enumerable: true,
|
|
2155
2568
|
get: function () { return react.Stat; }
|
|
2156
2569
|
});
|
|
2157
|
-
Object.defineProperty(exports,
|
|
2570
|
+
Object.defineProperty(exports, "Stepper", {
|
|
2158
2571
|
enumerable: true,
|
|
2159
2572
|
get: function () { return react.Stepper; }
|
|
2160
2573
|
});
|
|
2161
|
-
Object.defineProperty(exports,
|
|
2574
|
+
Object.defineProperty(exports, "Table", {
|
|
2162
2575
|
enumerable: true,
|
|
2163
2576
|
get: function () { return react.Table; }
|
|
2164
2577
|
});
|
|
2165
|
-
Object.defineProperty(exports,
|
|
2578
|
+
Object.defineProperty(exports, "Tabs", {
|
|
2166
2579
|
enumerable: true,
|
|
2167
2580
|
get: function () { return react.Tabs; }
|
|
2168
2581
|
});
|
|
2169
|
-
Object.defineProperty(exports,
|
|
2582
|
+
Object.defineProperty(exports, "Testimonial", {
|
|
2170
2583
|
enumerable: true,
|
|
2171
2584
|
get: function () { return react.Testimonial; }
|
|
2172
2585
|
});
|
|
2173
|
-
Object.defineProperty(exports,
|
|
2586
|
+
Object.defineProperty(exports, "Textarea", {
|
|
2174
2587
|
enumerable: true,
|
|
2175
2588
|
get: function () { return react.Textarea; }
|
|
2176
2589
|
});
|
|
2177
|
-
Object.defineProperty(exports,
|
|
2590
|
+
Object.defineProperty(exports, "TimePicker", {
|
|
2178
2591
|
enumerable: true,
|
|
2179
2592
|
get: function () { return react.TimePicker; }
|
|
2180
2593
|
});
|
|
2181
|
-
Object.defineProperty(exports,
|
|
2594
|
+
Object.defineProperty(exports, "Timeline", {
|
|
2182
2595
|
enumerable: true,
|
|
2183
2596
|
get: function () { return react.Timeline; }
|
|
2184
2597
|
});
|
|
2185
|
-
Object.defineProperty(exports,
|
|
2598
|
+
Object.defineProperty(exports, "Toast", {
|
|
2186
2599
|
enumerable: true,
|
|
2187
2600
|
get: function () { return react.Toast; }
|
|
2188
2601
|
});
|
|
2189
|
-
Object.defineProperty(exports,
|
|
2602
|
+
Object.defineProperty(exports, "Toggle", {
|
|
2190
2603
|
enumerable: true,
|
|
2191
2604
|
get: function () { return react.Toggle; }
|
|
2192
2605
|
});
|
|
2193
|
-
Object.defineProperty(exports,
|
|
2606
|
+
Object.defineProperty(exports, "Toolbar", {
|
|
2194
2607
|
enumerable: true,
|
|
2195
2608
|
get: function () { return react.Toolbar; }
|
|
2196
2609
|
});
|
|
2197
|
-
Object.defineProperty(exports,
|
|
2610
|
+
Object.defineProperty(exports, "Tooltip", {
|
|
2198
2611
|
enumerable: true,
|
|
2199
2612
|
get: function () { return react.Tooltip; }
|
|
2200
2613
|
});
|
|
2201
|
-
Object.defineProperty(exports,
|
|
2614
|
+
Object.defineProperty(exports, "TopBanner", {
|
|
2202
2615
|
enumerable: true,
|
|
2203
2616
|
get: function () { return react.TopBanner; }
|
|
2204
2617
|
});
|
|
2205
|
-
Object.defineProperty(exports,
|
|
2618
|
+
Object.defineProperty(exports, "Tutorial", {
|
|
2206
2619
|
enumerable: true,
|
|
2207
2620
|
get: function () { return react.Tutorial; }
|
|
2208
2621
|
});
|
|
2209
|
-
Object.defineProperty(exports,
|
|
2622
|
+
Object.defineProperty(exports, "TwoFactor", {
|
|
2210
2623
|
enumerable: true,
|
|
2211
2624
|
get: function () { return react.TwoFactor; }
|
|
2212
2625
|
});
|
|
2213
|
-
Object.defineProperty(exports,
|
|
2626
|
+
Object.defineProperty(exports, "VideoPlayer", {
|
|
2214
2627
|
enumerable: true,
|
|
2215
2628
|
get: function () { return react.VideoPlayer; }
|
|
2216
2629
|
});
|
|
2217
|
-
Object.defineProperty(exports,
|
|
2630
|
+
Object.defineProperty(exports, "YouTubePlayer", {
|
|
2218
2631
|
enumerable: true,
|
|
2219
2632
|
get: function () { return react.YouTubePlayer; }
|
|
2220
2633
|
});
|
|
2221
|
-
Object.defineProperty(exports,
|
|
2634
|
+
Object.defineProperty(exports, "useContextMenu", {
|
|
2222
2635
|
enumerable: true,
|
|
2223
2636
|
get: function () { return react.useContextMenu; }
|
|
2224
2637
|
});
|
|
2225
|
-
exports
|
|
2638
|
+
Object.defineProperty(exports, "DEFAULT_LICENSE_MESSAGE_TYPES", {
|
|
2639
|
+
enumerable: true,
|
|
2640
|
+
get: function () { return figmaLicenseCore.DEFAULT_LICENSE_MESSAGE_TYPES; }
|
|
2641
|
+
});
|
|
2226
2642
|
exports.DonationBadge = DonationBadge;
|
|
2643
|
+
exports.FIGMA_UI_TRANSLATIONS = FIGMA_UI_TRANSLATIONS;
|
|
2227
2644
|
exports.FigmaContainer = FigmaContainer;
|
|
2228
2645
|
exports.FigmaFooter = FigmaFooter;
|
|
2229
2646
|
exports.FigmaHeader = FigmaHeader;
|
|
@@ -2232,6 +2649,7 @@ exports.FigmaSection = FigmaSection;
|
|
|
2232
2649
|
exports.FigmaSidebar = FigmaSidebar;
|
|
2233
2650
|
exports.FigmaToast = FigmaToast;
|
|
2234
2651
|
exports.FigmaToastProvider = FigmaToastProvider;
|
|
2652
|
+
exports.FigmaUiI18nProvider = FigmaUiI18nProvider;
|
|
2235
2653
|
exports.FormWithSubmit = FormWithSubmit;
|
|
2236
2654
|
exports.InteractionFeedback = InteractionFeedback;
|
|
2237
2655
|
exports.LanguageSelector = LanguageSelector;
|
|
@@ -2250,13 +2668,16 @@ exports.SettingsModal = SettingsModal;
|
|
|
2250
2668
|
exports.TitleDescription = TitleDescription;
|
|
2251
2669
|
exports.UpgradeBanner = UpgradeBanner;
|
|
2252
2670
|
exports.UsageStatusPopover = UsageStatusPopover;
|
|
2671
|
+
exports.createFigmaUiTranslator = createFigmaUiTranslator;
|
|
2253
2672
|
exports.getActiveSection = getActiveSection;
|
|
2254
2673
|
exports.interpolateText = interpolateText;
|
|
2674
|
+
exports.normalizeFigmaUiLocale = normalizeFigmaUiLocale;
|
|
2255
2675
|
exports.resolvePaymentFeedbackVariant = resolvePaymentFeedbackVariant;
|
|
2256
2676
|
exports.resolveText = resolveText;
|
|
2257
2677
|
exports.scrollToSection = scrollToSection;
|
|
2258
2678
|
exports.useFigmaLicenseBridge = useFigmaLicenseBridge;
|
|
2259
2679
|
exports.useFigmaToast = useFigmaToast;
|
|
2680
|
+
exports.useFigmaUiI18n = useFigmaUiI18n;
|
|
2260
2681
|
exports.useToast = useToast;
|
|
2261
2682
|
Object.keys(react).forEach(function (k) {
|
|
2262
2683
|
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|