@designbasekorea/figma-ui 0.8.1 → 0.8.3

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