@designbasekorea/figma-ui 0.6.3 → 0.6.6

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
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
+ var react = require('@designbasekorea/ui-wc/react');
4
5
  var icons = require('@designbasekorea/icons');
5
- var ui = require('@designbasekorea/ui');
6
6
 
7
7
  function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
8
8
 
@@ -12,10 +12,20 @@ function resolveText(t, input, fallback) {
12
12
  if (typeof input === 'string') {
13
13
  return input;
14
14
  }
15
- return t ? t(input.key, input.values) : input.key;
15
+ if (t) {
16
+ const translated = t(input.key, input.values);
17
+ if (translated && translated !== input.key) {
18
+ return translated;
19
+ }
20
+ }
21
+ return fallback ?? input.key;
16
22
  }
17
23
 
18
- const DonationBadge = ({ donationUrl = 'https://buymeacoffee.com/designbase', text = { key: 'donation.buy_me_a_coffee' }, iconType = 'heart', size = 's', variant = 'tertiary', fullWidth = false, disabled = false, showPrompt = false, promptText = { key: 'donation.prompt' }, className, onClick, t }) => {
24
+ const DONATION_ICON_NAMES = {
25
+ heart: 'star-filled',
26
+ coffee: 'cart',
27
+ };
28
+ const DonationBadge = ({ donationUrl = 'https://buymeacoffee.com/designbase', text = { key: 'donation.buy_me_a_coffee' }, iconType = 'heart', size = 's', variant = 'tertiary', fullWidth = false, iconOnly = false, disabled = false, showPrompt = false, promptText = { key: 'donation.prompt' }, className, onClick, t }) => {
19
29
  const handleClick = () => {
20
30
  if (onClick) {
21
31
  onClick();
@@ -24,15 +34,12 @@ const DonationBadge = ({ donationUrl = 'https://buymeacoffee.com/designbase', te
24
34
  window.open(donationUrl, '_blank', 'noopener,noreferrer');
25
35
  }
26
36
  };
27
- const Icon = iconType === 'heart' ? icons.HeartFilledIcon : icons.CoffeeFilledIcon;
28
37
  const displayText = resolveText(t, text, 'Buy me a coffee');
29
38
  const displayPromptText = resolveText(t, promptText, '도움이 되었다면 커피 한 잔 사주세요!');
30
39
  const buttonSize = size;
31
40
  return (React.createElement("div", { className: clsx('designbase-figma-donation-badge-container', className) },
32
- showPrompt && (React.createElement("div", { className: "designbase-figma-donation-badge__prompt" }, displayPromptText)),
33
- React.createElement(ui.Button, { variant: variant, size: buttonSize, fullWidth: fullWidth, disabled: disabled, onPress: handleClick, startIcon: Icon, className: clsx('designbase-figma-donation-badge', `designbase-figma-donation-badge--${iconType}`), "aria-label": displayText, style: {
34
- '--designbase-figma-donation-badge-icon-color': 'var(--db-brand-primary)'
35
- } }, displayText)));
41
+ showPrompt && !iconOnly && (React.createElement("div", { className: "designbase-figma-donation-badge__prompt" }, displayPromptText)),
42
+ React.createElement(react.Button, { variant: variant, size: buttonSize, fullWidth: fullWidth, disabled: disabled, onPress: handleClick, iconOnly: iconOnly, startIcon: DONATION_ICON_NAMES[iconType], className: clsx('designbase-figma-donation-badge', `designbase-figma-donation-badge--${iconType}`), "aria-label": displayText }, iconOnly ? undefined : displayText)));
36
43
  };
37
44
  DonationBadge.displayName = 'DonationBadge';
38
45
 
@@ -70,10 +77,11 @@ const FigmaHeader = ({ children, actions = [], searchBar, sticky = true, classNa
70
77
  'designbase-figma-header--with-search': !!searchBar,
71
78
  'designbase-figma-header--with-actions': actions.length > 0,
72
79
  }, className);
80
+ const hasToolbar = !!children || actions.length > 0;
73
81
  return (React.createElement("header", { className: classes },
74
- React.createElement("div", { className: "designbase-figma-header__container" },
82
+ hasToolbar && (React.createElement("div", { className: "designbase-figma-header__container" },
75
83
  children && (React.createElement("div", { className: "designbase-figma-header__center" }, children)),
76
- actions.length > 0 && (React.createElement("div", { className: "designbase-figma-header__right" }, actions.map((action, index) => (React.createElement(ui.Button, { key: index, variant: "tertiary", size: "s", iconOnly: true, "aria-label": `액션 ${index + 1}` }, action)))))),
84
+ actions.length > 0 && (React.createElement("div", { className: "designbase-figma-header__right" }, actions.map((action, index) => (React.createElement(react.Button, { key: `${action.startIcon}-${index}`, variant: "tertiary", size: "s", iconOnly: true, startIcon: action.startIcon, "aria-label": action.ariaLabel, onPress: action.onPress }))))))),
77
85
  searchBar && (React.createElement("div", { className: "designbase-figma-header__search-container" }, searchBar))));
78
86
  };
79
87
  FigmaHeader.displayName = 'FigmaHeader';
@@ -82,22 +90,24 @@ const FigmaPageHead = ({ onBack, title, description, actions = [], moreActions =
82
90
  const classes = clsx('designbase-figma-page-head', className);
83
91
  const displayTitle = resolveText(t, title);
84
92
  const displayDescription = description ? resolveText(t, description) : undefined;
85
- const dropdownItems = moreActions.map(action => ({
93
+ const dropdownItems = moreActions.map((action) => ({
86
94
  id: action.id,
87
95
  label: resolveText(t, action.label),
88
- onClick: action.onClick
89
96
  }));
97
+ const handleDropdownChange = (event) => {
98
+ const actionId = event.detail?.id ?? event.detail?.value;
99
+ const action = moreActions.find((item) => item.id === actionId);
100
+ action?.onClick();
101
+ };
90
102
  return (React.createElement("div", { className: classes },
91
103
  React.createElement("div", { className: "designbase-figma-page-head__left" },
92
- React.createElement(ui.Button, { variant: "tertiary", size: "s", iconOnly: true, onPress: onBack, "aria-label": "\uB4A4\uB85C\uAC00\uAE30" },
93
- React.createElement(icons.ChevronLeftIcon, { size: 14 })),
104
+ React.createElement(react.Button, { variant: "tertiary", size: "s", iconOnly: true, startIcon: "chevron-left", onPress: onBack, "aria-label": "\uB4A4\uB85C\uAC00\uAE30" }),
94
105
  React.createElement("div", { className: "designbase-figma-page-head__titles" },
95
106
  React.createElement("h2", null, displayTitle),
96
107
  displayDescription && React.createElement("p", null, displayDescription))),
97
108
  React.createElement("div", { className: "designbase-figma-page-head__actions" },
98
109
  actions.map((action, index) => (React.createElement(React.Fragment, { key: index }, action))),
99
- moreActions.length > 0 && (React.createElement(ui.Dropdown, { trigger: React.createElement("button", { type: "button", className: "designbase-figma-page-head__more-button", "aria-label": "\uB354\uBCF4\uAE30" },
100
- React.createElement(icons.MoreHorizontalIcon, { size: 16 })), items: dropdownItems, placement: "bottom-right", size: "s" })))));
110
+ moreActions.length > 0 && (React.createElement(react.Dropdown, { items: dropdownItems, triggerIcon: "more-horizontal", iconOnly: true, triggerVariant: "tertiary", placement: "bottom-right", size: "s", onChange: handleDropdownChange })))));
101
111
  };
102
112
  FigmaPageHead.displayName = 'FigmaPageHead';
103
113
 
@@ -223,12 +233,12 @@ const FigmaSection = ({ title, dataCategory, iconButton, children, marginBottom,
223
233
  typeof title === 'string' || (typeof title === 'object' && 'key' in title)
224
234
  ? resolveText(t, title)
225
235
  : title,
226
- badge && (React.createElement(ui.Badge, { variant: "secondary", size: "s" }, badge)))),
236
+ badge && (React.createElement(react.Badge, { variant: "secondary", size: "s" }, badge)))),
227
237
  React.createElement("div", { className: "designbase-figma-section__controls", onClick: (e) => e.stopPropagation() },
228
238
  iconButton,
229
239
  collapsible && (React.createElement("span", { className: `designbase-figma-section__collapse-icon ${collapsed ? 'designbase-figma-section__collapse-icon--collapsed' : ''}` },
230
240
  React.createElement(icons.ChevronDownIcon, { size: 16 }))),
231
- onToggle && (React.createElement(ui.Toggle, { checked: isEnabled, onChange: () => onToggle(dataCategory), size: "s" }))))),
241
+ onToggle && (React.createElement(react.Toggle, { checked: isEnabled, onChange: () => onToggle(dataCategory), size: "s" }))))),
232
242
  React.createElement("div", { className: `designbase-figma-section__content ${!isEnabled ? 'designbase-figma-section__content--hidden' : ''}` },
233
243
  React.createElement("div", { ref: clipRef, className: "designbase-figma-section__content-clip" },
234
244
  React.createElement("div", { ref: innerRef, className: `designbase-figma-section__content-inner ${collapsible && contentHidden ? 'is-collapsed' : ''}` }, children)))));
@@ -385,7 +395,7 @@ const PaymentBadge = ({ isActive, onClick, isLoading = false, text, t = (key) =>
385
395
  const getBadgeVariant = () => {
386
396
  return isActive ? 'success' : 'secondary';
387
397
  };
388
- return (React.createElement("div", { className: `designbase-figma-payment-badge ${className || ''} ${isActive ? 'active' : 'free'}`, onClick: onClick, style: { cursor: onClick ? 'pointer' : 'default' } }, isLoading ? (React.createElement(ui.Spinner, { size: "s" })) : (React.createElement(ui.Badge, { variant: getBadgeVariant(), size: "s", className: "designbase-figma-payment-badge__badge" }, getBadgeText()))));
398
+ return (React.createElement("div", { className: `designbase-figma-payment-badge ${className || ''} ${isActive ? 'active' : 'free'}`, onClick: onClick, style: { cursor: onClick ? 'pointer' : 'default' } }, isLoading ? (React.createElement(react.Spinner, { size: "s" })) : (React.createElement(react.Badge, { variant: getBadgeVariant(), size: "s", className: "designbase-figma-payment-badge__badge" }, getBadgeText()))));
389
399
  };
390
400
  PaymentBadge.displayName = 'PaymentBadge';
391
401
 
@@ -414,10 +424,19 @@ const LanguageSelector = ({ currentLanguage, languages = DEFAULT_LANGUAGES, onLa
414
424
  const segmentOptions = languages.map((language) => ({
415
425
  value: language.code,
416
426
  label: resolveText(t, language.label),
417
- disabled: false
427
+ disabled: false,
418
428
  }));
419
429
  return (React.createElement("div", { className: `designbase-figma-language-selector ${className || ''}` },
420
- React.createElement(ui.SegmentControl, { options: segmentOptions, value: activeLanguage, onChange: handleLanguageChange, size: size, className: "designbase-figma-language-selector__segment" })));
430
+ React.createElement(react.SegmentControl, { options: segmentOptions, value: activeLanguage, onChange: (event) => {
431
+ const detail = event.detail;
432
+ const value = typeof detail === 'object' && detail !== null && 'value' in detail &&
433
+ typeof detail.value === 'string'
434
+ ? detail.value
435
+ : undefined;
436
+ if (value) {
437
+ handleLanguageChange(value);
438
+ }
439
+ }, size: size, className: "designbase-figma-language-selector__segment" })));
421
440
  };
422
441
  LanguageSelector.displayName = 'LanguageSelector';
423
442
 
@@ -473,7 +492,7 @@ const LogoDropdown = ({ logoSrc, logoAlt = 'DesignBase', logoType = 'designbase'
473
492
  return (React.createElement("img", { className: "designbase-figma-logo-dropdown__logo", src: logoSrc, alt: logoAlt, onClick: toggleDropdown }));
474
493
  }
475
494
  return (React.createElement("div", { className: "designbase-figma-logo-dropdown__logo", onClick: toggleDropdown },
476
- React.createElement(ui.Logo, { type: logoType, size: logoSize, variant: "default" })));
495
+ React.createElement(react.Logo, { type: logoType, size: logoSize, variant: "default" })));
477
496
  };
478
497
  return (React.createElement("div", { className: classes },
479
498
  renderLogo(),
@@ -507,22 +526,29 @@ const FigmaFooter = ({ onLicensePageClick, paymentStatus = 'FREE', usageCount =
507
526
  React.createElement("div", { className: "designbase-figma-footer__left" },
508
527
  React.createElement(LogoDropdown, { logoSrc: logoSrc, logoAlt: logoAlt, logoType: logoType, logoSize: logoSize, links: logoLinks, t: t }),
509
528
  showLanguageSelector && (React.createElement(LanguageSelector, { currentLanguage: currentLanguage, languages: languages, onLanguageChange: onLanguageChange, size: "s" }))),
510
- showPaymentStatus && (React.createElement("div", { className: "designbase-figma-footer__payment-states" },
511
- resolvedShowUsageInfo && (React.createElement("div", { className: "designbase-figma-footer__usage-info" }, isActive ? (React.createElement("span", { className: "designbase-figma-footer__unlimited-usage designbase-figma-footer__unlimited-usage--tooltip", title: t('unlimitedUsageTooltip') }, t('unlimitedUsage'))) : (React.createElement(React.Fragment, null,
512
- React.createElement("span", { className: "designbase-figma-footer__usage-info designbase-figma-footer__usage-info--tooltip", title: t('resetsDaily') },
513
- React.createElement("span", { className: "designbase-figma-footer__usage-count" }, usageCount),
514
- React.createElement("span", { className: "designbase-figma-footer__max-daily-usage" },
515
- "/",
516
- maxDailyUsage,
517
- " ",
518
- t('perDay'))))))),
519
- resolvedShowPaymentBadge && (React.createElement(PaymentBadge, { isActive: isActive, onClick: isBeta ? undefined : onLicensePageClick, isLoading: isLoading, text: isBeta ? (t('betaStatus') || 'BETA') : undefined, t: t })))),
520
- showDonation && (React.createElement("div", { className: "designbase-figma-footer__donation" },
521
- React.createElement(DonationBadge, { donationUrl: donationUrl, text: donationText, iconType: "heart", size: "s", showPrompt: showDonationText && !isActive, promptText: donationPromptText, t: t })))),
529
+ React.createElement("div", { className: "designbase-figma-footer__right" },
530
+ showPaymentStatus && resolvedShowUsageInfo && (React.createElement("div", { className: "designbase-figma-footer__usage-info" }, isActive ? (React.createElement("span", { className: "designbase-figma-footer__unlimited-usage designbase-figma-footer__unlimited-usage--tooltip", title: t('unlimitedUsageTooltip') }, t('unlimitedUsage'))) : (React.createElement("span", { className: "designbase-figma-footer__usage-info designbase-figma-footer__usage-info--tooltip", title: t('resetsDaily') },
531
+ React.createElement("span", { className: "designbase-figma-footer__usage-count" }, usageCount),
532
+ React.createElement("span", { className: "designbase-figma-footer__max-daily-usage" },
533
+ "/",
534
+ maxDailyUsage,
535
+ " ",
536
+ t('perDay')))))),
537
+ showPaymentStatus && resolvedShowPaymentBadge && (React.createElement(PaymentBadge, { isActive: isActive, onClick: isBeta ? undefined : onLicensePageClick, isLoading: isLoading, text: isBeta ? (t('betaStatus') || 'BETA') : undefined, t: t })),
538
+ showDonation && (React.createElement(DonationBadge, { donationUrl: donationUrl, text: donationText, iconType: "heart", size: "s", iconOnly: true, showPrompt: false, t: t })))),
522
539
  children));
523
540
  };
524
541
  FigmaFooter.displayName = 'FigmaFooter';
525
542
 
543
+ const FigmaToastStack = ({ toasts, position, maxToasts, onRemoveToast, }) => {
544
+ const visibleToasts = [...toasts]
545
+ .sort((a, b) => b.createdAt - a.createdAt)
546
+ .slice(0, maxToasts);
547
+ if (visibleToasts.length === 0)
548
+ return null;
549
+ return (React.createElement("div", { className: `figma-toast-container figma-toast-container--${position}` }, visibleToasts.map((toast) => (React.createElement("div", { key: toast.id, className: "figma-toast-container__item" },
550
+ React.createElement(react.Toast, { toastId: toast.id, title: toast.title, description: toast.description, status: toast.status, duration: toast.duration, showProgress: toast.showProgress, showClose: toast.showCloseButton, onClose: () => onRemoveToast(toast.id) }))))));
551
+ };
526
552
  const ToastContext = React.createContext(null);
527
553
  const useToast = () => {
528
554
  const context = React.useContext(ToastContext);
@@ -540,13 +566,13 @@ const FigmaToastProvider = ({ children, position = 'top-right', maxToasts = 5, }
540
566
  id,
541
567
  createdAt: Date.now(),
542
568
  };
543
- setToasts(prev => {
569
+ setToasts((prev) => {
544
570
  const updated = [newToast, ...prev];
545
571
  return updated.slice(0, maxToasts);
546
572
  });
547
573
  }, [maxToasts]);
548
574
  const removeToast = React.useCallback((id) => {
549
- setToasts(prev => prev.filter(toast => toast.id !== id));
575
+ setToasts((prev) => prev.filter((toast) => toast.id !== id));
550
576
  }, []);
551
577
  const showToast = React.useCallback((message, options = {}) => {
552
578
  addToast({
@@ -565,17 +591,17 @@ const FigmaToastProvider = ({ children, position = 'top-right', maxToasts = 5, }
565
591
  };
566
592
  return (React.createElement(ToastContext.Provider, { value: contextValue },
567
593
  children,
568
- React.createElement(ui.ToastContainer, { toasts: toasts, onRemoveToast: removeToast, position: position, maxToasts: maxToasts })));
594
+ React.createElement(FigmaToastStack, { toasts: toasts, onRemoveToast: removeToast, position: position, maxToasts: maxToasts })));
569
595
  };
570
596
  const FigmaToast = ({ message, isVisible, onClose, type = 'info', duration = 3000, className, }) => {
571
597
  if (!isVisible)
572
598
  return null;
573
599
  return (React.createElement("div", { className: `figma-toast-fixed-wrap ${className || ''}` },
574
- React.createElement(ui.Toast, { id: "figma-toast-simple", title: message, status: type, duration: duration, showProgress: false, showCloseButton: true, onClose: onClose, position: "top-right" })));
600
+ React.createElement(react.Toast, { toastId: "figma-toast-simple", title: message, status: type, duration: duration, showProgress: false, showClose: true, onClose: onClose })));
575
601
  };
576
602
  const useFigmaToast = () => {
577
603
  const [toast, setToast] = React.useState({ message: '', isVisible: false });
578
- const showToast = React.useCallback((message, type = 'info') => {
604
+ const showToast = React.useCallback((message, _type = 'info') => {
579
605
  setToast({ message, isVisible: true });
580
606
  setTimeout(() => setToast({ message: '', isVisible: false }), 5000);
581
607
  }, []);
@@ -606,8 +632,13 @@ const FormWithSubmit = ({ onLicenseSubmit, disabled = false, isSubmitting = fals
606
632
  return (React.createElement("form", { className: `designbase-figma-form-with-submit ${className || ''}`, onSubmit: handleSubmit },
607
633
  React.createElement("div", { className: "designbase-figma-form-with-submit__field" },
608
634
  React.createElement("label", { className: "designbase-figma-form-with-submit__label" }, displayLabel),
609
- React.createElement(ui.Input, { value: inputValue, onChange: handleChange, placeholder: displayPlaceholder, helperText: displayHelperText, disabled: disabled || isSubmitting, size: "m" })),
610
- React.createElement(ui.Button, { type: "submit", variant: "primary", size: "m", loading: isSubmitting, disabled: !inputValue.trim() || isSubmitting || disabled, fullWidth: true }, isSubmitting ? displaySubmittingText : displaySubmitText)));
635
+ React.createElement(react.Input, { value: inputValue, onChange: (event) => {
636
+ const value = event.detail?.value;
637
+ if (value !== undefined) {
638
+ handleChange(value);
639
+ }
640
+ }, placeholder: displayPlaceholder, helperText: displayHelperText, disabled: disabled || isSubmitting, size: "m" })),
641
+ React.createElement(react.Button, { type: "submit", variant: "primary", size: "m", loading: isSubmitting, disabled: !inputValue.trim() || isSubmitting || disabled, fullWidth: true }, isSubmitting ? displaySubmittingText : displaySubmitText)));
611
642
  };
612
643
  FormWithSubmit.displayName = 'FormWithSubmit';
613
644
 
@@ -620,13 +651,95 @@ const InteractionFeedback = ({ status = 'default', message, statusMessage, leftC
620
651
  return (React.createElement("div", { className: feedbackClasses },
621
652
  React.createElement("div", { className: "designbase-figma-interaction__content" },
622
653
  React.createElement("div", { className: "designbase-figma-interaction__left" }, leftContent || (React.createElement("div", { className: "designbase-figma-interaction__message" },
623
- status === 'loading' && (React.createElement(ui.Spinner, { size: "s", type: "circular", label: "\uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4...", showLabel: false })),
654
+ status === 'loading' && (React.createElement(react.Spinner, { size: "s", type: "circular", label: "\uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4...", showLabel: false })),
624
655
  (message || status === 'loading') && (React.createElement("span", { className: "designbase-figma-interaction__text" }, resolveText(t, message || '불러오는 중입니다...'))),
625
656
  statusMessage && (React.createElement("span", { className: "designbase-figma-interaction__status-text" }, resolveText(t, statusMessage)))))),
626
657
  rightAction && (React.createElement("div", { className: "designbase-figma-interaction__right" }, rightAction)))));
627
658
  };
628
659
  InteractionFeedback.displayName = 'InteractionFeedback';
629
660
 
661
+ function postPluginMessage(message) {
662
+ if (typeof parent === 'undefined') {
663
+ return;
664
+ }
665
+ parent.postMessage({ pluginMessage: message }, '*');
666
+ }
667
+ function openExternalUrl(url) {
668
+ if (!url)
669
+ return;
670
+ postPluginMessage({ type: 'open-external-url', url });
671
+ if (typeof window !== 'undefined') {
672
+ window.open(url, '_blank', 'noopener,noreferrer');
673
+ }
674
+ }
675
+
676
+ const LicenseOffer = ({ membershipUrl, t, className }) => (React.createElement("section", { className: `designbase-figma-license-offer ${className || ''}`, "aria-labelledby": "designbase-license-offer-title" },
677
+ React.createElement("div", { className: "designbase-figma-license-offer__eyebrow" }, "YouTube Membership"),
678
+ React.createElement("h3", { id: "designbase-license-offer-title" }, resolveText(t, { key: 'license.youtube_membership_title' }, 'YouTube 멤버십으로 전체 플러그인 이용')),
679
+ React.createElement("p", null, resolveText(t, { key: 'license.youtube_membership_description' }, 'YouTube 멤버십에 가입하면 Designbase 플러그인을 무제한으로 사용할 수 있습니다.')),
680
+ React.createElement("ol", null,
681
+ React.createElement("li", null, "Designbase YouTube \uCC44\uB110\uC758 \uBA64\uBC84\uC2ED\uC5D0 \uAC00\uC785\uD569\uB2C8\uB2E4."),
682
+ React.createElement("li", null, "\uBA64\uBC84 \uC804\uC6A9 \uCEE4\uBBA4\uB2C8\uD2F0 \uAC8C\uC2DC\uAE00\uC5D0\uC11C \uC774\uBC88 \uB2EC \uB77C\uC774\uC120\uC2A4 \uD0A4\uB97C \uD655\uC778\uD569\uB2C8\uB2E4."),
683
+ React.createElement("li", null, "\uC544\uB798 \uC785\uB825\uCC3D\uC5D0 \uD0A4\uB97C \uBD99\uC5EC \uB123\uACE0 \uD65C\uC131\uD654\uD569\uB2C8\uB2E4.")),
684
+ membershipUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(membershipUrl), variant: "secondary", size: "m", fullWidth: true },
685
+ React.createElement("span", null, resolveText(t, { key: 'license.youtube_membership_cta' }, '멤버십 안내 보기')),
686
+ React.createElement(icons.ExternalLinkIcon, { size: 16 })))));
687
+ LicenseOffer.displayName = 'LicenseOffer';
688
+
689
+ function maskLicenseKey(value) {
690
+ if (value.length <= 8)
691
+ return '••••••••';
692
+ return `${value.slice(0, 4)}••••${value.slice(-4)}`;
693
+ }
694
+ function formatDate(value) {
695
+ if (!value)
696
+ return undefined;
697
+ const date = new Date(value);
698
+ if (Number.isNaN(date.getTime()))
699
+ return value;
700
+ return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' }).format(date);
701
+ }
702
+ function formatScope(value) {
703
+ if (!value)
704
+ return undefined;
705
+ if (value === 'all-products' || value === 'all_products')
706
+ return '전체 제품';
707
+ return value;
708
+ }
709
+ const LicenseStatusCard = ({ status, licenseKey = '', licenseStatus, licenseSource, accessScope, expiresAt, lastVerifiedAt, validationMessage, allowRevealKey = true, t, className, }) => {
710
+ const [isKeyRevealed, setIsKeyRevealed] = React.useState(false);
711
+ const isActive = status === 'PAID';
712
+ const statusText = isActive
713
+ ? resolveText(t, { key: 'license.status_active' }, 'Active')
714
+ : resolveText(t, { key: 'license.status_inactive' }, 'License check failed');
715
+ const statusClass = isActive ? 'active' : 'inactive';
716
+ return (React.createElement("section", { className: `designbase-figma-license-status-card designbase-figma-license-status-card--${statusClass} ${className || ''}`, "aria-label": statusText },
717
+ React.createElement("div", { className: "designbase-figma-license-status-card__header" },
718
+ React.createElement("div", null,
719
+ React.createElement("div", { className: "designbase-figma-license-status-card__eyebrow" }, isActive ? 'License Activated' : 'License Status'),
720
+ React.createElement("h3", null, statusText)),
721
+ React.createElement("span", { className: "designbase-figma-license-status-card__badge" }, licenseStatus || (isActive ? 'active' : 'inactive'))),
722
+ validationMessage && !isActive && (React.createElement("p", { className: "designbase-figma-license-status-card__message" }, validationMessage)),
723
+ licenseKey && (React.createElement("div", { className: "designbase-figma-license-status-card__key-row" },
724
+ React.createElement("span", null, resolveText(t, { key: 'license.key_label' }, '라이선스 키')),
725
+ React.createElement("code", null, allowRevealKey && isKeyRevealed ? licenseKey : maskLicenseKey(licenseKey)),
726
+ allowRevealKey && (React.createElement(react.Button, { type: "button", onPress: () => setIsKeyRevealed((value) => !value), variant: "tertiary", size: "s" }, isKeyRevealed ? '숨기기' : '보기')))),
727
+ (licenseSource || accessScope || expiresAt || lastVerifiedAt) && (React.createElement("dl", { className: "designbase-figma-license-status-card__meta" },
728
+ licenseSource && React.createElement(React.Fragment, null,
729
+ React.createElement("dt", null, "Source"),
730
+ React.createElement("dd", null, licenseSource)),
731
+ formatScope(accessScope) && React.createElement(React.Fragment, null,
732
+ React.createElement("dt", null, "Access"),
733
+ React.createElement("dd", null, formatScope(accessScope))),
734
+ expiresAt && React.createElement(React.Fragment, null,
735
+ React.createElement("dt", null, "Expires"),
736
+ React.createElement("dd", null, formatDate(expiresAt) || expiresAt)),
737
+ lastVerifiedAt && React.createElement(React.Fragment, null,
738
+ React.createElement("dt", null, "Last checked"),
739
+ React.createElement("dd", null, formatDate(lastVerifiedAt) || lastVerifiedAt))))));
740
+ };
741
+ LicenseStatusCard.displayName = 'LicenseStatusCard';
742
+
630
743
  const defaultFeatures = [
631
744
  { name: '사용 제한', free: '일일 제한', pro: '무제한' },
632
745
  { name: '모든 주제 사용', free: false, pro: true },
@@ -659,18 +772,21 @@ const PricingComparison = ({ features = defaultFeatures, pricing = defaultPricin
659
772
  };
660
773
  return (React.createElement("div", { className: `designbase-figma-pricing-comparison ${className || ''}` },
661
774
  paymentType === 'subscription' && (React.createElement("div", { className: "designbase-figma-pricing-comparison__billing-toggle" },
662
- React.createElement(ui.SegmentControl, { value: isYearly ? 'yearly' : 'monthly', onChange: (value) => setIsYearly(value === 'yearly'), options: [
775
+ React.createElement(react.SegmentControl, { value: isYearly ? 'yearly' : 'monthly', onChange: (event) => {
776
+ const detail = event.detail;
777
+ const value = typeof detail === 'object' && detail !== null && 'value' in detail &&
778
+ typeof detail.value === 'string'
779
+ ? detail.value
780
+ : undefined;
781
+ setIsYearly(value === 'yearly');
782
+ }, options: [
663
783
  {
664
784
  value: 'monthly',
665
785
  label: t('monthlyBilling') || '월간 결제',
666
786
  },
667
787
  {
668
788
  value: 'yearly',
669
- label: (React.createElement("div", { style: { display: 'flex', alignItems: 'center', gap: '8px' } },
670
- t('yearlyBilling') || '연간 결제',
671
- React.createElement("span", { className: "designbase-figma-pricing-comparison__discount-badge" },
672
- getDiscountPercentage(),
673
- "% \uC808\uC57D"))),
789
+ label: `${t('yearlyBilling') || '연간 결제'} (${getDiscountPercentage()}% 절약)`,
674
790
  },
675
791
  ], size: "s" }))),
676
792
  paymentType === 'lifetime' && (React.createElement("div", { className: "designbase-figma-pricing-comparison__lifetime-info" },
@@ -698,124 +814,302 @@ const PricingComparison = ({ features = defaultFeatures, pricing = defaultPricin
698
814
  };
699
815
  PricingComparison.displayName = 'PricingComparison';
700
816
 
701
- const PageLicense = ({ status: initialStatus, onClose, usageCount: initialUsageCount = 0, onLicenseSubmit, licenseKey: initialLicenseKey = '', setPaymentStatus, setUsageCount, setShowLicensePage, paymentPageUrl, pricingFeatures, pricing, paymentType = 'subscription', t, className, }) => {
702
- const [isSubmitting, setIsSubmitting] = React.useState(false);
817
+ const DEFAULT_LICENSE_MESSAGE_TYPES = {
818
+ initialize: 'initialize',
819
+ verifyLicense: 'verify-license',
820
+ deactivateLicense: 'deactivate-license',
821
+ updateStatus: 'update-plugin-status',
822
+ verifyResult: 'license-verification-result',
823
+ deactivateResult: 'license-deactivation-result',
824
+ };
825
+ const START_DESIGNBASE_AUTH_MESSAGE = 'start-designbase-auth';
826
+ const INITIAL_LICENSE_PAGE_STATE = {
827
+ paymentStatus: 'FREE',
828
+ licenseKey: '',
829
+ planTier: 'FREE',
830
+ hasLicenseKey: false,
831
+ isLicenseRegistered: false,
832
+ activationLimit: 0,
833
+ activationUsage: 0,
834
+ usageCount: 0,
835
+ remainingUsage: 0,
836
+ usageUsed: 0,
837
+ usageLimit: 0,
838
+ usageReset: 'none',
839
+ canUseFeature: true,
840
+ };
841
+
842
+ function readString(data, keys) {
843
+ for (const key of keys) {
844
+ const value = data[key];
845
+ if (typeof value === 'string') {
846
+ return value;
847
+ }
848
+ }
849
+ return '';
850
+ }
851
+ function readNumber(data, keys) {
852
+ for (const key of keys) {
853
+ const value = data[key];
854
+ if (typeof value === 'number' && Number.isFinite(value)) {
855
+ return value;
856
+ }
857
+ }
858
+ return undefined;
859
+ }
860
+ function readBoolean(data, keys) {
861
+ for (const key of keys) {
862
+ const value = data[key];
863
+ if (typeof value === 'boolean') {
864
+ return value;
865
+ }
866
+ }
867
+ return undefined;
868
+ }
869
+ function parseLicenseMessage(data) {
870
+ const paymentStatus = readString(data, ['paymentStatus', 'status']);
871
+ const usageLimitRaw = data.usageLimit;
872
+ return {
873
+ ...(paymentStatus ? { paymentStatus } : {}),
874
+ licenseKey: readString(data, ['licenseKey']) || undefined,
875
+ planTier: readString(data, ['planTier']) || undefined,
876
+ hasLicenseKey: readBoolean(data, ['hasLicenseKey']),
877
+ isLicenseRegistered: readBoolean(data, ['isLicenseRegistered']),
878
+ activationLimit: readNumber(data, ['activationLimit']),
879
+ activationUsage: readNumber(data, ['activationUsage']),
880
+ usageCount: readNumber(data, ['usageCount']),
881
+ remainingUsage: readNumber(data, ['remainingUsage']),
882
+ usageUsed: readNumber(data, ['usageUsed']),
883
+ usageLimit: usageLimitRaw === 'unlimited' ? 'unlimited' : readNumber(data, ['usageLimit']),
884
+ usageReset: readString(data, ['usageReset']) || undefined,
885
+ canUseFeature: readBoolean(data, ['canUseFeature']),
886
+ usageReason: readString(data, ['usageReason']) || undefined,
887
+ lastMessage: readString(data, ['message']) || undefined,
888
+ lastErrorCode: readString(data, ['errorCode']) || undefined,
889
+ licenseStatus: readString(data, ['licenseStatus', 'license_status']) || undefined,
890
+ licenseSource: readString(data, ['licenseSource', 'license_source', 'source']) || undefined,
891
+ accessScope: readString(data, ['accessScope', 'access_scope', 'scope']) || undefined,
892
+ expiresAt: readString(data, ['expiresAt', 'expires_at']) || undefined,
893
+ lastVerifiedAt: readString(data, ['lastVerifiedAt', 'last_verified_at']) || undefined,
894
+ validationMessage: readString(data, ['validationMessage', 'validation_message']) || undefined,
895
+ };
896
+ }
897
+ function useFigmaLicenseBridge(options = {}) {
898
+ const messageTypes = React.useMemo(() => ({ ...DEFAULT_LICENSE_MESSAGE_TYPES, ...options.messageTypes }), [options.messageTypes]);
899
+ const [state, setState] = React.useState({
900
+ ...INITIAL_LICENSE_PAGE_STATE,
901
+ ...options.initialState,
902
+ });
903
+ const [isVerifying, setIsVerifying] = React.useState(false);
703
904
  const [isDeactivating, setIsDeactivating] = React.useState(false);
704
- const [licenseKey, setLicenseKey] = React.useState(initialLicenseKey);
705
- const [status, setStatus] = React.useState(initialStatus);
706
- const [usageCount, setLocalUsageCount] = React.useState(initialUsageCount);
707
- const [activationLimit, setActivationLimit] = React.useState(0);
708
- const [activationUsage, setActivationUsage] = React.useState(0);
709
- const [showDetails, setShowDetails] = React.useState(false);
905
+ const [isStartingAuth, setIsStartingAuth] = React.useState(false);
906
+ const optionsRef = React.useRef(options);
907
+ optionsRef.current = options;
908
+ const applyPatch = React.useCallback((patch) => {
909
+ setState((prev) => {
910
+ const next = {
911
+ ...prev,
912
+ ...Object.fromEntries(Object.entries(patch).filter(([, value]) => value !== undefined)),
913
+ };
914
+ optionsRef.current.onStateChange?.(next);
915
+ if (patch.paymentStatus) {
916
+ optionsRef.current.onPaymentStatusChange?.(patch.paymentStatus);
917
+ }
918
+ if (patch.usageCount !== undefined) {
919
+ optionsRef.current.onUsageCountChange?.(patch.usageCount);
920
+ }
921
+ return next;
922
+ });
923
+ }, []);
710
924
  React.useEffect(() => {
711
925
  const handleMessage = (event) => {
712
- const { type, paymentStatus, licenseKey, activationLimit, activationUsage, success, message, usageCount } = event.data.pluginMessage || {};
713
- if (type === 'update-plugin-status' || type === 'license-verification-result') {
714
- if (paymentStatus)
715
- setStatus(paymentStatus);
716
- if (licenseKey)
717
- setLicenseKey(licenseKey);
718
- if (activationLimit !== undefined)
719
- setActivationLimit(activationLimit);
720
- if (activationUsage !== undefined)
721
- setActivationUsage(activationUsage);
722
- if (paymentStatus)
723
- setPaymentStatus(paymentStatus);
724
- if (usageCount !== undefined) {
725
- setLocalUsageCount(usageCount);
726
- setUsageCount(usageCount);
727
- }
926
+ const data = event.data?.pluginMessage;
927
+ if (!data || typeof data !== 'object')
928
+ return;
929
+ const payload = data;
930
+ const type = typeof payload.type === 'string' ? payload.type : '';
931
+ if (type === messageTypes.updateStatus) {
932
+ applyPatch(parseLicenseMessage(payload));
728
933
  }
729
- if (type === 'license-verification-result') {
730
- setIsSubmitting(false);
731
- if (message)
732
- console.log('License verification:', message);
733
- if (success) {
734
- setStatus('PAID');
735
- setPaymentStatus('PAID');
934
+ if (type === messageTypes.verifyResult) {
935
+ setIsVerifying(false);
936
+ setIsStartingAuth(false);
937
+ applyPatch(parseLicenseMessage(payload));
938
+ if (payload.success === true) {
939
+ applyPatch({ paymentStatus: 'PAID', isLicenseRegistered: true });
736
940
  }
737
941
  }
738
- if (type === 'license-deactivation-result') {
942
+ if (type === messageTypes.deactivateResult) {
739
943
  setIsDeactivating(false);
740
- if (message)
741
- console.log('License deactivation:', message);
742
- if (success) {
743
- setStatus('UNPAID');
744
- setPaymentStatus('UNPAID');
745
- setLicenseKey('');
746
- setLocalUsageCount(20);
747
- setActivationLimit(0);
748
- setActivationUsage(0);
944
+ applyPatch(parseLicenseMessage(payload));
945
+ if (payload.success === true) {
946
+ applyPatch({
947
+ paymentStatus: 'UNPAID',
948
+ licenseKey: '',
949
+ hasLicenseKey: false,
950
+ isLicenseRegistered: false,
951
+ activationLimit: 0,
952
+ activationUsage: 0,
953
+ });
954
+ }
955
+ }
956
+ if (type === 'designbase-auth-result') {
957
+ setIsStartingAuth(false);
958
+ if (payload.success === true) {
959
+ applyPatch(parseLicenseMessage(payload));
960
+ }
961
+ else if (typeof payload.message === 'string') {
962
+ applyPatch({ lastMessage: payload.message });
749
963
  }
750
964
  }
751
965
  };
752
966
  window.addEventListener('message', handleMessage);
753
- if (typeof parent !== 'undefined') {
754
- parent.postMessage({ pluginMessage: { type: 'initialize' } }, '*');
755
- }
967
+ postPluginMessage({ type: messageTypes.initialize });
756
968
  return () => window.removeEventListener('message', handleMessage);
757
- }, [setPaymentStatus, setUsageCount]);
969
+ }, [applyPatch, messageTypes]);
970
+ const verifyLicense = React.useCallback((licenseKey) => {
971
+ setIsVerifying(true);
972
+ postPluginMessage({
973
+ type: messageTypes.verifyLicense,
974
+ licenseKey,
975
+ });
976
+ }, [messageTypes.verifyLicense]);
977
+ const deactivateLicense = React.useCallback(() => {
978
+ setIsDeactivating(true);
979
+ postPluginMessage({ type: messageTypes.deactivateLicense });
980
+ }, [messageTypes.deactivateLicense]);
981
+ const startDesignbaseAuth = React.useCallback(() => {
982
+ setIsStartingAuth(true);
983
+ postPluginMessage({ type: START_DESIGNBASE_AUTH_MESSAGE });
984
+ }, []);
985
+ return {
986
+ state,
987
+ isVerifying,
988
+ isDeactivating,
989
+ isStartingAuth,
990
+ verifyLicense,
991
+ deactivateLicense,
992
+ startDesignbaseAuth,
993
+ setLicenseKeyInput: (licenseKey) => applyPatch({ licenseKey }),
994
+ };
995
+ }
996
+
997
+ function formatUsageLabel(state, t) {
998
+ const { remainingUsage, usageUsed, usageLimit, usageReset } = state;
999
+ if (usageLimit === 'unlimited') {
1000
+ return resolveText(t, { key: 'license.usage_unlimited' }, '사용 횟수 제한 없음') ?? '사용 횟수 제한 없음';
1001
+ }
1002
+ const limit = typeof usageLimit === 'number' ? usageLimit : remainingUsage + usageUsed;
1003
+ const remaining = remainingUsage ?? Math.max(0, limit - usageUsed);
1004
+ if (usageReset === 'daily') {
1005
+ const fallback = `오늘 남은 횟수 ${remaining}/${limit}`;
1006
+ const translated = resolveText(t, { key: 'license.usage_daily' }, fallback) ?? fallback;
1007
+ return translated.includes(String(remaining)) ? translated : fallback;
1008
+ }
1009
+ if (usageReset === 'monthly') {
1010
+ const fallback = `이번 달 남은 횟수 ${remaining}/${limit}`;
1011
+ const translated = resolveText(t, { key: 'license.usage_monthly' }, fallback) ?? fallback;
1012
+ return translated.includes(String(remaining)) ? translated : fallback;
1013
+ }
1014
+ return `남은 횟수 ${remaining}/${limit}`;
1015
+ }
1016
+ const PageLicense = ({ status: initialStatus, onClose, licenseKey: initialLicenseKey = '', wordpressLinks, paymentPageUrl, mode = 'pricing', membershipUrl, enableAccountAuth = true, showLicenseKeyInput = true, pricingFeatures, pricing, paymentType = 'subscription', messageTypes, onStateChange, setPaymentStatus, setUsageCount, onLicenseSubmit, usageCount: initialUsageCount = 0, t, className, }) => {
1017
+ const links = React.useMemo(() => ({
1018
+ purchaseUrl: wordpressLinks?.purchaseUrl ?? paymentPageUrl,
1019
+ membershipUrl: membershipUrl ?? wordpressLinks?.membershipUrl,
1020
+ accountUrl: wordpressLinks?.accountUrl,
1021
+ helpUrl: wordpressLinks?.helpUrl,
1022
+ }), [wordpressLinks, paymentPageUrl, membershipUrl]);
1023
+ const { state, isVerifying, isDeactivating, isStartingAuth, verifyLicense, deactivateLicense, startDesignbaseAuth, setLicenseKeyInput, } = useFigmaLicenseBridge({
1024
+ messageTypes,
1025
+ initialState: {
1026
+ paymentStatus: initialStatus,
1027
+ licenseKey: initialLicenseKey,
1028
+ usageCount: initialUsageCount,
1029
+ },
1030
+ onStateChange,
1031
+ onPaymentStatusChange: setPaymentStatus,
1032
+ onUsageCountChange: setUsageCount,
1033
+ });
1034
+ const [showDetails, setShowDetails] = React.useState(false);
1035
+ const [licenseKeyDraft, setLicenseKeyDraft] = React.useState(initialLicenseKey);
1036
+ const isPaid = state.isLicenseRegistered && state.paymentStatus === 'PAID';
1037
+ const isMembershipMode = mode === 'youtube-membership';
1038
+ const usageLabel = formatUsageLabel(state, t);
758
1039
  const handleLicenseSubmit = async (submittedLicenseKey) => {
759
- setIsSubmitting(true);
760
- if (typeof parent !== 'undefined') {
761
- parent.postMessage({
762
- pluginMessage: {
763
- type: 'verify-license',
764
- licenseKey: submittedLicenseKey
765
- }
766
- }, '*');
1040
+ if (onLicenseSubmit) {
1041
+ await onLicenseSubmit(submittedLicenseKey);
1042
+ return;
767
1043
  }
1044
+ verifyLicense(submittedLicenseKey);
768
1045
  };
769
- const handleDeactivateLicense = () => {
770
- setIsDeactivating(true);
771
- if (typeof parent !== 'undefined') {
772
- parent.postMessage({
773
- pluginMessage: { type: 'deactivate-license' }
774
- }, '*');
775
- }
1046
+ const handleLicenseKeyChange = (value) => {
1047
+ setLicenseKeyDraft(value);
1048
+ setLicenseKeyInput(value);
776
1049
  };
777
- const isPaid = status === 'PAID';
778
1050
  return (React.createElement("div", { className: `designbase-figma-page-license ${className || ''}` },
779
1051
  React.createElement("div", { className: "designbase-figma-page-license__content" },
780
1052
  React.createElement("div", { className: "designbase-figma-page-license__header" },
781
1053
  React.createElement("div", { className: "designbase-figma-page-license__title" },
782
- React.createElement("h2", null, isPaid ? resolveText(t, { key: 'license.pro_account' }, '프로 계정') : resolveText(t, { key: 'license.upgrade_to_pro' }, '프로로 업그레이드'))),
1054
+ React.createElement("h2", null, isMembershipMode
1055
+ ? resolveText(t, { key: 'license.youtube_membership' }, 'YouTube 멤버십')
1056
+ : isPaid
1057
+ ? resolveText(t, { key: 'license.pro_account' }, '프로 계정')
1058
+ : resolveText(t, { key: 'license.upgrade_to_pro' }, '프로로 업그레이드')),
1059
+ state.planTier && state.planTier !== 'FREE' && (React.createElement("span", { className: "designbase-figma-page-license__tier" }, state.planTier))),
783
1060
  React.createElement("p", { className: "designbase-figma-page-license__description" }, isPaid
784
1061
  ? resolveText(t, { key: 'license.all_features_available' }, '모든 기능을 사용할 수 있습니다.')
785
- : resolveText(t, { key: 'license.purchase_for_unlimited' }, '라이선스 구매 후 무제한 접근이 가능합니다.'))),
786
- React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t: t }),
1062
+ : isMembershipMode
1063
+ ? resolveText(t, { key: 'license.youtube_membership_description' }, 'YouTube 멤버십에 가입하면 Designbase 플러그인을 무제한으로 사용할 수 있습니다.')
1064
+ : resolveText(t, { key: 'license.purchase_for_unlimited' }, '디자인베이스 멤버십 또는 라이선스로 무제한 이용이 가능합니다.')),
1065
+ !isPaid && (React.createElement("p", { className: "designbase-figma-page-license__usage" }, usageLabel))),
1066
+ !isMembershipMode && (React.createElement(PricingComparison, { features: pricingFeatures, pricing: pricing, paymentType: paymentType, t: t })),
1067
+ state.lastMessage && (React.createElement("p", { className: `designbase-figma-page-license__feedback ${state.lastErrorCode ? 'designbase-figma-page-license__feedback--error' : ''}` }, state.lastMessage)),
787
1068
  isPaid && (React.createElement("div", { className: "designbase-figma-page-license__section" },
788
1069
  React.createElement("div", { className: "designbase-figma-page-license__section-header" },
789
1070
  React.createElement("h3", null, resolveText(t, { key: 'license.activated' }, '라이선스 활성화됨')),
790
- React.createElement(ui.Button, { onClick: () => setShowDetails(!showDetails), variant: "tertiary", size: "s", iconOnly: true },
1071
+ React.createElement(react.Button, { onPress: () => setShowDetails(!showDetails), variant: "tertiary", size: "s", iconOnly: true },
791
1072
  React.createElement(icons.MoreHorizontalIcon, { size: 16 }))),
792
- React.createElement("div", { className: "designbase-figma-page-license__license-key" },
793
- resolveText(t, { key: 'license.key_label' }, '라이선스 키'),
794
- ": ",
795
- React.createElement("span", null, licenseKey)),
1073
+ React.createElement(LicenseStatusCard, { status: state.paymentStatus, licenseKey: state.licenseKey, licenseStatus: state.licenseStatus, licenseSource: state.licenseSource, accessScope: state.accessScope, expiresAt: state.expiresAt, lastVerifiedAt: state.lastVerifiedAt, validationMessage: state.validationMessage, t: t }),
1074
+ React.createElement("p", { className: "designbase-figma-page-license__usage" }, usageLabel),
796
1075
  showDetails && (React.createElement("div", { className: "designbase-figma-page-license__details" },
797
1076
  React.createElement("div", { className: "designbase-figma-page-license__activation-info" },
798
1077
  React.createElement("div", { className: "designbase-figma-page-license__remaining" },
799
- activationLimit - activationUsage,
800
- " ",
1078
+ Math.max(0, state.activationLimit - state.activationUsage),
1079
+ ' ',
801
1080
  resolveText(t, { key: 'license.activations_remaining' }, '활성'),
802
- " ",
1081
+ ' ',
803
1082
  resolveText(t, { key: 'license.spots_remaining' }, '자리 남음')),
804
- React.createElement("div", { className: "designbase-figma-page-license__usage" },
805
- activationUsage,
1083
+ React.createElement("div", { className: "designbase-figma-page-license__usage-count" },
1084
+ state.activationUsage,
806
1085
  "/",
807
- activationLimit)),
808
- React.createElement(ui.Button, { onClick: handleDeactivateLicense, variant: "tertiary", size: "s", disabled: isDeactivating }, isDeactivating
809
- ? resolveText(t, { key: 'license.deactivating' }, '비활성화중...')
1086
+ state.activationLimit)),
1087
+ React.createElement(react.Button, { onPress: deactivateLicense, variant: "tertiary", size: "s", disabled: isDeactivating }, isDeactivating
1088
+ ? resolveText(t, { key: 'license.deactivating' }, '비활성화 중...')
810
1089
  : resolveText(t, { key: 'license.deactivate' }, '라이선스 비활성화')))))),
811
- !isPaid && (React.createElement("div", { className: "designbase-figma-page-license__section" },
812
- React.createElement("div", { className: "designbase-figma-page-license__section-header" },
813
- React.createElement("h3", null, resolveText(t, { key: 'license.enter_key' }, '라이선스 키 입력')),
814
- paymentPageUrl && (React.createElement(ui.Button, { onClick: () => window.open(paymentPageUrl, '_blank'), variant: "primary", size: "s" },
815
- React.createElement("span", null, resolveText(t, { key: 'license.purchase' }, '라이선스 구매')),
816
- React.createElement(icons.ExternalLinkIcon, { size: 16 })))),
817
- React.createElement(FormWithSubmit, { onLicenseSubmit: handleLicenseSubmit, disabled: false, isSubmitting: isSubmitting, value: licenseKey, onValueChange: setLicenseKey, label: { key: 'license.key' }, submitText: { key: 'license.submit' }, submittingText: { key: 'license.verifying' }, helperText: { key: 'license.enter_from_email' }, t: t })))),
818
- React.createElement(ui.Button, { className: "designbase-figma-page-license__close", onPress: onClose, variant: "tertiary", size: "s", "aria-label": "Close" },
1090
+ !isPaid && (React.createElement(React.Fragment, null,
1091
+ isMembershipMode && (React.createElement(LicenseOffer, { membershipUrl: links.membershipUrl || links.purchaseUrl, t: t })),
1092
+ !isMembershipMode && (enableAccountAuth || links.purchaseUrl || links.accountUrl) && (React.createElement("div", { className: "designbase-figma-page-license__section" },
1093
+ React.createElement("div", { className: "designbase-figma-page-license__section-header" },
1094
+ React.createElement("h3", null, resolveText(t, { key: 'license.designbase_account' }, '디자인베이스 계정'))),
1095
+ React.createElement("p", { className: "designbase-figma-page-license__hint" }, resolveText(t, { key: 'license.designbase_account_hint' }, 'WordPress 계정으로 로그인하거나 멤버십을 구매하면 플러그인이 자동으로 활성화됩니다.')),
1096
+ React.createElement("div", { className: "designbase-figma-page-license__actions" },
1097
+ enableAccountAuth && (React.createElement(react.Button, { onPress: startDesignbaseAuth, variant: "primary", size: "m", disabled: isStartingAuth || isVerifying, fullWidth: true }, isStartingAuth
1098
+ ? resolveText(t, { key: 'license.authenticating' }, '인증 중...')
1099
+ : resolveText(t, { key: 'license.login_with_designbase' }, '디자인베이스로 로그인'))),
1100
+ links.purchaseUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(links.purchaseUrl), variant: "secondary", size: "m", fullWidth: true },
1101
+ React.createElement("span", null, resolveText(t, { key: 'license.purchase_membership' }, '멤버십 안내')),
1102
+ React.createElement(icons.ExternalLinkIcon, { size: 16 }))),
1103
+ links.accountUrl && (React.createElement(react.Button, { onPress: () => openExternalUrl(links.accountUrl), variant: "tertiary", size: "s", fullWidth: true },
1104
+ React.createElement("span", null, resolveText(t, { key: 'license.manage_account' }, '계정·멤버십 관리')),
1105
+ React.createElement(icons.ExternalLinkIcon, { size: 16 })))))),
1106
+ showLicenseKeyInput && (React.createElement("div", { className: "designbase-figma-page-license__section" },
1107
+ React.createElement("div", { className: "designbase-figma-page-license__section-header" },
1108
+ React.createElement("h3", null, resolveText(t, { key: 'license.enter_key' }, '라이선스 키 입력'))),
1109
+ React.createElement(FormWithSubmit, { onLicenseSubmit: handleLicenseSubmit, disabled: false, isSubmitting: isVerifying, value: licenseKeyDraft, onValueChange: handleLicenseKeyChange, label: { key: 'license.key' }, submitText: { key: 'license.submit' }, submittingText: { key: 'license.verifying' }, helperText: { key: 'license.enter_from_email' }, t: t }))))),
1110
+ links.helpUrl && (React.createElement("p", { className: "designbase-figma-page-license__disclaimer" },
1111
+ React.createElement("button", { type: "button", className: "designbase-figma-page-license__link", onClick: () => openExternalUrl(links.helpUrl) }, resolveText(t, { key: 'license.help_link' }, '라이선스·결제 도움말'))))),
1112
+ React.createElement(react.Button, { className: "designbase-figma-page-license__close", onPress: onClose, variant: "tertiary", size: "s", "aria-label": "Close" },
819
1113
  React.createElement(icons.CloseIcon, { size: 20 }))));
820
1114
  };
821
1115
  PageLicense.displayName = 'PageLicense';
@@ -839,7 +1133,7 @@ const PaymentStatusSection = ({ status, usageCount, activationLimit, activationU
839
1133
  activationUsage,
840
1134
  "/",
841
1135
  activationLimit)),
842
- React.createElement(ui.Button, { onClick: onDeactivate, variant: "tertiary", size: "s", disabled: isDeactivating }, isDeactivating
1136
+ React.createElement(react.Button, { onPress: onDeactivate, variant: "tertiary", size: "s", disabled: isDeactivating }, isDeactivating
843
1137
  ? resolveText(t, { key: 'payment.deactivating' }, '비활성화중...')
844
1138
  : resolveText(t, { key: 'payment.deactivate_license' }, '라이선스 비활성화'))))));
845
1139
  };
@@ -880,16 +1174,16 @@ const ProgressModal = ({ isOpen, onClose, progress, title = { key: 'progress.wor
880
1174
  const displayStopText = resolveText(t, stopButtonText, '중지');
881
1175
  const displayConfirmText = resolveText(t, confirmButtonText, '확인');
882
1176
  const displayHelpText = resolveText(t, helpText);
883
- return (React.createElement(ui.Modal, { isOpen: isOpen, onClose: isCompleted ? onClose : undefined, title: displayTitle, size: "s", className: modalClasses, showCloseButton: false },
1177
+ return (React.createElement(react.Modal, { isOpen: isOpen, onClose: isCompleted ? onClose : undefined, title: displayTitle, size: "s", className: modalClasses, showCloseButton: false },
884
1178
  React.createElement("div", { className: "designbase-figma-progress-modal__content" },
885
1179
  React.createElement("div", { className: "designbase-figma-progress-modal__icon", "aria-hidden": "true" }, isCompleted ? (completeIcon || (React.createElement("div", { className: "designbase-figma-progress-modal__icon-success" },
886
1180
  React.createElement(icons.CircleCheckFilledIcon, null)))) : (loadingIcon || (React.createElement("div", { className: "designbase-figma-progress-modal__icon-loading" },
887
- React.createElement(ui.Spinner, { size: "m" }))))),
1181
+ React.createElement(react.Spinner, { size: "m" }))))),
888
1182
  React.createElement("p", { className: "designbase-figma-progress-modal__message" }, displayMessage),
889
1183
  React.createElement("div", { className: "designbase-figma-progress-modal__status" }, `${processedNodes} / ${totalNodes} (${progressPercentage.toFixed(1)}%)`),
890
- React.createElement(ui.Progressbar, { value: progressPercentage, size: "m", variant: isCompleted ? 'success' : 'primary', style: "animated", fullWidth: true }),
1184
+ React.createElement(react.Progressbar, { value: progressPercentage, size: "m", variant: isCompleted ? 'success' : 'primary', style: "animated", fullWidth: true }),
891
1185
  displayHelpText && !isCompleted && (React.createElement("p", { className: "designbase-figma-progress-modal__help-text" }, displayHelpText)),
892
- React.createElement("div", { className: "designbase-figma-progress-modal__actions" }, isCompleted ? (React.createElement(ui.Button, { onPress: handleConfirm, variant: "primary", size: "m", fullWidth: true }, displayConfirmText)) : (React.createElement(ui.Button, { onPress: handleStop, variant: "secondary", size: "m", fullWidth: true }, displayStopText))))));
1186
+ React.createElement("div", { className: "designbase-figma-progress-modal__actions" }, isCompleted ? (React.createElement(react.Button, { onPress: handleConfirm, variant: "primary", size: "m", fullWidth: true }, displayConfirmText)) : (React.createElement(react.Button, { onPress: handleStop, variant: "secondary", size: "m", fullWidth: true }, displayStopText))))));
893
1187
  };
894
1188
  ProgressModal.displayName = 'ProgressModal';
895
1189
 
@@ -1028,7 +1322,7 @@ const SettingsModal = ({ isOpen, onClose, categories: initialCategories, categor
1028
1322
  const modalClasses = clsx('designbase-figma-settings-modal', className);
1029
1323
  const displayTitle = resolveText(t, title, '목록 변경');
1030
1324
  const displayDescription = resolveText(t, description, '드래그하여 순서를 변경하거나, 토글하여 카테고리를 숨길 수 있습니다.');
1031
- return (React.createElement(ui.Modal, { isOpen: isOpen, onClose: onClose, title: displayTitle, size: "m", className: modalClasses },
1325
+ return (React.createElement(react.Modal, { isOpen: isOpen, onClose: onClose, title: displayTitle, size: "m", className: modalClasses },
1032
1326
  React.createElement("div", { className: "designbase-figma-settings-modal__content" },
1033
1327
  displayDescription && (React.createElement("p", { className: "designbase-figma-settings-modal__description" }, displayDescription)),
1034
1328
  React.createElement("ul", { className: "designbase-figma-settings-modal__list" }, tempCategories.map((category, index) => (React.createElement("li", { key: category.id, draggable: true, onDragStart: (e) => handleDragStart(e, index), onDragOver: handleDragOver, onDrop: (e) => handleDrop(e, index), onDragEnd: handleDragEnd, className: clsx('designbase-figma-settings-modal__item', {
@@ -1040,12 +1334,12 @@ const SettingsModal = ({ isOpen, onClose, categories: initialCategories, categor
1040
1334
  React.createElement(icons.GripVerticalIcon, { size: 16 })),
1041
1335
  category.icon && (React.createElement("span", { className: "designbase-figma-settings-modal__category-icon" }, category.icon)),
1042
1336
  React.createElement("span", { className: "designbase-figma-settings-modal__category-title" }, resolveText(t, category.title))),
1043
- React.createElement(ui.Toggle, { checked: category.enabled, onChange: () => handleToggle(category.id), size: "s" })))))),
1337
+ React.createElement(react.Toggle, { checked: category.enabled, onChange: () => handleToggle(category.id), size: "s" })))))),
1044
1338
  React.createElement("div", { className: "designbase-figma-settings-modal__footer" },
1045
- onReset && (React.createElement(ui.Button, { onPress: handleReset, variant: "tertiary", size: "s" }, resolveText(t, { key: 'settings.reset' }, '초기화'))),
1339
+ onReset && (React.createElement(react.Button, { onPress: handleReset, variant: "tertiary", size: "s" }, resolveText(t, { key: 'settings.reset' }, '초기화'))),
1046
1340
  React.createElement("div", { className: "designbase-figma-settings-modal__footer-right" },
1047
- React.createElement(ui.Button, { onPress: handleCancel, variant: "tertiary", size: "s" }, resolveText(t, { key: 'settings.cancel' }, '취소')),
1048
- React.createElement(ui.Button, { onPress: handleSave, variant: "primary", size: "s" }, resolveText(t, { key: 'settings.save' }, '저장'))))));
1341
+ React.createElement(react.Button, { onPress: handleCancel, variant: "tertiary", size: "s" }, resolveText(t, { key: 'settings.cancel' }, '취소')),
1342
+ React.createElement(react.Button, { onPress: handleSave, variant: "primary", size: "s" }, resolveText(t, { key: 'settings.save' }, '저장'))))));
1049
1343
  };
1050
1344
  SettingsModal.displayName = 'SettingsModal';
1051
1345
 
@@ -1088,12 +1382,545 @@ const UpgradeBanner = ({ onClick, variant = 'button', isLoading = false, title =
1088
1382
  React.createElement("div", { className: "designbase-figma-upgrade-banner__text-wrap" },
1089
1383
  React.createElement("h3", { className: "designbase-figma-upgrade-banner__title" }, displayTitle),
1090
1384
  React.createElement("p", { className: "designbase-figma-upgrade-banner__text" }, displayDescription)),
1091
- variant === 'button' ? (React.createElement(ui.Button, { onClick: onClick, variant: "primary", size: "m", disabled: isLoading }, displayButtonText)) : (React.createElement("div", { className: "designbase-figma-upgrade-banner__icon" },
1385
+ variant === 'button' ? (React.createElement(react.Button, { onPress: onClick, variant: "primary", size: "m", disabled: isLoading }, displayButtonText)) : (React.createElement("div", { className: "designbase-figma-upgrade-banner__icon" },
1092
1386
  React.createElement(icons.ChevronRightIcon, { size: 20 })))));
1093
- return (React.createElement("div", { className: `designbase-figma-upgrade-banner designbase-figma-upgrade-banner--${variant} ${className || ''}` }, useGradient ? (React.createElement(ui.RandomGradient, { scheme: gradientScheme, tone: gradientTone, animated: gradientAnimated, height: "100%", width: "100%", className: "designbase-figma-upgrade-banner__gradient-bg" }, bannerContent)) : (bannerContent)));
1387
+ return (React.createElement("div", { className: `designbase-figma-upgrade-banner designbase-figma-upgrade-banner--${variant} ${className || ''}` }, useGradient ? (React.createElement(react.RandomGradient, { scheme: gradientScheme, tone: gradientTone, animated: gradientAnimated, height: "100%", width: "100%", className: "designbase-figma-upgrade-banner__gradient-bg" }, bannerContent)) : (bannerContent)));
1094
1388
  };
1095
1389
  UpgradeBanner.displayName = 'UpgradeBanner';
1096
1390
 
1391
+ Object.defineProperty(exports, 'Accordion', {
1392
+ enumerable: true,
1393
+ get: function () { return react.Accordion; }
1394
+ });
1395
+ Object.defineProperty(exports, 'ActivityHeatmap', {
1396
+ enumerable: true,
1397
+ get: function () { return react.ActivityHeatmap; }
1398
+ });
1399
+ Object.defineProperty(exports, 'AdBanner', {
1400
+ enumerable: true,
1401
+ get: function () { return react.AdBanner; }
1402
+ });
1403
+ Object.defineProperty(exports, 'AiChat', {
1404
+ enumerable: true,
1405
+ get: function () { return react.AiChat; }
1406
+ });
1407
+ Object.defineProperty(exports, 'AiChatList', {
1408
+ enumerable: true,
1409
+ get: function () { return react.AiChatList; }
1410
+ });
1411
+ Object.defineProperty(exports, 'Alert', {
1412
+ enumerable: true,
1413
+ get: function () { return react.Alert; }
1414
+ });
1415
+ Object.defineProperty(exports, 'AnimationBackground', {
1416
+ enumerable: true,
1417
+ get: function () { return react.AnimationBackground; }
1418
+ });
1419
+ Object.defineProperty(exports, 'AnimationText', {
1420
+ enumerable: true,
1421
+ get: function () { return react.AnimationText; }
1422
+ });
1423
+ Object.defineProperty(exports, 'AppBadge', {
1424
+ enumerable: true,
1425
+ get: function () { return react.AppBadge; }
1426
+ });
1427
+ Object.defineProperty(exports, 'AudioPlayer', {
1428
+ enumerable: true,
1429
+ get: function () { return react.AudioPlayer; }
1430
+ });
1431
+ Object.defineProperty(exports, 'Avatar', {
1432
+ enumerable: true,
1433
+ get: function () { return react.Avatar; }
1434
+ });
1435
+ Object.defineProperty(exports, 'Backdrop', {
1436
+ enumerable: true,
1437
+ get: function () { return react.Backdrop; }
1438
+ });
1439
+ Object.defineProperty(exports, 'Badge', {
1440
+ enumerable: true,
1441
+ get: function () { return react.Badge; }
1442
+ });
1443
+ Object.defineProperty(exports, 'Banner', {
1444
+ enumerable: true,
1445
+ get: function () { return react.Banner; }
1446
+ });
1447
+ Object.defineProperty(exports, 'BottomNavigation', {
1448
+ enumerable: true,
1449
+ get: function () { return react.BottomNavigation; }
1450
+ });
1451
+ Object.defineProperty(exports, 'BottomSheet', {
1452
+ enumerable: true,
1453
+ get: function () { return react.BottomSheet; }
1454
+ });
1455
+ Object.defineProperty(exports, 'Breadcrumbs', {
1456
+ enumerable: true,
1457
+ get: function () { return react.Breadcrumbs; }
1458
+ });
1459
+ Object.defineProperty(exports, 'Button', {
1460
+ enumerable: true,
1461
+ get: function () { return react.Button; }
1462
+ });
1463
+ Object.defineProperty(exports, 'Calendar', {
1464
+ enumerable: true,
1465
+ get: function () { return react.Calendar; }
1466
+ });
1467
+ Object.defineProperty(exports, 'Card', {
1468
+ enumerable: true,
1469
+ get: function () { return react.Card; }
1470
+ });
1471
+ Object.defineProperty(exports, 'Carousel', {
1472
+ enumerable: true,
1473
+ get: function () { return react.Carousel; }
1474
+ });
1475
+ Object.defineProperty(exports, 'ChatComposer', {
1476
+ enumerable: true,
1477
+ get: function () { return react.ChatComposer; }
1478
+ });
1479
+ Object.defineProperty(exports, 'ChatList', {
1480
+ enumerable: true,
1481
+ get: function () { return react.ChatList; }
1482
+ });
1483
+ Object.defineProperty(exports, 'ChatMessage', {
1484
+ enumerable: true,
1485
+ get: function () { return react.ChatMessage; }
1486
+ });
1487
+ Object.defineProperty(exports, 'ChatOrb', {
1488
+ enumerable: true,
1489
+ get: function () { return react.ChatOrb; }
1490
+ });
1491
+ Object.defineProperty(exports, 'ChatRoom', {
1492
+ enumerable: true,
1493
+ get: function () { return react.ChatRoom; }
1494
+ });
1495
+ Object.defineProperty(exports, 'ChatSuggestions', {
1496
+ enumerable: true,
1497
+ get: function () { return react.ChatSuggestions; }
1498
+ });
1499
+ Object.defineProperty(exports, 'ChatTyping', {
1500
+ enumerable: true,
1501
+ get: function () { return react.ChatTyping; }
1502
+ });
1503
+ Object.defineProperty(exports, 'ChatWelcome', {
1504
+ enumerable: true,
1505
+ get: function () { return react.ChatWelcome; }
1506
+ });
1507
+ Object.defineProperty(exports, 'ChatWidget', {
1508
+ enumerable: true,
1509
+ get: function () { return react.ChatWidget; }
1510
+ });
1511
+ Object.defineProperty(exports, 'Checkbox', {
1512
+ enumerable: true,
1513
+ get: function () { return react.Checkbox; }
1514
+ });
1515
+ Object.defineProperty(exports, 'Chip', {
1516
+ enumerable: true,
1517
+ get: function () { return react.Chip; }
1518
+ });
1519
+ Object.defineProperty(exports, 'CodeBlock', {
1520
+ enumerable: true,
1521
+ get: function () { return react.CodeBlock; }
1522
+ });
1523
+ Object.defineProperty(exports, 'ColorPicker', {
1524
+ enumerable: true,
1525
+ get: function () { return react.ColorPicker; }
1526
+ });
1527
+ Object.defineProperty(exports, 'ColorSwatch', {
1528
+ enumerable: true,
1529
+ get: function () { return react.ColorSwatch; }
1530
+ });
1531
+ Object.defineProperty(exports, 'Confirm', {
1532
+ enumerable: true,
1533
+ get: function () { return react.Confirm; }
1534
+ });
1535
+ Object.defineProperty(exports, 'Container', {
1536
+ enumerable: true,
1537
+ get: function () { return react.Container; }
1538
+ });
1539
+ Object.defineProperty(exports, 'ContextMenu', {
1540
+ enumerable: true,
1541
+ get: function () { return react.ContextMenu; }
1542
+ });
1543
+ Object.defineProperty(exports, 'CookieBanner', {
1544
+ enumerable: true,
1545
+ get: function () { return react.CookieBanner; }
1546
+ });
1547
+ Object.defineProperty(exports, 'Countdown', {
1548
+ enumerable: true,
1549
+ get: function () { return react.Countdown; }
1550
+ });
1551
+ Object.defineProperty(exports, 'CursorFollower', {
1552
+ enumerable: true,
1553
+ get: function () { return react.CursorFollower; }
1554
+ });
1555
+ Object.defineProperty(exports, 'DatePicker', {
1556
+ enumerable: true,
1557
+ get: function () { return react.DatePicker; }
1558
+ });
1559
+ Object.defineProperty(exports, 'Divider', {
1560
+ enumerable: true,
1561
+ get: function () { return react.Divider; }
1562
+ });
1563
+ Object.defineProperty(exports, 'DownloadProgress', {
1564
+ enumerable: true,
1565
+ get: function () { return react.DownloadProgress; }
1566
+ });
1567
+ Object.defineProperty(exports, 'Drawer', {
1568
+ enumerable: true,
1569
+ get: function () { return react.Drawer; }
1570
+ });
1571
+ Object.defineProperty(exports, 'Dropdown', {
1572
+ enumerable: true,
1573
+ get: function () { return react.Dropdown; }
1574
+ });
1575
+ Object.defineProperty(exports, 'Dropzone', {
1576
+ enumerable: true,
1577
+ get: function () { return react.Dropzone; }
1578
+ });
1579
+ Object.defineProperty(exports, 'EmailVerify', {
1580
+ enumerable: true,
1581
+ get: function () { return react.EmailVerify; }
1582
+ });
1583
+ Object.defineProperty(exports, 'EmptyState', {
1584
+ enumerable: true,
1585
+ get: function () { return react.EmptyState; }
1586
+ });
1587
+ Object.defineProperty(exports, 'FileUploader', {
1588
+ enumerable: true,
1589
+ get: function () { return react.FileUploader; }
1590
+ });
1591
+ Object.defineProperty(exports, 'FloatingActionButton', {
1592
+ enumerable: true,
1593
+ get: function () { return react.FloatingActionButton; }
1594
+ });
1595
+ Object.defineProperty(exports, 'Footer', {
1596
+ enumerable: true,
1597
+ get: function () { return react.Footer; }
1598
+ });
1599
+ Object.defineProperty(exports, 'Form', {
1600
+ enumerable: true,
1601
+ get: function () { return react.Form; }
1602
+ });
1603
+ Object.defineProperty(exports, 'Gantt', {
1604
+ enumerable: true,
1605
+ get: function () { return react.Gantt; }
1606
+ });
1607
+ Object.defineProperty(exports, 'Gradient', {
1608
+ enumerable: true,
1609
+ get: function () { return react.Gradient; }
1610
+ });
1611
+ Object.defineProperty(exports, 'Grid', {
1612
+ enumerable: true,
1613
+ get: function () { return react.Grid; }
1614
+ });
1615
+ Object.defineProperty(exports, 'GridBackground', {
1616
+ enumerable: true,
1617
+ get: function () { return react.GridBackground; }
1618
+ });
1619
+ Object.defineProperty(exports, 'GridItem', {
1620
+ enumerable: true,
1621
+ get: function () { return react.GridItem; }
1622
+ });
1623
+ Object.defineProperty(exports, 'Image', {
1624
+ enumerable: true,
1625
+ get: function () { return react.Image; }
1626
+ });
1627
+ Object.defineProperty(exports, 'ImageList', {
1628
+ enumerable: true,
1629
+ get: function () { return react.ImageList; }
1630
+ });
1631
+ Object.defineProperty(exports, 'ImagePlaceholder', {
1632
+ enumerable: true,
1633
+ get: function () { return react.ImagePlaceholder; }
1634
+ });
1635
+ Object.defineProperty(exports, 'Indicator', {
1636
+ enumerable: true,
1637
+ get: function () { return react.Indicator; }
1638
+ });
1639
+ Object.defineProperty(exports, 'Input', {
1640
+ enumerable: true,
1641
+ get: function () { return react.Input; }
1642
+ });
1643
+ Object.defineProperty(exports, 'Kanban', {
1644
+ enumerable: true,
1645
+ get: function () { return react.Kanban; }
1646
+ });
1647
+ Object.defineProperty(exports, 'Label', {
1648
+ enumerable: true,
1649
+ get: function () { return react.Label; }
1650
+ });
1651
+ Object.defineProperty(exports, 'Lightbox', {
1652
+ enumerable: true,
1653
+ get: function () { return react.Lightbox; }
1654
+ });
1655
+ Object.defineProperty(exports, 'List', {
1656
+ enumerable: true,
1657
+ get: function () { return react.List; }
1658
+ });
1659
+ Object.defineProperty(exports, 'Logo', {
1660
+ enumerable: true,
1661
+ get: function () { return react.Logo; }
1662
+ });
1663
+ Object.defineProperty(exports, 'MarkdownEditor', {
1664
+ enumerable: true,
1665
+ get: function () { return react.MarkdownEditor; }
1666
+ });
1667
+ Object.defineProperty(exports, 'Marquee', {
1668
+ enumerable: true,
1669
+ get: function () { return react.Marquee; }
1670
+ });
1671
+ Object.defineProperty(exports, 'Masonry', {
1672
+ enumerable: true,
1673
+ get: function () { return react.Masonry; }
1674
+ });
1675
+ Object.defineProperty(exports, 'MenuItem', {
1676
+ enumerable: true,
1677
+ get: function () { return react.MenuItem; }
1678
+ });
1679
+ Object.defineProperty(exports, 'Modal', {
1680
+ enumerable: true,
1681
+ get: function () { return react.Modal; }
1682
+ });
1683
+ Object.defineProperty(exports, 'ModalBody', {
1684
+ enumerable: true,
1685
+ get: function () { return react.ModalBody; }
1686
+ });
1687
+ Object.defineProperty(exports, 'ModalFooter', {
1688
+ enumerable: true,
1689
+ get: function () { return react.ModalFooter; }
1690
+ });
1691
+ Object.defineProperty(exports, 'ModalHeader', {
1692
+ enumerable: true,
1693
+ get: function () { return react.ModalHeader; }
1694
+ });
1695
+ Object.defineProperty(exports, 'Navbar', {
1696
+ enumerable: true,
1697
+ get: function () { return react.Navbar; }
1698
+ });
1699
+ Object.defineProperty(exports, 'OnboardingModal', {
1700
+ enumerable: true,
1701
+ get: function () { return react.OnboardingModal; }
1702
+ });
1703
+ Object.defineProperty(exports, 'OtpInput', {
1704
+ enumerable: true,
1705
+ get: function () { return react.OtpInput; }
1706
+ });
1707
+ Object.defineProperty(exports, 'PageHeader', {
1708
+ enumerable: true,
1709
+ get: function () { return react.PageHeader; }
1710
+ });
1711
+ Object.defineProperty(exports, 'Pagination', {
1712
+ enumerable: true,
1713
+ get: function () { return react.Pagination; }
1714
+ });
1715
+ Object.defineProperty(exports, 'PhoneVerify', {
1716
+ enumerable: true,
1717
+ get: function () { return react.PhoneVerify; }
1718
+ });
1719
+ Object.defineProperty(exports, 'Popover', {
1720
+ enumerable: true,
1721
+ get: function () { return react.Popover; }
1722
+ });
1723
+ Object.defineProperty(exports, 'Progress', {
1724
+ enumerable: true,
1725
+ get: function () { return react.Progress; }
1726
+ });
1727
+ Object.defineProperty(exports, 'ProgressStep', {
1728
+ enumerable: true,
1729
+ get: function () { return react.ProgressStep; }
1730
+ });
1731
+ Object.defineProperty(exports, 'Progressbar', {
1732
+ enumerable: true,
1733
+ get: function () { return react.Progressbar; }
1734
+ });
1735
+ Object.defineProperty(exports, 'Radio', {
1736
+ enumerable: true,
1737
+ get: function () { return react.Radio; }
1738
+ });
1739
+ Object.defineProperty(exports, 'RandomGradient', {
1740
+ enumerable: true,
1741
+ get: function () { return react.RandomGradient; }
1742
+ });
1743
+ Object.defineProperty(exports, 'RangeSlider', {
1744
+ enumerable: true,
1745
+ get: function () { return react.RangeSlider; }
1746
+ });
1747
+ Object.defineProperty(exports, 'Rating', {
1748
+ enumerable: true,
1749
+ get: function () { return react.Rating; }
1750
+ });
1751
+ Object.defineProperty(exports, 'Reorder', {
1752
+ enumerable: true,
1753
+ get: function () { return react.Reorder; }
1754
+ });
1755
+ Object.defineProperty(exports, 'ResizablePanels', {
1756
+ enumerable: true,
1757
+ get: function () { return react.ResizablePanels; }
1758
+ });
1759
+ Object.defineProperty(exports, 'ScrollArea', {
1760
+ enumerable: true,
1761
+ get: function () { return react.ScrollArea; }
1762
+ });
1763
+ Object.defineProperty(exports, 'SearchBar', {
1764
+ enumerable: true,
1765
+ get: function () { return react.SearchBar; }
1766
+ });
1767
+ Object.defineProperty(exports, 'Section', {
1768
+ enumerable: true,
1769
+ get: function () { return react.Section; }
1770
+ });
1771
+ Object.defineProperty(exports, 'SectionAppDownload', {
1772
+ enumerable: true,
1773
+ get: function () { return react.SectionAppDownload; }
1774
+ });
1775
+ Object.defineProperty(exports, 'SectionContact', {
1776
+ enumerable: true,
1777
+ get: function () { return react.SectionContact; }
1778
+ });
1779
+ Object.defineProperty(exports, 'SectionCta', {
1780
+ enumerable: true,
1781
+ get: function () { return react.SectionCta; }
1782
+ });
1783
+ Object.defineProperty(exports, 'SectionFaq', {
1784
+ enumerable: true,
1785
+ get: function () { return react.SectionFaq; }
1786
+ });
1787
+ Object.defineProperty(exports, 'SectionFeature', {
1788
+ enumerable: true,
1789
+ get: function () { return react.SectionFeature; }
1790
+ });
1791
+ Object.defineProperty(exports, 'SectionFeatureGrid', {
1792
+ enumerable: true,
1793
+ get: function () { return react.SectionFeatureGrid; }
1794
+ });
1795
+ Object.defineProperty(exports, 'SectionHero', {
1796
+ enumerable: true,
1797
+ get: function () { return react.SectionHero; }
1798
+ });
1799
+ Object.defineProperty(exports, 'SectionLogoCloud', {
1800
+ enumerable: true,
1801
+ get: function () { return react.SectionLogoCloud; }
1802
+ });
1803
+ Object.defineProperty(exports, 'SectionPricing', {
1804
+ enumerable: true,
1805
+ get: function () { return react.SectionPricing; }
1806
+ });
1807
+ Object.defineProperty(exports, 'SectionStats', {
1808
+ enumerable: true,
1809
+ get: function () { return react.SectionStats; }
1810
+ });
1811
+ Object.defineProperty(exports, 'SectionTestimonials', {
1812
+ enumerable: true,
1813
+ get: function () { return react.SectionTestimonials; }
1814
+ });
1815
+ Object.defineProperty(exports, 'SegmentControl', {
1816
+ enumerable: true,
1817
+ get: function () { return react.SegmentControl; }
1818
+ });
1819
+ Object.defineProperty(exports, 'Select', {
1820
+ enumerable: true,
1821
+ get: function () { return react.Select; }
1822
+ });
1823
+ Object.defineProperty(exports, 'Share', {
1824
+ enumerable: true,
1825
+ get: function () { return react.Share; }
1826
+ });
1827
+ Object.defineProperty(exports, 'Sidebar', {
1828
+ enumerable: true,
1829
+ get: function () { return react.Sidebar; }
1830
+ });
1831
+ Object.defineProperty(exports, 'Signature', {
1832
+ enumerable: true,
1833
+ get: function () { return react.Signature; }
1834
+ });
1835
+ Object.defineProperty(exports, 'Skeleton', {
1836
+ enumerable: true,
1837
+ get: function () { return react.Skeleton; }
1838
+ });
1839
+ Object.defineProperty(exports, 'Spinner', {
1840
+ enumerable: true,
1841
+ get: function () { return react.Spinner; }
1842
+ });
1843
+ Object.defineProperty(exports, 'SplitView', {
1844
+ enumerable: true,
1845
+ get: function () { return react.SplitView; }
1846
+ });
1847
+ Object.defineProperty(exports, 'Stack', {
1848
+ enumerable: true,
1849
+ get: function () { return react.Stack; }
1850
+ });
1851
+ Object.defineProperty(exports, 'Stat', {
1852
+ enumerable: true,
1853
+ get: function () { return react.Stat; }
1854
+ });
1855
+ Object.defineProperty(exports, 'Stepper', {
1856
+ enumerable: true,
1857
+ get: function () { return react.Stepper; }
1858
+ });
1859
+ Object.defineProperty(exports, 'Table', {
1860
+ enumerable: true,
1861
+ get: function () { return react.Table; }
1862
+ });
1863
+ Object.defineProperty(exports, 'Tabs', {
1864
+ enumerable: true,
1865
+ get: function () { return react.Tabs; }
1866
+ });
1867
+ Object.defineProperty(exports, 'Testimonial', {
1868
+ enumerable: true,
1869
+ get: function () { return react.Testimonial; }
1870
+ });
1871
+ Object.defineProperty(exports, 'Textarea', {
1872
+ enumerable: true,
1873
+ get: function () { return react.Textarea; }
1874
+ });
1875
+ Object.defineProperty(exports, 'TimePicker', {
1876
+ enumerable: true,
1877
+ get: function () { return react.TimePicker; }
1878
+ });
1879
+ Object.defineProperty(exports, 'Timeline', {
1880
+ enumerable: true,
1881
+ get: function () { return react.Timeline; }
1882
+ });
1883
+ Object.defineProperty(exports, 'Toast', {
1884
+ enumerable: true,
1885
+ get: function () { return react.Toast; }
1886
+ });
1887
+ Object.defineProperty(exports, 'Toggle', {
1888
+ enumerable: true,
1889
+ get: function () { return react.Toggle; }
1890
+ });
1891
+ Object.defineProperty(exports, 'Toolbar', {
1892
+ enumerable: true,
1893
+ get: function () { return react.Toolbar; }
1894
+ });
1895
+ Object.defineProperty(exports, 'Tooltip', {
1896
+ enumerable: true,
1897
+ get: function () { return react.Tooltip; }
1898
+ });
1899
+ Object.defineProperty(exports, 'TopBanner', {
1900
+ enumerable: true,
1901
+ get: function () { return react.TopBanner; }
1902
+ });
1903
+ Object.defineProperty(exports, 'Tutorial', {
1904
+ enumerable: true,
1905
+ get: function () { return react.Tutorial; }
1906
+ });
1907
+ Object.defineProperty(exports, 'TwoFactor', {
1908
+ enumerable: true,
1909
+ get: function () { return react.TwoFactor; }
1910
+ });
1911
+ Object.defineProperty(exports, 'VideoPlayer', {
1912
+ enumerable: true,
1913
+ get: function () { return react.VideoPlayer; }
1914
+ });
1915
+ Object.defineProperty(exports, 'YouTubePlayer', {
1916
+ enumerable: true,
1917
+ get: function () { return react.YouTubePlayer; }
1918
+ });
1919
+ Object.defineProperty(exports, 'useContextMenu', {
1920
+ enumerable: true,
1921
+ get: function () { return react.useContextMenu; }
1922
+ });
1923
+ exports.DEFAULT_LICENSE_MESSAGE_TYPES = DEFAULT_LICENSE_MESSAGE_TYPES;
1097
1924
  exports.DonationBadge = DonationBadge;
1098
1925
  exports.FigmaContainer = FigmaContainer;
1099
1926
  exports.FigmaFooter = FigmaFooter;
@@ -1106,6 +1933,8 @@ exports.FigmaToastProvider = FigmaToastProvider;
1106
1933
  exports.FormWithSubmit = FormWithSubmit;
1107
1934
  exports.InteractionFeedback = InteractionFeedback;
1108
1935
  exports.LanguageSelector = LanguageSelector;
1936
+ exports.LicenseOffer = LicenseOffer;
1937
+ exports.LicenseStatusCard = LicenseStatusCard;
1109
1938
  exports.LogoDropdown = LogoDropdown;
1110
1939
  exports.PageLicense = PageLicense;
1111
1940
  exports.PaymentBadge = PaymentBadge;
@@ -1113,18 +1942,20 @@ exports.PaymentStatusSection = PaymentStatusSection;
1113
1942
  exports.PricingComparison = PricingComparison;
1114
1943
  exports.ProgressModal = ProgressModal;
1115
1944
  exports.ResizablePlugin = ResizablePlugin;
1945
+ exports.START_DESIGNBASE_AUTH_MESSAGE = START_DESIGNBASE_AUTH_MESSAGE;
1116
1946
  exports.SettingsModal = SettingsModal;
1117
1947
  exports.TitleDescription = TitleDescription;
1118
1948
  exports.UpgradeBanner = UpgradeBanner;
1119
1949
  exports.getActiveSection = getActiveSection;
1120
1950
  exports.resolveText = resolveText;
1121
1951
  exports.scrollToSection = scrollToSection;
1952
+ exports.useFigmaLicenseBridge = useFigmaLicenseBridge;
1122
1953
  exports.useFigmaToast = useFigmaToast;
1123
1954
  exports.useToast = useToast;
1124
- Object.keys(ui).forEach(function (k) {
1955
+ Object.keys(react).forEach(function (k) {
1125
1956
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
1126
1957
  enumerable: true,
1127
- get: function () { return ui[k]; }
1958
+ get: function () { return react[k]; }
1128
1959
  });
1129
1960
  });
1130
1961
  //# sourceMappingURL=index.js.map