sales-frontend-utils 0.0.53 → 0.0.55
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.cjs +103 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +89 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/canvas-utils.cjs +9 -3
- package/dist/utils/canvas-utils.cjs.map +1 -1
- package/dist/utils/canvas-utils.d.cts +2 -1
- package/dist/utils/canvas-utils.d.ts +2 -1
- package/dist/utils/canvas-utils.js +9 -4
- package/dist/utils/canvas-utils.js.map +1 -1
- package/dist/utils/key-trigger-utils.cjs +98 -0
- package/dist/utils/key-trigger-utils.cjs.map +1 -0
- package/dist/utils/key-trigger-utils.d.cts +58 -0
- package/dist/utils/key-trigger-utils.d.ts +58 -0
- package/dist/utils/key-trigger-utils.js +83 -0
- package/dist/utils/key-trigger-utils.js.map +1 -0
- package/package.json +12 -1
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
// src/utils/canvas-utils.ts
|
|
4
|
+
var getTextWidth = (text, font, context) => {
|
|
5
|
+
context.font = font;
|
|
6
|
+
const metrics = context.measureText(text);
|
|
7
|
+
return metrics.width;
|
|
8
|
+
};
|
|
4
9
|
var convertTextToImg = ({
|
|
5
10
|
targetStr,
|
|
6
11
|
canvasWidth,
|
|
@@ -16,8 +21,9 @@ var convertTextToImg = ({
|
|
|
16
21
|
if (!ctx) {
|
|
17
22
|
throw new Error("Canvas context\uB97C \uAC00\uC838\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
18
23
|
}
|
|
24
|
+
const font = `${fontWeight ?? "normal"} ${fontSize ?? 75}px ${fontFamily}`;
|
|
19
25
|
const defaultHeight = 150;
|
|
20
|
-
const calculatedWidth = targetStr
|
|
26
|
+
const calculatedWidth = getTextWidth(targetStr, font, ctx);
|
|
21
27
|
canvas.width = canvasWidth ?? calculatedWidth;
|
|
22
28
|
canvas.height = canvasHeight ?? defaultHeight;
|
|
23
29
|
if (backgroundColor) {
|
|
@@ -26,8 +32,7 @@ var convertTextToImg = ({
|
|
|
26
32
|
}
|
|
27
33
|
ctx.fillStyle = fontColor ?? "black";
|
|
28
34
|
ctx.textAlign = "center";
|
|
29
|
-
ctx.font =
|
|
30
|
-
console.log("font", `${fontWeight ?? "normal"} ${fontSize ?? 75}px ${fontFamily}`);
|
|
35
|
+
ctx.font = font;
|
|
31
36
|
ctx.textBaseline = "middle";
|
|
32
37
|
ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);
|
|
33
38
|
return canvas.toDataURL();
|
|
@@ -66,5 +71,6 @@ function drawImageResizeCentered(base64, size) {
|
|
|
66
71
|
|
|
67
72
|
exports.convertTextToImg = convertTextToImg;
|
|
68
73
|
exports.drawImageResizeCentered = drawImageResizeCentered;
|
|
74
|
+
exports.getTextWidth = getTextWidth;
|
|
69
75
|
//# sourceMappingURL=canvas-utils.cjs.map
|
|
70
76
|
//# sourceMappingURL=canvas-utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/canvas-utils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"sources":["../../src/utils/canvas-utils.ts"],"names":[],"mappings":"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","file":"canvas-utils.cjs","sourcesContent":["interface ConvertTextToImgParams {\n /** 이미지로 변환할 문자열 */\n targetStr: string;\n /** 캔버스 너비 (지정하지 않으면 텍스트 길이에 따라 자동 계산) */\n canvasWidth?: number;\n /** 캔버스 높이 (지정하지 않으면 기본값 150px) */\n canvasHeight?: number;\n /** 배경색 (지정하지 않으면 투명) */\n backgroundColor?: string;\n /** 폰트 크기 (지정하지 않으면 기본값 75px) */\n fontSize?: number;\n /** 폰트 색상 (지정하지 않으면 기본값 검정색) */\n fontColor?: string;\n /** 폰트 두께 (지정하지 않으면 기본값 bold) */\n fontWeight?: string;\n /** 폰트 패밀리 (지정하지 않으면 기본값 ) */\n fontFamily?: string;\n}\n\n\n\nexport const getTextWidth = (text: string, font: string, context: CanvasRenderingContext2D) => {\n\n // 폰트 스타일 설정\n context.font = font;\n\n // measureText()를 사용하여 TextMetrics 객체 가져오기\n const metrics = context.measureText(text);\n\n // 너비(width) 반환\n return metrics.width;\n}\n\n\n\n\n/**\n * 텍스트를 이미지(Base64)로 변환하는 함수\n * @param params - 변환에 필요한 파라미터 객체\n * @returns Base64로 인코딩된 이미지 데이터 URL\n */\nexport const convertTextToImg = ({\n targetStr,\n canvasWidth,\n canvasHeight,\n backgroundColor,\n fontColor,\n fontSize,\n fontWeight,\n fontFamily = `'system-ui', 'sans-serif'`\n}: ConvertTextToImgParams): string => {\n // 1. 메모리에 캔버스 요소 생성\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n // 캔버스 컨텍스트를 가져올 수 없는 경우 에러 처리\n throw new Error('Canvas context를 가져올 수 없습니다.');\n }\n\n const font = `${fontWeight ?? 'normal'} ${fontSize ?? 75}px ${fontFamily}`;\n\n // 2. 캔버스 크기 설정\n const defaultHeight = 150;\n\n // as-is\n // const calculatedWidth = targetStr.length * 70; // 글자 수 기반 너비 계산\n\n const calculatedWidth = getTextWidth(targetStr, font, ctx);\n canvas.width = canvasWidth ?? calculatedWidth;\n canvas.height = canvasHeight ?? defaultHeight;\n\n // 3. 배경색 처리\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // 4. 텍스트 그리기\n ctx.fillStyle = fontColor ?? 'black';\n ctx.textAlign = 'center';\n ctx.font = font;\n ctx.textBaseline = 'middle'; // 텍스트를 수직 중앙에 더 잘 맞추기 위해 추가\n\n // 텍스트를 캔버스 중앙에 그립니다.\n ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);\n\n // 5. Base64 이미지 데이터로 변환하여 반환\n return canvas.toDataURL(); // 기본적으로 'image/png'\n};\n\nexport function drawImageResizeCentered(base64: string, size: { canvasWidth: number; canvasHeight: number }) {\n return new Promise((resolve) => {\n const { canvasHeight, canvasWidth } = size;\n\n const canvas = document.createElement('canvas');\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n const ctx = canvas.getContext('2d');\n\n const img = new Image();\n img.src = base64;\n img.onload = () => {\n const imageWidth = img.width;\n const imageHeight = img.height;\n\n const canvasRatio = canvasWidth / canvasHeight;\n const imageRatio = imageWidth / imageHeight;\n\n let newWidth;\n let newHeight;\n\n if (imageRatio > canvasRatio) {\n newWidth = canvasWidth;\n newHeight = newWidth / imageRatio;\n } else {\n newHeight = canvasHeight;\n newWidth = newHeight * imageRatio;\n }\n\n const x = (canvasWidth - newWidth) / 2;\n const y = (canvasHeight - newHeight) / 2;\n\n ctx?.clearRect(0, 0, canvasWidth, canvasHeight);\n ctx?.drawImage(img, x, y, newWidth, newHeight);\n\n resolve(canvas.toDataURL());\n };\n });\n}\n"]}
|
|
@@ -16,6 +16,7 @@ interface ConvertTextToImgParams {
|
|
|
16
16
|
/** 폰트 패밀리 (지정하지 않으면 기본값 ) */
|
|
17
17
|
fontFamily?: string;
|
|
18
18
|
}
|
|
19
|
+
declare const getTextWidth: (text: string, font: string, context: CanvasRenderingContext2D) => number;
|
|
19
20
|
/**
|
|
20
21
|
* 텍스트를 이미지(Base64)로 변환하는 함수
|
|
21
22
|
* @param params - 변환에 필요한 파라미터 객체
|
|
@@ -27,4 +28,4 @@ declare function drawImageResizeCentered(base64: string, size: {
|
|
|
27
28
|
canvasHeight: number;
|
|
28
29
|
}): Promise<unknown>;
|
|
29
30
|
|
|
30
|
-
export { convertTextToImg, drawImageResizeCentered };
|
|
31
|
+
export { convertTextToImg, drawImageResizeCentered, getTextWidth };
|
|
@@ -16,6 +16,7 @@ interface ConvertTextToImgParams {
|
|
|
16
16
|
/** 폰트 패밀리 (지정하지 않으면 기본값 ) */
|
|
17
17
|
fontFamily?: string;
|
|
18
18
|
}
|
|
19
|
+
declare const getTextWidth: (text: string, font: string, context: CanvasRenderingContext2D) => number;
|
|
19
20
|
/**
|
|
20
21
|
* 텍스트를 이미지(Base64)로 변환하는 함수
|
|
21
22
|
* @param params - 변환에 필요한 파라미터 객체
|
|
@@ -27,4 +28,4 @@ declare function drawImageResizeCentered(base64: string, size: {
|
|
|
27
28
|
canvasHeight: number;
|
|
28
29
|
}): Promise<unknown>;
|
|
29
30
|
|
|
30
|
-
export { convertTextToImg, drawImageResizeCentered };
|
|
31
|
+
export { convertTextToImg, drawImageResizeCentered, getTextWidth };
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
// src/utils/canvas-utils.ts
|
|
2
|
+
var getTextWidth = (text, font, context) => {
|
|
3
|
+
context.font = font;
|
|
4
|
+
const metrics = context.measureText(text);
|
|
5
|
+
return metrics.width;
|
|
6
|
+
};
|
|
2
7
|
var convertTextToImg = ({
|
|
3
8
|
targetStr,
|
|
4
9
|
canvasWidth,
|
|
@@ -14,8 +19,9 @@ var convertTextToImg = ({
|
|
|
14
19
|
if (!ctx) {
|
|
15
20
|
throw new Error("Canvas context\uB97C \uAC00\uC838\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
16
21
|
}
|
|
22
|
+
const font = `${fontWeight ?? "normal"} ${fontSize ?? 75}px ${fontFamily}`;
|
|
17
23
|
const defaultHeight = 150;
|
|
18
|
-
const calculatedWidth = targetStr
|
|
24
|
+
const calculatedWidth = getTextWidth(targetStr, font, ctx);
|
|
19
25
|
canvas.width = canvasWidth ?? calculatedWidth;
|
|
20
26
|
canvas.height = canvasHeight ?? defaultHeight;
|
|
21
27
|
if (backgroundColor) {
|
|
@@ -24,8 +30,7 @@ var convertTextToImg = ({
|
|
|
24
30
|
}
|
|
25
31
|
ctx.fillStyle = fontColor ?? "black";
|
|
26
32
|
ctx.textAlign = "center";
|
|
27
|
-
ctx.font =
|
|
28
|
-
console.log("font", `${fontWeight ?? "normal"} ${fontSize ?? 75}px ${fontFamily}`);
|
|
33
|
+
ctx.font = font;
|
|
29
34
|
ctx.textBaseline = "middle";
|
|
30
35
|
ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);
|
|
31
36
|
return canvas.toDataURL();
|
|
@@ -62,6 +67,6 @@ function drawImageResizeCentered(base64, size) {
|
|
|
62
67
|
});
|
|
63
68
|
}
|
|
64
69
|
|
|
65
|
-
export { convertTextToImg, drawImageResizeCentered };
|
|
70
|
+
export { convertTextToImg, drawImageResizeCentered, getTextWidth };
|
|
66
71
|
//# sourceMappingURL=canvas-utils.js.map
|
|
67
72
|
//# sourceMappingURL=canvas-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/canvas-utils.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../src/utils/canvas-utils.ts"],"names":[],"mappings":"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","file":"canvas-utils.js","sourcesContent":["interface ConvertTextToImgParams {\n /** 이미지로 변환할 문자열 */\n targetStr: string;\n /** 캔버스 너비 (지정하지 않으면 텍스트 길이에 따라 자동 계산) */\n canvasWidth?: number;\n /** 캔버스 높이 (지정하지 않으면 기본값 150px) */\n canvasHeight?: number;\n /** 배경색 (지정하지 않으면 투명) */\n backgroundColor?: string;\n /** 폰트 크기 (지정하지 않으면 기본값 75px) */\n fontSize?: number;\n /** 폰트 색상 (지정하지 않으면 기본값 검정색) */\n fontColor?: string;\n /** 폰트 두께 (지정하지 않으면 기본값 bold) */\n fontWeight?: string;\n /** 폰트 패밀리 (지정하지 않으면 기본값 ) */\n fontFamily?: string;\n}\n\n\n\nexport const getTextWidth = (text: string, font: string, context: CanvasRenderingContext2D) => {\n\n // 폰트 스타일 설정\n context.font = font;\n\n // measureText()를 사용하여 TextMetrics 객체 가져오기\n const metrics = context.measureText(text);\n\n // 너비(width) 반환\n return metrics.width;\n}\n\n\n\n\n/**\n * 텍스트를 이미지(Base64)로 변환하는 함수\n * @param params - 변환에 필요한 파라미터 객체\n * @returns Base64로 인코딩된 이미지 데이터 URL\n */\nexport const convertTextToImg = ({\n targetStr,\n canvasWidth,\n canvasHeight,\n backgroundColor,\n fontColor,\n fontSize,\n fontWeight,\n fontFamily = `'system-ui', 'sans-serif'`\n}: ConvertTextToImgParams): string => {\n // 1. 메모리에 캔버스 요소 생성\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n // 캔버스 컨텍스트를 가져올 수 없는 경우 에러 처리\n throw new Error('Canvas context를 가져올 수 없습니다.');\n }\n\n const font = `${fontWeight ?? 'normal'} ${fontSize ?? 75}px ${fontFamily}`;\n\n // 2. 캔버스 크기 설정\n const defaultHeight = 150;\n\n // as-is\n // const calculatedWidth = targetStr.length * 70; // 글자 수 기반 너비 계산\n\n const calculatedWidth = getTextWidth(targetStr, font, ctx);\n canvas.width = canvasWidth ?? calculatedWidth;\n canvas.height = canvasHeight ?? defaultHeight;\n\n // 3. 배경색 처리\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // 4. 텍스트 그리기\n ctx.fillStyle = fontColor ?? 'black';\n ctx.textAlign = 'center';\n ctx.font = font;\n ctx.textBaseline = 'middle'; // 텍스트를 수직 중앙에 더 잘 맞추기 위해 추가\n\n // 텍스트를 캔버스 중앙에 그립니다.\n ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);\n\n // 5. Base64 이미지 데이터로 변환하여 반환\n return canvas.toDataURL(); // 기본적으로 'image/png'\n};\n\nexport function drawImageResizeCentered(base64: string, size: { canvasWidth: number; canvasHeight: number }) {\n return new Promise((resolve) => {\n const { canvasHeight, canvasWidth } = size;\n\n const canvas = document.createElement('canvas');\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n const ctx = canvas.getContext('2d');\n\n const img = new Image();\n img.src = base64;\n img.onload = () => {\n const imageWidth = img.width;\n const imageHeight = img.height;\n\n const canvasRatio = canvasWidth / canvasHeight;\n const imageRatio = imageWidth / imageHeight;\n\n let newWidth;\n let newHeight;\n\n if (imageRatio > canvasRatio) {\n newWidth = canvasWidth;\n newHeight = newWidth / imageRatio;\n } else {\n newHeight = canvasHeight;\n newWidth = newHeight * imageRatio;\n }\n\n const x = (canvasWidth - newWidth) / 2;\n const y = (canvasHeight - newHeight) / 2;\n\n ctx?.clearRect(0, 0, canvasWidth, canvasHeight);\n ctx?.drawImage(img, x, y, newWidth, newHeight);\n\n resolve(canvas.toDataURL());\n };\n });\n}\n"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/utils/key-trigger-utils.ts
|
|
4
|
+
var charFilterEng = (value) => value.replace(/[^a-zA-Z]/g, "");
|
|
5
|
+
var charFilterKor = (value) => value.replace(/[^\uAC00-\uD7AF]/g, "");
|
|
6
|
+
function isOverCharCount(value, count) {
|
|
7
|
+
const hangulLength = charFilterKor(value).length;
|
|
8
|
+
const englishLength = charFilterEng(value).length;
|
|
9
|
+
if (hangulLength + englishLength >= count) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
function checkKeys(event, keys) {
|
|
15
|
+
if (keys.includes(event.key)) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
function isEnter(event) {
|
|
21
|
+
if (checkKeys(event, ["Enter"]) || event.code === "NumpadEnter") {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
function isBackspace(event) {
|
|
27
|
+
if (checkKeys(event, ["Backspace"])) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
function isArrowUp(event) {
|
|
33
|
+
if (checkKeys(event, ["ArrowUp"])) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
function isArrowDown(event) {
|
|
39
|
+
if (checkKeys(event, ["ArrowDown"])) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
function isArrowLeft(event) {
|
|
45
|
+
if (checkKeys(event, ["ArrowLeft"])) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
function isArrowRight(event) {
|
|
51
|
+
if (checkKeys(event, ["ArrowRight"])) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
function isTab(event) {
|
|
57
|
+
if (checkKeys(event, ["Tab"])) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
function isEscape(event) {
|
|
63
|
+
if (checkKeys(event, ["Escape"])) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
function isOverKorCharCount(value, count) {
|
|
69
|
+
const hangulLength = charFilterKor(value).length;
|
|
70
|
+
if (hangulLength > count) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
function isOverEngCharCount(value, count) {
|
|
76
|
+
const englishLength = charFilterEng(value).length;
|
|
77
|
+
if (englishLength > count) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
exports.charFilterEng = charFilterEng;
|
|
84
|
+
exports.charFilterKor = charFilterKor;
|
|
85
|
+
exports.checkKeys = checkKeys;
|
|
86
|
+
exports.isArrowDown = isArrowDown;
|
|
87
|
+
exports.isArrowLeft = isArrowLeft;
|
|
88
|
+
exports.isArrowRight = isArrowRight;
|
|
89
|
+
exports.isArrowUp = isArrowUp;
|
|
90
|
+
exports.isBackspace = isBackspace;
|
|
91
|
+
exports.isEnter = isEnter;
|
|
92
|
+
exports.isEscape = isEscape;
|
|
93
|
+
exports.isOverCharCount = isOverCharCount;
|
|
94
|
+
exports.isOverEngCharCount = isOverEngCharCount;
|
|
95
|
+
exports.isOverKorCharCount = isOverKorCharCount;
|
|
96
|
+
exports.isTab = isTab;
|
|
97
|
+
//# sourceMappingURL=key-trigger-utils.cjs.map
|
|
98
|
+
//# sourceMappingURL=key-trigger-utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/key-trigger-utils.ts"],"names":[],"mappings":"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","file":"key-trigger-utils.cjs","sourcesContent":["import React from 'react';\n\nexport const charFilterEng = (value: string) => value.replace(/[^a-zA-Z]/g, '');\nexport const charFilterKor = (value: string) => value.replace(/[^\\uAC00-\\uD7AF]/g, '');\n\n/**\n * 영문+한글포함 N글자 이상 입력시 트리거 발생\n */\nexport function isOverCharCount(value: string, count: number) {\n // value에서 한글만 추출\n const hangulLength = charFilterKor(value).length;\n\n // value에서 영문만 추출\n const englishLength = charFilterEng(value).length;\n\n //영문 한글 조합일때, count 이상 일경우, 트리거 발생\n if (hangulLength + englishLength >= count) {\n return true;\n }\n\n return false;\n}\n\n/**\n * 배열 keys에 포함된 key를 입력시 true 리턴\n * @param event React.KeyboardEvent<HTMLInputElement>\n * @param keys React.KeyboardEvent<HTMLInputElement>['key'][]\n * @returns boolean\n */\nexport function checkKeys(event: React.KeyboardEvent<HTMLInputElement>, keys: React.KeyboardEvent<HTMLInputElement>['key'][]) {\n if (keys.includes(event.key)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Enter 키 입력시 트리거 발생\n * 일반 엔터키 + numberpad 엔터키\n */\nexport function isEnter(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Enter']) || event.code === 'NumpadEnter') {\n return true;\n }\n\n return false;\n}\n\n\n/**\n * Backspace 키 입력시 트리거 발생\n */\nexport function isBackspace(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Backspace'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowUp 키 입력시 트리거 발생\n */\nexport function isArrowUp(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowUp'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowDown 키 입력시 트리거 발생\n */\nexport function isArrowDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowDown'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowLeft 키 입력시 트리거 발생\n */\nexport function isArrowLeft(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowLeft'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowRight 키 입력시 트리거 발생\n */\nexport function isArrowRight(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowRight'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Tab 키 입력시 트리거 발생\n */\nexport function isTab(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Tab'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Escape 키 입력시 트리거 발생\n */\nexport function isEscape(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Escape'])) {\n return true;\n }\n\n return false;\n}\n\n\n/**\n * 한글 N글자 이상 입력시 트리거 발생\n */\nexport function isOverKorCharCount(value: string, count: number) {\n //value에서 한글만 추출\n const hangulLength = charFilterKor(value).length;\n\n //한글 count 초과 일경우, 트리거 발생\n if (hangulLength > count) {\n return true;\n }\n\n return false;\n}\n\n\n\n/**\n * 영문 N글자 이상 입력시 트리거 발생\n */\nexport function isOverEngCharCount(value: string, count: number) {\n\n //value에서 영문만 추출\n const englishLength = charFilterEng(value).length;\n\n //영문 count 초과 일경우, 트리거 발생\n if (englishLength > count) {\n return true;\n }\n\n return false;\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
declare const charFilterEng: (value: string) => string;
|
|
4
|
+
declare const charFilterKor: (value: string) => string;
|
|
5
|
+
/**
|
|
6
|
+
* 영문+한글포함 N글자 이상 입력시 트리거 발생
|
|
7
|
+
*/
|
|
8
|
+
declare function isOverCharCount(value: string, count: number): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 배열 keys에 포함된 key를 입력시 true 리턴
|
|
11
|
+
* @param event React.KeyboardEvent<HTMLInputElement>
|
|
12
|
+
* @param keys React.KeyboardEvent<HTMLInputElement>['key'][]
|
|
13
|
+
* @returns boolean
|
|
14
|
+
*/
|
|
15
|
+
declare function checkKeys(event: React.KeyboardEvent<HTMLInputElement>, keys: React.KeyboardEvent<HTMLInputElement>['key'][]): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Enter 키 입력시 트리거 발생
|
|
18
|
+
* 일반 엔터키 + numberpad 엔터키
|
|
19
|
+
*/
|
|
20
|
+
declare function isEnter(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Backspace 키 입력시 트리거 발생
|
|
23
|
+
*/
|
|
24
|
+
declare function isBackspace(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* ArrowUp 키 입력시 트리거 발생
|
|
27
|
+
*/
|
|
28
|
+
declare function isArrowUp(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* ArrowDown 키 입력시 트리거 발생
|
|
31
|
+
*/
|
|
32
|
+
declare function isArrowDown(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* ArrowLeft 키 입력시 트리거 발생
|
|
35
|
+
*/
|
|
36
|
+
declare function isArrowLeft(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* ArrowRight 키 입력시 트리거 발생
|
|
39
|
+
*/
|
|
40
|
+
declare function isArrowRight(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Tab 키 입력시 트리거 발생
|
|
43
|
+
*/
|
|
44
|
+
declare function isTab(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Escape 키 입력시 트리거 발생
|
|
47
|
+
*/
|
|
48
|
+
declare function isEscape(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* 한글 N글자 이상 입력시 트리거 발생
|
|
51
|
+
*/
|
|
52
|
+
declare function isOverKorCharCount(value: string, count: number): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* 영문 N글자 이상 입력시 트리거 발생
|
|
55
|
+
*/
|
|
56
|
+
declare function isOverEngCharCount(value: string, count: number): boolean;
|
|
57
|
+
|
|
58
|
+
export { charFilterEng, charFilterKor, checkKeys, isArrowDown, isArrowLeft, isArrowRight, isArrowUp, isBackspace, isEnter, isEscape, isOverCharCount, isOverEngCharCount, isOverKorCharCount, isTab };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
declare const charFilterEng: (value: string) => string;
|
|
4
|
+
declare const charFilterKor: (value: string) => string;
|
|
5
|
+
/**
|
|
6
|
+
* 영문+한글포함 N글자 이상 입력시 트리거 발생
|
|
7
|
+
*/
|
|
8
|
+
declare function isOverCharCount(value: string, count: number): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 배열 keys에 포함된 key를 입력시 true 리턴
|
|
11
|
+
* @param event React.KeyboardEvent<HTMLInputElement>
|
|
12
|
+
* @param keys React.KeyboardEvent<HTMLInputElement>['key'][]
|
|
13
|
+
* @returns boolean
|
|
14
|
+
*/
|
|
15
|
+
declare function checkKeys(event: React.KeyboardEvent<HTMLInputElement>, keys: React.KeyboardEvent<HTMLInputElement>['key'][]): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Enter 키 입력시 트리거 발생
|
|
18
|
+
* 일반 엔터키 + numberpad 엔터키
|
|
19
|
+
*/
|
|
20
|
+
declare function isEnter(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Backspace 키 입력시 트리거 발생
|
|
23
|
+
*/
|
|
24
|
+
declare function isBackspace(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* ArrowUp 키 입력시 트리거 발생
|
|
27
|
+
*/
|
|
28
|
+
declare function isArrowUp(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* ArrowDown 키 입력시 트리거 발생
|
|
31
|
+
*/
|
|
32
|
+
declare function isArrowDown(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* ArrowLeft 키 입력시 트리거 발생
|
|
35
|
+
*/
|
|
36
|
+
declare function isArrowLeft(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* ArrowRight 키 입력시 트리거 발생
|
|
39
|
+
*/
|
|
40
|
+
declare function isArrowRight(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Tab 키 입력시 트리거 발생
|
|
43
|
+
*/
|
|
44
|
+
declare function isTab(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Escape 키 입력시 트리거 발생
|
|
47
|
+
*/
|
|
48
|
+
declare function isEscape(event: React.KeyboardEvent<HTMLInputElement>): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* 한글 N글자 이상 입력시 트리거 발생
|
|
51
|
+
*/
|
|
52
|
+
declare function isOverKorCharCount(value: string, count: number): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* 영문 N글자 이상 입력시 트리거 발생
|
|
55
|
+
*/
|
|
56
|
+
declare function isOverEngCharCount(value: string, count: number): boolean;
|
|
57
|
+
|
|
58
|
+
export { charFilterEng, charFilterKor, checkKeys, isArrowDown, isArrowLeft, isArrowRight, isArrowUp, isBackspace, isEnter, isEscape, isOverCharCount, isOverEngCharCount, isOverKorCharCount, isTab };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// src/utils/key-trigger-utils.ts
|
|
2
|
+
var charFilterEng = (value) => value.replace(/[^a-zA-Z]/g, "");
|
|
3
|
+
var charFilterKor = (value) => value.replace(/[^\uAC00-\uD7AF]/g, "");
|
|
4
|
+
function isOverCharCount(value, count) {
|
|
5
|
+
const hangulLength = charFilterKor(value).length;
|
|
6
|
+
const englishLength = charFilterEng(value).length;
|
|
7
|
+
if (hangulLength + englishLength >= count) {
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
function checkKeys(event, keys) {
|
|
13
|
+
if (keys.includes(event.key)) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
function isEnter(event) {
|
|
19
|
+
if (checkKeys(event, ["Enter"]) || event.code === "NumpadEnter") {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
function isBackspace(event) {
|
|
25
|
+
if (checkKeys(event, ["Backspace"])) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
function isArrowUp(event) {
|
|
31
|
+
if (checkKeys(event, ["ArrowUp"])) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
function isArrowDown(event) {
|
|
37
|
+
if (checkKeys(event, ["ArrowDown"])) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
function isArrowLeft(event) {
|
|
43
|
+
if (checkKeys(event, ["ArrowLeft"])) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
function isArrowRight(event) {
|
|
49
|
+
if (checkKeys(event, ["ArrowRight"])) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
function isTab(event) {
|
|
55
|
+
if (checkKeys(event, ["Tab"])) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
function isEscape(event) {
|
|
61
|
+
if (checkKeys(event, ["Escape"])) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
function isOverKorCharCount(value, count) {
|
|
67
|
+
const hangulLength = charFilterKor(value).length;
|
|
68
|
+
if (hangulLength > count) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
function isOverEngCharCount(value, count) {
|
|
74
|
+
const englishLength = charFilterEng(value).length;
|
|
75
|
+
if (englishLength > count) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { charFilterEng, charFilterKor, checkKeys, isArrowDown, isArrowLeft, isArrowRight, isArrowUp, isBackspace, isEnter, isEscape, isOverCharCount, isOverEngCharCount, isOverKorCharCount, isTab };
|
|
82
|
+
//# sourceMappingURL=key-trigger-utils.js.map
|
|
83
|
+
//# sourceMappingURL=key-trigger-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/key-trigger-utils.ts"],"names":[],"mappings":";AAEO,IAAM,gBAAgB,CAAC,KAAA,KAAkB,KAAM,CAAA,OAAA,CAAQ,cAAc,EAAE;AACvE,IAAM,gBAAgB,CAAC,KAAA,KAAkB,KAAM,CAAA,OAAA,CAAQ,qBAAqB,EAAE;AAK9E,SAAS,eAAA,CAAgB,OAAe,KAAe,EAAA;AAE1D,EAAM,MAAA,YAAA,GAAe,aAAc,CAAA,KAAK,CAAE,CAAA,MAAA;AAG1C,EAAM,MAAA,aAAA,GAAgB,aAAc,CAAA,KAAK,CAAE,CAAA,MAAA;AAG3C,EAAI,IAAA,YAAA,GAAe,iBAAiB,KAAO,EAAA;AACvC,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAQO,SAAS,SAAA,CAAU,OAA8C,IAAsD,EAAA;AAC1H,EAAA,IAAI,IAAK,CAAA,QAAA,CAAS,KAAM,CAAA,GAAG,CAAG,EAAA;AAC1B,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAMO,SAAS,QAAQ,KAA8C,EAAA;AAClE,EAAI,IAAA,SAAA,CAAU,OAAO,CAAC,OAAO,CAAC,CAAK,IAAA,KAAA,CAAM,SAAS,aAAe,EAAA;AAC7D,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAMO,SAAS,YAAY,KAA8C,EAAA;AACtE,EAAA,IAAI,SAAU,CAAA,KAAA,EAAO,CAAC,WAAW,CAAC,CAAG,EAAA;AACjC,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAKO,SAAS,UAAU,KAA8C,EAAA;AACpE,EAAA,IAAI,SAAU,CAAA,KAAA,EAAO,CAAC,SAAS,CAAC,CAAG,EAAA;AAC/B,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAKO,SAAS,YAAY,KAA8C,EAAA;AACtE,EAAA,IAAI,SAAU,CAAA,KAAA,EAAO,CAAC,WAAW,CAAC,CAAG,EAAA;AACjC,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAKO,SAAS,YAAY,KAA8C,EAAA;AACtE,EAAA,IAAI,SAAU,CAAA,KAAA,EAAO,CAAC,WAAW,CAAC,CAAG,EAAA;AACjC,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAKO,SAAS,aAAa,KAA8C,EAAA;AACvE,EAAA,IAAI,SAAU,CAAA,KAAA,EAAO,CAAC,YAAY,CAAC,CAAG,EAAA;AAClC,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAKO,SAAS,MAAM,KAA8C,EAAA;AAChE,EAAA,IAAI,SAAU,CAAA,KAAA,EAAO,CAAC,KAAK,CAAC,CAAG,EAAA;AAC3B,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAKO,SAAS,SAAS,KAA8C,EAAA;AACnE,EAAA,IAAI,SAAU,CAAA,KAAA,EAAO,CAAC,QAAQ,CAAC,CAAG,EAAA;AAC9B,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAMO,SAAS,kBAAA,CAAmB,OAAe,KAAe,EAAA;AAE7D,EAAM,MAAA,YAAA,GAAe,aAAc,CAAA,KAAK,CAAE,CAAA,MAAA;AAG1C,EAAA,IAAI,eAAe,KAAO,EAAA;AACtB,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX;AAOO,SAAS,kBAAA,CAAmB,OAAe,KAAe,EAAA;AAG7D,EAAM,MAAA,aAAA,GAAgB,aAAc,CAAA,KAAK,CAAE,CAAA,MAAA;AAG3C,EAAA,IAAI,gBAAgB,KAAO,EAAA;AACvB,IAAO,OAAA,IAAA;AAAA;AAGX,EAAO,OAAA,KAAA;AACX","file":"key-trigger-utils.js","sourcesContent":["import React from 'react';\n\nexport const charFilterEng = (value: string) => value.replace(/[^a-zA-Z]/g, '');\nexport const charFilterKor = (value: string) => value.replace(/[^\\uAC00-\\uD7AF]/g, '');\n\n/**\n * 영문+한글포함 N글자 이상 입력시 트리거 발생\n */\nexport function isOverCharCount(value: string, count: number) {\n // value에서 한글만 추출\n const hangulLength = charFilterKor(value).length;\n\n // value에서 영문만 추출\n const englishLength = charFilterEng(value).length;\n\n //영문 한글 조합일때, count 이상 일경우, 트리거 발생\n if (hangulLength + englishLength >= count) {\n return true;\n }\n\n return false;\n}\n\n/**\n * 배열 keys에 포함된 key를 입력시 true 리턴\n * @param event React.KeyboardEvent<HTMLInputElement>\n * @param keys React.KeyboardEvent<HTMLInputElement>['key'][]\n * @returns boolean\n */\nexport function checkKeys(event: React.KeyboardEvent<HTMLInputElement>, keys: React.KeyboardEvent<HTMLInputElement>['key'][]) {\n if (keys.includes(event.key)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Enter 키 입력시 트리거 발생\n * 일반 엔터키 + numberpad 엔터키\n */\nexport function isEnter(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Enter']) || event.code === 'NumpadEnter') {\n return true;\n }\n\n return false;\n}\n\n\n/**\n * Backspace 키 입력시 트리거 발생\n */\nexport function isBackspace(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Backspace'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowUp 키 입력시 트리거 발생\n */\nexport function isArrowUp(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowUp'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowDown 키 입력시 트리거 발생\n */\nexport function isArrowDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowDown'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowLeft 키 입력시 트리거 발생\n */\nexport function isArrowLeft(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowLeft'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowRight 키 입력시 트리거 발생\n */\nexport function isArrowRight(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowRight'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Tab 키 입력시 트리거 발생\n */\nexport function isTab(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Tab'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Escape 키 입력시 트리거 발생\n */\nexport function isEscape(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Escape'])) {\n return true;\n }\n\n return false;\n}\n\n\n/**\n * 한글 N글자 이상 입력시 트리거 발생\n */\nexport function isOverKorCharCount(value: string, count: number) {\n //value에서 한글만 추출\n const hangulLength = charFilterKor(value).length;\n\n //한글 count 초과 일경우, 트리거 발생\n if (hangulLength > count) {\n return true;\n }\n\n return false;\n}\n\n\n\n/**\n * 영문 N글자 이상 입력시 트리거 발생\n */\nexport function isOverEngCharCount(value: string, count: number) {\n\n //value에서 영문만 추출\n const englishLength = charFilterEng(value).length;\n\n //영문 count 초과 일경우, 트리거 발생\n if (englishLength > count) {\n return true;\n }\n\n return false;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sales-frontend-utils",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.55",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -138,6 +138,16 @@
|
|
|
138
138
|
"types": "./dist/utils/ga/index.d.cts",
|
|
139
139
|
"default": "./dist/utils/ga/index.cjs"
|
|
140
140
|
}
|
|
141
|
+
},
|
|
142
|
+
"./key-trigger": {
|
|
143
|
+
"import": {
|
|
144
|
+
"types": "./dist/utils/key-trigger-utils.d.ts",
|
|
145
|
+
"default": "./dist/utils/key-trigger-utils.js"
|
|
146
|
+
},
|
|
147
|
+
"require": {
|
|
148
|
+
"types": "./dist/utils/key-trigger-utils.d.cts",
|
|
149
|
+
"default": "./dist/utils/key-trigger-utils.cjs"
|
|
150
|
+
}
|
|
141
151
|
}
|
|
142
152
|
},
|
|
143
153
|
"dependencies": {
|
|
@@ -145,6 +155,7 @@
|
|
|
145
155
|
},
|
|
146
156
|
"devDependencies": {
|
|
147
157
|
"@types/node": "^22.14.1",
|
|
158
|
+
"@types/react": "19.1.0",
|
|
148
159
|
"tsup": "^8.4.0",
|
|
149
160
|
"typescript": "5.8.2",
|
|
150
161
|
"eslint-config-sales-frontend-eslint-config-v8": "^0.0.7",
|