@tendaui/components 1.3.0 → 1.3.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 (142) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +176 -176
  3. package/button/_example/ghost.tsx +2 -5
  4. package/color-picker/utils/color-picker/cmyk.ts +89 -89
  5. package/color-picker/utils/color-picker/color.ts +467 -467
  6. package/color-picker/utils/color-picker/constants.ts +187 -187
  7. package/color-picker/utils/color-picker/draggable.ts +99 -99
  8. package/color-picker/utils/color-picker/format.ts +90 -90
  9. package/color-picker/utils/color-picker/gradient.ts +237 -237
  10. package/color-picker/utils/color-picker/index.ts +7 -7
  11. package/color-picker/utils/color-picker/types.ts +33 -33
  12. package/dialog/hooks/useDialogPosition.ts +35 -35
  13. package/form/type.ts +519 -519
  14. package/global-config/default-config.ts +95 -95
  15. package/global-config/locale/ar_KW.ts +259 -259
  16. package/global-config/locale/en_US.ts +265 -265
  17. package/global-config/locale/it_IT.ts +264 -264
  18. package/global-config/locale/ja_JP.ts +264 -264
  19. package/global-config/locale/ko_KR.ts +264 -264
  20. package/global-config/locale/ru_RU.ts +277 -277
  21. package/global-config/locale/zh_CN.ts +265 -265
  22. package/global-config/locale/zh_TW.ts +265 -265
  23. package/global-config/mobile/default-config.ts +6 -6
  24. package/global-config/mobile/locale/ar_KW.ts +112 -112
  25. package/global-config/mobile/locale/en_US.ts +113 -113
  26. package/global-config/mobile/locale/it_IT.ts +113 -113
  27. package/global-config/mobile/locale/ja_JP.ts +100 -100
  28. package/global-config/mobile/locale/ko_KR.ts +100 -100
  29. package/global-config/mobile/locale/ru_RU.ts +112 -112
  30. package/global-config/mobile/locale/zh_CN.ts +100 -100
  31. package/global-config/mobile/locale/zh_TW.ts +100 -100
  32. package/global-config/t.ts +111 -111
  33. package/input-number/InputNumber.tsx +124 -124
  34. package/input-number/defaultProps.ts +17 -17
  35. package/input-number/index.ts +9 -9
  36. package/input-number/style/css.js +1 -1
  37. package/input-number/style/index.js +1 -1
  38. package/input-number/useInputNumber.tsx +270 -270
  39. package/list/ListItem.tsx +36 -36
  40. package/list/ListItemMeta.tsx +40 -40
  41. package/list/defaultProps.ts +11 -11
  42. package/list/hooks/useListVirtualScroll.ts +82 -82
  43. package/list/style/css.js +1 -1
  44. package/list/style/index.js +1 -1
  45. package/locale/LocalReceiver.ts +55 -55
  46. package/locale/ar_KW.ts +7 -7
  47. package/locale/en_US.ts +7 -7
  48. package/locale/it_IT.ts +6 -6
  49. package/locale/ja_JP.ts +6 -6
  50. package/locale/ko_KR.ts +6 -6
  51. package/locale/ru_RU.ts +6 -6
  52. package/locale/zh_CN.ts +5 -5
  53. package/locale/zh_TW.ts +7 -7
  54. package/package.json +2 -2
  55. package/radio/_example/default.tsx +2 -2
  56. package/select/type.ts +382 -382
  57. package/select-input/type.ts +280 -280
  58. package/slider/SliderHandleButton.tsx +50 -50
  59. package/slider/defaultProps.ts +15 -15
  60. package/slider/style/css.js +1 -1
  61. package/slider/style/index.js +1 -1
  62. package/styles/_global.scss +40 -40
  63. package/styles/_vars.scss +374 -374
  64. package/styles/components/alert/_index.scss +175 -175
  65. package/styles/components/alert/_vars.scss +41 -41
  66. package/styles/components/badge/_index.scss +71 -71
  67. package/styles/components/badge/_vars.scss +26 -26
  68. package/styles/components/button/_index.scss +499 -499
  69. package/styles/components/button/_mixins.scss +40 -40
  70. package/styles/components/button/_vars.scss +121 -121
  71. package/styles/components/checkbox/_index.scss +158 -158
  72. package/styles/components/checkbox/_var.scss +59 -59
  73. package/styles/components/color-picker/_index.scss +586 -586
  74. package/styles/components/color-picker/_vars.scss +79 -79
  75. package/styles/components/dialog/_animate.scss +133 -133
  76. package/styles/components/dialog/_index.scss +310 -310
  77. package/styles/components/dialog/_vars.scss +60 -60
  78. package/styles/components/drawer/_index.scss +206 -206
  79. package/styles/components/drawer/_var.scss +55 -55
  80. package/styles/components/fireworks/_index.scss +86 -86
  81. package/styles/components/fireworks/_vars.scss +5 -5
  82. package/styles/components/form/_index.scss +175 -175
  83. package/styles/components/form/_mixins.scss +74 -74
  84. package/styles/components/form/_vars.scss +101 -101
  85. package/styles/components/input/_index.scss +350 -350
  86. package/styles/components/input/_mixins.scss +120 -120
  87. package/styles/components/input/_vars.scss +130 -130
  88. package/styles/components/input-number/_index.scss +327 -327
  89. package/styles/components/input-number/_vars.scss +56 -56
  90. package/styles/components/ip-input/_index.scss +277 -277
  91. package/styles/components/layout/_index.scss +47 -47
  92. package/styles/components/layout/_vars.scss +19 -19
  93. package/styles/components/layout/doc.scss +74 -74
  94. package/styles/components/list/_index.scss +172 -172
  95. package/styles/components/list/_vars.scss +42 -42
  96. package/styles/components/loading/_index.scss +113 -113
  97. package/styles/components/loading/_vars.scss +40 -40
  98. package/styles/components/notification/_index.scss +140 -140
  99. package/styles/components/notification/_mixins.scss +13 -13
  100. package/styles/components/notification/_vars.scss +60 -60
  101. package/styles/components/popup/_index.scss +78 -78
  102. package/styles/components/popup/_mixin.scss +149 -149
  103. package/styles/components/popup/_vars.scss +33 -33
  104. package/styles/components/radio/_index.scss +376 -376
  105. package/styles/components/radio/_vars.scss +89 -89
  106. package/styles/components/select/_index.scss +291 -291
  107. package/styles/components/select/_var.scss +64 -64
  108. package/styles/components/select-input/_index.scss +5 -5
  109. package/styles/components/select-input/_var.scss +4 -4
  110. package/styles/components/slider/_index.scss +241 -241
  111. package/styles/components/slider/_vars.scss +51 -51
  112. package/styles/components/switch/_index.scss +175 -175
  113. package/styles/components/switch/_vars.scss +63 -63
  114. package/styles/components/table/_index.scss +194 -194
  115. package/styles/components/table/_var.scss +52 -52
  116. package/styles/components/tabs/_index.scss +165 -165
  117. package/styles/components/tabs/_mixins.scss +11 -11
  118. package/styles/components/tabs/_vars.scss +72 -72
  119. package/styles/components/tag/_index.scss +317 -317
  120. package/styles/components/tag/_var.scss +86 -86
  121. package/styles/components/tag-input/_index.scss +164 -164
  122. package/styles/components/tag-input/_vars.scss +17 -17
  123. package/styles/mixins/_focus.scss +8 -8
  124. package/styles/mixins/_layout.scss +32 -32
  125. package/styles/mixins/_reset.scss +11 -11
  126. package/styles/mixins/_scrollbar.scss +32 -32
  127. package/styles/mixins/_text.scss +50 -50
  128. package/styles/themes/_dark.scss +169 -169
  129. package/styles/themes/_font.scss +69 -69
  130. package/styles/themes/_index.scss +5 -5
  131. package/styles/themes/_light.scss +170 -170
  132. package/styles/themes/_radius.scss +9 -9
  133. package/styles/themes/_size.scss +68 -68
  134. package/styles/utilities/_animation.scss +58 -58
  135. package/styles/utilities/_tips.scss +10 -10
  136. package/switch/_example/with-label.tsx +1 -1
  137. package/utils/input-number/large-number.ts +423 -423
  138. package/utils/input-number/number.ts +257 -257
  139. package/utils/log/index.ts +3 -3
  140. package/utils/log/log.ts +29 -29
  141. package/utils/log/types.ts +9 -9
  142. package/utils/style.ts +58 -58
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 TendaUI
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2024 TendaUI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,176 +1,176 @@
1
- # @tendaui/components
2
-
3
- TendaUI React 组件库的源代码包,包含所有 UI 组件的实现。
4
-
5
- ## 📦 安装
6
-
7
- 在 monorepo 的其他包中使用 `workspace` 协议安装:
8
-
9
- ```bash
10
- pnpm add @tendaui/components@workspace:*
11
- ```
12
-
13
- ## 🔗 在其他包中使用
14
-
15
- ### 1. 在 package.json 中添加依赖
16
-
17
- ```json
18
- {
19
- "dependencies": {
20
- "@tendaui/components": "workspace:*"
21
- }
22
- }
23
- ```
24
-
25
- ### 2. 在代码中导入使用
26
-
27
- #### 导入单个组件
28
-
29
- ```tsx
30
- import { Button } from "@tendaui/components";
31
- import "@tendaui/components/button/style";
32
-
33
- function App() {
34
- return <Button type="primary">点击我</Button>;
35
- }
36
- ```
37
-
38
- #### 导入多个组件
39
-
40
- ```tsx
41
- import { Button, Input, Form } from "@tendaui/components";
42
- import "@tendaui/components/styles/globals.css";
43
-
44
- function App() {
45
- return (
46
- <Form>
47
- <Input placeholder="请输入" />
48
- <Button type="primary">提交</Button>
49
- </Form>
50
- );
51
- }
52
- ```
53
-
54
- #### 按需导入组件
55
-
56
- ```tsx
57
- // 导入单个组件的所有导出
58
- import Button from "@tendaui/components/button";
59
- import "@tendaui/components/button/style";
60
-
61
- // 或者导入特定文件
62
- import { Button } from "@tendaui/components/button";
63
- ```
64
-
65
- #### 导入 Hooks
66
-
67
- ```tsx
68
- import { useConfig, useControlled } from "@tendaui/components/hooks";
69
- ```
70
-
71
- #### 导入工具函数
72
-
73
- ```tsx
74
- import { composeRefs, parseTNode } from "@tendaui/components/utils";
75
- ```
76
-
77
- ## 📝 TypeScript 支持
78
-
79
- 如果需要在 TypeScript 项目中使用,可以在 `tsconfig.json` 中添加路径映射:
80
-
81
- ```json
82
- {
83
- "compilerOptions": {
84
- "paths": {
85
- "@tendaui/components": ["../../packages/components"],
86
- "@tendaui/components/*": ["../../packages/components/*"]
87
- }
88
- }
89
- }
90
- ```
91
-
92
- ## 🎯 使用场景
93
-
94
- ### 场景 1: 在 `tendaui-react` 包中使用
95
-
96
- `tendaui-react` 包可以依赖 `@tendaui/components` 来构建最终发布的包:
97
-
98
- ```json
99
- {
100
- "name": "tendaui-react",
101
- "dependencies": {
102
- "@tendaui/components": "workspace:*"
103
- }
104
- }
105
- ```
106
-
107
- ### 场景 2: 在文档包中使用
108
-
109
- 在 Storybook 或其他文档工具中直接使用组件:
110
-
111
- ```tsx
112
- import { Button } from "@tendaui/components";
113
- import { Meta, Story } from "@storybook/react";
114
-
115
- export default {
116
- title: "Components/Button",
117
- component: Button
118
- } as Meta;
119
- ```
120
-
121
- ### 场景 3: 在测试中使用
122
-
123
- 在测试文件中导入组件进行测试:
124
-
125
- ```tsx
126
- import { render, screen } from "@testing-library/react";
127
- import { Button } from "@tendaui/components";
128
-
129
- test("renders button", () => {
130
- render(<Button>Test</Button>);
131
- expect(screen.getByText("Test")).toBeInTheDocument();
132
- });
133
- ```
134
-
135
- ## 📋 可用组件
136
-
137
- - `Alert` - 警告提示
138
- - `Badge` - 徽标
139
- - `Button` - 按钮
140
- - `Checkbox` - 复选框
141
- - `ConfigProvider` - 全局配置
142
- - `Dialog` - 对话框
143
- - `Form` - 表单
144
- - `Input` - 输入框
145
- - `Loading` - 加载中
146
- - `Notification` - 通知
147
- - `Popup` - 弹出层
148
- - `Select` - 选择器
149
- - `SelectInput` - 选择输入框
150
- - `Switch` - 开关
151
- - `Tag` - 标签
152
- - `TagInput` - 标签输入框
153
-
154
- ## 🔧 开发
155
-
156
- ### 本地开发
157
-
158
- 由于这是一个源代码包,修改组件代码后,使用它的包会自动看到更改(如果配置了正确的构建工具)。
159
-
160
- ### 构建
161
-
162
- 如果需要构建这个包,可以添加构建脚本:
163
-
164
- ```json
165
- {
166
- "scripts": {
167
- "build": "tsc --build"
168
- }
169
- }
170
- ```
171
-
172
- ## 📚 相关文档
173
-
174
- - [Monorepo 最佳实践](../../MONOREPO.md)
175
- - [发布指南](../../PUBLISH.md)
176
- - [Lerna 使用指南](../../LERNA.md)
1
+ # @tendaui/components
2
+
3
+ TendaUI React 组件库的源代码包,包含所有 UI 组件的实现。
4
+
5
+ ## 📦 安装
6
+
7
+ 在 monorepo 的其他包中使用 `workspace` 协议安装:
8
+
9
+ ```bash
10
+ pnpm add @tendaui/components@workspace:*
11
+ ```
12
+
13
+ ## 🔗 在其他包中使用
14
+
15
+ ### 1. 在 package.json 中添加依赖
16
+
17
+ ```json
18
+ {
19
+ "dependencies": {
20
+ "@tendaui/components": "workspace:*"
21
+ }
22
+ }
23
+ ```
24
+
25
+ ### 2. 在代码中导入使用
26
+
27
+ #### 导入单个组件
28
+
29
+ ```tsx
30
+ import { Button } from "@tendaui/components";
31
+ import "@tendaui/components/button/style";
32
+
33
+ function App() {
34
+ return <Button type="primary">点击我</Button>;
35
+ }
36
+ ```
37
+
38
+ #### 导入多个组件
39
+
40
+ ```tsx
41
+ import { Button, Input, Form } from "@tendaui/components";
42
+ import "@tendaui/components/styles/globals.css";
43
+
44
+ function App() {
45
+ return (
46
+ <Form>
47
+ <Input placeholder="请输入" />
48
+ <Button type="primary">提交</Button>
49
+ </Form>
50
+ );
51
+ }
52
+ ```
53
+
54
+ #### 按需导入组件
55
+
56
+ ```tsx
57
+ // 导入单个组件的所有导出
58
+ import Button from "@tendaui/components/button";
59
+ import "@tendaui/components/button/style";
60
+
61
+ // 或者导入特定文件
62
+ import { Button } from "@tendaui/components/button";
63
+ ```
64
+
65
+ #### 导入 Hooks
66
+
67
+ ```tsx
68
+ import { useConfig, useControlled } from "@tendaui/components/hooks";
69
+ ```
70
+
71
+ #### 导入工具函数
72
+
73
+ ```tsx
74
+ import { composeRefs, parseTNode } from "@tendaui/components/utils";
75
+ ```
76
+
77
+ ## 📝 TypeScript 支持
78
+
79
+ 如果需要在 TypeScript 项目中使用,可以在 `tsconfig.json` 中添加路径映射:
80
+
81
+ ```json
82
+ {
83
+ "compilerOptions": {
84
+ "paths": {
85
+ "@tendaui/components": ["../../packages/components"],
86
+ "@tendaui/components/*": ["../../packages/components/*"]
87
+ }
88
+ }
89
+ }
90
+ ```
91
+
92
+ ## 🎯 使用场景
93
+
94
+ ### 场景 1: 在 `tendaui-react` 包中使用
95
+
96
+ `tendaui-react` 包可以依赖 `@tendaui/components` 来构建最终发布的包:
97
+
98
+ ```json
99
+ {
100
+ "name": "tendaui-react",
101
+ "dependencies": {
102
+ "@tendaui/components": "workspace:*"
103
+ }
104
+ }
105
+ ```
106
+
107
+ ### 场景 2: 在文档包中使用
108
+
109
+ 在 Storybook 或其他文档工具中直接使用组件:
110
+
111
+ ```tsx
112
+ import { Button } from "@tendaui/components";
113
+ import { Meta, Story } from "@storybook/react";
114
+
115
+ export default {
116
+ title: "Components/Button",
117
+ component: Button
118
+ } as Meta;
119
+ ```
120
+
121
+ ### 场景 3: 在测试中使用
122
+
123
+ 在测试文件中导入组件进行测试:
124
+
125
+ ```tsx
126
+ import { render, screen } from "@testing-library/react";
127
+ import { Button } from "@tendaui/components";
128
+
129
+ test("renders button", () => {
130
+ render(<Button>Test</Button>);
131
+ expect(screen.getByText("Test")).toBeInTheDocument();
132
+ });
133
+ ```
134
+
135
+ ## 📋 可用组件
136
+
137
+ - `Alert` - 警告提示
138
+ - `Badge` - 徽标
139
+ - `Button` - 按钮
140
+ - `Checkbox` - 复选框
141
+ - `ConfigProvider` - 全局配置
142
+ - `Dialog` - 对话框
143
+ - `Form` - 表单
144
+ - `Input` - 输入框
145
+ - `Loading` - 加载中
146
+ - `Notification` - 通知
147
+ - `Popup` - 弹出层
148
+ - `Select` - 选择器
149
+ - `SelectInput` - 选择输入框
150
+ - `Switch` - 开关
151
+ - `Tag` - 标签
152
+ - `TagInput` - 标签输入框
153
+
154
+ ## 🔧 开发
155
+
156
+ ### 本地开发
157
+
158
+ 由于这是一个源代码包,修改组件代码后,使用它的包会自动看到更改(如果配置了正确的构建工具)。
159
+
160
+ ### 构建
161
+
162
+ 如果需要构建这个包,可以添加构建脚本:
163
+
164
+ ```json
165
+ {
166
+ "scripts": {
167
+ "build": "tsc --build"
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## 📚 相关文档
173
+
174
+ - [Monorepo 最佳实践](../../MONOREPO.md)
175
+ - [发布指南](../../PUBLISH.md)
176
+ - [Lerna 使用指南](../../LERNA.md)
@@ -3,10 +3,7 @@ import { Button } from "@tendaui/react";
3
3
 
4
4
  export default function Ghost() {
5
5
  return (
6
- <div style={{ display: "flex", gap: "12px", padding: "24px", flexWrap: "wrap", backgroundColor: "#f5f5f5" }}>
7
- <Button ghost theme="default">
8
- 默认
9
- </Button>
6
+ <div style={{ display: "flex", gap: "12px", padding: "24px", flexWrap: "wrap" }}>
10
7
  <Button ghost theme="primary">
11
8
  主要
12
9
  </Button>
@@ -21,4 +18,4 @@ export default function Ghost() {
21
18
  </Button>
22
19
  </div>
23
20
  );
24
- }
21
+ }
@@ -1,89 +1,89 @@
1
- /**
2
- * rgb 转 cmyk
3
- * @param red
4
- * @param green
5
- * @param blue
6
- * @returns
7
- */
8
- export const rgb2cmyk = (red: number, green: number, blue: number) => {
9
- let computedC = 0;
10
- let computedM = 0;
11
- let computedY = 0;
12
- let computedK = 0;
13
-
14
- const r = parseInt(`${red}`.replace(/\s/g, ""), 10);
15
- const g = parseInt(`${green}`.replace(/\s/g, ""), 10);
16
- const b = parseInt(`${blue}`.replace(/\s/g, ""), 10);
17
-
18
- if (r === 0 && g === 0 && b === 0) {
19
- computedK = 1;
20
- return [0, 0, 0, 1];
21
- }
22
-
23
- computedC = 1 - r / 255;
24
- computedM = 1 - g / 255;
25
- computedY = 1 - b / 255;
26
-
27
- const minCMY = Math.min(computedC, Math.min(computedM, computedY));
28
- computedC = (computedC - minCMY) / (1 - minCMY);
29
- computedM = (computedM - minCMY) / (1 - minCMY);
30
- computedY = (computedY - minCMY) / (1 - minCMY);
31
- computedK = minCMY;
32
-
33
- return [computedC, computedM, computedY, computedK];
34
- };
35
-
36
- /**
37
- * cmyk 转 rgb
38
- * @param cyan
39
- * @param magenta
40
- * @param yellow
41
- * @param black
42
- * @returns
43
- */
44
- export const cmyk2rgb = (cyan: number, magenta: number, yellow: number, black: number) => {
45
- let c = cyan / 100;
46
- let m = magenta / 100;
47
- let y = yellow / 100;
48
- const k = black / 100;
49
-
50
- c = c * (1 - k) + k;
51
- m = m * (1 - k) + k;
52
- y = y * (1 - k) + k;
53
-
54
- let r = 1 - c;
55
- let g = 1 - m;
56
- let b = 1 - y;
57
-
58
- r = Math.round(255 * r);
59
- g = Math.round(255 * g);
60
- b = Math.round(255 * b);
61
- return {
62
- r,
63
- g,
64
- b
65
- };
66
- };
67
-
68
- const REG_CMYK_STRING = /cmyk\((\d+%?),(\d+%?),(\d+%?),(\d+%?)\)/;
69
-
70
- const toNumber = (str: string) => Math.max(0, Math.min(255, parseInt(str, 10)));
71
-
72
- /**
73
- * 输入色转rgb
74
- * @param input
75
- * @returns
76
- */
77
- export const cmykInputToColor = (input: string) => {
78
- if (/cmyk/i.test(input)) {
79
- const str = input.replace(/\s/g, "");
80
- const match = str.match(REG_CMYK_STRING);
81
- const c = toNumber(match[1]);
82
- const m = toNumber(match[2]);
83
- const y = toNumber(match[3]);
84
- const k = toNumber(match[4]);
85
- const { r, g, b } = cmyk2rgb(c, m, y, k);
86
- return `rgb(${r}, ${g}, ${b})`;
87
- }
88
- return input;
89
- };
1
+ /**
2
+ * rgb 转 cmyk
3
+ * @param red
4
+ * @param green
5
+ * @param blue
6
+ * @returns
7
+ */
8
+ export const rgb2cmyk = (red: number, green: number, blue: number) => {
9
+ let computedC = 0;
10
+ let computedM = 0;
11
+ let computedY = 0;
12
+ let computedK = 0;
13
+
14
+ const r = parseInt(`${red}`.replace(/\s/g, ""), 10);
15
+ const g = parseInt(`${green}`.replace(/\s/g, ""), 10);
16
+ const b = parseInt(`${blue}`.replace(/\s/g, ""), 10);
17
+
18
+ if (r === 0 && g === 0 && b === 0) {
19
+ computedK = 1;
20
+ return [0, 0, 0, 1];
21
+ }
22
+
23
+ computedC = 1 - r / 255;
24
+ computedM = 1 - g / 255;
25
+ computedY = 1 - b / 255;
26
+
27
+ const minCMY = Math.min(computedC, Math.min(computedM, computedY));
28
+ computedC = (computedC - minCMY) / (1 - minCMY);
29
+ computedM = (computedM - minCMY) / (1 - minCMY);
30
+ computedY = (computedY - minCMY) / (1 - minCMY);
31
+ computedK = minCMY;
32
+
33
+ return [computedC, computedM, computedY, computedK];
34
+ };
35
+
36
+ /**
37
+ * cmyk 转 rgb
38
+ * @param cyan
39
+ * @param magenta
40
+ * @param yellow
41
+ * @param black
42
+ * @returns
43
+ */
44
+ export const cmyk2rgb = (cyan: number, magenta: number, yellow: number, black: number) => {
45
+ let c = cyan / 100;
46
+ let m = magenta / 100;
47
+ let y = yellow / 100;
48
+ const k = black / 100;
49
+
50
+ c = c * (1 - k) + k;
51
+ m = m * (1 - k) + k;
52
+ y = y * (1 - k) + k;
53
+
54
+ let r = 1 - c;
55
+ let g = 1 - m;
56
+ let b = 1 - y;
57
+
58
+ r = Math.round(255 * r);
59
+ g = Math.round(255 * g);
60
+ b = Math.round(255 * b);
61
+ return {
62
+ r,
63
+ g,
64
+ b
65
+ };
66
+ };
67
+
68
+ const REG_CMYK_STRING = /cmyk\((\d+%?),(\d+%?),(\d+%?),(\d+%?)\)/;
69
+
70
+ const toNumber = (str: string) => Math.max(0, Math.min(255, parseInt(str, 10)));
71
+
72
+ /**
73
+ * 输入色转rgb
74
+ * @param input
75
+ * @returns
76
+ */
77
+ export const cmykInputToColor = (input: string) => {
78
+ if (/cmyk/i.test(input)) {
79
+ const str = input.replace(/\s/g, "");
80
+ const match = str.match(REG_CMYK_STRING);
81
+ const c = toNumber(match[1]);
82
+ const m = toNumber(match[2]);
83
+ const y = toNumber(match[3]);
84
+ const k = toNumber(match[4]);
85
+ const { r, g, b } = cmyk2rgb(c, m, y, k);
86
+ return `rgb(${r}, ${g}, ${b})`;
87
+ }
88
+ return input;
89
+ };