@designbasekorea/figma-ui 0.7.3 → 0.8.1

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
@@ -70,6 +70,10 @@ const FIGMA_UI_TRANSLATIONS = {
70
70
  'license.unlock_pro_features': '프로 기능 활성화',
71
71
  'license.current_plan': '현재 플랜',
72
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 멤버십 회원에게 제공되는 전용 키를 입력하세요.',
73
77
  'license.membership': '멤버십',
74
78
  'license.pro_account': '프로 계정',
75
79
  'license.upgrade_to_pro': '프로로 업그레이드',
@@ -93,6 +97,7 @@ const FIGMA_UI_TRANSLATIONS = {
93
97
  'license.authenticating': '인증 중...',
94
98
  'license.login_with_designbase': '디자인베이스로 로그인',
95
99
  'license.purchase_membership': '멤버십 안내',
100
+ 'license.purchase_license': '라이선스 구매하기',
96
101
  'license.manage_account': '계정·멤버십 관리',
97
102
  'license.enter_key': '라이선스 키 입력',
98
103
  'license.key': '라이선스 키',
@@ -108,7 +113,7 @@ const FIGMA_UI_TRANSLATIONS = {
108
113
  'license.youtube_membership_join': '멤버십 가입',
109
114
  'license.youtube_membership_guide': '안내보기',
110
115
  'license.all_plugins': '모든 플러그인',
111
- 'license.source_youtube_membership': 'YouTube 멤버십',
116
+ 'license.source_youtube_membership': 'YouTube 멤버십 전용',
112
117
  'license.source_purchase': '구매 라이선스',
113
118
  'license.status_active': '활성',
114
119
  'license.status_inactive': '라이선스 확인 실패',
@@ -224,6 +229,10 @@ const FIGMA_UI_TRANSLATIONS = {
224
229
  'license.unlock_pro_features': 'Unlock Pro features',
225
230
  'license.current_plan': 'Current plan',
226
231
  'license.pro_plan': 'Pro plan',
232
+ 'license.source_tabs_label': 'License type',
233
+ 'license.source_lemon_squeezy': 'Lemon Squeezy license',
234
+ 'license.source_lemon_hint': 'Enter the license key from your Lemon Squeezy purchase.',
235
+ 'license.source_youtube_hint': 'Enter the key provided to YouTube channel members.',
227
236
  'license.membership': 'Membership',
228
237
  'license.pro_account': 'Pro account',
229
238
  'license.upgrade_to_pro': 'Upgrade to Pro',
@@ -247,6 +256,7 @@ const FIGMA_UI_TRANSLATIONS = {
247
256
  'license.authenticating': 'Authenticating...',
248
257
  'license.login_with_designbase': 'Sign in with Designbase',
249
258
  'license.purchase_membership': 'Membership details',
259
+ 'license.purchase_license': 'Buy a license',
250
260
  'license.manage_account': 'Manage account · membership',
251
261
  'license.enter_key': 'Enter license key',
252
262
  'license.key': 'License key',
@@ -262,7 +272,7 @@ const FIGMA_UI_TRANSLATIONS = {
262
272
  'license.youtube_membership_join': 'Join membership',
263
273
  'license.youtube_membership_guide': 'View guide',
264
274
  'license.all_plugins': 'All plugins',
265
- 'license.source_youtube_membership': 'YouTube Membership',
275
+ 'license.source_youtube_membership': 'YouTube membership only',
266
276
  'license.source_purchase': 'Purchased license',
267
277
  'license.status_active': 'Active',
268
278
  'license.status_inactive': 'License check failed',
@@ -378,6 +388,10 @@ const FIGMA_UI_TRANSLATIONS = {
378
388
  'license.unlock_pro_features': 'Pro機能を有効化',
379
389
  'license.current_plan': '現在のプラン',
380
390
  'license.pro_plan': 'Proプラン',
391
+ 'license.source_tabs_label': 'ライセンスの種類',
392
+ 'license.source_lemon_squeezy': 'Lemon Squeezy ライセンス',
393
+ 'license.source_lemon_hint': 'Lemon Squeezyで購入したライセンスキーを入力してください。',
394
+ 'license.source_youtube_hint': 'YouTubeメンバー向けの専用キーを入力してください。',
381
395
  'license.membership': 'メンバーシップ',
382
396
  'license.pro_account': 'Proアカウント',
383
397
  'license.upgrade_to_pro': 'Proにアップグレード',
@@ -401,6 +415,7 @@ const FIGMA_UI_TRANSLATIONS = {
401
415
  'license.authenticating': '認証中...',
402
416
  'license.login_with_designbase': 'Designbaseでサインイン',
403
417
  'license.purchase_membership': 'メンバーシップの詳細',
418
+ 'license.purchase_license': 'ライセンスを購入',
404
419
  'license.manage_account': 'アカウント・メンバーシップを管理',
405
420
  'license.enter_key': 'ライセンスキーを入力',
406
421
  'license.key': 'ライセンスキー',
@@ -416,7 +431,7 @@ const FIGMA_UI_TRANSLATIONS = {
416
431
  'license.youtube_membership_join': 'メンバーシップに参加',
417
432
  'license.youtube_membership_guide': 'ガイドを見る',
418
433
  'license.all_plugins': 'すべてのプラグイン',
419
- 'license.source_youtube_membership': 'YouTubeメンバーシップ',
434
+ 'license.source_youtube_membership': 'YouTubeメンバーシップ専用',
420
435
  'license.source_purchase': '購入ライセンス',
421
436
  'license.status_active': '有効',
422
437
  'license.status_inactive': 'ライセンス確認に失敗しました',
@@ -2013,7 +2028,7 @@ function formatUsageLabel(state, t) {
2013
2028
  }
2014
2029
  return (resolveText(t, { key: 'license.usage_generic', values: { remaining, limit } }, `남은 횟수 ${remaining}/${limit}`) ?? `남은 횟수 ${remaining}/${limit}`);
2015
2030
  }
2016
- 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, }) => {
2031
+ 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, }) => {
2017
2032
  const { t: translate } = useFigmaUiI18n(locale, t);
2018
2033
  const links = React.useMemo(() => ({
2019
2034
  purchaseUrl: wordpressLinks?.purchaseUrl ?? paymentPageUrl,
@@ -2042,8 +2057,10 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2042
2057
  onUsageCountChange: setUsageCount,
2043
2058
  });
2044
2059
  const [licenseKeyDraft, setLicenseKeyDraft] = React.useState(initialLicenseKey);
2060
+ const [activeLicenseMode, setActiveLicenseMode] = React.useState(mode);
2045
2061
  const isPaid = state.isLicenseRegistered && state.paymentStatus === 'PAID';
2046
- const isMembershipMode = mode === 'youtube-membership';
2062
+ const isMembershipMode = activeLicenseMode === 'youtube-membership';
2063
+ const hasSourceTabs = showYoutubeMembershipTab && !isPaid;
2047
2064
  const usageLabel = formatUsageLabel(state, translate);
2048
2065
  const handleLicenseSubmit = async (submittedLicenseKey) => {
2049
2066
  if (onLicenseSubmit) {
@@ -2056,30 +2073,33 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2056
2073
  setLicenseKeyDraft(value);
2057
2074
  setLicenseKeyInput(value);
2058
2075
  };
2059
- return (React.createElement("div", { className: `designbase-figma-page-license designbase-figma-page-license--${mode} ${className || ''}`, "data-license-mode": mode },
2076
+ return (React.createElement("div", { className: `designbase-figma-page-license designbase-figma-page-license--${activeLicenseMode} ${hasSourceTabs ? 'designbase-figma-page-license--source-switching' : ''} ${className || ''}`, "data-license-mode": activeLicenseMode },
2060
2077
  React.createElement("div", { className: "designbase-figma-page-license__content" },
2061
2078
  React.createElement("div", { className: "designbase-figma-page-license__header" },
2062
2079
  React.createElement("div", { className: "designbase-figma-page-license__title" },
2063
2080
  React.createElement("h2", null, isPaid
2064
2081
  ? resolveText(translate, { key: 'license.pro_account' }, '프로 계정')
2065
- : isMembershipMode
2066
- ? resolveText(translate, { key: 'license.unlock_unlimited' }, '무제한 사용 활성화')
2082
+ : showYoutubeMembershipTab
2083
+ ? resolveText(translate, { key: 'license.unlock_unlimited' }, 'Unlock Unlimited Access')
2067
2084
  : resolveText(translate, { key: 'license.upgrade_to_pro' }, '프로로 업그레이드')),
2068
2085
  isPaid && (React.createElement("span", { className: "designbase-figma-page-license__tier" }, resolveText(translate, { key: 'license.pro_plan' }, '프로 플랜')))),
2069
2086
  React.createElement("p", { className: "designbase-figma-page-license__description" }, isPaid
2070
2087
  ? resolveText(translate, { key: 'license.all_features_available' }, '모든 기능을 사용할 수 있습니다.')
2071
- : isMembershipMode
2088
+ : showYoutubeMembershipTab
2072
2089
  ? resolveText(translate, {
2073
2090
  key: 'license.unlock_unlimited_description',
2074
- }, '라이선스 키를 등록하면 모든 Designbase 플러그인의 프로 기능과 무제한 사용을 이용할 수 있습니다.')
2091
+ }, 'Add a license key to unlock Pro features and unlimited use across Designbase plugins.')
2075
2092
  : resolveText(translate, { key: 'license.purchase_for_unlimited' }, '디자인베이스 멤버십 또는 라이선스로 무제한 이용이 가능합니다.')),
2076
- !isPaid && !isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__usage" }, usageLabel))),
2077
- !isPaid && isMembershipMode && (React.createElement("div", { className: "designbase-figma-page-license__benefit" },
2093
+ !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" },
2078
2095
  React.createElement("span", { className: "designbase-figma-page-license__benefit-icon", "aria-hidden": "true" }, "\u221E"),
2079
2096
  React.createElement("div", null,
2080
2097
  React.createElement("strong", null, resolveText(translate, { key: 'license.unlimited_benefit_title' }, '모든 플러그인 무제한 사용')),
2081
2098
  React.createElement("p", null, resolveText(translate, { key: 'license.unlimited_benefit_description' }, '사용 횟수 제한 없이 프로 기능과 프리미엄 콘텐츠를 이용할 수 있습니다.'))))),
2082
- !isMembershipMode && (React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t: translate })),
2099
+ 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
+ React.createElement("button", { type: "button", role: "tab", "aria-selected": !isMembershipMode, onClick: () => setActiveLicenseMode('pricing') }, resolveText(translate, { key: 'license.source_lemon_squeezy' }, 'Lemon Squeezy license')),
2101
+ React.createElement("button", { type: "button", role: "tab", "aria-selected": isMembershipMode, onClick: () => setActiveLicenseMode('youtube-membership') }, resolveText(translate, { key: 'license.source_youtube_membership' }, 'YouTube membership')))),
2102
+ !isMembershipMode && !showYoutubeMembershipTab && (React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t: translate })),
2083
2103
  state.lastMessage &&
2084
2104
  state.lastErrorCode &&
2085
2105
  !state.deactivateMessage && (React.createElement("p", { className: `designbase-figma-page-license__feedback ${state.lastErrorCode ? 'designbase-figma-page-license__feedback--error' : ''}`, "aria-live": "polite" }, state.lastMessage)),
@@ -2112,8 +2132,8 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2112
2132
  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)),
2113
2133
  React.createElement("p", { className: "designbase-figma-page-license__deactivate-hint" }, resolveText(translate, { key: 'license.deactivate_hint' }, '이 기기에서 라이선스 연결을 해제합니다.'))))),
2114
2134
  !isPaid && (React.createElement(React.Fragment, null,
2115
- isMembershipMode && (React.createElement(LicenseOffer, { joinUrl: links.membershipUrl || links.purchaseUrl, guideUrl: links.helpUrl || links.purchaseUrl, t: translate })),
2116
- !isMembershipMode &&
2135
+ isMembershipMode && !showYoutubeMembershipTab && (React.createElement(LicenseOffer, { joinUrl: links.membershipUrl || links.purchaseUrl, guideUrl: links.helpUrl || links.purchaseUrl, t: translate })),
2136
+ !isMembershipMode && !showYoutubeMembershipTab &&
2117
2137
  (enableAccountAuth ||
2118
2138
  links.purchaseUrl ||
2119
2139
  links.accountUrl) && (React.createElement("div", { className: "designbase-figma-page-license__section" },
@@ -2143,20 +2163,23 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2143
2163
  key: 'license.manage_account',
2144
2164
  }, '계정·멤버십 관리')),
2145
2165
  React.createElement(icons.ExternalLinkIcon, { size: 16 })))))),
2146
- showLicenseKeyInput && (React.createElement("div", { className: isMembershipMode
2147
- ? 'designbase-figma-page-license__key-form'
2148
- : 'designbase-figma-page-license__section' },
2166
+ showYoutubeMembershipTab && (React.createElement("div", { "aria-live": "polite" }, isMembershipMode ? (React.createElement(LicenseOffer, { joinUrl: links.membershipUrl || links.purchaseUrl, guideUrl: links.helpUrl || links.purchaseUrl, t: translate })) : (React.createElement(React.Fragment, null,
2167
+ React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t: translate }),
2168
+ links.purchaseUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(links.purchaseUrl), variant: "primary", size: "m", fullWidth: true },
2169
+ React.createElement("span", null, resolveText(translate, { key: 'license.purchase_license' }, 'Buy a license')),
2170
+ React.createElement(icons.ExternalLinkIcon, { size: 16, "aria-hidden": "true" }))))))),
2171
+ showLicenseKeyInput && (React.createElement("div", { className: isMembershipMode && !showYoutubeMembershipTab ? 'designbase-figma-page-license__key-form' : 'designbase-figma-page-license__section' },
2149
2172
  React.createElement("div", { className: "designbase-figma-page-license__section-header" },
2150
- React.createElement("h3", null, isMembershipMode
2173
+ React.createElement("h3", null, isMembershipMode || showYoutubeMembershipTab
2151
2174
  ? resolveText(translate, {
2152
2175
  key: 'license.activate_key_title',
2153
2176
  }, '라이선스 키 등록')
2154
2177
  : resolveText(translate, { key: 'license.enter_key' }, '라이선스 키 입력'))),
2155
- isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__hint" }, resolveText(translate, {
2178
+ (isMembershipMode || showYoutubeMembershipTab) && (React.createElement("p", { className: "designbase-figma-page-license__hint" }, resolveText(translate, {
2156
2179
  key: 'license.activate_key_description',
2157
2180
  }, '이미 키가 있다면 아래에 붙여 넣어 프로 기능을 활성화하세요.'))),
2158
2181
  React.createElement(FormWithSubmit, { onLicenseSubmit: handleLicenseSubmit, disabled: false, isSubmitting: isVerifying, value: licenseKeyDraft, onValueChange: handleLicenseKeyChange, label: { key: 'license.key' }, submitText: {
2159
- key: isMembershipMode
2182
+ key: isMembershipMode || showYoutubeMembershipTab
2160
2183
  ? 'license.unlock_pro_features'
2161
2184
  : 'license.submit',
2162
2185
  }, submittingText: {
@@ -2166,7 +2189,7 @@ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicens
2166
2189
  ? 'license.enter_from_youtube'
2167
2190
  : 'license.enter_from_email',
2168
2191
  }, t: translate }))))),
2169
- links.helpUrl && !isMembershipMode && (React.createElement("p", { className: "designbase-figma-page-license__disclaimer" },
2192
+ links.helpUrl && (!isMembershipMode || showYoutubeMembershipTab) && (React.createElement("p", { className: "designbase-figma-page-license__disclaimer" },
2170
2193
  React.createElement("button", { type: "button", className: "designbase-figma-page-license__link", onClick: () => openExternalUrl(links.helpUrl) }, resolveText(translate, { key: 'license.help_link' }, '라이선스·결제 도움말'))))),
2171
2194
  React.createElement(react.Button, { className: "designbase-figma-page-license__close", onPress: onClose, variant: "tertiary", size: "s", iconOnly: true, "aria-label": translate('close') },
2172
2195
  React.createElement(icons.CloseIcon, { size: 16 }))));