@designbasekorea/figma-ui 0.7.2 → 0.8.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/dist/index.js CHANGED
@@ -54,6 +54,8 @@ const FIGMA_UI_TRANSLATIONS = {
54
54
  'license.youtube_membership': 'YouTube 멤버십',
55
55
  'license.unlock_unlimited': '무제한 사용 활성화',
56
56
  'license.unlock_unlimited_description': '라이선스 키를 등록하면 모든 Designbase 플러그인의 프로 기능과 무제한 사용을 이용할 수 있습니다.',
57
+ 'license.unlimited_benefit_title': '모든 플러그인 무제한 사용',
58
+ 'license.unlimited_benefit_description': '사용 횟수 제한 없이 프로 기능과 프리미엄 콘텐츠를 이용할 수 있습니다.',
57
59
  'license.get_key_title': '라이선스 키 받기',
58
60
  'license.get_key_description': '멤버십 회원에게 매월 새 라이선스 키가 제공됩니다.',
59
61
  'license.get_key_step_1_title': '멤버십 가입',
@@ -68,6 +70,10 @@ const FIGMA_UI_TRANSLATIONS = {
68
70
  'license.unlock_pro_features': '프로 기능 활성화',
69
71
  'license.current_plan': '현재 플랜',
70
72
  'license.pro_plan': '프로 플랜',
73
+ 'license.source_tabs_label': '라이선스 제공 방식',
74
+ 'license.source_lemon_squeezy': 'Lemon Squeezy 라이선스',
75
+ 'license.source_lemon_hint': '기존 Lemon Squeezy 구매 라이선스 키를 입력하세요.',
76
+ 'license.source_youtube_hint': 'YouTube 멤버십 회원에게 제공되는 전용 키를 입력하세요.',
71
77
  'license.membership': '멤버십',
72
78
  'license.pro_account': '프로 계정',
73
79
  'license.upgrade_to_pro': '프로로 업그레이드',
@@ -106,7 +112,7 @@ const FIGMA_UI_TRANSLATIONS = {
106
112
  'license.youtube_membership_join': '멤버십 가입',
107
113
  'license.youtube_membership_guide': '안내보기',
108
114
  'license.all_plugins': '모든 플러그인',
109
- 'license.source_youtube_membership': 'YouTube 멤버십',
115
+ 'license.source_youtube_membership': 'YouTube 멤버십 전용',
110
116
  'license.source_purchase': '구매 라이선스',
111
117
  'license.status_active': '활성',
112
118
  'license.status_inactive': '라이선스 확인 실패',
@@ -206,6 +212,8 @@ const FIGMA_UI_TRANSLATIONS = {
206
212
  'license.youtube_membership': 'YouTube Membership',
207
213
  'license.unlock_unlimited': 'Unlock Unlimited Access',
208
214
  'license.unlock_unlimited_description': 'Add a license key to unlock Pro features and unlimited use across Designbase plugins.',
215
+ 'license.unlimited_benefit_title': 'Unlimited access to every plugin',
216
+ 'license.unlimited_benefit_description': 'Use Pro features and premium content without usage limits.',
209
217
  'license.get_key_title': 'Get a license key',
210
218
  'license.get_key_description': 'Members receive a new license key every month.',
211
219
  'license.get_key_step_1_title': 'Join the membership',
@@ -220,6 +228,10 @@ const FIGMA_UI_TRANSLATIONS = {
220
228
  'license.unlock_pro_features': 'Unlock Pro features',
221
229
  'license.current_plan': 'Current plan',
222
230
  'license.pro_plan': 'Pro plan',
231
+ 'license.source_tabs_label': 'License type',
232
+ 'license.source_lemon_squeezy': 'Lemon Squeezy license',
233
+ 'license.source_lemon_hint': 'Enter the license key from your Lemon Squeezy purchase.',
234
+ 'license.source_youtube_hint': 'Enter the key provided to YouTube channel members.',
223
235
  'license.membership': 'Membership',
224
236
  'license.pro_account': 'Pro account',
225
237
  'license.upgrade_to_pro': 'Upgrade to Pro',
@@ -258,7 +270,7 @@ const FIGMA_UI_TRANSLATIONS = {
258
270
  'license.youtube_membership_join': 'Join membership',
259
271
  'license.youtube_membership_guide': 'View guide',
260
272
  'license.all_plugins': 'All plugins',
261
- 'license.source_youtube_membership': 'YouTube Membership',
273
+ 'license.source_youtube_membership': 'YouTube membership only',
262
274
  'license.source_purchase': 'Purchased license',
263
275
  'license.status_active': 'Active',
264
276
  'license.status_inactive': 'License check failed',
@@ -358,6 +370,8 @@ const FIGMA_UI_TRANSLATIONS = {
358
370
  'license.youtube_membership': 'YouTubeメンバーシップ',
359
371
  'license.unlock_unlimited': '無制限アクセスを有効化',
360
372
  'license.unlock_unlimited_description': 'ライセンスキーを登録すると、DesignbaseプラグインのPro機能を無制限で利用できます。',
373
+ 'license.unlimited_benefit_title': 'すべてのプラグインを無制限で利用',
374
+ 'license.unlimited_benefit_description': '回数制限なくPro機能とプレミアムコンテンツを利用できます。',
361
375
  'license.get_key_title': 'ライセンスキーを取得',
362
376
  'license.get_key_description': 'メンバーには毎月新しいライセンスキーが提供されます。',
363
377
  'license.get_key_step_1_title': 'メンバーシップに参加',
@@ -372,6 +386,10 @@ const FIGMA_UI_TRANSLATIONS = {
372
386
  'license.unlock_pro_features': 'Pro機能を有効化',
373
387
  'license.current_plan': '現在のプラン',
374
388
  'license.pro_plan': 'Proプラン',
389
+ 'license.source_tabs_label': 'ライセンスの種類',
390
+ 'license.source_lemon_squeezy': 'Lemon Squeezy ライセンス',
391
+ 'license.source_lemon_hint': 'Lemon Squeezyで購入したライセンスキーを入力してください。',
392
+ 'license.source_youtube_hint': 'YouTubeメンバー向けの専用キーを入力してください。',
375
393
  'license.membership': 'メンバーシップ',
376
394
  'license.pro_account': 'Proアカウント',
377
395
  'license.upgrade_to_pro': 'Proにアップグレード',
@@ -410,7 +428,7 @@ const FIGMA_UI_TRANSLATIONS = {
410
428
  'license.youtube_membership_join': 'メンバーシップに参加',
411
429
  'license.youtube_membership_guide': 'ガイドを見る',
412
430
  'license.all_plugins': 'すべてのプラグイン',
413
- 'license.source_youtube_membership': 'YouTubeメンバーシップ',
431
+ 'license.source_youtube_membership': 'YouTubeメンバーシップ専用',
414
432
  'license.source_purchase': '購入ライセンス',
415
433
  'license.status_active': '有効',
416
434
  'license.status_inactive': 'ライセンス確認に失敗しました',
@@ -1538,14 +1556,9 @@ const LicenseOffer = ({ joinUrl, guideUrl, membershipUrl, t, locale, className,
1538
1556
  title: resolveText(translate, { key: 'license.get_key_step_2_title' }, '이번 달 키 복사'),
1539
1557
  description: resolveText(translate, { key: 'license.get_key_step_2_description' }, '멤버 전용 커뮤니티 게시글에서 키를 확인합니다.'),
1540
1558
  },
1541
- {
1542
- title: resolveText(translate, { key: 'license.get_key_step_3_title' }, '키 등록'),
1543
- description: resolveText(translate, { key: 'license.get_key_step_3_description' }, '아래 입력창에 붙여 넣으면 프로 기능이 열립니다.'),
1544
- },
1545
1559
  ];
1546
1560
  return (React.createElement("section", { className: `designbase-figma-license-offer ${className || ''}`, "aria-labelledby": titleId },
1547
1561
  React.createElement("header", { className: "designbase-figma-license-offer__header" },
1548
- React.createElement("span", { className: "designbase-figma-license-offer__section-index", "aria-hidden": "true" }, "1"),
1549
1562
  React.createElement("div", null,
1550
1563
  React.createElement("h3", { id: titleId, className: "designbase-figma-license-offer__title" }, resolveText(translate, { key: 'license.get_key_title' }, '라이선스 키 받기')),
1551
1564
  React.createElement("p", { className: "designbase-figma-license-offer__description" }, resolveText(translate, { key: 'license.get_key_description' }, '멤버십 회원에게 매월 새 라이선스 키가 제공됩니다.')))),
@@ -1991,7 +2004,9 @@ function formatUsageLabel(state, t) {
1991
2004
  if (usageLimit === 'unlimited') {
1992
2005
  return (resolveText(t, { key: 'license.usage_unlimited' }, '사용 횟수 제한 없음') ?? '사용 횟수 제한 없음');
1993
2006
  }
1994
- const limit = typeof usageLimit === 'number' ? usageLimit : remainingUsage + usageUsed;
2007
+ const limit = typeof usageLimit === 'number'
2008
+ ? usageLimit
2009
+ : remainingUsage + usageUsed;
1995
2010
  const remaining = remainingUsage ?? Math.max(0, limit - usageUsed);
1996
2011
  if (usageReset === 'daily') {
1997
2012
  const fallback = `오늘 남은 횟수 ${remaining}/${limit}`;
@@ -2010,7 +2025,7 @@ function formatUsageLabel(state, t) {
2010
2025
  }
2011
2026
  return (resolveText(t, { key: 'license.usage_generic', values: { remaining, limit } }, `남은 횟수 ${remaining}/${limit}`) ?? `남은 횟수 ${remaining}/${limit}`);
2012
2027
  }
2013
- const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicenseKey = '', licenseStatus: initialLicenseStatus, licenseSource: initialLicenseSource, accessScope: initialAccessScope, expiresAt: initialExpiresAt, lastVerifiedAt: initialLastVerifiedAt, wordpressLinks, paymentPageUrl, mode = 'pricing', membershipUrl, enableAccountAuth = true, showLicenseKeyInput = true, pricingFeatures, pricing, paymentType = 'subscription', messageTypes, onStateChange, setPaymentStatus, setUsageCount, onLicenseSubmit, usageCount: initialUsageCount = 0, t, locale, className, }) => {
2028
+ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicenseKey = '', licenseStatus: initialLicenseStatus, licenseSource: initialLicenseSource, accessScope: initialAccessScope, expiresAt: initialExpiresAt, lastVerifiedAt: initialLastVerifiedAt, wordpressLinks, paymentPageUrl, mode = 'pricing', showYoutubeMembershipTab = false, membershipUrl, enableAccountAuth = true, showLicenseKeyInput = true, pricingFeatures, pricing, paymentType = 'subscription', messageTypes, onStateChange, setPaymentStatus, setUsageCount, onLicenseSubmit, usageCount: initialUsageCount = 0, t, locale, className, }) => {
2014
2029
  const { t: translate } = useFigmaUiI18n(locale, t);
2015
2030
  const links = React.useMemo(() => ({
2016
2031
  purchaseUrl: wordpressLinks?.purchaseUrl ?? paymentPageUrl,
@@ -2039,8 +2054,9 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2039
2054
  onUsageCountChange: setUsageCount,
2040
2055
  });
2041
2056
  const [licenseKeyDraft, setLicenseKeyDraft] = React.useState(initialLicenseKey);
2057
+ const [activeLicenseMode, setActiveLicenseMode] = React.useState(mode);
2042
2058
  const isPaid = state.isLicenseRegistered && state.paymentStatus === 'PAID';
2043
- const isMembershipMode = mode === 'youtube-membership';
2059
+ const isMembershipMode = activeLicenseMode === 'youtube-membership';
2044
2060
  const usageLabel = formatUsageLabel(state, translate);
2045
2061
  const handleLicenseSubmit = async (submittedLicenseKey) => {
2046
2062
  if (onLicenseSubmit) {
@@ -2053,8 +2069,14 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2053
2069
  setLicenseKeyDraft(value);
2054
2070
  setLicenseKeyInput(value);
2055
2071
  };
2056
- return (React.createElement("div", { className: `designbase-figma-page-license designbase-figma-page-license--${mode} ${className || ''}`, "data-license-mode": mode },
2072
+ return (React.createElement("div", { className: `designbase-figma-page-license designbase-figma-page-license--${activeLicenseMode} ${className || ''}`, "data-license-mode": activeLicenseMode },
2057
2073
  React.createElement("div", { className: "designbase-figma-page-license__content" },
2074
+ showYoutubeMembershipTab && (React.createElement("div", { className: "designbase-figma-page-license__source-tabs", role: "tablist", "aria-label": resolveText(translate, { key: 'license.source_tabs_label' }, 'License type') },
2075
+ React.createElement("button", { type: "button", role: "tab", "aria-selected": !isMembershipMode, onClick: () => setActiveLicenseMode('pricing') }, resolveText(translate, { key: 'license.source_lemon_squeezy' }, 'Lemon Squeezy license')),
2076
+ React.createElement("button", { type: "button", role: "tab", "aria-selected": isMembershipMode, onClick: () => setActiveLicenseMode('youtube-membership') }, resolveText(translate, { key: 'license.source_youtube_membership' }, 'YouTube membership')))),
2077
+ showYoutubeMembershipTab && (React.createElement("p", { className: "designbase-figma-page-license__source-hint" }, isMembershipMode
2078
+ ? resolveText(translate, { key: 'license.source_youtube_hint' }, 'Enter the key provided to YouTube channel members.')
2079
+ : resolveText(translate, { key: 'license.source_lemon_hint' }, 'Enter the license key from your Lemon Squeezy purchase.'))),
2058
2080
  React.createElement("div", { className: "designbase-figma-page-license__header" },
2059
2081
  React.createElement("div", { className: "designbase-figma-page-license__title" },
2060
2082
  React.createElement("h2", null, isPaid
@@ -2066,9 +2088,16 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2066
2088
  React.createElement("p", { className: "designbase-figma-page-license__description" }, isPaid
2067
2089
  ? resolveText(translate, { key: 'license.all_features_available' }, '모든 기능을 사용할 수 있습니다.')
2068
2090
  : isMembershipMode
2069
- ? resolveText(translate, { key: 'license.unlock_unlimited_description' }, '라이선스 키를 등록하면 모든 Designbase 플러그인의 프로 기능과 무제한 사용을 이용할 수 있습니다.')
2091
+ ? resolveText(translate, {
2092
+ key: 'license.unlock_unlimited_description',
2093
+ }, '라이선스 키를 등록하면 모든 Designbase 플러그인의 프로 기능과 무제한 사용을 이용할 수 있습니다.')
2070
2094
  : resolveText(translate, { key: 'license.purchase_for_unlimited' }, '디자인베이스 멤버십 또는 라이선스로 무제한 이용이 가능합니다.')),
2071
2095
  !isPaid && !isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__usage" }, usageLabel))),
2096
+ !isPaid && isMembershipMode && (React.createElement("div", { className: "designbase-figma-page-license__benefit" },
2097
+ React.createElement("span", { className: "designbase-figma-page-license__benefit-icon", "aria-hidden": "true" }, "\u221E"),
2098
+ React.createElement("div", null,
2099
+ React.createElement("strong", null, resolveText(translate, { key: 'license.unlimited_benefit_title' }, '모든 플러그인 무제한 사용')),
2100
+ React.createElement("p", null, resolveText(translate, { key: 'license.unlimited_benefit_description' }, '사용 횟수 제한 없이 프로 기능과 프리미엄 콘텐츠를 이용할 수 있습니다.'))))),
2072
2101
  !isMembershipMode && (React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t: translate })),
2073
2102
  state.lastMessage &&
2074
2103
  state.lastErrorCode &&
@@ -2083,9 +2112,12 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2083
2112
  React.createElement("div", { className: "designbase-figma-page-license__paid-actions" },
2084
2113
  state.activationLimit > 0 && (React.createElement("div", { className: "designbase-figma-page-license__activation-info" },
2085
2114
  React.createElement("div", { className: "designbase-figma-page-license__remaining" },
2086
- Math.max(0, state.activationLimit - state.activationUsage),
2115
+ Math.max(0, state.activationLimit -
2116
+ state.activationUsage),
2087
2117
  ' ',
2088
- resolveText(translate, { key: 'license.activations_remaining' }, '활성'),
2118
+ resolveText(translate, {
2119
+ key: 'license.activations_remaining',
2120
+ }, '활성'),
2089
2121
  ' ',
2090
2122
  resolveText(translate, { key: 'license.spots_remaining' }, '자리 남음')),
2091
2123
  React.createElement("div", { className: "designbase-figma-page-license__usage-count" },
@@ -2095,39 +2127,60 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2095
2127
  React.createElement(react.Button, { onPress: deactivateLicense, variant: "secondary", size: "m", fullWidth: true, disabled: isDeactivating }, isDeactivating
2096
2128
  ? resolveText(translate, { key: 'license.deactivating' }, '비활성화 중...')
2097
2129
  : resolveText(translate, { key: 'license.deactivate' }, '라이선스 비활성화')),
2098
- state.deactivateMessage && state.deactivateErrorCode && (React.createElement("p", { className: `designbase-figma-page-license__action-feedback designbase-figma-page-license__action-feedback--${resolvePaymentFeedbackVariant(state.deactivateErrorCode)}`, role: "alert", "aria-live": "polite" }, state.deactivateMessage)),
2130
+ state.deactivateMessage &&
2131
+ state.deactivateErrorCode && (React.createElement("p", { className: `designbase-figma-page-license__action-feedback designbase-figma-page-license__action-feedback--${resolvePaymentFeedbackVariant(state.deactivateErrorCode)}`, role: "alert", "aria-live": "polite" }, state.deactivateMessage)),
2099
2132
  React.createElement("p", { className: "designbase-figma-page-license__deactivate-hint" }, resolveText(translate, { key: 'license.deactivate_hint' }, '이 기기에서 라이선스 연결을 해제합니다.'))))),
2100
2133
  !isPaid && (React.createElement(React.Fragment, null,
2101
2134
  isMembershipMode && (React.createElement(LicenseOffer, { joinUrl: links.membershipUrl || links.purchaseUrl, guideUrl: links.helpUrl || links.purchaseUrl, t: translate })),
2102
2135
  !isMembershipMode &&
2103
- (enableAccountAuth || links.purchaseUrl || links.accountUrl) && (React.createElement("div", { className: "designbase-figma-page-license__section" },
2136
+ (enableAccountAuth ||
2137
+ links.purchaseUrl ||
2138
+ links.accountUrl) && (React.createElement("div", { className: "designbase-figma-page-license__section" },
2104
2139
  React.createElement("div", { className: "designbase-figma-page-license__section-header" },
2105
- React.createElement("h3", null, resolveText(translate, { key: 'license.designbase_account' }, '디자인베이스 계정'))),
2106
- React.createElement("p", { className: "designbase-figma-page-license__hint" }, resolveText(translate, { key: 'license.designbase_account_hint' }, 'WordPress 계정으로 로그인하거나 멤버십을 구매하면 플러그인이 자동으로 활성화됩니다.')),
2140
+ React.createElement("h3", null, resolveText(translate, {
2141
+ key: 'license.designbase_account',
2142
+ }, '디자인베이스 계정'))),
2143
+ React.createElement("p", { className: "designbase-figma-page-license__hint" }, resolveText(translate, {
2144
+ key: 'license.designbase_account_hint',
2145
+ }, 'WordPress 계정으로 로그인하거나 멤버십을 구매하면 플러그인이 자동으로 활성화됩니다.')),
2107
2146
  React.createElement("div", { className: "designbase-figma-page-license__actions" },
2108
- enableAccountAuth && (React.createElement(react.Button, { onPress: startDesignbaseAuth, variant: "primary", size: "m", disabled: isStartingAuth || isVerifying, fullWidth: true }, isStartingAuth
2109
- ? resolveText(translate, { key: 'license.authenticating' }, '인증 중...')
2110
- : resolveText(translate, { key: 'license.login_with_designbase' }, '디자인베이스로 로그인'))),
2147
+ enableAccountAuth && (React.createElement(react.Button, { onPress: startDesignbaseAuth, variant: "primary", size: "m", disabled: isStartingAuth ||
2148
+ isVerifying, fullWidth: true }, isStartingAuth
2149
+ ? resolveText(translate, {
2150
+ key: 'license.authenticating',
2151
+ }, '인증 중...')
2152
+ : resolveText(translate, {
2153
+ key: 'license.login_with_designbase',
2154
+ }, '디자인베이스로 로그인'))),
2111
2155
  links.purchaseUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(links.purchaseUrl), variant: "secondary", size: "m", fullWidth: true },
2112
- React.createElement("span", null, resolveText(translate, { key: 'license.purchase_membership' }, '멤버십 안내')),
2156
+ React.createElement("span", null, resolveText(translate, {
2157
+ key: 'license.purchase_membership',
2158
+ }, '멤버십 안내')),
2113
2159
  React.createElement(icons.ExternalLinkIcon, { size: 16 }))),
2114
2160
  links.accountUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(links.accountUrl), variant: "tertiary", size: "s", fullWidth: true },
2115
- React.createElement("span", null, resolveText(translate, { key: 'license.manage_account' }, '계정·멤버십 관리')),
2161
+ React.createElement("span", null, resolveText(translate, {
2162
+ key: 'license.manage_account',
2163
+ }, '계정·멤버십 관리')),
2116
2164
  React.createElement(icons.ExternalLinkIcon, { size: 16 })))))),
2117
2165
  showLicenseKeyInput && (React.createElement("div", { className: isMembershipMode
2118
2166
  ? 'designbase-figma-page-license__key-form'
2119
2167
  : 'designbase-figma-page-license__section' },
2120
2168
  React.createElement("div", { className: "designbase-figma-page-license__section-header" },
2121
- isMembershipMode && (React.createElement("span", { className: "designbase-figma-page-license__section-index", "aria-hidden": "true" }, "2")),
2122
2169
  React.createElement("h3", null, isMembershipMode
2123
- ? resolveText(translate, { key: 'license.activate_key_title' }, '라이선스 키 등록')
2170
+ ? resolveText(translate, {
2171
+ key: 'license.activate_key_title',
2172
+ }, '라이선스 키 등록')
2124
2173
  : resolveText(translate, { key: 'license.enter_key' }, '라이선스 키 입력'))),
2125
- isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__hint" }, resolveText(translate, { key: 'license.activate_key_description' }, '이미 키가 있다면 아래에 붙여 넣어 프로 기능을 활성화하세요.'))),
2174
+ isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__hint" }, resolveText(translate, {
2175
+ key: 'license.activate_key_description',
2176
+ }, '이미 키가 있다면 아래에 붙여 넣어 프로 기능을 활성화하세요.'))),
2126
2177
  React.createElement(FormWithSubmit, { onLicenseSubmit: handleLicenseSubmit, disabled: false, isSubmitting: isVerifying, value: licenseKeyDraft, onValueChange: handleLicenseKeyChange, label: { key: 'license.key' }, submitText: {
2127
2178
  key: isMembershipMode
2128
2179
  ? 'license.unlock_pro_features'
2129
2180
  : 'license.submit',
2130
- }, submittingText: { key: 'license.verifying' }, helperText: {
2181
+ }, submittingText: {
2182
+ key: 'license.verifying',
2183
+ }, helperText: {
2131
2184
  key: isMembershipMode
2132
2185
  ? 'license.enter_from_youtube'
2133
2186
  : 'license.enter_from_email',