@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/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 === 'lemonsqueezy'
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.membership', '멤버십'),
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', values: { count: remaining } }, `${remaining}회 남음 · 매일 리셋`)))) : (React.createElement("p", { className: "designbase-figma-usage-status__note" }, fallbackText(translate, 'usageUnavailable', '사용량 제한이 없습니다')))))));
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 (value === 'lemonsqueezy') {
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 paymentStatus = readString(data, ['paymentStatus', 'status']);
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: readString(data, ['licenseKey']) || undefined,
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: readString(data, ['licenseStatus', 'license_status']) || undefined,
1861
- licenseSource: readString(data, ['licenseSource', 'license_source', 'source']) || undefined,
1862
- accessScope: readString(data, ['accessScope', 'access_scope', 'scope']) || undefined,
1863
- expiresAt: readString(data, ['expiresAt', 'expires_at']) || undefined,
1864
- lastVerifiedAt: readString(data, ['lastVerifiedAt', 'last_verified_at']) || undefined,
1865
- validationMessage: readString(data, ['validationMessage', 'validation_message']) || undefined,
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: undefined,
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')),