@leavepulse/ui 0.71.0 → 0.71.2

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 (79) hide show
  1. package/dist/assets/{LpCommandPalette-DgPZX0us.css → LpCommandPalette-Rtbg669l.css} +19 -19
  2. package/dist/assets/{LpNumberFlow-rZkwQwlU.css → LpNumberFlow-Chp9pEDe.css} +8 -0
  3. package/dist/assets/LpTabs-DT0XPTc2.css +18 -0
  4. package/dist/chunks/{LpAddressInput-CD0bzrt-.js → LpAddressInput-Bu6ws3Fp.js} +1 -1
  5. package/dist/chunks/{LpAppShell-1RmBp6xQ.js → LpAppShell-C5YW5pI7.js} +1 -1
  6. package/dist/chunks/{LpCodeDisplay-BK2FHbtM.js → LpCodeDisplay-C9pIMF2R.js} +1 -1
  7. package/dist/chunks/{LpCommandScope-ubtWDMa0.js → LpCommandScope-BlKcgBnK.js} +1 -1
  8. package/dist/chunks/{LpCountdown-DTdMF8DL.js → LpCountdown-CXrEK0ev.js} +1 -1
  9. package/dist/chunks/{LpGauge-BdjPGnqw.js → LpGauge-DFdt33x8.js} +1 -1
  10. package/dist/chunks/{LpModalNav-BH4ANQGJ.js → LpModalNav-Cuna8c_3.js} +1 -1
  11. package/dist/chunks/{LpNumberFlow-5khYxsfX.js → LpNumberFlow-Dwb9MV1A.js} +6 -5
  12. package/dist/chunks/{LpPaletteTheme-CqWNRwHE.js → LpPaletteTheme-DkikZ362.js} +5 -3
  13. package/dist/chunks/{LpPie-DdFSTbGE.js → LpPie-C1uIUFxu.js} +1 -1
  14. package/dist/chunks/{LpProgress-BX33EKkN.js → LpProgress-WNaH4emv.js} +1 -1
  15. package/dist/chunks/{LpQuota-DqNv1yjs.js → LpQuota-Cz9PvklM.js} +1 -1
  16. package/dist/chunks/{LpSelect-DYX2-u5A.js → LpSelect-D3pRJfRY.js} +4 -4
  17. package/dist/chunks/{LpSidebar-D44peKq2.js → LpSidebar-Bk7b-K4l.js} +1 -1
  18. package/dist/chunks/{LpSidebarNav--VwkXO_a.js → LpSidebarNav-BR2AW3KT.js} +6 -1
  19. package/dist/chunks/{LpStat-DIsQfbeD.js → LpStat-Dzn6WFzi.js} +4 -4
  20. package/dist/chunks/{LpThemeStudio-B2nPaG-h.js → LpThemeStudio-IupHqP0x.js} +2 -2
  21. package/dist/chunks/{LpThemeSwitcher-C0A5sg_E.js → LpThemeSwitcher-DarPHuX8.js} +4 -3
  22. package/dist/chunks/{LpTopologyCanvas-B0wEvAoq.js → LpTopologyCanvas-Cq-MiJwo.js} +42 -12
  23. package/dist/chunks/{LpUptimeBar-DRadGq4Y.js → LpUptimeBar-BbhVTPnL.js} +1 -1
  24. package/dist/chunks/{palette-BiY7yQZL.js → palette-Cvxl_1tM.js} +1 -1
  25. package/dist/components/LpAddressInput.vue.js +1 -1
  26. package/dist/components/LpAppShell.vue.js +1 -1
  27. package/dist/components/LpChart.vue.js +22 -4
  28. package/dist/components/LpCodeDisplay.vue.js +1 -1
  29. package/dist/components/LpCommandPalette.vue.js +43 -22
  30. package/dist/components/LpCommandScope.vue.js +1 -1
  31. package/dist/components/LpCountdown.vue.js +1 -1
  32. package/dist/components/LpGauge.vue.js +1 -1
  33. package/dist/components/LpModalNav.vue.js +1 -1
  34. package/dist/components/LpNumberFlow.vue.js +1 -1
  35. package/dist/components/LpPaletteStats.vue.js +1 -1
  36. package/dist/components/LpPaletteTheme.vue.d.ts +2 -0
  37. package/dist/components/LpPaletteTheme.vue.js +1 -1
  38. package/dist/components/LpPie.vue.js +1 -1
  39. package/dist/components/LpProgress.vue.js +1 -1
  40. package/dist/components/LpQuota.vue.js +1 -1
  41. package/dist/components/LpSelect.vue.js +1 -1
  42. package/dist/components/LpSidebar.vue.js +1 -1
  43. package/dist/components/LpSidebarNav.vue.js +1 -1
  44. package/dist/components/LpStat.vue.js +1 -1
  45. package/dist/components/LpTabs.vue.d.ts +8 -0
  46. package/dist/components/LpTabs.vue.js +7 -5
  47. package/dist/components/LpThemeStudio.vue.js +1 -1
  48. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  49. package/dist/components/LpTopologyCanvas.vue.d.ts +3 -1
  50. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  51. package/dist/components/LpUptimeBar.vue.js +1 -1
  52. package/dist/components/chart.d.ts +14 -0
  53. package/dist/components/chart.js +13 -0
  54. package/dist/components/format.d.ts +10 -3
  55. package/dist/components/format.js +14 -2
  56. package/dist/composables/usePaletteCommands.js +8 -1
  57. package/dist/composables/useReveal.js +1 -22
  58. package/dist/index.d.ts +1 -1
  59. package/dist/index.js +21 -20
  60. package/dist/theme/palette.d.ts +3 -0
  61. package/package.json +1 -1
  62. package/src/components/LpChart.vue +23 -3
  63. package/src/components/LpCommandPalette.vue +23 -5
  64. package/src/components/LpNumberFlow.vue +19 -7
  65. package/src/components/LpPaletteTheme.vue +3 -3
  66. package/src/components/LpSelect.vue +5 -4
  67. package/src/components/LpSidebarNav.vue +8 -1
  68. package/src/components/LpStat.vue +5 -3
  69. package/src/components/LpTabs.vue +10 -2
  70. package/src/components/LpThemeStudio.vue +1 -1
  71. package/src/components/LpThemeSwitcher.vue +4 -1
  72. package/src/components/LpTopologyCanvas.vue +35 -4
  73. package/src/components/chart.ts +26 -0
  74. package/src/components/format.ts +31 -5
  75. package/src/composables/usePaletteCommands.ts +10 -1
  76. package/src/composables/useReveal.ts +7 -30
  77. package/src/index.ts +1 -1
  78. package/src/theme/palette.ts +4 -2
  79. package/dist/assets/LpTabs-CO3EcsNV.css +0 -18
@@ -5,34 +5,34 @@
5
5
  * pane from its right edge as it grows. Animating the columns themselves made
6
6
  * every line of the list and the pane re-wrap on every frame.
7
7
  */
8
- .lp-cmd-dialog[data-v-e9366efe] {
8
+ .lp-cmd-dialog[data-v-8d42f8db] {
9
9
  --lp-cmd-list: min(92vw, 40rem);
10
10
  --lp-cmd-pane: max(0px, min(26rem, 96vw - var(--lp-cmd-list)));
11
11
  width: var(--lp-cmd-list);
12
12
  }
13
- .lp-cmd-split[data-v-e9366efe] {
13
+ .lp-cmd-split[data-v-8d42f8db] {
14
14
  transition:
15
15
  width 300ms var(--ease-emphasized, ease),
16
16
  min-height 300ms var(--ease-emphasized, ease);
17
17
  }
18
18
  @media (min-width: 768px) {
19
- .lp-cmd-split .lp-cmd-list[data-v-e9366efe] {
19
+ .lp-cmd-split .lp-cmd-list[data-v-8d42f8db] {
20
20
  flex: 0 0 auto;
21
21
  /* the dialog's 1px border on each side */
22
22
  width: calc(var(--lp-cmd-list) - 2px);
23
23
  }
24
- .lp-cmd-dialog[data-pane="open"][data-v-e9366efe] {
24
+ .lp-cmd-dialog[data-pane="open"][data-v-8d42f8db] {
25
25
  width: calc(var(--lp-cmd-list) + var(--lp-cmd-pane));
26
26
  min-height: min(76vh, 36rem);
27
27
  }
28
28
  }
29
- .lp-cmd-pane[data-v-e9366efe] {
29
+ .lp-cmd-pane[data-v-8d42f8db] {
30
30
  width: var(--lp-cmd-pane);
31
31
  }
32
- .lp-cmd-dialog[data-editing] .lp-cmd-pane[data-v-e9366efe] {
32
+ .lp-cmd-dialog[data-editing] .lp-cmd-pane[data-v-8d42f8db] {
33
33
  width: 100%;
34
34
  }
35
- .lp-cmd-dialog[data-editing][data-v-e9366efe] {
35
+ .lp-cmd-dialog[data-editing][data-v-8d42f8db] {
36
36
  width: var(--lp-cmd-list);
37
37
  min-height: 0;
38
38
  }
@@ -40,43 +40,43 @@
40
40
  * The pane rides in from the right edge while the dialog opens up to it, and
41
41
  * leaves the same way, for as long as the dialog takes to close over it.
42
42
  */
43
- .lp-cmd-pane-enter-active[data-v-e9366efe],
44
- .lp-cmd-pane-leave-active[data-v-e9366efe] {
43
+ .lp-cmd-pane-enter-active[data-v-8d42f8db],
44
+ .lp-cmd-pane-leave-active[data-v-8d42f8db] {
45
45
  transition:
46
46
  transform 300ms var(--ease-emphasized, ease),
47
47
  opacity 300ms ease;
48
48
  }
49
- .lp-cmd-pane-enter-from[data-v-e9366efe],
50
- .lp-cmd-pane-leave-to[data-v-e9366efe] {
49
+ .lp-cmd-pane-enter-from[data-v-8d42f8db],
50
+ .lp-cmd-pane-leave-to[data-v-8d42f8db] {
51
51
  opacity: 0;
52
52
  transform: translateX(40%);
53
53
  }
54
- .lp-cmd-para[data-v-e9366efe] {
54
+ .lp-cmd-para[data-v-8d42f8db] {
55
55
  --rise: 4px;
56
56
  animation: rise-in 260ms ease-out both;
57
57
  }
58
58
  @media (prefers-reduced-motion: reduce) {
59
- .lp-cmd-split[data-v-e9366efe],
60
- .lp-cmd-pane-enter-active[data-v-e9366efe],
61
- .lp-cmd-pane-leave-active[data-v-e9366efe] {
59
+ .lp-cmd-split[data-v-8d42f8db],
60
+ .lp-cmd-pane-enter-active[data-v-8d42f8db],
61
+ .lp-cmd-pane-leave-active[data-v-8d42f8db] {
62
62
  transition: none;
63
63
  }
64
- .lp-cmd-para[data-v-e9366efe] {
64
+ .lp-cmd-para[data-v-8d42f8db] {
65
65
  animation: none;
66
66
  }
67
67
  }
68
- .lp-cmd-excerpt[data-v-e9366efe] {
68
+ .lp-cmd-excerpt[data-v-8d42f8db] {
69
69
  display: -webkit-box;
70
70
  -webkit-box-orient: vertical;
71
71
  overflow: hidden;
72
72
  }
73
73
  /* Each result eases in; honours reduced motion. */
74
- .lp-cmd-item[data-v-e9366efe] {
74
+ .lp-cmd-item[data-v-8d42f8db] {
75
75
  --rise: 3px;
76
76
  animation: rise-in 140ms ease-out both;
77
77
  }
78
78
  @media (prefers-reduced-motion: reduce) {
79
- .lp-cmd-item[data-v-e9366efe] {
79
+ .lp-cmd-item[data-v-8d42f8db] {
80
80
  animation: none;
81
81
  }
82
82
  }
@@ -80,6 +80,14 @@
80
80
 
81
81
  /* Faded, so a held-open column reads as an empty wheel rather than a zero the
82
82
  number actually has. */
83
+ /*
84
+ * A space separator (ru, fr, …) takes a whole column in a monospaced or
85
+ * tabular face, so "7 271" read as "7 271". It is drawn as the narrow gap
86
+ * the locale means.
87
+ */
88
+ .lp-nf__cell--gap {
89
+ width: 0.25em;
90
+ }
83
91
  .lp-nf__cell--pad {
84
92
  opacity: 0.18;
85
93
  transition: opacity var(--duration-fast, 160ms) linear;
@@ -0,0 +1,18 @@
1
+
2
+ .lp-tab-badge-enter-active[data-v-848e78d1],
3
+ .lp-tab-badge-leave-active[data-v-848e78d1] {
4
+ transition:
5
+ opacity var(--duration-fast) var(--ease-emphasized),
6
+ transform var(--duration-fast) var(--ease-emphasized);
7
+ }
8
+ .lp-tab-badge-enter-from[data-v-848e78d1],
9
+ .lp-tab-badge-leave-to[data-v-848e78d1] {
10
+ opacity: 0;
11
+ transform: scale(0.6);
12
+ }
13
+ @media (prefers-reduced-motion: reduce) {
14
+ .lp-tab-badge-enter-active[data-v-848e78d1],
15
+ .lp-tab-badge-leave-active[data-v-848e78d1] {
16
+ transition: none;
17
+ }
18
+ }
@@ -8,7 +8,7 @@ import { _ as _sfc_main$1 } from "./LpFormField-gRASfyj2.js";
8
8
  import { _ as _sfc_main$4 } from "./LpIcon-DkP-9mzK.js";
9
9
  import { _ as _sfc_main$5 } from "./LpInput-2H-5ILOB.js";
10
10
  import { _ as _sfc_main$7 } from "./LpModal-CpH0bNo7.js";
11
- import { _ as _sfc_main$6 } from "./LpSelect-DYX2-u5A.js";
11
+ import { _ as _sfc_main$6 } from "./LpSelect-D3pRJfRY.js";
12
12
  import { useFieldControl } from "../composables/useField.js";
13
13
  import { useLabels } from "../composables/useLpConfig.js";
14
14
  import { useMergedAttrs } from "../composables/useMergedClass.js";
@@ -4,7 +4,7 @@ import { _ as _sfc_main$2 } from "./LpButton-BQDAFXBd.js";
4
4
  import { _ as _sfc_main$3 } from "./LpIcon-DkP-9mzK.js";
5
5
  import { _ as _sfc_main$5 } from "./LpScrollArea-Hz3-JWUG.js";
6
6
  import { _ as _sfc_main$4 } from "./LpShift-DXNsauQZ.js";
7
- import { _ as _sfc_main$1 } from "./LpSidebar-D44peKq2.js";
7
+ import { _ as _sfc_main$1 } from "./LpSidebar-Bk7b-K4l.js";
8
8
  import { useMergedAttrs, mergeClass } from "../composables/useMergedClass.js";
9
9
  const _hoisted_1 = ["href"];
10
10
  const _hoisted_2 = { class: "flex min-w-0 flex-1 flex-col" };
@@ -4,7 +4,7 @@ import { useMergedAttrs } from "../composables/useMergedClass.js";
4
4
  import { useNow } from "../composables/useNow.js";
5
5
  import { _ as _sfc_main$6 } from "./LpCheckbox-BoOuLnGB.js";
6
6
  import { _ as _sfc_main$3 } from "./LpCopyButton-Dmq7DmFw.js";
7
- import { _ as _sfc_main$5 } from "./LpCountdown-DTdMF8DL.js";
7
+ import { _ as _sfc_main$5 } from "./LpCountdown-CXrEK0ev.js";
8
8
  import { _ as _sfc_main$4 } from "./LpIcon-DkP-9mzK.js";
9
9
  import { _ as _sfc_main$1 } from "./LpRollingText-DiL717LK.js";
10
10
  import { _ as _sfc_main$2 } from "./RevealToggle-BVFM_FAU.js";
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, openBlock, createElementBlock, renderSlot } from "vue";
2
2
  import { usePaletteScope, createPaletteRegistry, providePaletteScope, usePaletteCommands, bindPaletteScopeElement } from "../composables/usePaletteCommands.js";
3
- import { u as usePaletteTheme } from "./palette-BiY7yQZL.js";
3
+ import { u as usePaletteTheme } from "./palette-Cvxl_1tM.js";
4
4
  const _sfc_main = /* @__PURE__ */ defineComponent({
5
5
  __name: "LpCommandScope",
6
6
  props: {
@@ -2,7 +2,7 @@ import { defineComponent, ref, computed, watch, openBlock, createElementBlock, m
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { useMergedAttrs } from "../composables/useMergedClass.js";
4
4
  import { useNow } from "../composables/useNow.js";
5
- import { _ as _sfc_main$1 } from "./LpProgress-BX33EKkN.js";
5
+ import { _ as _sfc_main$1 } from "./LpProgress-WNaH4emv.js";
6
6
  import { _ as _sfc_main$3 } from "./LpRollingText-DiL717LK.js";
7
7
  import { _ as _sfc_main$2 } from "./LpShift-DXNsauQZ.js";
8
8
  import { DEFAULT_UNIT_LABELS, toEpoch, ceilToSecond, timeParts, resolveFormat, padPart, formatTime, DEFAULT_MILESTONES, crossedMilestone, msToNextSecond } from "../components/timeSpan.js";
@@ -3,7 +3,7 @@ import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { useLocale } from "../composables/useLocale.js";
4
4
  import { useMergedAttrs } from "../composables/useMergedClass.js";
5
5
  import { useRevealedValue } from "../composables/useRevealedValue.js";
6
- import { _ as _sfc_main$1 } from "./LpNumberFlow-5khYxsfX.js";
6
+ import { _ as _sfc_main$1 } from "./LpNumberFlow-Dwb9MV1A.js";
7
7
  import { _ as _sfc_main$2 } from "./LpRollingText-DiL717LK.js";
8
8
  import { capacityThresholds, toneAt, GAUGE_SWEEP, arcPath, meterFraction, polar } from "../components/meter.js";
9
9
  import { toneLook } from "../components/tone.js";
@@ -4,7 +4,7 @@ import { useLabels } from "../composables/useLpConfig.js";
4
4
  import { _ as _sfc_main$2 } from "./LpButton-BQDAFXBd.js";
5
5
  import { _ as _sfc_main$3 } from "./LpIcon-DkP-9mzK.js";
6
6
  import { _ as _sfc_main$1 } from "./LpModal-CpH0bNo7.js";
7
- import { _ as _sfc_main$4 } from "./LpSidebar-D44peKq2.js";
7
+ import { _ as _sfc_main$4 } from "./LpSidebar-Bk7b-K4l.js";
8
8
  const _hoisted_1 = { class: "flex items-center gap-2" };
9
9
  const _sfc_main = /* @__PURE__ */ defineComponent({
10
10
  __name: "LpModalNav",
@@ -3,7 +3,7 @@ import { prefersReducedMotion, easeOut } from "../composables/easing.js";
3
3
  import { useLocale } from "../composables/useLocale.js";
4
4
  import { decimalMark, compactNumber } from "../components/format.js";
5
5
  import { useRevealedValue } from "../composables/useRevealedValue.js";
6
- import '../assets/LpNumberFlow-rZkwQwlU.css';const _hoisted_1 = { class: "sr-only" };
6
+ import '../assets/LpNumberFlow-Chp9pEDe.css';const _hoisted_1 = { class: "sr-only" };
7
7
  const _hoisted_2 = {
8
8
  key: 0,
9
9
  "aria-hidden": "true"
@@ -104,13 +104,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
104
104
  watch(target, travel);
105
105
  onBeforeUnmount(stop);
106
106
  const locale = useLocale(() => props.locale);
107
- const fractionMark = computed(() => props.grouped && !props.format && !props.compact ? decimalMark(locale.value) : ".");
107
+ const fractionMark = computed(() => (props.grouped || props.compact) && !props.format ? decimalMark(locale.value) : ".");
108
108
  const formatted = computed(() => formatAt(round(displayed.value), !settled.value));
109
109
  function formatAt(v, padded) {
110
110
  if (props.format) return props.format(v);
111
111
  if (!Number.isFinite(v)) return String(v);
112
112
  if (props.compact) {
113
- return compactNumber(v, { plainDecimals: 0, fixed: true });
113
+ return compactNumber(v, { plainDecimals: 0, fixed: true, locale: locale.value, words: true });
114
114
  }
115
115
  const pad = padded ? Math.max(1, padTo.value) : 1;
116
116
  if (props.grouped)
@@ -153,7 +153,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
153
153
  const digit = isDigit(char) ? char.charCodeAt(0) - 48 : null;
154
154
  const isPad = leading && digit === 0 && i < intEnd - 1;
155
155
  if (digit !== null && digit !== 0) leading = false;
156
- return { key: keys[i], digit, char, isPad };
156
+ const isGap = digit === null && /\s/.test(char) && isDigit(chars[i - 1] ?? "") && isDigit(chars[i + 1] ?? "");
157
+ return { key: keys[i], digit, char, isPad, isGap };
157
158
  });
158
159
  });
159
160
  const DIGITS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
@@ -180,7 +181,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
180
181
  (openBlock(true), createElementBlock(Fragment, null, renderList(cells.value, (cell) => {
181
182
  return openBlock(), createElementBlock("span", {
182
183
  key: cell.key,
183
- class: normalizeClass(["lp-nf__cell", cell.isPad ? "lp-nf__cell--pad" : ""])
184
+ class: normalizeClass(["lp-nf__cell", { "lp-nf__cell--pad": cell.isPad, "lp-nf__cell--gap": cell.isGap }])
184
185
  }, [
185
186
  cell.digit !== null ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
186
187
  createElementVNode("span", {
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, ref, computed, openBlock, createElementBlock, createElementVNode, createVNode, withCtx, createTextVNode, toDisplayString, unref } from "vue";
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { suppressPaletteDiscovery } from "../composables/usePaletteCommands.js";
4
- import { _ as _sfc_main$4 } from "./LpThemeStudio-B2nPaG-h.js";
4
+ import { _ as _sfc_main$4 } from "./LpThemeStudio-IupHqP0x.js";
5
5
  import { _ as _sfc_main$2 } from "./LpThemeProvider-DcbfOxsU.js";
6
6
  import { _ as _sfc_main$1 } from "./LpButton-BQDAFXBd.js";
7
7
  import { _ as _sfc_main$3 } from "./LpInput-2H-5ILOB.js";
@@ -11,7 +11,8 @@ const _hoisted_3 = { class: "text-sm font-semibold" };
11
11
  const _sfc_main = /* @__PURE__ */ defineComponent({
12
12
  __name: "LpPaletteTheme",
13
13
  props: {
14
- studio: {}
14
+ studio: {},
15
+ hide: {}
15
16
  },
16
17
  setup(__props) {
17
18
  const props = __props;
@@ -93,8 +94,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
93
94
  }, 8, ["theme"]),
94
95
  createVNode(_sfc_main$4, {
95
96
  studio: draft,
97
+ hide: __props.hide,
96
98
  labels: { reset: unref(text).revert }
97
- }, null, 8, ["labels"])
99
+ }, null, 8, ["hide", "labels"])
98
100
  ]);
99
101
  };
100
102
  }
@@ -6,7 +6,7 @@ import { resolveSlices, arcPath, calloutLabels, formatTick } from "../components
6
6
  import { _ as _sfc_main$9 } from "./LegendSwatch-BhRjrtzv.js";
7
7
  import { _ as _sfc_main$4 } from "./LpContextMenu-DXpFJjlO.js";
8
8
  import { _ as _sfc_main$3 } from "./LpEmptyState-CKFTtQgJ.js";
9
- import { _ as _sfc_main$6 } from "./LpNumberFlow-5khYxsfX.js";
9
+ import { _ as _sfc_main$6 } from "./LpNumberFlow-Dwb9MV1A.js";
10
10
  import { _ as _sfc_main$7 } from "./LpRollingText-DiL717LK.js";
11
11
  import { _ as _sfc_main$8 } from "./LpShift-DXNsauQZ.js";
12
12
  import { _ as _sfc_main$2 } from "./LpSkeleton-BB6XIV-w.js";
@@ -2,7 +2,7 @@ import { defineComponent, computed, openBlock, createBlock, unref, mergeProps, w
2
2
  import { ProgressRoot, ProgressIndicator } from "reka-ui";
3
3
  import { useMergedAttrs } from "../composables/useMergedClass.js";
4
4
  import { useRevealedValue } from "../composables/useRevealedValue.js";
5
- import { _ as _sfc_main$1 } from "./LpNumberFlow-5khYxsfX.js";
5
+ import { _ as _sfc_main$1 } from "./LpNumberFlow-Dwb9MV1A.js";
6
6
  import { meterFraction, toneAt, capacityThresholds, METER_HEADER, METER_TRACK } from "../components/meter.js";
7
7
  import { toneLook } from "../components/tone.js";
8
8
  const _hoisted_1 = ["width", "height"];
@@ -4,7 +4,7 @@ import { useLocale } from "../composables/useLocale.js";
4
4
  import { useMergedAttrs } from "../composables/useMergedClass.js";
5
5
  import { useRevealedValue } from "../composables/useRevealedValue.js";
6
6
  import { _ as _sfc_main$2 } from "./LpIcon-DkP-9mzK.js";
7
- import { _ as _sfc_main$1 } from "./LpNumberFlow-5khYxsfX.js";
7
+ import { _ as _sfc_main$1 } from "./LpNumberFlow-Dwb9MV1A.js";
8
8
  import { _ as _sfc_main$3 } from "./LpRollingText-DiL717LK.js";
9
9
  import { METER_HEADER, METER_TRACK } from "../components/meter.js";
10
10
  import { quotaState, quotaSegments, formatAmount } from "../components/quota.js";
@@ -71,9 +71,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
71
71
  setup(__props, { emit: __emit }) {
72
72
  const props = __props;
73
73
  const SIZE_HEIGHT = {
74
- sm: "h-(--size-control-sm)",
75
- md: "h-(--size-control-md)",
76
- lg: "h-(--size-control-lg)"
74
+ sm: "h-(--size-control-sm) text-xs",
75
+ md: "h-(--size-control-md) text-sm",
76
+ lg: "h-(--size-control-lg) text-sm"
77
77
  };
78
78
  const anchorHeight = computed(() => SIZE_HEIGHT[props.size]);
79
79
  const field = useFieldControl(() => ({
@@ -279,7 +279,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
279
279
  onFocusout: unref(onFocusOut),
280
280
  class: normalizeClass([
281
281
  anchorHeight.value,
282
- "group flex w-full items-center gap-2 rounded-control border bg-surface-soft px-3 text-sm text-ink transition-colors duration-[var(--duration-fast)] focus-within:ring-2",
282
+ "group flex w-full items-center gap-2 rounded-control border bg-surface-soft px-3 text-ink transition-colors duration-[var(--duration-fast)] focus-within:ring-2",
283
283
  unref(field).disabled && "cursor-not-allowed opacity-55",
284
284
  unref(field).invalid ? "border-danger focus-within:border-danger focus-within:ring-danger-soft" : "border-line focus-within:border-brand focus-within:ring-ring"
285
285
  ])
@@ -3,7 +3,7 @@ import { usePersisted } from "../composables/usePersisted.js";
3
3
  import { useLabels } from "../composables/useLpConfig.js";
4
4
  import { _ as _sfc_main$3 } from "./LpDrawer-u4rxnuR-.js";
5
5
  import { _ as _sfc_main$1 } from "./LpInput-2H-5ILOB.js";
6
- import { _ as _sfc_main$2 } from "./LpSidebarNav--VwkXO_a.js";
6
+ import { _ as _sfc_main$2 } from "./LpSidebarNav-BR2AW3KT.js";
7
7
  const _hoisted_1 = ["aria-label"];
8
8
  const _hoisted_2 = {
9
9
  key: 2,
@@ -1,6 +1,7 @@
1
1
  import { defineComponent, computed, ref, openBlock, createBlock, mergeProps, unref, withCtx, createElementBlock, createElementVNode, createCommentVNode, Fragment, renderList, toDisplayString, createVNode, normalizeClass, createTextVNode, resolveDynamicComponent, renderSlot } from "vue";
2
2
  import { Motion } from "motion-v";
3
3
  import { CollapsibleRoot, CollapsibleTrigger, CollapsibleContent } from "reka-ui";
4
+ import { useLocale } from "../composables/useLocale.js";
4
5
  import { usePillTransition } from "../composables/usePillTransition.js";
5
6
  import { _ as _sfc_main$4 } from "./LpBadge-C8fKEmTF.js";
6
7
  import { _ as _sfc_main$5 } from "./LpContextMenu-DXpFJjlO.js";
@@ -39,6 +40,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
39
40
  setup(__props, { emit: __emit }) {
40
41
  const props = __props;
41
42
  const emit = __emit;
43
+ const locale = useLocale();
44
+ function badgeText(badge) {
45
+ return typeof badge === "number" ? badge.toLocaleString(locale.value) : badge;
46
+ }
42
47
  function sectionKey(section) {
43
48
  return section.key ?? section.title ?? "";
44
49
  }
@@ -181,7 +186,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
181
186
  class: "relative z-10 shrink-0"
182
187
  }, {
183
188
  default: withCtx(() => [
184
- createTextVNode(toDisplayString(item.badge), 1)
189
+ createTextVNode(toDisplayString(badgeText(item.badge)), 1)
185
190
  ]),
186
191
  _: 2
187
192
  }, 1032, ["tone"])) : createCommentVNode("", true)
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, openBlock, createElementBlock, mergeProps, unref, createElementVNode, createBlock, createCommentVNode, createVNode, Transition, normalizeProps, guardReactiveProps, withCtx, toDisplayString, Fragment, createTextVNode, normalizeClass, renderSlot } from "vue";
2
2
  import { _ as _sfc_main$2 } from "./LpIcon-DkP-9mzK.js";
3
- import { _ as _sfc_main$4 } from "./LpNumberFlow-5khYxsfX.js";
3
+ import { _ as _sfc_main$4 } from "./LpNumberFlow-Dwb9MV1A.js";
4
4
  import { _ as _sfc_main$3 } from "./LpSkeleton-BB6XIV-w.js";
5
5
  import { _ as _sfc_main$1 } from "./LpStatus-BQU1TUsv.js";
6
6
  import { useMergedAttrs } from "../composables/useMergedClass.js";
@@ -8,8 +8,8 @@ import { TONES } from "../components/tone.js";
8
8
  const _hoisted_1 = { class: "flex items-center gap-2" };
9
9
  const _hoisted_2 = { class: "text-[11px] font-semibold uppercase tracking-[0.08em] text-muted" };
10
10
  const _hoisted_3 = { key: 1 };
11
- const _hoisted_4 = { class: "flex items-baseline gap-2" };
12
- const _hoisted_5 = { class: "font-mono text-3xl font-medium tracking-tight text-ink" };
11
+ const _hoisted_4 = { class: "flex flex-wrap items-baseline gap-x-2" };
12
+ const _hoisted_5 = { class: "whitespace-nowrap font-mono text-3xl font-medium tracking-tight text-ink" };
13
13
  const _hoisted_6 = { key: "loading" };
14
14
  const _hoisted_7 = { key: "value" };
15
15
  const _hoisted_8 = {
@@ -141,7 +141,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
141
141
  createVNode(_sfc_main$3, { class: "inline-block h-[0.9em] w-10 align-middle" })
142
142
  ])) : showDelta.value ? (openBlock(), createElementBlock("span", {
143
143
  key: 1,
144
- class: normalizeClass(["inline-flex items-center gap-0.5 text-sm font-medium tabular-nums", trendColor.value])
144
+ class: normalizeClass(["inline-flex items-center gap-0.5 whitespace-nowrap text-sm font-medium tabular-nums", trendColor.value])
145
145
  }, [
146
146
  createVNode(_sfc_main$2, {
147
147
  name: trendIcon.value,
@@ -1,5 +1,5 @@
1
1
  import { shallowRef, computed, ref, watch, watchEffect, defineComponent, openBlock, createElementBlock, createElementVNode, toDisplayString, unref, createBlock, withCtx, createVNode, createTextVNode, createCommentVNode, renderSlot, normalizeClass, normalizeStyle, Fragment, renderList } from "vue";
2
- import { u as usePaletteTheme } from "./palette-BiY7yQZL.js";
2
+ import { u as usePaletteTheme } from "./palette-Cvxl_1tM.js";
3
3
  import { useLabels } from "../composables/useLpConfig.js";
4
4
  import { usePersisted } from "../composables/usePersisted.js";
5
5
  import { parseColor, rgbToHex } from "../components/color.js";
@@ -250,7 +250,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
250
250
  return r ? { x: r.left + r.width / 2, y: r.top + r.height / 2 } : void 0;
251
251
  }
252
252
  const tuneTo = (key, value) => studio.tune({ [key]: value });
253
- usePaletteTheme(() => studio ?? void 0);
253
+ usePaletteTheme(() => studio ?? void 0, { hide: props.hide });
254
254
  return (_ctx, _cache) => {
255
255
  return openBlock(), createElementBlock("div", _hoisted_1, [
256
256
  createElementVNode("div", _hoisted_2, [
@@ -1,10 +1,10 @@
1
1
  import { defineComponent, ref, useId, computed, onMounted, openBlock, createBlock, unref, withCtx, createVNode, createElementVNode, normalizeClass, createElementBlock, createCommentVNode, renderSlot, normalizeProps, guardReactiveProps } from "vue";
2
- import { u as usePaletteTheme } from "./palette-BiY7yQZL.js";
2
+ import { u as usePaletteTheme } from "./palette-Cvxl_1tM.js";
3
3
  import { PopoverRoot, PopoverAnchor, PopoverPortal, PopoverContent } from "reka-ui";
4
4
  import { useLabels } from "../composables/useLpConfig.js";
5
5
  import { usePortalTarget, useOutsideGuard } from "../composables/useView.js";
6
6
  import { u as useTheme, p as presets } from "./useTheme-BOV_-AiY.js";
7
- import { u as useThemeStudio, S as STUDIO_SYSTEM, _ as _sfc_main$5 } from "./LpThemeStudio-B2nPaG-h.js";
7
+ import { u as useThemeStudio, S as STUDIO_SYSTEM, _ as _sfc_main$5 } from "./LpThemeStudio-IupHqP0x.js";
8
8
  import { POPOVER_PANEL } from "../components/dropdown.js";
9
9
  import { _ as _sfc_main$1 } from "./LpContextMenu-DXpFJjlO.js";
10
10
  import { _ as _sfc_main$2 } from "./LpIcon-DkP-9mzK.js";
@@ -125,6 +125,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
125
125
  if (!pair) return;
126
126
  if (tuner) {
127
127
  tuner.pickTheme(STUDIO_SYSTEM);
128
+ emit("update:modelValue", STUDIO_SYSTEM);
128
129
  emit("change", tuner.theme.value);
129
130
  return;
130
131
  }
@@ -169,7 +170,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
169
170
  const triggerLabel = computed(
170
171
  () => props["aria-label"] ?? text.value.trigger.replace("{name}", labelName.value)
171
172
  );
172
- usePaletteTheme(() => tuner ?? void 0);
173
+ usePaletteTheme(() => tuner ?? void 0, { hide: props.studioHide });
173
174
  return (_ctx, _cache) => {
174
175
  return openBlock(), createBlock(unref(PopoverRoot), {
175
176
  open: studioOpen.value,
@@ -1,4 +1,4 @@
1
- import { defineComponent, h, markRaw, computed, watch, openBlock, createBlock, unref, withCtx, createVNode, createCommentVNode, normalizeClass, createElementVNode, createElementBlock, Fragment, renderList, createTextVNode, toDisplayString, renderSlot } from "vue";
1
+ import { defineComponent, h, markRaw, computed, watch, ref, openBlock, createBlock, unref, withCtx, createVNode, createCommentVNode, normalizeClass, createElementVNode, createElementBlock, Fragment, renderList, createTextVNode, toDisplayString, renderSlot } from "vue";
2
2
  import { Background } from "@vue-flow/background";
3
3
  import { Controls } from "@vue-flow/controls";
4
4
  import { MarkerType, useVueFlow, VueFlow, SelectionMode, Panel } from "@vue-flow/core";
@@ -7,14 +7,15 @@ import { _ as _sfc_main$3 } from "./LpInfraNode-yTh4-5qa.js";
7
7
  import { _ as _sfc_main$1 } from "./LpLaneNode-HtnQf2FF.js";
8
8
  import { _ as _sfc_main$2 } from "./LpServiceNode-D8uJ8sGk.js";
9
9
  import { _ as _sfc_main$4 } from "./LpWaypointEdge-D8yHlQiw.js";
10
- const _hoisted_1 = { class: "flex flex-col gap-1.5 rounded-card border border-line bg-surface-overlay/90 px-3 py-2 text-[11px] backdrop-blur" };
11
- const _hoisted_2 = {
10
+ const _hoisted_1 = {
12
11
  width: "22",
13
12
  height: "6",
14
13
  class: "shrink-0",
15
14
  "aria-hidden": "true"
16
15
  };
17
- const _hoisted_3 = ["stroke", "stroke-width", "stroke-dasharray"];
16
+ const _hoisted_2 = ["stroke", "stroke-width", "stroke-dasharray"];
17
+ const MINIMAP_HEIGHT = 165;
18
+ const FRAME = 24;
18
19
  const _sfc_main = /* @__PURE__ */ defineComponent({
19
20
  __name: "LpTopologyCanvas",
20
21
  props: {
@@ -141,7 +142,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
141
142
  onMoveEnd,
142
143
  getSelectedNodes,
143
144
  fitView,
144
- setViewport
145
+ setViewport,
146
+ onNodesInitialized
145
147
  } = useVueFlow();
146
148
  onNodeClick(({ node }) => emit("node-select", node.id));
147
149
  onNodeDoubleClick(({ node }) => emit("node-activate", node.id));
@@ -188,10 +190,32 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
188
190
  });
189
191
  onPaneClick(() => emit("pane-click"));
190
192
  onConnect((conn) => emit("connect", conn));
193
+ const legendBox = ref(null);
194
+ function framePadding() {
195
+ const wide = typeof window === "undefined" || window.matchMedia("(min-width: 640px)").matches;
196
+ const legendHeight = wide && props.legend ? (legendBox.value?.offsetHeight ?? 0) + 15 : 0;
197
+ const legendTop = props.legendPosition.startsWith("top");
198
+ const bottom = Math.max(legendTop ? 0 : legendHeight, wide && props.minimap ? MINIMAP_HEIGHT : 0);
199
+ return {
200
+ top: `${FRAME + (legendTop ? legendHeight : 0)}px`,
201
+ bottom: `${FRAME + bottom}px`,
202
+ left: `${FRAME}px`,
203
+ right: `${FRAME}px`
204
+ };
205
+ }
206
+ function fitFramed(params = {}) {
207
+ return fitView({ padding: framePadding(), ...params });
208
+ }
209
+ let fitted = false;
210
+ onNodesInitialized(() => {
211
+ if (fitted) return;
212
+ fitted = true;
213
+ void fitFramed();
214
+ });
191
215
  async function applyViewport(v) {
192
216
  await setViewport({ x: v.x, y: v.y, zoom: v.zoom });
193
217
  }
194
- __expose({ fitView, setViewport: applyViewport });
218
+ __expose({ fitView: fitFramed, setViewport: applyViewport });
195
219
  return (_ctx, _cache) => {
196
220
  return openBlock(), createBlock(unref(VueFlow), {
197
221
  nodes: flowNodes.value,
@@ -207,7 +231,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
207
231
  "default-viewport": { zoom: 0.9 },
208
232
  "min-zoom": 0.3,
209
233
  "max-zoom": 2,
210
- "fit-view-on-init": "",
211
234
  class: "lp-topology"
212
235
  }, {
213
236
  default: withCtx(() => [
@@ -224,20 +247,27 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
224
247
  "node-color": "var(--color-surface-soft)",
225
248
  "mask-color": "rgba(0,0,0,0.55)"
226
249
  })) : createCommentVNode("", true),
227
- __props.controls ? (openBlock(), createBlock(unref(Controls), { key: 1 })) : createCommentVNode("", true),
250
+ __props.controls ? (openBlock(), createBlock(unref(Controls), {
251
+ key: 1,
252
+ "fit-view-params": { padding: framePadding() }
253
+ }, null, 8, ["fit-view-params"])) : createCommentVNode("", true),
228
254
  __props.legend ? (openBlock(), createBlock(unref(Panel), {
229
255
  key: 2,
230
256
  position: __props.legendPosition,
231
257
  class: normalizeClass([legendOffset.value, "max-sm:hidden"])
232
258
  }, {
233
259
  default: withCtx(() => [
234
- createElementVNode("div", _hoisted_1, [
260
+ createElementVNode("div", {
261
+ ref_key: "legendBox",
262
+ ref: legendBox,
263
+ class: "flex flex-col gap-1.5 rounded-card border border-line bg-surface-overlay/90 px-3 py-2 text-[11px] backdrop-blur"
264
+ }, [
235
265
  (openBlock(true), createElementBlock(Fragment, null, renderList(legendItems.value, (l) => {
236
266
  return openBlock(), createElementBlock("div", {
237
267
  key: l.label,
238
268
  class: "flex items-center gap-2 text-muted"
239
269
  }, [
240
- (openBlock(), createElementBlock("svg", _hoisted_2, [
270
+ (openBlock(), createElementBlock("svg", _hoisted_1, [
241
271
  createElementVNode("line", {
242
272
  x1: "0",
243
273
  y1: "3",
@@ -247,13 +277,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
247
277
  "stroke-width": l.width,
248
278
  "stroke-dasharray": l.dash,
249
279
  "stroke-linecap": "round"
250
- }, null, 8, _hoisted_3)
280
+ }, null, 8, _hoisted_2)
251
281
  ])),
252
282
  createTextVNode(" " + toDisplayString(l.label), 1)
253
283
  ]);
254
284
  }), 128)),
255
285
  renderSlot(_ctx.$slots, "legend-extra")
256
- ])
286
+ ], 512)
257
287
  ]),
258
288
  _: 3
259
289
  }, 8, ["position", "class"])) : createCommentVNode("", true)
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, computed, ref, openBlock, createElementBlock, mergeProps, unref, toDisplayString, createCommentVNode, createElementVNode, createVNode, withCtx, createBlock, Fragment, renderList, normalizeStyle, createTextVNode } from "vue";
2
- import { _ as _sfc_main$6 } from "./LpNumberFlow-5khYxsfX.js";
2
+ import { _ as _sfc_main$6 } from "./LpNumberFlow-Dwb9MV1A.js";
3
3
  import { _ as _sfc_main$5 } from "./LpRollingText-DiL717LK.js";
4
4
  import { _ as _sfc_main$4 } from "./LpShift-DXNsauQZ.js";
5
5
  import { _ as _sfc_main$2 } from "./LpSkeleton-BB6XIV-w.js";
@@ -9,7 +9,7 @@ function usePaletteTheme(studio, options = {}) {
9
9
  const current = toValue(studio);
10
10
  return current && "preview" in current && typeof current.preview === "function" ? current : void 0;
11
11
  };
12
- const preview = defineComponent({ setup: () => () => currentStudio() ? h(Editor, { studio: currentStudio() }) : null });
12
+ const preview = defineComponent({ setup: () => () => currentStudio() ? h(Editor, { studio: currentStudio(), hide: options.hide }) : null });
13
13
  usePaletteCommands(() => {
14
14
  const current = currentStudio();
15
15
  if (!current) return [];
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpAddressInput-CD0bzrt-.js";
1
+ import { _ as _sfc_main } from "../chunks/LpAddressInput-Bu6ws3Fp.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpAppShell-1RmBp6xQ.js";
1
+ import { _ as _sfc_main } from "../chunks/LpAppShell-C5YW5pI7.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };