@luzmo/analytics-components-kit 1.1.1 → 1.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 (220) hide show
  1. package/README.md +10 -2
  2. package/angular/components/interactive-viz-item.ts +41 -4
  3. package/angular/components/item-option-color-picker.ts +30 -3
  4. package/angular/components/item-option-color-range.ts +30 -3
  5. package/angular/components/item-option-guidelines.ts +31 -4
  6. package/angular/components/item-option-panel.ts +41 -4
  7. package/angular/components/item-option-slider.ts +41 -4
  8. package/angular/components/item-option.ts +41 -4
  9. package/angular/esm/components/interactive-viz-item.d.ts +14 -5
  10. package/angular/esm/components/interactive-viz-item.js +30 -4
  11. package/angular/esm/components/item-option-color-picker.d.ts +11 -4
  12. package/angular/esm/components/item-option-color-picker.js +23 -3
  13. package/angular/esm/components/item-option-color-range.d.ts +11 -4
  14. package/angular/esm/components/item-option-color-range.js +23 -3
  15. package/angular/esm/components/item-option-guidelines.d.ts +11 -4
  16. package/angular/esm/components/item-option-guidelines.js +24 -4
  17. package/angular/esm/components/item-option-panel.d.ts +13 -4
  18. package/angular/esm/components/item-option-panel.js +30 -4
  19. package/angular/esm/components/item-option-slider.d.ts +13 -4
  20. package/angular/esm/components/item-option-slider.js +30 -4
  21. package/angular/esm/components/item-option.d.ts +13 -4
  22. package/angular/esm/components/item-option.js +30 -4
  23. package/angular/package.json +2 -2
  24. package/angular/utils/option-interaction/index.d.ts +2 -0
  25. package/angular/utils/option-interaction/is-same-option-value.d.ts +10 -0
  26. package/angular/utils/option-interaction/option-interaction-controller.d.ts +54 -0
  27. package/angular/utils/option-interaction/tests/option-interaction-controller.test.d.ts +1 -0
  28. package/angular/utils/store/base-store.d.ts +9 -0
  29. package/angular/utils/store/tests/store-base-history.test.d.ts +1 -0
  30. package/components/add-to-dashboard/index.cjs +1 -1
  31. package/components/add-to-dashboard/index.js +1 -1
  32. package/components/{add-to-dashboard-NwsCPIlg.cjs → add-to-dashboard-CzIuDtAq.cjs} +1 -1
  33. package/components/{add-to-dashboard-NcVHlqrc.js → add-to-dashboard-DGC0_hRB.js} +1 -1
  34. package/components/{base-store-SgJsjLap.cjs → base-store-D3whjduR.cjs} +1 -1
  35. package/components/{base-store-g0dt7ru7.js → base-store-DQYj8A1W.js} +3 -0
  36. package/components/{chart-helpers-Dng_LGfq.js → chart-helpers-Cbl3sRra.js} +3 -2
  37. package/components/chart-helpers-fMnqHRzC.cjs +20 -0
  38. package/components/{choropleth-map-options.config-D9-u-NwX.js → choropleth-map-options.config-Blu0Z2tR.js} +1 -1
  39. package/components/{choropleth-map-options.config-CXDGMiSJ.cjs → choropleth-map-options.config-DwFJ00CS.cjs} +1 -1
  40. package/components/{color-range-utils-CUCTsRXM.js → color-range-utils-CgwRGUkg.js} +18 -18
  41. package/components/{color-range-utils-BCFQAeY1.cjs → color-range-utils-D8uygiMe.cjs} +1 -1
  42. package/components/{heat-map-options.config-ChZeslEy.js → heat-map-options.config-BQkhkLPb.js} +16 -16
  43. package/components/{heat-map-options.config-DiNa8NnG.cjs → heat-map-options.config-DjQkB039.cjs} +1 -1
  44. package/components/{heat-table-options.config-BPCszrFn.js → heat-table-options.config-CMWWTeyo.js} +1 -1
  45. package/components/{heat-table-options.config-BvE6coaV.cjs → heat-table-options.config-D21xtaIk.cjs} +1 -1
  46. package/components/index.cjs +1 -1
  47. package/components/index.js +9 -9
  48. package/components/interactive-viz-item/index.cjs +1 -1
  49. package/components/interactive-viz-item/index.d.ts +2 -1
  50. package/components/interactive-viz-item/index.js +2 -2
  51. package/components/interactive-viz-item/interactive-viz-item.d.ts +34 -2
  52. package/components/interactive-viz-item/types.d.ts +17 -0
  53. package/components/{interactive-viz-item-CofUkpP6.js → interactive-viz-item-BKLOmawA.js} +166 -100
  54. package/components/interactive-viz-item-ojdH1uk0.cjs +268 -0
  55. package/components/is-same-option-value-B2oyvEqT.js +42 -0
  56. package/components/is-same-option-value-Cf6BQcs7.cjs +20 -0
  57. package/components/item-option/helpers/control-markup.d.ts +7 -0
  58. package/components/item-option/index.cjs +1 -1
  59. package/components/item-option/index.d.ts +1 -1
  60. package/components/item-option/index.js +1 -1
  61. package/components/item-option/item-option.d.ts +23 -2
  62. package/components/item-option/types.d.ts +19 -0
  63. package/components/{item-option-Cgx3c08E.js → item-option-DKLRnicU.js} +182 -136
  64. package/components/item-option-DpLdospV.cjs +285 -0
  65. package/components/item-option-color-picker/index.cjs +1 -1
  66. package/components/item-option-color-picker/index.d.ts +1 -1
  67. package/components/item-option-color-picker/index.js +1 -1
  68. package/components/item-option-color-picker/item-option-color-picker.d.ts +17 -1
  69. package/components/item-option-color-picker-CNW7GsCO.cjs +37 -0
  70. package/components/item-option-color-picker-DDvsY7hV.js +129 -0
  71. package/components/item-option-color-range/index.cjs +1 -1
  72. package/components/item-option-color-range/index.d.ts +1 -1
  73. package/components/item-option-color-range/index.js +1 -1
  74. package/components/item-option-color-range/item-option-color-range.d.ts +20 -1
  75. package/components/item-option-color-range-BqSbuSZh.cjs +101 -0
  76. package/components/item-option-color-range-FQduqtz3.js +265 -0
  77. package/components/item-option-guidelines/index.cjs +1 -1
  78. package/components/item-option-guidelines/index.d.ts +1 -1
  79. package/components/item-option-guidelines/index.js +1 -1
  80. package/components/item-option-guidelines/item-option-guidelines.d.ts +16 -1
  81. package/components/{item-option-guidelines-DNJevmVD.js → item-option-guidelines-k5DwMONo.js} +132 -104
  82. package/components/item-option-guidelines-z9BsGR-l.cjs +138 -0
  83. package/components/item-option-panel/index.cjs +1 -1
  84. package/components/item-option-panel/index.d.ts +1 -1
  85. package/components/item-option-panel/index.js +1 -1
  86. package/components/item-option-panel/item-option-panel.d.ts +12 -1
  87. package/components/{item-option-panel-DHdnisRb.js → item-option-panel-BLXWIbjX.js} +18 -6
  88. package/components/{item-option-panel-Dl3aYBNe.cjs → item-option-panel-CU51qvgV.cjs} +6 -4
  89. package/components/item-option-slider/index.cjs +1 -1
  90. package/components/item-option-slider/index.d.ts +1 -1
  91. package/components/item-option-slider/index.js +1 -1
  92. package/components/item-option-slider/item-option-slider.d.ts +15 -2
  93. package/components/item-option-slider-BKtJfL3D.js +119 -0
  94. package/components/item-option-slider-Kz2eFBql.cjs +36 -0
  95. package/components/item-options-configs.cjs +1 -1
  96. package/components/item-options-configs.js +5 -5
  97. package/components/option-interaction-controller-B8S1N_Oo.js +90 -0
  98. package/components/option-interaction-controller-D0U-CTpZ.cjs +20 -0
  99. package/components/{route-map-options.config-DdCaVtIF.cjs → route-map-options.config-DER6ENky.cjs} +1 -1
  100. package/components/{route-map-options.config-B7vT6KG_.js → route-map-options.config-DTcS47fW.js} +1 -1
  101. package/components/{spike-map-options.config-DkmRZ1JZ.js → spike-map-options.config-CPYfKWoF.js} +1 -1
  102. package/components/{spike-map-options.config-B3hDh2qU.cjs → spike-map-options.config-DeF1Whq5.cjs} +1 -1
  103. package/components/utils/store.cjs +1 -1
  104. package/components/utils/store.js +1 -1
  105. package/custom-elements.json +418 -104
  106. package/package.json +2 -2
  107. package/react/components/interactive-viz-item.component.ts +11 -2
  108. package/react/components/item-option-color-picker.component.ts +9 -3
  109. package/react/components/item-option-color-range.component.ts +9 -3
  110. package/react/components/item-option-guidelines.component.ts +9 -3
  111. package/react/components/item-option-panel.component.ts +12 -3
  112. package/react/components/item-option-slider.component.ts +12 -3
  113. package/react/components/item-option.component.ts +12 -3
  114. package/react/esm/components/interactive-viz-item.component.d.ts +8 -2
  115. package/react/esm/components/interactive-viz-item.component.js +7 -1
  116. package/react/esm/components/item-option-color-picker.component.d.ts +6 -2
  117. package/react/esm/components/item-option-color-picker.component.js +6 -2
  118. package/react/esm/components/item-option-color-range.component.d.ts +6 -2
  119. package/react/esm/components/item-option-color-range.component.js +6 -2
  120. package/react/esm/components/item-option-guidelines.component.d.ts +6 -2
  121. package/react/esm/components/item-option-guidelines.component.js +6 -2
  122. package/react/esm/components/item-option-panel.component.d.ts +8 -2
  123. package/react/esm/components/item-option-panel.component.js +8 -2
  124. package/react/esm/components/item-option-slider.component.d.ts +8 -2
  125. package/react/esm/components/item-option-slider.component.js +8 -2
  126. package/react/esm/components/item-option.component.d.ts +8 -2
  127. package/react/esm/components/item-option.component.js +8 -2
  128. package/react/luzmo-stub.d.ts +7 -0
  129. package/react/package.json +2 -2
  130. package/standalone/add-to-dashboard.js +40 -40
  131. package/standalone/chunks/{chart-helpers-DsIGsaDc.js → chart-helpers-CR-EUEPf.js} +2 -2
  132. package/standalone/chunks/{choropleth-map-options.config-Cs4Kvr9h.js → choropleth-map-options.config-CDMjKnJD.js} +1 -1
  133. package/standalone/chunks/{color-range-utils-CKDpd3gZ.js → color-range-utils-BVyHBRiq.js} +1 -1
  134. package/standalone/chunks/de-BkB0q1Eg.js +2 -0
  135. package/standalone/chunks/display-settings-binning-BeLLxd3i.js +38 -0
  136. package/standalone/chunks/display-settings-datetime-BkeiKIVV.js +199 -0
  137. package/standalone/chunks/display-settings-grand-totals-BuhpQKJ6.js +26 -0
  138. package/standalone/chunks/display-settings-numeric-m30IYI7I.js +172 -0
  139. package/standalone/chunks/display-settings-period-over-period-CqDlOSRn.js +209 -0
  140. package/standalone/chunks/embed-Bv1ps-EM.js +260 -0
  141. package/standalone/chunks/en-63f7j4v7.js +2 -0
  142. package/standalone/chunks/en-GB-QAmXQf8W.js +2 -0
  143. package/standalone/chunks/en-US-63f7j4v7.js +2 -0
  144. package/standalone/chunks/es-Bo0jStZn.js +2 -0
  145. package/standalone/chunks/{filters-DKgJcQGP.js → filters-CxgBXUF1.js} +61 -61
  146. package/standalone/chunks/{formula-codemirror-BbyvNEVD.js → formula-codemirror-Cq94j3-f.js} +17 -17
  147. package/standalone/chunks/fr-Co_qVhhV.js +2 -0
  148. package/standalone/chunks/{heat-map-options.config-DF5kjOOe.js → heat-map-options.config-DDQMD38W.js} +1 -1
  149. package/standalone/chunks/{heat-table-options.config-DaePzfHG.js → heat-table-options.config-B4K0Ygug.js} +1 -1
  150. package/standalone/chunks/is-same-option-value-7kXNF4st.js +2 -0
  151. package/standalone/chunks/item-option-action-button-group-BoyqF9vt.js +35 -0
  152. package/standalone/chunks/item-option-base-CBcDT8MX.js +38 -0
  153. package/standalone/chunks/item-option-color-palette-picker-C9PGAv4V.js +22 -0
  154. package/standalone/chunks/item-option-color-picker-D4fVJlqF.js +19 -0
  155. package/standalone/chunks/item-option-color-range-BlAdTguE.js +83 -0
  156. package/standalone/chunks/item-option-guidelines-DMsYsHDu.js +120 -0
  157. package/standalone/chunks/{item-option-multi-language-field-DPPpN2qg.js → item-option-multi-language-field-NUbm1drg.js} +1 -1
  158. package/standalone/chunks/{item-option-number-field-CkqJjInE.js → item-option-number-field-DRp7kbHL.js} +1 -1
  159. package/standalone/chunks/item-option-panel-cXrRclzM.js +316 -0
  160. package/standalone/chunks/{item-option-picker-BnwQPT9A.js → item-option-picker-Ba09L4Cs.js} +1 -1
  161. package/standalone/chunks/item-option-position-picker-GEGTnhjw.js +14 -0
  162. package/standalone/chunks/item-option-positions-number-field-n44s1k5v.js +31 -0
  163. package/standalone/chunks/{item-option-radio-button-group-BkymJq3E.js → item-option-radio-button-group-3s_b1NvR.js} +1 -1
  164. package/standalone/chunks/item-option-slider-DtY65Gxk.js +18 -0
  165. package/standalone/chunks/item-option-switch-4sJaI0mx.js +12 -0
  166. package/standalone/chunks/{item-option-text-field-D7bkuhsv.js → item-option-text-field-Bt6Lj6kh.js} +1 -1
  167. package/standalone/chunks/{item-slot-picker-panel-D4BMxGs9.js → item-slot-picker-panel-BOSVFBIy.js} +43 -43
  168. package/standalone/chunks/load-data-fields-for-datasets-CDlut-6S.js +25 -0
  169. package/standalone/chunks/localized-decorator-DosMCCQo.js +2 -0
  170. package/standalone/chunks/{version-BW4Ixl63.js → localized-mixin-BWJj88bd.js} +1 -1
  171. package/standalone/chunks/nl-CQz2jrVx.js +2 -0
  172. package/standalone/chunks/option-interaction-controller-BuwRr21c.js +2 -0
  173. package/standalone/chunks/{route-map-options.config-D7FfzIiU.js → route-map-options.config-CGBkHnhM.js} +1 -1
  174. package/standalone/chunks/{spike-map-options.config-CZiFzDm9.js → spike-map-options.config-CSenlJ_F.js} +1 -1
  175. package/standalone/interactive-viz-item.js +62 -55
  176. package/standalone/item-grid.js +10 -10
  177. package/standalone/manifest.json +44 -43
  178. package/utils/option-interaction/index.d.ts +2 -0
  179. package/utils/option-interaction/is-same-option-value.d.ts +10 -0
  180. package/utils/option-interaction/option-interaction-controller.d.ts +54 -0
  181. package/utils/option-interaction/tests/option-interaction-controller.test.d.ts +1 -0
  182. package/utils/store/base-store.d.ts +9 -0
  183. package/utils/store/tests/store-base-history.test.d.ts +1 -0
  184. package/components/chart-helpers-ufZ6VbXs.cjs +0 -20
  185. package/components/interactive-viz-item-D537mo3l.cjs +0 -261
  186. package/components/item-option-CqGDFdPj.cjs +0 -269
  187. package/components/item-option-color-picker-BpPoOO2b.cjs +0 -34
  188. package/components/item-option-color-picker-cojuCvu5.js +0 -84
  189. package/components/item-option-color-range-CMBEx1fi.cjs +0 -98
  190. package/components/item-option-color-range-Dt7Bv06p.js +0 -217
  191. package/components/item-option-guidelines-Beh0DlG0.cjs +0 -135
  192. package/components/item-option-slider-Bo5vs6nr.js +0 -89
  193. package/components/item-option-slider-CyWKWr5D.cjs +0 -33
  194. package/standalone/chunks/color-7IgCGZKz.js +0 -2
  195. package/standalone/chunks/de-mdZT2W1G.js +0 -2
  196. package/standalone/chunks/display-settings-binning-Byffw2Kl.js +0 -38
  197. package/standalone/chunks/display-settings-datetime-CD52d6Sv.js +0 -199
  198. package/standalone/chunks/display-settings-grand-totals-Cky99LX9.js +0 -26
  199. package/standalone/chunks/display-settings-numeric-C9ea7Tgc.js +0 -172
  200. package/standalone/chunks/display-settings-period-over-period-BLSGumkD.js +0 -209
  201. package/standalone/chunks/embed-BfHBKhIe.js +0 -231
  202. package/standalone/chunks/en-CSboh17P.js +0 -2
  203. package/standalone/chunks/en-GB-HoXKQBOY.js +0 -2
  204. package/standalone/chunks/en-US-CSboh17P.js +0 -2
  205. package/standalone/chunks/es-Di5D8JFd.js +0 -2
  206. package/standalone/chunks/fr-DZku7iB9.js +0 -2
  207. package/standalone/chunks/item-option-action-button-group-BEAwPHVw.js +0 -35
  208. package/standalone/chunks/item-option-base-CRUxNhJQ.js +0 -38
  209. package/standalone/chunks/item-option-color-palette-picker-CBz61iZb.js +0 -22
  210. package/standalone/chunks/item-option-color-picker-Cr7ujQNO.js +0 -16
  211. package/standalone/chunks/item-option-color-range-CyJd1LZ_.js +0 -80
  212. package/standalone/chunks/item-option-guidelines-6NjpzS6b.js +0 -117
  213. package/standalone/chunks/item-option-panel-VxvWU56c.js +0 -298
  214. package/standalone/chunks/item-option-position-picker-Bkc4JvJX.js +0 -14
  215. package/standalone/chunks/item-option-positions-number-field-Dr_315TE.js +0 -31
  216. package/standalone/chunks/item-option-slider-l9wt7_0c.js +0 -15
  217. package/standalone/chunks/item-option-switch-DeihDHhM.js +0 -12
  218. package/standalone/chunks/load-data-fields-for-datasets-ClctSj6y.js +0 -25
  219. package/standalone/chunks/localized-decorator-DJVBmJVH.js +0 -2
  220. package/standalone/chunks/nl-CViTevL3.js +0 -2
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, Input, output, Renderer2 } from '@angular/core';
1
+ import { booleanAttribute, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, Input, output, Renderer2 } from '@angular/core';
2
2
  import '@luzmo/analytics-components-kit/item-option-slider';
3
3
  import * as i0 from "@angular/core";
4
4
  const _c0 = ["*"];
@@ -27,12 +27,20 @@ export class LuzmoItemOptionSlider {
27
27
  step;
28
28
  /** Delay in milliseconds before the change event is emitted after the user stops interacting. */
29
29
  debounce;
30
+ /** Emits value updates live, without `debounce`, plus interaction lifecycle events for drags and held keys. */
31
+ liveInteractions;
30
32
  /** Optional transform applied to the stored value before it is displayed in the control. */
31
33
  parseValue;
32
34
  /** Optional transform applied to the control's value before it is emitted in the change event. */
33
35
  toValue;
34
- /** Emitted when the option value changes. */
36
+ /** Emitted when the option value changes. With `live-interactions`, emitted on every drag or key step and carries `interaction` inside a gesture. */
35
37
  luzmoOptionChanged = output({ alias: 'luzmoOptionChanged' });
38
+ /** With `live-interactions`: a drag or held key first changed the value, right before that value update. A press that never changes the value emits no lifecycle. */
39
+ luzmoOptionInteractionStart = output({ alias: 'luzmoOptionInteractionStart' });
40
+ /** With `live-interactions`: the gesture ended, after its last value update. `changed` is false when the value is back at its start. */
41
+ luzmoOptionInteractionEnd = output({ alias: 'luzmoOptionInteractionEnd' });
42
+ /** With `live-interactions`: the pointer was cancelled and the slider reverted to its start value. */
43
+ luzmoOptionInteractionCancel = output({ alias: 'luzmoOptionInteractionCancel' });
36
44
  constructor() {
37
45
  this.bindEvents();
38
46
  this.destroyRef.onDestroy(() => {
@@ -62,6 +70,9 @@ export class LuzmoItemOptionSlider {
62
70
  case 'debounce':
63
71
  this.setHostProperty('debounce', changes['debounce'].currentValue);
64
72
  break;
73
+ case 'liveInteractions':
74
+ this.setHostProperty('liveInteractions', changes['liveInteractions'].currentValue);
75
+ break;
65
76
  case 'parseValue':
66
77
  this.setHostProperty('parseValue', changes['parseValue'].currentValue);
67
78
  break;
@@ -87,9 +98,21 @@ export class LuzmoItemOptionSlider {
87
98
  const typed = event;
88
99
  this.luzmoOptionChanged.emit(typed);
89
100
  }));
101
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'luzmo-option-interaction-start', (event) => {
102
+ const typed = event;
103
+ this.luzmoOptionInteractionStart.emit(typed);
104
+ }));
105
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'luzmo-option-interaction-end', (event) => {
106
+ const typed = event;
107
+ this.luzmoOptionInteractionEnd.emit(typed);
108
+ }));
109
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'luzmo-option-interaction-cancel', (event) => {
110
+ const typed = event;
111
+ this.luzmoOptionInteractionCancel.emit(typed);
112
+ }));
90
113
  }
91
114
  static ɵfac = function LuzmoItemOptionSlider_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LuzmoItemOptionSlider)(); };
92
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoItemOptionSlider, selectors: [["luzmo-item-option-slider"]], inputs: { value: "value", default: "default", min: "min", max: "max", step: "step", debounce: "debounce", parseValue: "parseValue", toValue: "toValue" }, outputs: { luzmoOptionChanged: "luzmoOptionChanged" }, exportAs: ["luzmoItemOptionSlider"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoItemOptionSlider_Template(rf, ctx) { if (rf & 1) {
115
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoItemOptionSlider, selectors: [["luzmo-item-option-slider"]], inputs: { value: "value", default: "default", min: "min", max: "max", step: "step", debounce: "debounce", liveInteractions: [2, "liveInteractions", "liveInteractions", booleanAttribute], parseValue: "parseValue", toValue: "toValue" }, outputs: { luzmoOptionChanged: "luzmoOptionChanged", luzmoOptionInteractionStart: "luzmoOptionInteractionStart", luzmoOptionInteractionEnd: "luzmoOptionInteractionEnd", luzmoOptionInteractionCancel: "luzmoOptionInteractionCancel" }, exportAs: ["luzmoItemOptionSlider"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoItemOptionSlider_Template(rf, ctx) { if (rf & 1) {
93
116
  i0.ɵɵprojectionDef();
94
117
  i0.ɵɵprojection(0);
95
118
  } }, encapsulation: 2 });
@@ -121,11 +144,14 @@ export class LuzmoItemOptionSlider {
121
144
  }], debounce: [{
122
145
  type: Input,
123
146
  args: [{ alias: 'debounce' }]
147
+ }], liveInteractions: [{
148
+ type: Input,
149
+ args: [{ alias: 'liveInteractions', transform: booleanAttribute }]
124
150
  }], parseValue: [{
125
151
  type: Input,
126
152
  args: [{ alias: 'parseValue' }]
127
153
  }], toValue: [{
128
154
  type: Input,
129
155
  args: [{ alias: 'toValue' }]
130
- }], luzmoOptionChanged: [{ type: i0.Output, args: ["luzmoOptionChanged"] }] }); })();
156
+ }], luzmoOptionChanged: [{ type: i0.Output, args: ["luzmoOptionChanged"] }], luzmoOptionInteractionStart: [{ type: i0.Output, args: ["luzmoOptionInteractionStart"] }], luzmoOptionInteractionEnd: [{ type: i0.Output, args: ["luzmoOptionInteractionEnd"] }], luzmoOptionInteractionCancel: [{ type: i0.Output, args: ["luzmoOptionInteractionCancel"] }] }); })();
131
157
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LuzmoItemOptionSlider, { className: "LuzmoItemOptionSlider", filePath: "components/item-option-slider.ts", lineNumber: 16 }); })();
@@ -1,10 +1,10 @@
1
1
  import { OnChanges, SimpleChanges } from '@angular/core';
2
2
  import '@luzmo/analytics-components-kit/item-option';
3
- import type { LuzmoItemOption as LuzmoItemOptionHostElement, ItemOptionsChangedEventDetail } from '@luzmo/analytics-components-kit/item-option';
3
+ import type { LuzmoItemOption as LuzmoItemOptionHostElement, ItemOptionInteractionEventDetail, ItemOptionsChangedEventDetail } from '@luzmo/analytics-components-kit/item-option';
4
4
  import type { ElementSize } from '@luzmo/analytics-components-kit/types';
5
5
  import type { OptionConfig, OptionTranslation, ThemeConfig, TranslationOverrides, VizItemType } from '@luzmo/dashboard-contents-types';
6
6
  import * as i0 from "@angular/core";
7
- export type { ItemOptionChangedEventDetail, ItemOptionsChangedEventDetail } from '@luzmo/analytics-components-kit/item-option';
7
+ export type { ItemOptionChangedEventDetail, ItemOptionInteraction, ItemOptionInteractionEventDetail, ItemOptionInteractionEventName, ItemOptionsChangedEventDetail } from '@luzmo/analytics-components-kit/item-option';
8
8
  export declare class LuzmoItemOption implements OnChanges {
9
9
  private readonly elementRef;
10
10
  private readonly renderer;
@@ -37,10 +37,18 @@ export declare class LuzmoItemOption implements OnChanges {
37
37
  authToken?: string;
38
38
  /** The size variant of the option control (`s`, `m`, `l`, `xl`). */
39
39
  size?: ElementSize;
40
+ /** Emits options updates live, without the control's debounce, plus `luzmo-option-interaction-*` events around drags and held keys. Off by default. */
41
+ liveInteractions?: boolean;
40
42
  /** Callback that updates `options` and emits `luzmo-options-changed`; used internally by the rendered control. */
41
43
  changedOptions?: unknown;
42
- /** Announces that the `options` of the element have changed */
44
+ /** Announces that the `options` of the element have changed. With `live-interactions`, updates inside a gesture carry `interaction`. */
43
45
  readonly luzmoOptionsChanged: import("@angular/core").OutputEmitterRef<CustomEvent<ItemOptionsChangedEventDetail>>;
46
+ /** With `live-interactions`: a drag or held key first changed the control's value, right before that options update. A press that never changes the value emits no lifecycle. `detail.optionKey` is set. */
47
+ readonly luzmoOptionInteractionStart: import("@angular/core").OutputEmitterRef<CustomEvent<ItemOptionInteractionEventDetail>>;
48
+ /** With `live-interactions`: the gesture ended, after its last options update. `detail.changed` is false when the value is back at its start. */
49
+ readonly luzmoOptionInteractionEnd: import("@angular/core").OutputEmitterRef<CustomEvent<ItemOptionInteractionEventDetail>>;
50
+ /** With `live-interactions`: the gesture was cancelled and the control reverted to its start value. */
51
+ readonly luzmoOptionInteractionCancel: import("@angular/core").OutputEmitterRef<CustomEvent<ItemOptionInteractionEventDetail>>;
44
52
  constructor();
45
53
  ngOnChanges(changes: SimpleChanges): void;
46
54
  /**
@@ -52,7 +60,8 @@ export declare class LuzmoItemOption implements OnChanges {
52
60
  private setHostProperty;
53
61
  private bindEvents;
54
62
  static ɵfac: i0.ɵɵFactoryDeclaration<LuzmoItemOption, never>;
55
- static ɵcmp: i0.ɵɵComponentDeclaration<LuzmoItemOption, "luzmo-item-option", ["luzmoItemOption"], { "language": { "alias": "language"; "required": false; }; "itemType": { "alias": "itemType"; "required": false; }; "optionKey": { "alias": "optionKey"; "required": false; }; "customOptionConfiguration": { "alias": "customOptionConfiguration"; "required": false; }; "customTranslations": { "alias": "customTranslations"; "required": false; }; "options": { "alias": "options"; "required": false; }; "slots": { "alias": "slots"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "apiUrl": { "alias": "apiUrl"; "required": false; }; "authKey": { "alias": "authKey"; "required": false; }; "authToken": { "alias": "authToken"; "required": false; }; "size": { "alias": "size"; "required": false; }; "changedOptions": { "alias": "changedOptions"; "required": false; }; }, { "luzmoOptionsChanged": "luzmoOptionsChanged"; }, never, ["*"], true, never>;
63
+ static ɵcmp: i0.ɵɵComponentDeclaration<LuzmoItemOption, "luzmo-item-option", ["luzmoItemOption"], { "language": { "alias": "language"; "required": false; }; "itemType": { "alias": "itemType"; "required": false; }; "optionKey": { "alias": "optionKey"; "required": false; }; "customOptionConfiguration": { "alias": "customOptionConfiguration"; "required": false; }; "customTranslations": { "alias": "customTranslations"; "required": false; }; "options": { "alias": "options"; "required": false; }; "slots": { "alias": "slots"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "apiUrl": { "alias": "apiUrl"; "required": false; }; "authKey": { "alias": "authKey"; "required": false; }; "authToken": { "alias": "authToken"; "required": false; }; "size": { "alias": "size"; "required": false; }; "liveInteractions": { "alias": "liveInteractions"; "required": false; }; "changedOptions": { "alias": "changedOptions"; "required": false; }; }, { "luzmoOptionsChanged": "luzmoOptionsChanged"; "luzmoOptionInteractionStart": "luzmoOptionInteractionStart"; "luzmoOptionInteractionEnd": "luzmoOptionInteractionEnd"; "luzmoOptionInteractionCancel": "luzmoOptionInteractionCancel"; }, never, ["*"], true, never>;
64
+ static ngAcceptInputType_liveInteractions: unknown;
56
65
  }
57
66
  /** The underlying custom element type for LuzmoItemOption */
58
67
  export type LuzmoItemOptionElement = LuzmoItemOptionHostElement;
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, Input, output, Renderer2 } from '@angular/core';
1
+ import { booleanAttribute, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, Input, output, Renderer2 } from '@angular/core';
2
2
  import '@luzmo/analytics-components-kit/item-option';
3
3
  import * as i0 from "@angular/core";
4
4
  const _c0 = ["*"];
@@ -39,10 +39,18 @@ export class LuzmoItemOption {
39
39
  authToken;
40
40
  /** The size variant of the option control (`s`, `m`, `l`, `xl`). */
41
41
  size;
42
+ /** Emits options updates live, without the control's debounce, plus `luzmo-option-interaction-*` events around drags and held keys. Off by default. */
43
+ liveInteractions;
42
44
  /** Callback that updates `options` and emits `luzmo-options-changed`; used internally by the rendered control. */
43
45
  changedOptions;
44
- /** Announces that the `options` of the element have changed */
46
+ /** Announces that the `options` of the element have changed. With `live-interactions`, updates inside a gesture carry `interaction`. */
45
47
  luzmoOptionsChanged = output({ alias: 'luzmoOptionsChanged' });
48
+ /** With `live-interactions`: a drag or held key first changed the control's value, right before that options update. A press that never changes the value emits no lifecycle. `detail.optionKey` is set. */
49
+ luzmoOptionInteractionStart = output({ alias: 'luzmoOptionInteractionStart' });
50
+ /** With `live-interactions`: the gesture ended, after its last options update. `detail.changed` is false when the value is back at its start. */
51
+ luzmoOptionInteractionEnd = output({ alias: 'luzmoOptionInteractionEnd' });
52
+ /** With `live-interactions`: the gesture was cancelled and the control reverted to its start value. */
53
+ luzmoOptionInteractionCancel = output({ alias: 'luzmoOptionInteractionCancel' });
46
54
  constructor() {
47
55
  this.bindEvents();
48
56
  this.destroyRef.onDestroy(() => {
@@ -90,6 +98,9 @@ export class LuzmoItemOption {
90
98
  case 'size':
91
99
  this.setHostProperty('size', changes['size'].currentValue);
92
100
  break;
101
+ case 'liveInteractions':
102
+ this.setHostProperty('liveInteractions', changes['liveInteractions'].currentValue);
103
+ break;
93
104
  case 'changedOptions':
94
105
  this.setHostProperty('changedOptions', changes['changedOptions'].currentValue);
95
106
  break;
@@ -112,9 +123,21 @@ export class LuzmoItemOption {
112
123
  const typed = event;
113
124
  this.luzmoOptionsChanged.emit(typed);
114
125
  }));
126
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'luzmo-option-interaction-start', (event) => {
127
+ const typed = event;
128
+ this.luzmoOptionInteractionStart.emit(typed);
129
+ }));
130
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'luzmo-option-interaction-end', (event) => {
131
+ const typed = event;
132
+ this.luzmoOptionInteractionEnd.emit(typed);
133
+ }));
134
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'luzmo-option-interaction-cancel', (event) => {
135
+ const typed = event;
136
+ this.luzmoOptionInteractionCancel.emit(typed);
137
+ }));
115
138
  }
116
139
  static ɵfac = function LuzmoItemOption_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LuzmoItemOption)(); };
117
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoItemOption, selectors: [["luzmo-item-option"]], inputs: { language: "language", itemType: "itemType", optionKey: "optionKey", customOptionConfiguration: "customOptionConfiguration", customTranslations: "customTranslations", options: "options", slots: "slots", theme: "theme", apiUrl: "apiUrl", authKey: "authKey", authToken: "authToken", size: "size", changedOptions: "changedOptions" }, outputs: { luzmoOptionsChanged: "luzmoOptionsChanged" }, exportAs: ["luzmoItemOption"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoItemOption_Template(rf, ctx) { if (rf & 1) {
140
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoItemOption, selectors: [["luzmo-item-option"]], inputs: { language: "language", itemType: "itemType", optionKey: "optionKey", customOptionConfiguration: "customOptionConfiguration", customTranslations: "customTranslations", options: "options", slots: "slots", theme: "theme", apiUrl: "apiUrl", authKey: "authKey", authToken: "authToken", size: "size", liveInteractions: [2, "liveInteractions", "liveInteractions", booleanAttribute], changedOptions: "changedOptions" }, outputs: { luzmoOptionsChanged: "luzmoOptionsChanged", luzmoOptionInteractionStart: "luzmoOptionInteractionStart", luzmoOptionInteractionEnd: "luzmoOptionInteractionEnd", luzmoOptionInteractionCancel: "luzmoOptionInteractionCancel" }, exportAs: ["luzmoItemOption"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoItemOption_Template(rf, ctx) { if (rf & 1) {
118
141
  i0.ɵɵprojectionDef();
119
142
  i0.ɵɵprojection(0);
120
143
  } }, encapsulation: 2 });
@@ -164,8 +187,11 @@ export class LuzmoItemOption {
164
187
  }], size: [{
165
188
  type: Input,
166
189
  args: [{ alias: 'size' }]
190
+ }], liveInteractions: [{
191
+ type: Input,
192
+ args: [{ alias: 'liveInteractions', transform: booleanAttribute }]
167
193
  }], changedOptions: [{
168
194
  type: Input,
169
195
  args: [{ alias: 'changedOptions' }]
170
- }], luzmoOptionsChanged: [{ type: i0.Output, args: ["luzmoOptionsChanged"] }] }); })();
196
+ }], luzmoOptionsChanged: [{ type: i0.Output, args: ["luzmoOptionsChanged"] }], luzmoOptionInteractionStart: [{ type: i0.Output, args: ["luzmoOptionInteractionStart"] }], luzmoOptionInteractionEnd: [{ type: i0.Output, args: ["luzmoOptionInteractionEnd"] }], luzmoOptionInteractionCancel: [{ type: i0.Output, args: ["luzmoOptionInteractionCancel"] }] }); })();
171
197
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LuzmoItemOption, { className: "LuzmoItemOption", filePath: "components/item-option.ts", lineNumber: 18 }); })();
@@ -29,9 +29,9 @@
29
29
  "peerDependencies": {
30
30
  "@angular/core": "^17.3.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
31
31
  "@angular/forms": "^17.3.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
32
- "@luzmo/analytics-components-kit": "1.1.1"
32
+ "@luzmo/analytics-components-kit": "1.3.0"
33
33
  },
34
- "version": "1.1.1",
34
+ "version": "1.3.0",
35
35
  "repository": {
36
36
  "type": "git",
37
37
  "url": "git+https://github.com/cumulio-internal/analytics-components-kit.git"
@@ -0,0 +1,2 @@
1
+ export { isSameColorValue, isSameOptionValue } from './is-same-option-value';
2
+ export { type LuceroInteractionDetail, OptionInteractionController } from './option-interaction-controller';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Structural equality for option values: arrays and plain objects compare by content (an absent key differs from an
3
+ * `undefined` one), everything else with `Object.is`. Strings are never normalized as colors here; use `isSameColorValue`.
4
+ */
5
+ export declare const isSameOptionValue: (a: unknown, b: unknown) => boolean;
6
+ /**
7
+ * Equality for a color value: two strings that parse as colors compare by their sRGB channels and alpha, so `#ff0000`,
8
+ * `#FF0000` and `rgb(255, 0, 0)` are the same color. Other values fall back to `isSameOptionValue`.
9
+ */
10
+ export declare const isSameColorValue: (a: unknown, b: unknown) => boolean;
@@ -0,0 +1,54 @@
1
+ import type { ReactiveController, ReactiveControllerHost } from 'lit';
2
+ import type { ItemOptionInteraction } from '../../components/item-option/types';
3
+ /** The part of Lucero's `luzmo-interaction-*` event detail that ACK reads. */
4
+ export interface LuceroInteractionDetail {
5
+ id: string;
6
+ }
7
+ /**
8
+ * Maps Lucero gesture boundaries (`luzmo-interaction-*`) on a control's Lucero children to ACK
9
+ * `luzmo-option-interaction-*` events, and tags the live value updates in between with the gesture id.
10
+ * Each gesture on each source element gets its own id, so overlapping gestures never merge.
11
+ * A gesture stays silent until its first changed value: a press that never changes the value emits nothing.
12
+ */
13
+ export declare class OptionInteractionController implements ReactiveController {
14
+ private readonly _host;
15
+ private readonly _isSame;
16
+ private _open;
17
+ private _hasDiscreteValue;
18
+ private _discreteValue;
19
+ /**
20
+ * @param _isSame Equality used for `changed` and for dropping repeated values, for example `isSameColorValue`
21
+ * in a color control. Defaults to structural equality without color normalization.
22
+ */
23
+ constructor(_host: ReactiveControllerHost & HTMLElement, _isSame?: (a: unknown, b: unknown) => boolean);
24
+ /** Whether a Lucero gesture is open, whether or not it changed the value yet. */
25
+ get active(): boolean;
26
+ /** Ends gestures whose source element was removed by the last render, such as a deleted color stop. */
27
+ hostUpdated(): void;
28
+ /** Ends open gestures if the host was removed without `endInteraction()`; only listeners on the host still hear it. */
29
+ hostDisconnected(): void;
30
+ /**
31
+ * Opens a gesture for a Lucero `luzmo-interaction-start` on `source`. `value` is the value `source` edits, before the
32
+ * gesture: the option value, or in a composite control (color range, guidelines) only that child's own value.
33
+ * `luzmo-option-interaction-start` waits for the gesture's first changed value in `update`.
34
+ */
35
+ start(source: EventTarget, detail: LuceroInteractionDetail, value: unknown): void;
36
+ /**
37
+ * Emits a value update through `emit`. Inside a gesture on `source` the update carries the gesture id and is
38
+ * tracked by `ownValue` (the value `source` edits, as passed to `start`); outside one it is a discrete update
39
+ * tracked by the full `value`. An update whose tracked value equals the previous one is dropped. The first changed
40
+ * value of a gesture emits `luzmo-option-interaction-start` right before its update.
41
+ */
42
+ update(source: EventTarget, value: unknown, emit: (interaction?: ItemOptionInteraction) => void, ownValue?: unknown): void;
43
+ /** Closes the gesture for a Lucero `luzmo-interaction-end`. Unknown, closed or never-changed gestures emit nothing. */
44
+ end(source: EventTarget, detail: LuceroInteractionDetail): void;
45
+ /** Closes the gesture for a Lucero `luzmo-interaction-cancel`, after the control emitted Lucero's revert. */
46
+ cancel(source: EventTarget, detail: LuceroInteractionDetail): void;
47
+ /** Ends every open gesture, keeping the values already emitted; only gestures that changed a value emit an end. Idempotent. */
48
+ endAll(): void;
49
+ /** Discrete updates are deduped against the last emitted full value, a gesture's included, so returning to an older value still emits. */
50
+ private _rememberEmitted;
51
+ private _find;
52
+ private _take;
53
+ private _dispatch;
54
+ }
@@ -155,4 +155,13 @@ export declare abstract class BaseStore<TState> {
155
155
  * This ensures changes are tracked by the undo manager
156
156
  */
157
157
  protected transact<T>(fn: () => T): T;
158
+ /**
159
+ * Execute a function within a local transaction recorded as its own undo step.
160
+ * Unlike `transact`, it never merges with neighbouring transactions within `mergeInterval`.
161
+ * Use it to commit the final value of a gesture whose live preview is kept outside the document.
162
+ *
163
+ * `fn` must be synchronous. Changes made before `fn` throws are kept, not rolled back.
164
+ * Called inside another transaction, the whole outer transaction becomes the separate step.
165
+ */
166
+ protected transactHistoryStep<T>(fn: () => T): T;
158
167
  }
@@ -17,4 +17,4 @@
17
17
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
18
  * SOFTWARE.
19
19
  * */
20
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../add-to-dashboard-NwsCPIlg.cjs");Object.defineProperty(exports,"LuzmoAddToDashboard",{enumerable:!0,get:function(){return e.t}}),exports.createDashboardActions=e.n;
20
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../add-to-dashboard-CzIuDtAq.cjs");Object.defineProperty(exports,"LuzmoAddToDashboard",{enumerable:!0,get:function(){return e.t}}),exports.createDashboardActions=e.n;
@@ -17,4 +17,4 @@
17
17
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
18
  * SOFTWARE.
19
19
  * */
20
- export { t as LuzmoAddToDashboard, n as createDashboardActions } from "../add-to-dashboard-NcVHlqrc.js";
20
+ export { t as LuzmoAddToDashboard, n as createDashboardActions } from "../add-to-dashboard-DGC0_hRB.js";
@@ -17,7 +17,7 @@
17
17
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
18
  * SOFTWARE.
19
19
  * */
20
- require("./tokens-BWMfo_w4.cjs");const e=require("./base-CGDNY_7v.cjs"),t=require("./decorate-DCJt-2rt.cjs"),n=require("./localized-mixin-EoNvtTBG.cjs"),r=require("./data-broker-DCghLjhq.cjs"),i=require("./localize-D3i4Epy_.cjs"),a=require("./chart-helpers-ufZ6VbXs.cjs");let o=require("@luzmo/icons");require("@luzmo/lucero/action-button"),require("@luzmo/lucero/button"),require("@luzmo/lucero/icon"),require("@luzmo/lucero/overlay"),require("@luzmo/lucero/popover"),require("@luzmo/lucero/tooltip");let s=require("lit"),c=require("lit/decorators.js"),l=require("@lit/localize");require("@luzmo/lucero/progress-circle"),require("@luzmo/lucero/checkbox"),require("@luzmo/lucero/divider"),require("@luzmo/lucero/field-group"),require("@luzmo/lucero/menu"),require("@luzmo/lucero/notice"),require("@luzmo/lucero/search");let u=require("lit/directives/if-defined.js");var d=`:host{align-items:flex-end;gap:var(--luzmo-spacing-2);font-family:var(--luzmo-font-family);flex-direction:column;display:inline-flex}.trigger-spinner{--luzmo-progress-circle-size:var(--luzmo-icon-size-xs)}.trigger-chevron{margin-inline-start:var(--luzmo-spacing-1)}.picker{gap:var(--luzmo-spacing-3);width:var(--luzmo-add-to-dashboard-picker-width,var(--add-to-dashboard-picker-width));max-width:90vw;padding:var(--luzmo-spacing-2);color:var(--luzmo-font-color);font-size:var(--luzmo-font-size-s);flex-direction:column;display:flex}luzmo-search{width:100%}.list{max-height:var(--luzmo-add-to-dashboard-list-max-height,var(--add-to-dashboard-list-max-height));flex-direction:column;display:flex;overflow-y:auto}.menu{--luzmo-menu-max-height:none;flex:none;width:100%;overflow:visible}.create-row{--luzmo-menu-item-label-icon-color-default:var(--luzmo-primary)}.thumbnail{object-fit:cover;border:var(--luzmo-border-width) solid var(--luzmo-border-color);border-radius:var(--luzmo-border-radius);width:2.75rem;height:2rem}.drill-in{color:var(--luzmo-font-color-extra-dimmed)}.header{align-items:center;gap:var(--luzmo-spacing-2);display:flex}.header-title{font-weight:var(--luzmo-font-weight-bold);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.empty{align-items:center;gap:var(--luzmo-spacing-3);padding:var(--luzmo-spacing-4);text-align:center;flex-direction:column;display:flex}.loading{padding:var(--luzmo-spacing-3);justify-content:center;display:flex}.screen-modes{gap:var(--luzmo-spacing-2);flex-direction:column;display:flex}.screen-mode{align-items:center;gap:var(--luzmo-spacing-2);display:flex}.screen-mode-size{color:var(--luzmo-font-color-extra-dimmed)}.footer{justify-content:flex-end;display:flex}.status{justify-content:flex-end;width:0;min-width:100%;display:flex}.status:empty{display:none}.alert{flex:none;inline-size:max-content}.alert-body{align-items:center;gap:var(--luzmo-spacing-3);block-size:1lh;min-inline-size:0;display:flex}.alert-text{min-inline-size:0;font-weight:var(--luzmo-font-weight-semibold);white-space:pre;display:flex}.alert[variant=negative] .alert-text{white-space:normal}.alert-name{min-inline-size:0;font-weight:var(--luzmo-font-weight-bold);text-overflow:ellipsis;white-space:nowrap;unicode-bidi:plaintext;overflow:hidden}.alert-open{flex:none}:host{--add-to-dashboard-picker-width:18rem;--add-to-dashboard-list-max-height:16rem}`,f=`0.1.107`,p=`0.1.0`,m=[`id`,`name`,`contents`,`modified_at`,`is_variant`,`original_id`],h=new Set([`designer`,`owner`]),g=`flag_dashboard_variants`,_=[`desktop`,`tablet`,`mobile`];async function v(e,t,n){let r=[],i=t,a=0;for(let t of e){let e=n-r.length,o=await t(i,Math.max(e,1));e>0&&r.push(...o.rows.slice(0,e)),i=Math.max(0,i-o.count),a+=o.count}return{rows:r,total:a}}async function y(e){let t=await e.fetchApi(`/user`,{action:`get`,version:p,find:{where:{id:`me`},attributes:[`id`,`flags`]}});return{id:t.rows?.[0]?.id??``,flags:t.rows?.[0]?.flags??[]}}async function b(e,t){return(await e.fetchApi(`/authorization`,{action:`get`,version:p,find:{where:{id:t}}})).rows?.[0]}async function x(e,t,n){let r={...t,where:{...t.where,type:`dashboard`}},i=await e.fetchApi(`/securable`,{action:`get`,version:p,find:r},{signal:n});return{rows:i.rows??[],count:i.count??i.rows?.length??0}}function S(e){let t={modifyIds:new Set,useOnlyIds:new Set};for(let n of e?.access?.dashboards??[])n.rights?.Modify?t.modifyIds.add(n.id):n.rights?.Use&&t.useOnlyIds.add(n.id);return t}function C(){return{version:f,syncScreenModes:!0,views:_.map(e=>({screenModus:e,options:{theme:{id:`default`}},filterGroups:[],items:[]})),timezone:{type:`fixed`,id:`UTC`}}}function w(e){return e?{search:{match_types:[`name`,`description`],keyphrase:e,securable_types:[`dashboard`]}}:{}}function T(e,t){return{include:[{model:`User`,as:`allUsers`,attributes:[],required:!0,where:{id:e,...Object.fromEntries(Object.entries(t).map(([e,t])=>[`securableAccessRight.${e}`,t]))}}]}}async function E(e){let t=new r.t({apiUrl:e.apiUrl,authKey:e.authKey,authToken:e.authToken,skipNetworkListeners:!0}),[n,a]=await Promise.all([y(t),b(t,e.authKey)]),o=S(a),s=a?.type!==`embed`||h.has(a.role??``),c=!!n.id&&n.flags.includes(g),u=[...o.modifyIds,...c?o.useOnlyIds:[]],d=u.length>0?{id:{notIn:u}}:{},f=(t,n=!1)=>{let r=[...new Set((t.contents?.views??[]).map(e=>e.screenModus))];return{id:t.id,name:i.t(t.name??{},e.language),syncScreenModes:t.contents?.syncScreenModes!==!1,screenModes:r.length>0?r:[`desktop`],...n?{requiresVariant:n}:{}}},_,E=(e,n)=>async(r,i)=>{if(u.length===0)return{count:0,rows:[]};let a=r>0&&_?.search===e?_.rows:void 0;return a||(a=(await x(t,{where:{is_variant:!1,archived_at:null,id:{in:u}},attributes:m,...w(e)},n)).rows.map(e=>f(e,!o.modifyIds.has(e.id))).sort((e,t)=>e.name.localeCompare(t.name)),_={search:e,rows:a}),{count:a.length,rows:a.slice(r,r+i)}},D=(e,r,i,a)=>async(o,s)=>{let c=await x(t,{where:{is_variant:!1,archived_at:null,...d},attributes:m,...T(n.id,i),...w(e),limit:s,offset:o,order:[[`modified_at`,`desc`]]},r);return{count:c.count,rows:c.rows.map(e=>f(e,a))}},O=async(e,n,r,i)=>{await t.fetchApi(`/securable`,{action:`update`,version:p,id:e,properties:{append_item:{item:n,...r?.length?{screenModes:r}:{}}}},{signal:i})},k=async(e,n,r)=>{try{await O(e.id,n,r)}catch(n){throw await t.fetchApi(`/securable`,{action:`delete`,version:p,id:e.id}).catch(()=>void 0),n}},A=async(e,n)=>await t.fetchApi(`/securable`,{action:`create`,version:p,properties:{...e,type:`dashboard`},associations:n});return{async list(e,t){return n.id?await v([E(e.search,t.signal),...c?[D(e.search,t.signal,{flagUse:!0,flagModify:!1},!0)]:[],D(e.search,t.signal,{flagModify:!0},!1)],e.offset,e.limit):{rows:[],total:0}},async add(e,t,n,r){await O(e.id,t,n.screenModes,r.signal)},...s?{async create(t,n){let r=await A({name:n.name?{[e.language]:n.name}:{},contents:C()});return await k(r,t,void 0),f(r)}}:{},...c?{async listVariants(e,r){return(await x(t,{where:{is_variant:!0,original_id:e.id,archived_at:null},attributes:m,...T(n.id,{flagModify:!0}),order:[[`modified_at`,`desc`]]},r.signal)).rows.map(e=>f(e))}}:{},...c&&s?{async addToVariant(n,r,i){let a=(await x(t,{where:{id:n.id},attributes:[`id`,`name`,`contents`]})).rows[0];if(!a?.contents)throw Error((0,l.msg)(`The dashboard was not found.`,{desc:`Adding the chart to a variant failed because the original dashboard could not be loaded`}));let o=a.name??{},s=await A({name:i.name?{...o,[e.language]:i.name}:o,contents:a.contents},[{role:`original`,id:n.id}]);return await k(s,r,i.screenModes),f({...s,contents:s.contents??a.contents})}}:{}}}function D(e){let{theme:t,...n}=e.options??{};return{...a.o(e),options:n}}function O(e,t){let n=new Set(e),r=e.length+1;for(;n.has(t(r));)r+=1;return r}var k=20,A=300,j=8,M=48,N=`__luzmo-new-dashboard`,P=`__luzmo-new-variant`,F=new Map,I=0,L=class extends n.t(e.n(e.i,{validSizes:Object.values(e.t)})){constructor(...e){super(...e),this.chart=null,this.dashboardActions=null,this.authKey=``,this.authToken=``,this.apiUrl=`https://api.luzmo.com`,this.placement=`bottom-end`,this.disabled=!1,this._open=!1,this._actions=null,this._step=`list`,this._rows=[],this._hasMore=!1,this._loading=!1,this._listFailed=!1,this._original=null,this._variants=[],this._variantsLoading=!1,this._variantsFailed=!1,this._pending=null,this._screenModes=[],this._saving=!1,this._status=null,this._triggerId=`add-to-dashboard-trigger-${++I}`,this._search=``,this._actionsGeneration=0,this._reloadOnUpdate=!1}static get styles(){let e=super.styles??[];return[...Array.isArray(e)?e:[e],(0,s.unsafeCSS)(d)]}get _hasSource(){return!!this.dashboardActions||!!(this.authKey&&this.authToken)}connectedCallback(){super.connectedCallback(),this._status&&this._startFittingAlert()}disconnectedCallback(){super.disconnectedCallback(),this._handleClosed(),this._actionsGeneration+=1,this._saveAbort?.abort(),this._stopFittingAlert()}willUpdate(e){super.willUpdate(e),(e.has(`dashboardActions`)||e.has(`authKey`)||e.has(`authToken`)||e.has(`apiUrl`)||e.has(`language`))&&(this._actions=null,this._actionsGeneration+=1,this._open&&(this._listAbort?.abort(),this._variantsAbort?.abort(),this._step=`list`,this._original=null,this._pending=null,this._rows=[],this._open=this._hasSource,this._reloadOnUpdate=this._hasSource)),e.has(`disabled`)&&this.disabled&&(this._open=!1),e.has(`chart`)&&!this.chart&&this._handleClosed()}updated(e){super.updated(e),this._reloadOnUpdate&&(this._reloadOnUpdate=!1,this._loadList()),e.has(`_step`)&&this._open&&this._focusStep(),e.has(`_status`)&&(this._status?this._startFittingAlert():this._stopFittingAlert())}get _alertContainer(){let e=this.getRootNode();return this.parentElement??(e instanceof ShadowRoot?e.host:null)}_startFittingAlert(){this._fitAlert();let e=this._alertContainer;!this._alertResizeObserver&&e&&(this._alertResizeObserver=new ResizeObserver(()=>this._fitAlert()),this._alertResizeObserver.observe(this),this._alertResizeObserver.observe(e))}_stopFittingAlert(){this._alertResizeObserver?.disconnect(),this._alertResizeObserver=void 0}_fitAlert(){let e=this._noticeElement,t=this._alertContainer;if(!e||!t)return;let n=this.getBoundingClientRect(),r=t.getBoundingClientRect(),i=Number.parseFloat(getComputedStyle(t).paddingInlineStart)||0,a=(this.isLTR?n.right-r.left:r.right-n.left)-i;e.style.setProperty(`--luzmo-notice-max-inline-size`,`${Math.max(0,a)}px`)}async _resolveActions(){if(this.dashboardActions)return this.dashboardActions;let e={apiUrl:this.apiUrl,authKey:this.authKey,authToken:this.authToken,language:this.language},t=JSON.stringify(e),n=F.get(t);return n||(F.clear(),n=E(e),F.set(t,n),n.catch(()=>F.delete(t))),await n}_dispatch(e,t){let n=new CustomEvent(e,{detail:t,bubbles:!0,composed:!0});this.dispatchEvent(n)}_displayName(e){return e.name.trim()||(0,l.msg)(`Untitled dashboard`,{desc:`Fallback name of a dashboard without a name`})}_variantName(e,t){let n=this._displayName(e);return(0,l.msg)(l.str`${n} (variant ${t})`,{desc:`Name of a new dashboard variant`})}_screenModeChoices(){return[{name:`mobile`,label:(0,l.msg)(`Smartphone`,{desc:`Screen mode name`}),size:`< 768px`,icon:o.luzmoMobile},{name:`tablet`,label:(0,l.msg)(`Tablet`,{desc:`Screen mode name`}),size:`≥ 768px`,icon:o.luzmoTablet},{name:`desktop`,label:(0,l.msg)(`Desktop`,{desc:`Screen mode name`}),size:`≥ 1200px`,icon:o.luzmoLaptop},{name:`largeScreen`,label:(0,l.msg)(`Large screen`,{desc:`Screen mode name`}),size:`≥ 1600px`,icon:o.luzmoDesktop},{name:`fixed`,label:(0,l.msg)(`Fixed width`,{desc:`Screen mode name`}),icon:o.luzmoArrowsHorizontal}]}async _handleOpened(e){e.target===e.currentTarget&&(this._open=!0,this._step=`list`,this._search=``,this._original=null,this._pending=null,this._rows=[],await this.updateComplete,this._searchElement?.focus(),await this._loadList())}async _loadList(){let e=this._actionsGeneration;this._loading=!0,this._listFailed=!1;try{let t=this._actions??await this._resolveActions();if(e!==this._actionsGeneration)return;this._actions=t}catch(t){if(!this.isConnected||e!==this._actionsGeneration)return;console.error(`Failed to resolve the add to dashboard actions:`,t),this._loading=!1,this._listFailed=!0;return}this.isConnected&&this._open&&await this._loadPage(!1)}_handleClosed(e){e&&e.target!==e.currentTarget||(this._open=!1,clearTimeout(this._searchTimer),this._listAbort?.abort(),this._variantsAbort?.abort())}async _loadPage(e){let t=this._actions;if(!t)return;this._listAbort?.abort();let n=new AbortController;this._listAbort=n,this._loading=!0,this._listFailed=!1,e||(this._rows=[]);try{let e=await t.list({search:this._search,offset:this._rows.length,limit:k},{signal:n.signal});if(n.signal.aborted)return;this._rows=[...this._rows,...e.rows],this._hasMore=e.total===void 0?e.rows.length===k:this._rows.length<e.total}catch(e){if(n.signal.aborted)return;console.error(`Failed to load dashboards:`,e),this._listFailed=!0}finally{n.signal.aborted||(this._loading=!1)}}_handleSearchInput(e){this._search=String(e.target?.value??``),clearTimeout(this._searchTimer),this._searchTimer=setTimeout(()=>void this._loadPage(!1),A)}_handleListScroll(e){let t=e.target;this._hasMore&&!this._loading&&t.scrollHeight-t.scrollTop-t.clientHeight<=M&&this._loadPage(!0)}_menuValue(e){return e.stopPropagation(),e.target.value??``}_handleListChange(e){let t=this._menuValue(e);if(t===N){this._actions?.create&&this._save({kind:`create`});return}let n=this._rows.find(e=>e.id===t);n&&(n.requiresVariant?(this._original=n,this._step=`variants`,this._loadVariants()):this._selectTarget({kind:`add`,dashboard:n,isVariant:!1},n))}_handleVariantChange(e){let t=this._menuValue(e),n=this._original;if(!n)return;if(t===P){if(!this._actions?.addToVariant)return;let e=this._variants.map(e=>this._displayName(e)),t=this._variantName(n,O(e,e=>this._variantName(n,e)));this._selectTarget({kind:`variant`,original:n,name:t},n);return}let r=this._variants.find(e=>e.id===t);r&&this._selectTarget({kind:`add`,dashboard:r,isVariant:!0},r)}_selectTarget(e,t){t.syncScreenModes!==!1||!t.screenModes?.length?this._save(e):(this._pending=e,this._screenModes=[...t.screenModes??[]],this._step=`screenModes`)}async _loadVariants(){let e=this._actions,t=this._original;if(this._variantsAbort?.abort(),this._variants=[],this._variantsLoading=!1,this._variantsFailed=!1,!e?.listVariants||!t)return;let n=new AbortController;this._variantsAbort=n,this._variantsLoading=!0;try{let r=await e.listVariants(t,{signal:n.signal});n.signal.aborted||(this._variants=r)}catch(e){n.signal.aborted||(console.error(`Failed to load dashboard variants:`,e),this._variantsFailed=!0)}finally{n.signal.aborted||(this._variantsLoading=!1)}}_handleBack(){this._step===`screenModes`&&this._original?this._step=`variants`:(this._step=`list`,this._original=null),this._pending=null}_toggleScreenMode(e){this._screenModes=this._screenModes.includes(e)?this._screenModes.filter(t=>t!==e):[...this._screenModes,e]}_handleConfirmScreenModes(){this._pending&&this._screenModes.length>0&&this._save(this._pending,{screenModes:[...this._screenModes]})}async _save(e,t={}){let n=this._actions;if(!n||!this.chart||this._saving)return;this._open=!1,this._saving=!0,this._setStatus(null),this._saveAbort=new AbortController;let r=D(this.chart),i={signal:this._saveAbort.signal};try{let a;if(e.kind===`create`&&n.create)a=await n.create(r,t,i);else if(e.kind===`variant`&&n.addToVariant)a=await n.addToVariant(e.original,r,{...t,name:e.name},i);else if(e.kind===`add`)a=await n.add(e.dashboard,r,t,i)||e.dashboard;else return;if(i.signal.aborted)return;this._setStatus({kind:`success`,dashboard:a,isVariant:e.kind===`variant`||e.kind===`add`&&e.isVariant,openDashboard:n.openDashboard?.bind(n)}),this._dispatch(`luzmo-chart-added`,{dashboard:a})}catch(e){if(i.signal.aborted)return;console.error(`Failed to add the chart to a dashboard:`,e),this._setStatus({kind:`error`,message:e instanceof Error&&e.message?e.message:void 0}),this._dispatch(`luzmo-chart-add-failed`,{error:e})}finally{this._saving=!1}await this.updateComplete,this.isConnected&&this._isFocusLost()&&this._focusTrigger()}_setStatus(e){this._status=e}_focusTrigger(){this._triggerElement?.focus()}_isFocusLost(){return!document.activeElement||document.activeElement===document.body}async _handleNoticeClose(e){e.stopPropagation();let t=e.currentTarget.matches(`:focus-within`);this._setStatus(null),await this.updateComplete,t&&this._isFocusLost()&&this._focusTrigger()}async _focusStep(){let e=this._step===`list`?this._searchElement:this._backElement;await e?.updateComplete,e?.focus()}_renderRow(e){return s.html`
20
+ require("./tokens-BWMfo_w4.cjs");const e=require("./base-CGDNY_7v.cjs"),t=require("./decorate-DCJt-2rt.cjs"),n=require("./localized-mixin-EoNvtTBG.cjs"),r=require("./data-broker-DCghLjhq.cjs"),i=require("./localize-D3i4Epy_.cjs"),a=require("./chart-helpers-fMnqHRzC.cjs");let o=require("@luzmo/icons");require("@luzmo/lucero/action-button"),require("@luzmo/lucero/button"),require("@luzmo/lucero/icon"),require("@luzmo/lucero/overlay"),require("@luzmo/lucero/popover"),require("@luzmo/lucero/tooltip");let s=require("lit"),c=require("lit/decorators.js"),l=require("@lit/localize");require("@luzmo/lucero/progress-circle"),require("@luzmo/lucero/checkbox"),require("@luzmo/lucero/divider"),require("@luzmo/lucero/field-group"),require("@luzmo/lucero/menu"),require("@luzmo/lucero/notice"),require("@luzmo/lucero/search");let u=require("lit/directives/if-defined.js");var d=`:host{align-items:flex-end;gap:var(--luzmo-spacing-2);font-family:var(--luzmo-font-family);flex-direction:column;display:inline-flex}.trigger-spinner{--luzmo-progress-circle-size:var(--luzmo-icon-size-xs)}.trigger-chevron{margin-inline-start:var(--luzmo-spacing-1)}.picker{gap:var(--luzmo-spacing-3);width:var(--luzmo-add-to-dashboard-picker-width,var(--add-to-dashboard-picker-width));max-width:90vw;padding:var(--luzmo-spacing-2);color:var(--luzmo-font-color);font-size:var(--luzmo-font-size-s);flex-direction:column;display:flex}luzmo-search{width:100%}.list{max-height:var(--luzmo-add-to-dashboard-list-max-height,var(--add-to-dashboard-list-max-height));flex-direction:column;display:flex;overflow-y:auto}.menu{--luzmo-menu-max-height:none;flex:none;width:100%;overflow:visible}.create-row{--luzmo-menu-item-label-icon-color-default:var(--luzmo-primary)}.thumbnail{object-fit:cover;border:var(--luzmo-border-width) solid var(--luzmo-border-color);border-radius:var(--luzmo-border-radius);width:2.75rem;height:2rem}.drill-in{color:var(--luzmo-font-color-extra-dimmed)}.header{align-items:center;gap:var(--luzmo-spacing-2);display:flex}.header-title{font-weight:var(--luzmo-font-weight-bold);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.empty{align-items:center;gap:var(--luzmo-spacing-3);padding:var(--luzmo-spacing-4);text-align:center;flex-direction:column;display:flex}.loading{padding:var(--luzmo-spacing-3);justify-content:center;display:flex}.screen-modes{gap:var(--luzmo-spacing-2);flex-direction:column;display:flex}.screen-mode{align-items:center;gap:var(--luzmo-spacing-2);display:flex}.screen-mode-size{color:var(--luzmo-font-color-extra-dimmed)}.footer{justify-content:flex-end;display:flex}.status{justify-content:flex-end;width:0;min-width:100%;display:flex}.status:empty{display:none}.alert{flex:none;inline-size:max-content}.alert-body{align-items:center;gap:var(--luzmo-spacing-3);block-size:1lh;min-inline-size:0;display:flex}.alert-text{min-inline-size:0;font-weight:var(--luzmo-font-weight-semibold);white-space:pre;display:flex}.alert[variant=negative] .alert-text{white-space:normal}.alert-name{min-inline-size:0;font-weight:var(--luzmo-font-weight-bold);text-overflow:ellipsis;white-space:nowrap;unicode-bidi:plaintext;overflow:hidden}.alert-open{flex:none}:host{--add-to-dashboard-picker-width:18rem;--add-to-dashboard-list-max-height:16rem}`,f=`0.1.107`,p=`0.1.0`,m=[`id`,`name`,`contents`,`modified_at`,`is_variant`,`original_id`],h=new Set([`designer`,`owner`]),g=`flag_dashboard_variants`,_=[`desktop`,`tablet`,`mobile`];async function v(e,t,n){let r=[],i=t,a=0;for(let t of e){let e=n-r.length,o=await t(i,Math.max(e,1));e>0&&r.push(...o.rows.slice(0,e)),i=Math.max(0,i-o.count),a+=o.count}return{rows:r,total:a}}async function y(e){let t=await e.fetchApi(`/user`,{action:`get`,version:p,find:{where:{id:`me`},attributes:[`id`,`flags`]}});return{id:t.rows?.[0]?.id??``,flags:t.rows?.[0]?.flags??[]}}async function b(e,t){return(await e.fetchApi(`/authorization`,{action:`get`,version:p,find:{where:{id:t}}})).rows?.[0]}async function x(e,t,n){let r={...t,where:{...t.where,type:`dashboard`}},i=await e.fetchApi(`/securable`,{action:`get`,version:p,find:r},{signal:n});return{rows:i.rows??[],count:i.count??i.rows?.length??0}}function S(e){let t={modifyIds:new Set,useOnlyIds:new Set};for(let n of e?.access?.dashboards??[])n.rights?.Modify?t.modifyIds.add(n.id):n.rights?.Use&&t.useOnlyIds.add(n.id);return t}function C(){return{version:f,syncScreenModes:!0,views:_.map(e=>({screenModus:e,options:{theme:{id:`default`}},filterGroups:[],items:[]})),timezone:{type:`fixed`,id:`UTC`}}}function w(e){return e?{search:{match_types:[`name`,`description`],keyphrase:e,securable_types:[`dashboard`]}}:{}}function T(e,t){return{include:[{model:`User`,as:`allUsers`,attributes:[],required:!0,where:{id:e,...Object.fromEntries(Object.entries(t).map(([e,t])=>[`securableAccessRight.${e}`,t]))}}]}}async function E(e){let t=new r.t({apiUrl:e.apiUrl,authKey:e.authKey,authToken:e.authToken,skipNetworkListeners:!0}),[n,a]=await Promise.all([y(t),b(t,e.authKey)]),o=S(a),s=a?.type!==`embed`||h.has(a.role??``),c=!!n.id&&n.flags.includes(g),u=[...o.modifyIds,...c?o.useOnlyIds:[]],d=u.length>0?{id:{notIn:u}}:{},f=(t,n=!1)=>{let r=[...new Set((t.contents?.views??[]).map(e=>e.screenModus))];return{id:t.id,name:i.t(t.name??{},e.language),syncScreenModes:t.contents?.syncScreenModes!==!1,screenModes:r.length>0?r:[`desktop`],...n?{requiresVariant:n}:{}}},_,E=(e,n)=>async(r,i)=>{if(u.length===0)return{count:0,rows:[]};let a=r>0&&_?.search===e?_.rows:void 0;return a||(a=(await x(t,{where:{is_variant:!1,archived_at:null,id:{in:u}},attributes:m,...w(e)},n)).rows.map(e=>f(e,!o.modifyIds.has(e.id))).sort((e,t)=>e.name.localeCompare(t.name)),_={search:e,rows:a}),{count:a.length,rows:a.slice(r,r+i)}},D=(e,r,i,a)=>async(o,s)=>{let c=await x(t,{where:{is_variant:!1,archived_at:null,...d},attributes:m,...T(n.id,i),...w(e),limit:s,offset:o,order:[[`modified_at`,`desc`]]},r);return{count:c.count,rows:c.rows.map(e=>f(e,a))}},O=async(e,n,r,i)=>{await t.fetchApi(`/securable`,{action:`update`,version:p,id:e,properties:{append_item:{item:n,...r?.length?{screenModes:r}:{}}}},{signal:i})},k=async(e,n,r)=>{try{await O(e.id,n,r)}catch(n){throw await t.fetchApi(`/securable`,{action:`delete`,version:p,id:e.id}).catch(()=>void 0),n}},A=async(e,n)=>await t.fetchApi(`/securable`,{action:`create`,version:p,properties:{...e,type:`dashboard`},associations:n});return{async list(e,t){return n.id?await v([E(e.search,t.signal),...c?[D(e.search,t.signal,{flagUse:!0,flagModify:!1},!0)]:[],D(e.search,t.signal,{flagModify:!0},!1)],e.offset,e.limit):{rows:[],total:0}},async add(e,t,n,r){await O(e.id,t,n.screenModes,r.signal)},...s?{async create(t,n){let r=await A({name:n.name?{[e.language]:n.name}:{},contents:C()});return await k(r,t,void 0),f(r)}}:{},...c?{async listVariants(e,r){return(await x(t,{where:{is_variant:!0,original_id:e.id,archived_at:null},attributes:m,...T(n.id,{flagModify:!0}),order:[[`modified_at`,`desc`]]},r.signal)).rows.map(e=>f(e))}}:{},...c&&s?{async addToVariant(n,r,i){let a=(await x(t,{where:{id:n.id},attributes:[`id`,`name`,`contents`]})).rows[0];if(!a?.contents)throw Error((0,l.msg)(`The dashboard was not found.`,{desc:`Adding the chart to a variant failed because the original dashboard could not be loaded`}));let o=a.name??{},s=await A({name:i.name?{...o,[e.language]:i.name}:o,contents:a.contents},[{role:`original`,id:n.id}]);return await k(s,r,i.screenModes),f({...s,contents:s.contents??a.contents})}}:{}}}function D(e){let{theme:t,...n}=e.options??{};return{...a.o(e),options:n}}function O(e,t){let n=new Set(e),r=e.length+1;for(;n.has(t(r));)r+=1;return r}var k=20,A=300,j=8,M=48,N=`__luzmo-new-dashboard`,P=`__luzmo-new-variant`,F=new Map,I=0,L=class extends n.t(e.n(e.i,{validSizes:Object.values(e.t)})){constructor(...e){super(...e),this.chart=null,this.dashboardActions=null,this.authKey=``,this.authToken=``,this.apiUrl=`https://api.luzmo.com`,this.placement=`bottom-end`,this.disabled=!1,this._open=!1,this._actions=null,this._step=`list`,this._rows=[],this._hasMore=!1,this._loading=!1,this._listFailed=!1,this._original=null,this._variants=[],this._variantsLoading=!1,this._variantsFailed=!1,this._pending=null,this._screenModes=[],this._saving=!1,this._status=null,this._triggerId=`add-to-dashboard-trigger-${++I}`,this._search=``,this._actionsGeneration=0,this._reloadOnUpdate=!1}static get styles(){let e=super.styles??[];return[...Array.isArray(e)?e:[e],(0,s.unsafeCSS)(d)]}get _hasSource(){return!!this.dashboardActions||!!(this.authKey&&this.authToken)}connectedCallback(){super.connectedCallback(),this._status&&this._startFittingAlert()}disconnectedCallback(){super.disconnectedCallback(),this._handleClosed(),this._actionsGeneration+=1,this._saveAbort?.abort(),this._stopFittingAlert()}willUpdate(e){super.willUpdate(e),(e.has(`dashboardActions`)||e.has(`authKey`)||e.has(`authToken`)||e.has(`apiUrl`)||e.has(`language`))&&(this._actions=null,this._actionsGeneration+=1,this._open&&(this._listAbort?.abort(),this._variantsAbort?.abort(),this._step=`list`,this._original=null,this._pending=null,this._rows=[],this._open=this._hasSource,this._reloadOnUpdate=this._hasSource)),e.has(`disabled`)&&this.disabled&&(this._open=!1),e.has(`chart`)&&!this.chart&&this._handleClosed()}updated(e){super.updated(e),this._reloadOnUpdate&&(this._reloadOnUpdate=!1,this._loadList()),e.has(`_step`)&&this._open&&this._focusStep(),e.has(`_status`)&&(this._status?this._startFittingAlert():this._stopFittingAlert())}get _alertContainer(){let e=this.getRootNode();return this.parentElement??(e instanceof ShadowRoot?e.host:null)}_startFittingAlert(){this._fitAlert();let e=this._alertContainer;!this._alertResizeObserver&&e&&(this._alertResizeObserver=new ResizeObserver(()=>this._fitAlert()),this._alertResizeObserver.observe(this),this._alertResizeObserver.observe(e))}_stopFittingAlert(){this._alertResizeObserver?.disconnect(),this._alertResizeObserver=void 0}_fitAlert(){let e=this._noticeElement,t=this._alertContainer;if(!e||!t)return;let n=this.getBoundingClientRect(),r=t.getBoundingClientRect(),i=Number.parseFloat(getComputedStyle(t).paddingInlineStart)||0,a=(this.isLTR?n.right-r.left:r.right-n.left)-i;e.style.setProperty(`--luzmo-notice-max-inline-size`,`${Math.max(0,a)}px`)}async _resolveActions(){if(this.dashboardActions)return this.dashboardActions;let e={apiUrl:this.apiUrl,authKey:this.authKey,authToken:this.authToken,language:this.language},t=JSON.stringify(e),n=F.get(t);return n||(F.clear(),n=E(e),F.set(t,n),n.catch(()=>F.delete(t))),await n}_dispatch(e,t){let n=new CustomEvent(e,{detail:t,bubbles:!0,composed:!0});this.dispatchEvent(n)}_displayName(e){return e.name.trim()||(0,l.msg)(`Untitled dashboard`,{desc:`Fallback name of a dashboard without a name`})}_variantName(e,t){let n=this._displayName(e);return(0,l.msg)(l.str`${n} (variant ${t})`,{desc:`Name of a new dashboard variant`})}_screenModeChoices(){return[{name:`mobile`,label:(0,l.msg)(`Smartphone`,{desc:`Screen mode name`}),size:`< 768px`,icon:o.luzmoMobile},{name:`tablet`,label:(0,l.msg)(`Tablet`,{desc:`Screen mode name`}),size:`≥ 768px`,icon:o.luzmoTablet},{name:`desktop`,label:(0,l.msg)(`Desktop`,{desc:`Screen mode name`}),size:`≥ 1200px`,icon:o.luzmoLaptop},{name:`largeScreen`,label:(0,l.msg)(`Large screen`,{desc:`Screen mode name`}),size:`≥ 1600px`,icon:o.luzmoDesktop},{name:`fixed`,label:(0,l.msg)(`Fixed width`,{desc:`Screen mode name`}),icon:o.luzmoArrowsHorizontal}]}async _handleOpened(e){e.target===e.currentTarget&&(this._open=!0,this._step=`list`,this._search=``,this._original=null,this._pending=null,this._rows=[],await this.updateComplete,this._searchElement?.focus(),await this._loadList())}async _loadList(){let e=this._actionsGeneration;this._loading=!0,this._listFailed=!1;try{let t=this._actions??await this._resolveActions();if(e!==this._actionsGeneration)return;this._actions=t}catch(t){if(!this.isConnected||e!==this._actionsGeneration)return;console.error(`Failed to resolve the add to dashboard actions:`,t),this._loading=!1,this._listFailed=!0;return}this.isConnected&&this._open&&await this._loadPage(!1)}_handleClosed(e){e&&e.target!==e.currentTarget||(this._open=!1,clearTimeout(this._searchTimer),this._listAbort?.abort(),this._variantsAbort?.abort())}async _loadPage(e){let t=this._actions;if(!t)return;this._listAbort?.abort();let n=new AbortController;this._listAbort=n,this._loading=!0,this._listFailed=!1,e||(this._rows=[]);try{let e=await t.list({search:this._search,offset:this._rows.length,limit:k},{signal:n.signal});if(n.signal.aborted)return;this._rows=[...this._rows,...e.rows],this._hasMore=e.total===void 0?e.rows.length===k:this._rows.length<e.total}catch(e){if(n.signal.aborted)return;console.error(`Failed to load dashboards:`,e),this._listFailed=!0}finally{n.signal.aborted||(this._loading=!1)}}_handleSearchInput(e){this._search=String(e.target?.value??``),clearTimeout(this._searchTimer),this._searchTimer=setTimeout(()=>void this._loadPage(!1),A)}_handleListScroll(e){let t=e.target;this._hasMore&&!this._loading&&t.scrollHeight-t.scrollTop-t.clientHeight<=M&&this._loadPage(!0)}_menuValue(e){return e.stopPropagation(),e.target.value??``}_handleListChange(e){let t=this._menuValue(e);if(t===N){this._actions?.create&&this._save({kind:`create`});return}let n=this._rows.find(e=>e.id===t);n&&(n.requiresVariant?(this._original=n,this._step=`variants`,this._loadVariants()):this._selectTarget({kind:`add`,dashboard:n,isVariant:!1},n))}_handleVariantChange(e){let t=this._menuValue(e),n=this._original;if(!n)return;if(t===P){if(!this._actions?.addToVariant)return;let e=this._variants.map(e=>this._displayName(e)),t=this._variantName(n,O(e,e=>this._variantName(n,e)));this._selectTarget({kind:`variant`,original:n,name:t},n);return}let r=this._variants.find(e=>e.id===t);r&&this._selectTarget({kind:`add`,dashboard:r,isVariant:!0},r)}_selectTarget(e,t){t.syncScreenModes!==!1||!t.screenModes?.length?this._save(e):(this._pending=e,this._screenModes=[...t.screenModes??[]],this._step=`screenModes`)}async _loadVariants(){let e=this._actions,t=this._original;if(this._variantsAbort?.abort(),this._variants=[],this._variantsLoading=!1,this._variantsFailed=!1,!e?.listVariants||!t)return;let n=new AbortController;this._variantsAbort=n,this._variantsLoading=!0;try{let r=await e.listVariants(t,{signal:n.signal});n.signal.aborted||(this._variants=r)}catch(e){n.signal.aborted||(console.error(`Failed to load dashboard variants:`,e),this._variantsFailed=!0)}finally{n.signal.aborted||(this._variantsLoading=!1)}}_handleBack(){this._step===`screenModes`&&this._original?this._step=`variants`:(this._step=`list`,this._original=null),this._pending=null}_toggleScreenMode(e){this._screenModes=this._screenModes.includes(e)?this._screenModes.filter(t=>t!==e):[...this._screenModes,e]}_handleConfirmScreenModes(){this._pending&&this._screenModes.length>0&&this._save(this._pending,{screenModes:[...this._screenModes]})}async _save(e,t={}){let n=this._actions;if(!n||!this.chart||this._saving)return;this._open=!1,this._saving=!0,this._setStatus(null),this._saveAbort=new AbortController;let r=D(this.chart),i={signal:this._saveAbort.signal};try{let a;if(e.kind===`create`&&n.create)a=await n.create(r,t,i);else if(e.kind===`variant`&&n.addToVariant)a=await n.addToVariant(e.original,r,{...t,name:e.name},i);else if(e.kind===`add`)a=await n.add(e.dashboard,r,t,i)||e.dashboard;else return;if(i.signal.aborted)return;this._setStatus({kind:`success`,dashboard:a,isVariant:e.kind===`variant`||e.kind===`add`&&e.isVariant,openDashboard:n.openDashboard?.bind(n)}),this._dispatch(`luzmo-chart-added`,{dashboard:a})}catch(e){if(i.signal.aborted)return;console.error(`Failed to add the chart to a dashboard:`,e),this._setStatus({kind:`error`,message:e instanceof Error&&e.message?e.message:void 0}),this._dispatch(`luzmo-chart-add-failed`,{error:e})}finally{this._saving=!1}await this.updateComplete,this.isConnected&&this._isFocusLost()&&this._focusTrigger()}_setStatus(e){this._status=e}_focusTrigger(){this._triggerElement?.focus()}_isFocusLost(){return!document.activeElement||document.activeElement===document.body}async _handleNoticeClose(e){e.stopPropagation();let t=e.currentTarget.matches(`:focus-within`);this._setStatus(null),await this.updateComplete,t&&this._isFocusLost()&&this._focusTrigger()}async _focusStep(){let e=this._step===`list`?this._searchElement:this._backElement;await e?.updateComplete,e?.focus()}_renderRow(e){return s.html`
21
21
  <luzmo-menu-item value=${e.id} no-wrap ?disabled=${this._saving}>
22
22
  ${e.thumbnailUrl?s.html`<img slot="icon" class="thumbnail" alt="" src=${e.thumbnailUrl} />`:s.nothing}
23
23
  ${this._displayName(e)}
@@ -23,7 +23,7 @@ import { t as r } from "./decorate-B2TzfnLZ.js";
23
23
  import { t as i } from "./localized-mixin-FPDNaZhb.js";
24
24
  import { t as a } from "./data-broker-C1Iz71TN.js";
25
25
  import { t as o } from "./localize-BNystXyK.js";
26
- import { o as s } from "./chart-helpers-Dng_LGfq.js";
26
+ import { o as s } from "./chart-helpers-Cbl3sRra.js";
27
27
  import { luzmoAlertOutline as c, luzmoAngleDown as l, luzmoAngleLeft as u, luzmoAngleRight as d, luzmoArrowLeft as f, luzmoArrowRight as p, luzmoArrowsHorizontal as m, luzmoCheckCircleOutline as h, luzmoDesktop as g, luzmoLaptop as _, luzmoLink as v, luzmoMobile as ee, luzmoPlus as y, luzmoTablet as te } from "@luzmo/icons";
28
28
  import "@luzmo/lucero/action-button";
29
29
  import "@luzmo/lucero/button";
@@ -17,4 +17,4 @@
17
17
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
18
  * SOFTWARE.
19
19
  * */
20
- const e=require("./rolldown-runtime-DbbDpzbe.cjs"),t=require("./v4-Dyp-SQ1c.cjs");let n=require("yjs");n=e.r(n,1);var r;function i(){return t.t()}var a={mergeInterval:300,maxUndoSteps:100},o=class e{constructor(e={},t){if(this.stateSubscribers=new Set,this.changeSubscribers=new Set,this.localUpdatesSubscribers=new Set,this.isDestroyed=!1,this.id=t??i(),this.config={...a,...e},this.doc=new n.Doc,this.config.peerId){let e=(this.config.peerId,Number(this.config.peerId));this.doc.clientID=e}this.setupChangeSubscription()}setupUndoManager(t){this.undoManager&&this.undoManager.destroy(),this.undoManager=new n.UndoManager(t,{captureTimeout:this.config.mergeInterval,trackedOrigins:new Set([e.LOCAL_ORIGIN])})}setupChangeSubscription(){this.doc.on(`update`,(t,n)=>{for(let e of this.changeSubscribers)try{e({update:t,origin:n})}catch(e){console.error(`Error in change subscriber:`,e)}if(this.notifyStateSubscribers(),n===e.LOCAL_ORIGIN)for(let e of this.localUpdatesSubscribers)try{e(t)}catch(e){console.error(`Error in local updates subscriber:`,e)}})}notifyStateSubscribers(){if(this.isDestroyed)return;let e=this.getState();for(let t of this.stateSubscribers)try{t(e)}catch(e){console.error(`Error in state subscriber:`,e)}}undo(){return this.canUndo()?(this.undoManager.undo(),this.notifyStateSubscribers(),!0):!1}redo(){return this.canRedo()?(this.undoManager.redo(),this.notifyStateSubscribers(),!0):!1}canUndo(){return this.undoManager.undoStack.length>0}canRedo(){return this.undoManager.redoStack.length>0}clearHistory(){this.undoManager.clear()}subscribe(e,t){let{fireImmediately:n=!0}=t??{};return this.stateSubscribers.add(e),n&&queueMicrotask(()=>{if(!this.isDestroyed&&this.stateSubscribers.has(e))try{e(this.getState())}catch(e){console.error(`Error in initial state callback:`,e)}}),()=>{this.stateSubscribers.delete(e)}}subscribeToChanges(e){return this.changeSubscribers.add(e),()=>{this.changeSubscribers.delete(e)}}exportUpdates(e){return e?n.encodeStateAsUpdate(this.doc,e):n.encodeStateAsUpdate(this.doc)}importUpdates(e){n.applyUpdate(this.doc,e)}subscribeLocalUpdates(e){return this.localUpdatesSubscribers.add(e),()=>{this.localUpdatesSubscribers.delete(e)}}exportSnapshot(){return n.encodeStateAsUpdate(this.doc)}importSnapshot(e){n.applyUpdate(this.doc,e),this.notifyStateSubscribers()}getVersion(){return n.encodeStateVector(this.doc)}commit(e){}reset(e){if(this.doc.destroy(),this.doc=new n.Doc,this.config.peerId){let e=(this.config.peerId,Number(this.config.peerId));this.doc.clientID=e}this.setupChangeSubscription(),this.initializeContainers(e),this.undoManager.clear(),this.notifyStateSubscribers()}destroy(){this.isDestroyed=!0,this.stateSubscribers.clear(),this.changeSubscribers.clear(),this.localUpdatesSubscribers.clear(),this.undoManager&&this.undoManager.destroy(),this.doc.destroy()}getDoc(){return this.doc}getPeerId(){return this.doc.clientID.toString()}clone(e){return structuredClone(e)}transact(t){return this.doc.transact(t,e.LOCAL_ORIGIN)}};r=o,r.LOCAL_ORIGIN=`local`,Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return o}});
20
+ const e=require("./rolldown-runtime-DbbDpzbe.cjs"),t=require("./v4-Dyp-SQ1c.cjs");let n=require("yjs");n=e.r(n,1);var r;function i(){return t.t()}var a={mergeInterval:300,maxUndoSteps:100},o=class e{constructor(e={},t){if(this.stateSubscribers=new Set,this.changeSubscribers=new Set,this.localUpdatesSubscribers=new Set,this.isDestroyed=!1,this.id=t??i(),this.config={...a,...e},this.doc=new n.Doc,this.config.peerId){let e=(this.config.peerId,Number(this.config.peerId));this.doc.clientID=e}this.setupChangeSubscription()}setupUndoManager(t){this.undoManager&&this.undoManager.destroy(),this.undoManager=new n.UndoManager(t,{captureTimeout:this.config.mergeInterval,trackedOrigins:new Set([e.LOCAL_ORIGIN])})}setupChangeSubscription(){this.doc.on(`update`,(t,n)=>{for(let e of this.changeSubscribers)try{e({update:t,origin:n})}catch(e){console.error(`Error in change subscriber:`,e)}if(this.notifyStateSubscribers(),n===e.LOCAL_ORIGIN)for(let e of this.localUpdatesSubscribers)try{e(t)}catch(e){console.error(`Error in local updates subscriber:`,e)}})}notifyStateSubscribers(){if(this.isDestroyed)return;let e=this.getState();for(let t of this.stateSubscribers)try{t(e)}catch(e){console.error(`Error in state subscriber:`,e)}}undo(){return this.canUndo()?(this.undoManager.undo(),this.notifyStateSubscribers(),!0):!1}redo(){return this.canRedo()?(this.undoManager.redo(),this.notifyStateSubscribers(),!0):!1}canUndo(){return this.undoManager.undoStack.length>0}canRedo(){return this.undoManager.redoStack.length>0}clearHistory(){this.undoManager.clear()}subscribe(e,t){let{fireImmediately:n=!0}=t??{};return this.stateSubscribers.add(e),n&&queueMicrotask(()=>{if(!this.isDestroyed&&this.stateSubscribers.has(e))try{e(this.getState())}catch(e){console.error(`Error in initial state callback:`,e)}}),()=>{this.stateSubscribers.delete(e)}}subscribeToChanges(e){return this.changeSubscribers.add(e),()=>{this.changeSubscribers.delete(e)}}exportUpdates(e){return e?n.encodeStateAsUpdate(this.doc,e):n.encodeStateAsUpdate(this.doc)}importUpdates(e){n.applyUpdate(this.doc,e)}subscribeLocalUpdates(e){return this.localUpdatesSubscribers.add(e),()=>{this.localUpdatesSubscribers.delete(e)}}exportSnapshot(){return n.encodeStateAsUpdate(this.doc)}importSnapshot(e){n.applyUpdate(this.doc,e),this.notifyStateSubscribers()}getVersion(){return n.encodeStateVector(this.doc)}commit(e){}reset(e){if(this.doc.destroy(),this.doc=new n.Doc,this.config.peerId){let e=(this.config.peerId,Number(this.config.peerId));this.doc.clientID=e}this.setupChangeSubscription(),this.initializeContainers(e),this.undoManager.clear(),this.notifyStateSubscribers()}destroy(){this.isDestroyed=!0,this.stateSubscribers.clear(),this.changeSubscribers.clear(),this.localUpdatesSubscribers.clear(),this.undoManager&&this.undoManager.destroy(),this.doc.destroy()}getDoc(){return this.doc}getPeerId(){return this.doc.clientID.toString()}clone(e){return structuredClone(e)}transact(t){return this.doc.transact(t,e.LOCAL_ORIGIN)}transactHistoryStep(e){return this.undoManager.stopCapturing(),this.doc.once(`afterTransactionCleanup`,()=>this.undoManager.stopCapturing()),this.transact(e)}};r=o,r.LOCAL_ORIGIN=`local`,Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return o}});
@@ -145,6 +145,9 @@ var i = {
145
145
  transact(t) {
146
146
  return this.doc.transact(t, e.LOCAL_ORIGIN);
147
147
  }
148
+ transactHistoryStep(e) {
149
+ return this.undoManager.stopCapturing(), this.doc.once("afterTransactionCleanup", () => this.undoManager.stopCapturing()), this.transact(e);
150
+ }
148
151
  };
149
152
  n = a, n.LOCAL_ORIGIN = "local";
150
153
  export { a as t };
@@ -61,7 +61,8 @@ function l(e) {
61
61
  ...e,
62
62
  content: i(e.content) ? e.content.map((e) => o(e)) : []
63
63
  })),
64
- filters: e.filters
64
+ filters: e.filters,
65
+ inlineData: e.inlineData
65
66
  };
66
67
  }
67
68
  function u(e, t) {
@@ -88,7 +89,7 @@ function f(r) {
88
89
  case "area-chart":
89
90
  case "bar-chart":
90
91
  case "column-chart":
91
- if (i.push({
92
+ if (r.inlineData || i.push({
92
93
  type: "rankingPicker",
93
94
  mutationType: "rankAndSort",
94
95
  ranking: a.ranking ?? {
@@ -0,0 +1,20 @@
1
+ /*! * A kit of modern Luzmo Web Components for analytics in your web application.
2
+ *
3
+ * Copyright © 2026 Luzmo
4
+ * All rights reserved.
5
+ * Luzmo web components (“Luzmo Web Components”)
6
+ * must be used according to the Luzmo Terms of Service.
7
+ * This license allows users with a current active Luzmo account
8
+ * to use the Luzmo Web Components. This license terminates
9
+ * automatically if a user no longer has an active Luzmo account.
10
+ * Please view the Luzmo Terms of Service at: https://www.luzmo.com/information-pages/terms-of-use.
11
+ *
12
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
+ * SOFTWARE.
19
+ * */
20
+ var e=function(e){return e.Top=`top`,e.Bottom=`bottom`,e}({}),t=function(e){return e.Asc=`asc`,e.Desc=`desc`,e}({}),n=function(e){return e.Measure=`measure`,e.Category=`category`,e}({}),r=5,i=Array.isArray;function a(e){return typeof e==`string`}function o(e){let t={...e};return!t.datasetId&&t.set&&(t.datasetId=t.set),!t.set&&t.datasetId&&(t.set=t.datasetId),!t.columnId&&t.column&&(t.columnId=t.column),!t.column&&t.columnId&&(t.column=t.columnId),!t.formulaId&&t.formula&&(t.formulaId=t.formula),!t.formula&&t.formulaId&&(t.formula=t.formulaId),t}function s(e){return i(e)?e:Object.entries(e).map(([e,t])=>({name:e,content:i(t)?t:[]}))}function c(e){let t=new Set;for(let n of e)for(let e of n.content){let n=e.datasetId??e.set;a(n)&&t.add(n)}return[...t]}function l(e){let t=s(e.slots??[]),n=e.options??{},r=n.interactivity;return{type:e.type,options:{...n,interactivity:{...r,scheduledExport:!1}},slots:t.map(e=>({...e,content:i(e.content)?e.content.map(e=>o(e)):[]})),filters:e.filters,inlineData:e.inlineData}}function u(e,t){return{...e,options:{...e.options,theme:{...e.options.theme,...t}}}}function d(e){let t=e.find(e=>e.name===`measure`||e.name===`measures`);if(t&&t.content.length>1)return!0;let n=e.find(e=>e.name===`legend`);return n?n.content.length>0:!1}function f(r){let i=[],a=r.options;switch(r.type){case`area-chart`:case`bar-chart`:case`column-chart`:if(r.inlineData||i.push({type:`rankingPicker`,mutationType:`rankAndSort`,ranking:a.ranking??{active:!1,number:5,direction:e.Top},sort:a.sort??{direction:t.Desc,by:n.Measure},importance:100}),d(r.slots)){let e=r.type===`area-chart`,t=e?[{key:`stacked`,label:`Stacked`},{key:`unstacked`,label:`Unstacked`},{key:`100`,label:`100%`},{key:`stream`,label:`Stream`}]:[{key:`grouped`,label:`Grouped`},{key:`stacked`,label:`Stacked`},{key:`100`,label:`100%`}],n=e?`stacked`:`grouped`;i.push({type:`optionDropdown`,mutationType:`mode`,values:t,currentValue:a.mode??n,importance:90})}break;case`donut-chart`:{let e=a.display??{};i.push({type:`optionDropdown`,mutationType:`donutLabelDisplay`,values:[{key:`withLegend`,label:`With legend`},{key:`withLabels`,label:`With labels`}],currentValue:e.categoryLabels===!0?`withLabels`:`withLegend`,importance:90});break}case`bubble-chart`:{let e=a.display??{};i.push({type:`optionDropdown`,mutationType:`bubbleValues`,values:[{key:`none`,label:`No values`},{key:`absolute`,label:`Absolute`},{key:`percentage`,label:`Percentage`}],currentValue:e.bubbleValues??e.values??`none`,importance:100});break}}return i.sort((e,t)=>t.importance-e.importance)}function p(e,t,n){let r=e.options;switch(t){case`mode`:return{...e,options:{...r,mode:n}};case`donutLabelDisplay`:{let t={...r.display??{}};return n===`withLabels`?(t.legend=!1,t.categoryLabels=!0):(t.legend=!0,t.categoryLabels=!1),{...e,options:{...r,display:t}}}case`bubbleValues`:{let t={...r.display??{}};return t.bubbleLabels=t.bubbleLabels!==!1,t.bubbleValues=n,{...e,options:{...r,display:t}}}default:return e}}function m(e,t){switch(t.type){case`slots`:return{...e,slots:t.slotsContents};case`options`:return{...e,options:t.options};case`filters`:return{...e,filters:t.filters};case`chartAction`:return p(e,t.actionType,t.key);case`rankAndSort`:return{...e,options:{...e.options,ranking:t.ranking,sort:t.sort}};case`fullReplace`:return t.chart;default:return e}}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return t}});
@@ -22,7 +22,7 @@ import { t } from "./info-tooltip-options.config-CyFz6pUU.js";
22
22
  import { t as n } from "./interactivity-options.config-MuEP5vSt.js";
23
23
  import { n as r, t as i } from "./color-palettes-B194TZ0a.js";
24
24
  import { t as a } from "./map-tile-providers-cK8Xlerl.js";
25
- import { n as o, r as s, t as c } from "./color-range-utils-CUCTsRXM.js";
25
+ import { n as o, r as s, t as c } from "./color-range-utils-CgwRGUkg.js";
26
26
  // node_modules/@luzmo/dashboard-contents-types/choropleth-map/choropleth-map-options.config.js
27
27
  var l = /* @__PURE__ */ e({ default: () => d }), u = (e, t) => {
28
28
  let n = `colors${t}`;
@@ -17,4 +17,4 @@
17
17
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
18
  * SOFTWARE.
19
19
  * */
20
- const e=require("./rolldown-runtime-DbbDpzbe.cjs"),t=require("./info-tooltip-options.config-B9T0cwSM.cjs"),n=require("./interactivity-options.config-Bzk2L-qh.cjs"),r=require("./color-palettes-BFpQSXfW.cjs"),i=require("./map-tile-providers-DzSBmFkY.cjs"),a=require("./color-range-utils-BCFQAeY1.cjs");var o=e.n({default:()=>c}),s=(e,t)=>{let n=`colors${t}`;return r.t()[e]?.[n]},c=[{key:`general`,type:`group`,open:!0,children:[{key:`display.title`,control:{type:`switch`,label:`Title`,default:!0}},{key:`display.legend`,control:{type:`switch`,label:`Legend`,default:!0}}]},{key:`map`,type:`group`,open:!0,children:[{key:`enabled.zoom`,control:{type:`switch`,label:`Zoom`,default:!0}},{key:`enabled.pan`,control:{type:`switch`,label:`Pan`,default:!0}},{key:`enabled.pitchBearing`,control:{type:`switch`,label:`Pitch & Rotate`,tooltip:`Use ctrl + drag`,default:!1}},{type:`divider`},{key:`vectorTileProvider`,control:{type:`picker`,label:`Map style`,default:`Basic`,enum:[`No Tiles`,`Basic`,`Bright`,`Dark`,`Fiord`,`Liberty`,`Pastel`,`Positron`,`Streets`,`Toner`,`Topographique`,`Voyager`,`3D buildings`],parseValue:e=>e?.name||`Basic`,toValue:e=>i.t[e]??{}}}]},{key:`colors`,type:`group`,open:!0,children:[{key:`opacity`,control:{type:`slider`,label:`Opacity`,default:.85,min:.2,max:1,step:.01}},{key:`colorsClassType`,control:{type:`picker`,label:`Colors type`,default:`sequential`,enum:[`sequential`,`divergent`,`manual`],calculateValue:({options:e})=>e?.colorsClass===`manual`?`manual`:r.t()?.[e?.colorsClass]?.type??`sequential`,toOptions:({options:e,value:t})=>{let n=e?.colorsClass??`PuBu`,i=e?.numberClasses??5,o=a.n(e?.manualValues?.ranges),s=n===`manual`?`manual`:n,c;t===`manual`?c=`manual`:t!==r.t()?.[e?.colorsClass]?.type&&(c=r.n(t??`sequential`)[0]);let l={...e,colorsClass:c};if(t===`manual`||e?.classification===`manual`){let e=a.t(i,t===`manual`?s:c,o);l.manualValues={...l.manualValues,ranges:a.r(e)}}else delete l?.manualValues?.ranges;return l}}},{key:`colorsClass`,control:{type:`color-palette-picker`,label:`Color palette`,hideLabel:!0,default:({options:e})=>{let t=r.t()?.[e?.colorsClass]?.type;return r.n(t??`sequential`)[0]},enum:({options:e})=>{let t=r.t()?.[e?.colorsClass]?.type;return r.n(t??`sequential`)},toOptions:({options:e,value:t})=>{let n={...e,colorsClass:t};if(e?.classification===`manual`){let r=s(t,e?.numberClasses??5);n.manualValues={...n.manualValues,ranges:e?.manualValues?.ranges?.map(e=>({...e,color:typeof e.val==`number`?r?.[e.val]:void 0}))}}return n}},visibleIf:({options:e})=>e?.colorsClass!==`manual`},{key:`manualValues.ranges`,control:{type:`color-range`,editRangeSize:!1,debounce:500,noValues:!0,noAlphaChannel:!0,label:`Manual range colors`,hideLabel:!0},calculateValue:({options:e})=>a.t(e?.numberClasses,e?.colorsClass,a.n(e?.manualValues?.ranges)),toOptions:({options:e,value:t})=>({...e,manualValues:{...e.manualValues,ranges:a.r(t)}}),visibleIf:({options:e})=>e?.colorsClass===`manual`}]},{key:`classification`,type:`group`,open:!0,children:[{key:`numberClasses`,control:{type:`picker`,label:`Number of classes`,default:`5`,enum:[`3`,`4`,`5`,`6`,`7`,`8`,`9`],parseValue:e=>e?.toString()??`5`,toOptions:({options:e,value:t})=>{let n=Number.parseInt(t,10)||5,r={...e,numberClasses:n};if(e?.classification===`manual`||e?.colorsClass===`manual`){let n=a.t(t,e?.colorsClass,a.n(e?.manualValues?.ranges));r.manualValues={...r.manualValues,ranges:a.r(n)}}return r}}},{key:`classification`,control:{type:`picker`,label:`Method`,default:`interval`,enum:[`interval`,`manual`,`quantile`,`continuous`],toOptions:({options:e,value:t})=>{let n={...e,classification:t};if(t===`manual`||e?.colorsClass===`manual`){let t=a.t(e?.numberClasses,e?.colorsClass,a.n(e?.manualValues?.ranges));n.manualValues={...n.manualValues,ranges:a.r(t)}}else delete n?.manualValues?.ranges;return n}}},{key:`manualValues.rangesValues`,control:{type:`color-range`,editRangeSize:!1,debounce:500,noValues:!1,readOnlyColorPicker:!0,label:`Manual range values`,hideLabel:!0,calculateValue:({options:e})=>a.t(e?.numberClasses,e?.colorsClass,a.n(e?.manualValues?.ranges)),toOptions:({options:e,value:t})=>({...e,manualValues:{...e.manualValues,ranges:a.r(t)}})},visibleIf:({options:e})=>e?.classification===`manual`}]},{key:`legend`,type:`group`,open:!1,children:[{key:`legend.type`,control:{type:`picker`,label:`Type`,default:`bar`,enum:[`bar`,`list`]}},{key:`legend.size`,control:{type:`radio-button-group`,label:`Size`,default:`M`,enum:[`S`,`M`,`L`]}},{key:`legend.position`,control:{type:`position-picker`,label:`Position`,default:`bottomLeft`,enum:[`topLeft`,`top`,`topRight`,`right`,`bottomRight`,`bottom`,`bottomLeft`,`left`]}}],visibleIf:({options:e})=>e?.display?.legend===!0},t.t(),n.t({select:{default:!0}})];Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return o}});
20
+ const e=require("./rolldown-runtime-DbbDpzbe.cjs"),t=require("./info-tooltip-options.config-B9T0cwSM.cjs"),n=require("./interactivity-options.config-Bzk2L-qh.cjs"),r=require("./color-palettes-BFpQSXfW.cjs"),i=require("./map-tile-providers-DzSBmFkY.cjs"),a=require("./color-range-utils-D8uygiMe.cjs");var o=e.n({default:()=>c}),s=(e,t)=>{let n=`colors${t}`;return r.t()[e]?.[n]},c=[{key:`general`,type:`group`,open:!0,children:[{key:`display.title`,control:{type:`switch`,label:`Title`,default:!0}},{key:`display.legend`,control:{type:`switch`,label:`Legend`,default:!0}}]},{key:`map`,type:`group`,open:!0,children:[{key:`enabled.zoom`,control:{type:`switch`,label:`Zoom`,default:!0}},{key:`enabled.pan`,control:{type:`switch`,label:`Pan`,default:!0}},{key:`enabled.pitchBearing`,control:{type:`switch`,label:`Pitch & Rotate`,tooltip:`Use ctrl + drag`,default:!1}},{type:`divider`},{key:`vectorTileProvider`,control:{type:`picker`,label:`Map style`,default:`Basic`,enum:[`No Tiles`,`Basic`,`Bright`,`Dark`,`Fiord`,`Liberty`,`Pastel`,`Positron`,`Streets`,`Toner`,`Topographique`,`Voyager`,`3D buildings`],parseValue:e=>e?.name||`Basic`,toValue:e=>i.t[e]??{}}}]},{key:`colors`,type:`group`,open:!0,children:[{key:`opacity`,control:{type:`slider`,label:`Opacity`,default:.85,min:.2,max:1,step:.01}},{key:`colorsClassType`,control:{type:`picker`,label:`Colors type`,default:`sequential`,enum:[`sequential`,`divergent`,`manual`],calculateValue:({options:e})=>e?.colorsClass===`manual`?`manual`:r.t()?.[e?.colorsClass]?.type??`sequential`,toOptions:({options:e,value:t})=>{let n=e?.colorsClass??`PuBu`,i=e?.numberClasses??5,o=a.n(e?.manualValues?.ranges),s=n===`manual`?`manual`:n,c;t===`manual`?c=`manual`:t!==r.t()?.[e?.colorsClass]?.type&&(c=r.n(t??`sequential`)[0]);let l={...e,colorsClass:c};if(t===`manual`||e?.classification===`manual`){let e=a.t(i,t===`manual`?s:c,o);l.manualValues={...l.manualValues,ranges:a.r(e)}}else delete l?.manualValues?.ranges;return l}}},{key:`colorsClass`,control:{type:`color-palette-picker`,label:`Color palette`,hideLabel:!0,default:({options:e})=>{let t=r.t()?.[e?.colorsClass]?.type;return r.n(t??`sequential`)[0]},enum:({options:e})=>{let t=r.t()?.[e?.colorsClass]?.type;return r.n(t??`sequential`)},toOptions:({options:e,value:t})=>{let n={...e,colorsClass:t};if(e?.classification===`manual`){let r=s(t,e?.numberClasses??5);n.manualValues={...n.manualValues,ranges:e?.manualValues?.ranges?.map(e=>({...e,color:typeof e.val==`number`?r?.[e.val]:void 0}))}}return n}},visibleIf:({options:e})=>e?.colorsClass!==`manual`},{key:`manualValues.ranges`,control:{type:`color-range`,editRangeSize:!1,debounce:500,noValues:!0,noAlphaChannel:!0,label:`Manual range colors`,hideLabel:!0},calculateValue:({options:e})=>a.t(e?.numberClasses,e?.colorsClass,a.n(e?.manualValues?.ranges)),toOptions:({options:e,value:t})=>({...e,manualValues:{...e.manualValues,ranges:a.r(t)}}),visibleIf:({options:e})=>e?.colorsClass===`manual`}]},{key:`classification`,type:`group`,open:!0,children:[{key:`numberClasses`,control:{type:`picker`,label:`Number of classes`,default:`5`,enum:[`3`,`4`,`5`,`6`,`7`,`8`,`9`],parseValue:e=>e?.toString()??`5`,toOptions:({options:e,value:t})=>{let n=Number.parseInt(t,10)||5,r={...e,numberClasses:n};if(e?.classification===`manual`||e?.colorsClass===`manual`){let n=a.t(t,e?.colorsClass,a.n(e?.manualValues?.ranges));r.manualValues={...r.manualValues,ranges:a.r(n)}}return r}}},{key:`classification`,control:{type:`picker`,label:`Method`,default:`interval`,enum:[`interval`,`manual`,`quantile`,`continuous`],toOptions:({options:e,value:t})=>{let n={...e,classification:t};if(t===`manual`||e?.colorsClass===`manual`){let t=a.t(e?.numberClasses,e?.colorsClass,a.n(e?.manualValues?.ranges));n.manualValues={...n.manualValues,ranges:a.r(t)}}else delete n?.manualValues?.ranges;return n}}},{key:`manualValues.rangesValues`,control:{type:`color-range`,editRangeSize:!1,debounce:500,noValues:!1,readOnlyColorPicker:!0,label:`Manual range values`,hideLabel:!0,calculateValue:({options:e})=>a.t(e?.numberClasses,e?.colorsClass,a.n(e?.manualValues?.ranges)),toOptions:({options:e,value:t})=>({...e,manualValues:{...e.manualValues,ranges:a.r(t)}})},visibleIf:({options:e})=>e?.classification===`manual`}]},{key:`legend`,type:`group`,open:!1,children:[{key:`legend.type`,control:{type:`picker`,label:`Type`,default:`bar`,enum:[`bar`,`list`]}},{key:`legend.size`,control:{type:`radio-button-group`,label:`Size`,default:`M`,enum:[`S`,`M`,`L`]}},{key:`legend.position`,control:{type:`position-picker`,label:`Position`,default:`bottomLeft`,enum:[`topLeft`,`top`,`topRight`,`right`,`bottomRight`,`bottom`,`bottomLeft`,`left`]}}],visibleIf:({options:e})=>e?.display?.legend===!0},t.t(),n.t({select:{default:!0}})];Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return o}});
@@ -17,13 +17,13 @@
17
17
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
18
  * SOFTWARE.
19
19
  * */
20
- import { t as e } from "./color-palettes-B194TZ0a.js";
21
- import { t } from "./color-CQcCK-_O.js";
20
+ import { t as e } from "./color-CQcCK-_O.js";
21
+ import { t } from "./color-palettes-B194TZ0a.js";
22
22
  // node_modules/@luzmo/dashboard-contents-types/shared/utils/color/extrapolate-color.js
23
- var n = (e, n = .1) => {
24
- if (e.length < 2) return "#AAAAAA";
25
- let r = e.length, i = new t(e[r - 2]).to("oklab"), a = new t(e[r - 1]).to("oklab"), o = i.coords[0], s = a.coords[0], c = Math.min(1, Math.max(0, s + (s > o ? 1 : -1) * n));
26
- return new t("oklab", [
23
+ var n = (t, n = .1) => {
24
+ if (t.length < 2) return "#AAAAAA";
25
+ let r = t.length, i = new e(t[r - 2]).to("oklab"), a = new e(t[r - 1]).to("oklab"), o = i.coords[0], s = a.coords[0], c = Math.min(1, Math.max(0, s + (s > o ? 1 : -1) * n));
26
+ return new e("oklab", [
27
27
  c,
28
28
  a.coords[1],
29
29
  a.coords[2]
@@ -37,25 +37,25 @@ var n = (e, n = .1) => {
37
37
  })) ?? [], i = (e) => e?.map((e) => ({
38
38
  color: e.color,
39
39
  val: e.value
40
- })) ?? [], a = (t, r, i) => {
41
- t = typeof t == "string" ? Number.parseInt(t, 10) : t, t = typeof t == "number" ? Math.max(Math.min(t, 9), 3) : 5;
40
+ })) ?? [], a = (e, r, i) => {
41
+ e = typeof e == "string" ? Number.parseInt(e, 10) : e, e = typeof e == "number" ? Math.max(Math.min(e, 9), 3) : 5;
42
42
  let a = Array.isArray(i) ? i : [], o = Math.min(...a.map((e) => e?.value ?? Infinity)), s = Math.max(...a.map((e) => e?.value ?? -Infinity)), c = !1, l = typeof o == "number" && typeof s == "number" && o !== Infinity && s !== -Infinity ? s - o : 0;
43
- if (a.length > t) c = o !== Infinity && s !== -Infinity, a = a.slice(0, t);
44
- else if (a.length < t) for (; a.length < t;) a.push({});
45
- let u = [], d = e();
46
- if (Object.keys(d).includes(r ?? "")) u = d[r]?.[`colors${t}`] ?? [];
43
+ if (a.length > e) c = o !== Infinity && s !== -Infinity, a = a.slice(0, e);
44
+ else if (a.length < e) for (; a.length < e;) a.push({});
45
+ let u = [], d = t();
46
+ if (Object.keys(d).includes(r ?? "")) u = d[r]?.[`colors${e}`] ?? [];
47
47
  else if (r === "manual") {
48
- if (u = a.map((e) => e.color).filter((e) => e !== void 0), u.length < t) for (; u.length < t;) u.push(n(u));
49
- } else u = d.PuBu?.[`colors${t}`] ?? [];
48
+ if (u = a.map((e) => e.color).filter((e) => e !== void 0), u.length < e) for (; u.length < e;) u.push(n(u));
49
+ } else u = d.PuBu?.[`colors${e}`] ?? [];
50
50
  if (u?.forEach((e, t) => {
51
51
  a[t].color = e;
52
52
  }), a.filter((e) => e.value === void 0)?.length > 0) {
53
- let e = o === Infinity ? 0 : o, n = l / (t - 1) || 100;
54
- for (let r = 0; r < t; r++) a[r].value = Number((e + r * n).toFixed(10));
53
+ let t = o === Infinity ? 0 : o, n = l / (e - 1) || 100;
54
+ for (let r = 0; r < e; r++) a[r].value = Number((t + r * n).toFixed(10));
55
55
  }
56
56
  if (c) {
57
- let e = o === Infinity ? 0 : o, n = l / (t - 1) || 100;
58
- for (let r = 0; r < t; r++) a[r].value = Number((e + r * n).toFixed(10));
57
+ let t = o === Infinity ? 0 : o, n = l / (e - 1) || 100;
58
+ for (let r = 0; r < e; r++) a[r].value = Number((t + r * n).toFixed(10));
59
59
  }
60
60
  return a;
61
61
  };