@hua-labs/hua-ux 0.1.0-alpha.0.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.
Files changed (210) hide show
  1. package/README.md +839 -0
  2. package/dist/framework/a11y/components/LiveRegion.d.ts +64 -0
  3. package/dist/framework/a11y/components/LiveRegion.d.ts.map +1 -0
  4. package/dist/framework/a11y/components/LiveRegion.js +43 -0
  5. package/dist/framework/a11y/components/SkipToContent.d.ts +62 -0
  6. package/dist/framework/a11y/components/SkipToContent.d.ts.map +1 -0
  7. package/dist/framework/a11y/components/SkipToContent.js +60 -0
  8. package/dist/framework/a11y/hooks/useFocusManagement.d.ts +60 -0
  9. package/dist/framework/a11y/hooks/useFocusManagement.d.ts.map +1 -0
  10. package/dist/framework/a11y/hooks/useFocusManagement.js +71 -0
  11. package/dist/framework/a11y/hooks/useFocusTrap.d.ts +64 -0
  12. package/dist/framework/a11y/hooks/useFocusTrap.d.ts.map +1 -0
  13. package/dist/framework/a11y/hooks/useFocusTrap.js +185 -0
  14. package/dist/framework/a11y/hooks/useLiveRegion.d.ts +56 -0
  15. package/dist/framework/a11y/hooks/useLiveRegion.d.ts.map +1 -0
  16. package/dist/framework/a11y/hooks/useLiveRegion.js +60 -0
  17. package/dist/framework/a11y/index.d.ts +16 -0
  18. package/dist/framework/a11y/index.d.ts.map +1 -0
  19. package/dist/framework/a11y/index.js +11 -0
  20. package/dist/framework/branding/context.d.ts +52 -0
  21. package/dist/framework/branding/context.d.ts.map +1 -0
  22. package/dist/framework/branding/context.js +96 -0
  23. package/dist/framework/branding/css-vars.d.ts +34 -0
  24. package/dist/framework/branding/css-vars.d.ts.map +1 -0
  25. package/dist/framework/branding/css-vars.js +95 -0
  26. package/dist/framework/branding/tailwind-config.d.ts +38 -0
  27. package/dist/framework/branding/tailwind-config.d.ts.map +1 -0
  28. package/dist/framework/branding/tailwind-config.js +66 -0
  29. package/dist/framework/components/BrandedButton.d.ts +53 -0
  30. package/dist/framework/components/BrandedButton.d.ts.map +1 -0
  31. package/dist/framework/components/BrandedButton.js +40 -0
  32. package/dist/framework/components/BrandedCard.d.ts +52 -0
  33. package/dist/framework/components/BrandedCard.d.ts.map +1 -0
  34. package/dist/framework/components/BrandedCard.js +73 -0
  35. package/dist/framework/components/ErrorBoundary.d.ts +92 -0
  36. package/dist/framework/components/ErrorBoundary.d.ts.map +1 -0
  37. package/dist/framework/components/ErrorBoundary.js +121 -0
  38. package/dist/framework/components/HuaUxLayout.d.ts +29 -0
  39. package/dist/framework/components/HuaUxLayout.d.ts.map +1 -0
  40. package/dist/framework/components/HuaUxLayout.js +32 -0
  41. package/dist/framework/components/HuaUxPage.d.ts +48 -0
  42. package/dist/framework/components/HuaUxPage.d.ts.map +1 -0
  43. package/dist/framework/components/HuaUxPage.js +105 -0
  44. package/dist/framework/components/Providers.d.ts +17 -0
  45. package/dist/framework/components/Providers.d.ts.map +1 -0
  46. package/dist/framework/components/Providers.js +72 -0
  47. package/dist/framework/components/WelcomePage.d.ts +44 -0
  48. package/dist/framework/components/WelcomePage.d.ts.map +1 -0
  49. package/dist/framework/components/WelcomePage.js +80 -0
  50. package/dist/framework/config/index.d.ts +182 -0
  51. package/dist/framework/config/index.d.ts.map +1 -0
  52. package/dist/framework/config/index.js +329 -0
  53. package/dist/framework/config/merge.d.ts +26 -0
  54. package/dist/framework/config/merge.d.ts.map +1 -0
  55. package/dist/framework/config/merge.js +160 -0
  56. package/dist/framework/config/schema.d.ts +25 -0
  57. package/dist/framework/config/schema.d.ts.map +1 -0
  58. package/dist/framework/config/schema.js +122 -0
  59. package/dist/framework/hooks/useMotion.d.ts +45 -0
  60. package/dist/framework/hooks/useMotion.d.ts.map +1 -0
  61. package/dist/framework/hooks/useMotion.js +40 -0
  62. package/dist/framework/index.d.ts +37 -0
  63. package/dist/framework/index.d.ts.map +1 -0
  64. package/dist/framework/index.js +42 -0
  65. package/dist/framework/license/errors.d.ts +15 -0
  66. package/dist/framework/license/errors.d.ts.map +1 -0
  67. package/dist/framework/license/errors.js +52 -0
  68. package/dist/framework/license/index.d.ts +70 -0
  69. package/dist/framework/license/index.d.ts.map +1 -0
  70. package/dist/framework/license/index.js +124 -0
  71. package/dist/framework/license/loader.d.ts +26 -0
  72. package/dist/framework/license/loader.d.ts.map +1 -0
  73. package/dist/framework/license/loader.js +137 -0
  74. package/dist/framework/license/types.d.ts +67 -0
  75. package/dist/framework/license/types.d.ts.map +1 -0
  76. package/dist/framework/license/types.js +18 -0
  77. package/dist/framework/loading/components/SkeletonGroup.d.ts +44 -0
  78. package/dist/framework/loading/components/SkeletonGroup.d.ts.map +1 -0
  79. package/dist/framework/loading/components/SkeletonGroup.js +34 -0
  80. package/dist/framework/loading/components/SuspenseWrapper.d.ts +58 -0
  81. package/dist/framework/loading/components/SuspenseWrapper.d.ts.map +1 -0
  82. package/dist/framework/loading/components/SuspenseWrapper.js +40 -0
  83. package/dist/framework/loading/hoc/withSuspense.d.ts +46 -0
  84. package/dist/framework/loading/hoc/withSuspense.d.ts.map +1 -0
  85. package/dist/framework/loading/hoc/withSuspense.js +54 -0
  86. package/dist/framework/loading/hooks/useDelayedLoading.d.ts +56 -0
  87. package/dist/framework/loading/hooks/useDelayedLoading.d.ts.map +1 -0
  88. package/dist/framework/loading/hooks/useDelayedLoading.js +97 -0
  89. package/dist/framework/loading/hooks/useLoadingState.d.ts +69 -0
  90. package/dist/framework/loading/hooks/useLoadingState.d.ts.map +1 -0
  91. package/dist/framework/loading/hooks/useLoadingState.js +59 -0
  92. package/dist/framework/loading/index.d.ts +16 -0
  93. package/dist/framework/loading/index.d.ts.map +1 -0
  94. package/dist/framework/loading/index.js +13 -0
  95. package/dist/framework/middleware/i18n.d.ts +90 -0
  96. package/dist/framework/middleware/i18n.d.ts.map +1 -0
  97. package/dist/framework/middleware/i18n.js +99 -0
  98. package/dist/framework/plugins/index.d.ts +8 -0
  99. package/dist/framework/plugins/index.d.ts.map +1 -0
  100. package/dist/framework/plugins/index.js +6 -0
  101. package/dist/framework/plugins/registry.d.ts +95 -0
  102. package/dist/framework/plugins/registry.d.ts.map +1 -0
  103. package/dist/framework/plugins/registry.js +160 -0
  104. package/dist/framework/plugins/types.d.ts +97 -0
  105. package/dist/framework/plugins/types.d.ts.map +1 -0
  106. package/dist/framework/plugins/types.js +6 -0
  107. package/dist/framework/seo/geo/examples.d.ts +87 -0
  108. package/dist/framework/seo/geo/examples.d.ts.map +1 -0
  109. package/dist/framework/seo/geo/examples.js +295 -0
  110. package/dist/framework/seo/geo/generateGEOMetadata.d.ts +107 -0
  111. package/dist/framework/seo/geo/generateGEOMetadata.d.ts.map +1 -0
  112. package/dist/framework/seo/geo/generateGEOMetadata.js +404 -0
  113. package/dist/framework/seo/geo/index.d.ts +19 -0
  114. package/dist/framework/seo/geo/index.d.ts.map +1 -0
  115. package/dist/framework/seo/geo/index.js +21 -0
  116. package/dist/framework/seo/geo/presets.d.ts +52 -0
  117. package/dist/framework/seo/geo/presets.d.ts.map +1 -0
  118. package/dist/framework/seo/geo/presets.js +47 -0
  119. package/dist/framework/seo/geo/structuredData.d.ts +187 -0
  120. package/dist/framework/seo/geo/structuredData.d.ts.map +1 -0
  121. package/dist/framework/seo/geo/structuredData.js +354 -0
  122. package/dist/framework/seo/geo/test-utils.d.ts +78 -0
  123. package/dist/framework/seo/geo/test-utils.d.ts.map +1 -0
  124. package/dist/framework/seo/geo/test-utils.js +139 -0
  125. package/dist/framework/seo/geo/types.d.ts +225 -0
  126. package/dist/framework/seo/geo/types.d.ts.map +1 -0
  127. package/dist/framework/seo/geo/types.js +51 -0
  128. package/dist/framework/types/index.d.ts +577 -0
  129. package/dist/framework/types/index.d.ts.map +1 -0
  130. package/dist/framework/types/index.js +6 -0
  131. package/dist/framework/utils/data-fetching.d.ts +45 -0
  132. package/dist/framework/utils/data-fetching.d.ts.map +1 -0
  133. package/dist/framework/utils/data-fetching.js +74 -0
  134. package/dist/framework/utils/file-structure.d.ts +29 -0
  135. package/dist/framework/utils/file-structure.d.ts.map +1 -0
  136. package/dist/framework/utils/file-structure.js +72 -0
  137. package/dist/framework/utils/metadata.d.ts +109 -0
  138. package/dist/framework/utils/metadata.d.ts.map +1 -0
  139. package/dist/framework/utils/metadata.js +105 -0
  140. package/dist/index.d.ts +15 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +21 -0
  143. package/dist/presets/index.d.ts +8 -0
  144. package/dist/presets/index.d.ts.map +1 -0
  145. package/dist/presets/index.js +7 -0
  146. package/dist/presets/marketing.d.ts +41 -0
  147. package/dist/presets/marketing.d.ts.map +1 -0
  148. package/dist/presets/marketing.js +81 -0
  149. package/dist/presets/product.d.ts +41 -0
  150. package/dist/presets/product.d.ts.map +1 -0
  151. package/dist/presets/product.js +74 -0
  152. package/package.json +91 -0
  153. package/src/framework/README.md +329 -0
  154. package/src/framework/__tests__/branding/css-vars.test.ts +147 -0
  155. package/src/framework/__tests__/components/ErrorBoundary.test.tsx +146 -0
  156. package/src/framework/__tests__/config/defineConfig.test.ts +138 -0
  157. package/src/framework/__tests__/hooks/useMotion.test.ts +105 -0
  158. package/src/framework/__tests__/seo/geo/generateGEOMetadata.test.ts +207 -0
  159. package/src/framework/__tests__/seo/geo/structuredData.test.ts +262 -0
  160. package/src/framework/a11y/components/LiveRegion.tsx +89 -0
  161. package/src/framework/a11y/components/SkipToContent.tsx +103 -0
  162. package/src/framework/a11y/hooks/useFocusManagement.ts +125 -0
  163. package/src/framework/a11y/hooks/useFocusTrap.ts +239 -0
  164. package/src/framework/a11y/hooks/useLiveRegion.ts +95 -0
  165. package/src/framework/a11y/index.ts +17 -0
  166. package/src/framework/branding/context.tsx +135 -0
  167. package/src/framework/branding/css-vars.ts +110 -0
  168. package/src/framework/branding/tailwind-config.ts +90 -0
  169. package/src/framework/components/BrandedButton.tsx +94 -0
  170. package/src/framework/components/BrandedCard.tsx +87 -0
  171. package/src/framework/components/ErrorBoundary.tsx +215 -0
  172. package/src/framework/components/HuaUxLayout.tsx +36 -0
  173. package/src/framework/components/HuaUxPage.tsx +138 -0
  174. package/src/framework/components/Providers.tsx +98 -0
  175. package/src/framework/components/WelcomePage.tsx +207 -0
  176. package/src/framework/config/index.ts +349 -0
  177. package/src/framework/config/merge.ts +190 -0
  178. package/src/framework/config/schema.ts +140 -0
  179. package/src/framework/hooks/useMotion.ts +57 -0
  180. package/src/framework/index.ts +122 -0
  181. package/src/framework/license/errors.ts +63 -0
  182. package/src/framework/license/index.ts +137 -0
  183. package/src/framework/license/loader.ts +158 -0
  184. package/src/framework/license/types.ts +95 -0
  185. package/src/framework/loading/components/SkeletonGroup.tsx +70 -0
  186. package/src/framework/loading/components/SuspenseWrapper.tsx +88 -0
  187. package/src/framework/loading/hoc/withSuspense.tsx +96 -0
  188. package/src/framework/loading/hooks/useDelayedLoading.ts +127 -0
  189. package/src/framework/loading/hooks/useLoadingState.ts +103 -0
  190. package/src/framework/loading/index.ts +19 -0
  191. package/src/framework/middleware/i18n.ts +161 -0
  192. package/src/framework/middleware/index.ts +7 -0
  193. package/src/framework/plugins/index.ts +13 -0
  194. package/src/framework/plugins/registry.ts +186 -0
  195. package/src/framework/plugins/types.ts +106 -0
  196. package/src/framework/seo/geo/examples.tsx +415 -0
  197. package/src/framework/seo/geo/generateGEOMetadata.ts +441 -0
  198. package/src/framework/seo/geo/index.ts +61 -0
  199. package/src/framework/seo/geo/presets.ts +58 -0
  200. package/src/framework/seo/geo/structuredData.ts +422 -0
  201. package/src/framework/seo/geo/test-utils.ts +179 -0
  202. package/src/framework/seo/geo/types.ts +315 -0
  203. package/src/framework/types/index.ts +623 -0
  204. package/src/framework/utils/data-fetching.ts +95 -0
  205. package/src/framework/utils/file-structure.ts +88 -0
  206. package/src/framework/utils/metadata.ts +152 -0
  207. package/src/index.ts +31 -0
  208. package/src/presets/index.ts +8 -0
  209. package/src/presets/marketing.ts +88 -0
  210. package/src/presets/product.ts +81 -0
@@ -0,0 +1,160 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework - Config Merge
3
+ *
4
+ * Preset 병합 및 깊은 병합 로직
5
+ */
6
+ import { productPreset } from '../../presets/product';
7
+ import { marketingPreset } from '../../presets/marketing';
8
+ /**
9
+ * Preset 맵
10
+ */
11
+ const PRESET_MAP = {
12
+ product: productPreset,
13
+ marketing: marketingPreset,
14
+ };
15
+ /**
16
+ * 깊은 병합 (Deep Merge)
17
+ *
18
+ * 중첩된 객체를 재귀적으로 병합합니다.
19
+ * 사용자 설정이 Preset 설정보다 우선합니다.
20
+ */
21
+ function deepMerge(target, source) {
22
+ const result = { ...target };
23
+ for (const key in source) {
24
+ if (source[key] === undefined) {
25
+ // undefined는 병합에서 제외 (사용자가 명시적으로 끄려는 경우)
26
+ continue;
27
+ }
28
+ if (source[key] &&
29
+ typeof source[key] === 'object' &&
30
+ !Array.isArray(source[key]) &&
31
+ target[key] &&
32
+ typeof target[key] === 'object' &&
33
+ !Array.isArray(target[key])) {
34
+ // 중첩 객체는 재귀적으로 병합
35
+ result[key] = deepMerge(target[key], source[key]);
36
+ }
37
+ else {
38
+ // 배열이나 원시값은 그대로 덮어쓰기
39
+ result[key] = source[key];
40
+ }
41
+ }
42
+ return result;
43
+ }
44
+ /**
45
+ * Preset에서 Config로 변환
46
+ *
47
+ * Preset의 구조를 HuaUxConfig 형식으로 변환합니다.
48
+ */
49
+ function presetToConfig(preset) {
50
+ return {
51
+ motion: {
52
+ defaultPreset: preset === productPreset ? 'product' : 'marketing',
53
+ enableAnimations: true,
54
+ },
55
+ i18n: {
56
+ defaultLanguage: preset.i18n.defaultLanguage,
57
+ supportedLanguages: [...preset.i18n.supportedLanguages],
58
+ },
59
+ // Preset의 spacing은 나중에 컴포넌트에서 사용
60
+ // Config에는 직접 포함하지 않음 (컴포넌트가 PresetContext에서 가져옴)
61
+ };
62
+ }
63
+ /**
64
+ * Preset과 사용자 설정 병합
65
+ *
66
+ * 1. Preset 기본값 로드
67
+ * 2. Preset 설정 오버라이드 (개발자 모드인 경우)
68
+ * 3. 사용자 설정으로 병합 (사용자 설정 우선)
69
+ * 4. 최종 검증
70
+ *
71
+ * @param preset - 사용할 Preset (문자열 또는 객체)
72
+ * @param userConfig - 사용자 설정 (선택적)
73
+ * @returns 병합된 설정
74
+ */
75
+ export function mergePresetWithConfig(preset, userConfig) {
76
+ // 1. Preset 타입 추출
77
+ let presetName;
78
+ let presetOverrides = {};
79
+ if (typeof preset === 'string') {
80
+ // 바이브 모드: 문자열 Preset
81
+ presetName = preset;
82
+ }
83
+ else {
84
+ // 개발자 모드: 객체 Preset
85
+ presetName = preset.type;
86
+ // Preset 설정 오버라이드
87
+ if (preset.motion) {
88
+ presetOverrides.motion = {
89
+ ...presetOverrides.motion,
90
+ duration: preset.motion.duration,
91
+ easing: preset.motion.easing,
92
+ };
93
+ }
94
+ // spacing은 나중에 컴포넌트 레벨에서 처리
95
+ // (Config에는 직접 포함하지 않음)
96
+ }
97
+ // 2. Preset 로드
98
+ const presetData = PRESET_MAP[presetName];
99
+ if (!presetData) {
100
+ throw new Error(`Unknown preset: "${presetName}". Available presets: ${Object.keys(PRESET_MAP).join(', ')}`);
101
+ }
102
+ // 3. Preset을 Config 형식으로 변환
103
+ const presetConfig = presetToConfig(presetData);
104
+ // preset 속성 추가 (원본 preset 정보 보존)
105
+ presetConfig.preset = presetName;
106
+ // 4. Preset 오버라이드와 병합
107
+ const presetWithOverrides = deepMerge(presetConfig, presetOverrides);
108
+ // 5. 사용자 설정과 병합 (사용자 설정 우선)
109
+ const merged = userConfig
110
+ ? deepMerge(presetWithOverrides, userConfig)
111
+ : presetWithOverrides;
112
+ // 4. 최종 Config 형식으로 변환 (필수 필드 보장)
113
+ return {
114
+ ...presetConfig,
115
+ ...merged,
116
+ // i18n은 항상 있어야 함 (Preset에서 제공)
117
+ i18n: merged.i18n || presetConfig.i18n,
118
+ // motion은 항상 있어야 함
119
+ motion: merged.motion || presetConfig.motion,
120
+ // state는 기본값 사용
121
+ state: merged.state || {
122
+ persist: true,
123
+ ssr: true,
124
+ },
125
+ // fileStructure는 기본값 사용
126
+ fileStructure: merged.fileStructure || {
127
+ enforce: false,
128
+ },
129
+ };
130
+ }
131
+ /**
132
+ * Preset 없이 사용자 설정만으로 Config 생성
133
+ *
134
+ * Preset을 사용하지 않고 모든 설정을 직접 지정하는 경우
135
+ */
136
+ export function createConfigFromUserConfig(userConfig) {
137
+ // 기본값과 사용자 설정 병합
138
+ const defaultConfig = {
139
+ i18n: {
140
+ defaultLanguage: 'ko',
141
+ supportedLanguages: ['ko', 'en'],
142
+ fallbackLanguage: 'en',
143
+ namespaces: ['common'],
144
+ translationLoader: 'api',
145
+ translationApiPath: '/api/translations',
146
+ },
147
+ motion: {
148
+ defaultPreset: 'product',
149
+ enableAnimations: true,
150
+ },
151
+ state: {
152
+ persist: true,
153
+ ssr: true,
154
+ },
155
+ fileStructure: {
156
+ enforce: false,
157
+ },
158
+ };
159
+ return deepMerge(defaultConfig, userConfig);
160
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework - Config Schema
3
+ *
4
+ * Configuration schema and validation
5
+ */
6
+ import type { HuaUxConfig } from '../types';
7
+ /**
8
+ * Default configuration
9
+ *
10
+ * Preset을 사용하지 않을 때의 기본값입니다.
11
+ * Preset을 사용하면 이 값은 무시되고 Preset 값이 사용됩니다.
12
+ */
13
+ export declare const defaultConfig: Required<Omit<HuaUxConfig, 'branding' | 'plugins' | 'license'>> & {
14
+ branding?: HuaUxConfig['branding'];
15
+ plugins?: HuaUxConfig['plugins'];
16
+ license?: HuaUxConfig['license'];
17
+ };
18
+ /**
19
+ * Validate configuration
20
+ *
21
+ * 설정의 유효성을 검증하고 친절한 에러 메시지를 제공합니다.
22
+ * Validates configuration and provides friendly error messages.
23
+ */
24
+ export declare function validateConfig(config: Partial<HuaUxConfig>): HuaUxConfig;
25
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/framework/config/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAU,MAAM,UAAU,CAAC;AAEpD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC,GAAG;IAC5F,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CAwBlC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CA0FxE"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework - Config Schema
3
+ *
4
+ * Configuration schema and validation
5
+ */
6
+ /**
7
+ * Default configuration
8
+ *
9
+ * Preset을 사용하지 않을 때의 기본값입니다.
10
+ * Preset을 사용하면 이 값은 무시되고 Preset 값이 사용됩니다.
11
+ */
12
+ export const defaultConfig = {
13
+ preset: 'product', // 기본 Preset
14
+ i18n: {
15
+ defaultLanguage: 'ko',
16
+ supportedLanguages: ['ko', 'en'],
17
+ fallbackLanguage: 'en',
18
+ namespaces: ['common'],
19
+ translationLoader: 'api',
20
+ translationApiPath: '/api/translations',
21
+ },
22
+ motion: {
23
+ defaultPreset: 'product',
24
+ enableAnimations: true,
25
+ },
26
+ state: {
27
+ persist: true,
28
+ ssr: true,
29
+ },
30
+ fileStructure: {
31
+ enforce: false,
32
+ },
33
+ plugins: [],
34
+ license: undefined,
35
+ };
36
+ /**
37
+ * Validate configuration
38
+ *
39
+ * 설정의 유효성을 검증하고 친절한 에러 메시지를 제공합니다.
40
+ * Validates configuration and provides friendly error messages.
41
+ */
42
+ export function validateConfig(config) {
43
+ // Preset 검증
44
+ if (config.preset) {
45
+ if (typeof config.preset === 'string') {
46
+ // 바이브 모드: 문자열 Preset
47
+ if (!['product', 'marketing'].includes(config.preset)) {
48
+ throw new Error(`[hua-ux] ❌ 잘못된 Preset입니다: "${config.preset}"\n` +
49
+ `[hua-ux] ❌ Invalid preset: "${config.preset}"\n\n` +
50
+ `사용 가능한 Preset: 'product', 'marketing'\n` +
51
+ `Available presets: 'product', 'marketing'\n\n` +
52
+ `💡 해결 방법 / Solution:\n` +
53
+ ` - 'product' 또는 'marketing' 중 하나를 선택하세요.\n` +
54
+ ` - Select either 'product' or 'marketing'.\n\n` +
55
+ `📖 가이드 / Guide: https://github.com/HUA-Labs/hua-platform/tree/main/packages/hua-ux/docs`);
56
+ }
57
+ }
58
+ else {
59
+ // 개발자 모드: 객체 Preset
60
+ if (!['product', 'marketing'].includes(config.preset.type)) {
61
+ throw new Error(`[hua-ux] ❌ 잘못된 Preset 타입입니다: "${config.preset.type}"\n` +
62
+ `[hua-ux] ❌ Invalid preset type: "${config.preset.type}"\n\n` +
63
+ `사용 가능한 Preset 타입: 'product', 'marketing'\n` +
64
+ `Available preset types: 'product', 'marketing'\n\n` +
65
+ `💡 해결 방법 / Solution:\n` +
66
+ ` - preset.type을 'product' 또는 'marketing'으로 설정하세요.\n` +
67
+ ` - Set preset.type to either 'product' or 'marketing'.\n\n` +
68
+ `📖 가이드 / Guide: https://github.com/HUA-Labs/hua-platform/tree/main/packages/hua-ux/docs`);
69
+ }
70
+ }
71
+ }
72
+ // motion.style을 defaultPreset으로 매핑 (바이브 코더용)
73
+ if (config.motion?.style && !config.motion.defaultPreset) {
74
+ const styleToPreset = {
75
+ smooth: 'product',
76
+ minimal: 'product',
77
+ dramatic: 'marketing',
78
+ };
79
+ config.motion.defaultPreset = styleToPreset[config.motion.style];
80
+ }
81
+ // 기본값과 병합
82
+ const validated = {
83
+ preset: config.preset || defaultConfig.preset,
84
+ i18n: {
85
+ ...defaultConfig.i18n,
86
+ ...config.i18n,
87
+ },
88
+ motion: {
89
+ ...defaultConfig.motion,
90
+ ...config.motion,
91
+ },
92
+ state: {
93
+ ...defaultConfig.state,
94
+ ...config.state,
95
+ },
96
+ fileStructure: {
97
+ ...defaultConfig.fileStructure,
98
+ ...config.fileStructure,
99
+ },
100
+ };
101
+ // Validate i18n
102
+ if (validated.i18n) {
103
+ if (!validated.i18n.supportedLanguages.includes(validated.i18n.defaultLanguage)) {
104
+ throw new Error(`[hua-ux] ❌ i18n 설정 오류 / i18n configuration error\n\n` +
105
+ `기본 언어 "${validated.i18n.defaultLanguage}"가 지원 언어 목록에 없습니다.\n` +
106
+ `Default language "${validated.i18n.defaultLanguage}" is not in supportedLanguages.\n\n` +
107
+ `현재 지원 언어 / Current supported languages: ${validated.i18n.supportedLanguages.join(', ')}\n\n` +
108
+ `💡 해결 방법 / Solution:\n` +
109
+ ` 1. supportedLanguages에 "${validated.i18n.defaultLanguage}"를 추가하세요.\n` +
110
+ ` Add "${validated.i18n.defaultLanguage}" to supportedLanguages.\n` +
111
+ ` 2. 또는 defaultLanguage를 지원 언어 중 하나로 변경하세요.\n` +
112
+ ` Or change defaultLanguage to one of the supported languages.\n\n` +
113
+ `📝 예시 / Example:\n` +
114
+ ` i18n: {\n` +
115
+ ` defaultLanguage: 'ko',\n` +
116
+ ` supportedLanguages: ['ko', 'en', 'ja'], // 'ko' 포함 필수\n` +
117
+ ` }\n\n` +
118
+ `📖 가이드 / Guide: https://github.com/HUA-Labs/hua-platform/tree/main/packages/hua-ux/docs`);
119
+ }
120
+ }
121
+ return validated;
122
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework - useMotion
3
+ *
4
+ * 통합 Motion Hook - motion-core의 useUnifiedMotion을 래핑
5
+ * Unified Motion Hook - Wraps motion-core's useUnifiedMotion
6
+ *
7
+ * 이 hook은 motion-core의 useUnifiedMotion을 재export하여
8
+ * hua-ux 프레임워크에서 일관된 API를 제공합니다.
9
+ *
10
+ * This hook re-exports motion-core's useUnifiedMotion to provide
11
+ * a consistent API within the hua-ux framework.
12
+ */
13
+ import type { BaseMotionReturn, MotionElement, EntranceType } from '@hua-labs/motion-core';
14
+ import type { UseUnifiedMotionOptions } from '@hua-labs/motion-core';
15
+ /**
16
+ * Motion type (motion-core의 EntranceType과 동일)
17
+ */
18
+ export type MotionType = EntranceType;
19
+ /**
20
+ * useMotion options (motion-core의 UseUnifiedMotionOptions와 동일)
21
+ */
22
+ export type UseMotionOptions = UseUnifiedMotionOptions;
23
+ /**
24
+ * 통합 Motion Hook
25
+ *
26
+ * motion-core의 useUnifiedMotion을 래핑하여 hua-ux 프레임워크에서 사용합니다.
27
+ *
28
+ * Wraps motion-core's useUnifiedMotion for use in the hua-ux framework.
29
+ *
30
+ * @param options - Motion options
31
+ * @returns Motion result with ref and control functions
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * const motion = useMotion({
36
+ * type: 'fadeIn',
37
+ * duration: 600,
38
+ * autoStart: false,
39
+ * });
40
+ *
41
+ * return <div ref={motion.ref} style={motion.style}>Content</div>;
42
+ * ```
43
+ */
44
+ export declare function useMotion<T extends MotionElement = HTMLDivElement>(options: UseMotionOptions): BaseMotionReturn<T>;
45
+ //# sourceMappingURL=useMotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMotion.d.ts","sourceRoot":"","sources":["../../../src/framework/hooks/useMotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,aAAa,GAAG,cAAc,EAChE,OAAO,EAAE,gBAAgB,GACxB,gBAAgB,CAAC,CAAC,CAAC,CAIrB"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework - useMotion
3
+ *
4
+ * 통합 Motion Hook - motion-core의 useUnifiedMotion을 래핑
5
+ * Unified Motion Hook - Wraps motion-core's useUnifiedMotion
6
+ *
7
+ * 이 hook은 motion-core의 useUnifiedMotion을 재export하여
8
+ * hua-ux 프레임워크에서 일관된 API를 제공합니다.
9
+ *
10
+ * This hook re-exports motion-core's useUnifiedMotion to provide
11
+ * a consistent API within the hua-ux framework.
12
+ */
13
+ 'use client';
14
+ import { useUnifiedMotion } from '@hua-labs/motion-core';
15
+ /**
16
+ * 통합 Motion Hook
17
+ *
18
+ * motion-core의 useUnifiedMotion을 래핑하여 hua-ux 프레임워크에서 사용합니다.
19
+ *
20
+ * Wraps motion-core's useUnifiedMotion for use in the hua-ux framework.
21
+ *
22
+ * @param options - Motion options
23
+ * @returns Motion result with ref and control functions
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * const motion = useMotion({
28
+ * type: 'fadeIn',
29
+ * duration: 600,
30
+ * autoStart: false,
31
+ * });
32
+ *
33
+ * return <div ref={motion.ref} style={motion.style}>Content</div>;
34
+ * ```
35
+ */
36
+ export function useMotion(options) {
37
+ // motion-core의 useUnifiedMotion을 직접 사용
38
+ // Directly use motion-core's useUnifiedMotion
39
+ return useUnifiedMotion(options);
40
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework
3
+ *
4
+ * Framework layer for hua-ux
5
+ */
6
+ export { HuaUxLayout } from './components/HuaUxLayout';
7
+ export { HuaUxPage } from './components/HuaUxPage';
8
+ export { UnifiedProviders } from './components/Providers';
9
+ export { BrandedButton } from './components/BrandedButton';
10
+ export { BrandedCard } from './components/BrandedCard';
11
+ export { ErrorBoundary } from './components/ErrorBoundary';
12
+ export type { ErrorBoundaryProps } from './components/ErrorBoundary';
13
+ export { defineConfig, loadConfig, getConfig, setConfig, resetConfig } from './config';
14
+ export type { HuaUxConfig, PresetName } from './types';
15
+ export { useData, fetchData } from './utils/data-fetching';
16
+ export type { DataFetchResult } from './utils/data-fetching';
17
+ export { createI18nMiddleware } from './middleware/i18n';
18
+ export type { I18nMiddlewareConfig } from './middleware/i18n';
19
+ export { generatePageMetadata } from './utils/metadata';
20
+ export type { SEOConfig } from './utils/metadata';
21
+ export { generateGEOMetadata, renderJSONLD, createAIContext, generateSoftwareApplicationLD, generateFAQPageLD, generateTechArticleLD, generateHowToLD, } from './seo/geo';
22
+ export type { GEOConfig, GEOMetadata, StructuredData, SoftwareApplicationType, SoftwareCategory, ProgrammingLanguage, } from './seo/geo';
23
+ export { initLicense, getLicense, checkLicense, hasLicense, requireLicense } from './license';
24
+ export type { LicenseInfo, LicenseType, LicenseFeature, LicenseCheckResult } from './license/types';
25
+ export { pluginRegistry, registerPlugin, getPlugin, getAllPlugins } from './plugins';
26
+ export type { HuaUxPlugin } from './plugins/types';
27
+ export { BrandingProvider, useBranding, useBrandingColor } from './branding/context';
28
+ export { generateCSSVariables, generateCSSVariablesObject } from './branding/css-vars';
29
+ export { generateTailwindConfig } from './branding/tailwind-config';
30
+ export { useFocusManagement, useFocusTrap, SkipToContent, LiveRegion, useLiveRegion, } from './a11y';
31
+ export type { FocusManagementOptions, FocusTrapOptions, SkipToContentProps, LiveRegionProps, } from './a11y';
32
+ export { useDelayedLoading, useLoadingState, Skeleton, SkeletonGroup, SuspenseWrapper, withSuspense, } from './loading';
33
+ export type { DelayedLoadingOptions, SkeletonGroupProps, SuspenseWrapperProps, } from './loading';
34
+ export { useMotion } from './hooks/useMotion';
35
+ export type { MotionType, UseMotionOptions } from './hooks/useMotion';
36
+ export type { HuaUxLayoutProps, HuaUxPageProps } from './types';
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/framework/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGvD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAU9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,6BAA6B,EAC7B,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,uBAAuB,EACvB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,WAAW,EACX,UAAU,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACf,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,EACd,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,aAAa,GACd,MAAM,QAAQ,CAAC;AAChB,YAAY,EACV,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,aAAa,EACb,eAAe,EACf,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGtE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework
3
+ *
4
+ * Framework layer for hua-ux
5
+ */
6
+ // Components
7
+ export { HuaUxLayout } from './components/HuaUxLayout';
8
+ export { HuaUxPage } from './components/HuaUxPage';
9
+ export { UnifiedProviders } from './components/Providers';
10
+ export { BrandedButton } from './components/BrandedButton';
11
+ export { BrandedCard } from './components/BrandedCard';
12
+ export { ErrorBoundary } from './components/ErrorBoundary';
13
+ // Configuration
14
+ export { defineConfig, loadConfig, getConfig, setConfig, resetConfig } from './config';
15
+ // Data Fetching
16
+ export { useData, fetchData } from './utils/data-fetching';
17
+ // Middleware
18
+ export { createI18nMiddleware } from './middleware/i18n';
19
+ // File Structure
20
+ // 서버 전용 유틸리티 (클라이언트 번들에서 제외)
21
+ // Server-only utilities (excluded from client bundle)
22
+ // export { validateFileStructure } from './utils/file-structure';
23
+ // export type { FileStructureResult } from './utils/file-structure';
24
+ // Note: validateFileStructure는 서버 전용이므로 필요시 직접 import
25
+ // Metadata Utilities
26
+ export { generatePageMetadata } from './utils/metadata';
27
+ // GEO (Generative Engine Optimization)
28
+ export { generateGEOMetadata, renderJSONLD, createAIContext, generateSoftwareApplicationLD, generateFAQPageLD, generateTechArticleLD, generateHowToLD, } from './seo/geo';
29
+ // License System
30
+ export { initLicense, getLicense, checkLicense, hasLicense, requireLicense } from './license';
31
+ // Plugin System
32
+ export { pluginRegistry, registerPlugin, getPlugin, getAllPlugins } from './plugins';
33
+ // Branding
34
+ export { BrandingProvider, useBranding, useBrandingColor } from './branding/context';
35
+ export { generateCSSVariables, generateCSSVariablesObject } from './branding/css-vars';
36
+ export { generateTailwindConfig } from './branding/tailwind-config';
37
+ // Accessibility (a11y)
38
+ export { useFocusManagement, useFocusTrap, SkipToContent, LiveRegion, useLiveRegion, } from './a11y';
39
+ // Loading
40
+ export { useDelayedLoading, useLoadingState, Skeleton, SkeletonGroup, SuspenseWrapper, withSuspense, } from './loading';
41
+ // Motion Hooks
42
+ export { useMotion } from './hooks/useMotion';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework - License Errors
3
+ *
4
+ * 라이선스 관련 에러 메시지
5
+ */
6
+ import type { LicenseFeature } from './types';
7
+ /**
8
+ * 라이선스 에러 메시지 생성
9
+ *
10
+ * @param feature - 필요한 기능
11
+ * @param currentLicense - 현재 라이선스 타입
12
+ * @returns 에러 메시지
13
+ */
14
+ export declare function createLicenseError(feature: LicenseFeature, currentLicense?: 'free' | 'pro' | 'enterprise'): string;
15
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/framework/license/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO9C;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,cAAc,GAAE,MAAM,GAAG,KAAK,GAAG,YAAqB,GACrD,MAAM,CAuCR"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework - License Errors
3
+ *
4
+ * 라이선스 관련 에러 메시지
5
+ */
6
+ /**
7
+ * 구매 링크 (향후 실제 링크로 변경)
8
+ */
9
+ const PURCHASE_URL = 'https://hua-labs.com/pricing';
10
+ /**
11
+ * 라이선스 에러 메시지 생성
12
+ *
13
+ * @param feature - 필요한 기능
14
+ * @param currentLicense - 현재 라이선스 타입
15
+ * @returns 에러 메시지
16
+ */
17
+ export function createLicenseError(feature, currentLicense = 'free') {
18
+ const featureNames = {
19
+ 'core': 'Core features',
20
+ 'motion-basic': 'Basic motion',
21
+ 'motion-pro': 'Motion Pro',
22
+ 'i18n-basic': 'Basic i18n',
23
+ 'i18n-pro': 'i18n Pro',
24
+ 'preset-basic': 'Basic presets',
25
+ 'preset-pro': 'Preset Pro',
26
+ 'white-labeling': 'White Labeling',
27
+ };
28
+ const featureName = featureNames[feature] || feature;
29
+ // 필요한 라이선스 타입 결정
30
+ let requiredLicense = 'pro';
31
+ if (feature === 'white-labeling') {
32
+ requiredLicense = 'enterprise';
33
+ }
34
+ const messages = {
35
+ ko: [
36
+ `[hua-ux] ❌ "${featureName}" 기능을 사용하려면 ${requiredLicense === 'enterprise' ? 'Enterprise' : 'Pro'} 라이선스가 필요합니다.`,
37
+ `[hua-ux] ❌ Feature "${featureName}" requires a ${requiredLicense === 'enterprise' ? 'Enterprise' : 'Pro'} license.`,
38
+ '',
39
+ `현재 라이선스: ${currentLicense === 'free' ? 'Free' : currentLicense === 'pro' ? 'Pro' : 'Enterprise'}`,
40
+ `Current license: ${currentLicense === 'free' ? 'Free' : currentLicense === 'pro' ? 'Pro' : 'Enterprise'}`,
41
+ '',
42
+ `💡 해결 방법 / Solution:`,
43
+ ` - ${requiredLicense === 'enterprise' ? 'Enterprise' : 'Pro'} 라이선스를 구매하세요.`,
44
+ ` - Purchase a ${requiredLicense === 'enterprise' ? 'Enterprise' : 'Pro'} license.`,
45
+ ` - 구매 링크: ${PURCHASE_URL}`,
46
+ ` - Purchase link: ${PURCHASE_URL}`,
47
+ '',
48
+ `📖 가이드 / Guide: https://github.com/HUA-Labs/hua-platform/tree/main/packages/hua-ux/docs`,
49
+ ],
50
+ };
51
+ return messages.ko.join('\n');
52
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @hua-labs/hua-ux/framework - License System
3
+ *
4
+ * 라이선스 검증 및 관리 시스템
5
+ */
6
+ import type { LicenseInfo, LicenseFeature, LicenseCheckResult } from './types';
7
+ /**
8
+ * 라이선스 초기화
9
+ *
10
+ * 설정 파일의 라이선스 정보를 사용하여 라이선스를 로드합니다.
11
+ *
12
+ * @param configLicense - 설정 파일의 라이선스 정보 (선택적)
13
+ */
14
+ export declare function initLicense(configLicense?: {
15
+ apiKey?: string;
16
+ type?: 'free' | 'pro' | 'enterprise';
17
+ }): void;
18
+ /**
19
+ * 현재 라이선스 가져오기
20
+ *
21
+ * @returns 라이선스 정보
22
+ */
23
+ export declare function getLicense(): LicenseInfo;
24
+ /**
25
+ * 라이선스 검증
26
+ *
27
+ * 특정 기능이 현재 라이선스에서 사용 가능한지 확인합니다.
28
+ *
29
+ * @param feature - 확인할 기능
30
+ * @returns 검증 결과
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const result = checkLicense('motion-pro');
35
+ * if (result.valid) {
36
+ * // Pro 기능 사용
37
+ * }
38
+ * ```
39
+ */
40
+ export declare function checkLicense(feature: LicenseFeature): LicenseCheckResult;
41
+ /**
42
+ * 라이선스 확인 (간단한 boolean 반환)
43
+ *
44
+ * @param feature - 확인할 기능
45
+ * @returns 사용 가능 여부
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * if (hasLicense('motion-pro')) {
50
+ * // Pro 기능 사용
51
+ * }
52
+ * ```
53
+ */
54
+ export declare function hasLicense(feature: LicenseFeature): boolean;
55
+ /**
56
+ * 라이선스 필수 확인
57
+ *
58
+ * 라이선스가 없으면 에러를 throw합니다.
59
+ *
60
+ * @param feature - 확인할 기능
61
+ * @throws 라이선스가 없을 경우 에러
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * requireLicense('motion-pro');
66
+ * // Pro 기능 사용 (에러 없음)
67
+ * ```
68
+ */
69
+ export declare function requireLicense(feature: LicenseFeature): void;
70
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/framework/license/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAU/E;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,aAAa,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,CAAA;CAAE,GAAG,IAAI,CAE3G;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,WAAW,CAMxC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB,CAyCxE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAE3D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAM5D"}