@ktnpm_devops/react-component 0.2.1 → 0.4.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 (285) hide show
  1. package/dist/index.cjs +38 -33
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +5 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +38 -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 +40 -155
  32. package/dist/index16.cjs.map +1 -1
  33. package/dist/index16.js +42 -157
  34. package/dist/index16.js.map +1 -1
  35. package/dist/index17.cjs +86 -132
  36. package/dist/index17.cjs.map +1 -1
  37. package/dist/index17.js +88 -134
  38. package/dist/index17.js.map +1 -1
  39. package/dist/index18.cjs +150 -113
  40. package/dist/index18.cjs.map +1 -1
  41. package/dist/index18.js +151 -114
  42. package/dist/index18.js.map +1 -1
  43. package/dist/index19.cjs +136 -17
  44. package/dist/index19.cjs.map +1 -1
  45. package/dist/index19.js +136 -17
  46. package/dist/index19.js.map +1 -1
  47. package/dist/index20.cjs +120 -7
  48. package/dist/index20.cjs.map +1 -1
  49. package/dist/index20.js +122 -9
  50. package/dist/index20.js.map +1 -1
  51. package/dist/index21.cjs +16 -130
  52. package/dist/index21.cjs.map +1 -1
  53. package/dist/index21.js +16 -130
  54. package/dist/index21.js.map +1 -1
  55. package/dist/index22.cjs +8 -38
  56. package/dist/index22.cjs.map +1 -1
  57. package/dist/index22.js +9 -39
  58. package/dist/index22.js.map +1 -1
  59. package/dist/index23.cjs +118 -211
  60. package/dist/index23.cjs.map +1 -1
  61. package/dist/index23.js +119 -212
  62. package/dist/index23.js.map +1 -1
  63. package/dist/index24.cjs +38 -34
  64. package/dist/index24.cjs.map +1 -1
  65. package/dist/index24.js +39 -35
  66. package/dist/index24.js.map +1 -1
  67. package/dist/index25.cjs +211 -65
  68. package/dist/index25.cjs.map +1 -1
  69. package/dist/index25.js +211 -65
  70. package/dist/index25.js.map +1 -1
  71. package/dist/index26.cjs +29 -148
  72. package/dist/index26.cjs.map +1 -1
  73. package/dist/index26.js +31 -150
  74. package/dist/index26.js.map +1 -1
  75. package/dist/index27.cjs +77 -7
  76. package/dist/index27.cjs.map +1 -1
  77. package/dist/index27.js +79 -9
  78. package/dist/index27.js.map +1 -1
  79. package/dist/index28.cjs +59 -17
  80. package/dist/index28.cjs.map +1 -1
  81. package/dist/index28.js +60 -18
  82. package/dist/index28.js.map +1 -1
  83. package/dist/index29.cjs +146 -70
  84. package/dist/index29.cjs.map +1 -1
  85. package/dist/index29.js +148 -72
  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 +7 -142
  92. package/dist/index30.cjs.map +1 -1
  93. package/dist/index30.js +9 -144
  94. package/dist/index30.js.map +1 -1
  95. package/dist/index31.cjs +15 -103
  96. package/dist/index31.cjs.map +1 -1
  97. package/dist/index31.js +14 -102
  98. package/dist/index31.js.map +1 -1
  99. package/dist/index32.cjs +77 -6
  100. package/dist/index32.cjs.map +1 -1
  101. package/dist/index32.js +78 -7
  102. package/dist/index32.js.map +1 -1
  103. package/dist/index33.cjs +133 -206
  104. package/dist/index33.cjs.map +1 -1
  105. package/dist/index33.js +134 -207
  106. package/dist/index33.js.map +1 -1
  107. package/dist/index34.cjs +104 -7
  108. package/dist/index34.cjs.map +1 -1
  109. package/dist/index34.js +106 -9
  110. package/dist/index34.js.map +1 -1
  111. package/dist/index35.cjs +8 -16
  112. package/dist/index35.cjs.map +1 -1
  113. package/dist/index35.js +7 -15
  114. package/dist/index35.js.map +1 -1
  115. package/dist/index36.cjs +218 -7
  116. package/dist/index36.cjs.map +1 -1
  117. package/dist/index36.js +217 -6
  118. package/dist/index36.js.map +1 -1
  119. package/dist/index37.cjs +10 -7
  120. package/dist/index37.cjs.map +1 -1
  121. package/dist/index37.js +9 -6
  122. package/dist/index37.js.map +1 -1
  123. package/dist/index38.cjs +15 -6
  124. package/dist/index38.cjs.map +1 -1
  125. package/dist/index38.js +15 -6
  126. package/dist/index38.js.map +1 -1
  127. package/dist/index39.cjs +9 -15
  128. package/dist/index39.cjs.map +1 -1
  129. package/dist/index39.js +10 -16
  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 +24 -67
  136. package/dist/index40.cjs.map +1 -1
  137. package/dist/index40.js +23 -66
  138. package/dist/index40.js.map +1 -1
  139. package/dist/index41.cjs +10 -37
  140. package/dist/index41.cjs.map +1 -1
  141. package/dist/index41.js +10 -37
  142. package/dist/index41.js.map +1 -1
  143. package/dist/index42.cjs +2 -17
  144. package/dist/index42.cjs.map +1 -1
  145. package/dist/index42.js +3 -18
  146. package/dist/index42.js.map +1 -1
  147. package/dist/index43.cjs +2 -11
  148. package/dist/index43.cjs.map +1 -1
  149. package/dist/index43.js +2 -11
  150. package/dist/index43.js.map +1 -1
  151. package/dist/index44.cjs +22 -16
  152. package/dist/index44.cjs.map +1 -1
  153. package/dist/index44.js +22 -16
  154. package/dist/index44.js.map +1 -1
  155. package/dist/index45.cjs +16 -134
  156. package/dist/index45.cjs.map +1 -1
  157. package/dist/index45.js +15 -133
  158. package/dist/index45.js.map +1 -1
  159. package/dist/index46.cjs +15 -39
  160. package/dist/index46.cjs.map +1 -1
  161. package/dist/index46.js +16 -40
  162. package/dist/index46.js.map +1 -1
  163. package/dist/index47.cjs +16 -28
  164. package/dist/index47.cjs.map +1 -1
  165. package/dist/index47.js +16 -28
  166. package/dist/index47.js.map +1 -1
  167. package/dist/index48.cjs +67 -57
  168. package/dist/index48.cjs.map +1 -1
  169. package/dist/index48.js +66 -56
  170. package/dist/index48.js.map +1 -1
  171. package/dist/index49.cjs +77 -26
  172. package/dist/index49.cjs.map +1 -1
  173. package/dist/index49.js +77 -26
  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/index51.cjs +30 -21
  180. package/dist/index51.cjs.map +1 -1
  181. package/dist/index51.js +30 -21
  182. package/dist/index51.js.map +1 -1
  183. package/dist/index52.cjs +13 -13
  184. package/dist/index52.js +14 -14
  185. package/dist/index54.cjs +1 -4
  186. package/dist/index54.cjs.map +1 -1
  187. package/dist/index54.js +1 -4
  188. package/dist/index54.js.map +1 -1
  189. package/dist/index55.cjs +5 -14
  190. package/dist/index55.cjs.map +1 -1
  191. package/dist/index55.js +5 -14
  192. package/dist/index55.js.map +1 -1
  193. package/dist/index56.cjs +37 -10
  194. package/dist/index56.cjs.map +1 -1
  195. package/dist/index56.js +37 -10
  196. package/dist/index56.js.map +1 -1
  197. package/dist/index57.cjs +2 -11
  198. package/dist/index57.cjs.map +1 -1
  199. package/dist/index57.js +2 -11
  200. package/dist/index57.js.map +1 -1
  201. package/dist/index58.cjs +13 -19
  202. package/dist/index58.cjs.map +1 -1
  203. package/dist/index58.js +13 -19
  204. package/dist/index58.js.map +1 -1
  205. package/dist/index59.cjs +27 -54
  206. package/dist/index59.cjs.map +1 -1
  207. package/dist/index59.js +28 -55
  208. package/dist/index59.js.map +1 -1
  209. package/dist/index6.cjs +19 -65
  210. package/dist/index6.cjs.map +1 -1
  211. package/dist/index6.js +19 -65
  212. package/dist/index6.js.map +1 -1
  213. package/dist/index60.cjs +64 -22
  214. package/dist/index60.cjs.map +1 -1
  215. package/dist/index60.js +64 -22
  216. package/dist/index60.js.map +1 -1
  217. package/dist/index61.cjs +15 -48
  218. package/dist/index61.cjs.map +1 -1
  219. package/dist/index61.js +16 -49
  220. package/dist/index61.js.map +1 -1
  221. package/dist/index62.cjs +16 -13
  222. package/dist/index62.cjs.map +1 -1
  223. package/dist/index62.js +17 -14
  224. package/dist/index62.js.map +1 -1
  225. package/dist/index63.cjs +27 -48
  226. package/dist/index63.cjs.map +1 -1
  227. package/dist/index63.js +27 -48
  228. package/dist/index63.js.map +1 -1
  229. package/dist/index64.cjs +13 -37
  230. package/dist/index64.cjs.map +1 -1
  231. package/dist/index64.js +14 -38
  232. package/dist/index64.js.map +1 -1
  233. package/dist/index65.cjs +45 -0
  234. package/dist/index65.cjs.map +1 -0
  235. package/dist/index65.js +45 -0
  236. package/dist/index65.js.map +1 -0
  237. package/dist/index66.cjs +136 -0
  238. package/dist/index66.cjs.map +1 -0
  239. package/dist/index66.js +136 -0
  240. package/dist/index66.js.map +1 -0
  241. package/dist/index67.cjs +48 -0
  242. package/dist/index67.cjs.map +1 -0
  243. package/dist/index67.js +48 -0
  244. package/dist/index67.js.map +1 -0
  245. package/dist/index68.cjs +60 -0
  246. package/dist/index68.cjs.map +1 -0
  247. package/dist/index68.js +60 -0
  248. package/dist/index68.js.map +1 -0
  249. package/dist/index69.cjs +57 -0
  250. package/dist/index69.cjs.map +1 -0
  251. package/dist/index69.js +57 -0
  252. package/dist/index69.js.map +1 -0
  253. package/dist/index7.cjs +58 -75
  254. package/dist/index7.cjs.map +1 -1
  255. package/dist/index7.js +58 -75
  256. package/dist/index7.js.map +1 -1
  257. package/dist/index8.cjs +82 -15
  258. package/dist/index8.cjs.map +1 -1
  259. package/dist/index8.js +82 -15
  260. package/dist/index8.js.map +1 -1
  261. package/dist/index9.cjs +14 -15
  262. package/dist/index9.cjs.map +1 -1
  263. package/dist/index9.js +15 -16
  264. package/dist/index9.js.map +1 -1
  265. package/dist/primitives/Col/Col.d.ts +4 -0
  266. package/dist/primitives/Col/Col.d.ts.map +1 -0
  267. package/dist/primitives/Col/Col.types.d.ts +13 -0
  268. package/dist/primitives/Col/Col.types.d.ts.map +1 -0
  269. package/dist/primitives/Col/index.d.ts +3 -0
  270. package/dist/primitives/Col/index.d.ts.map +1 -0
  271. package/dist/primitives/Row/Row.d.ts +4 -0
  272. package/dist/primitives/Row/Row.d.ts.map +1 -0
  273. package/dist/primitives/Row/Row.types.d.ts +16 -0
  274. package/dist/primitives/Row/Row.types.d.ts.map +1 -0
  275. package/dist/primitives/Row/index.d.ts +3 -0
  276. package/dist/primitives/Row/index.d.ts.map +1 -0
  277. package/dist/style.css +312 -0
  278. package/dist/tokens/semantic-tokens.css +21 -0
  279. package/dist/tokens/tokens.d.ts +35 -0
  280. package/dist/tokens/tokens.d.ts.map +1 -1
  281. package/package.json +3 -2
  282. package/dist/index2.cjs +0 -44
  283. package/dist/index2.cjs.map +0 -1
  284. package/dist/index2.js +0 -44
  285. package/dist/index2.js.map +0 -1
@@ -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":"AAEA,MAAM,eAAe,CAAC,UACpB,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAEpD,MAAM,gBAAgB,CAAC,UAC5B,MAAM,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,aAAa,IAAI,CAAC,CAAC;AAEnD,MAAM,mBAAmB,CAAC,UAA0B;AACzD,QAAM,aAAa,MAChB,UAAA,EACA,QAAQ,oBAAoB,GAAG,EAC/B,QAAQ,YAAY,EAAE,EACtB,YAAA;AACH,SAAO,cAAc;AACvB;AAEA,MAAM,WAAW,CAAC,UAA6B;AAC7C,QAAM,OAAO,cAAc,KAAK;AAChC,SAAO,KACJ;AAAA,IAAI,CAAC,QACJ,IACG,IAAI,CAAC,SAAS;AACb,YAAM,UAAU,KAAK,QAAQ,MAAM,IAAI;AACvC,aAAO,SAAS,KAAK,OAAO,IAAI,IAAI,OAAO,MAAM;AAAA,IACnD,CAAC,EACA,KAAK,GAAG;AAAA,EAAA,EAEZ,KAAK,MAAM;AAChB;AAEA,MAAM,kBAAkB,CAAC,MAAY,aAAqB;AACxD,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,WAAS,KAAK,YAAY,IAAI;AAC9B,OAAK,MAAA;AACL,WAAS,KAAK,YAAY,IAAI;AAC9B,MAAI,gBAAgB,GAAG;AACzB;AAEO,MAAM,mBAAmB,CAAC,OAAkB,aAAqB;AACtE,MAAI,MAAM,WAAW,EAAG;AACxB,QAAM,MAAM,SAAS,KAAK;AAC1B,QAAM,OAAO,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,2BAA2B;AAChE,QAAM,YAAY,SAAS,SAAS,MAAM,IAAI,WAAW,GAAG,QAAQ;AACpE,kBAAgB,MAAM,SAAS;AACjC;AAEO,MAAM,qBAAqB,CAAC,UACjC,MAAM,WAAW,EAAE,MAAM,OAAO,YAAY,GAAG,iBAAiB,UAAA,CAAW;AAEtE,MAAM,uBAAuB,CAAC,SAAiB,aAAqB;AACzE,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,WAAS,KAAK,YAAY,IAAI;AAC9B,OAAK,MAAA;AACL,WAAS,KAAK,YAAY,IAAI;AAChC;AAEA,MAAM,iBAAiB,CAAC,UAA6B;AACnD,QAAM,OAAO,cAAc,KAAK;AAChC,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,CAAC,QAAQ,GAAG,IAAI,IAAI;AAC1B,QAAM,QAAQ,cAAc,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;AACvE,QAAM,QAAQ,KAAK,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE;AAC3F,SAAO,UAAU,KAAK,UAAU,KAAK;AACvC;AAEO,MAAM,2BAA2B,CAAC,OAAe,cAAsB,UAAqB;AACjG,QAAM,MAAM,OAAO,KAAK,IAAI,QAAQ;AACpC,MAAI,CAAC,IAAK;AACV,QAAM,YAAY,eAAe,KAAK;AACtC,MAAI,SAAS,MAAM,iBAAiB;AACpC,MAAI,SAAS,MAAM,sBAAsB,KAAK,UAAU;AACxD,MAAI,SAAS;AAAA,IACX;AAAA,EAAA;AAEF,MAAI,SAAS,MAAM,eAAe;AAClC,MAAI,SAAS,MAAM,OAAO,KAAK,OAAO;AACtC,MAAI,SAAS,MAAM,aAAa,YAAY,UAAU,KAAK,MAAM;AACjE,MAAI,SAAS,MAAM,SAAS;AAC5B,MAAI,SAAS,MAAM,gBAAgB;AACnC,MAAI,SAAS,MAAA;AACb,MAAI,MAAA;AACJ,aAAW,MAAM,IAAI,MAAA,GAAS,GAAG;AACnC;AAEO,MAAM,kBAAkB,CAAC,OAAe,WAAoB;AACjE,QAAM,OAAO,iBAAiB,KAAK;AACnC,MAAI,UAAU,OAAO,KAAA,EAAO,SAAS,GAAG;AACtC,UAAM,kBAAkB,iBAAiB,MAAM;AAC/C,WAAyB,GAAG,IAAI,IAAI,eAAe;AAAA,EACrD;AACA,SAAO;AACT;"}
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("./index43.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":";;AAEA,MAAM,eAAe,CAAC,UACpB,UAAU,QAAQ,UAAU,SAAY,KAAK,OAAO,KAAK;AAEpD,MAAM,gBAAgB,CAAC,UAC5B,MAAM,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,aAAa,IAAI,CAAC,CAAC;AAEnD,MAAM,mBAAmB,CAAC,UAA0B;AACzD,QAAM,aAAa,MAChB,UAAA,EACA,QAAQ,oBAAoB,GAAG,EAC/B,QAAQ,YAAY,EAAE,EACtB,YAAA;AACH,SAAO,cAAc;AACvB;AAEA,MAAM,WAAW,CAAC,UAA6B;AAC7C,QAAM,OAAO,cAAc,KAAK;AAChC,SAAO,KACJ;AAAA,IAAI,CAAC,QACJ,IACG,IAAI,CAAC,SAAS;AACb,YAAM,UAAU,KAAK,QAAQ,MAAM,IAAI;AACvC,aAAO,SAAS,KAAK,OAAO,IAAI,IAAI,OAAO,MAAM;AAAA,IACnD,CAAC,EACA,KAAK,GAAG;AAAA,EAAA,EAEZ,KAAK,MAAM;AAChB;AAEA,MAAM,kBAAkB,CAAC,MAAY,aAAqB;AACxD,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,WAAS,KAAK,YAAY,IAAI;AAC9B,OAAK,MAAA;AACL,WAAS,KAAK,YAAY,IAAI;AAC9B,MAAI,gBAAgB,GAAG;AACzB;AAEO,MAAM,mBAAmB,CAAC,OAAkB,aAAqB;AACtE,MAAI,MAAM,WAAW,EAAG;AACxB,QAAM,MAAM,SAAS,KAAK;AAC1B,QAAM,OAAO,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,2BAA2B;AAChE,QAAM,YAAY,SAAS,SAAS,MAAM,IAAI,WAAW,GAAG,QAAQ;AACpE,kBAAgB,MAAM,SAAS;AACjC;AAEO,MAAM,qBAAqB,CAAC,UACjC,MAAM,WAAW,EAAE,MAAM,OAAO,YAAY,GAAG,iBAAiB,UAAA,CAAW;AAEtE,MAAM,uBAAuB,CAAC,SAAiB,aAAqB;AACzE,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,WAAS,KAAK,YAAY,IAAI;AAC9B,OAAK,MAAA;AACL,WAAS,KAAK,YAAY,IAAI;AAChC;AAEA,MAAM,iBAAiB,CAAC,UAA6B;AACnD,QAAM,OAAO,cAAc,KAAK;AAChC,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,QAAM,CAAC,QAAQ,GAAG,IAAI,IAAI;AAC1B,QAAM,QAAQ,cAAc,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;AACvE,QAAM,QAAQ,KAAK,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE;AAC3F,SAAO,UAAU,KAAK,UAAU,KAAK;AACvC;AAEO,MAAM,2BAA2B,CAAC,OAAe,cAAsB,UAAqB;AACjG,QAAM,MAAM,OAAO,KAAK,IAAI,QAAQ;AACpC,MAAI,CAAC,IAAK;AACV,QAAM,YAAY,eAAe,KAAK;AACtC,MAAI,SAAS,MAAM,iBAAiB;AACpC,MAAI,SAAS,MAAM,sBAAsB,KAAK,UAAU;AACxD,MAAI,SAAS;AAAA,IACX;AAAA,EAAA;AAEF,MAAI,SAAS,MAAM,eAAe;AAClC,MAAI,SAAS,MAAM,OAAO,KAAK,OAAO;AACtC,MAAI,SAAS,MAAM,aAAa,YAAY,UAAU,KAAK,MAAM;AACjE,MAAI,SAAS,MAAM,SAAS;AAC5B,MAAI,SAAS,MAAM,gBAAgB;AACnC,MAAI,SAAS,MAAA;AACb,MAAI,MAAA;AACJ,aAAW,MAAM,IAAI,MAAA,GAAS,GAAG;AACnC;AAEO,MAAM,kBAAkB,CAAC,OAAe,WAAoB;AACjE,QAAM,OAAO,iBAAiB,KAAK;AACnC,MAAI,UAAU,OAAO,KAAA,EAAO,SAAS,GAAG;AACtC,UAAM,kBAAkB,iBAAiB,MAAM;AAC/C,WAAyB,GAAG,IAAI,IAAI,eAAe;AAAA,EACrD;AACA,SAAO;AACT;;;;;;;;"}
package/dist/index8.js CHANGED
@@ -1,18 +1,85 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { clsx } from "./index35.js";
3
- import styles from "./index43.js";
4
- const AuthLayout = ({
5
- children,
6
- logo,
7
- footer,
8
- maxWidth = "28rem",
9
- className
10
- }) => /* @__PURE__ */ jsxs("main", { className: clsx(styles.root, className), children: [
11
- logo && /* @__PURE__ */ jsx("div", { className: styles.logo, children: logo }),
12
- /* @__PURE__ */ jsx("div", { className: styles.card, style: { maxWidth }, children }),
13
- footer && /* @__PURE__ */ jsx("div", { className: styles.footer, children: footer })
14
- ] });
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";
6
+ };
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);
32
+ };
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);
41
+ };
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>`;
49
+ };
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);
67
+ };
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}`;
73
+ }
74
+ return base;
75
+ };
15
76
  export {
16
- AuthLayout
77
+ composeFilename,
78
+ downloadImageDataUrl,
79
+ exportTableToCsv,
80
+ getChartPngDataUrl,
81
+ openPrintWindowWithChart,
82
+ sanitizeFilename,
83
+ toStringTable
17
84
  };
18
85
  //# sourceMappingURL=index8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index8.js","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":[],"mappings":";;;AAIO,MAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,2BACG,QAAA,EAAK,WAAW,KAAK,OAAO,MAAM,SAAS,GACzC,UAAA;AAAA,EAAA,QAAQ,oBAAC,OAAA,EAAI,WAAW,OAAO,MAAO,UAAA,MAAK;AAAA,EAC5C,oBAAC,SAAI,WAAW,OAAO,MAAM,OAAO,EAAE,YACnC,UACH;AAAA,EACC,UAAU,oBAAC,OAAA,EAAI,WAAW,OAAO,QAAS,UAAA,OAAA,CAAO;AAAA,EAAA,CACpD;"}
1
+ {"version":3,"file":"index8.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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"}
package/dist/index9.cjs CHANGED
@@ -1,19 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const clsx = require("./index35.cjs");
5
- const Avatar_module = require("./index56.cjs");
6
- const Avatar = ({ label, size = "md", className, ...props }) => {
7
- const initials = label.split(" ").filter(Boolean).map((part) => part[0]).join("").slice(0, 2).toUpperCase();
8
- return /* @__PURE__ */ jsxRuntime.jsx(
9
- "span",
10
- {
11
- className: clsx.clsx(Avatar_module.default.root, Avatar_module.default[size], className),
12
- "aria-hidden": "true",
13
- ...props,
14
- children: initials || "?"
15
- }
16
- );
17
- };
18
- exports.Avatar = Avatar;
4
+ const clsx = require("./index38.cjs");
5
+ const AuthLayout_module = require("./index45.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;
19
18
  //# sourceMappingURL=index9.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index9.cjs","sources":["../src/primitives/Avatar/Avatar.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport styles from './Avatar.module.css';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n label: string;\n size?: AvatarSize;\n}\n\nexport const Avatar = ({ label, size = 'md', className, ...props }: AvatarProps) => {\n const initials = label\n .split(' ')\n .filter(Boolean)\n .map((part) => part[0])\n .join('')\n .slice(0, 2)\n .toUpperCase();\n\n return (\n <span\n className={clsx(styles.root, styles[size], className)}\n aria-hidden=\"true\"\n {...props}\n >\n {initials || '?'}\n </span>\n );\n};\n"],"names":["jsx","clsx","styles"],"mappings":";;;;;AAUO,MAAM,SAAS,CAAC,EAAE,OAAO,OAAO,MAAM,WAAW,GAAG,YAAyB;AAClF,QAAM,WAAW,MACd,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EACrB,KAAK,EAAE,EACP,MAAM,GAAG,CAAC,EACV,YAAA;AAEH,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,KAAAA,KAAKC,sBAAO,MAAMA,cAAAA,QAAO,IAAI,GAAG,SAAS;AAAA,MACpD,eAAY;AAAA,MACX,GAAG;AAAA,MAEH,UAAA,YAAY;AAAA,IAAA;AAAA,EAAA;AAGnB;;"}
1
+ {"version":3,"file":"index9.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;;"}
package/dist/index9.js CHANGED
@@ -1,19 +1,18 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { clsx } from "./index35.js";
3
- import styles from "./index56.js";
4
- const Avatar = ({ label, size = "md", className, ...props }) => {
5
- const initials = label.split(" ").filter(Boolean).map((part) => part[0]).join("").slice(0, 2).toUpperCase();
6
- return /* @__PURE__ */ jsx(
7
- "span",
8
- {
9
- className: clsx(styles.root, styles[size], className),
10
- "aria-hidden": "true",
11
- ...props,
12
- children: initials || "?"
13
- }
14
- );
15
- };
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { clsx } from "./index38.js";
3
+ import styles from "./index45.js";
4
+ const AuthLayout = ({
5
+ children,
6
+ logo,
7
+ footer,
8
+ maxWidth = "28rem",
9
+ className
10
+ }) => /* @__PURE__ */ jsxs("main", { className: clsx(styles.root, className), children: [
11
+ logo && /* @__PURE__ */ jsx("div", { className: styles.logo, children: logo }),
12
+ /* @__PURE__ */ jsx("div", { className: styles.card, style: { maxWidth }, children }),
13
+ footer && /* @__PURE__ */ jsx("div", { className: styles.footer, children: footer })
14
+ ] });
16
15
  export {
17
- Avatar
16
+ AuthLayout
18
17
  };
19
18
  //# sourceMappingURL=index9.js.map