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