@designbasekorea/figma-ui 0.8.1 → 0.8.2
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 +4 -0
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.css.map +1 -1
- package/dist/index.esm.js +79 -24
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +79 -24
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -37,6 +37,15 @@ const FIGMA_UI_TRANSLATIONS = {
|
|
|
37
37
|
remainingShort: '남음',
|
|
38
38
|
usageCountCaption: '오늘 사용',
|
|
39
39
|
remainingCopy: '{{count}}회 남음 · 매일 리셋',
|
|
40
|
+
'usage.caption.none': '남은 무료 사용량',
|
|
41
|
+
'usage.caption.weekly': '이번 주 남은 사용량',
|
|
42
|
+
'usage.caption.monthly': '이번 달 남은 사용량',
|
|
43
|
+
'usage.remaining.none': '{{count}}회 남음 · 자동 초기화 없음',
|
|
44
|
+
'usage.remaining.weekly': '{{count}}회 남음 · 매주 초기화',
|
|
45
|
+
'usage.remaining.monthly': '{{count}}회 남음 · 매월 초기화',
|
|
46
|
+
'license.this_plugin': '현재 플러그인',
|
|
47
|
+
'license.purchase_or_membership_description': '구매한 상품의 라이선스 키 또는 YouTube 멤버십 키를 등록하세요. 이용 범위는 키에 부여된 권한에 따라 달라집니다.',
|
|
48
|
+
'license.purchase_benefit_title': '구매한 플러그인의 프로 기능 사용',
|
|
40
49
|
lowUsageWarning: '무료 사용량이 {{count}}회({{percent}}%) 남았습니다. 멤버십으로 무제한 이용해보세요.',
|
|
41
50
|
usageUnavailable: '사용량 제한이 없습니다',
|
|
42
51
|
unlimitedUsageTooltip: '모든 기능을 제한 없이 사용할 수 있습니다',
|
|
@@ -196,6 +205,15 @@ const FIGMA_UI_TRANSLATIONS = {
|
|
|
196
205
|
remainingShort: 'left',
|
|
197
206
|
usageCountCaption: 'Used today',
|
|
198
207
|
remainingCopy: '{{count}} remaining · resets daily',
|
|
208
|
+
'usage.caption.none': 'Remaining free uses',
|
|
209
|
+
'usage.caption.weekly': 'Remaining uses this week',
|
|
210
|
+
'usage.caption.monthly': 'Remaining uses this month',
|
|
211
|
+
'usage.remaining.none': '{{count}} uses left · No automatic reset',
|
|
212
|
+
'usage.remaining.weekly': '{{count}} uses left · Resets weekly',
|
|
213
|
+
'usage.remaining.monthly': '{{count}} uses left · Resets monthly',
|
|
214
|
+
'license.this_plugin': 'This plugin',
|
|
215
|
+
'license.purchase_or_membership_description': 'Enter a purchased product license or a YouTube membership key. Access depends on the permissions attached to your key.',
|
|
216
|
+
'license.purchase_benefit_title': 'Unlock Pro for your purchased plugin',
|
|
199
217
|
lowUsageWarning: 'Only {{count}} free uses ({{percent}}%) remain. Upgrade for unlimited access.',
|
|
200
218
|
usageUnavailable: 'No usage limit',
|
|
201
219
|
unlimitedUsageTooltip: 'Use every feature without limits',
|
|
@@ -355,6 +373,15 @@ const FIGMA_UI_TRANSLATIONS = {
|
|
|
355
373
|
remainingShort: '残り',
|
|
356
374
|
usageCountCaption: '今日の使用',
|
|
357
375
|
remainingCopy: '{{count}}回残り · 毎日リセット',
|
|
376
|
+
'usage.caption.none': '無料利用の残り回数',
|
|
377
|
+
'usage.caption.weekly': '今週の残り回数',
|
|
378
|
+
'usage.caption.monthly': '今月の残り回数',
|
|
379
|
+
'usage.remaining.none': '残り{{count}}回 · 自動リセットなし',
|
|
380
|
+
'usage.remaining.weekly': '残り{{count}}回 · 毎週リセット',
|
|
381
|
+
'usage.remaining.monthly': '残り{{count}}回 · 毎月リセット',
|
|
382
|
+
'license.this_plugin': 'このプラグイン',
|
|
383
|
+
'license.purchase_or_membership_description': '購入ライセンスまたはYouTubeメンバーシップキーを登録してください。利用範囲はキーの権限によって異なります。',
|
|
384
|
+
'license.purchase_benefit_title': '購入したプラグインのPro機能を利用',
|
|
358
385
|
lowUsageWarning: '無料使用回数は残り{{count}}回({{percent}}%)です。無制限利用にアップグレードできます。',
|
|
359
386
|
usageUnavailable: '使用制限はありません',
|
|
360
387
|
unlimitedUsageTooltip: 'すべての機能を無制限で使用できます',
|
|
@@ -1059,7 +1086,7 @@ const fallbackText = (t, key, fallback) => {
|
|
|
1059
1086
|
const translated = t?.(key);
|
|
1060
1087
|
return translated && translated !== key ? translated : fallback;
|
|
1061
1088
|
};
|
|
1062
|
-
const UsageStatusPopover = ({ paymentStatus, usageCount = 0, remainingUsage, maxDailyUsage = 20, showUsage = true, showPlan = true, isLoading = false, onLicensePageClick, licenseSource, accessScope, expiresAt, lastVerifiedAt, t, locale, className, }) => {
|
|
1089
|
+
const UsageStatusPopover = ({ paymentStatus, usageCount = 0, remainingUsage, maxDailyUsage = 20, usageReset = 'daily', showUsage = true, showPlan = true, isLoading = false, onLicensePageClick, licenseSource, accessScope, expiresAt, lastVerifiedAt, t, locale, className, }) => {
|
|
1063
1090
|
const { t: translate } = useFigmaUiI18n(locale, t);
|
|
1064
1091
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
1065
1092
|
const rootRef = React.useRef(null);
|
|
@@ -1109,15 +1136,15 @@ const UsageStatusPopover = ({ paymentStatus, usageCount = 0, remainingUsage, max
|
|
|
1109
1136
|
};
|
|
1110
1137
|
const formattedSource = licenseSource === 'youtube_membership' || licenseSource === 'membership'
|
|
1111
1138
|
? fallbackText(translate, 'license.source_youtube_membership', 'YouTube 멤버십')
|
|
1112
|
-
: licenseSource
|
|
1139
|
+
: ['lemonsqueezy', 'lemon_squeezy', 'lemon-squeezy', 'order'].includes(licenseSource || '')
|
|
1113
1140
|
? fallbackText(translate, 'license.source_purchase', '구매 라이선스')
|
|
1114
1141
|
: licenseSource;
|
|
1115
1142
|
const formattedScope = accessScope === 'all-products' || accessScope === 'all_products'
|
|
1116
1143
|
? fallbackText(translate, 'license.all_plugins', '모든 플러그인')
|
|
1117
|
-
: accessScope;
|
|
1144
|
+
: accessScope === 'product' ? fallbackText(translate, 'license.this_plugin', '현재 플러그인') : accessScope;
|
|
1118
1145
|
const paidMetadata = [
|
|
1119
1146
|
formattedSource && {
|
|
1120
|
-
label: fallbackText(translate, 'license.
|
|
1147
|
+
label: fallbackText(translate, 'license.source', '출처'),
|
|
1121
1148
|
value: formattedSource,
|
|
1122
1149
|
},
|
|
1123
1150
|
expiresAt && {
|
|
@@ -1199,13 +1226,13 @@ const UsageStatusPopover = ({ paymentStatus, usageCount = 0, remainingUsage, max
|
|
|
1199
1226
|
remaining,
|
|
1200
1227
|
React.createElement("span", { className: "designbase-figma-usage-status__usage-divider" }, "/"),
|
|
1201
1228
|
limit),
|
|
1202
|
-
React.createElement("span", { className: "designbase-figma-usage-status__usage-caption" }, fallbackText(translate, 'remainingToday', '오늘 남은 사용량')),
|
|
1229
|
+
React.createElement("span", { className: "designbase-figma-usage-status__usage-caption" }, usageReset === 'daily' ? fallbackText(translate, 'remainingToday', '오늘 남은 사용량') : translate(`usage.caption.${usageReset}`)),
|
|
1203
1230
|
React.createElement("strong", { className: "designbase-figma-usage-status__usage-percent" },
|
|
1204
1231
|
remainingPercent,
|
|
1205
1232
|
"%")),
|
|
1206
|
-
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}%` },
|
|
1233
|
+
React.createElement("div", { className: "designbase-figma-usage-status__progress", role: "progressbar", "aria-label": usageReset === 'daily' ? fallbackText(translate, 'remainingToday', '오늘 남은 사용량') : translate(`usage.caption.${usageReset}`), "aria-valuemin": 0, "aria-valuemax": limit, "aria-valuenow": remaining, "aria-valuetext": `${remaining} / ${limit}, ${remainingPercent}%` },
|
|
1207
1234
|
React.createElement("span", { style: { width: `${remainingPercent}%` } })),
|
|
1208
|
-
React.createElement("p", { className: "designbase-figma-usage-status__remaining-copy" }, resolveText(translate, { key: 'remainingCopy'
|
|
1235
|
+
React.createElement("p", { className: "designbase-figma-usage-status__remaining-copy" }, resolveText(translate, { key: usageReset === 'daily' ? 'remainingCopy' : `usage.remaining.${usageReset}`, values: { count: remaining } }, `${remaining}회 남음 · 매일 리셋`)))) : (React.createElement("p", { className: "designbase-figma-usage-status__note" }, fallbackText(translate, 'usageUnavailable', '사용량 제한이 없습니다')))))));
|
|
1209
1236
|
};
|
|
1210
1237
|
UsageStatusPopover.displayName = 'UsageStatusPopover';
|
|
1211
1238
|
|
|
@@ -1295,7 +1322,7 @@ FigmaToastProvider.displayName = 'FigmaToastProvider';
|
|
|
1295
1322
|
FigmaToast.displayName = 'FigmaToast';
|
|
1296
1323
|
|
|
1297
1324
|
const DEFAULT_LOW_USAGE_WARNING = { key: 'lowUsageWarning' };
|
|
1298
|
-
const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount = 0, remainingUsage, listenForUsageMessages = true, isLoading = false, showPaymentStatus = true, showUsageInfo = true, maxDailyUsage = 20, licenseSource, accessScope, expiresAt, lastVerifiedAt, 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, }) => {
|
|
1325
|
+
const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount = 0, remainingUsage, listenForUsageMessages = true, isLoading = false, showPaymentStatus = true, showUsageInfo = true, maxDailyUsage = 20, usageReset = 'daily', licenseSource, accessScope, expiresAt, lastVerifiedAt, 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, }) => {
|
|
1299
1326
|
const { t: translate } = useFigmaUiI18n(currentLanguage, t);
|
|
1300
1327
|
const { showToast, toastComponent } = useFigmaToast();
|
|
1301
1328
|
const [liveUsage, setLiveUsage] = React.useState({});
|
|
@@ -1305,6 +1332,7 @@ const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount =
|
|
|
1305
1332
|
const effectiveUsageCount = liveUsage.usageCount ?? usageCount;
|
|
1306
1333
|
const effectiveRemainingUsage = liveUsage.remainingUsage ?? remainingUsage;
|
|
1307
1334
|
const effectiveMaxDailyUsage = liveUsage.maxDailyUsage ?? maxDailyUsage;
|
|
1335
|
+
const effectiveUsageReset = liveUsage.usageReset ?? usageReset;
|
|
1308
1336
|
const effectiveLicenseSource = liveUsage.licenseSource ?? licenseSource;
|
|
1309
1337
|
const effectiveAccessScope = liveUsage.accessScope ?? accessScope;
|
|
1310
1338
|
const effectiveExpiresAt = liveUsage.expiresAt ?? expiresAt;
|
|
@@ -1329,6 +1357,8 @@ const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount =
|
|
|
1329
1357
|
}
|
|
1330
1358
|
const nextLimit = [message.usageLimit, message.freeDailyLimit, message.maxDailyUsage]
|
|
1331
1359
|
.find((value) => typeof value === 'number' && Number.isFinite(value) && value > 0);
|
|
1360
|
+
const nextReset = ['none', 'daily', 'weekly', 'monthly'].includes(message.usageReset)
|
|
1361
|
+
? message.usageReset : undefined;
|
|
1332
1362
|
const nextUsed = [message.usageUsed, message.dailyUsage]
|
|
1333
1363
|
.find((value) => typeof value === 'number' && Number.isFinite(value) && value >= 0);
|
|
1334
1364
|
const nextRemaining = typeof message.remainingUsage === 'number' && Number.isFinite(message.remainingUsage)
|
|
@@ -1360,6 +1390,7 @@ const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount =
|
|
|
1360
1390
|
: undefined;
|
|
1361
1391
|
if (nextPaymentStatus === undefined
|
|
1362
1392
|
&& nextLimit === undefined
|
|
1393
|
+
&& nextReset === undefined
|
|
1363
1394
|
&& nextUsed === undefined
|
|
1364
1395
|
&& nextRemaining === undefined
|
|
1365
1396
|
&& nextLicenseSource === undefined
|
|
@@ -1372,12 +1403,17 @@ const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount =
|
|
|
1372
1403
|
...previous,
|
|
1373
1404
|
...(nextPaymentStatus ? { paymentStatus: nextPaymentStatus } : {}),
|
|
1374
1405
|
...(typeof nextLimit === 'number' ? { maxDailyUsage: nextLimit } : {}),
|
|
1406
|
+
...(nextReset !== undefined ? { usageReset: nextReset } : {}),
|
|
1375
1407
|
...(typeof nextUsed === 'number' ? { usageCount: nextUsed } : {}),
|
|
1376
1408
|
...(typeof nextRemaining === 'number' ? { remainingUsage: nextRemaining } : {}),
|
|
1377
1409
|
...(nextLicenseSource ? { licenseSource: nextLicenseSource } : {}),
|
|
1378
1410
|
...(nextAccessScope ? { accessScope: nextAccessScope } : {}),
|
|
1379
1411
|
...(nextExpiresAt ? { expiresAt: nextExpiresAt } : {}),
|
|
1380
1412
|
...(nextLastVerifiedAt ? { lastVerifiedAt: nextLastVerifiedAt } : {}),
|
|
1413
|
+
...((nextPaymentStatus === 'FREE' || nextLicenseSource !== undefined || nextAccessScope !== undefined) ? {
|
|
1414
|
+
licenseSource: nextLicenseSource || '', accessScope: nextAccessScope || '',
|
|
1415
|
+
expiresAt: nextExpiresAt || '', lastVerifiedAt: nextLastVerifiedAt || '',
|
|
1416
|
+
} : {}),
|
|
1381
1417
|
}));
|
|
1382
1418
|
};
|
|
1383
1419
|
window.addEventListener('message', handleUsageMessage);
|
|
@@ -1436,7 +1472,7 @@ const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount =
|
|
|
1436
1472
|
React.createElement("div", { className: "designbase-figma-footer__left" },
|
|
1437
1473
|
React.createElement(LogoDropdown, { logoSrc: logoSrc, logoAlt: logoAlt, logoType: logoType, logoSize: logoSize, links: logoLinks, languages: languages, currentLanguage: currentLanguage, showLanguageSelector: showLanguageSelector, onLanguageChange: onLanguageChange, t: translate })),
|
|
1438
1474
|
React.createElement("div", { className: "designbase-figma-footer__right" },
|
|
1439
|
-
(resolvedShowUsageInfo || resolvedShowPaymentBadge) && (React.createElement(UsageStatusPopover, { paymentStatus: effectivePaymentStatus, usageCount: effectiveUsageCount, remainingUsage: effectiveRemainingUsage, maxDailyUsage: effectiveMaxDailyUsage, showUsage: resolvedShowUsageInfo, showPlan: resolvedShowPaymentBadge, isLoading: isLoading, onLicensePageClick: resolvedLicensePageClick, licenseSource: effectiveLicenseSource, accessScope: effectiveAccessScope, expiresAt: effectiveExpiresAt, lastVerifiedAt: effectiveLastVerifiedAt, locale: currentLanguage, t: translate })),
|
|
1475
|
+
(resolvedShowUsageInfo || resolvedShowPaymentBadge) && (React.createElement(UsageStatusPopover, { paymentStatus: effectivePaymentStatus, usageCount: effectiveUsageCount, remainingUsage: effectiveRemainingUsage, maxDailyUsage: effectiveMaxDailyUsage, usageReset: effectiveUsageReset, showUsage: resolvedShowUsageInfo, showPlan: resolvedShowPaymentBadge, isLoading: isLoading, onLicensePageClick: resolvedLicensePageClick, licenseSource: effectiveLicenseSource, accessScope: effectiveAccessScope, expiresAt: effectiveExpiresAt, lastVerifiedAt: effectiveLastVerifiedAt, locale: currentLanguage, t: translate })),
|
|
1440
1476
|
showDonation && (React.createElement(DonationBadge, { donationUrl: donationUrl, text: donationText, iconType: "heart", size: "s", iconOnly: true, showPrompt: false, t: translate })))),
|
|
1441
1477
|
children,
|
|
1442
1478
|
toastComponent));
|
|
@@ -1599,6 +1635,8 @@ function formatScope(value, t) {
|
|
|
1599
1635
|
if (value === 'all-products' || value === 'all_products') {
|
|
1600
1636
|
return resolveText(t, { key: 'license.all_plugins' }, '모든 플러그인');
|
|
1601
1637
|
}
|
|
1638
|
+
if (value === 'product')
|
|
1639
|
+
return resolveText(t, { key: 'license.this_plugin' }, '현재 플러그인');
|
|
1602
1640
|
return value;
|
|
1603
1641
|
}
|
|
1604
1642
|
function formatSource(value, t) {
|
|
@@ -1607,7 +1645,7 @@ function formatSource(value, t) {
|
|
|
1607
1645
|
if (value === 'youtube_membership' || value === 'membership') {
|
|
1608
1646
|
return resolveText(t, { key: 'license.source_youtube_membership' }, 'YouTube 멤버십');
|
|
1609
1647
|
}
|
|
1610
|
-
if (
|
|
1648
|
+
if (['lemonsqueezy', 'lemon_squeezy', 'lemon-squeezy', 'order'].includes(value)) {
|
|
1611
1649
|
return resolveText(t, { key: 'license.source_purchase' }, '구매 라이선스');
|
|
1612
1650
|
}
|
|
1613
1651
|
return value;
|
|
@@ -1837,12 +1875,21 @@ function readBoolean(data, keys) {
|
|
|
1837
1875
|
}
|
|
1838
1876
|
return undefined;
|
|
1839
1877
|
}
|
|
1878
|
+
function readOptionalText(data, keys) {
|
|
1879
|
+
for (const key of keys) {
|
|
1880
|
+
if (Object.prototype.hasOwnProperty.call(data, key)) {
|
|
1881
|
+
return typeof data[key] === 'string' ? data[key] : '';
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
return undefined;
|
|
1885
|
+
}
|
|
1840
1886
|
function parseLicenseMessage(data) {
|
|
1841
|
-
const
|
|
1887
|
+
const status = readString(data, ['paymentStatus', 'status']);
|
|
1888
|
+
const paymentStatus = ['PAID', 'FREE', 'UNPAID'].includes(status) ? status : '';
|
|
1842
1889
|
const usageLimitRaw = data.usageLimit;
|
|
1843
1890
|
return {
|
|
1844
1891
|
...(paymentStatus ? { paymentStatus } : {}),
|
|
1845
|
-
licenseKey:
|
|
1892
|
+
licenseKey: readOptionalText(data, ['licenseKey']),
|
|
1846
1893
|
planTier: readString(data, ['planTier']) || undefined,
|
|
1847
1894
|
hasLicenseKey: readBoolean(data, ['hasLicenseKey']),
|
|
1848
1895
|
isLicenseRegistered: readBoolean(data, ['isLicenseRegistered']),
|
|
@@ -1857,12 +1904,12 @@ function parseLicenseMessage(data) {
|
|
|
1857
1904
|
usageReason: readString(data, ['usageReason']) || undefined,
|
|
1858
1905
|
lastMessage: readString(data, ['message']) || undefined,
|
|
1859
1906
|
lastErrorCode: readString(data, ['errorCode']) || undefined,
|
|
1860
|
-
licenseStatus:
|
|
1861
|
-
licenseSource:
|
|
1862
|
-
accessScope:
|
|
1863
|
-
expiresAt:
|
|
1864
|
-
lastVerifiedAt:
|
|
1865
|
-
validationMessage:
|
|
1907
|
+
licenseStatus: readOptionalText(data, ['licenseStatus', 'license_status']),
|
|
1908
|
+
licenseSource: readOptionalText(data, ['licenseSource', 'license_source', 'source']),
|
|
1909
|
+
accessScope: readOptionalText(data, ['accessScope', 'access_scope', 'scope']),
|
|
1910
|
+
expiresAt: readOptionalText(data, ['expiresAt', 'expires_at']),
|
|
1911
|
+
lastVerifiedAt: readOptionalText(data, ['lastVerifiedAt', 'last_verified_at']),
|
|
1912
|
+
validationMessage: readOptionalText(data, ['validationMessage', 'validation_message']),
|
|
1866
1913
|
};
|
|
1867
1914
|
}
|
|
1868
1915
|
function useFigmaLicenseBridge(options = {}) {
|
|
@@ -1933,8 +1980,16 @@ function useFigmaLicenseBridge(options = {}) {
|
|
|
1933
1980
|
isLicenseRegistered: false,
|
|
1934
1981
|
activationLimit: 0,
|
|
1935
1982
|
activationUsage: 0,
|
|
1983
|
+
licenseStatus: '',
|
|
1984
|
+
licenseSource: '',
|
|
1985
|
+
accessScope: '',
|
|
1986
|
+
expiresAt: '',
|
|
1987
|
+
lastVerifiedAt: '',
|
|
1988
|
+
validationMessage: '',
|
|
1989
|
+
lastMessage: '',
|
|
1990
|
+
lastErrorCode: '',
|
|
1936
1991
|
deactivateMessage: parsed.lastMessage || '라이선스가 비활성화되었습니다.',
|
|
1937
|
-
deactivateErrorCode:
|
|
1992
|
+
deactivateErrorCode: '',
|
|
1938
1993
|
});
|
|
1939
1994
|
}
|
|
1940
1995
|
}
|
|
@@ -2079,22 +2134,22 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
|
|
|
2079
2134
|
React.createElement("div", { className: "designbase-figma-page-license__title" },
|
|
2080
2135
|
React.createElement("h2", null, isPaid
|
|
2081
2136
|
? resolveText(translate, { key: 'license.pro_account' }, '프로 계정')
|
|
2082
|
-
: showYoutubeMembershipTab
|
|
2137
|
+
: (showYoutubeMembershipTab || isMembershipMode)
|
|
2083
2138
|
? resolveText(translate, { key: 'license.unlock_unlimited' }, 'Unlock Unlimited Access')
|
|
2084
2139
|
: resolveText(translate, { key: 'license.upgrade_to_pro' }, '프로로 업그레이드')),
|
|
2085
2140
|
isPaid && (React.createElement("span", { className: "designbase-figma-page-license__tier" }, resolveText(translate, { key: 'license.pro_plan' }, '프로 플랜')))),
|
|
2086
2141
|
React.createElement("p", { className: "designbase-figma-page-license__description" }, isPaid
|
|
2087
2142
|
? resolveText(translate, { key: 'license.all_features_available' }, '모든 기능을 사용할 수 있습니다.')
|
|
2088
|
-
: showYoutubeMembershipTab
|
|
2143
|
+
: (showYoutubeMembershipTab || isMembershipMode)
|
|
2089
2144
|
? resolveText(translate, {
|
|
2090
|
-
key: 'license.unlock_unlimited_description',
|
|
2145
|
+
key: isMembershipMode ? 'license.unlock_unlimited_description' : 'license.purchase_or_membership_description',
|
|
2091
2146
|
}, 'Add a license key to unlock Pro features and unlimited use across Designbase plugins.')
|
|
2092
2147
|
: resolveText(translate, { key: 'license.purchase_for_unlimited' }, '디자인베이스 멤버십 또는 라이선스로 무제한 이용이 가능합니다.')),
|
|
2093
2148
|
!isPaid && !showYoutubeMembershipTab && !isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__usage" }, usageLabel))),
|
|
2094
|
-
!isPaid && showYoutubeMembershipTab && (React.createElement("div", { className: "designbase-figma-page-license__benefit" },
|
|
2149
|
+
!isPaid && (showYoutubeMembershipTab || isMembershipMode) && (React.createElement("div", { className: "designbase-figma-page-license__benefit" },
|
|
2095
2150
|
React.createElement("span", { className: "designbase-figma-page-license__benefit-icon", "aria-hidden": "true" }, "\u221E"),
|
|
2096
2151
|
React.createElement("div", null,
|
|
2097
|
-
React.createElement("strong", null, resolveText(translate, { key: 'license.unlimited_benefit_title' }, '모든 플러그인 무제한 사용')),
|
|
2152
|
+
React.createElement("strong", null, resolveText(translate, { key: isMembershipMode ? 'license.unlimited_benefit_title' : 'license.purchase_benefit_title' }, '모든 플러그인 무제한 사용')),
|
|
2098
2153
|
React.createElement("p", null, resolveText(translate, { key: 'license.unlimited_benefit_description' }, '사용 횟수 제한 없이 프로 기능과 프리미엄 콘텐츠를 이용할 수 있습니다.'))))),
|
|
2099
2154
|
hasSourceTabs && (React.createElement("div", { className: "designbase-figma-page-license__source-tabs", role: "tablist", "aria-label": resolveText(translate, { key: 'license.source_tabs_label' }, 'License type') },
|
|
2100
2155
|
React.createElement("button", { type: "button", role: "tab", "aria-selected": !isMembershipMode, onClick: () => setActiveLicenseMode('pricing') }, resolveText(translate, { key: 'license.source_lemon_squeezy' }, 'Lemon Squeezy license')),
|