@exem-ui/tailwindcss3 0.3.2-next.20260608091439 → 0.3.2-next.20260608091641

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.
@@ -1,4 +1,4 @@
1
- import { fontPreset, gradientTokens, gradientDirections, radius, colorKebab, textPreset, shadow, breakpoint } from '@exem-ui/core/tailwindcss';
1
+ import { fontPreset, textPreset, gradientTokens, gradientDirections, radius, colorKebab, shadow, breakpoint } from '@exem-ui/core/tailwindcss';
2
2
  import plugin from 'tailwindcss/plugin';
3
3
 
4
4
  // src/plugin.ts
@@ -33,8 +33,7 @@ function generateSafelistPatterns() {
33
33
  for (const key of shadowKeys) {
34
34
  patterns.push({ pattern: new RegExp(`^shadow-${key}$`) });
35
35
  }
36
- patterns.push({ pattern: /^text-(header|title|body|caption)-.+$/ });
37
- patterns.push({ pattern: /^text-code$/ });
36
+ patterns.push({ pattern: /^text-(header|title|body|caption|code)-.+$/ });
38
37
  const fontPresetKeys = Object.keys(fontPreset).join("|");
39
38
  patterns.push({ pattern: new RegExp(`^font-(${fontPresetKeys})$`) });
40
39
  return patterns;
@@ -49,11 +48,15 @@ var plugin_default = plugin(
49
48
  };
50
49
  }
51
50
  addUtilities(fontUtilities);
52
- addUtilities({
53
- ".text-code": {
54
- "font-family": "'JetBrains Mono', monospace"
51
+ const codeUtilities = {};
52
+ for (const key of Object.keys(textPreset)) {
53
+ if (key.startsWith("code-")) {
54
+ codeUtilities[`.text-${key}`] = {
55
+ "font-family": "'JetBrains Mono', monospace"
56
+ };
55
57
  }
56
- });
58
+ }
59
+ addUtilities(codeUtilities);
57
60
  for (const [name, colorStops] of Object.entries(gradientTokens)) {
58
61
  matchUtilities(
59
62
  {
@@ -92,5 +95,5 @@ var plugin_default = plugin(
92
95
  );
93
96
 
94
97
  export { plugin_default };
95
- //# sourceMappingURL=chunk-NS2LEUJB.mjs.map
96
- //# sourceMappingURL=chunk-NS2LEUJB.mjs.map
98
+ //# sourceMappingURL=chunk-B52SDVTQ.mjs.map
99
+ //# sourceMappingURL=chunk-B52SDVTQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin.ts"],"names":[],"mappings":"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","file":"chunk-B52SDVTQ.mjs","sourcesContent":["import {\n breakpoint,\n colorKebab,\n fontPreset,\n gradientDirections,\n gradientTokens,\n radius,\n shadow,\n textPreset,\n} from '@exem-ui/core/tailwindcss';\nimport plugin from 'tailwindcss/plugin';\n\n/**\n * 토큰에서 prefix 그룹을 추출하는 함수.\n * 예: 'text-primary' -> 'text', 'solid-accent-default' -> 'solid'\n */\nfunction extractPrefixes(tokenKeys: string[]): Set<string> {\n const prefixes = new Set<string>();\n\n for (const key of tokenKeys) {\n const firstPart = key.split('-')[0];\n if (firstPart) {\n prefixes.add(firstPart);\n }\n }\n\n return prefixes;\n}\n\n/**\n * 동적으로 safelist 패턴을 생성합니다.\n * 토큰에서 자동으로 prefix를 추출하여 패턴을 만듭니다.\n * 토큰이 변경되면 safelist도 자동으로 업데이트됩니다.\n */\nfunction generateSafelistPatterns() {\n const colorKeys = Object.keys(colorKebab);\n const radiusKeys = Object.keys(radius);\n const shadowKeys = Object.keys(shadow);\n\n const colorPrefixes = extractPrefixes(colorKeys);\n const patterns: Array<{ pattern: RegExp }> = [];\n\n // 배경색 패턴 (bg-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^bg-${prefix}-.+$`) });\n }\n\n // 텍스트 색상 패턴 (text-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^text-${prefix}-.+$`) });\n }\n\n // 보더 색상 패턴 (border-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^border-${prefix}-.+$`) });\n }\n\n // 반경 패턴 (rounded-)\n for (const key of radiusKeys) {\n patterns.push({ pattern: new RegExp(`^rounded-${key}$`) });\n }\n\n // 그림자 패턴 (shadow-)\n for (const key of shadowKeys) {\n patterns.push({ pattern: new RegExp(`^shadow-${key}$`) });\n }\n\n // 폰트 크기 패턴\n patterns.push({ pattern: /^text-(header|title|body|caption|code)-.+$/ });\n\n // 폰트 스타일 패턴 (fontPreset 토큰에서 자동 생성)\n const fontPresetKeys = Object.keys(fontPreset).join('|');\n patterns.push({ pattern: new RegExp(`^font-(${fontPresetKeys})$`) });\n\n return patterns;\n}\n\n/**\n * Exem 디자인 시스템 Tailwind CSS(v3.x) 플러그인.\n *\n * `@exem-ui/core/tailwindcss` 공통 토큰을 활용하여 Tailwind 테마를 확장하고\n * 동적 그라데이션 유틸리티와 자동 safelist를 제공합니다.\n *\n * 제공 기능:\n * - 색상: `@exem-ui/core` 디자인 토큰 색상 (extend)\n * - 반경: weak, medium, strong, hard (extend)\n * - 그림자: weak, medium, strong, hard\n * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code-1/2/3\n * - 동적 그라데이션: bg-gradient-exem-logo-[to-right] 등\n * - 브레이크포인트: md, lg, xl\n * - 동적 safelist: 토큰 기반 자동 패턴 생성\n *\n * @example\n * ```ts\n * // tailwind.config.ts\n * import exemPlugin from '@exem-ui/tailwindcss3';\n *\n * export default {\n * plugins: [exemPlugin],\n * };\n * ```\n */\nexport default plugin(\n ({ matchUtilities, addUtilities }) => {\n // font-* 유틸리티 (fontWeight + lineHeight)\n const fontUtilities: Record<string, Record<string, string>> = {};\n for (const [name, value] of Object.entries(fontPreset)) {\n fontUtilities[`.font-${name}`] = {\n 'font-weight': value.fontWeight,\n 'line-height': value.lineHeight,\n };\n }\n addUtilities(fontUtilities);\n\n const codeUtilities: Record<string, Record<string, string>> = {};\n for (const key of Object.keys(textPreset)) {\n if (key.startsWith('code-')) {\n codeUtilities[`.text-${key}`] = {\n 'font-family': \"'JetBrains Mono', monospace\",\n };\n }\n }\n addUtilities(codeUtilities);\n\n for (const [name, colorStops] of Object.entries(gradientTokens)) {\n matchUtilities(\n {\n [`bg-gradient-${name}`]: (direction: string) => ({\n backgroundImage: `linear-gradient(${direction}, ${colorStops})`,\n }),\n },\n {\n values: { ...gradientDirections },\n },\n );\n }\n },\n {\n safelist: generateSafelistPatterns(),\n theme: {\n screens: {\n ...breakpoint,\n },\n boxShadow: {\n ...shadow,\n },\n fontSize: {\n ...textPreset,\n },\n extend: {\n colors: {\n ...colorKebab,\n },\n borderRadius: {\n ...radius,\n },\n },\n },\n },\n);\n"]}
package/dist/index.js CHANGED
@@ -39,8 +39,7 @@ function generateSafelistPatterns() {
39
39
  for (const key of shadowKeys) {
40
40
  patterns.push({ pattern: new RegExp(`^shadow-${key}$`) });
41
41
  }
42
- patterns.push({ pattern: /^text-(header|title|body|caption)-.+$/ });
43
- patterns.push({ pattern: /^text-code$/ });
42
+ patterns.push({ pattern: /^text-(header|title|body|caption|code)-.+$/ });
44
43
  const fontPresetKeys = Object.keys(tailwindcss.fontPreset).join("|");
45
44
  patterns.push({ pattern: new RegExp(`^font-(${fontPresetKeys})$`) });
46
45
  return patterns;
@@ -55,11 +54,15 @@ var plugin_default = plugin__default.default(
55
54
  };
56
55
  }
57
56
  addUtilities(fontUtilities);
58
- addUtilities({
59
- ".text-code": {
60
- "font-family": "'JetBrains Mono', monospace"
57
+ const codeUtilities = {};
58
+ for (const key of Object.keys(tailwindcss.textPreset)) {
59
+ if (key.startsWith("code-")) {
60
+ codeUtilities[`.text-${key}`] = {
61
+ "font-family": "'JetBrains Mono', monospace"
62
+ };
61
63
  }
62
- });
64
+ }
65
+ addUtilities(codeUtilities);
63
66
  for (const [name, colorStops] of Object.entries(tailwindcss.gradientTokens)) {
64
67
  matchUtilities(
65
68
  {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts","../src/index.ts"],"names":["colorKebab","radius","shadow","fontPreset","plugin","gradientTokens","gradientDirections","breakpoint","textPreset"],"mappings":"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","file":"index.js","sourcesContent":["import {\n breakpoint,\n colorKebab,\n fontPreset,\n gradientDirections,\n gradientTokens,\n radius,\n shadow,\n textPreset,\n} from '@exem-ui/core/tailwindcss';\nimport plugin from 'tailwindcss/plugin';\n\n/**\n * 토큰에서 prefix 그룹을 추출하는 함수.\n * 예: 'text-primary' -> 'text', 'solid-accent-default' -> 'solid'\n */\nfunction extractPrefixes(tokenKeys: string[]): Set<string> {\n const prefixes = new Set<string>();\n\n for (const key of tokenKeys) {\n const firstPart = key.split('-')[0];\n if (firstPart) {\n prefixes.add(firstPart);\n }\n }\n\n return prefixes;\n}\n\n/**\n * 동적으로 safelist 패턴을 생성합니다.\n * 토큰에서 자동으로 prefix를 추출하여 패턴을 만듭니다.\n * 토큰이 변경되면 safelist도 자동으로 업데이트됩니다.\n */\nfunction generateSafelistPatterns() {\n const colorKeys = Object.keys(colorKebab);\n const radiusKeys = Object.keys(radius);\n const shadowKeys = Object.keys(shadow);\n\n const colorPrefixes = extractPrefixes(colorKeys);\n const patterns: Array<{ pattern: RegExp }> = [];\n\n // 배경색 패턴 (bg-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^bg-${prefix}-.+$`) });\n }\n\n // 텍스트 색상 패턴 (text-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^text-${prefix}-.+$`) });\n }\n\n // 보더 색상 패턴 (border-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^border-${prefix}-.+$`) });\n }\n\n // 반경 패턴 (rounded-)\n for (const key of radiusKeys) {\n patterns.push({ pattern: new RegExp(`^rounded-${key}$`) });\n }\n\n // 그림자 패턴 (shadow-)\n for (const key of shadowKeys) {\n patterns.push({ pattern: new RegExp(`^shadow-${key}$`) });\n }\n\n // 폰트 크기 패턴\n patterns.push({ pattern: /^text-(header|title|body|caption)-.+$/ });\n patterns.push({ pattern: /^text-code$/ });\n\n // 폰트 스타일 패턴 (fontPreset 토큰에서 자동 생성)\n const fontPresetKeys = Object.keys(fontPreset).join('|');\n patterns.push({ pattern: new RegExp(`^font-(${fontPresetKeys})$`) });\n\n return patterns;\n}\n\n/**\n * Exem 디자인 시스템 Tailwind CSS(v3.x) 플러그인.\n *\n * `@exem-ui/core/tailwindcss` 공통 토큰을 활용하여 Tailwind 테마를 확장하고\n * 동적 그라데이션 유틸리티와 자동 safelist를 제공합니다.\n *\n * 제공 기능:\n * - 색상: `@exem-ui/core` 디자인 토큰 색상 (extend)\n * - 반경: weak, medium, strong, hard (extend)\n * - 그림자: weak, medium, strong, hard\n * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code\n * - 동적 그라데이션: bg-gradient-exem-logo-[to-right] 등\n * - 브레이크포인트: md, lg, xl\n * - 동적 safelist: 토큰 기반 자동 패턴 생성\n *\n * @example\n * ```ts\n * // tailwind.config.ts\n * import exemPlugin from '@exem-ui/tailwindcss3';\n *\n * export default {\n * plugins: [exemPlugin],\n * };\n * ```\n */\nexport default plugin(\n ({ matchUtilities, addUtilities }) => {\n // font-* 유틸리티 (fontWeight + lineHeight)\n const fontUtilities: Record<string, Record<string, string>> = {};\n for (const [name, value] of Object.entries(fontPreset)) {\n fontUtilities[`.font-${name}`] = {\n 'font-weight': value.fontWeight,\n 'line-height': value.lineHeight,\n };\n }\n addUtilities(fontUtilities);\n\n // text-code: font-family 오버라이드 (font-size는 theme.fontSize에서 처리)\n addUtilities({\n '.text-code': {\n 'font-family': \"'JetBrains Mono', monospace\",\n },\n });\n\n for (const [name, colorStops] of Object.entries(gradientTokens)) {\n matchUtilities(\n {\n [`bg-gradient-${name}`]: (direction: string) => ({\n backgroundImage: `linear-gradient(${direction}, ${colorStops})`,\n }),\n },\n {\n values: { ...gradientDirections },\n },\n );\n }\n },\n {\n safelist: generateSafelistPatterns(),\n theme: {\n screens: {\n ...breakpoint,\n },\n boxShadow: {\n ...shadow,\n },\n fontSize: {\n ...textPreset,\n },\n extend: {\n colors: {\n ...colorKebab,\n },\n borderRadius: {\n ...radius,\n },\n },\n },\n },\n);\n","import plugin from './plugin';\n\nexport default plugin;\n"]}
1
+ {"version":3,"sources":["../src/plugin.ts","../src/index.ts"],"names":["colorKebab","radius","shadow","fontPreset","plugin","textPreset","gradientTokens","gradientDirections","breakpoint"],"mappings":"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","file":"index.js","sourcesContent":["import {\n breakpoint,\n colorKebab,\n fontPreset,\n gradientDirections,\n gradientTokens,\n radius,\n shadow,\n textPreset,\n} from '@exem-ui/core/tailwindcss';\nimport plugin from 'tailwindcss/plugin';\n\n/**\n * 토큰에서 prefix 그룹을 추출하는 함수.\n * 예: 'text-primary' -> 'text', 'solid-accent-default' -> 'solid'\n */\nfunction extractPrefixes(tokenKeys: string[]): Set<string> {\n const prefixes = new Set<string>();\n\n for (const key of tokenKeys) {\n const firstPart = key.split('-')[0];\n if (firstPart) {\n prefixes.add(firstPart);\n }\n }\n\n return prefixes;\n}\n\n/**\n * 동적으로 safelist 패턴을 생성합니다.\n * 토큰에서 자동으로 prefix를 추출하여 패턴을 만듭니다.\n * 토큰이 변경되면 safelist도 자동으로 업데이트됩니다.\n */\nfunction generateSafelistPatterns() {\n const colorKeys = Object.keys(colorKebab);\n const radiusKeys = Object.keys(radius);\n const shadowKeys = Object.keys(shadow);\n\n const colorPrefixes = extractPrefixes(colorKeys);\n const patterns: Array<{ pattern: RegExp }> = [];\n\n // 배경색 패턴 (bg-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^bg-${prefix}-.+$`) });\n }\n\n // 텍스트 색상 패턴 (text-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^text-${prefix}-.+$`) });\n }\n\n // 보더 색상 패턴 (border-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^border-${prefix}-.+$`) });\n }\n\n // 반경 패턴 (rounded-)\n for (const key of radiusKeys) {\n patterns.push({ pattern: new RegExp(`^rounded-${key}$`) });\n }\n\n // 그림자 패턴 (shadow-)\n for (const key of shadowKeys) {\n patterns.push({ pattern: new RegExp(`^shadow-${key}$`) });\n }\n\n // 폰트 크기 패턴\n patterns.push({ pattern: /^text-(header|title|body|caption|code)-.+$/ });\n\n // 폰트 스타일 패턴 (fontPreset 토큰에서 자동 생성)\n const fontPresetKeys = Object.keys(fontPreset).join('|');\n patterns.push({ pattern: new RegExp(`^font-(${fontPresetKeys})$`) });\n\n return patterns;\n}\n\n/**\n * Exem 디자인 시스템 Tailwind CSS(v3.x) 플러그인.\n *\n * `@exem-ui/core/tailwindcss` 공통 토큰을 활용하여 Tailwind 테마를 확장하고\n * 동적 그라데이션 유틸리티와 자동 safelist를 제공합니다.\n *\n * 제공 기능:\n * - 색상: `@exem-ui/core` 디자인 토큰 색상 (extend)\n * - 반경: weak, medium, strong, hard (extend)\n * - 그림자: weak, medium, strong, hard\n * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code-1/2/3\n * - 동적 그라데이션: bg-gradient-exem-logo-[to-right] 등\n * - 브레이크포인트: md, lg, xl\n * - 동적 safelist: 토큰 기반 자동 패턴 생성\n *\n * @example\n * ```ts\n * // tailwind.config.ts\n * import exemPlugin from '@exem-ui/tailwindcss3';\n *\n * export default {\n * plugins: [exemPlugin],\n * };\n * ```\n */\nexport default plugin(\n ({ matchUtilities, addUtilities }) => {\n // font-* 유틸리티 (fontWeight + lineHeight)\n const fontUtilities: Record<string, Record<string, string>> = {};\n for (const [name, value] of Object.entries(fontPreset)) {\n fontUtilities[`.font-${name}`] = {\n 'font-weight': value.fontWeight,\n 'line-height': value.lineHeight,\n };\n }\n addUtilities(fontUtilities);\n\n const codeUtilities: Record<string, Record<string, string>> = {};\n for (const key of Object.keys(textPreset)) {\n if (key.startsWith('code-')) {\n codeUtilities[`.text-${key}`] = {\n 'font-family': \"'JetBrains Mono', monospace\",\n };\n }\n }\n addUtilities(codeUtilities);\n\n for (const [name, colorStops] of Object.entries(gradientTokens)) {\n matchUtilities(\n {\n [`bg-gradient-${name}`]: (direction: string) => ({\n backgroundImage: `linear-gradient(${direction}, ${colorStops})`,\n }),\n },\n {\n values: { ...gradientDirections },\n },\n );\n }\n },\n {\n safelist: generateSafelistPatterns(),\n theme: {\n screens: {\n ...breakpoint,\n },\n boxShadow: {\n ...shadow,\n },\n fontSize: {\n ...textPreset,\n },\n extend: {\n colors: {\n ...colorKebab,\n },\n borderRadius: {\n ...radius,\n },\n },\n },\n },\n);\n","import plugin from './plugin';\n\nexport default plugin;\n"]}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { plugin_default } from './chunk-NS2LEUJB.mjs';
1
+ import { plugin_default } from './chunk-B52SDVTQ.mjs';
2
2
 
3
3
  // src/index.ts
4
4
  var src_default = plugin_default;
package/dist/plugin.d.mts CHANGED
@@ -10,7 +10,7 @@ import * as tailwindcss_types_config from 'tailwindcss/types/config';
10
10
  * - 색상: `@exem-ui/core` 디자인 토큰 색상 (extend)
11
11
  * - 반경: weak, medium, strong, hard (extend)
12
12
  * - 그림자: weak, medium, strong, hard
13
- * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code
13
+ * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code-1/2/3
14
14
  * - 동적 그라데이션: bg-gradient-exem-logo-[to-right] 등
15
15
  * - 브레이크포인트: md, lg, xl
16
16
  * - 동적 safelist: 토큰 기반 자동 패턴 생성
package/dist/plugin.d.ts CHANGED
@@ -10,7 +10,7 @@ import * as tailwindcss_types_config from 'tailwindcss/types/config';
10
10
  * - 색상: `@exem-ui/core` 디자인 토큰 색상 (extend)
11
11
  * - 반경: weak, medium, strong, hard (extend)
12
12
  * - 그림자: weak, medium, strong, hard
13
- * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code
13
+ * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code-1/2/3
14
14
  * - 동적 그라데이션: bg-gradient-exem-logo-[to-right] 등
15
15
  * - 브레이크포인트: md, lg, xl
16
16
  * - 동적 safelist: 토큰 기반 자동 패턴 생성
package/dist/plugin.js CHANGED
@@ -39,8 +39,7 @@ function generateSafelistPatterns() {
39
39
  for (const key of shadowKeys) {
40
40
  patterns.push({ pattern: new RegExp(`^shadow-${key}$`) });
41
41
  }
42
- patterns.push({ pattern: /^text-(header|title|body|caption)-.+$/ });
43
- patterns.push({ pattern: /^text-code$/ });
42
+ patterns.push({ pattern: /^text-(header|title|body|caption|code)-.+$/ });
44
43
  const fontPresetKeys = Object.keys(tailwindcss.fontPreset).join("|");
45
44
  patterns.push({ pattern: new RegExp(`^font-(${fontPresetKeys})$`) });
46
45
  return patterns;
@@ -55,11 +54,15 @@ var plugin_default = plugin__default.default(
55
54
  };
56
55
  }
57
56
  addUtilities(fontUtilities);
58
- addUtilities({
59
- ".text-code": {
60
- "font-family": "'JetBrains Mono', monospace"
57
+ const codeUtilities = {};
58
+ for (const key of Object.keys(tailwindcss.textPreset)) {
59
+ if (key.startsWith("code-")) {
60
+ codeUtilities[`.text-${key}`] = {
61
+ "font-family": "'JetBrains Mono', monospace"
62
+ };
61
63
  }
62
- });
64
+ }
65
+ addUtilities(codeUtilities);
63
66
  for (const [name, colorStops] of Object.entries(tailwindcss.gradientTokens)) {
64
67
  matchUtilities(
65
68
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"names":["colorKebab","radius","shadow","fontPreset","plugin","gradientTokens","gradientDirections","breakpoint","textPreset"],"mappings":"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","file":"plugin.js","sourcesContent":["import {\n breakpoint,\n colorKebab,\n fontPreset,\n gradientDirections,\n gradientTokens,\n radius,\n shadow,\n textPreset,\n} from '@exem-ui/core/tailwindcss';\nimport plugin from 'tailwindcss/plugin';\n\n/**\n * 토큰에서 prefix 그룹을 추출하는 함수.\n * 예: 'text-primary' -> 'text', 'solid-accent-default' -> 'solid'\n */\nfunction extractPrefixes(tokenKeys: string[]): Set<string> {\n const prefixes = new Set<string>();\n\n for (const key of tokenKeys) {\n const firstPart = key.split('-')[0];\n if (firstPart) {\n prefixes.add(firstPart);\n }\n }\n\n return prefixes;\n}\n\n/**\n * 동적으로 safelist 패턴을 생성합니다.\n * 토큰에서 자동으로 prefix를 추출하여 패턴을 만듭니다.\n * 토큰이 변경되면 safelist도 자동으로 업데이트됩니다.\n */\nfunction generateSafelistPatterns() {\n const colorKeys = Object.keys(colorKebab);\n const radiusKeys = Object.keys(radius);\n const shadowKeys = Object.keys(shadow);\n\n const colorPrefixes = extractPrefixes(colorKeys);\n const patterns: Array<{ pattern: RegExp }> = [];\n\n // 배경색 패턴 (bg-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^bg-${prefix}-.+$`) });\n }\n\n // 텍스트 색상 패턴 (text-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^text-${prefix}-.+$`) });\n }\n\n // 보더 색상 패턴 (border-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^border-${prefix}-.+$`) });\n }\n\n // 반경 패턴 (rounded-)\n for (const key of radiusKeys) {\n patterns.push({ pattern: new RegExp(`^rounded-${key}$`) });\n }\n\n // 그림자 패턴 (shadow-)\n for (const key of shadowKeys) {\n patterns.push({ pattern: new RegExp(`^shadow-${key}$`) });\n }\n\n // 폰트 크기 패턴\n patterns.push({ pattern: /^text-(header|title|body|caption)-.+$/ });\n patterns.push({ pattern: /^text-code$/ });\n\n // 폰트 스타일 패턴 (fontPreset 토큰에서 자동 생성)\n const fontPresetKeys = Object.keys(fontPreset).join('|');\n patterns.push({ pattern: new RegExp(`^font-(${fontPresetKeys})$`) });\n\n return patterns;\n}\n\n/**\n * Exem 디자인 시스템 Tailwind CSS(v3.x) 플러그인.\n *\n * `@exem-ui/core/tailwindcss` 공통 토큰을 활용하여 Tailwind 테마를 확장하고\n * 동적 그라데이션 유틸리티와 자동 safelist를 제공합니다.\n *\n * 제공 기능:\n * - 색상: `@exem-ui/core` 디자인 토큰 색상 (extend)\n * - 반경: weak, medium, strong, hard (extend)\n * - 그림자: weak, medium, strong, hard\n * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code\n * - 동적 그라데이션: bg-gradient-exem-logo-[to-right] 등\n * - 브레이크포인트: md, lg, xl\n * - 동적 safelist: 토큰 기반 자동 패턴 생성\n *\n * @example\n * ```ts\n * // tailwind.config.ts\n * import exemPlugin from '@exem-ui/tailwindcss3';\n *\n * export default {\n * plugins: [exemPlugin],\n * };\n * ```\n */\nexport default plugin(\n ({ matchUtilities, addUtilities }) => {\n // font-* 유틸리티 (fontWeight + lineHeight)\n const fontUtilities: Record<string, Record<string, string>> = {};\n for (const [name, value] of Object.entries(fontPreset)) {\n fontUtilities[`.font-${name}`] = {\n 'font-weight': value.fontWeight,\n 'line-height': value.lineHeight,\n };\n }\n addUtilities(fontUtilities);\n\n // text-code: font-family 오버라이드 (font-size는 theme.fontSize에서 처리)\n addUtilities({\n '.text-code': {\n 'font-family': \"'JetBrains Mono', monospace\",\n },\n });\n\n for (const [name, colorStops] of Object.entries(gradientTokens)) {\n matchUtilities(\n {\n [`bg-gradient-${name}`]: (direction: string) => ({\n backgroundImage: `linear-gradient(${direction}, ${colorStops})`,\n }),\n },\n {\n values: { ...gradientDirections },\n },\n );\n }\n },\n {\n safelist: generateSafelistPatterns(),\n theme: {\n screens: {\n ...breakpoint,\n },\n boxShadow: {\n ...shadow,\n },\n fontSize: {\n ...textPreset,\n },\n extend: {\n colors: {\n ...colorKebab,\n },\n borderRadius: {\n ...radius,\n },\n },\n },\n },\n);\n"]}
1
+ {"version":3,"sources":["../src/plugin.ts"],"names":["colorKebab","radius","shadow","fontPreset","plugin","textPreset","gradientTokens","gradientDirections","breakpoint"],"mappings":"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","file":"plugin.js","sourcesContent":["import {\n breakpoint,\n colorKebab,\n fontPreset,\n gradientDirections,\n gradientTokens,\n radius,\n shadow,\n textPreset,\n} from '@exem-ui/core/tailwindcss';\nimport plugin from 'tailwindcss/plugin';\n\n/**\n * 토큰에서 prefix 그룹을 추출하는 함수.\n * 예: 'text-primary' -> 'text', 'solid-accent-default' -> 'solid'\n */\nfunction extractPrefixes(tokenKeys: string[]): Set<string> {\n const prefixes = new Set<string>();\n\n for (const key of tokenKeys) {\n const firstPart = key.split('-')[0];\n if (firstPart) {\n prefixes.add(firstPart);\n }\n }\n\n return prefixes;\n}\n\n/**\n * 동적으로 safelist 패턴을 생성합니다.\n * 토큰에서 자동으로 prefix를 추출하여 패턴을 만듭니다.\n * 토큰이 변경되면 safelist도 자동으로 업데이트됩니다.\n */\nfunction generateSafelistPatterns() {\n const colorKeys = Object.keys(colorKebab);\n const radiusKeys = Object.keys(radius);\n const shadowKeys = Object.keys(shadow);\n\n const colorPrefixes = extractPrefixes(colorKeys);\n const patterns: Array<{ pattern: RegExp }> = [];\n\n // 배경색 패턴 (bg-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^bg-${prefix}-.+$`) });\n }\n\n // 텍스트 색상 패턴 (text-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^text-${prefix}-.+$`) });\n }\n\n // 보더 색상 패턴 (border-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^border-${prefix}-.+$`) });\n }\n\n // 반경 패턴 (rounded-)\n for (const key of radiusKeys) {\n patterns.push({ pattern: new RegExp(`^rounded-${key}$`) });\n }\n\n // 그림자 패턴 (shadow-)\n for (const key of shadowKeys) {\n patterns.push({ pattern: new RegExp(`^shadow-${key}$`) });\n }\n\n // 폰트 크기 패턴\n patterns.push({ pattern: /^text-(header|title|body|caption|code)-.+$/ });\n\n // 폰트 스타일 패턴 (fontPreset 토큰에서 자동 생성)\n const fontPresetKeys = Object.keys(fontPreset).join('|');\n patterns.push({ pattern: new RegExp(`^font-(${fontPresetKeys})$`) });\n\n return patterns;\n}\n\n/**\n * Exem 디자인 시스템 Tailwind CSS(v3.x) 플러그인.\n *\n * `@exem-ui/core/tailwindcss` 공통 토큰을 활용하여 Tailwind 테마를 확장하고\n * 동적 그라데이션 유틸리티와 자동 safelist를 제공합니다.\n *\n * 제공 기능:\n * - 색상: `@exem-ui/core` 디자인 토큰 색상 (extend)\n * - 반경: weak, medium, strong, hard (extend)\n * - 그림자: weak, medium, strong, hard\n * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code-1/2/3\n * - 동적 그라데이션: bg-gradient-exem-logo-[to-right] 등\n * - 브레이크포인트: md, lg, xl\n * - 동적 safelist: 토큰 기반 자동 패턴 생성\n *\n * @example\n * ```ts\n * // tailwind.config.ts\n * import exemPlugin from '@exem-ui/tailwindcss3';\n *\n * export default {\n * plugins: [exemPlugin],\n * };\n * ```\n */\nexport default plugin(\n ({ matchUtilities, addUtilities }) => {\n // font-* 유틸리티 (fontWeight + lineHeight)\n const fontUtilities: Record<string, Record<string, string>> = {};\n for (const [name, value] of Object.entries(fontPreset)) {\n fontUtilities[`.font-${name}`] = {\n 'font-weight': value.fontWeight,\n 'line-height': value.lineHeight,\n };\n }\n addUtilities(fontUtilities);\n\n const codeUtilities: Record<string, Record<string, string>> = {};\n for (const key of Object.keys(textPreset)) {\n if (key.startsWith('code-')) {\n codeUtilities[`.text-${key}`] = {\n 'font-family': \"'JetBrains Mono', monospace\",\n };\n }\n }\n addUtilities(codeUtilities);\n\n for (const [name, colorStops] of Object.entries(gradientTokens)) {\n matchUtilities(\n {\n [`bg-gradient-${name}`]: (direction: string) => ({\n backgroundImage: `linear-gradient(${direction}, ${colorStops})`,\n }),\n },\n {\n values: { ...gradientDirections },\n },\n );\n }\n },\n {\n safelist: generateSafelistPatterns(),\n theme: {\n screens: {\n ...breakpoint,\n },\n boxShadow: {\n ...shadow,\n },\n fontSize: {\n ...textPreset,\n },\n extend: {\n colors: {\n ...colorKebab,\n },\n borderRadius: {\n ...radius,\n },\n },\n },\n },\n);\n"]}
package/dist/plugin.mjs CHANGED
@@ -1,3 +1,3 @@
1
- export { plugin_default as default } from './chunk-NS2LEUJB.mjs';
1
+ export { plugin_default as default } from './chunk-B52SDVTQ.mjs';
2
2
  //# sourceMappingURL=plugin.mjs.map
3
3
  //# sourceMappingURL=plugin.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exem-ui/tailwindcss3",
3
- "version": "0.3.2-next.20260608091439",
3
+ "version": "0.3.2-next.20260608091641",
4
4
  "description": "Exem Design System - Tailwind CSS 3 Plugin",
5
5
  "author": "Exem Design Team",
6
6
  "license": "Apache-2.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"names":[],"mappings":"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","file":"chunk-NS2LEUJB.mjs","sourcesContent":["import {\n breakpoint,\n colorKebab,\n fontPreset,\n gradientDirections,\n gradientTokens,\n radius,\n shadow,\n textPreset,\n} from '@exem-ui/core/tailwindcss';\nimport plugin from 'tailwindcss/plugin';\n\n/**\n * 토큰에서 prefix 그룹을 추출하는 함수.\n * 예: 'text-primary' -> 'text', 'solid-accent-default' -> 'solid'\n */\nfunction extractPrefixes(tokenKeys: string[]): Set<string> {\n const prefixes = new Set<string>();\n\n for (const key of tokenKeys) {\n const firstPart = key.split('-')[0];\n if (firstPart) {\n prefixes.add(firstPart);\n }\n }\n\n return prefixes;\n}\n\n/**\n * 동적으로 safelist 패턴을 생성합니다.\n * 토큰에서 자동으로 prefix를 추출하여 패턴을 만듭니다.\n * 토큰이 변경되면 safelist도 자동으로 업데이트됩니다.\n */\nfunction generateSafelistPatterns() {\n const colorKeys = Object.keys(colorKebab);\n const radiusKeys = Object.keys(radius);\n const shadowKeys = Object.keys(shadow);\n\n const colorPrefixes = extractPrefixes(colorKeys);\n const patterns: Array<{ pattern: RegExp }> = [];\n\n // 배경색 패턴 (bg-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^bg-${prefix}-.+$`) });\n }\n\n // 텍스트 색상 패턴 (text-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^text-${prefix}-.+$`) });\n }\n\n // 보더 색상 패턴 (border-)\n for (const prefix of colorPrefixes) {\n patterns.push({ pattern: new RegExp(`^border-${prefix}-.+$`) });\n }\n\n // 반경 패턴 (rounded-)\n for (const key of radiusKeys) {\n patterns.push({ pattern: new RegExp(`^rounded-${key}$`) });\n }\n\n // 그림자 패턴 (shadow-)\n for (const key of shadowKeys) {\n patterns.push({ pattern: new RegExp(`^shadow-${key}$`) });\n }\n\n // 폰트 크기 패턴\n patterns.push({ pattern: /^text-(header|title|body|caption)-.+$/ });\n patterns.push({ pattern: /^text-code$/ });\n\n // 폰트 스타일 패턴 (fontPreset 토큰에서 자동 생성)\n const fontPresetKeys = Object.keys(fontPreset).join('|');\n patterns.push({ pattern: new RegExp(`^font-(${fontPresetKeys})$`) });\n\n return patterns;\n}\n\n/**\n * Exem 디자인 시스템 Tailwind CSS(v3.x) 플러그인.\n *\n * `@exem-ui/core/tailwindcss` 공통 토큰을 활용하여 Tailwind 테마를 확장하고\n * 동적 그라데이션 유틸리티와 자동 safelist를 제공합니다.\n *\n * 제공 기능:\n * - 색상: `@exem-ui/core` 디자인 토큰 색상 (extend)\n * - 반경: weak, medium, strong, hard (extend)\n * - 그림자: weak, medium, strong, hard\n * - 타이포그래피: text-header-1/2, text-title-1/2, text-body-1/2/3, text-caption, text-code\n * - 동적 그라데이션: bg-gradient-exem-logo-[to-right] 등\n * - 브레이크포인트: md, lg, xl\n * - 동적 safelist: 토큰 기반 자동 패턴 생성\n *\n * @example\n * ```ts\n * // tailwind.config.ts\n * import exemPlugin from '@exem-ui/tailwindcss3';\n *\n * export default {\n * plugins: [exemPlugin],\n * };\n * ```\n */\nexport default plugin(\n ({ matchUtilities, addUtilities }) => {\n // font-* 유틸리티 (fontWeight + lineHeight)\n const fontUtilities: Record<string, Record<string, string>> = {};\n for (const [name, value] of Object.entries(fontPreset)) {\n fontUtilities[`.font-${name}`] = {\n 'font-weight': value.fontWeight,\n 'line-height': value.lineHeight,\n };\n }\n addUtilities(fontUtilities);\n\n // text-code: font-family 오버라이드 (font-size는 theme.fontSize에서 처리)\n addUtilities({\n '.text-code': {\n 'font-family': \"'JetBrains Mono', monospace\",\n },\n });\n\n for (const [name, colorStops] of Object.entries(gradientTokens)) {\n matchUtilities(\n {\n [`bg-gradient-${name}`]: (direction: string) => ({\n backgroundImage: `linear-gradient(${direction}, ${colorStops})`,\n }),\n },\n {\n values: { ...gradientDirections },\n },\n );\n }\n },\n {\n safelist: generateSafelistPatterns(),\n theme: {\n screens: {\n ...breakpoint,\n },\n boxShadow: {\n ...shadow,\n },\n fontSize: {\n ...textPreset,\n },\n extend: {\n colors: {\n ...colorKebab,\n },\n borderRadius: {\n ...radius,\n },\n },\n },\n },\n);\n"]}