@sckyzo/cosmos-charts 0.1.1 → 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 (166) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +107 -16
  3. package/THIRD_PARTY_NOTICES.md +81 -0
  4. package/dist/BarChart.cjs +137 -0
  5. package/dist/BarChart.cjs.map +1 -0
  6. package/dist/BarChart.js +135 -0
  7. package/dist/BarChart.js.map +1 -0
  8. package/dist/BoxPlotChart.cjs +214 -0
  9. package/dist/BoxPlotChart.cjs.map +1 -0
  10. package/dist/BoxPlotChart.js +212 -0
  11. package/dist/BoxPlotChart.js.map +1 -0
  12. package/dist/BumpChart.cjs +328 -0
  13. package/dist/BumpChart.cjs.map +1 -0
  14. package/dist/BumpChart.js +326 -0
  15. package/dist/BumpChart.js.map +1 -0
  16. package/dist/CalendarChart.cjs +216 -0
  17. package/dist/CalendarChart.cjs.map +1 -0
  18. package/dist/CalendarChart.js +214 -0
  19. package/dist/CalendarChart.js.map +1 -0
  20. package/dist/DonutChart.cjs +122 -0
  21. package/dist/DonutChart.cjs.map +1 -0
  22. package/dist/DonutChart.js +120 -0
  23. package/dist/DonutChart.js.map +1 -0
  24. package/dist/FunnelChart.cjs +422 -0
  25. package/dist/FunnelChart.cjs.map +1 -0
  26. package/dist/FunnelChart.js +420 -0
  27. package/dist/FunnelChart.js.map +1 -0
  28. package/dist/GradientRadial.cjs +51 -0
  29. package/dist/GradientRadial.cjs.map +1 -0
  30. package/dist/GradientRadial.js +49 -0
  31. package/dist/GradientRadial.js.map +1 -0
  32. package/dist/HeatmapChart.cjs +146 -0
  33. package/dist/HeatmapChart.cjs.map +1 -0
  34. package/dist/HeatmapChart.js +144 -0
  35. package/dist/HeatmapChart.js.map +1 -0
  36. package/dist/LineAreaChart.cjs +98 -0
  37. package/dist/LineAreaChart.cjs.map +1 -0
  38. package/dist/LineAreaChart.js +96 -0
  39. package/dist/LineAreaChart.js.map +1 -0
  40. package/dist/MixedChart.cjs +195 -0
  41. package/dist/MixedChart.cjs.map +1 -0
  42. package/dist/MixedChart.js +193 -0
  43. package/dist/MixedChart.js.map +1 -0
  44. package/dist/RadarChart.cjs +109 -0
  45. package/dist/RadarChart.cjs.map +1 -0
  46. package/dist/RadarChart.js +107 -0
  47. package/dist/RadarChart.js.map +1 -0
  48. package/dist/RadialBarChart.cjs +99 -0
  49. package/dist/RadialBarChart.cjs.map +1 -0
  50. package/dist/RadialBarChart.js +97 -0
  51. package/dist/RadialBarChart.js.map +1 -0
  52. package/dist/RangeBarChart.cjs +218 -0
  53. package/dist/RangeBarChart.cjs.map +1 -0
  54. package/dist/RangeBarChart.js +216 -0
  55. package/dist/RangeBarChart.js.map +1 -0
  56. package/dist/RealtimeChart.cjs +173 -0
  57. package/dist/RealtimeChart.cjs.map +1 -0
  58. package/dist/RealtimeChart.js +171 -0
  59. package/dist/RealtimeChart.js.map +1 -0
  60. package/dist/ScatterChart.cjs +134 -0
  61. package/dist/ScatterChart.cjs.map +1 -0
  62. package/dist/ScatterChart.js +131 -0
  63. package/dist/ScatterChart.js.map +1 -0
  64. package/dist/SemiCircleGauge.cjs +142 -0
  65. package/dist/SemiCircleGauge.cjs.map +1 -0
  66. package/dist/SemiCircleGauge.js +140 -0
  67. package/dist/SemiCircleGauge.js.map +1 -0
  68. package/dist/Sparkline.cjs +117 -0
  69. package/dist/Sparkline.cjs.map +1 -0
  70. package/dist/Sparkline.js +115 -0
  71. package/dist/Sparkline.js.map +1 -0
  72. package/dist/StrokedGauge.cjs +94 -0
  73. package/dist/StrokedGauge.cjs.map +1 -0
  74. package/dist/StrokedGauge.js +92 -0
  75. package/dist/StrokedGauge.js.map +1 -0
  76. package/dist/TreemapChart.cjs +263 -0
  77. package/dist/TreemapChart.cjs.map +1 -0
  78. package/dist/TreemapChart.js +261 -0
  79. package/dist/TreemapChart.js.map +1 -0
  80. package/dist/WaterfallChart.cjs +235 -0
  81. package/dist/WaterfallChart.cjs.map +1 -0
  82. package/dist/WaterfallChart.js +233 -0
  83. package/dist/WaterfallChart.js.map +1 -0
  84. package/dist/WorldMap.cjs +2088 -0
  85. package/dist/WorldMap.cjs.map +1 -0
  86. package/dist/WorldMap.js +603 -0
  87. package/dist/WorldMap.js.map +1 -0
  88. package/dist/chunk-3N43QT36.js +60 -0
  89. package/dist/chunk-3N43QT36.js.map +1 -0
  90. package/dist/chunk-5C2RLJYZ.js +11 -0
  91. package/dist/chunk-5C2RLJYZ.js.map +1 -0
  92. package/dist/chunk-6ALKZLN2.js +127 -0
  93. package/dist/chunk-6ALKZLN2.js.map +1 -0
  94. package/dist/chunk-6BKLL7LZ.cjs +30 -0
  95. package/dist/chunk-6BKLL7LZ.cjs.map +1 -0
  96. package/dist/chunk-6NRRABPF.cjs +64 -0
  97. package/dist/chunk-6NRRABPF.cjs.map +1 -0
  98. package/dist/chunk-AAYHG7YK.cjs +30 -0
  99. package/dist/chunk-AAYHG7YK.cjs.map +1 -0
  100. package/dist/chunk-AOSO5QHL.js +19 -0
  101. package/dist/chunk-AOSO5QHL.js.map +1 -0
  102. package/dist/chunk-BFEDLXVW.js +12 -0
  103. package/dist/chunk-BFEDLXVW.js.map +1 -0
  104. package/dist/chunk-DBZQI4HM.cjs +14 -0
  105. package/dist/chunk-DBZQI4HM.cjs.map +1 -0
  106. package/dist/chunk-F2PMFYJ5.cjs +40 -0
  107. package/dist/chunk-F2PMFYJ5.cjs.map +1 -0
  108. package/dist/chunk-FUZW3H5X.js +38 -0
  109. package/dist/chunk-FUZW3H5X.js.map +1 -0
  110. package/dist/chunk-GDZLYYL2.js +27 -0
  111. package/dist/chunk-GDZLYYL2.js.map +1 -0
  112. package/dist/chunk-GVTMZYOM.cjs +30 -0
  113. package/dist/chunk-GVTMZYOM.cjs.map +1 -0
  114. package/dist/chunk-GZRMVE4X.cjs +131 -0
  115. package/dist/chunk-GZRMVE4X.cjs.map +1 -0
  116. package/dist/chunk-HMH6DI7U.js +27 -0
  117. package/dist/chunk-HMH6DI7U.js.map +1 -0
  118. package/dist/chunk-ICL5K2CW.js +280 -0
  119. package/dist/chunk-ICL5K2CW.js.map +1 -0
  120. package/dist/chunk-IW6EWB26.cjs +21 -0
  121. package/dist/chunk-IW6EWB26.cjs.map +1 -0
  122. package/dist/chunk-K3R7JGOW.cjs +18 -0
  123. package/dist/chunk-K3R7JGOW.cjs.map +1 -0
  124. package/dist/chunk-LT3UC65O.cjs +68 -0
  125. package/dist/chunk-LT3UC65O.cjs.map +1 -0
  126. package/dist/chunk-MN4CDVOS.cjs +63 -0
  127. package/dist/chunk-MN4CDVOS.cjs.map +1 -0
  128. package/dist/chunk-OCD6JIIX.js +23 -0
  129. package/dist/chunk-OCD6JIIX.js.map +1 -0
  130. package/dist/chunk-RILUG7JB.js +44 -0
  131. package/dist/chunk-RILUG7JB.js.map +1 -0
  132. package/dist/chunk-RLHGPHC7.cjs +51 -0
  133. package/dist/chunk-RLHGPHC7.cjs.map +1 -0
  134. package/dist/chunk-SGG7XKOY.js +58 -0
  135. package/dist/chunk-SGG7XKOY.js.map +1 -0
  136. package/dist/chunk-T3K6Q34U.cjs +82 -0
  137. package/dist/chunk-T3K6Q34U.cjs.map +1 -0
  138. package/dist/chunk-TPH5T3DA.cjs +282 -0
  139. package/dist/chunk-TPH5T3DA.cjs.map +1 -0
  140. package/dist/chunk-TYQWZR3S.cjs +13 -0
  141. package/dist/chunk-TYQWZR3S.cjs.map +1 -0
  142. package/dist/chunk-UATB2IRY.js +51 -0
  143. package/dist/chunk-UATB2IRY.js.map +1 -0
  144. package/dist/chunk-UJIV5PVI.js +13 -0
  145. package/dist/chunk-UJIV5PVI.js.map +1 -0
  146. package/dist/chunk-URNXLVSK.js +44 -0
  147. package/dist/chunk-URNXLVSK.js.map +1 -0
  148. package/dist/chunk-VIOSQN4Z.js +79 -0
  149. package/dist/chunk-VIOSQN4Z.js.map +1 -0
  150. package/dist/chunk-X3YZP5WF.cjs +46 -0
  151. package/dist/chunk-X3YZP5WF.cjs.map +1 -0
  152. package/dist/chunk-YWYF5CCJ.js +61 -0
  153. package/dist/chunk-YWYF5CCJ.js.map +1 -0
  154. package/dist/chunk-Z4LZFMDH.cjs +60 -0
  155. package/dist/chunk-Z4LZFMDH.cjs.map +1 -0
  156. package/dist/index.cjs +155 -522
  157. package/dist/index.cjs.map +1 -1
  158. package/dist/index.d.cts +621 -58
  159. package/dist/index.d.ts +621 -58
  160. package/dist/index.js +23 -506
  161. package/dist/index.js.map +1 -1
  162. package/dist/theme.cjs +88 -0
  163. package/dist/theme.cjs.map +1 -0
  164. package/dist/theme.js +84 -0
  165. package/dist/theme.js.map +1 -0
  166. package/package.json +25 -14
package/dist/theme.cjs ADDED
@@ -0,0 +1,88 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ // src/palette.ts
5
+ var CATEGORICAL = [
6
+ "#06b6d4",
7
+ // cyan
8
+ "#8b5cf6",
9
+ // violet
10
+ "#ec4899",
11
+ // pink
12
+ "#64748b",
13
+ // slate
14
+ "#f97316",
15
+ // orange
16
+ "#14b8a6",
17
+ // teal
18
+ "#84cc16"
19
+ // lime
20
+ ];
21
+ var RESERVES = [
22
+ "#3b82f6",
23
+ // blue
24
+ "#d946ef"
25
+ // fuchsia
26
+ ];
27
+ var PALETTE_SIZE = 8;
28
+ var HUE_DISTANCE = 24;
29
+ var NEUTRAL_SATURATION = 0.2;
30
+ var parseColor = (color) => {
31
+ const hex = /^#([0-9a-f]{6})$/i.exec(color.trim())?.[1];
32
+ if (hex)
33
+ return [0, 2, 4].map((i) => parseInt(hex.slice(i, i + 2), 16));
34
+ const rgb = /^rgba?\(\s*(\d+)[\s,]+(\d+)[\s,]+(\d+)/i.exec(color.trim());
35
+ return rgb ? [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])] : void 0;
36
+ };
37
+ var hueAndSaturation = ([r, g, b]) => {
38
+ const [rn, gn, bn] = [r, g, b].map((c) => c / 255);
39
+ const max = Math.max(rn, gn, bn);
40
+ const min = Math.min(rn, gn, bn);
41
+ const delta = max - min;
42
+ const lightness = (max + min) / 2;
43
+ const saturation = delta === 0 ? 0 : delta / (1 - Math.abs(2 * lightness - 1));
44
+ let hue = 0;
45
+ if (delta !== 0) {
46
+ if (max === rn) hue = (gn - bn) / delta % 6;
47
+ else if (max === gn) hue = (bn - rn) / delta + 2;
48
+ else hue = (rn - gn) / delta + 4;
49
+ }
50
+ return { hue: (hue * 60 + 360) % 360, saturation };
51
+ };
52
+ var looksAlike = (a, b) => {
53
+ const [ca, cb] = [parseColor(a), parseColor(b)];
54
+ if (!ca || !cb) return false;
55
+ const [x, y] = [hueAndSaturation(ca), hueAndSaturation(cb)];
56
+ const neutralA = x.saturation < NEUTRAL_SATURATION;
57
+ const neutralB = y.saturation < NEUTRAL_SATURATION;
58
+ if (neutralA || neutralB) return neutralA && neutralB;
59
+ const distance = Math.abs(x.hue - y.hue);
60
+ return Math.min(distance, 360 - distance) < HUE_DISTANCE;
61
+ };
62
+ var categoricalPalette = (accent) => {
63
+ const candidates = [...CATEGORICAL, ...RESERVES];
64
+ const others = parseColor(accent) ? candidates.filter((color) => !looksAlike(accent, color)) : CATEGORICAL;
65
+ return [accent, ...others].slice(0, PALETTE_SIZE);
66
+ };
67
+
68
+ // src/theme.ts
69
+ var COSMOS_BRAND = "#465fff";
70
+ var COSMOS_PALETTE = categoricalPalette(COSMOS_BRAND);
71
+ var relativeLuminance = (hex) => {
72
+ const [r, g, b] = [1, 3, 5].map((i) => {
73
+ const channel = parseInt(hex.slice(i, i + 2), 16) / 255;
74
+ return channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;
75
+ });
76
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
77
+ };
78
+ var readableOn = (background) => {
79
+ if (!/^#[0-9a-f]{6}$/i.test(background)) return "#ffffff";
80
+ const luminance = relativeLuminance(background);
81
+ return 1.05 / (luminance + 0.05) >= (luminance + 0.05) / 0.05 ? "#ffffff" : "#000000";
82
+ };
83
+
84
+ exports.COSMOS_BRAND = COSMOS_BRAND;
85
+ exports.COSMOS_PALETTE = COSMOS_PALETTE;
86
+ exports.readableOn = readableOn;
87
+ //# sourceMappingURL=theme.cjs.map
88
+ //# sourceMappingURL=theme.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/palette.ts","../src/theme.ts"],"names":[],"mappings":"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","file":"theme.cjs","sourcesContent":["// Categorical hues the default palette draws from, in the order a legend reads\n// them, then reserves. None of the first four reads as a status (green, amber,\n// red); lime, orange and teal sit near those hues and come after.\nexport const CATEGORICAL = [\n '#06b6d4', // cyan\n '#8b5cf6', // violet\n '#ec4899', // pink\n '#64748b', // slate\n '#f97316', // orange\n '#14b8a6', // teal\n '#84cc16', // lime\n];\n\n// Taken in place of the candidates that collide with the accent.\nconst RESERVES = [\n '#3b82f6', // blue\n '#d946ef', // fuchsia\n];\n\n/** Series colors in a palette: the accent and seven others. */\nexport const PALETTE_SIZE = 8;\n\n// Two saturated colors closer than this many degrees of hue look alike: the\n// blue accent (231°) keeps violet (258°), the cyan accent (191°) loses teal\n// (173°). Below this saturation (HSL) a color is a gray: two grays look alike\n// whatever their hue (slate and the graphite accent).\nconst HUE_DISTANCE = 24;\nconst NEUTRAL_SATURATION = 0.2;\n\n/** `[r, g, b]` (0–255) of a `#rrggbb` or `rgb(r, g, b)` color, or `undefined`. */\nexport const parseColor = (color: string): [number, number, number] | undefined => {\n const hex = /^#([0-9a-f]{6})$/i.exec(color.trim())?.[1];\n if (hex)\n return [0, 2, 4].map((i) => parseInt(hex.slice(i, i + 2), 16)) as [number, number, number];\n const rgb = /^rgba?\\(\\s*(\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/i.exec(color.trim());\n return rgb ? [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])] : undefined;\n};\n\n/** Hue in degrees and HSL saturation (0–1) of an `[r, g, b]` color. */\nexport const hueAndSaturation = ([r, g, b]: [number, number, number]) => {\n const [rn, gn, bn] = [r, g, b].map((c) => c / 255);\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const delta = max - min;\n const lightness = (max + min) / 2;\n const saturation = delta === 0 ? 0 : delta / (1 - Math.abs(2 * lightness - 1));\n let hue = 0;\n if (delta !== 0) {\n if (max === rn) hue = ((gn - bn) / delta) % 6;\n else if (max === gn) hue = (bn - rn) / delta + 2;\n else hue = (rn - gn) / delta + 4;\n }\n return { hue: (hue * 60 + 360) % 360, saturation };\n};\n\n/** Whether two colors are close enough to be taken for one another in a chart. */\nexport const looksAlike = (a: string, b: string): boolean => {\n const [ca, cb] = [parseColor(a), parseColor(b)];\n if (!ca || !cb) return false;\n const [x, y] = [hueAndSaturation(ca), hueAndSaturation(cb)];\n const neutralA = x.saturation < NEUTRAL_SATURATION;\n const neutralB = y.saturation < NEUTRAL_SATURATION;\n if (neutralA || neutralB) return neutralA && neutralB;\n const distance = Math.abs(x.hue - y.hue);\n return Math.min(distance, 360 - distance) < HUE_DISTANCE;\n};\n\n/**\n * The default series colors for `accent`: the accent, then the categorical\n * hues that do not look like it, eight in all. An accent that is not a hex or\n * `rgb()` color is kept first and nothing is dropped.\n */\nexport const categoricalPalette = (accent: string): string[] => {\n const candidates = [...CATEGORICAL, ...RESERVES];\n const others = parseColor(accent)\n ? candidates.filter((color) => !looksAlike(accent, color))\n : CATEGORICAL;\n return [accent, ...others].slice(0, PALETTE_SIZE);\n};\n","import { categoricalPalette } from './palette';\n\n/** Default brand color (the blue accent). The charts themselves follow the accent through `--color-brand-500`. */\nexport const COSMOS_BRAND = '#465fff';\n\n/**\n * The default series colors without the theme CSS: eight categorical colors,\n * the blue accent first. With the theme, the charts draw `--color-brand-500`\n * and `--color-chart-2` to `--color-chart-8` instead, and each accent skips the\n * hues that look like it (a cyan accent drops the cyan and the teal).\n *\n * Series do not read as statuses: green, amber and red are absent from the\n * first four places, and the status colors are never the default. A chart that\n * means a status passes them as `colors`. A palette is a categorical scale: it\n * names things, it does not rank them.\n */\nexport const COSMOS_PALETTE = categoricalPalette(COSMOS_BRAND);\n\nconst relativeLuminance = (hex: string): number => {\n const [r, g, b] = [1, 3, 5].map((i) => {\n const channel = parseInt(hex.slice(i, i + 2), 16) / 255;\n return channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/**\n * The text color, white or black, that reads best on `background`, a\n * `#rrggbb` color (white when it is not one). White text drops under 3:1 on\n * the palette's green and amber, and black text drops to 4.34:1 on the brand\n * blue, where white gets 4.84:1: the pick reaches 4.5:1 on every color of the palette.\n */\nexport const readableOn = (background: string): string => {\n if (!/^#[0-9a-f]{6}$/i.test(background)) return '#ffffff';\n const luminance = relativeLuminance(background);\n return 1.05 / (luminance + 0.05) >= (luminance + 0.05) / 0.05 ? '#ffffff' : '#000000';\n};\n"]}
package/dist/theme.js ADDED
@@ -0,0 +1,84 @@
1
+ "use client";
2
+ // src/palette.ts
3
+ var CATEGORICAL = [
4
+ "#06b6d4",
5
+ // cyan
6
+ "#8b5cf6",
7
+ // violet
8
+ "#ec4899",
9
+ // pink
10
+ "#64748b",
11
+ // slate
12
+ "#f97316",
13
+ // orange
14
+ "#14b8a6",
15
+ // teal
16
+ "#84cc16"
17
+ // lime
18
+ ];
19
+ var RESERVES = [
20
+ "#3b82f6",
21
+ // blue
22
+ "#d946ef"
23
+ // fuchsia
24
+ ];
25
+ var PALETTE_SIZE = 8;
26
+ var HUE_DISTANCE = 24;
27
+ var NEUTRAL_SATURATION = 0.2;
28
+ var parseColor = (color) => {
29
+ const hex = /^#([0-9a-f]{6})$/i.exec(color.trim())?.[1];
30
+ if (hex)
31
+ return [0, 2, 4].map((i) => parseInt(hex.slice(i, i + 2), 16));
32
+ const rgb = /^rgba?\(\s*(\d+)[\s,]+(\d+)[\s,]+(\d+)/i.exec(color.trim());
33
+ return rgb ? [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])] : void 0;
34
+ };
35
+ var hueAndSaturation = ([r, g, b]) => {
36
+ const [rn, gn, bn] = [r, g, b].map((c) => c / 255);
37
+ const max = Math.max(rn, gn, bn);
38
+ const min = Math.min(rn, gn, bn);
39
+ const delta = max - min;
40
+ const lightness = (max + min) / 2;
41
+ const saturation = delta === 0 ? 0 : delta / (1 - Math.abs(2 * lightness - 1));
42
+ let hue = 0;
43
+ if (delta !== 0) {
44
+ if (max === rn) hue = (gn - bn) / delta % 6;
45
+ else if (max === gn) hue = (bn - rn) / delta + 2;
46
+ else hue = (rn - gn) / delta + 4;
47
+ }
48
+ return { hue: (hue * 60 + 360) % 360, saturation };
49
+ };
50
+ var looksAlike = (a, b) => {
51
+ const [ca, cb] = [parseColor(a), parseColor(b)];
52
+ if (!ca || !cb) return false;
53
+ const [x, y] = [hueAndSaturation(ca), hueAndSaturation(cb)];
54
+ const neutralA = x.saturation < NEUTRAL_SATURATION;
55
+ const neutralB = y.saturation < NEUTRAL_SATURATION;
56
+ if (neutralA || neutralB) return neutralA && neutralB;
57
+ const distance = Math.abs(x.hue - y.hue);
58
+ return Math.min(distance, 360 - distance) < HUE_DISTANCE;
59
+ };
60
+ var categoricalPalette = (accent) => {
61
+ const candidates = [...CATEGORICAL, ...RESERVES];
62
+ const others = parseColor(accent) ? candidates.filter((color) => !looksAlike(accent, color)) : CATEGORICAL;
63
+ return [accent, ...others].slice(0, PALETTE_SIZE);
64
+ };
65
+
66
+ // src/theme.ts
67
+ var COSMOS_BRAND = "#465fff";
68
+ var COSMOS_PALETTE = categoricalPalette(COSMOS_BRAND);
69
+ var relativeLuminance = (hex) => {
70
+ const [r, g, b] = [1, 3, 5].map((i) => {
71
+ const channel = parseInt(hex.slice(i, i + 2), 16) / 255;
72
+ return channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;
73
+ });
74
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
75
+ };
76
+ var readableOn = (background) => {
77
+ if (!/^#[0-9a-f]{6}$/i.test(background)) return "#ffffff";
78
+ const luminance = relativeLuminance(background);
79
+ return 1.05 / (luminance + 0.05) >= (luminance + 0.05) / 0.05 ? "#ffffff" : "#000000";
80
+ };
81
+
82
+ export { COSMOS_BRAND, COSMOS_PALETTE, readableOn };
83
+ //# sourceMappingURL=theme.js.map
84
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/palette.ts","../src/theme.ts"],"names":[],"mappings":"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","file":"theme.js","sourcesContent":["// Categorical hues the default palette draws from, in the order a legend reads\n// them, then reserves. None of the first four reads as a status (green, amber,\n// red); lime, orange and teal sit near those hues and come after.\nexport const CATEGORICAL = [\n '#06b6d4', // cyan\n '#8b5cf6', // violet\n '#ec4899', // pink\n '#64748b', // slate\n '#f97316', // orange\n '#14b8a6', // teal\n '#84cc16', // lime\n];\n\n// Taken in place of the candidates that collide with the accent.\nconst RESERVES = [\n '#3b82f6', // blue\n '#d946ef', // fuchsia\n];\n\n/** Series colors in a palette: the accent and seven others. */\nexport const PALETTE_SIZE = 8;\n\n// Two saturated colors closer than this many degrees of hue look alike: the\n// blue accent (231°) keeps violet (258°), the cyan accent (191°) loses teal\n// (173°). Below this saturation (HSL) a color is a gray: two grays look alike\n// whatever their hue (slate and the graphite accent).\nconst HUE_DISTANCE = 24;\nconst NEUTRAL_SATURATION = 0.2;\n\n/** `[r, g, b]` (0–255) of a `#rrggbb` or `rgb(r, g, b)` color, or `undefined`. */\nexport const parseColor = (color: string): [number, number, number] | undefined => {\n const hex = /^#([0-9a-f]{6})$/i.exec(color.trim())?.[1];\n if (hex)\n return [0, 2, 4].map((i) => parseInt(hex.slice(i, i + 2), 16)) as [number, number, number];\n const rgb = /^rgba?\\(\\s*(\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/i.exec(color.trim());\n return rgb ? [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])] : undefined;\n};\n\n/** Hue in degrees and HSL saturation (0–1) of an `[r, g, b]` color. */\nexport const hueAndSaturation = ([r, g, b]: [number, number, number]) => {\n const [rn, gn, bn] = [r, g, b].map((c) => c / 255);\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const delta = max - min;\n const lightness = (max + min) / 2;\n const saturation = delta === 0 ? 0 : delta / (1 - Math.abs(2 * lightness - 1));\n let hue = 0;\n if (delta !== 0) {\n if (max === rn) hue = ((gn - bn) / delta) % 6;\n else if (max === gn) hue = (bn - rn) / delta + 2;\n else hue = (rn - gn) / delta + 4;\n }\n return { hue: (hue * 60 + 360) % 360, saturation };\n};\n\n/** Whether two colors are close enough to be taken for one another in a chart. */\nexport const looksAlike = (a: string, b: string): boolean => {\n const [ca, cb] = [parseColor(a), parseColor(b)];\n if (!ca || !cb) return false;\n const [x, y] = [hueAndSaturation(ca), hueAndSaturation(cb)];\n const neutralA = x.saturation < NEUTRAL_SATURATION;\n const neutralB = y.saturation < NEUTRAL_SATURATION;\n if (neutralA || neutralB) return neutralA && neutralB;\n const distance = Math.abs(x.hue - y.hue);\n return Math.min(distance, 360 - distance) < HUE_DISTANCE;\n};\n\n/**\n * The default series colors for `accent`: the accent, then the categorical\n * hues that do not look like it, eight in all. An accent that is not a hex or\n * `rgb()` color is kept first and nothing is dropped.\n */\nexport const categoricalPalette = (accent: string): string[] => {\n const candidates = [...CATEGORICAL, ...RESERVES];\n const others = parseColor(accent)\n ? candidates.filter((color) => !looksAlike(accent, color))\n : CATEGORICAL;\n return [accent, ...others].slice(0, PALETTE_SIZE);\n};\n","import { categoricalPalette } from './palette';\n\n/** Default brand color (the blue accent). The charts themselves follow the accent through `--color-brand-500`. */\nexport const COSMOS_BRAND = '#465fff';\n\n/**\n * The default series colors without the theme CSS: eight categorical colors,\n * the blue accent first. With the theme, the charts draw `--color-brand-500`\n * and `--color-chart-2` to `--color-chart-8` instead, and each accent skips the\n * hues that look like it (a cyan accent drops the cyan and the teal).\n *\n * Series do not read as statuses: green, amber and red are absent from the\n * first four places, and the status colors are never the default. A chart that\n * means a status passes them as `colors`. A palette is a categorical scale: it\n * names things, it does not rank them.\n */\nexport const COSMOS_PALETTE = categoricalPalette(COSMOS_BRAND);\n\nconst relativeLuminance = (hex: string): number => {\n const [r, g, b] = [1, 3, 5].map((i) => {\n const channel = parseInt(hex.slice(i, i + 2), 16) / 255;\n return channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/**\n * The text color, white or black, that reads best on `background`, a\n * `#rrggbb` color (white when it is not one). White text drops under 3:1 on\n * the palette's green and amber, and black text drops to 4.34:1 on the brand\n * blue, where white gets 4.84:1: the pick reaches 4.5:1 on every color of the palette.\n */\nexport const readableOn = (background: string): string => {\n if (!/^#[0-9a-f]{6}$/i.test(background)) return '#ffffff';\n const luminance = relativeLuminance(background);\n return 1.05 / (luminance + 0.05) >= (luminance + 0.05) / 0.05 ? '#ffffff' : '#000000';\n};\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sckyzo/cosmos-charts",
3
- "version": "0.1.1",
4
- "description": "React chart components for the Cosmos design system — themeable ApexCharts 5 wrappers (bar, line, area, donut, radial gauges, sparkline, treemap, realtime) with light/dark support.",
3
+ "version": "0.3.0",
4
+ "description": "React chart components for the Cosmos design system — themeable Recharts wrappers (bar, line, area, donut, radial gauges, sparkline, treemap, realtime, heatmap, radar, scatter, bubble, box plot, range bar, mixed) that follow the Cosmos theme and accent.",
5
5
  "license": "MIT",
6
6
  "author": "SckyzO",
7
7
  "homepage": "https://github.com/SckyzO/cosmos/tree/main/packages/charts",
@@ -17,23 +17,30 @@
17
17
  "types": "./dist/index.d.ts",
18
18
  "exports": {
19
19
  ".": {
20
- "types": "./dist/index.d.ts",
21
- "import": "./dist/index.js",
22
- "require": "./dist/index.cjs"
20
+ "import": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
+ },
24
+ "require": {
25
+ "types": "./dist/index.d.cts",
26
+ "default": "./dist/index.cjs"
27
+ }
23
28
  },
24
29
  "./package.json": "./package.json"
25
30
  },
31
+ "sideEffects": false,
26
32
  "files": [
27
33
  "dist/",
28
34
  "README.md",
29
35
  "CHANGELOG.md",
30
- "LICENSE"
36
+ "LICENSE",
37
+ "THIRD_PARTY_NOTICES.md"
31
38
  ],
32
39
  "scripts": {
33
40
  "lint": "eslint src",
34
41
  "lint:fix": "eslint src --fix",
35
42
  "typecheck": "tsc --noEmit",
36
- "test": "echo 'Stories tested via @cosmos/storybook addon-vitest (apps/storybook).'",
43
+ "test": "echo 'Stories and *.test.ts run via Vitest in @cosmos/storybook (apps/storybook).'",
37
44
  "build": "tsup",
38
45
  "dev": "tsup --watch"
39
46
  },
@@ -42,19 +49,23 @@
42
49
  "react-dom": "^19.0.0"
43
50
  },
44
51
  "dependencies": {
45
- "apexcharts": "^8.3.1",
46
- "react-apexcharts": "^2.1.1"
52
+ "@types/topojson-specification": "1.0.5",
53
+ "d3-geo": "3.1.1",
54
+ "recharts": "3.10.1",
55
+ "topojson-client": "3.1.0"
47
56
  },
48
57
  "devDependencies": {
49
- "@storybook/react-vite": "^10.5.5",
58
+ "@storybook/react-vite": "^10.6.3",
59
+ "@types/d3-geo": "3.1.1",
50
60
  "@types/react": "^19.3.0",
51
61
  "@types/react-dom": "^19.3.0",
62
+ "@types/topojson-client": "3.1.5",
52
63
  "react": "^19.3.1",
53
64
  "react-dom": "^19.3.1",
54
- "storybook": "^10.5.5",
55
- "tsup": "^8.5.1",
65
+ "storybook": "^10.6.3",
66
+ "tsup": "^9.0.0",
56
67
  "typescript": "^6.0.3",
57
- "vitest": "^4.1.11"
68
+ "world-atlas": "2.0.2"
58
69
  },
59
70
  "publishConfig": {
60
71
  "access": "public"
@@ -64,7 +75,7 @@
64
75
  "react",
65
76
  "react-19",
66
77
  "charts",
67
- "apexcharts",
78
+ "recharts",
68
79
  "cosmos"
69
80
  ]
70
81
  }