vue-data-ui 2.15.6-beta.3 → 2.16.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 (89) hide show
  1. package/README.md +43 -0
  2. package/dist/{Arrow-BJ_CRJyF.js → Arrow-DxJlDB9C.js} +1 -1
  3. package/dist/{BaseDraggableDialog-DF92HRp0.js → BaseDraggableDialog-ptA-tymg.js} +2 -2
  4. package/dist/{BaseIcon-LS5kKPbn.js → BaseIcon-C_4Rt67h.js} +1 -1
  5. package/dist/{ColorPicker-Cx5g5odW.js → ColorPicker-RSAHpYAS.js} +2 -2
  6. package/dist/{DataTable-BOqEYsjY.js → DataTable-DH1qIr9V.js} +2 -2
  7. package/dist/{Legend-pCALuM52.js → Legend-DRRDpFh2.js} +2 -2
  8. package/dist/{NonSvgPenAndPaper-Bd8ntuqd.js → NonSvgPenAndPaper-BOLmbvp3.js} +3 -3
  9. package/dist/{PackageVersion-anXxQ1tn.js → PackageVersion-DdKhk9BJ.js} +2 -2
  10. package/dist/{PenAndPaper-Ch1IGZWU.js → PenAndPaper-CRZSYHVX.js} +3 -3
  11. package/dist/{Shape-BkbM-pH2.js → Shape-BoeIXAWe.js} +1 -1
  12. package/dist/{Slicer-Ckh9c-7g.js → Slicer-CSRvxGa5.js} +2 -2
  13. package/dist/{SparkTooltip-DyyHZEYG.js → SparkTooltip-BSSLhdaq.js} +1 -1
  14. package/dist/{Title-CJUPPg0h.js → Title-Dxc8Xaru.js} +1 -1
  15. package/dist/{Tooltip-DfoBVZWM.js → Tooltip-BC4_CO4g.js} +1 -1
  16. package/dist/{UserOptions-DbG0UdoH.js → UserOptions-D5GkhjeU.js} +2 -2
  17. package/dist/{dom-to-png-CETshbM4.js → dom-to-png-3RI__D49.js} +1 -1
  18. package/dist/{img-D-Jl1o-W.js → img-Bk3lHRQt.js} +1 -1
  19. package/dist/{index-C7JYFWZw.js → index-CVxAE1Qc.js} +16 -15
  20. package/dist/{pdf-BXsrYscR.js → pdf-CaadJrGW.js} +1 -1
  21. package/dist/types/vue-data-ui.d.cts +100 -11
  22. package/dist/types/vue-data-ui.d.ts +100 -11
  23. package/dist/{useNestedProp-CHkwx6cn.js → useNestedProp-yHcl2Qv-.js} +1 -1
  24. package/dist/{usePrinter-CNWA1pLY.js → usePrinter-D-4Ffa-i.js} +2 -2
  25. package/dist/{vue-data-ui-CZP0LvLT.js → vue-data-ui-Bc92n--W.js} +63 -63
  26. package/dist/vue-data-ui.js +1 -1
  27. package/dist/{vue-ui-3d-bar-G6CRkU9P.js → vue-ui-3d-bar-6A2PA5X3.js} +5 -5
  28. package/dist/{vue-ui-accordion-C9lMmKOX.js → vue-ui-accordion-OTQS2IW6.js} +3 -3
  29. package/dist/{vue-ui-age-pyramid-CVtAxeR8.js → vue-ui-age-pyramid-k9NdJIQs.js} +5 -5
  30. package/dist/{vue-ui-annotator-1PhSGA3Q.js → vue-ui-annotator-oBoCJwq7.js} +2 -2
  31. package/dist/{vue-ui-bullet-BsbopIjO.js → vue-ui-bullet-CKo1pjMc.js} +6 -6
  32. package/dist/{vue-ui-candlestick-CoWaqX_b.js → vue-ui-candlestick-DMEmIiUl.js} +6 -6
  33. package/dist/{vue-ui-carousel-table-D2o_1oqi.js → vue-ui-carousel-table-CerLckm9.js} +4 -4
  34. package/dist/{vue-ui-chestnut-CPk8tj8j.js → vue-ui-chestnut-CbOmjyl9.js} +4 -4
  35. package/dist/{vue-ui-chord-DTLzS6c7.js → vue-ui-chord-wKA4GJin.js} +7 -7
  36. package/dist/{vue-ui-circle-pack-CtQLusbb.js → vue-ui-circle-pack-Du_EwmFM.js} +5 -5
  37. package/dist/{vue-ui-cursor-Wquv_Gnw.js → vue-ui-cursor-LsO6mxm2.js} +2 -2
  38. package/dist/{vue-ui-dashboard-CLoECP8o.js → vue-ui-dashboard-uYvDgfup.js} +62 -62
  39. package/dist/{vue-ui-digits-B6FqM3Rl.js → vue-ui-digits-BEDQ4U3-.js} +2 -2
  40. package/dist/{vue-ui-donut-BHdSwQ4f.js → vue-ui-donut-CNqFLCTB.js} +7 -7
  41. package/dist/{vue-ui-donut-evolution-Ci4xeo5w.js → vue-ui-donut-evolution-D55rGHJV.js} +7 -7
  42. package/dist/{vue-ui-dumbbell-DdXhLX-J.js → vue-ui-dumbbell-CrbLRiu-.js} +6 -6
  43. package/dist/{vue-ui-flow-PSsz82G4.js → vue-ui-flow-C3DXSQoY.js} +6 -6
  44. package/dist/{vue-ui-funnel-ZhlFW6XJ.js → vue-ui-funnel-DSBxYb6k.js} +5 -5
  45. package/dist/{vue-ui-galaxy-mgABJyp8.js → vue-ui-galaxy-CqKIg-rc.js} +4 -4
  46. package/dist/{vue-ui-gauge-DVAHGnzh.js → vue-ui-gauge-Dtomr8t9.js} +5 -5
  47. package/dist/{vue-ui-gizmo-B-TJAYKj.js → vue-ui-gizmo-CO3p3p_3.js} +3 -3
  48. package/dist/{vue-ui-heatmap-X4_T_AF1.js → vue-ui-heatmap-BI8PLPtn.js} +6 -6
  49. package/dist/{vue-ui-history-plot-BAHjKWKx.js → vue-ui-history-plot-DQ8_78yX.js} +6 -6
  50. package/dist/{vue-ui-kpi-BfV9ABjr.js → vue-ui-kpi-DLh1H9Tx.js} +3 -3
  51. package/dist/{vue-ui-mini-loader-tS7y7l8P.js → vue-ui-mini-loader-d5fyINYa.js} +2 -2
  52. package/dist/{vue-ui-molecule-B14o3ZeF.js → vue-ui-molecule-Bb-t7Jvr.js} +4 -4
  53. package/dist/{vue-ui-mood-radar-Bb7zzbb2.js → vue-ui-mood-radar-CItSFvA-.js} +6 -6
  54. package/dist/{vue-ui-nested-donuts-DyKUOA0g.js → vue-ui-nested-donuts-hc8hNcKU.js} +6 -6
  55. package/dist/{vue-ui-onion-CxB9iGa4.js → vue-ui-onion-B3n29xo3.js} +6 -6
  56. package/dist/{vue-ui-parallel-coordinate-plot-CQGDreK3.js → vue-ui-parallel-coordinate-plot-Bw5e6CMy.js} +7 -7
  57. package/dist/{vue-ui-quadrant-D28_e8cP.js → vue-ui-quadrant-DYgN6P0V.js} +7 -7
  58. package/dist/{vue-ui-quick-chart-Cf2wJfng.js → vue-ui-quick-chart-Dw2-YckC.js} +5 -5
  59. package/dist/{vue-ui-radar-DeVwLeeQ.js → vue-ui-radar-BVaP7LwG.js} +6 -6
  60. package/dist/{vue-ui-rating-DEzizA06.js → vue-ui-rating-CQQimLsh.js} +2 -2
  61. package/dist/{vue-ui-relation-circle-Dv7KtC9Z.js → vue-ui-relation-circle-DSOzKaPS.js} +5 -5
  62. package/dist/{vue-ui-ridgeline-Da38pPFg.js → vue-ui-ridgeline-CQe9ZeC1.js} +7 -7
  63. package/dist/{vue-ui-rings-Bl35exQr.js → vue-ui-rings-4HpaWVvw.js} +7 -7
  64. package/dist/{vue-ui-scatter-B1rAsGvg.js → vue-ui-scatter-Ck-XaEUb.js} +7 -7
  65. package/dist/{vue-ui-skeleton-Ccp2EtnH.js → vue-ui-skeleton-CngL8NX6.js} +3 -3
  66. package/dist/{vue-ui-smiley-z-UmPJ-t.js → vue-ui-smiley-DXBpPiOD.js} +2 -2
  67. package/dist/{vue-ui-spark-trend-E9Duzpl9.js → vue-ui-spark-trend-hfl74frB.js} +3 -3
  68. package/dist/{vue-ui-sparkbar-CRQgMZfz.js → vue-ui-sparkbar-CWl_FGtY.js} +3 -3
  69. package/dist/{vue-ui-sparkgauge-BJvatO-U.js → vue-ui-sparkgauge-DS-pJjbj.js} +3 -3
  70. package/dist/{vue-ui-sparkhistogram-DTKgORvU.js → vue-ui-sparkhistogram-B2VBewT2.js} +4 -4
  71. package/dist/{vue-ui-sparkline-C-BVONoX.js → vue-ui-sparkline-Dnt5PMGA.js} +3 -3
  72. package/dist/{vue-ui-sparkstackbar-2Jgprmgr.js → vue-ui-sparkstackbar-CYLHafTS.js} +3 -3
  73. package/dist/{vue-ui-stackbar-DBBqoXns.js → vue-ui-stackbar-1N7NhmtT.js} +8 -8
  74. package/dist/{vue-ui-strip-plot-CzR7eo6H.js → vue-ui-strip-plot-B_RvzXNO.js} +6 -6
  75. package/dist/{vue-ui-table-heatmap-B2_05yai.js → vue-ui-table-heatmap-Di5ymmvG.js} +5 -5
  76. package/dist/{vue-ui-table-BEKE992A.js → vue-ui-table-lX2V9h7J.js} +3 -3
  77. package/dist/{vue-ui-table-sparkline-CFH24HcQ.js → vue-ui-table-sparkline-eYNRFxNH.js} +4 -4
  78. package/dist/{vue-ui-thermometer-G__Ke-aj.js → vue-ui-thermometer-BYc5OpKO.js} +5 -5
  79. package/dist/{vue-ui-timer-C6OBVzP8.js → vue-ui-timer-8y6KLjU2.js} +5 -5
  80. package/dist/{vue-ui-tiremarks-Dv6qFUo-.js → vue-ui-tiremarks-CgBQYwuT.js} +5 -5
  81. package/dist/{vue-ui-treemap-CTUi7fzI.js → vue-ui-treemap-BaPv0JXG.js} +7 -7
  82. package/dist/{vue-ui-vertical-bar-Vrqpks87.js → vue-ui-vertical-bar-D-KieI-N.js} +8 -8
  83. package/dist/{vue-ui-waffle-D-XGcL2N.js → vue-ui-waffle-DTXUhV-1.js} +7 -7
  84. package/dist/{vue-ui-wheel-DulpH-Sv.js → vue-ui-wheel-CyLaYzIA.js} +5 -5
  85. package/dist/{vue-ui-word-cloud-BBB05yzO.js → vue-ui-word-cloud-vwfccReT.js} +5 -5
  86. package/dist/{vue-ui-world-DDxw-Wlj.js → vue-ui-world-Bm7I4XLt.js} +5 -5
  87. package/dist/{vue-ui-xy-Bqnp8U3K.js → vue-ui-xy-CO-EfhIw.js} +16 -16
  88. package/dist/{vue-ui-xy-canvas-ZBtdqhZs.js → vue-ui-xy-canvas-DqZ3KKxB.js} +7 -7
  89. package/package.json +1 -1
package/README.md CHANGED
@@ -1079,3 +1079,46 @@ Below is a table of the places where such line breaks can be used:
1079
1079
  ## PDF generation
1080
1080
 
1081
1081
  This package requires jspdf as a peer dependency. Please install it in your project if you intend on using the PDF printing feature.
1082
+
1083
+ ## `useObjectBindings`
1084
+
1085
+ A composable that **flattens** a reactive object into a set of computed refs—one for each “leaf” property—so you can easily bind to deeply nested values by their string paths.
1086
+
1087
+ ### Why use it?
1088
+
1089
+ - **Automatic reactivity**: Every nested property becomes a `ComputedRef`, with automatic getters/setters that keep your source object in sync.
1090
+ - **Flat API surface**: Access or update any nested field by its dot‑delimited path, without writing deep destructuring or `ref` plumbing.
1091
+ - **Dynamic path support**: New paths added at runtime are discovered automatically (and proxied), so you never lose reactivity when mutating the structure.
1092
+
1093
+ ```js
1094
+ import { useObjectBindings } from "vue-data-ui";
1095
+ import type { Ref, ComputedRef } from "vue";
1096
+
1097
+ const config = ref({
1098
+ customPalette: ["#CCCCCC", "#1A1A1A"],
1099
+ style: {
1100
+ chart: {
1101
+ backgroundColor: "#FFFFFF",
1102
+ color: "#1A1A1A",
1103
+ },
1104
+ },
1105
+ });
1106
+
1107
+ const bindings = useObjectBindings(config);
1108
+ // Now `bindings` has computed refs for each leaf path:
1109
+ // bindings["style.chart.backgroundColor"] → ComputedRef<string>
1110
+ // bindings["style.chart.color"] → ComputedRef<string>
1111
+ // bindings["customPalette"] → ComputedRef<boolean>
1112
+ // // by default, arrays are skipped:
1113
+ // // no "customPalette.0", unless you disable skipArrays
1114
+ ```
1115
+
1116
+ You can then use these in your template:
1117
+
1118
+ ```html
1119
+ <template>
1120
+ <div>
1121
+ <input type="color" v-model="bindings['style.chart.backgroundColor']" />
1122
+ </div>
1123
+ </template>
1124
+ ```
@@ -1,5 +1,5 @@
1
1
  import { computed as u, createElementBlock as k, openBlock as m, createElementVNode as t, unref as o } from "vue";
2
- import { c as n } from "./index-C7JYFWZw.js";
2
+ import { c as n } from "./index-CVxAE1Qc.js";
3
3
  const s = { class: "vue-ui-element-arrow" }, f = ["id", "viewBox", "refX", "refY", "markerWidth", "markerHeight"], c = ["d", "fill"], h = ["id", "viewBox", "refX", "refY", "markerWidth", "markerHeight"], y = ["d", "fill"], v = ["x1", "y1", "x2", "y2", "stroke", "stroke-width", "stroke-linecap", "stroke-dasharray", "marker-end", "marker-start"], z = {
4
4
  __name: "Arrow",
5
5
  props: {
@@ -1,6 +1,6 @@
1
1
  import { useCssVars as O, ref as z, reactive as T, computed as $, onUnmounted as R, createBlock as N, openBlock as v, Teleport as V, createElementBlock as E, createCommentVNode as I, withModifiers as a, normalizeStyle as y, createElementVNode as o, unref as P, renderSlot as M, createVNode as F, nextTick as j } from "vue";
2
- import U from "./BaseIcon-LS5kKPbn.js";
3
- import { X as q } from "./index-C7JYFWZw.js";
2
+ import U from "./BaseIcon-C_4Rt67h.js";
3
+ import { X as q } from "./index-CVxAE1Qc.js";
4
4
  import { _ as A } from "./_plugin-vue_export-helper-CHgC5LLL.js";
5
5
  const G = ["xmlns"], J = { class: "modal-title" }, K = { class: "modal-body" }, Q = {
6
6
  __name: "BaseDraggableDialog",
@@ -1,5 +1,5 @@
1
1
  import { computed as e, createElementBlock as n, openBlock as i, normalizeClass as k, unref as L } from "vue";
2
- import { X as l } from "./index-C7JYFWZw.js";
2
+ import { X as l } from "./index-CVxAE1Qc.js";
3
3
  import { _ as d } from "./_plugin-vue_export-helper-CHgC5LLL.js";
4
4
  const M = ["xmlns", "viewBox", "height", "width", "innerHTML"], h = {
5
5
  __name: "BaseIcon",
@@ -1,6 +1,6 @@
1
1
  import { ref as l, computed as k, watch as I, withDirectives as P, createElementBlock as r, openBlock as n, withKeys as S, createElementVNode as u, createCommentVNode as z, normalizeStyle as a, createVNode as F, Fragment as E, renderList as N, unref as O } from "vue";
2
- import C from "./BaseIcon-LS5kKPbn.js";
3
- import { F as V } from "./index-C7JYFWZw.js";
2
+ import C from "./BaseIcon-C_4Rt67h.js";
3
+ import { F as V } from "./index-CVxAE1Qc.js";
4
4
  import { v as D } from "./vClickOutside-C6WiFswA.js";
5
5
  import { _ as K } from "./_plugin-vue_export-helper-CHgC5LLL.js";
6
6
  const $ = ["onClick"], L = { style: { position: "absolute", top: "50%", left: "50%", transform: "translate(-50%, -46%)" } }, T = ["value"], j = {
@@ -1,6 +1,6 @@
1
1
  import { useCssVars as A, unref as e, computed as D, ref as w, onMounted as E, createElementBlock as n, openBlock as a, normalizeClass as k, createElementVNode as t, withKeys as R, normalizeStyle as i, createVNode as C, toDisplayString as I, Fragment as f, renderList as m, renderSlot as N, createCommentVNode as $ } from "vue";
2
- import { _ as K } from "./Shape-BkbM-pH2.js";
3
- import O from "./BaseIcon-LS5kKPbn.js";
2
+ import { _ as K } from "./Shape-BoeIXAWe.js";
3
+ import O from "./BaseIcon-C_4Rt67h.js";
4
4
  import { _ as T } from "./_plugin-vue_export-helper-CHgC5LLL.js";
5
5
  const j = { class: "vue-ui-data-table" }, F = { style: { display: "flex", "align-items": "center", "justify-content": "flex-end", "padding-right": "3px", gap: "3px" } }, L = { style: { width: "12px", height: "12px" } }, M = {
6
6
  key: 0,
@@ -1,6 +1,6 @@
1
1
  import { createElementBlock as n, openBlock as o, normalizeStyle as d, renderSlot as l, Fragment as u, renderList as g, normalizeClass as m, createCommentVNode as h, createVNode as k, mergeProps as y, unref as $ } from "vue";
2
- import { a0 as p } from "./index-C7JYFWZw.js";
3
- import { _ as v } from "./Shape-BkbM-pH2.js";
2
+ import { a0 as p } from "./index-CVxAE1Qc.js";
3
+ import { _ as v } from "./Shape-BoeIXAWe.js";
4
4
  import { _ as b } from "./_plugin-vue_export-helper-CHgC5LLL.js";
5
5
  const S = ["id"], x = ["onClick", "height", "width"], z = {
6
6
  __name: "Legend",
@@ -1,7 +1,7 @@
1
1
  import { ref as i, computed as we, onMounted as ke, nextTick as be, onBeforeUnmount as Ce, watch as oe, createElementBlock as x, openBlock as y, Fragment as q, createCommentVNode as Y, normalizeStyle as b, normalizeClass as D, createElementVNode as C, withDirectives as ae, createVNode as M, toDisplayString as re, unref as se, vModelText as ue, withModifiers as ie, renderList as ce } from "vue";
2
- import { l as $e, f as Se, X as Ae } from "./index-C7JYFWZw.js";
3
- import R from "./BaseIcon-LS5kKPbn.js";
4
- import { C as Ee } from "./ColorPicker-Cx5g5odW.js";
2
+ import { l as $e, f as Se, X as Ae } from "./index-CVxAE1Qc.js";
3
+ import R from "./BaseIcon-C_4Rt67h.js";
4
+ import { C as Ee } from "./ColorPicker-RSAHpYAS.js";
5
5
  import { _ as Be } from "./_plugin-vue_export-helper-CHgC5LLL.js";
6
6
  const Te = {
7
7
  class: /* @__PURE__ */ D({
@@ -1,8 +1,8 @@
1
1
  import { createElementBlock as e, openBlock as t, toDisplayString as o, unref as r } from "vue";
2
- const a = "2.15.6-beta.3", n = { "aria-hidden": "true" }, p = {
2
+ const n = "2.16.0", a = { "aria-hidden": "true" }, p = {
3
3
  __name: "PackageVersion",
4
4
  setup(s) {
5
- return (c, i) => (t(), e("desc", n, "Composed with Vue Data UI " + o(r(a)), 1));
5
+ return (c, i) => (t(), e("desc", a, "Composed with Vue Data UI " + o(r(n)), 1));
6
6
  }
7
7
  };
8
8
  export {
@@ -1,7 +1,7 @@
1
1
  import { ref as c, computed as ge, watch as X, nextTick as le, onMounted as pe, onBeforeUnmount as me, createElementBlock as Y, createCommentVNode as q, openBlock as z, normalizeStyle as x, createElementVNode as k, withDirectives as ae, createVNode as R, normalizeClass as G, toDisplayString as Ae, unref as he, vModelText as oe } from "vue";
2
- import T from "./BaseIcon-LS5kKPbn.js";
3
- import { C as we } from "./ColorPicker-Cx5g5odW.js";
4
- import { l as be, f as xe } from "./index-C7JYFWZw.js";
2
+ import T from "./BaseIcon-C_4Rt67h.js";
3
+ import { C as we } from "./ColorPicker-RSAHpYAS.js";
4
+ import { l as be, f as xe } from "./index-CVxAE1Qc.js";
5
5
  const ye = {
6
6
  class: "vue-ui-pen-and-paper-action",
7
7
  style: { padding: "0 !important" }
@@ -1,5 +1,5 @@
1
1
  import { computed as u, createElementBlock as r, openBlock as l, createCommentVNode as a } from "vue";
2
- import { _ as c, R as f } from "./index-C7JYFWZw.js";
2
+ import { _ as c, R as f } from "./index-CVxAE1Qc.js";
3
3
  const y = ["cx", "cy", "r", "fill", "stroke", "stroke-width"], g = ["d", "fill", "stroke", "stroke-width"], x = ["points", "fill", "stroke", "stroke-width"], h = {
4
4
  __name: "Shape",
5
5
  props: {
@@ -1,7 +1,7 @@
1
1
  import { useCssVars as ze, computed as d, ref as i, watch as D, onMounted as Ae, onBeforeUnmount as Fe, watchEffect as He, nextTick as Y, onUpdated as Ve, createElementBlock as c, openBlock as m, createElementVNode as v, createCommentVNode as p, renderSlot as We, normalizeStyle as $, createVNode as Xe, withDirectives as me, unref as F, Fragment as he, renderList as fe, normalizeClass as L, vModelText as ge, toDisplayString as _ } from "vue";
2
- import Ue from "./BaseIcon-LS5kKPbn.js";
2
+ import Ue from "./BaseIcon-C_4Rt67h.js";
3
3
  import { t as Oe, u as Ze } from "./useResponsive-DfdjqQps.js";
4
- import { c as je, V as be, U as xe, X as Ge, F as ee } from "./index-C7JYFWZw.js";
4
+ import { c as je, V as be, U as xe, X as Ge, F as ee } from "./index-CVxAE1Qc.js";
5
5
  import { _ as qe } from "./_plugin-vue_export-helper-CHgC5LLL.js";
6
6
  const Je = {
7
7
  class: "vue-data-ui-slicer-labels",
@@ -1,5 +1,5 @@
1
1
  import { toRef as c, ref as a, computed as v, onMounted as m, watch as y, createElementBlock as b, openBlock as g, normalizeStyle as x, renderSlot as k, nextTick as S } from "vue";
2
- import { s as _, ao as i } from "./index-C7JYFWZw.js";
2
+ import { s as _, ao as i } from "./index-CVxAE1Qc.js";
3
3
  import { _ as N } from "./_plugin-vue_export-helper-CHgC5LLL.js";
4
4
  const R = {
5
5
  __name: "SparkTooltip",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as l, openBlock as n, Fragment as f, createElementVNode as p, createCommentVNode as o, normalizeStyle as d, unref as e, toDisplayString as g, renderSlot as r } from "vue";
2
- import { u as c } from "./useNestedProp-CHkwx6cn.js";
2
+ import { u as c } from "./useNestedProp-yHcl2Qv-.js";
3
3
  const x = {
4
4
  __name: "Title",
5
5
  props: {
@@ -1,6 +1,6 @@
1
1
  import { ref as m, watch as p, nextTick as g, onUnmounted as S, computed as x, createBlock as k, openBlock as h, Teleport as $, createElementBlock as C, createCommentVNode as F, normalizeStyle as B, normalizeClass as N, renderSlot as v, createElementVNode as w } from "vue";
2
2
  import { u as z } from "./useMouse-AicQS8Vf.js";
3
- import { s as T } from "./index-C7JYFWZw.js";
3
+ import { s as T } from "./index-CVxAE1Qc.js";
4
4
  function Y({ tooltip: t, chart: n, clientPosition: l, positionPreference: s = "center", defaultOffsetY: d = 24, blockShiftY: u = !1 }) {
5
5
  const e = m(0), i = m(d);
6
6
  if (t && n) {
@@ -1,7 +1,7 @@
1
1
  import { ref as m, computed as E, onMounted as J, onBeforeUnmount as Q, withDirectives as Y, createElementBlock as s, openBlock as t, normalizeStyle as v, createElementVNode as X, withKeys as Z, withModifiers as p, renderSlot as k, normalizeProps as S, guardReactiveProps as _, createVNode as ee, normalizeClass as d, createCommentVNode as a, Fragment as $, createBlock as f, toDisplayString as c, mergeProps as T, unref as te } from "vue";
2
2
  import { v as oe } from "./vClickOutside-C6WiFswA.js";
3
- import r from "./BaseIcon-LS5kKPbn.js";
4
- import ne from "./img-D-Jl1o-W.js";
3
+ import r from "./BaseIcon-C_4Rt67h.js";
4
+ import ne from "./img-Bk3lHRQt.js";
5
5
  import { _ as le } from "./_plugin-vue_export-helper-CHgC5LLL.js";
6
6
  const ie = ["title"], se = ["data-open"], ae = {
7
7
  __name: "UserOptions",
@@ -1,4 +1,4 @@
1
- import { X as x } from "./index-C7JYFWZw.js";
1
+ import { X as x } from "./index-CVxAE1Qc.js";
2
2
  async function F(n) {
3
3
  const i = n.querySelectorAll("img"), s = Array.from(i).map((t) => new Promise((o) => {
4
4
  if (!t.src || t.src.startsWith("data:")) return o();
@@ -1,4 +1,4 @@
1
- import { d as a } from "./dom-to-png-CETshbM4.js";
1
+ import { d as a } from "./dom-to-png-3RI__D49.js";
2
2
  async function g({ domElement: t, fileName: c, format: i = "png", scale: o = 2, base64: n = !1 }) {
3
3
  if (!t) return Promise.reject("No element provided");
4
4
  if (n)
@@ -6085,23 +6085,24 @@ const R = {
6085
6085
  ]
6086
6086
  }, lo = ["00", "03", "05", "08", "0A", "0D", "0F", "12", "14", "17", "1A", "1C", "1F", "21", "24", "26", "29", "2B", "2E", "30", "33", "36", "38", "3B", "3D", "40", "42", "45", "47", "4A", "4D", "4F", "52", "54", "57", "59", "5C", "5E", "61", "63", "66", "69", "6B", "6E", "70", "73", "75", "78", "7A", "7D", "80", "82", "85", "87", "8A", "8C", "8F", "91", "94", "96", "99", "9C", "9E", "A1", "A3", "A6", "A8", "AB", "AD", "B0", "B3", "B5", "B8", "BA", "BD", "BF", "C2", "C4", "C7", "C9", "CC", "CF", "D1", "D4", "D6", "D9", "DB", "DE", "E0", "E3", "E6", "E8", "EB", "ED", "F0", "F2", "F5", "F7", "FA", "FC", "FF"];
6087
6087
  function T(o) {
6088
- const e = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i, r = /^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/i, l = /^hsla?\((\d+),\s*([\d.]+)%,\s*([\d.]+)%(?:,\s*([\d.]+))?\)$/i;
6089
- if ([void 0, null, NaN].includes(o))
6088
+ const e = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i, r = /^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i, l = /^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/i, c = /^hsla?\((\d+),\s*([\d.]+)%,\s*([\d.]+)%(?:,\s*([\d.]+))?\)$/i;
6089
+ if (o == null || typeof o == "number" && isNaN(o))
6090
6090
  return null;
6091
6091
  if (o = Nt(o), o === "transparent")
6092
6092
  return "#FFFFFF00";
6093
- let c, t = 1;
6094
- if (c = o.match(e)) {
6095
- const [, i, n, s, u] = c;
6096
- return t = u ? parseInt(u, 16) / 255 : 1, `#${i}${n}${s}${z(Math.round(t * 255))}`;
6097
- } else if (c = o.match(r)) {
6098
- const [, i, n, s, u] = c;
6099
- return t = u ? parseFloat(u) : 1, `#${z(i)}${z(n)}${z(s)}${z(Math.round(t * 255))}`;
6100
- } else if (c = o.match(l)) {
6101
- const [, i, n, s, u] = c;
6102
- t = u ? parseFloat(u) : 1;
6103
- const d = wt(Number(i), Number(n), Number(s));
6104
- return `#${z(d[0])}${z(d[1])}${z(d[2])}${z(Math.round(t * 255))}`;
6093
+ o = o.replace(r, (n, s, u, d, b) => `#${s}${s}${u}${u}${d}${d}${b ? b + b : ""}`);
6094
+ let t, i = 1;
6095
+ if (t = o.match(e)) {
6096
+ const [, n, s, u, d] = t;
6097
+ return i = d ? parseInt(d, 16) / 255 : 1, `#${n}${s}${u}${z(Math.round(i * 255))}`;
6098
+ } else if (t = o.match(l)) {
6099
+ const [, n, s, u, d] = t;
6100
+ return i = d ? parseFloat(d) : 1, `#${z(n)}${z(s)}${z(u)}${z(Math.round(i * 255))}`;
6101
+ } else if (t = o.match(c)) {
6102
+ const [, n, s, u, d] = t;
6103
+ i = d ? parseFloat(d) : 1;
6104
+ const [b, a, f] = wt(Number(n), Number(s), Number(u));
6105
+ return `#${z(b)}${z(a)}${z(f)}${z(Math.round(i * 255))}`;
6105
6106
  }
6106
6107
  return null;
6107
6108
  }
@@ -7302,7 +7303,7 @@ function al(o, e) {
7302
7303
  };
7303
7304
  return Fr(new Proxy(c, i));
7304
7305
  }
7305
- const cl = C(() => import("./Arrow-BJ_CRJyF.js")), nl = C(() => import("./vue-data-ui-CZP0LvLT.js")), sl = C(() => import("./vue-ui-3d-bar-G6CRkU9P.js")), il = C(() => import("./vue-ui-accordion-C9lMmKOX.js")), ul = C(() => import("./vue-ui-age-pyramid-CVtAxeR8.js")), dl = C(() => import("./vue-ui-annotator-1PhSGA3Q.js")), bl = C(() => import("./vue-ui-candlestick-CoWaqX_b.js")), fl = C(() => import("./vue-ui-chestnut-CPk8tj8j.js")), gl = C(() => import("./vue-ui-cursor-Wquv_Gnw.js")), Al = C(() => import("./vue-ui-dashboard-CLoECP8o.js")), Cl = C(() => import("./vue-ui-digits-B6FqM3Rl.js")), hl = C(() => import("./vue-ui-donut-BHdSwQ4f.js")), kl = C(() => import("./vue-ui-donut-evolution-Ci4xeo5w.js")), Fl = C(() => import("./vue-ui-dumbbell-DdXhLX-J.js")), El = C(() => import("./vue-ui-flow-PSsz82G4.js")), pl = C(() => import("./vue-ui-galaxy-mgABJyp8.js")), Dl = C(() => import("./vue-ui-gauge-DVAHGnzh.js")), Bl = C(() => import("./vue-ui-heatmap-X4_T_AF1.js")), yl = C(() => import("./BaseIcon-LS5kKPbn.js")), ml = C(() => import("./vue-ui-kpi-BfV9ABjr.js")), xl = C(() => import("./vue-ui-mini-loader-tS7y7l8P.js")), wl = C(() => import("./vue-ui-molecule-B14o3ZeF.js")), Ll = C(() => import("./vue-ui-mood-radar-Bb7zzbb2.js")), vl = C(() => import("./vue-ui-nested-donuts-DyKUOA0g.js")), Sl = C(() => import("./vue-ui-onion-CxB9iGa4.js")), _l = C(() => import("./vue-ui-parallel-coordinate-plot-CQGDreK3.js")), zl = C(() => import("./vue-ui-quadrant-D28_e8cP.js")), Ol = C(() => import("./vue-ui-quick-chart-Cf2wJfng.js")), Rl = C(() => import("./vue-ui-radar-DeVwLeeQ.js")), Pl = C(() => import("./vue-ui-rating-DEzizA06.js")), Tl = C(() => import("./vue-ui-relation-circle-Dv7KtC9Z.js")), Nl = C(() => import("./vue-ui-rings-Bl35exQr.js")), Ml = C(() => import("./vue-ui-scatter-B1rAsGvg.js")), Vl = C(() => import("./vue-ui-skeleton-Ccp2EtnH.js")), Il = C(() => import("./vue-ui-smiley-z-UmPJ-t.js")), Wl = C(() => import("./vue-ui-sparkhistogram-DTKgORvU.js")), $l = C(() => import("./vue-ui-sparkstackbar-2Jgprmgr.js")), Ul = C(() => import("./vue-ui-spark-trend-E9Duzpl9.js")), Yl = C(() => import("./vue-ui-sparkbar-CRQgMZfz.js")), Gl = C(() => import("./vue-ui-sparkgauge-BJvatO-U.js")), Hl = C(() => import("./vue-ui-sparkline-C-BVONoX.js")), Xl = C(() => import("./vue-ui-strip-plot-CzR7eo6H.js")), jl = C(() => import("./vue-ui-table-BEKE992A.js")), Kl = C(() => import("./vue-ui-table-heatmap-B2_05yai.js")), ql = C(() => import("./vue-ui-table-sparkline-CFH24HcQ.js")), Ql = C(() => import("./vue-ui-thermometer-G__Ke-aj.js")), Zl = C(() => import("./vue-ui-timer-C6OBVzP8.js")), Jl = C(() => import("./vue-ui-tiremarks-Dv6qFUo-.js")), oa = C(() => import("./vue-ui-treemap-CTUi7fzI.js")), ra = C(() => import("./vue-ui-vertical-bar-Vrqpks87.js")), ta = C(() => import("./vue-ui-waffle-D-XGcL2N.js")), ea = C(() => import("./vue-ui-wheel-DulpH-Sv.js")), la = C(() => import("./vue-ui-word-cloud-BBB05yzO.js")), aa = C(() => import("./vue-ui-xy-Bqnp8U3K.js")), ca = C(() => import("./vue-ui-xy-canvas-ZBtdqhZs.js")), na = C(() => import("./vue-ui-carousel-table-D2o_1oqi.js")), sa = C(() => import("./vue-ui-gizmo-B-TJAYKj.js")), ia = C(() => import("./vue-ui-stackbar-DBBqoXns.js")), ua = C(() => import("./vue-ui-bullet-BsbopIjO.js")), da = C(() => import("./vue-ui-funnel-ZhlFW6XJ.js")), ba = C(() => import("./vue-ui-history-plot-BAHjKWKx.js")), fa = C(() => import("./vue-ui-pattern-DsYgSZWn.js")), ga = C(() => import("./vue-ui-circle-pack-CtQLusbb.js")), Aa = C(() => import("./vue-ui-world-DDxw-Wlj.js")), Ca = C(() => import("./vue-ui-ridgeline-Da38pPFg.js")), ha = C(() => import("./vue-ui-chord-DTLzS6c7.js"));
7306
+ const cl = C(() => import("./Arrow-DxJlDB9C.js")), nl = C(() => import("./vue-data-ui-Bc92n--W.js")), sl = C(() => import("./vue-ui-3d-bar-6A2PA5X3.js")), il = C(() => import("./vue-ui-accordion-OTQS2IW6.js")), ul = C(() => import("./vue-ui-age-pyramid-k9NdJIQs.js")), dl = C(() => import("./vue-ui-annotator-oBoCJwq7.js")), bl = C(() => import("./vue-ui-candlestick-DMEmIiUl.js")), fl = C(() => import("./vue-ui-chestnut-CbOmjyl9.js")), gl = C(() => import("./vue-ui-cursor-LsO6mxm2.js")), Al = C(() => import("./vue-ui-dashboard-uYvDgfup.js")), Cl = C(() => import("./vue-ui-digits-BEDQ4U3-.js")), hl = C(() => import("./vue-ui-donut-CNqFLCTB.js")), kl = C(() => import("./vue-ui-donut-evolution-D55rGHJV.js")), Fl = C(() => import("./vue-ui-dumbbell-CrbLRiu-.js")), El = C(() => import("./vue-ui-flow-C3DXSQoY.js")), pl = C(() => import("./vue-ui-galaxy-CqKIg-rc.js")), Dl = C(() => import("./vue-ui-gauge-Dtomr8t9.js")), Bl = C(() => import("./vue-ui-heatmap-BI8PLPtn.js")), yl = C(() => import("./BaseIcon-C_4Rt67h.js")), ml = C(() => import("./vue-ui-kpi-DLh1H9Tx.js")), xl = C(() => import("./vue-ui-mini-loader-d5fyINYa.js")), wl = C(() => import("./vue-ui-molecule-Bb-t7Jvr.js")), Ll = C(() => import("./vue-ui-mood-radar-CItSFvA-.js")), vl = C(() => import("./vue-ui-nested-donuts-hc8hNcKU.js")), Sl = C(() => import("./vue-ui-onion-B3n29xo3.js")), _l = C(() => import("./vue-ui-parallel-coordinate-plot-Bw5e6CMy.js")), zl = C(() => import("./vue-ui-quadrant-DYgN6P0V.js")), Ol = C(() => import("./vue-ui-quick-chart-Dw2-YckC.js")), Rl = C(() => import("./vue-ui-radar-BVaP7LwG.js")), Pl = C(() => import("./vue-ui-rating-CQQimLsh.js")), Tl = C(() => import("./vue-ui-relation-circle-DSOzKaPS.js")), Nl = C(() => import("./vue-ui-rings-4HpaWVvw.js")), Ml = C(() => import("./vue-ui-scatter-Ck-XaEUb.js")), Vl = C(() => import("./vue-ui-skeleton-CngL8NX6.js")), Il = C(() => import("./vue-ui-smiley-DXBpPiOD.js")), Wl = C(() => import("./vue-ui-sparkhistogram-B2VBewT2.js")), $l = C(() => import("./vue-ui-sparkstackbar-CYLHafTS.js")), Ul = C(() => import("./vue-ui-spark-trend-hfl74frB.js")), Yl = C(() => import("./vue-ui-sparkbar-CWl_FGtY.js")), Gl = C(() => import("./vue-ui-sparkgauge-DS-pJjbj.js")), Hl = C(() => import("./vue-ui-sparkline-Dnt5PMGA.js")), Xl = C(() => import("./vue-ui-strip-plot-B_RvzXNO.js")), jl = C(() => import("./vue-ui-table-lX2V9h7J.js")), Kl = C(() => import("./vue-ui-table-heatmap-Di5ymmvG.js")), ql = C(() => import("./vue-ui-table-sparkline-eYNRFxNH.js")), Ql = C(() => import("./vue-ui-thermometer-BYc5OpKO.js")), Zl = C(() => import("./vue-ui-timer-8y6KLjU2.js")), Jl = C(() => import("./vue-ui-tiremarks-CgBQYwuT.js")), oa = C(() => import("./vue-ui-treemap-BaPv0JXG.js")), ra = C(() => import("./vue-ui-vertical-bar-D-KieI-N.js")), ta = C(() => import("./vue-ui-waffle-DTXUhV-1.js")), ea = C(() => import("./vue-ui-wheel-CyLaYzIA.js")), la = C(() => import("./vue-ui-word-cloud-vwfccReT.js")), aa = C(() => import("./vue-ui-xy-CO-EfhIw.js")), ca = C(() => import("./vue-ui-xy-canvas-DqZ3KKxB.js")), na = C(() => import("./vue-ui-carousel-table-CerLckm9.js")), sa = C(() => import("./vue-ui-gizmo-CO3p3p_3.js")), ia = C(() => import("./vue-ui-stackbar-1N7NhmtT.js")), ua = C(() => import("./vue-ui-bullet-CKo1pjMc.js")), da = C(() => import("./vue-ui-funnel-DSBxYb6k.js")), ba = C(() => import("./vue-ui-history-plot-DQ8_78yX.js")), fa = C(() => import("./vue-ui-pattern-DsYgSZWn.js")), ga = C(() => import("./vue-ui-circle-pack-Du_EwmFM.js")), Aa = C(() => import("./vue-ui-world-Bm7I4XLt.js")), Ca = C(() => import("./vue-ui-ridgeline-CQe9ZeC1.js")), ha = C(() => import("./vue-ui-chord-wKA4GJin.js"));
7306
7307
  export {
7307
7308
  Me as $,
7308
7309
  no as A,
@@ -1,4 +1,4 @@
1
- import { d as u } from "./dom-to-png-CETshbM4.js";
1
+ import { d as u } from "./dom-to-png-3RI__D49.js";
2
2
  async function H({ domElement: d, fileName: f, scale: p = 2, options: P = {} }) {
3
3
  if (!d) return Promise.reject("No domElement provided");
4
4
  let r;
@@ -1,5 +1,5 @@
1
1
  declare module "vue-data-ui" {
2
- import { DefineComponent } from "vue";
2
+ import { Ref, ComputedRef, DefineComponent } from "vue";
3
3
 
4
4
  export type VueUiUnknownObj = {
5
5
  [key: string]: unknown;
@@ -5235,7 +5235,7 @@ declare module "vue-data-ui" {
5235
5235
  [key: string]: string | number | number[];
5236
5236
  };
5237
5237
 
5238
- export type VueUiQuickChartDataset =
5238
+ export type VueUiQuickChartDataset =
5239
5239
  | number[]
5240
5240
  | VueUiQuickChartDatasetObjectItem
5241
5241
  | VueUiQuickChartDatasetObjectItem[];
@@ -7430,9 +7430,9 @@ declare module "vue-data-ui" {
7430
7430
  * - Handles arrays by making their item type DeepPartial
7431
7431
  */
7432
7432
  export type DeepPartial<T> =
7433
- T extends Function
7434
- ? T
7435
- : T extends Array<infer U>
7433
+ T extends Function
7434
+ ? T
7435
+ : T extends Array<infer U>
7436
7436
  ? Array<DeepPartial<U>>
7437
7437
  : T extends object
7438
7438
  ? { [K in keyof T]?: DeepPartial<T[K]> }
@@ -7455,12 +7455,12 @@ declare module "vue-data-ui" {
7455
7455
  * })
7456
7456
  */
7457
7457
  export function mergeConfigs<T extends Record<string, any>>({
7458
- defaultConfig,
7459
- userConfig,
7460
- }: {
7461
- defaultConfig: T;
7462
- userConfig: DeepPartial<T>;
7463
- }
7458
+ defaultConfig,
7459
+ userConfig,
7460
+ }: {
7461
+ defaultConfig: T;
7462
+ userConfig: DeepPartial<T>;
7463
+ }
7464
7464
  ): T;
7465
7465
 
7466
7466
  /**
@@ -7648,4 +7648,93 @@ declare module "vue-data-ui" {
7648
7648
  x,
7649
7649
  y
7650
7650
  }: CreateTSpansArgs) => string;
7651
+
7652
+ export type UseObjectBindingsOptions = {
7653
+ /** Delimiter to join object‑path segments */
7654
+ delimiter?: string;
7655
+ /** If true, array indices will not be traversed */
7656
+ skipArrays?: boolean;
7657
+ };
7658
+
7659
+ /**
7660
+ * Recursively build a union of dot‑delimited paths for an object type,
7661
+ * but skip arrays (we don’t traverse them by default at runtime).
7662
+ */
7663
+ type Paths<T> = T extends object
7664
+ ? T extends any[]
7665
+ ? never
7666
+ : {
7667
+ [K in Extract<keyof T, string>]:
7668
+ // if the property is itself an object, recurse
7669
+ T[K] extends object
7670
+ ? `${K}` | `${K}.${Paths<T[K]>}`
7671
+ : `${K}`;
7672
+ }[Extract<keyof T, string>]
7673
+ : never;
7674
+
7675
+ /**
7676
+ * Given an object type `T` and one of its path strings `P`,
7677
+ * resolve the type at that path.
7678
+ */
7679
+ type PathValue<T, P extends string> =
7680
+ P extends `${infer K}.${infer Rest}`
7681
+ ? K extends keyof T
7682
+ ? PathValue<T[K], Rest>
7683
+ : never
7684
+ : P extends keyof T
7685
+ ? T[P]
7686
+ : never;
7687
+
7688
+ /**
7689
+ * A fully‑typed bindings record: for each valid path `P` in `T`,
7690
+ * `ComputedRef` of the exact `PathValue<T,P>`.
7691
+ */
7692
+ export type TypedBindings<T extends object> = {
7693
+ [P in Paths<T>]: ComputedRef<PathValue<T, P>>;
7694
+ };
7695
+
7696
+ /**
7697
+ * Vue Data UI composable
7698
+ * ---
7699
+ * Flattens a reactive config object into computed refs for every leaf property.
7700
+ *
7701
+ * @template T extends object
7702
+ * @param configRef A Vue `Ref<T>` holding your object.
7703
+ * @param options Optional settings: `delimiter` (default `"."`) and `skipArrays` (default `true`).
7704
+ * @returns A `TypedBindings<T>` whose keys are every “leaf” path in `T`
7705
+ * and whose values are `ComputedRef` of the exact property type.
7706
+ *
7707
+ * ___
7708
+ * @example
7709
+ *
7710
+ * ```js
7711
+ * import { useObjectBindings } from "vue-data-ui";
7712
+ * import type { Ref, ComputedRef } from "vue";
7713
+ *
7714
+ * const config = ref({
7715
+ * customPalette: ["#CCCCCC", "#1A1A1A"],
7716
+ * style: {
7717
+ * chart: {
7718
+ * backgroundColor: "#FFFFFF",
7719
+ * color: "#1A1A1A",
7720
+ * },
7721
+ * },
7722
+ * });
7723
+ *
7724
+ * const bindings = useObjectBindings(config);
7725
+ * ```
7726
+ *
7727
+ * Then in your template:
7728
+ * ```html
7729
+ * <template>
7730
+ * <div>
7731
+ * <input type="color" v-model="bindings['style.chart.backgroundColor']" />
7732
+ * </div>
7733
+ * </template>
7734
+ * ```
7735
+ */
7736
+ export function useObjectBindings<T extends object>(
7737
+ configRef: Ref<T>,
7738
+ options?: UseObjectBindingsOptions
7739
+ ): TypedBindings<T>;
7651
7740
  }
@@ -1,5 +1,5 @@
1
1
  declare module "vue-data-ui" {
2
- import { DefineComponent } from "vue";
2
+ import { Ref, ComputedRef, DefineComponent } from "vue";
3
3
 
4
4
  export type VueUiUnknownObj = {
5
5
  [key: string]: unknown;
@@ -5235,7 +5235,7 @@ declare module "vue-data-ui" {
5235
5235
  [key: string]: string | number | number[];
5236
5236
  };
5237
5237
 
5238
- export type VueUiQuickChartDataset =
5238
+ export type VueUiQuickChartDataset =
5239
5239
  | number[]
5240
5240
  | VueUiQuickChartDatasetObjectItem
5241
5241
  | VueUiQuickChartDatasetObjectItem[];
@@ -7430,9 +7430,9 @@ declare module "vue-data-ui" {
7430
7430
  * - Handles arrays by making their item type DeepPartial
7431
7431
  */
7432
7432
  export type DeepPartial<T> =
7433
- T extends Function
7434
- ? T
7435
- : T extends Array<infer U>
7433
+ T extends Function
7434
+ ? T
7435
+ : T extends Array<infer U>
7436
7436
  ? Array<DeepPartial<U>>
7437
7437
  : T extends object
7438
7438
  ? { [K in keyof T]?: DeepPartial<T[K]> }
@@ -7455,12 +7455,12 @@ declare module "vue-data-ui" {
7455
7455
  * })
7456
7456
  */
7457
7457
  export function mergeConfigs<T extends Record<string, any>>({
7458
- defaultConfig,
7459
- userConfig,
7460
- }: {
7461
- defaultConfig: T;
7462
- userConfig: DeepPartial<T>;
7463
- }
7458
+ defaultConfig,
7459
+ userConfig,
7460
+ }: {
7461
+ defaultConfig: T;
7462
+ userConfig: DeepPartial<T>;
7463
+ }
7464
7464
  ): T;
7465
7465
 
7466
7466
  /**
@@ -7648,4 +7648,93 @@ declare module "vue-data-ui" {
7648
7648
  x,
7649
7649
  y
7650
7650
  }: CreateTSpansArgs) => string;
7651
+
7652
+ export type UseObjectBindingsOptions = {
7653
+ /** Delimiter to join object‑path segments */
7654
+ delimiter?: string;
7655
+ /** If true, array indices will not be traversed */
7656
+ skipArrays?: boolean;
7657
+ };
7658
+
7659
+ /**
7660
+ * Recursively build a union of dot‑delimited paths for an object type,
7661
+ * but skip arrays (we don’t traverse them by default at runtime).
7662
+ */
7663
+ type Paths<T> = T extends object
7664
+ ? T extends any[]
7665
+ ? never
7666
+ : {
7667
+ [K in Extract<keyof T, string>]:
7668
+ // if the property is itself an object, recurse
7669
+ T[K] extends object
7670
+ ? `${K}` | `${K}.${Paths<T[K]>}`
7671
+ : `${K}`;
7672
+ }[Extract<keyof T, string>]
7673
+ : never;
7674
+
7675
+ /**
7676
+ * Given an object type `T` and one of its path strings `P`,
7677
+ * resolve the type at that path.
7678
+ */
7679
+ type PathValue<T, P extends string> =
7680
+ P extends `${infer K}.${infer Rest}`
7681
+ ? K extends keyof T
7682
+ ? PathValue<T[K], Rest>
7683
+ : never
7684
+ : P extends keyof T
7685
+ ? T[P]
7686
+ : never;
7687
+
7688
+ /**
7689
+ * A fully‑typed bindings record: for each valid path `P` in `T`,
7690
+ * `ComputedRef` of the exact `PathValue<T,P>`.
7691
+ */
7692
+ export type TypedBindings<T extends object> = {
7693
+ [P in Paths<T>]: ComputedRef<PathValue<T, P>>;
7694
+ };
7695
+
7696
+ /**
7697
+ * Vue Data UI composable
7698
+ * ---
7699
+ * Flattens a reactive config object into computed refs for every leaf property.
7700
+ *
7701
+ * @template T extends object
7702
+ * @param configRef A Vue `Ref<T>` holding your object.
7703
+ * @param options Optional settings: `delimiter` (default `"."`) and `skipArrays` (default `true`).
7704
+ * @returns A `TypedBindings<T>` whose keys are every “leaf” path in `T`
7705
+ * and whose values are `ComputedRef` of the exact property type.
7706
+ *
7707
+ * ___
7708
+ * @example
7709
+ *
7710
+ * ```js
7711
+ * import { useObjectBindings } from "vue-data-ui";
7712
+ * import type { Ref, ComputedRef } from "vue";
7713
+ *
7714
+ * const config = ref({
7715
+ * customPalette: ["#CCCCCC", "#1A1A1A"],
7716
+ * style: {
7717
+ * chart: {
7718
+ * backgroundColor: "#FFFFFF",
7719
+ * color: "#1A1A1A",
7720
+ * },
7721
+ * },
7722
+ * });
7723
+ *
7724
+ * const bindings = useObjectBindings(config);
7725
+ * ```
7726
+ *
7727
+ * Then in your template:
7728
+ * ```html
7729
+ * <template>
7730
+ * <div>
7731
+ * <input type="color" v-model="bindings['style.chart.backgroundColor']" />
7732
+ * </div>
7733
+ * </template>
7734
+ * ```
7735
+ */
7736
+ export function useObjectBindings<T extends object>(
7737
+ configRef: Ref<T>,
7738
+ options?: UseObjectBindingsOptions
7739
+ ): TypedBindings<T>;
7651
7740
  }
@@ -1,4 +1,4 @@
1
- import { A as o, z as n } from "./index-C7JYFWZw.js";
1
+ import { A as o, z as n } from "./index-CVxAE1Qc.js";
2
2
  function c({ defaultConfig: e, userConfig: r }) {
3
3
  if (!Object.keys(r || {}).length)
4
4
  return e;
@@ -10,7 +10,7 @@ function m({
10
10
  !t || r.value || (r.value = !0, clearTimeout(n.value), n.value = setTimeout(async () => {
11
11
  if (t)
12
12
  try {
13
- const { default: e } = await import("./pdf-BXsrYscR.js");
13
+ const { default: e } = await import("./pdf-CaadJrGW.js");
14
14
  await e({
15
15
  domElement: document.getElementById(u),
16
16
  fileName: l,
@@ -27,7 +27,7 @@ function m({
27
27
  !t || a.value || (a.value = !0, clearTimeout(n.value), n.value = setTimeout(async () => {
28
28
  if (t)
29
29
  try {
30
- const { default: e } = await import("./img-D-Jl1o-W.js");
30
+ const { default: e } = await import("./img-Bk3lHRQt.js");
31
31
  await e({
32
32
  domElement: document.getElementById(u),
33
33
  fileName: l,