@ktnpm_devops/react-component 0.2.0 → 0.3.0

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 (263) hide show
  1. package/dist/index.cjs +34 -33
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +34 -33
  6. package/dist/index.js.map +1 -1
  7. package/dist/index10.cjs +15 -4
  8. package/dist/index10.cjs.map +1 -1
  9. package/dist/index10.js +15 -4
  10. package/dist/index10.js.map +1 -1
  11. package/dist/index11.cjs +4 -16
  12. package/dist/index11.cjs.map +1 -1
  13. package/dist/index11.js +4 -16
  14. package/dist/index11.js.map +1 -1
  15. package/dist/index12.cjs +16 -10
  16. package/dist/index12.cjs.map +1 -1
  17. package/dist/index12.js +16 -10
  18. package/dist/index12.js.map +1 -1
  19. package/dist/index13.cjs +10 -100
  20. package/dist/index13.cjs.map +1 -1
  21. package/dist/index13.js +11 -101
  22. package/dist/index13.js.map +1 -1
  23. package/dist/index14.cjs +100 -20
  24. package/dist/index14.cjs.map +1 -1
  25. package/dist/index14.js +101 -21
  26. package/dist/index14.js.map +1 -1
  27. package/dist/index15.cjs +20 -90
  28. package/dist/index15.cjs.map +1 -1
  29. package/dist/index15.js +21 -91
  30. package/dist/index15.js.map +1 -1
  31. package/dist/index16.cjs +85 -153
  32. package/dist/index16.cjs.map +1 -1
  33. package/dist/index16.js +87 -155
  34. package/dist/index16.js.map +1 -1
  35. package/dist/index17.cjs +150 -128
  36. package/dist/index17.cjs.map +1 -1
  37. package/dist/index17.js +150 -128
  38. package/dist/index17.js.map +1 -1
  39. package/dist/index18.cjs +121 -106
  40. package/dist/index18.cjs.map +1 -1
  41. package/dist/index18.js +122 -107
  42. package/dist/index18.js.map +1 -1
  43. package/dist/index19.cjs +121 -17
  44. package/dist/index19.cjs.map +1 -1
  45. package/dist/index19.js +121 -17
  46. package/dist/index19.js.map +1 -1
  47. package/dist/index20.cjs +17 -8
  48. package/dist/index20.cjs.map +1 -1
  49. package/dist/index20.js +18 -9
  50. package/dist/index20.js.map +1 -1
  51. package/dist/index21.cjs +7 -130
  52. package/dist/index21.cjs.map +1 -1
  53. package/dist/index21.js +9 -132
  54. package/dist/index21.js.map +1 -1
  55. package/dist/index22.cjs +128 -35
  56. package/dist/index22.cjs.map +1 -1
  57. package/dist/index22.js +129 -36
  58. package/dist/index22.js.map +1 -1
  59. package/dist/index23.cjs +36 -222
  60. package/dist/index23.cjs.map +1 -1
  61. package/dist/index23.js +37 -223
  62. package/dist/index23.js.map +1 -1
  63. package/dist/index24.cjs +218 -28
  64. package/dist/index24.cjs.map +1 -1
  65. package/dist/index24.js +220 -30
  66. package/dist/index24.js.map +1 -1
  67. package/dist/index25.cjs +29 -73
  68. package/dist/index25.cjs.map +1 -1
  69. package/dist/index25.js +31 -75
  70. package/dist/index25.js.map +1 -1
  71. package/dist/index26.cjs +69 -144
  72. package/dist/index26.cjs.map +1 -1
  73. package/dist/index26.js +70 -145
  74. package/dist/index26.js.map +1 -1
  75. package/dist/index27.cjs +152 -7
  76. package/dist/index27.cjs.map +1 -1
  77. package/dist/index27.js +154 -9
  78. package/dist/index27.js.map +1 -1
  79. package/dist/index28.cjs +8 -17
  80. package/dist/index28.cjs.map +1 -1
  81. package/dist/index28.js +9 -18
  82. package/dist/index28.js.map +1 -1
  83. package/dist/index29.cjs +15 -75
  84. package/dist/index29.cjs.map +1 -1
  85. package/dist/index29.js +15 -75
  86. package/dist/index29.js.map +1 -1
  87. package/dist/index3.cjs +76 -16
  88. package/dist/index3.cjs.map +1 -1
  89. package/dist/index3.js +76 -16
  90. package/dist/index3.js.map +1 -1
  91. package/dist/index30.cjs +68 -134
  92. package/dist/index30.cjs.map +1 -1
  93. package/dist/index30.js +70 -136
  94. package/dist/index30.js.map +1 -1
  95. package/dist/index31.cjs +136 -98
  96. package/dist/index31.cjs.map +1 -1
  97. package/dist/index31.js +137 -99
  98. package/dist/index31.js.map +1 -1
  99. package/dist/index32.cjs +105 -6
  100. package/dist/index32.cjs.map +1 -1
  101. package/dist/index32.js +106 -7
  102. package/dist/index32.js.map +1 -1
  103. package/dist/index33.cjs +6 -216
  104. package/dist/index33.cjs.map +1 -1
  105. package/dist/index33.js +7 -217
  106. package/dist/index33.js.map +1 -1
  107. package/dist/index34.cjs +215 -7
  108. package/dist/index34.cjs.map +1 -1
  109. package/dist/index34.js +217 -9
  110. package/dist/index34.js.map +1 -1
  111. package/dist/index35.cjs +10 -16
  112. package/dist/index35.cjs.map +1 -1
  113. package/dist/index35.js +9 -15
  114. package/dist/index35.js.map +1 -1
  115. package/dist/index36.cjs +15 -15
  116. package/dist/index36.cjs.map +1 -1
  117. package/dist/index36.js +15 -15
  118. package/dist/index36.js.map +1 -1
  119. package/dist/index37.cjs +5 -20
  120. package/dist/index37.cjs.map +1 -1
  121. package/dist/index37.js +5 -20
  122. package/dist/index37.js.map +1 -1
  123. package/dist/index38.cjs +15 -67
  124. package/dist/index38.cjs.map +1 -1
  125. package/dist/index38.js +14 -66
  126. package/dist/index38.js.map +1 -1
  127. package/dist/index39.cjs +67 -84
  128. package/dist/index39.cjs.map +1 -1
  129. package/dist/index39.js +66 -83
  130. package/dist/index39.js.map +1 -1
  131. package/dist/index4.cjs +12 -8
  132. package/dist/index4.cjs.map +1 -1
  133. package/dist/index4.js +12 -8
  134. package/dist/index4.js.map +1 -1
  135. package/dist/index40.cjs +35 -2
  136. package/dist/index40.cjs.map +1 -1
  137. package/dist/index40.js +36 -3
  138. package/dist/index40.js.map +1 -1
  139. package/dist/index41.cjs +15 -6
  140. package/dist/index41.cjs.map +1 -1
  141. package/dist/index41.js +16 -7
  142. package/dist/index41.js.map +1 -1
  143. package/dist/index42.cjs +52 -13
  144. package/dist/index42.cjs.map +1 -1
  145. package/dist/index42.js +52 -13
  146. package/dist/index42.js.map +1 -1
  147. package/dist/index43.cjs +14 -5
  148. package/dist/index43.cjs.map +1 -1
  149. package/dist/index43.js +14 -5
  150. package/dist/index43.js.map +1 -1
  151. package/dist/index44.cjs +30 -24
  152. package/dist/index44.cjs.map +1 -1
  153. package/dist/index44.js +30 -24
  154. package/dist/index44.js.map +1 -1
  155. package/dist/index45.cjs +14 -2
  156. package/dist/index45.cjs.map +1 -1
  157. package/dist/index45.js +14 -2
  158. package/dist/index45.js.map +1 -1
  159. package/dist/index46.cjs +14 -2
  160. package/dist/index46.cjs.map +1 -1
  161. package/dist/index46.js +15 -3
  162. package/dist/index46.js.map +1 -1
  163. package/dist/index47.cjs +2 -53
  164. package/dist/index47.cjs.map +1 -1
  165. package/dist/index47.js +3 -54
  166. package/dist/index47.js.map +1 -1
  167. package/dist/index48.cjs +2 -29
  168. package/dist/index48.cjs.map +1 -1
  169. package/dist/index48.js +3 -30
  170. package/dist/index48.js.map +1 -1
  171. package/dist/index49.cjs +2 -53
  172. package/dist/index49.cjs.map +1 -1
  173. package/dist/index49.js +3 -54
  174. package/dist/index49.js.map +1 -1
  175. package/dist/index5.cjs +9 -16
  176. package/dist/index5.cjs.map +1 -1
  177. package/dist/index5.js +10 -17
  178. package/dist/index5.js.map +1 -1
  179. package/dist/index50.cjs +32 -35
  180. package/dist/index50.cjs.map +1 -1
  181. package/dist/index50.js +32 -35
  182. package/dist/index50.js.map +1 -1
  183. package/dist/index51.cjs +48 -36
  184. package/dist/index51.cjs.map +1 -1
  185. package/dist/index51.js +48 -36
  186. package/dist/index51.js.map +1 -1
  187. package/dist/index52.cjs +16 -34
  188. package/dist/index52.cjs.map +1 -1
  189. package/dist/index52.js +16 -34
  190. package/dist/index52.js.map +1 -1
  191. package/dist/index53.cjs +31 -22
  192. package/dist/index53.cjs.map +1 -1
  193. package/dist/index53.js +32 -23
  194. package/dist/index53.js.map +1 -1
  195. package/dist/index54.cjs +52 -13
  196. package/dist/index54.cjs.map +1 -1
  197. package/dist/index54.js +53 -14
  198. package/dist/index54.js.map +1 -1
  199. package/dist/index55.cjs +134 -55
  200. package/dist/index55.cjs.map +1 -1
  201. package/dist/index55.js +133 -54
  202. package/dist/index55.js.map +1 -1
  203. package/dist/index56.cjs +46 -134
  204. package/dist/index56.cjs.map +1 -1
  205. package/dist/index56.js +45 -133
  206. package/dist/index56.js.map +1 -1
  207. package/dist/index57.cjs +16 -28
  208. package/dist/index57.cjs.map +1 -1
  209. package/dist/index57.js +17 -29
  210. package/dist/index57.js.map +1 -1
  211. package/dist/index58.cjs +22 -16
  212. package/dist/index58.cjs.map +1 -1
  213. package/dist/index58.js +22 -16
  214. package/dist/index58.js.map +1 -1
  215. package/dist/index59.cjs +10 -19
  216. package/dist/index59.cjs.map +1 -1
  217. package/dist/index59.js +10 -19
  218. package/dist/index59.js.map +1 -1
  219. package/dist/index6.cjs +19 -65
  220. package/dist/index6.cjs.map +1 -1
  221. package/dist/index6.js +19 -65
  222. package/dist/index6.js.map +1 -1
  223. package/dist/index60.cjs +17 -32
  224. package/dist/index60.cjs.map +1 -1
  225. package/dist/index60.js +18 -33
  226. package/dist/index60.js.map +1 -1
  227. package/dist/index61.cjs +78 -9
  228. package/dist/index61.cjs.map +1 -1
  229. package/dist/index61.js +79 -10
  230. package/dist/index61.js.map +1 -1
  231. package/dist/index62.cjs +37 -16
  232. package/dist/index62.cjs.map +1 -1
  233. package/dist/index62.js +37 -16
  234. package/dist/index62.js.map +1 -1
  235. package/dist/index63.cjs +16 -13
  236. package/dist/index63.cjs.map +1 -1
  237. package/dist/index63.js +17 -14
  238. package/dist/index63.js.map +1 -1
  239. package/dist/index65.cjs +18 -0
  240. package/dist/index65.cjs.map +1 -0
  241. package/dist/index65.js +18 -0
  242. package/dist/index65.js.map +1 -0
  243. package/dist/index7.cjs +58 -75
  244. package/dist/index7.cjs.map +1 -1
  245. package/dist/index7.js +58 -75
  246. package/dist/index7.js.map +1 -1
  247. package/dist/index8.cjs +82 -15
  248. package/dist/index8.cjs.map +1 -1
  249. package/dist/index8.js +82 -15
  250. package/dist/index8.js.map +1 -1
  251. package/dist/index9.cjs +14 -15
  252. package/dist/index9.cjs.map +1 -1
  253. package/dist/index9.js +15 -16
  254. package/dist/index9.js.map +1 -1
  255. package/dist/style.css +271 -0
  256. package/dist/tokens/semantic-tokens.css +21 -0
  257. package/dist/tokens/tokens.d.ts +35 -0
  258. package/dist/tokens/tokens.d.ts.map +1 -1
  259. package/package.json +1 -1
  260. package/dist/index2.cjs +0 -44
  261. package/dist/index2.cjs.map +0 -1
  262. package/dist/index2.js +0 -44
  263. package/dist/index2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index63.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
1
+ {"version":3,"file":"index63.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const root = "krc-root-la9-1";
4
+ const logo = "krc-logo-b73UT";
5
+ const card = "krc-card-1ev-q";
6
+ const footer = "krc-footer-E0B15";
7
+ const styles = {
8
+ root,
9
+ logo,
10
+ card,
11
+ footer
12
+ };
13
+ exports.card = card;
14
+ exports.default = styles;
15
+ exports.footer = footer;
16
+ exports.logo = logo;
17
+ exports.root = root;
18
+ //# sourceMappingURL=index65.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index65.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,18 @@
1
+ const root = "krc-root-la9-1";
2
+ const logo = "krc-logo-b73UT";
3
+ const card = "krc-card-1ev-q";
4
+ const footer = "krc-footer-E0B15";
5
+ const styles = {
6
+ root,
7
+ logo,
8
+ card,
9
+ footer
10
+ };
11
+ export {
12
+ card,
13
+ styles as default,
14
+ footer,
15
+ logo,
16
+ root
17
+ };
18
+ //# sourceMappingURL=index65.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index65.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
package/dist/index7.cjs CHANGED
@@ -1,85 +1,68 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const ensureString = (value) => value === null || value === void 0 ? "" : String(value);
4
- const toStringTable = (table) => table.map((row) => row.map((cell) => ensureString(cell)));
5
- const sanitizeFilename = (value) => {
6
- const normalized = value.normalize().replace(/[^\p{L}\p{N}]+/gu, "-").replace(/^-+|-+$/g, "").toLowerCase();
7
- return normalized || "export";
3
+ const truncateWithEllipsis = (value, maxLength = 36) => {
4
+ if (value.length <= maxLength) return value;
5
+ if (maxLength <= 3) return value.slice(0, maxLength);
6
+ return `${value.slice(0, maxLength - 3)}...`;
8
7
  };
9
- const buildCsv = (table) => {
10
- const rows = toStringTable(table);
11
- return rows.map(
12
- (row) => row.map((cell) => {
13
- const escaped = cell.replace(/"/g, '""');
14
- return /[",\n]/.test(escaped) ? `"${escaped}"` : escaped;
15
- }).join(",")
16
- ).join("\r\n");
17
- };
18
- const triggerDownload = (blob, filename) => {
19
- const link = document.createElement("a");
20
- const url = URL.createObjectURL(blob);
21
- link.href = url;
22
- link.download = filename;
23
- document.body.appendChild(link);
24
- link.click();
25
- document.body.removeChild(link);
26
- URL.revokeObjectURL(url);
27
- };
28
- const exportTableToCsv = (table, filename) => {
29
- if (table.length === 0) return;
30
- const csv = buildCsv(table);
31
- const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
32
- const finalName = filename.endsWith(".csv") ? filename : `${filename}.csv`;
33
- triggerDownload(blob, finalName);
8
+ const formatNumber = (value, options) => Number.isFinite(value) ? value.toLocaleString(void 0, options) : "0";
9
+ const formatBytes = (value) => {
10
+ if (!Number.isFinite(value) || value === 0) return "0 B";
11
+ const units = ["B", "KB", "MB", "GB", "TB", "PB"];
12
+ let index = 0;
13
+ let current = Math.abs(value);
14
+ while (current >= 1024 && index < units.length - 1) {
15
+ current /= 1024;
16
+ index += 1;
17
+ }
18
+ const formatted = current.toFixed(current >= 10 || index === 0 ? 0 : 1);
19
+ return `${value < 0 ? "-" : ""}${formatted} ${units[index]}`;
34
20
  };
35
- const getChartPngDataUrl = (chart) => chart.getDataURL({ type: "png", pixelRatio: 2, backgroundColor: "#ffffff" });
36
- const downloadImageDataUrl = (dataUrl, filename) => {
37
- const link = document.createElement("a");
38
- link.href = dataUrl;
39
- link.download = filename;
40
- document.body.appendChild(link);
41
- link.click();
42
- document.body.removeChild(link);
21
+ const DATETIME_FORMATTERS = /* @__PURE__ */ new Map();
22
+ const getDateTimeFormatter = (timeZone, withSeconds) => {
23
+ const key = `${timeZone}-${withSeconds ? "s" : "n"}`;
24
+ const cached = DATETIME_FORMATTERS.get(key);
25
+ if (cached) return cached;
26
+ const formatter = new Intl.DateTimeFormat(void 0, {
27
+ year: "numeric",
28
+ month: "2-digit",
29
+ day: "2-digit",
30
+ hour: "2-digit",
31
+ minute: "2-digit",
32
+ second: withSeconds ? "2-digit" : void 0,
33
+ hour12: false,
34
+ timeZone
35
+ });
36
+ DATETIME_FORMATTERS.set(key, formatter);
37
+ return formatter;
43
38
  };
44
- const buildTableHtml = (table) => {
45
- const rows = toStringTable(table);
46
- if (rows.length === 0) return "";
47
- const [header, ...body] = rows;
48
- const thead = `<thead><tr>${header.map((c) => `<th>${c}</th>`).join("")}</tr></thead>`;
49
- const tbody = body.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join("")}</tr>`).join("");
50
- return `<table>${thead}<tbody>${tbody}</tbody></table>`;
39
+ const formatDataTimestamp = (value, options = {}) => {
40
+ const { fallback = "Unknown", withSeconds = false, timeZone = "UTC", showTimeZoneLabel = false } = options;
41
+ if (!value) return fallback;
42
+ const date = new Date(value);
43
+ if (Number.isNaN(date.getTime())) return typeof value === "string" ? value : fallback;
44
+ const formatter = getDateTimeFormatter(timeZone, withSeconds);
45
+ const formatted = formatter.format(date);
46
+ return showTimeZoneLabel ? `${formatted} ${timeZone}` : formatted;
51
47
  };
52
- const openPrintWindowWithChart = (title, chartDataUrl, table) => {
53
- const win = window.open("", "_blank");
54
- if (!win) return;
55
- const tableHtml = buildTableHtml(table);
56
- win.document.write("<!DOCTYPE html>");
57
- win.document.write(`<html><head><title>${title}</title>`);
58
- win.document.write(
59
- "<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>"
60
- );
61
- win.document.write("</head><body>");
62
- win.document.write(`<h1>${title}</h1>`);
63
- win.document.write(`<img src="${chartDataUrl}" alt="${title}" />`);
64
- win.document.write(tableHtml);
65
- win.document.write("</body></html>");
66
- win.document.close();
67
- win.focus();
68
- setTimeout(() => win.print(), 300);
48
+ const formatLocalISOString = (date) => {
49
+ const pad = (n) => `${n}`.padStart(2, "0");
50
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
69
51
  };
70
- const composeFilename = (title, suffix) => {
71
- const base = sanitizeFilename(title);
72
- if (suffix && suffix.trim().length > 0) {
73
- const suffixSanitized = sanitizeFilename(suffix);
74
- return `${base}-${suffixSanitized}`;
52
+ const generateUUID = () => {
53
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
54
+ return crypto.randomUUID();
75
55
  }
76
- return base;
56
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
57
+ const r = Math.random() * 16 | 0;
58
+ const v = c === "x" ? r : r & 3 | 8;
59
+ return v.toString(16);
60
+ });
77
61
  };
78
- exports.composeFilename = composeFilename;
79
- exports.downloadImageDataUrl = downloadImageDataUrl;
80
- exports.exportTableToCsv = exportTableToCsv;
81
- exports.getChartPngDataUrl = getChartPngDataUrl;
82
- exports.openPrintWindowWithChart = openPrintWindowWithChart;
83
- exports.sanitizeFilename = sanitizeFilename;
84
- exports.toStringTable = toStringTable;
62
+ exports.formatBytes = formatBytes;
63
+ exports.formatDataTimestamp = formatDataTimestamp;
64
+ exports.formatLocalISOString = formatLocalISOString;
65
+ exports.formatNumber = formatNumber;
66
+ exports.generateUUID = generateUUID;
67
+ exports.truncateWithEllipsis = truncateWithEllipsis;
85
68
  //# sourceMappingURL=index7.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index7.cjs","sources":["../src/utils/chartExport.ts"],"sourcesContent":["export type TableData = Array<Array<string | number>>;\n\nconst ensureString = (value: string | number): string =>\n value === null || value === undefined ? '' : String(value);\n\nexport const toStringTable = (table: TableData): string[][] =>\n table.map((row) => row.map((cell) => ensureString(cell)));\n\nexport const sanitizeFilename = (value: string): string => {\n const normalized = value\n .normalize()\n .replace(/[^\\p{L}\\p{N}]+/gu, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n return normalized || 'export';\n};\n\nconst buildCsv = (table: TableData): string => {\n const rows = toStringTable(table);\n return rows\n .map((row) =>\n row\n .map((cell) => {\n const escaped = cell.replace(/\"/g, '\"\"');\n return /[\",\\n]/.test(escaped) ? `\"${escaped}\"` : escaped;\n })\n .join(','),\n )\n .join('\\r\\n');\n};\n\nconst triggerDownload = (blob: Blob, filename: string) => {\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n};\n\nexport const exportTableToCsv = (table: TableData, filename: string) => {\n if (table.length === 0) return;\n const csv = buildCsv(table);\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const finalName = filename.endsWith('.csv') ? filename : `${filename}.csv`;\n triggerDownload(blob, finalName);\n};\n\nexport const getChartPngDataUrl = (chart: { getDataURL: (opts: Record<string, unknown>) => string }): string =>\n chart.getDataURL({ type: 'png', pixelRatio: 2, backgroundColor: '#ffffff' });\n\nexport const downloadImageDataUrl = (dataUrl: string, filename: string) => {\n const link = document.createElement('a');\n link.href = dataUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\nconst buildTableHtml = (table: TableData): string => {\n const rows = toStringTable(table);\n if (rows.length === 0) return '';\n const [header, ...body] = rows;\n const thead = `<thead><tr>${header.map((c) => `<th>${c}</th>`).join('')}</tr></thead>`;\n const tbody = body.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join('')}</tr>`).join('');\n return `<table>${thead}<tbody>${tbody}</tbody></table>`;\n};\n\nexport const openPrintWindowWithChart = (title: string, chartDataUrl: string, table: TableData) => {\n const win = window.open('', '_blank');\n if (!win) return;\n const tableHtml = buildTableHtml(table);\n win.document.write('<!DOCTYPE html>');\n win.document.write(`<html><head><title>${title}</title>`);\n win.document.write(\n '<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>',\n );\n win.document.write('</head><body>');\n win.document.write(`<h1>${title}</h1>`);\n win.document.write(`<img src=\"${chartDataUrl}\" alt=\"${title}\" />`);\n win.document.write(tableHtml);\n win.document.write('</body></html>');\n win.document.close();\n win.focus();\n setTimeout(() => win.print(), 300);\n};\n\nexport const composeFilename = (title: string, suffix?: string) => {\n const base = sanitizeFilename(title);\n if (suffix && suffix.trim().length > 0) {\n const suffixSanitized = sanitizeFilename(suffix);\n return suffixSanitized ? `${base}-${suffixSanitized}` : base;\n }\n return base;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index7.cjs","sources":["../src/utils/format.ts"],"sourcesContent":["export const truncateWithEllipsis = (value: string, maxLength = 36) => {\n if (value.length <= maxLength) return value;\n if (maxLength <= 3) return value.slice(0, maxLength);\n return `${value.slice(0, maxLength - 3)}...`;\n};\n\nexport const formatNumber = (value: number, options?: Intl.NumberFormatOptions) =>\n Number.isFinite(value) ? value.toLocaleString(undefined, options) : '0';\n\nexport const formatBytes = (value: number): string => {\n if (!Number.isFinite(value) || value === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n let index = 0;\n let current = Math.abs(value);\n while (current >= 1024 && index < units.length - 1) {\n current /= 1024;\n index += 1;\n }\n const formatted = current.toFixed(current >= 10 || index === 0 ? 0 : 1);\n return `${value < 0 ? '-' : ''}${formatted} ${units[index]}`;\n};\n\ninterface FormatDataTimestampOptions {\n fallback?: string;\n withSeconds?: boolean;\n timeZone?: string;\n showTimeZoneLabel?: boolean;\n}\n\nconst DATETIME_FORMATTERS = new Map<string, Intl.DateTimeFormat>();\n\nconst getDateTimeFormatter = (timeZone: string, withSeconds: boolean) => {\n const key = `${timeZone}-${withSeconds ? 's' : 'n'}`;\n const cached = DATETIME_FORMATTERS.get(key);\n if (cached) return cached;\n const formatter = new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: withSeconds ? '2-digit' : undefined,\n hour12: false,\n timeZone,\n });\n DATETIME_FORMATTERS.set(key, formatter);\n return formatter;\n};\n\nexport const formatDataTimestamp = (\n value: string | null | undefined,\n options: FormatDataTimestampOptions = {},\n): string => {\n const { fallback = 'Unknown', withSeconds = false, timeZone = 'UTC', showTimeZoneLabel = false } =\n options;\n if (!value) return fallback;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return typeof value === 'string' ? value : fallback;\n const formatter = getDateTimeFormatter(timeZone, withSeconds);\n const formatted = formatter.format(date);\n return showTimeZoneLabel ? `${formatted} ${timeZone}` : formatted;\n};\n\nexport const formatLocalISOString = (date: Date): string => {\n const pad = (n: number) => `${n}`.padStart(2, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n};\n\nexport const generateUUID = (): string => {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n"],"names":[],"mappings":";;AAAO,MAAM,uBAAuB,CAAC,OAAe,YAAY,OAAO;AACrE,MAAI,MAAM,UAAU,UAAW,QAAO;AACtC,MAAI,aAAa,EAAG,QAAO,MAAM,MAAM,GAAG,SAAS;AACnD,SAAO,GAAG,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC;AACzC;AAEO,MAAM,eAAe,CAAC,OAAe,YAC1C,OAAO,SAAS,KAAK,IAAI,MAAM,eAAe,QAAW,OAAO,IAAI;AAE/D,MAAM,cAAc,CAAC,UAA0B;AACpD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,UAAU,EAAG,QAAO;AACnD,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAChD,MAAI,QAAQ;AACZ,MAAI,UAAU,KAAK,IAAI,KAAK;AAC5B,SAAO,WAAW,QAAQ,QAAQ,MAAM,SAAS,GAAG;AAClD,eAAW;AACX,aAAS;AAAA,EACX;AACA,QAAM,YAAY,QAAQ,QAAQ,WAAW,MAAM,UAAU,IAAI,IAAI,CAAC;AACtE,SAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,GAAG,SAAS,IAAI,MAAM,KAAK,CAAC;AAC5D;AASA,MAAM,0CAA0B,IAAA;AAEhC,MAAM,uBAAuB,CAAC,UAAkB,gBAAyB;AACvE,QAAM,MAAM,GAAG,QAAQ,IAAI,cAAc,MAAM,GAAG;AAClD,QAAM,SAAS,oBAAoB,IAAI,GAAG;AAC1C,MAAI,OAAQ,QAAO;AACnB,QAAM,YAAY,IAAI,KAAK,eAAe,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ,cAAc,YAAY;AAAA,IAClC,QAAQ;AAAA,IACR;AAAA,EAAA,CACD;AACD,sBAAoB,IAAI,KAAK,SAAS;AACtC,SAAO;AACT;AAEO,MAAM,sBAAsB,CACjC,OACA,UAAsC,OAC3B;AACX,QAAM,EAAE,WAAW,WAAW,cAAc,OAAO,WAAW,OAAO,oBAAoB,MAAA,IACvF;AACF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAA,CAAS,EAAG,QAAO,OAAO,UAAU,WAAW,QAAQ;AAC7E,QAAM,YAAY,qBAAqB,UAAU,WAAW;AAC5D,QAAM,YAAY,UAAU,OAAO,IAAI;AACvC,SAAO,oBAAoB,GAAG,SAAS,IAAI,QAAQ,KAAK;AAC1D;AAEO,MAAM,uBAAuB,CAAC,SAAuB;AAC1D,QAAM,MAAM,CAAC,MAAc,GAAG,CAAC,GAAG,SAAS,GAAG,GAAG;AACjD,SAAO,GAAG,KAAK,YAAA,CAAa,IAAI,IAAI,KAAK,SAAA,IAAa,CAAC,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,KAAK,SAAA,CAAU,CAAC,IAAI,IAAI,KAAK,WAAA,CAAY,CAAC,IAAI,IAAI,KAAK,WAAA,CAAY,CAAC;AAC7J;AAEO,MAAM,eAAe,MAAc;AACxC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,OAAO,WAAA;AAAA,EAChB;AACA,SAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,UAAM,IAAK,KAAK,OAAA,IAAW,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;;;;;;;"}
package/dist/index7.js CHANGED
@@ -1,85 +1,68 @@
1
- const ensureString = (value) => value === null || value === void 0 ? "" : String(value);
2
- const toStringTable = (table) => table.map((row) => row.map((cell) => ensureString(cell)));
3
- const sanitizeFilename = (value) => {
4
- const normalized = value.normalize().replace(/[^\p{L}\p{N}]+/gu, "-").replace(/^-+|-+$/g, "").toLowerCase();
5
- return normalized || "export";
1
+ const truncateWithEllipsis = (value, maxLength = 36) => {
2
+ if (value.length <= maxLength) return value;
3
+ if (maxLength <= 3) return value.slice(0, maxLength);
4
+ return `${value.slice(0, maxLength - 3)}...`;
6
5
  };
7
- const buildCsv = (table) => {
8
- const rows = toStringTable(table);
9
- return rows.map(
10
- (row) => row.map((cell) => {
11
- const escaped = cell.replace(/"/g, '""');
12
- return /[",\n]/.test(escaped) ? `"${escaped}"` : escaped;
13
- }).join(",")
14
- ).join("\r\n");
15
- };
16
- const triggerDownload = (blob, filename) => {
17
- const link = document.createElement("a");
18
- const url = URL.createObjectURL(blob);
19
- link.href = url;
20
- link.download = filename;
21
- document.body.appendChild(link);
22
- link.click();
23
- document.body.removeChild(link);
24
- URL.revokeObjectURL(url);
25
- };
26
- const exportTableToCsv = (table, filename) => {
27
- if (table.length === 0) return;
28
- const csv = buildCsv(table);
29
- const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
30
- const finalName = filename.endsWith(".csv") ? filename : `${filename}.csv`;
31
- triggerDownload(blob, finalName);
6
+ const formatNumber = (value, options) => Number.isFinite(value) ? value.toLocaleString(void 0, options) : "0";
7
+ const formatBytes = (value) => {
8
+ if (!Number.isFinite(value) || value === 0) return "0 B";
9
+ const units = ["B", "KB", "MB", "GB", "TB", "PB"];
10
+ let index = 0;
11
+ let current = Math.abs(value);
12
+ while (current >= 1024 && index < units.length - 1) {
13
+ current /= 1024;
14
+ index += 1;
15
+ }
16
+ const formatted = current.toFixed(current >= 10 || index === 0 ? 0 : 1);
17
+ return `${value < 0 ? "-" : ""}${formatted} ${units[index]}`;
32
18
  };
33
- const getChartPngDataUrl = (chart) => chart.getDataURL({ type: "png", pixelRatio: 2, backgroundColor: "#ffffff" });
34
- const downloadImageDataUrl = (dataUrl, filename) => {
35
- const link = document.createElement("a");
36
- link.href = dataUrl;
37
- link.download = filename;
38
- document.body.appendChild(link);
39
- link.click();
40
- document.body.removeChild(link);
19
+ const DATETIME_FORMATTERS = /* @__PURE__ */ new Map();
20
+ const getDateTimeFormatter = (timeZone, withSeconds) => {
21
+ const key = `${timeZone}-${withSeconds ? "s" : "n"}`;
22
+ const cached = DATETIME_FORMATTERS.get(key);
23
+ if (cached) return cached;
24
+ const formatter = new Intl.DateTimeFormat(void 0, {
25
+ year: "numeric",
26
+ month: "2-digit",
27
+ day: "2-digit",
28
+ hour: "2-digit",
29
+ minute: "2-digit",
30
+ second: withSeconds ? "2-digit" : void 0,
31
+ hour12: false,
32
+ timeZone
33
+ });
34
+ DATETIME_FORMATTERS.set(key, formatter);
35
+ return formatter;
41
36
  };
42
- const buildTableHtml = (table) => {
43
- const rows = toStringTable(table);
44
- if (rows.length === 0) return "";
45
- const [header, ...body] = rows;
46
- const thead = `<thead><tr>${header.map((c) => `<th>${c}</th>`).join("")}</tr></thead>`;
47
- const tbody = body.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join("")}</tr>`).join("");
48
- return `<table>${thead}<tbody>${tbody}</tbody></table>`;
37
+ const formatDataTimestamp = (value, options = {}) => {
38
+ const { fallback = "Unknown", withSeconds = false, timeZone = "UTC", showTimeZoneLabel = false } = options;
39
+ if (!value) return fallback;
40
+ const date = new Date(value);
41
+ if (Number.isNaN(date.getTime())) return typeof value === "string" ? value : fallback;
42
+ const formatter = getDateTimeFormatter(timeZone, withSeconds);
43
+ const formatted = formatter.format(date);
44
+ return showTimeZoneLabel ? `${formatted} ${timeZone}` : formatted;
49
45
  };
50
- const openPrintWindowWithChart = (title, chartDataUrl, table) => {
51
- const win = window.open("", "_blank");
52
- if (!win) return;
53
- const tableHtml = buildTableHtml(table);
54
- win.document.write("<!DOCTYPE html>");
55
- win.document.write(`<html><head><title>${title}</title>`);
56
- win.document.write(
57
- "<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>"
58
- );
59
- win.document.write("</head><body>");
60
- win.document.write(`<h1>${title}</h1>`);
61
- win.document.write(`<img src="${chartDataUrl}" alt="${title}" />`);
62
- win.document.write(tableHtml);
63
- win.document.write("</body></html>");
64
- win.document.close();
65
- win.focus();
66
- setTimeout(() => win.print(), 300);
46
+ const formatLocalISOString = (date) => {
47
+ const pad = (n) => `${n}`.padStart(2, "0");
48
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
67
49
  };
68
- const composeFilename = (title, suffix) => {
69
- const base = sanitizeFilename(title);
70
- if (suffix && suffix.trim().length > 0) {
71
- const suffixSanitized = sanitizeFilename(suffix);
72
- return `${base}-${suffixSanitized}`;
50
+ const generateUUID = () => {
51
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
52
+ return crypto.randomUUID();
73
53
  }
74
- return base;
54
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
55
+ const r = Math.random() * 16 | 0;
56
+ const v = c === "x" ? r : r & 3 | 8;
57
+ return v.toString(16);
58
+ });
75
59
  };
76
60
  export {
77
- composeFilename,
78
- downloadImageDataUrl,
79
- exportTableToCsv,
80
- getChartPngDataUrl,
81
- openPrintWindowWithChart,
82
- sanitizeFilename,
83
- toStringTable
61
+ formatBytes,
62
+ formatDataTimestamp,
63
+ formatLocalISOString,
64
+ formatNumber,
65
+ generateUUID,
66
+ truncateWithEllipsis
84
67
  };
85
68
  //# sourceMappingURL=index7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index7.js","sources":["../src/utils/chartExport.ts"],"sourcesContent":["export type TableData = Array<Array<string | number>>;\n\nconst ensureString = (value: string | number): string =>\n value === null || value === undefined ? '' : String(value);\n\nexport const toStringTable = (table: TableData): string[][] =>\n table.map((row) => row.map((cell) => ensureString(cell)));\n\nexport const sanitizeFilename = (value: string): string => {\n const normalized = value\n .normalize()\n .replace(/[^\\p{L}\\p{N}]+/gu, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n return normalized || 'export';\n};\n\nconst buildCsv = (table: TableData): string => {\n const rows = toStringTable(table);\n return rows\n .map((row) =>\n row\n .map((cell) => {\n const escaped = cell.replace(/\"/g, '\"\"');\n return /[\",\\n]/.test(escaped) ? `\"${escaped}\"` : escaped;\n })\n .join(','),\n )\n .join('\\r\\n');\n};\n\nconst triggerDownload = (blob: Blob, filename: string) => {\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n};\n\nexport const exportTableToCsv = (table: TableData, filename: string) => {\n if (table.length === 0) return;\n const csv = buildCsv(table);\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const finalName = filename.endsWith('.csv') ? filename : `${filename}.csv`;\n triggerDownload(blob, finalName);\n};\n\nexport const getChartPngDataUrl = (chart: { getDataURL: (opts: Record<string, unknown>) => string }): string =>\n chart.getDataURL({ type: 'png', pixelRatio: 2, backgroundColor: '#ffffff' });\n\nexport const downloadImageDataUrl = (dataUrl: string, filename: string) => {\n const link = document.createElement('a');\n link.href = dataUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\nconst buildTableHtml = (table: TableData): string => {\n const rows = toStringTable(table);\n if (rows.length === 0) return '';\n const [header, ...body] = rows;\n const thead = `<thead><tr>${header.map((c) => `<th>${c}</th>`).join('')}</tr></thead>`;\n const tbody = body.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join('')}</tr>`).join('');\n return `<table>${thead}<tbody>${tbody}</tbody></table>`;\n};\n\nexport const openPrintWindowWithChart = (title: string, chartDataUrl: string, table: TableData) => {\n const win = window.open('', '_blank');\n if (!win) return;\n const tableHtml = buildTableHtml(table);\n win.document.write('<!DOCTYPE html>');\n win.document.write(`<html><head><title>${title}</title>`);\n win.document.write(\n '<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>',\n );\n win.document.write('</head><body>');\n win.document.write(`<h1>${title}</h1>`);\n win.document.write(`<img src=\"${chartDataUrl}\" alt=\"${title}\" />`);\n win.document.write(tableHtml);\n win.document.write('</body></html>');\n win.document.close();\n win.focus();\n setTimeout(() => win.print(), 300);\n};\n\nexport const composeFilename = (title: string, suffix?: string) => {\n const base = sanitizeFilename(title);\n if (suffix && suffix.trim().length > 0) {\n const suffixSanitized = sanitizeFilename(suffix);\n return suffixSanitized ? `${base}-${suffixSanitized}` : base;\n }\n return base;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index7.js","sources":["../src/utils/format.ts"],"sourcesContent":["export const truncateWithEllipsis = (value: string, maxLength = 36) => {\n if (value.length <= maxLength) return value;\n if (maxLength <= 3) return value.slice(0, maxLength);\n return `${value.slice(0, maxLength - 3)}...`;\n};\n\nexport const formatNumber = (value: number, options?: Intl.NumberFormatOptions) =>\n Number.isFinite(value) ? value.toLocaleString(undefined, options) : '0';\n\nexport const formatBytes = (value: number): string => {\n if (!Number.isFinite(value) || value === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n let index = 0;\n let current = Math.abs(value);\n while (current >= 1024 && index < units.length - 1) {\n current /= 1024;\n index += 1;\n }\n const formatted = current.toFixed(current >= 10 || index === 0 ? 0 : 1);\n return `${value < 0 ? '-' : ''}${formatted} ${units[index]}`;\n};\n\ninterface FormatDataTimestampOptions {\n fallback?: string;\n withSeconds?: boolean;\n timeZone?: string;\n showTimeZoneLabel?: boolean;\n}\n\nconst DATETIME_FORMATTERS = new Map<string, Intl.DateTimeFormat>();\n\nconst getDateTimeFormatter = (timeZone: string, withSeconds: boolean) => {\n const key = `${timeZone}-${withSeconds ? 's' : 'n'}`;\n const cached = DATETIME_FORMATTERS.get(key);\n if (cached) return cached;\n const formatter = new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: withSeconds ? '2-digit' : undefined,\n hour12: false,\n timeZone,\n });\n DATETIME_FORMATTERS.set(key, formatter);\n return formatter;\n};\n\nexport const formatDataTimestamp = (\n value: string | null | undefined,\n options: FormatDataTimestampOptions = {},\n): string => {\n const { fallback = 'Unknown', withSeconds = false, timeZone = 'UTC', showTimeZoneLabel = false } =\n options;\n if (!value) return fallback;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return typeof value === 'string' ? value : fallback;\n const formatter = getDateTimeFormatter(timeZone, withSeconds);\n const formatted = formatter.format(date);\n return showTimeZoneLabel ? `${formatted} ${timeZone}` : formatted;\n};\n\nexport const formatLocalISOString = (date: Date): string => {\n const pad = (n: number) => `${n}`.padStart(2, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n};\n\nexport const generateUUID = (): string => {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n"],"names":[],"mappings":"AAAO,MAAM,uBAAuB,CAAC,OAAe,YAAY,OAAO;AACrE,MAAI,MAAM,UAAU,UAAW,QAAO;AACtC,MAAI,aAAa,EAAG,QAAO,MAAM,MAAM,GAAG,SAAS;AACnD,SAAO,GAAG,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC;AACzC;AAEO,MAAM,eAAe,CAAC,OAAe,YAC1C,OAAO,SAAS,KAAK,IAAI,MAAM,eAAe,QAAW,OAAO,IAAI;AAE/D,MAAM,cAAc,CAAC,UAA0B;AACpD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,UAAU,EAAG,QAAO;AACnD,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAChD,MAAI,QAAQ;AACZ,MAAI,UAAU,KAAK,IAAI,KAAK;AAC5B,SAAO,WAAW,QAAQ,QAAQ,MAAM,SAAS,GAAG;AAClD,eAAW;AACX,aAAS;AAAA,EACX;AACA,QAAM,YAAY,QAAQ,QAAQ,WAAW,MAAM,UAAU,IAAI,IAAI,CAAC;AACtE,SAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,GAAG,SAAS,IAAI,MAAM,KAAK,CAAC;AAC5D;AASA,MAAM,0CAA0B,IAAA;AAEhC,MAAM,uBAAuB,CAAC,UAAkB,gBAAyB;AACvE,QAAM,MAAM,GAAG,QAAQ,IAAI,cAAc,MAAM,GAAG;AAClD,QAAM,SAAS,oBAAoB,IAAI,GAAG;AAC1C,MAAI,OAAQ,QAAO;AACnB,QAAM,YAAY,IAAI,KAAK,eAAe,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ,cAAc,YAAY;AAAA,IAClC,QAAQ;AAAA,IACR;AAAA,EAAA,CACD;AACD,sBAAoB,IAAI,KAAK,SAAS;AACtC,SAAO;AACT;AAEO,MAAM,sBAAsB,CACjC,OACA,UAAsC,OAC3B;AACX,QAAM,EAAE,WAAW,WAAW,cAAc,OAAO,WAAW,OAAO,oBAAoB,MAAA,IACvF;AACF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAA,CAAS,EAAG,QAAO,OAAO,UAAU,WAAW,QAAQ;AAC7E,QAAM,YAAY,qBAAqB,UAAU,WAAW;AAC5D,QAAM,YAAY,UAAU,OAAO,IAAI;AACvC,SAAO,oBAAoB,GAAG,SAAS,IAAI,QAAQ,KAAK;AAC1D;AAEO,MAAM,uBAAuB,CAAC,SAAuB;AAC1D,QAAM,MAAM,CAAC,MAAc,GAAG,CAAC,GAAG,SAAS,GAAG,GAAG;AACjD,SAAO,GAAG,KAAK,YAAA,CAAa,IAAI,IAAI,KAAK,SAAA,IAAa,CAAC,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,KAAK,SAAA,CAAU,CAAC,IAAI,IAAI,KAAK,WAAA,CAAY,CAAC,IAAI,IAAI,KAAK,WAAA,CAAY,CAAC;AAC7J;AAEO,MAAM,eAAe,MAAc;AACxC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,OAAO,WAAA;AAAA,EAChB;AACA,SAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,UAAM,IAAK,KAAK,OAAA,IAAW,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;"}
package/dist/index8.cjs CHANGED
@@ -1,18 +1,85 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const jsxRuntime = require("react/jsx-runtime");
4
- const clsx = require("./index35.cjs");
5
- const AuthLayout_module = require("./index61.cjs");
6
- const AuthLayout = ({
7
- children,
8
- logo,
9
- footer,
10
- maxWidth = "28rem",
11
- className
12
- }) => /* @__PURE__ */ jsxRuntime.jsxs("main", { className: clsx.clsx(AuthLayout_module.default.root, className), children: [
13
- logo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: AuthLayout_module.default.logo, children: logo }),
14
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: AuthLayout_module.default.card, style: { maxWidth }, children }),
15
- footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: AuthLayout_module.default.footer, children: footer })
16
- ] });
17
- exports.AuthLayout = AuthLayout;
3
+ const ensureString = (value) => value === null || value === void 0 ? "" : String(value);
4
+ const toStringTable = (table) => table.map((row) => row.map((cell) => ensureString(cell)));
5
+ const sanitizeFilename = (value) => {
6
+ const normalized = value.normalize().replace(/[^\p{L}\p{N}]+/gu, "-").replace(/^-+|-+$/g, "").toLowerCase();
7
+ return normalized || "export";
8
+ };
9
+ const buildCsv = (table) => {
10
+ const rows = toStringTable(table);
11
+ return rows.map(
12
+ (row) => row.map((cell) => {
13
+ const escaped = cell.replace(/"/g, '""');
14
+ return /[",\n]/.test(escaped) ? `"${escaped}"` : escaped;
15
+ }).join(",")
16
+ ).join("\r\n");
17
+ };
18
+ const triggerDownload = (blob, filename) => {
19
+ const link = document.createElement("a");
20
+ const url = URL.createObjectURL(blob);
21
+ link.href = url;
22
+ link.download = filename;
23
+ document.body.appendChild(link);
24
+ link.click();
25
+ document.body.removeChild(link);
26
+ URL.revokeObjectURL(url);
27
+ };
28
+ const exportTableToCsv = (table, filename) => {
29
+ if (table.length === 0) return;
30
+ const csv = buildCsv(table);
31
+ const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
32
+ const finalName = filename.endsWith(".csv") ? filename : `${filename}.csv`;
33
+ triggerDownload(blob, finalName);
34
+ };
35
+ const getChartPngDataUrl = (chart) => chart.getDataURL({ type: "png", pixelRatio: 2, backgroundColor: "#ffffff" });
36
+ const downloadImageDataUrl = (dataUrl, filename) => {
37
+ const link = document.createElement("a");
38
+ link.href = dataUrl;
39
+ link.download = filename;
40
+ document.body.appendChild(link);
41
+ link.click();
42
+ document.body.removeChild(link);
43
+ };
44
+ const buildTableHtml = (table) => {
45
+ const rows = toStringTable(table);
46
+ if (rows.length === 0) return "";
47
+ const [header, ...body] = rows;
48
+ const thead = `<thead><tr>${header.map((c) => `<th>${c}</th>`).join("")}</tr></thead>`;
49
+ const tbody = body.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join("")}</tr>`).join("");
50
+ return `<table>${thead}<tbody>${tbody}</tbody></table>`;
51
+ };
52
+ const openPrintWindowWithChart = (title, chartDataUrl, table) => {
53
+ const win = window.open("", "_blank");
54
+ if (!win) return;
55
+ const tableHtml = buildTableHtml(table);
56
+ win.document.write("<!DOCTYPE html>");
57
+ win.document.write(`<html><head><title>${title}</title>`);
58
+ win.document.write(
59
+ "<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>"
60
+ );
61
+ win.document.write("</head><body>");
62
+ win.document.write(`<h1>${title}</h1>`);
63
+ win.document.write(`<img src="${chartDataUrl}" alt="${title}" />`);
64
+ win.document.write(tableHtml);
65
+ win.document.write("</body></html>");
66
+ win.document.close();
67
+ win.focus();
68
+ setTimeout(() => win.print(), 300);
69
+ };
70
+ const composeFilename = (title, suffix) => {
71
+ const base = sanitizeFilename(title);
72
+ if (suffix && suffix.trim().length > 0) {
73
+ const suffixSanitized = sanitizeFilename(suffix);
74
+ return `${base}-${suffixSanitized}`;
75
+ }
76
+ return base;
77
+ };
78
+ exports.composeFilename = composeFilename;
79
+ exports.downloadImageDataUrl = downloadImageDataUrl;
80
+ exports.exportTableToCsv = exportTableToCsv;
81
+ exports.getChartPngDataUrl = getChartPngDataUrl;
82
+ exports.openPrintWindowWithChart = openPrintWindowWithChart;
83
+ exports.sanitizeFilename = sanitizeFilename;
84
+ exports.toStringTable = toStringTable;
18
85
  //# sourceMappingURL=index8.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index8.cjs","sources":["../src/layouts/AuthLayout/AuthLayout.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport type { AuthLayoutProps } from './AuthLayout.types';\nimport styles from './AuthLayout.module.css';\n\nexport const AuthLayout = ({\n children,\n logo,\n footer,\n maxWidth = '28rem',\n className,\n}: AuthLayoutProps) => (\n <main className={clsx(styles.root, className)}>\n {logo && <div className={styles.logo}>{logo}</div>}\n <div className={styles.card} style={{ maxWidth }}>\n {children}\n </div>\n {footer && <div className={styles.footer}>{footer}</div>}\n </main>\n);\n"],"names":["clsx","styles","jsx"],"mappings":";;;;;AAIO,MAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,sCACG,QAAA,EAAK,WAAWA,KAAAA,KAAKC,kBAAAA,QAAO,MAAM,SAAS,GACzC,UAAA;AAAA,EAAA,QAAQC,2BAAAA,IAAC,OAAA,EAAI,WAAWD,kBAAAA,QAAO,MAAO,UAAA,MAAK;AAAA,EAC5CC,+BAAC,SAAI,WAAWD,kBAAAA,QAAO,MAAM,OAAO,EAAE,YACnC,UACH;AAAA,EACC,UAAUC,2BAAAA,IAAC,OAAA,EAAI,WAAWD,kBAAAA,QAAO,QAAS,UAAA,OAAA,CAAO;AAAA,EAAA,CACpD;;"}
1
+ {"version":3,"file":"index8.cjs","sources":["../src/utils/chartExport.ts"],"sourcesContent":["export type TableData = Array<Array<string | number>>;\n\nconst ensureString = (value: string | number): string =>\n value === null || value === undefined ? '' : String(value);\n\nexport const toStringTable = (table: TableData): string[][] =>\n table.map((row) => row.map((cell) => ensureString(cell)));\n\nexport const sanitizeFilename = (value: string): string => {\n const normalized = value\n .normalize()\n .replace(/[^\\p{L}\\p{N}]+/gu, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n return normalized || 'export';\n};\n\nconst buildCsv = (table: TableData): string => {\n const rows = toStringTable(table);\n return rows\n .map((row) =>\n row\n .map((cell) => {\n const escaped = cell.replace(/\"/g, '\"\"');\n return /[\",\\n]/.test(escaped) ? `\"${escaped}\"` : escaped;\n })\n .join(','),\n )\n .join('\\r\\n');\n};\n\nconst triggerDownload = (blob: Blob, filename: string) => {\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n};\n\nexport const exportTableToCsv = (table: TableData, filename: string) => {\n if (table.length === 0) return;\n const csv = buildCsv(table);\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const finalName = filename.endsWith('.csv') ? filename : `${filename}.csv`;\n triggerDownload(blob, finalName);\n};\n\nexport const getChartPngDataUrl = (chart: { getDataURL: (opts: Record<string, unknown>) => string }): string =>\n chart.getDataURL({ type: 'png', pixelRatio: 2, backgroundColor: '#ffffff' });\n\nexport const downloadImageDataUrl = (dataUrl: string, filename: string) => {\n const link = document.createElement('a');\n link.href = dataUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\nconst buildTableHtml = (table: TableData): string => {\n const rows = toStringTable(table);\n if (rows.length === 0) return '';\n const [header, ...body] = rows;\n const thead = `<thead><tr>${header.map((c) => `<th>${c}</th>`).join('')}</tr></thead>`;\n const tbody = body.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join('')}</tr>`).join('');\n return `<table>${thead}<tbody>${tbody}</tbody></table>`;\n};\n\nexport const openPrintWindowWithChart = (title: string, chartDataUrl: string, table: TableData) => {\n const win = window.open('', '_blank');\n if (!win) return;\n const tableHtml = buildTableHtml(table);\n win.document.write('<!DOCTYPE html>');\n win.document.write(`<html><head><title>${title}</title>`);\n win.document.write(\n '<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>',\n );\n win.document.write('</head><body>');\n win.document.write(`<h1>${title}</h1>`);\n win.document.write(`<img src=\"${chartDataUrl}\" alt=\"${title}\" />`);\n win.document.write(tableHtml);\n win.document.write('</body></html>');\n win.document.close();\n win.focus();\n setTimeout(() => win.print(), 300);\n};\n\nexport const composeFilename = (title: string, suffix?: string) => {\n const base = sanitizeFilename(title);\n if (suffix && suffix.trim().length > 0) {\n const suffixSanitized = sanitizeFilename(suffix);\n return suffixSanitized ? `${base}-${suffixSanitized}` : base;\n }\n return base;\n};\n"],"names":[],"mappings":"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"}