@aquera/nile-visualization 1.7.0 → 1.9.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 (111) hide show
  1. package/dist/src/index.d.ts +1 -1
  2. package/dist/src/internal/dashboard-adapters.d.ts +1 -0
  3. package/dist/src/internal/dashboard-adapters.js +11 -1
  4. package/dist/src/internal/highcharts-provider.d.ts +6 -0
  5. package/dist/src/internal/highcharts-provider.js +32 -0
  6. package/dist/src/internal/types/aq-config.type.d.ts +5 -0
  7. package/dist/src/nile-anomaly-chart/nile-anomaly-chart.css.js +2 -0
  8. package/dist/src/nile-anomaly-chart/nile-anomaly-chart.js +1 -1
  9. package/dist/src/nile-area-chart/nile-area-chart.css.js +2 -0
  10. package/dist/src/nile-area-chart/nile-area-chart.js +1 -1
  11. package/dist/src/nile-area-negative-chart/nile-area-negative-chart.css.js +2 -0
  12. package/dist/src/nile-area-negative-chart/nile-area-negative-chart.js +1 -1
  13. package/dist/src/nile-area-range-chart/nile-area-range-chart.css.js +2 -0
  14. package/dist/src/nile-area-range-chart/nile-area-range-chart.js +1 -1
  15. package/dist/src/nile-area-spline-chart/nile-area-spline-chart.css.js +2 -0
  16. package/dist/src/nile-area-spline-chart/nile-area-spline-chart.js +1 -1
  17. package/dist/src/nile-bar-chart/nile-bar-chart.css.js +2 -0
  18. package/dist/src/nile-bar-chart/nile-bar-chart.js +1 -1
  19. package/dist/src/nile-bellcurve-chart/nile-bellcurve-chart.css.js +2 -0
  20. package/dist/src/nile-bellcurve-chart/nile-bellcurve-chart.js +1 -1
  21. package/dist/src/nile-boxplot-chart/nile-boxplot-chart.css.js +2 -0
  22. package/dist/src/nile-boxplot-chart/nile-boxplot-chart.js +1 -1
  23. package/dist/src/nile-bubble-chart/nile-bubble-chart.css.js +2 -0
  24. package/dist/src/nile-bubble-chart/nile-bubble-chart.js +1 -1
  25. package/dist/src/nile-chart/index.d.ts +1 -1
  26. package/dist/src/nile-chart/nile-chart-config.d.ts +69 -1
  27. package/dist/src/nile-chart/nile-chart.css.d.ts +1 -0
  28. package/dist/src/nile-chart/nile-chart.css.js +194 -82
  29. package/dist/src/nile-chart/nile-chart.d.ts +25 -6
  30. package/dist/src/nile-chart/nile-chart.js +241 -100
  31. package/dist/src/nile-cluster-chart/nile-cluster-chart.css.js +2 -0
  32. package/dist/src/nile-cluster-chart/nile-cluster-chart.js +1 -1
  33. package/dist/src/nile-column-chart/nile-column-chart.css.js +2 -0
  34. package/dist/src/nile-column-chart/nile-column-chart.js +1 -1
  35. package/dist/src/nile-column-drilldown-chart/nile-column-drilldown-chart.css.js +2 -0
  36. package/dist/src/nile-column-drilldown-chart/nile-column-drilldown-chart.js +1 -1
  37. package/dist/src/nile-column-pyramid-chart/nile-column-pyramid-chart.css.js +2 -0
  38. package/dist/src/nile-column-pyramid-chart/nile-column-pyramid-chart.js +1 -1
  39. package/dist/src/nile-column-range-chart/nile-column-range-chart.css.js +2 -0
  40. package/dist/src/nile-column-range-chart/nile-column-range-chart.js +1 -1
  41. package/dist/src/nile-dashboard-viewer/nile-dashboard-viewer.css.js +10 -0
  42. package/dist/src/nile-dashboard-viewer/nile-dashboard-viewer.d.ts +15 -6
  43. package/dist/src/nile-dashboard-viewer/nile-dashboard-viewer.js +47 -6
  44. package/dist/src/nile-donut-chart/nile-donut-chart.css.js +2 -0
  45. package/dist/src/nile-donut-chart/nile-donut-chart.js +1 -1
  46. package/dist/src/nile-dumbbell-chart/nile-dumbbell-chart.css.js +2 -0
  47. package/dist/src/nile-dumbbell-chart/nile-dumbbell-chart.js +1 -1
  48. package/dist/src/nile-dumbbell-lower-chart/nile-dumbbell-lower-chart.css.js +2 -0
  49. package/dist/src/nile-dumbbell-lower-chart/nile-dumbbell-lower-chart.js +1 -1
  50. package/dist/src/nile-dumbbell-upper-chart/nile-dumbbell-upper-chart.css.js +2 -0
  51. package/dist/src/nile-dumbbell-upper-chart/nile-dumbbell-upper-chart.js +1 -1
  52. package/dist/src/nile-euler-chart/nile-euler-chart.css.js +2 -0
  53. package/dist/src/nile-euler-chart/nile-euler-chart.js +1 -1
  54. package/dist/src/nile-fan-chart/nile-fan-chart.css.js +2 -0
  55. package/dist/src/nile-fan-chart/nile-fan-chart.js +1 -1
  56. package/dist/src/nile-flame-chart/nile-flame-chart.css.js +2 -0
  57. package/dist/src/nile-flame-chart/nile-flame-chart.js +1 -1
  58. package/dist/src/nile-funnel-chart/nile-funnel-chart.css.js +2 -0
  59. package/dist/src/nile-funnel-chart/nile-funnel-chart.js +1 -1
  60. package/dist/src/nile-gauge-chart/nile-gauge-chart.css.js +2 -0
  61. package/dist/src/nile-gauge-chart/nile-gauge-chart.js +1 -1
  62. package/dist/src/nile-heatmap-chart/nile-heatmap-chart.css.js +2 -0
  63. package/dist/src/nile-heatmap-chart/nile-heatmap-chart.js +1 -1
  64. package/dist/src/nile-histogram-chart/nile-histogram-chart.css.js +2 -0
  65. package/dist/src/nile-histogram-chart/nile-histogram-chart.js +1 -1
  66. package/dist/src/nile-inverted-area-chart/nile-inverted-area-chart.css.js +2 -0
  67. package/dist/src/nile-inverted-area-chart/nile-inverted-area-chart.js +1 -1
  68. package/dist/src/nile-kpi-chart/nile-kpi-chart.css.js +54 -3
  69. package/dist/src/nile-kpi-chart/nile-kpi-chart.d.ts +29 -1
  70. package/dist/src/nile-kpi-chart/nile-kpi-chart.js +164 -9
  71. package/dist/src/nile-line-chart/nile-line-chart.css.js +2 -0
  72. package/dist/src/nile-line-chart/nile-line-chart.js +1 -1
  73. package/dist/src/nile-line-column-chart/nile-line-column-chart.css.js +2 -0
  74. package/dist/src/nile-line-column-chart/nile-line-column-chart.js +1 -1
  75. package/dist/src/nile-lollipop-chart/nile-lollipop-chart.css.js +2 -0
  76. package/dist/src/nile-lollipop-chart/nile-lollipop-chart.js +1 -1
  77. package/dist/src/nile-map-chart/nile-map-chart.css.js +2 -0
  78. package/dist/src/nile-map-chart/nile-map-chart.js +1 -1
  79. package/dist/src/nile-organization-chart/nile-organization-chart.css.js +2 -0
  80. package/dist/src/nile-organization-chart/nile-organization-chart.js +1 -1
  81. package/dist/src/nile-pie-chart/nile-pie-chart.css.js +2 -0
  82. package/dist/src/nile-pie-chart/nile-pie-chart.js +1 -1
  83. package/dist/src/nile-polygon-chart/nile-polygon-chart.css.js +2 -0
  84. package/dist/src/nile-polygon-chart/nile-polygon-chart.js +1 -1
  85. package/dist/src/nile-radar-chart/nile-radar-chart.css.js +2 -0
  86. package/dist/src/nile-radar-chart/nile-radar-chart.js +1 -1
  87. package/dist/src/nile-radial-bar-chart/nile-radial-bar-chart.css.js +2 -0
  88. package/dist/src/nile-radial-bar-chart/nile-radial-bar-chart.js +1 -1
  89. package/dist/src/nile-scatter-chart/nile-scatter-chart.css.js +2 -0
  90. package/dist/src/nile-scatter-chart/nile-scatter-chart.js +1 -1
  91. package/dist/src/nile-spiderweb-chart/nile-spiderweb-chart.css.js +2 -0
  92. package/dist/src/nile-spiderweb-chart/nile-spiderweb-chart.js +1 -1
  93. package/dist/src/nile-spline-chart/nile-spline-chart.css.js +2 -0
  94. package/dist/src/nile-spline-chart/nile-spline-chart.js +1 -1
  95. package/dist/src/nile-stacked-chart/nile-stacked-chart.css.js +2 -0
  96. package/dist/src/nile-stacked-chart/nile-stacked-chart.js +1 -1
  97. package/dist/src/nile-timeline-chart/nile-timeline-chart.css.js +2 -0
  98. package/dist/src/nile-timeline-chart/nile-timeline-chart.js +1 -1
  99. package/dist/src/nile-trendline-chart/nile-trendline-chart.css.js +2 -0
  100. package/dist/src/nile-trendline-chart/nile-trendline-chart.js +1 -1
  101. package/dist/src/nile-variable-pie-chart/nile-variable-pie-chart.css.js +2 -0
  102. package/dist/src/nile-variable-pie-chart/nile-variable-pie-chart.js +1 -1
  103. package/dist/src/nile-vector-chart/nile-vector-chart.css.js +2 -0
  104. package/dist/src/nile-vector-chart/nile-vector-chart.js +1 -1
  105. package/dist/src/nile-waterfall-chart/nile-waterfall-chart.css.js +2 -0
  106. package/dist/src/nile-waterfall-chart/nile-waterfall-chart.js +1 -1
  107. package/dist/src/nile-widget-viewer/nile-widget-viewer.d.ts +4 -0
  108. package/dist/src/nile-widget-viewer/nile-widget-viewer.js +18 -2
  109. package/dist/src/nile-xrange-chart/nile-xrange-chart.css.js +2 -0
  110. package/dist/src/nile-xrange-chart/nile-xrange-chart.js +1 -1
  111. package/package.json +1 -1
@@ -1,31 +1,83 @@
1
1
  import { css } from 'lit';
2
+ export const tooltipCss = `
3
+ .nile-chart-header-tooltip {
4
+ position: fixed;
5
+ display: none;
6
+ transform: translate(-50%, calc(-100% - 10px));
7
+ background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
8
+ color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
9
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
10
+ font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));
11
+ font-weight: var(--nile-font-weight-medium, var(--ng-font-weight-medium));
12
+ line-height: 1.4;
13
+ padding: 4px 10px;
14
+ border-radius: 6px;
15
+ border: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
16
+ pointer-events: none;
17
+ white-space: nowrap;
18
+ z-index: 2147483647;
19
+ box-shadow: var(--nile-box-shadow-3, var(--ng-shadow-sm));
20
+ }
21
+ .nile-chart-header-tooltip::after {
22
+ content: '';
23
+ position: absolute;
24
+ top: 100%;
25
+ left: 50%;
26
+ transform: translateX(-50%);
27
+ border: 5px solid transparent;
28
+ border-top-color: var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
29
+ }
30
+ `;
2
31
  export const styles = css `
3
32
  :host {
4
33
  display: block;
5
34
  width: 100%;
6
35
  position: relative;
36
+ container-type: inline-size;
7
37
  }
8
38
 
9
39
  :host([hidden]) {
10
40
  display: none;
11
41
  }
12
42
 
43
+ /* Fit-to-container mode (set by nile-widget-viewer) — makes the card fill
44
+ its host rather than auto-sizing to content, so the chart reflows to the
45
+ allotted cell instead of overflowing. */
46
+ :host([fit]) {
47
+ height: 100%;
48
+ }
49
+
50
+ :host([fit]) .nile-chart-card {
51
+ display: flex;
52
+ flex-direction: column;
53
+ height: 100%;
54
+ }
55
+
56
+ :host([fit]) .nile-chart-wrapper {
57
+ flex: 1 1 auto;
58
+ min-height: 0;
59
+ }
60
+
61
+ :host([fit]) .nile-chart-inner {
62
+ height: 100%;
63
+ }
64
+
13
65
  /* ── Unified Card Container ── */
14
66
 
15
- .chart-card {
67
+ .nile-chart-card {
16
68
  background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
17
69
  border: var(--nile-border-width-1, var(--ng-stroke-width-1)) solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
18
70
  border-radius: var(--nile-radius-radius-3xl, var(--ng-radius-xl));
19
71
  box-shadow: var(--nile-box-shadow-3, var(--ng-shadow-sm));
20
72
  transition: box-shadow var(--nile-transition-duration-default, var(--ng-transition-duration-default)) ease;
21
73
  }
22
- .chart-card:hover {
74
+ .nile-chart-card:hover {
23
75
  box-shadow: var(--nile-box-shadow-7, var(--ng-shadow-md));
24
76
  }
25
77
 
26
78
  /* ── Card Header ── */
27
79
 
28
- .chart-header {
80
+ .nile-chart-header {
29
81
  display: flex;
30
82
  flex-direction: row;
31
83
  align-items: center;
@@ -39,11 +91,11 @@ export const styles = css `
39
91
  border-radius: var(--nile-radius-radius-3xl, var(--ng-radius-xl)) var(--nile-radius-radius-3xl, var(--ng-radius-xl)) 0 0;
40
92
  }
41
93
 
42
- .chart-header.chart-header--compact {
94
+ .nile-chart-header.nile-chart-header--compact {
43
95
  padding: var(--nile-spacing-xl, var(--ng-spacing-xl)) var(--nile-spacing-3xl, var(--ng-spacing-3xl)) var(--nile-spacing-lg, var(--ng-spacing-lg));
44
96
  }
45
97
 
46
- .chart-header-titles {
98
+ .nile-chart-header-titles {
47
99
  display: flex;
48
100
  flex-direction: column;
49
101
  align-items: flex-start;
@@ -52,25 +104,54 @@ export const styles = css `
52
104
  flex: 1 1 auto;
53
105
  }
54
106
 
55
- .chart-header-title {
107
+ .nile-chart-header-title {
56
108
  margin: 0;
57
109
  font-family: var(--nile-font-family-serif-colfax-medium, var(--ng-font-family-display));
58
110
  font-size: var(--nile-type-scale-6, var(--ng-font-size-text-l));
59
- font-weight: var(--nile-font-weight-semi-bold, var(--ng-font-weight-semibold));
111
+ font-weight: var(--nile-font-weight-semi-bold, var(--ng-font-weight-semibold));
60
112
  color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
61
113
  line-height: 1.3;
114
+ white-space: nowrap;
115
+ overflow: hidden;
116
+ text-overflow: ellipsis;
117
+ min-width: 0;
118
+ width: 100%;
62
119
  }
63
120
 
64
- .chart-header-subtitle {
121
+ .nile-chart-header-subtitle {
65
122
  margin: var(--nile-spacing-xs, var(--ng-spacing-xs)) 0 0;
66
123
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
67
124
  font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));
68
125
  font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));
69
126
  color: var(--nile-colors-neutral-700, var(--ng-colors-text-secondary-700));
70
127
  line-height: 1.4;
128
+ white-space: nowrap;
129
+ overflow: hidden;
130
+ text-overflow: ellipsis;
131
+ min-width: 0;
132
+ width: 100%;
133
+ }
134
+
135
+ @container (max-width: 400px) {
136
+ .nile-chart-header {
137
+ padding: var(--nile-spacing-xl, var(--ng-spacing-xl)) var(--nile-spacing-2xl, var(--ng-spacing-2xl)) var(--nile-spacing-lg, var(--ng-spacing-lg));
138
+ }
139
+ .nile-chart-header.nile-chart-header--compact {
140
+ padding: var(--nile-spacing-lg, var(--ng-spacing-lg)) var(--nile-spacing-2xl, var(--ng-spacing-2xl));
141
+ }
71
142
  }
72
143
 
73
- .chart-header-actions {
144
+ @container (max-width: 280px) {
145
+ .nile-chart-header {
146
+ padding: var(--nile-spacing-lg, var(--ng-spacing-lg)) var(--nile-spacing-xl, var(--ng-spacing-xl));
147
+ gap: var(--nile-spacing-sm, var(--ng-spacing-sm));
148
+ }
149
+ .nile-chart-header.nile-chart-header--compact {
150
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-xl, var(--ng-spacing-xl));
151
+ }
152
+ }
153
+
154
+ .nile-chart-header-actions {
74
155
  display: flex;
75
156
  align-items: center;
76
157
  gap: var(--nile-spacing-xs, var(--ng-spacing-xs));
@@ -80,17 +161,41 @@ export const styles = css `
80
161
 
81
162
  /* ── Card Body ── */
82
163
 
83
- .chart-wrapper {
164
+ .nile-chart-wrapper {
84
165
  position: relative;
85
166
  }
86
167
 
87
- .chart-inner {
168
+ .nile-chart-inner {
88
169
  position: relative;
89
170
  overflow: hidden;
90
171
  border-radius: 0 0 var(--nile-radius-radius-3xl, var(--ng-radius-xl)) var(--nile-radius-radius-3xl, var(--ng-radius-xl));
91
172
  contain: layout style;
92
173
  }
93
174
 
175
+ /* Grid: height applies to the whole card — header + grid together */
176
+ .nile-chart-card--grid {
177
+ display: flex;
178
+ flex-direction: column;
179
+ }
180
+
181
+ .nile-chart-card--grid .nile-chart-wrapper {
182
+ flex: 1;
183
+ min-height: 0;
184
+ display: flex;
185
+ flex-direction: column;
186
+ }
187
+
188
+ .nile-chart-card--grid .nile-chart-inner {
189
+ flex: 1;
190
+ min-height: 0;
191
+ contain: none;
192
+ }
193
+
194
+ .nile-chart-card--grid nile-data-grid {
195
+ display: block;
196
+ height: 100%;
197
+ }
198
+
94
199
  /* ── Default slot (custom chart body only — not named slots) ── */
95
200
  slot:not([name])::slotted(*) {
96
201
  display: block;
@@ -130,7 +235,7 @@ export const styles = css `
130
235
 
131
236
  /* ── Summary Toggle ── */
132
237
 
133
- .chart-toggle {
238
+ .nile-chart-toggle {
134
239
  position: absolute;
135
240
  bottom: 0;
136
241
  left: 0;
@@ -155,25 +260,25 @@ export const styles = css `
155
260
  pointer-events: none;
156
261
  }
157
262
 
158
- .chart-inner:hover .chart-toggle,
159
- .chart-toggle[aria-expanded='true'] {
263
+ .nile-chart-inner:hover .nile-chart-toggle,
264
+ .nile-chart-toggle[aria-expanded='true'] {
160
265
  opacity: 1;
161
266
  pointer-events: auto;
162
267
  }
163
268
 
164
- .chart-toggle:hover {
269
+ .nile-chart-toggle:hover {
165
270
  background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
166
271
  box-shadow: var(--nile-box-shadow-3, var(--ng-shadow-sm));
167
272
  }
168
273
 
169
- .chart-toggle:focus-visible {
274
+ .nile-chart-toggle:focus-visible {
170
275
  outline: var(--nile-border-width-2, var(--ng-stroke-width-2)) solid var(--nile-colors-primary-600, var(--ng-colors-fg-brand-primary-600));
171
276
  outline-offset: var(--nile-spacing-1px, var(--ng-outline-offset-1));
172
277
  }
173
278
 
174
279
  /* ── Summary Overlay ── */
175
280
 
176
- .chart-overlay {
281
+ .nile-chart-overlay {
177
282
  position: absolute;
178
283
  left: 0;
179
284
  right: 0;
@@ -189,29 +294,29 @@ export const styles = css `
189
294
  padding: var(--nile-spacing-2xl, var(--ng-spacing-2xl)) var(--nile-spacing-3xl, var(--ng-spacing-3xl));
190
295
  }
191
296
 
192
- .chart-overlay[data-open] {
297
+ .nile-chart-overlay[data-open] {
193
298
  transform: translateY(0);
194
299
  }
195
300
 
196
- .chart-content {
301
+ .nile-chart-content {
197
302
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
198
303
  font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
199
304
  color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
200
305
  line-height: 1.6;
201
306
  }
202
307
 
203
- /* ── Type Switcher (in header) ── */
308
+ /* ── Actions Menu (in header) ── */
204
309
 
205
- .chart-menu-anchor {
310
+ .nile-chart-menu-anchor {
206
311
  position: relative;
207
312
  }
208
313
 
209
- .chart-menu-trigger {
314
+ .nile-chart-menu-trigger {
210
315
  display: flex;
211
316
  align-items: center;
212
317
  justify-content: center;
213
- width: var(--nile-width-28px, var(--ng-height-28px));
214
- height: var(--nile-width-28px, var(--ng-height-28px));
318
+ width: var(--nile-height-28px, var(--ng-height-28px));
319
+ height: var(--nile-height-28px, var(--ng-height-28px));
215
320
  padding: 0;
216
321
  border: none;
217
322
  border-radius: var(--nile-radius-radius-lg, var(--ng-radius-sm));
@@ -221,17 +326,17 @@ export const styles = css `
221
326
  transition: background var(--nile-transition-duration-short, var(--ng-transition-duration-fast)) ease, color var(--nile-transition-duration-short, var(--ng-transition-duration-fast)) ease;
222
327
  }
223
328
 
224
- .chart-menu-trigger:hover {
329
+ .nile-chart-menu-trigger:hover {
225
330
  background: transparent;
226
331
  color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
227
332
  }
228
333
 
229
- .chart-menu-trigger:focus-visible {
334
+ .nile-chart-menu-trigger:focus-visible {
230
335
  outline: var(--nile-border-width-2, var(--ng-stroke-width-2)) solid var(--nile-colors-primary-600, var(--ng-colors-fg-brand-primary-600));
231
336
  outline-offset: var(--nile-spacing-1px, var(--ng-outline-offset-1));
232
337
  }
233
338
 
234
- .chart-menu-dropdown {
339
+ .nile-chart-menu-dropdown {
235
340
  position: absolute;
236
341
  top: 100%;
237
342
  right: 0;
@@ -246,7 +351,7 @@ export const styles = css `
246
351
  z-index: 10;
247
352
  }
248
353
 
249
- .chart-menu-item {
354
+ .nile-chart-menu-item {
250
355
  display: block;
251
356
  width: 100%;
252
357
  padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-14px, var(--ng-spacing-3-5));
@@ -261,59 +366,66 @@ export const styles = css `
261
366
  transition: background var(--nile-transition-duration-short, var(--ng-transition-duration-fast)) ease;
262
367
  }
263
368
 
264
- .chart-menu-item:hover {
265
- background: transparent;
369
+ .nile-chart-menu-item:hover {
370
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
371
+ color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
266
372
  }
267
373
 
268
- .chart-menu-item.active {
374
+ .nile-chart-menu-item.active {
269
375
  color: var(--nile-colors-primary-600, var(--ng-colors-fg-brand-primary-600));
270
376
  font-weight: 600;
271
377
  }
272
378
 
273
- .chart-menu-item:focus-visible {
379
+ .nile-chart-menu-item:focus-visible {
274
380
  outline: var(--nile-border-width-2, var(--ng-stroke-width-2)) solid var(--nile-colors-primary-600, var(--ng-colors-fg-brand-primary-600));
275
381
  outline-offset: calc(var(--nile-spacing-2px, var(--ng-outline-offset-2)) * -1);
276
382
  }
277
383
 
384
+ .nile-chart-menu-separator {
385
+ height: var(--nile-border-width-1, var(--ng-stroke-width-1));
386
+ background: var(--nile-colors-neutral-200, var(--ng-colors-border-secondary));
387
+ margin: var(--nile-spacing-xs, var(--ng-spacing-xs)) 0;
388
+ }
389
+
278
390
  /* ── AI Chat Trigger (in header) ── */
279
391
 
280
- .ai-trigger {
392
+ .nile-ai-trigger {
281
393
  display: inline-flex;
282
394
  align-items: center;
283
395
  justify-content: center;
284
- width: 28px;
285
- height: 28px;
396
+ width: var(--nile-height-28px, var(--ng-height-28px));
397
+ height: var(--nile-height-28px, var(--ng-height-28px));
286
398
  padding: 0;
287
- border-radius: var(--ng-radius-md, 10px);
399
+ border-radius: var(--nile-radius-radius-lg, var(--ng-radius-md));
288
400
  background: var(--ng-componentcolors-utility-brand-50, #EFF4FF);
289
- border: 1.5px solid var(--ng-componentcolors-utility-brand-200, #C7D7FE);
401
+ border: var(--nile-border-width-1, var(--ng-stroke-width-1)) solid var(--ng-componentcolors-utility-brand-200, #C7D7FE);
290
402
  box-shadow: 0 4px 20px rgba(41, 112, 255, 0.12);
291
403
  color: var(--ng-componentcolors-utility-brand-600, #2970FF);
292
404
  cursor: pointer;
293
- transition: background 150ms ease;
405
+ transition: background var(--nile-transition-duration-short, var(--ng-transition-duration-fast)) ease;
294
406
  flex-shrink: 0;
295
407
  outline: none;
296
408
  }
297
409
 
298
- .ai-trigger:hover,
299
- .ai-trigger:focus-visible {
410
+ .nile-ai-trigger:hover,
411
+ .nile-ai-trigger:focus-visible {
300
412
  background: var(--ng-componentcolors-utility-brand-100, #DBE8FF);
301
413
  }
302
414
 
303
- .chart-inner--kpi {
415
+ .nile-chart-inner--kpi {
304
416
  overflow-x: hidden;
305
417
  overflow-y: auto;
306
418
  -webkit-overflow-scrolling: touch;
307
419
  contain: none;
308
420
  }
309
421
 
310
- .ai-trigger.active {
422
+ .nile-ai-trigger.active {
311
423
  background: var(--ng-componentcolors-utility-brand-100, #DBE8FF);
312
424
  }
313
425
 
314
426
  /* ── AI Chat Panel Overlay ── */
315
427
 
316
- .ai-panel-overlay {
428
+ .nile-ai-panel-overlay {
317
429
  position: absolute;
318
430
  left: 0;
319
431
  right: 0;
@@ -329,90 +441,90 @@ export const styles = css `
329
441
  overflow: hidden;
330
442
  }
331
443
 
332
- .ai-panel-overlay[data-open] {
444
+ .nile-ai-panel-overlay[data-open] {
333
445
  transform: translateY(0);
334
446
  }
335
447
 
336
448
  /* ── Skeleton loader (matches nile-skeleton-loader animation style) ── */
337
449
 
338
- :host([loading]) .chart-card {
450
+ :host([loading]) .nile-chart-card {
339
451
  pointer-events: none;
340
452
  }
341
453
 
342
- .chart-skeleton {
454
+ .nile-chart-skeleton {
343
455
  display: flex;
344
456
  flex-direction: column;
345
457
  gap: 0;
346
- padding: var(--nile-spacing-3xl, 24px) var(--nile-spacing-3xl, 24px) var(--nile-spacing-xl, 16px);
458
+ padding: var(--nile-spacing-3xl, var(--ng-spacing-3xl)) var(--nile-spacing-3xl, var(--ng-spacing-3xl)) var(--nile-spacing-xl, var(--ng-spacing-xl));
347
459
  min-height: var(--nile-chart-skeleton-height, 300px);
348
460
  }
349
461
 
350
- .chart-skeleton-body {
462
+ .nile-chart-skeleton-body {
351
463
  display: flex;
352
464
  flex-direction: column;
353
465
  justify-content: space-around;
354
466
  flex: 1;
355
- gap: var(--nile-spacing-xl, 14px);
467
+ gap: var(--nile-spacing-14px, var(--ng-spacing-lg));
356
468
  padding-left: 44px;
357
469
  position: relative;
358
470
  }
359
471
 
360
472
  /* Vertical y-axis rule */
361
- .chart-skeleton-body::before {
473
+ .nile-chart-skeleton-body::before {
362
474
  content: '';
363
475
  position: absolute;
364
476
  left: 34px;
365
- top: 4px;
366
- bottom: 4px;
367
- width: 2px;
368
- border-radius: 1px;
369
- background: var(--nile-colors-neutral-400, #e5e7eb);
477
+ top: var(--nile-spacing-xs, var(--ng-spacing-xs));
478
+ bottom: var(--nile-spacing-xs, var(--ng-spacing-xs));
479
+ width: var(--nile-border-width-2, var(--ng-stroke-width-2));
480
+ border-radius: var(--nile-border-width-1, var(--ng-stroke-width-1));
481
+ background: var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
370
482
  }
371
483
 
372
- .chart-skeleton-row {
484
+ .nile-chart-skeleton-row {
373
485
  display: flex;
374
486
  align-items: center;
375
- gap: var(--nile-spacing-md, 8px);
376
- height: 24px;
487
+ gap: var(--nile-spacing-md, var(--ng-spacing-md));
488
+ height: var(--nile-spacing-3xl, var(--ng-spacing-3xl));
377
489
  }
378
490
 
379
- .chart-skeleton-ylabel {
380
- width: 26px;
381
- height: 10px;
382
- border-radius: 3px;
491
+ .nile-chart-skeleton-ylabel {
492
+ width: var(--nile-height-26px, 26px);
493
+ height: var(--nile-spacing-10px, var(--ng-spacing-md-alt));
494
+ border-radius: var(--nile-radius-radius-sm, var(--ng-radius-xs));
383
495
  flex-shrink: 0;
384
- background: var(--nile-colors-neutral-400, #e5e7eb);
496
+ background: var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
385
497
  animation: nile-skeleton-blink 1.2s ease-in-out infinite;
386
498
  }
387
499
 
388
- .chart-skeleton-bar {
389
- height: 20px;
500
+ .nile-chart-skeleton-bar {
501
+ height: var(--nile-spacing-2xl, var(--ng-spacing-2xl));
390
502
  width: var(--w, 60%);
391
- border-radius: 0 3px 3px 0;
392
- background: var(--nile-colors-neutral-400, #e5e7eb);
503
+ border-radius: 0 var(--nile-radius-radius-sm, var(--ng-radius-xs)) var(--nile-radius-radius-sm, var(--ng-radius-xs)) 0;
504
+ background: var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
393
505
  animation: nile-skeleton-blink 1.2s ease-in-out infinite;
394
506
  }
395
507
 
396
508
  /* Staggered wave across the bars */
397
- .chart-skeleton-row:nth-child(1) .chart-skeleton-bar { animation-delay: 0ms; }
398
- .chart-skeleton-row:nth-child(2) .chart-skeleton-bar { animation-delay: 100ms; }
399
- .chart-skeleton-row:nth-child(3) .chart-skeleton-bar { animation-delay: 200ms; }
400
- .chart-skeleton-row:nth-child(4) .chart-skeleton-bar { animation-delay: 300ms; }
401
- .chart-skeleton-row:nth-child(5) .chart-skeleton-bar { animation-delay: 400ms; }
509
+ .nile-chart-skeleton-row:nth-child(1) .nile-chart-skeleton-bar { animation-delay: 0ms; }
510
+ .nile-chart-skeleton-row:nth-child(2) .nile-chart-skeleton-bar { animation-delay: 100ms; }
511
+ .nile-chart-skeleton-row:nth-child(3) .nile-chart-skeleton-bar { animation-delay: 200ms; }
512
+ .nile-chart-skeleton-row:nth-child(4) .nile-chart-skeleton-bar { animation-delay: 300ms; }
513
+ .nile-chart-skeleton-row:nth-child(5) .nile-chart-skeleton-bar { animation-delay: 400ms; }
402
514
 
403
515
  /* Horizontal x-axis labels row */
404
- .chart-skeleton-xaxis-row {
516
+ .nile-chart-skeleton-xaxis-row {
405
517
  display: flex;
406
518
  justify-content: space-around;
407
519
  padding-left: 44px;
408
- margin-top: var(--nile-spacing-xl, 14px);
520
+ margin-top: var(--nile-spacing-14px, var(--ng-spacing-lg));
409
521
  }
410
522
 
411
- .chart-skeleton-xlabel {
412
- height: 10px;
413
- width: 30px;
414
- border-radius: 3px;
415
- background: var(--nile-colors-neutral-400, #e5e7eb);
523
+ .nile-chart-skeleton-xlabel {
524
+ height: var(--nile-spacing-10px, var(--ng-spacing-md-alt));
525
+ width: var(--nile-height-30px, 30px);
526
+ border-radius: var(--nile-radius-radius-sm, var(--ng-radius-xs));
527
+ background: var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
416
528
  animation: nile-skeleton-blink 1.2s ease-in-out infinite;
417
529
  animation-delay: var(--d, 0ms);
418
530
  }
@@ -423,9 +535,9 @@ export const styles = css `
423
535
  }
424
536
 
425
537
  @media (prefers-reduced-motion: reduce) {
426
- .chart-skeleton-bar,
427
- .chart-skeleton-ylabel,
428
- .chart-skeleton-xlabel {
538
+ .nile-chart-skeleton-bar,
539
+ .nile-chart-skeleton-ylabel,
540
+ .nile-chart-skeleton-xlabel {
429
541
  animation: none;
430
542
  opacity: 0.7;
431
543
  }
@@ -1,6 +1,6 @@
1
1
  import type { CSSResultGroup, PropertyValues, TemplateResult } from 'lit';
2
2
  import NileElement from '../internal/nile-element.js';
3
- import type { NileChartConfig } from './nile-chart-config.js';
3
+ import type { NileChartConfig, NileChartMenuConfig } from './nile-chart-config.js';
4
4
  import type { NileChartConfigInputType } from '../internal/types/index.js';
5
5
  import '../nile-bar-chart/index.js';
6
6
  import '../nile-pie-chart/index.js';
@@ -52,6 +52,7 @@ import '@aquera/nile-data-grid';
52
52
  import '../nile-ai-panel/index.js';
53
53
  export declare class NileChart extends NileElement {
54
54
  static styles: CSSResultGroup;
55
+ private _headerTipEl;
55
56
  /** Full chart configuration. Accepts flat NileChartConfig or separated { chart, aq } input. */
56
57
  config: NileChartConfig | NileChartConfigInputType | null;
57
58
  /**
@@ -71,16 +72,22 @@ export declare class NileChart extends NileElement {
71
72
  */
72
73
  chartTypeAttr: string;
73
74
  /** Summary/insight text — shown as the AI panel's opening message when the chat is opened. */
75
+ summary: string;
74
76
  /**
75
- * When set, fills `chart.type` if the config omits it (same values as `chart.type`, e.g. `stacked`, `pie`).
76
- * Usage: `<nile-chart chart-type="pie" />` plus `config.chart` with series data only.
77
+ * Controls which items appear in the actions menu. All items are opt-in
78
+ * only items explicitly set to `true` are shown. Merged with (and takes
79
+ * priority over) `config.menu`.
80
+ *
81
+ * @example
82
+ * // PNG + CSV only
83
+ * chart.menu = { enabled: true, downloadPng: true, downloadCsv: true }
77
84
  */
78
- /** Summary/insight text — shown as the AI panel's opening message when the chat is opened. */
79
- summary: string;
85
+ menu: NileChartMenuConfig | null;
80
86
  private activeType;
81
87
  private activeConfig;
82
88
  private menuOpen;
83
89
  private chatOpen;
90
+ private _hcChart;
84
91
  /** True when elements are projected into the `header` slot (default title/subtitle hidden). */
85
92
  private hasHeaderSlotContent;
86
93
  /** True when elements are projected into `header-actions` (used to show the header row). */
@@ -90,6 +97,7 @@ export declare class NileChart extends NileElement {
90
97
  /** AI panel shows when ai.enabled is true OR when a summary is provided. */
91
98
  private get aiEnabled();
92
99
  private handleOutsideClick;
100
+ private handleChartReady;
93
101
  connectedCallback(): void;
94
102
  disconnectedCallback(): void;
95
103
  private mergeChartTypeFromAttr;
@@ -112,8 +120,19 @@ export declare class NileChart extends NileElement {
112
120
  /** Direct children with `slot=` — header row renders on first paint before slot assignment runs. */
113
121
  private lightDomHasSlot;
114
122
  private shouldShowHeader;
115
- private renderTypeSwitcher;
123
+ private buildExportingOptions;
124
+ /** Ensures exporting modules are loaded and the chart's exporting/fullscreen instances exist. */
125
+ private ensureExporting;
126
+ private viewFullscreen;
127
+ private printChart;
128
+ private exportChart;
129
+ private downloadCsv;
130
+ private renderActionsMenu;
116
131
  private renderAiTrigger;
132
+ private _showHeaderTip;
133
+ private _hideHeaderTip;
134
+ private _onTitleEnter;
135
+ private _onSubtitleEnter;
117
136
  private renderHeader;
118
137
  private renderAiPanel;
119
138
  private renderChartContent;