@leavepulse/ui 0.72.4 → 0.72.8

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 (58) hide show
  1. package/dist/assets/{LpNumberFlow-Chp9pEDe.css → LpNumberFlow-P1balINP.css} +1 -1
  2. package/dist/chunks/{LpAppShell-D1-On_5L.js → LpAppShell-CPCG0I-c.js} +23 -12
  3. package/dist/chunks/{LpCodeDisplay-AQx-3nNb.js → LpCodeDisplay-CE9TxCA4.js} +1 -1
  4. package/dist/chunks/{LpCommandScope-BlKcgBnK.js → LpCommandScope-CtUhJe8T.js} +1 -1
  5. package/dist/chunks/{LpCountdown-BxE7stYk.js → LpCountdown-DgeY3cLG.js} +1 -1
  6. package/dist/chunks/{LpGauge-BO1PYYqD.js → LpGauge-KZaQ_FDR.js} +1 -1
  7. package/dist/chunks/{LpModalNav-CE3iLnxB.js → LpModalNav-DQpV2kdn.js} +1 -1
  8. package/dist/chunks/{LpNumberFlow-CcxEGUy0.js → LpNumberFlow-Vqj0tP7B.js} +1 -1
  9. package/dist/chunks/{LpPaletteTheme-CdEEMMEF.js → LpPaletteTheme-DiLYKQiZ.js} +1 -1
  10. package/dist/chunks/{LpPie-Mr3EtFEd.js → LpPie-DrZepi0p.js} +1 -1
  11. package/dist/chunks/{LpProgress-rOlyafqp.js → LpProgress-Yr6ONG5t.js} +1 -1
  12. package/dist/chunks/{LpQuota-B12yijdB.js → LpQuota-Dk2MyI2Z.js} +1 -1
  13. package/dist/chunks/{LpSidebar-BciLMBgY.js → LpSidebar-BoNLKgh-.js} +1 -1
  14. package/dist/chunks/{LpSidebarNav-HYcG-ib8.js → LpSidebarNav-Bky8chrv.js} +1 -1
  15. package/dist/chunks/{LpSidebarRow-Di2VYz-Z.js → LpSidebarRow-BRYhNDSo.js} +1 -1
  16. package/dist/chunks/{LpStat-D6V6Fdfc.js → LpStat-BVf2UvEc.js} +1 -1
  17. package/dist/chunks/{LpThemeStudio-BJDKf3_Z.js → LpThemeStudio-BpORDvH6.js} +1 -1
  18. package/dist/chunks/{LpThemeSwitcher-BDrIJswA.js → LpThemeSwitcher-BnEn_mvf.js} +2 -2
  19. package/dist/chunks/{LpUptimeBar-BtkZRwY0.js → LpUptimeBar-DqNvvMBK.js} +1 -1
  20. package/dist/chunks/{palette-Cvxl_1tM.js → palette-Co8tSASo.js} +1 -1
  21. package/dist/components/LpAppShell.vue.d.ts +0 -2
  22. package/dist/components/LpAppShell.vue.js +1 -1
  23. package/dist/components/LpCodeDisplay.vue.js +1 -1
  24. package/dist/components/LpCommandScope.vue.js +1 -1
  25. package/dist/components/LpCountdown.vue.js +1 -1
  26. package/dist/components/LpGauge.vue.js +1 -1
  27. package/dist/components/LpModalNav.vue.js +1 -1
  28. package/dist/components/LpNumberFlow.vue.js +1 -1
  29. package/dist/components/LpPaletteStats.vue.js +1 -1
  30. package/dist/components/LpPaletteTheme.vue.js +1 -1
  31. package/dist/components/LpPie.vue.js +1 -1
  32. package/dist/components/LpProgress.vue.js +1 -1
  33. package/dist/components/LpQuota.vue.js +1 -1
  34. package/dist/components/LpSidebar.vue.js +1 -1
  35. package/dist/components/LpSidebarNav.vue.js +1 -1
  36. package/dist/components/LpSidebarRow.vue.js +1 -1
  37. package/dist/components/LpStat.vue.js +1 -1
  38. package/dist/components/LpThemeStudio.vue.js +1 -1
  39. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  40. package/dist/components/LpUptimeBar.vue.js +1 -1
  41. package/dist/components/commandSearch.d.ts +2 -1
  42. package/dist/components/commandSearch.js +15 -6
  43. package/dist/components/format.d.ts +6 -6
  44. package/dist/components/quota.d.ts +1 -1
  45. package/dist/components/timeSpan.d.ts +1 -1
  46. package/dist/index.js +17 -17
  47. package/dist/theme/palette.d.ts +2 -1
  48. package/package.json +1 -1
  49. package/src/components/LpAppShell.vue +16 -7
  50. package/src/components/LpNumberFlow.vue +3 -3
  51. package/src/components/LpStat.vue +1 -1
  52. package/src/components/commandSearch.ts +17 -6
  53. package/src/components/format.ts +9 -9
  54. package/src/components/quota.ts +1 -1
  55. package/src/components/timeSpan.ts +1 -1
  56. package/src/composables/useLocale.ts +1 -1
  57. package/src/nuxt.ts +1 -14
  58. package/src/theme/palette.ts +3 -3
@@ -81,7 +81,7 @@
81
81
  /* Faded, so a held-open column reads as an empty wheel rather than a zero the
82
82
  number actually has. */
83
83
  /*
84
- * A space separator (ru, fr, …) takes a whole column in a monospaced or
84
+ * A space separator (fr, pl, …) takes a whole column in a monospaced or
85
85
  * tabular face, so "7 271" read as "7 271". It is drawn as the narrow gap
86
86
  * the locale means.
87
87
  */
@@ -1,20 +1,16 @@
1
- import { defineComponent, computed, useModel, ref, useId, watch, openBlock, createElementBlock, mergeProps, unref, createElementVNode, withModifiers, toDisplayString, createVNode, createSlots, withCtx, renderSlot, normalizeProps, guardReactiveProps, normalizeClass, createBlock, createCommentVNode, mergeModels } from "vue";
1
+ import { defineComponent, computed, useModel, ref, useId, onMounted, watch, openBlock, createElementBlock, mergeProps, unref, createElementVNode, withModifiers, toDisplayString, createVNode, createSlots, withCtx, renderSlot, normalizeProps, guardReactiveProps, normalizeClass, withDirectives, vShow, createBlock, Teleport, createCommentVNode, mergeModels } from "vue";
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { _ as _sfc_main$6 } from "./LpBottomNav-CbNQQPuL.js";
4
4
  import { _ as _sfc_main$2 } from "./LpButton-CFb44IjC.js";
5
5
  import { _ as _sfc_main$3 } from "./LpIcon--5WSb3jJ.js";
6
6
  import { _ as _sfc_main$5 } from "./LpScrollArea-Hz3-JWUG.js";
7
7
  import { _ as _sfc_main$4 } from "./LpShift-CCq7dofl.js";
8
- import { _ as _sfc_main$1 } from "./LpSidebar-BciLMBgY.js";
8
+ import { _ as _sfc_main$1 } from "./LpSidebar-BoNLKgh-.js";
9
9
  import { useMergedAttrs, mergeClass } from "../composables/useMergedClass.js";
10
10
  const _hoisted_1 = ["href"];
11
11
  const _hoisted_2 = { class: "flex min-w-0 flex-1 flex-col" };
12
12
  const _hoisted_3 = { class: "relative flex h-16 shrink-0 items-center gap-3 border-b border-line bg-surface px-4 md:px-6" };
13
13
  const _hoisted_4 = { class: "truncate text-lg font-semibold" };
14
- const _hoisted_5 = {
15
- key: 0,
16
- class: "min-h-0 flex-1 overflow-hidden"
17
- };
18
14
  const __default__ = { inheritAttrs: false };
19
15
  const _sfc_main = /* @__PURE__ */ defineComponent({
20
16
  ...__default__,
@@ -80,6 +76,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
80
76
  () => props.labels
81
77
  );
82
78
  const scrollArea = ref(null);
79
+ const bleedId = `lp-shell-bleed-${useId()}`;
80
+ const mounted = ref(false);
81
+ onMounted(() => mounted.value = true);
82
+ const bleeding = computed(() => props.fullBleed && mounted.value);
83
83
  const mainId = `lp-main-${useId()}`;
84
84
  function skipToMain() {
85
85
  document.getElementById(mainId)?.focus();
@@ -237,20 +237,31 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
237
237
  tabindex: "-1",
238
238
  class: "flex min-h-0 flex-1 flex-col outline-none"
239
239
  }, [
240
- __props.fullBleed ? (openBlock(), createElementBlock("div", _hoisted_5, [
241
- renderSlot(_ctx.$slots, "default")
242
- ])) : (openBlock(), createBlock(_sfc_main$5, {
243
- key: 1,
240
+ withDirectives(createElementVNode("div", {
241
+ id: bleedId,
242
+ class: "min-h-0 flex-1 overflow-hidden"
243
+ }, null, 512), [
244
+ [vShow, bleeding.value]
245
+ ]),
246
+ withDirectives(createVNode(_sfc_main$5, {
244
247
  ref_key: "scrollArea",
245
248
  ref: scrollArea,
246
249
  class: "min-h-0 flex-1",
247
250
  "content-class": unref(mergeClass)("px-4 py-6 md:px-6", __props.contentClass)
248
251
  }, {
249
252
  default: withCtx(() => [
250
- renderSlot(_ctx.$slots, "default")
253
+ (openBlock(), createBlock(Teleport, {
254
+ to: `#${bleedId}`,
255
+ disabled: !bleeding.value,
256
+ defer: ""
257
+ }, [
258
+ renderSlot(_ctx.$slots, "default")
259
+ ], 8, ["to", "disabled"]))
251
260
  ]),
252
261
  _: 3
253
- }, 8, ["content-class"]))
262
+ }, 8, ["content-class"]), [
263
+ [vShow, !bleeding.value]
264
+ ])
254
265
  ]),
255
266
  __props.bottomNav ? (openBlock(), createBlock(_sfc_main$6, {
256
267
  key: 0,
@@ -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-Cs4SHaHX.js";
6
6
  import { _ as _sfc_main$3 } from "./LpCopyButton-xF7wFVoU.js";
7
- import { _ as _sfc_main$5 } from "./LpCountdown-BxE7stYk.js";
7
+ import { _ as _sfc_main$5 } from "./LpCountdown-DgeY3cLG.js";
8
8
  import { _ as _sfc_main$4 } from "./LpIcon--5WSb3jJ.js";
9
9
  import { _ as _sfc_main$1 } from "./LpRollingText-B54Pje7P.js";
10
10
  import { _ as _sfc_main$2 } from "./RevealToggle-BEit1n6Z.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-Cvxl_1tM.js";
3
+ import { u as usePaletteTheme } from "./palette-Co8tSASo.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-rOlyafqp.js";
5
+ import { _ as _sfc_main$1 } from "./LpProgress-Yr6ONG5t.js";
6
6
  import { _ as _sfc_main$3 } from "./LpRollingText-B54Pje7P.js";
7
7
  import { _ as _sfc_main$2 } from "./LpShift-CCq7dofl.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-CcxEGUy0.js";
6
+ import { _ as _sfc_main$1 } from "./LpNumberFlow-Vqj0tP7B.js";
7
7
  import { _ as _sfc_main$2 } from "./LpRollingText-B54Pje7P.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-CFb44IjC.js";
5
5
  import { _ as _sfc_main$3 } from "./LpIcon--5WSb3jJ.js";
6
6
  import { _ as _sfc_main$1 } from "./LpModal-BnjZ2iem.js";
7
- import { _ as _sfc_main$4 } from "./LpSidebar-BciLMBgY.js";
7
+ import { _ as _sfc_main$4 } from "./LpSidebar-BoNLKgh-.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-Chp9pEDe.css';const _hoisted_1 = { class: "sr-only" };
6
+ import '../assets/LpNumberFlow-P1balINP.css';const _hoisted_1 = { class: "sr-only" };
7
7
  const _hoisted_2 = {
8
8
  key: 0,
9
9
  "aria-hidden": "true",
@@ -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-BJDKf3_Z.js";
4
+ import { _ as _sfc_main$4 } from "./LpThemeStudio-BpORDvH6.js";
5
5
  import { _ as _sfc_main$2 } from "./LpThemeProvider-8MG6yqU9.js";
6
6
  import { _ as _sfc_main$1 } from "./LpButton-CFb44IjC.js";
7
7
  import { _ as _sfc_main$3 } from "./LpInput-Tw-yxT4I.js";
@@ -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-rx2tCjwk.js";
8
8
  import { _ as _sfc_main$3 } from "./LpEmptyState-EQHiRYhG.js";
9
- import { _ as _sfc_main$6 } from "./LpNumberFlow-CcxEGUy0.js";
9
+ import { _ as _sfc_main$6 } from "./LpNumberFlow-Vqj0tP7B.js";
10
10
  import { _ as _sfc_main$7 } from "./LpRollingText-B54Pje7P.js";
11
11
  import { _ as _sfc_main$8 } from "./LpShift-CCq7dofl.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-CcxEGUy0.js";
5
+ import { _ as _sfc_main$1 } from "./LpNumberFlow-Vqj0tP7B.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--5WSb3jJ.js";
7
- import { _ as _sfc_main$1 } from "./LpNumberFlow-CcxEGUy0.js";
7
+ import { _ as _sfc_main$1 } from "./LpNumberFlow-Vqj0tP7B.js";
8
8
  import { _ as _sfc_main$3 } from "./LpRollingText-B54Pje7P.js";
9
9
  import { METER_HEADER, METER_TRACK } from "../components/meter.js";
10
10
  import { quotaState, quotaSegments, formatAmount } from "../components/quota.js";
@@ -6,7 +6,7 @@ import { _ as _sfc_main$5 } from "./LpDrawer-RRamxbLV.js";
6
6
  import { _ as _sfc_main$2 } from "./LpIcon--5WSb3jJ.js";
7
7
  import { _ as _sfc_main$3 } from "./LpInput-Tw-yxT4I.js";
8
8
  import { _ as _sfc_main$1 } from "./LpTooltip-BcBvIx4z.js";
9
- import { _ as _sfc_main$4 } from "./LpSidebarNav-HYcG-ib8.js";
9
+ import { _ as _sfc_main$4 } from "./LpSidebarNav-Bky8chrv.js";
10
10
  const _hoisted_1 = ["data-compact", "aria-label"];
11
11
  const _hoisted_2 = {
12
12
  key: 0,
@@ -10,7 +10,7 @@ import '../assets/MenuShortcut-Cyub0frr.css';import '../assets/LpKeys-C5VMcBOW.c
10
10
  /* empty css */
11
11
  import { _ as _sfc_main$2 } from "./LpScrollArea-Hz3-JWUG.js";
12
12
  import { _ as _sfc_main$1 } from "./LpSkeleton-BB6XIV-w.js";
13
- import { _ as _sfc_main$3 } from "./LpSidebarRow-Di2VYz-Z.js";
13
+ import { _ as _sfc_main$3 } from "./LpSidebarRow-BRYhNDSo.js";
14
14
  import { waiting } from "../components/sidebar.js";
15
15
  import { useMergedAttrs } from "../composables/useMergedClass.js";
16
16
  const _hoisted_1 = {
@@ -8,7 +8,7 @@ import { _ as _sfc_main$4 } from "./LpContextMenu-rx2tCjwk.js";
8
8
  import { _ as _sfc_main$1 } from "./LpHoverCard-spGxyw7T.js";
9
9
  import { _ as _sfc_main$3 } from "./LpIcon--5WSb3jJ.js";
10
10
  import LpKeys from "../components/LpKeys.vue.js";
11
- import { _ as _sfc_main$5 } from "./LpNumberFlow-CcxEGUy0.js";
11
+ import { _ as _sfc_main$5 } from "./LpNumberFlow-Vqj0tP7B.js";
12
12
  import { waiting } from "../components/sidebar.js";
13
13
  import { resolveLink } from "../components/link.js";
14
14
  const _hoisted_1 = { class: "relative flex flex-col" };
@@ -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--5WSb3jJ.js";
3
- import { _ as _sfc_main$4 } from "./LpNumberFlow-CcxEGUy0.js";
3
+ import { _ as _sfc_main$4 } from "./LpNumberFlow-Vqj0tP7B.js";
4
4
  import { _ as _sfc_main$3 } from "./LpSkeleton-BB6XIV-w.js";
5
5
  import { _ as _sfc_main$1 } from "./LpStatus-DglxttQ7.js";
6
6
  import { useMergedAttrs } from "../composables/useMergedClass.js";
@@ -1,5 +1,5 @@
1
1
  import { shallowRef, computed, ref, watch, watchEffect, defineComponent, openBlock, createElementBlock, unref, createElementVNode, toDisplayString, createBlock, withCtx, createVNode, createTextVNode, createCommentVNode, renderSlot, normalizeClass, Fragment, renderList, normalizeStyle, h } from "vue";
2
- import { u as usePaletteTheme } from "./palette-Cvxl_1tM.js";
2
+ import { u as usePaletteTheme } from "./palette-Co8tSASo.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";
@@ -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-Cvxl_1tM.js";
2
+ import { u as usePaletteTheme } from "./palette-Co8tSASo.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 "./LpThemeProvider-8MG6yqU9.js";
7
- import { u as useThemeStudio, S as STUDIO_SYSTEM, _ as _sfc_main$5 } from "./LpThemeStudio-BJDKf3_Z.js";
7
+ import { u as useThemeStudio, S as STUDIO_SYSTEM, _ as _sfc_main$5 } from "./LpThemeStudio-BpORDvH6.js";
8
8
  import { POPOVER_PANEL } from "../components/dropdown.js";
9
9
  import { _ as _sfc_main$1 } from "./LpContextMenu-rx2tCjwk.js";
10
10
  import { _ as _sfc_main$2 } from "./LpIcon--5WSb3jJ.js";
@@ -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-CcxEGUy0.js";
2
+ import { _ as _sfc_main$6 } from "./LpNumberFlow-Vqj0tP7B.js";
3
3
  import { _ as _sfc_main$5 } from "./LpRollingText-B54Pje7P.js";
4
4
  import { _ as _sfc_main$4 } from "./LpShift-CCq7dofl.js";
5
5
  import { _ as _sfc_main$2 } from "./LpSkeleton-BB6XIV-w.js";
@@ -18,7 +18,7 @@ function usePaletteTheme(studio, options = {}) {
18
18
  label: options.label ?? text.value.title,
19
19
  icon: "lucide:palette",
20
20
  description: current.theme.value.name,
21
- keywords: ["theme", "appearance", "accent", "density", "тема", "цвет", "плотность"],
21
+ keywords: ["theme", "appearance", "accent", "density", ...options.keywords ?? []],
22
22
  previewComponent: preview,
23
23
  editInPreview: true
24
24
  }];
@@ -187,8 +187,6 @@ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<{
187
187
  'header-actions'?: (props: {}) => any;
188
188
  } & {
189
189
  default?: (props: {}) => any;
190
- } & {
191
- default?: (props: {}) => any;
192
190
  } & {
193
191
  overlays?: (props: {}) => any;
194
192
  }>;
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpAppShell-D1-On_5L.js";
1
+ import { _ as _sfc_main } from "../chunks/LpAppShell-CPCG0I-c.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpCodeDisplay-AQx-3nNb.js";
1
+ import { _ as _sfc_main } from "../chunks/LpCodeDisplay-CE9TxCA4.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpCommandScope-BlKcgBnK.js";
1
+ import { _ as _sfc_main } from "../chunks/LpCommandScope-CtUhJe8T.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpCountdown-BxE7stYk.js";
1
+ import { _ as _sfc_main } from "../chunks/LpCountdown-DgeY3cLG.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpGauge-BO1PYYqD.js";
1
+ import { _ as _sfc_main } from "../chunks/LpGauge-KZaQ_FDR.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpModalNav-CE3iLnxB.js";
1
+ import { _ as _sfc_main } from "../chunks/LpModalNav-DQpV2kdn.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpNumberFlow-CcxEGUy0.js";
1
+ import { _ as _sfc_main } from "../chunks/LpNumberFlow-Vqj0tP7B.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, computed, openBlock, createElementBlock, normalizeStyle, Fragment, renderList, createElementVNode, createBlock, createTextVNode, toDisplayString, createCommentVNode, normalizeClass } from "vue";
2
- import { _ as _sfc_main$2 } from "../chunks/LpNumberFlow-CcxEGUy0.js";
2
+ import { _ as _sfc_main$2 } from "../chunks/LpNumberFlow-Vqj0tP7B.js";
3
3
  import { _ as _sfc_main$3 } from "../chunks/LpRollingText-B54Pje7P.js";
4
4
  import { _ as _sfc_main$1 } from "../chunks/LpSkeleton-BB6XIV-w.js";
5
5
  import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpPaletteTheme-CdEEMMEF.js";
1
+ import { _ as _sfc_main } from "../chunks/LpPaletteTheme-DiLYKQiZ.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpPie-Mr3EtFEd.js";
1
+ import { _ as _sfc_main } from "../chunks/LpPie-DrZepi0p.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpProgress-rOlyafqp.js";
1
+ import { _ as _sfc_main } from "../chunks/LpProgress-Yr6ONG5t.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpQuota-B12yijdB.js";
1
+ import { _ as _sfc_main } from "../chunks/LpQuota-Dk2MyI2Z.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebar-BciLMBgY.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebar-BoNLKgh-.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebarNav-HYcG-ib8.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebarNav-Bky8chrv.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebarRow-Di2VYz-Z.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebarRow-BRYhNDSo.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpStat-D6V6Fdfc.js";
1
+ import { _ as _sfc_main } from "../chunks/LpStat-BVf2UvEc.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeStudio-BJDKf3_Z.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeStudio-BpORDvH6.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-BDrIJswA.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-BnEn_mvf.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpUptimeBar-BtkZRwY0.js";
1
+ import { _ as _sfc_main } from "../chunks/LpUptimeBar-DqNvvMBK.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -10,7 +10,8 @@ export interface CommandSearchTerms {
10
10
  groups: string[];
11
11
  }
12
12
  export declare function parseCommandQuery(value: string): CommandSearchTerms;
13
- export declare function swapCommandLayout(value: string): string;
13
+ /** The query as if typed on the other layout: Latin to Ukrainian by default, `layout` 1 for the other Cyrillic one. */
14
+ export declare function swapCommandLayout(value: string, layout?: number): string;
14
15
  export declare function searchCommandItems<T extends SearchableCommand>(items: T[], terms: CommandSearchTerms): {
15
16
  items: T[];
16
17
  terms: string[];
@@ -48,19 +48,28 @@ function rankExact(items, terms) {
48
48
  return items.map((command) => ({ command, score: score(command, terms) })).filter((entry) => entry.score > 0).sort((a, b) => b.score - a.score || a.command.label.localeCompare(b.command.label)).map((entry) => entry.command);
49
49
  }
50
50
  const LATIN_KEYS = "`qwertyuiop[]asdfghjkl;'zxcvbnm,.";
51
- const CYRILLIC_KEYS = "ёйцукенгшщзхъфывапролджэячсмитьбю";
52
- const LAYOUT_KEYS = new Map([...LATIN_KEYS].flatMap((key, i) => [[key, CYRILLIC_KEYS[i]], [CYRILLIC_KEYS[i], key]]));
53
- function swapCommandLayout(value) {
51
+ const CYRILLIC_LAYOUTS = ["ґйцукенгшщзхїфівапролджєячсмитьбю", "ёйцукенгшщзхъфывапролджэячсмитьбю"];
52
+ const LAYOUT_MAPS = CYRILLIC_LAYOUTS.map((keys) => new Map([...LATIN_KEYS].flatMap((key, i) => [[key, keys[i]], [keys[i], key]])));
53
+ function swapWith(value, keys) {
54
54
  return [...value].map((char) => {
55
- const replacement = LAYOUT_KEYS.get(char.toLowerCase());
55
+ const replacement = keys.get(char.toLowerCase());
56
56
  return replacement ? char === char.toUpperCase() ? replacement.toUpperCase() : replacement : char;
57
57
  }).join("");
58
58
  }
59
+ function swapCommandLayout(value, layout = 0) {
60
+ return swapWith(value, LAYOUT_MAPS[layout] ?? LAYOUT_MAPS[0]);
61
+ }
59
62
  function searchCommandItems(items, terms) {
60
63
  const exact = rankExact(items, terms);
61
64
  if (exact.length || !terms.include.length) return { items: exact, terms: terms.include };
62
- const alternate = { include: terms.include.map(swapCommandLayout), exclude: terms.exclude, groups: terms.groups };
63
- return { items: rankExact(items, alternate), terms: alternate.include };
65
+ let fallback = terms.include;
66
+ for (const keys of LAYOUT_MAPS) {
67
+ const alternate = { include: terms.include.map((term) => swapWith(term, keys)), exclude: terms.exclude, groups: terms.groups };
68
+ const found = rankExact(items, alternate);
69
+ if (found.length) return { items: found, terms: alternate.include };
70
+ if (fallback === terms.include) fallback = alternate.include;
71
+ }
72
+ return { items: [], terms: fallback };
64
73
  }
65
74
  function rankCommandItems(items, terms) {
66
75
  return searchCommandItems(items, terms).items;
@@ -8,21 +8,21 @@ export interface FormatBytesOptions {
8
8
  /**
9
9
  * A byte count in the largest unit that keeps it readable: 1 536 → "1.5 kB".
10
10
  * Binary steps, the way file managers and storage limits show sizes. Unit
11
- * names come from Intl, so a Russian app reads "1,5 МБ" without a table of
11
+ * names come from Intl, so a French app reads "1,5 Mo" without a table of
12
12
  * its own. One decimal under 10 (2.4 MB), none above (240 MB). Negative or
13
13
  * non-finite input is "—": there is no size to show.
14
14
  */
15
15
  export declare function formatBytes(bytes: number, locale?: string, options?: FormatBytesOptions): string;
16
16
  export interface CompactNumberOptions {
17
17
  /**
18
- * Writes the decimal separator the locale's way ("1,2k" in Russian). The
18
+ * Writes the decimal separator the locale's way ("1,2k" in French). The
19
19
  * k/M/B/T suffixes stay: Intl's own compact notation changes the shape of
20
- * the figure per locale ("1,2 тыс."), which a tick label cannot absorb.
20
+ * the figure per locale ("1,2 k" in French), which a tick label cannot absorb.
21
21
  * Unset keeps a plain "." whatever the browser says.
22
22
  */
23
23
  locale?: string;
24
24
  /**
25
- * With a locale, write the unit as that locale does: "11,9 тыс." in Russian.
25
+ * With a locale, write the unit as that locale does: "13,1 Md" in French.
26
26
  * For a figure read on its own (a stat tile, a counter), where "11,9k" looks
27
27
  * foreign; not for axis ticks, where the longer word crowds the axis.
28
28
  */
@@ -39,7 +39,7 @@ export interface CompactNumberOptions {
39
39
  }
40
40
  /**
41
41
  * A figure shortened with k/M/B/T: 1 200 → "1.2k", 3 400 000 → "3.4M"; with
42
- * `words` and a locale in that locale's own words, "1,2 тыс." in Russian.
42
+ * `words` and a locale in that locale's own words, "13,1 Md" in French.
43
43
  *
44
44
  * The unit is picked by what will PRINT, not by the raw size: 999 950 at one
45
45
  * place rounds to "1000k", which reads as the next unit up, so it becomes
@@ -48,7 +48,7 @@ export interface CompactNumberOptions {
48
48
  export declare function compactNumber(value: number, options?: CompactNumberOptions): string;
49
49
  /**
50
50
  * The character a locale writes between the whole and the fractional part:
51
- * "." in English, "," in Russian and German. A counter that splits a grouped
51
+ * "." in English, "," in French and German. A counter that splits a grouped
52
52
  * figure into columns has to find the fraction by this mark, not by ".",
53
53
  * because in German "." is the thousands separator.
54
54
  */
@@ -34,7 +34,7 @@ export interface QuotaState {
34
34
  export declare function quotaState(used: number, limit: number | null | undefined, warnAt?: number, dangerAt?: number): QuotaState;
35
35
  /**
36
36
  * An amount in its unit, locale-aware. Bytes go through `formatBytes`, whose
37
- * unit names come from Intl, so a Russian app reads "1,5 ГБ" without a
37
+ * unit names come from Intl, so a French app reads "1,5 Go" without a
38
38
  * translation table of its own.
39
39
  */
40
40
  export declare function formatAmount(value: number, unit?: QuotaUnit, locale?: string): string;
@@ -7,7 +7,7 @@ export interface TimeSplit {
7
7
  ms: number;
8
8
  }
9
9
  export type TimeUnit = "d" | "h" | "m" | "s";
10
- /** Unit suffixes, so an app can write "2 д 3 ч" without reformatting. */
10
+ /** Unit suffixes, so an app can write "2 j 3 h" without reformatting. */
11
11
  export type TimeUnitLabels = Record<TimeUnit, string>;
12
12
  export declare const DEFAULT_UNIT_LABELS: TimeUnitLabels;
13
13
  /**
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import { _ as _3 } from "./chunks/LpMapPicker-DRGgh89B.js";
4
4
  import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
5
5
  import { _ as _4 } from "./chunks/LpActionBar-BP1ld7-S.js";
6
6
  import { _ as _5 } from "./chunks/LpAlert-n5XPAZfv.js";
7
- import { _ as _6 } from "./chunks/LpAppShell-D1-On_5L.js";
7
+ import { _ as _6 } from "./chunks/LpAppShell-CPCG0I-c.js";
8
8
  import { _ as _7 } from "./chunks/LpAutocomplete-DOu7FN5P.js";
9
9
  import { _ as _8 } from "./chunks/LpAvatar-Cg6Az3wz.js";
10
10
  import { _ as _9 } from "./chunks/LpBadge-wUYLN4U9.js";
@@ -60,19 +60,19 @@ import { _ as _37 } from "./chunks/LpLogViewer-D25jM2_I.js";
60
60
  import { countLevels, matchPositions, matchesTerm, ringWindow, stepMatch } from "./components/logSearch.js";
61
61
  import { _ as _38 } from "./chunks/LpMediaGallery-Bkram-MO.js";
62
62
  import { _ as _39 } from "./chunks/LpModal-BnjZ2iem.js";
63
- import { _ as _40 } from "./chunks/LpModalNav-CE3iLnxB.js";
63
+ import { _ as _40 } from "./chunks/LpModalNav-DQpV2kdn.js";
64
64
  import { _ as _41 } from "./chunks/LpNotificationBell-3244LUVc.js";
65
65
  import { _ as _42 } from "./chunks/LpNumberField-e0IBkWU1.js";
66
66
  import { _ as _43 } from "./chunks/LpTimeField-BawSVsmt.js";
67
- import { _ as _44 } from "./chunks/LpNumberFlow-CcxEGUy0.js";
67
+ import { _ as _44 } from "./chunks/LpNumberFlow-Vqj0tP7B.js";
68
68
  import { _ as _45 } from "./chunks/LpOtpInput-CeBPsM7D.js";
69
69
  import { _ as _46 } from "./chunks/LpPagination-BIIiYHXR.js";
70
70
  import { _ as _47 } from "./chunks/LpPasswordInput-BkHKQDhM.js";
71
- import { _ as _48 } from "./chunks/LpPie-Mr3EtFEd.js";
71
+ import { _ as _48 } from "./chunks/LpPie-DrZepi0p.js";
72
72
  import { _ as _49 } from "./chunks/LpPhoneInput-CETEp5W7.js";
73
73
  import { filterCountries, flagEmoji, loadCountries, matchCountryByValue } from "./components/countries.js";
74
74
  import { _ as _50 } from "./chunks/LpPopover-DmZ3wUtP.js";
75
- import { _ as _51 } from "./chunks/LpProgress-rOlyafqp.js";
75
+ import { _ as _51 } from "./chunks/LpProgress-Yr6ONG5t.js";
76
76
  import { _ as _52 } from "./chunks/LpRadio-CWA5Eb3M.js";
77
77
  import { _ as _53 } from "./chunks/LpRadioGroup-ggaPL92T.js";
78
78
  import { _ as _54 } from "./chunks/LpRollingText-B54Pje7P.js";
@@ -86,14 +86,14 @@ import { _ as _60 } from "./chunks/LpShift-CCq7dofl.js";
86
86
  import { _ as _61 } from "./chunks/LpSwap-C96c0LWh.js";
87
87
  import { _ as _62 } from "./chunks/LpHintExample-9Py0wc-L.js";
88
88
  import { default as default11 } from "./components/LpShortcutsDialog.vue.js";
89
- import { _ as _63 } from "./chunks/LpSidebar-BciLMBgY.js";
89
+ import { _ as _63 } from "./chunks/LpSidebar-BoNLKgh-.js";
90
90
  import { _ as _64 } from "./chunks/LpSkeleton-BB6XIV-w.js";
91
91
  import { _ as _65 } from "./chunks/LpSlider-DxYoCJJO.js";
92
92
  import { _ as _66 } from "./chunks/LpRangeSlider-CM-0ZITZ.js";
93
93
  import { _ as _67 } from "./chunks/LpVideoBackdrop-DS1wGv-X.js";
94
94
  import { formatClipTime, isNativeLoop, planLoop, seamProgress, seamReached } from "./components/videoBackdrop.js";
95
95
  import { _ as _68 } from "./chunks/LpSparkline-CExIRDb3.js";
96
- import { _ as _69 } from "./chunks/LpStat-D6V6Fdfc.js";
96
+ import { _ as _69 } from "./chunks/LpStat-BVf2UvEc.js";
97
97
  import { _ as _70 } from "./chunks/LpStepper-DpsocBNJ.js";
98
98
  import { _ as _71 } from "./chunks/LpSwitch-BnXd1llc.js";
99
99
  import { default as default12 } from "./components/LpTable.vue.js";
@@ -105,7 +105,7 @@ import { _ as _73 } from "./chunks/LpBottomNav-CbNQQPuL.js";
105
105
  import { _ as _74 } from "./chunks/LpTagsInput-C-mDG648.js";
106
106
  import { addTags, splitTags } from "./components/tags.js";
107
107
  import { _ as _75 } from "./chunks/LpTextarea-TE-yZv2U.js";
108
- import { _ as _76 } from "./chunks/LpThemeSwitcher-BDrIJswA.js";
108
+ import { _ as _76 } from "./chunks/LpThemeSwitcher-BnEn_mvf.js";
109
109
  import { _ as _77 } from "./chunks/LpTilt-B7KHX1zH.js";
110
110
  import { _ as _78 } from "./chunks/LpToaster-IwTXjbbU.js";
111
111
  import { _ as _79 } from "./chunks/LpTooltip-BcBvIx4z.js";
@@ -116,7 +116,7 @@ import { _ as _82 } from "./chunks/LpHints-Bz-BlaSl.js";
116
116
  import { HINT_SIGNALS, contextMenuTip, createHintSystem, dropzoneTip, hintKey, hintSummary, hotkeyTip, localHintStorage, noteDropzone, noteHotkeyTarget, paletteTip, provideHintSystem, runningHintSystem, useHintSystem } from "./composables/useHintSystem.js";
117
117
  import { _ as _83 } from "./chunks/LpTooltipProvider-CftjV7Xc.js";
118
118
  import { _ as _84 } from "./chunks/LpTopologyCanvas-B1gIbS0n.js";
119
- import { _ as _85 } from "./chunks/LpUptimeBar-BtkZRwY0.js";
119
+ import { _ as _85 } from "./chunks/LpUptimeBar-DqNvvMBK.js";
120
120
  import { deserializeLayout, serializeLayout } from "./layout/tree.js";
121
121
  import { addLeaf, addTab, countBlocks, countLeaves, makeLayout, moveLeaf, removeBlock, removeLeaf, reorderTab, resizeAt, setActiveTab } from "./layout/tree.js";
122
122
  import { blockTitle, defineBlocks } from "./layout/registry.js";
@@ -124,7 +124,7 @@ import { layoutController, useLayout } from "./layout/useLayout.js";
124
124
  import { a as parseTheme, s as serializeTheme } from "./chunks/LpThemeProvider-8MG6yqU9.js";
125
125
  import { D, _ as _86, T, b as b2, c as c2, d, e, f, g, l, h, n, i as i2, j, p, r, k, t, m, o, q, u, v } from "./chunks/LpThemeProvider-8MG6yqU9.js";
126
126
  import { G, N, d as d2, i as i3, s } from "./chunks/backdrop-Dkf2vM81.js";
127
- import { _ as _87, a as a2, b as b3, c as c3, d as d3, S, e as e2, u as u2, w } from "./chunks/LpThemeStudio-BJDKf3_Z.js";
127
+ import { _ as _87, a as a2, b as b3, c as c3, d as d3, S, e as e2, u as u2, w } from "./chunks/LpThemeStudio-BpORDvH6.js";
128
128
  import { useClipboard } from "./composables/useClipboard.js";
129
129
  import { activeShortcuts, appleModifierLabel, findHotkeyConflicts, hotkeyConflicts, hotkeySteps, isAppleKeyboard, matchesHotkey, mergeShortcutGroups, parseCombo, pendingHotkey, sequenceProgress, useAppleKeyboard, useHotkeys } from "./composables/useHotkeys.js";
130
130
  import { anyModalOpen, topModalElement, useModalLayer } from "./components/modalDepth.js";
@@ -164,8 +164,8 @@ import { _ as _88 } from "./chunks/LpFrame-BVQCQLDI.js";
164
164
  import { _ as _89 } from "./chunks/LpThemeStudioSection-B7bt8Iyg.js";
165
165
  import { isInternalHref, resolveLink } from "./components/link.js";
166
166
  import { _ as _90 } from "./chunks/LpRepeater-D7ZmnIYd.js";
167
- import { _ as _91 } from "./chunks/LpGauge-BO1PYYqD.js";
168
- import { _ as _92 } from "./chunks/LpQuota-B12yijdB.js";
167
+ import { _ as _91 } from "./chunks/LpGauge-KZaQ_FDR.js";
168
+ import { _ as _92 } from "./chunks/LpQuota-Dk2MyI2Z.js";
169
169
  import { _ as _93 } from "./chunks/LpStatus-DglxttQ7.js";
170
170
  import { _ as _94 } from "./chunks/LpRelativeTime-DwgCb5-8.js";
171
171
  import { _ as _95 } from "./chunks/LpActivityLine-CJvzrNpj.js";
@@ -181,14 +181,14 @@ import { childProgress, connectorFilled, currentStepIndex, isSettled, overallSta
181
181
  import { _ as _98 } from "./chunks/LpLoader-DVwkOmt9.js";
182
182
  import { useLoadingGate } from "./composables/useLoadingGate.js";
183
183
  import { useNow } from "./composables/useNow.js";
184
- import { _ as _99 } from "./chunks/LpCountdown-BxE7stYk.js";
184
+ import { _ as _99 } from "./chunks/LpCountdown-DgeY3cLG.js";
185
185
  import { DEFAULT_MILESTONES, DEFAULT_UNIT_LABELS, ceilToSecond, crossedMilestone, formatElapsed, formatTime, msToNextSecond, splitTime, timeParts } from "./components/timeSpan.js";
186
186
  import { _ as _100 } from "./chunks/LpCopyButton-xF7wFVoU.js";
187
187
  import { _ as _101 } from "./chunks/LpSecretField-BbmqM9ye.js";
188
188
  import { _ as _102 } from "./chunks/LpDataList-Jxyl9H5w.js";
189
189
  import { _ as _103 } from "./chunks/LpEditable-Cy6GLbFx.js";
190
190
  import { _ as _104 } from "./chunks/LpTruncate-CflAIwiJ.js";
191
- import { _ as _105 } from "./chunks/LpCodeDisplay-AQx-3nNb.js";
191
+ import { _ as _105 } from "./chunks/LpCodeDisplay-CE9TxCA4.js";
192
192
  import { formatRemaining, groupCode, middleTruncate, normalizeCode } from "./components/fieldText.js";
193
193
  import { _ as _106 } from "./chunks/LpHoverCard-spGxyw7T.js";
194
194
  import { _ as _107 } from "./chunks/LpIdenticon-BzdC_qz9.js";
@@ -214,10 +214,10 @@ import { _ as _116 } from "./chunks/LpSpotlight-4F3NeUMY.js";
214
214
  import { _ as _117 } from "./chunks/LpGlowBorder-B8V-QzIl.js";
215
215
  import { _ as _118 } from "./chunks/LpMagnetic-CtXKLa2Y.js";
216
216
  import { spotlightPoint, useSpotlight } from "./composables/useSpotlight.js";
217
- import { _ as _119 } from "./chunks/LpCommandScope-BlKcgBnK.js";
217
+ import { _ as _119 } from "./chunks/LpCommandScope-CtUhJe8T.js";
218
218
  import { createPaletteRegistry, mergePaletteCommands, usePaletteCommands, vPalette } from "./composables/usePaletteCommands.js";
219
- import { u as u3 } from "./chunks/palette-Cvxl_1tM.js";
220
- import { _ as _120 } from "./chunks/LpPaletteTheme-CdEEMMEF.js";
219
+ import { u as u3 } from "./chunks/palette-Co8tSASo.js";
220
+ import { _ as _120 } from "./chunks/LpPaletteTheme-DiLYKQiZ.js";
221
221
  const UI_CONFIG_VERSION = 1;
222
222
  function serializeConfig(config) {
223
223
  const out = {
@@ -3,10 +3,11 @@ import { type PaletteScope } from "../composables/usePaletteCommands";
3
3
  import type { ThemeStudio } from "./studio";
4
4
  import type { ThemeStudioPart } from "../components/LpThemeStudio.vue";
5
5
  /** Registers the studio itself; no second list of theme options in the app. */
6
- /** `hide` leaves out the same studio rows the app hides in its own studio. */
6
+ /** `hide` leaves out the same studio rows the app hides in its own studio; `keywords` adds the app's own search words. */
7
7
  export declare function usePaletteTheme(studio: MaybeRefOrGetter<ThemeStudio | undefined>, options?: {
8
8
  id?: string;
9
9
  label?: string;
10
10
  scope?: PaletteScope;
11
11
  hide?: ThemeStudioPart[];
12
+ keywords?: string[];
12
13
  }): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.72.4",
3
+ "version": "0.72.8",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -31,7 +31,7 @@ export default { inheritAttrs: false }
31
31
  * Overlays that aren't part of the frame (command palette, toaster) live in the
32
32
  * host next to <LpAppShell>.
33
33
  */
34
- import { computed, ref, useId, watch } from "vue"
34
+ import { computed, onMounted, ref, useId, watch } from "vue"
35
35
  import { useLabels } from "../composables/useLpConfig"
36
36
  import LpBottomNav from "./LpBottomNav.vue"
37
37
  import LpButton from "./LpButton.vue"
@@ -180,6 +180,10 @@ const text = useLabels(
180
180
  * a scrolled page landed mid-way down the next one.
181
181
  */
182
182
  const scrollArea = ref<{ viewportEl: HTMLElement | null } | null>(null)
183
+ const bleedId = `lp-shell-bleed-${useId()}`
184
+ const mounted = ref(false)
185
+ onMounted(() => (mounted.value = true))
186
+ const bleeding = computed(() => props.fullBleed && mounted.value)
183
187
  const mainId = `lp-main-${useId()}`
184
188
 
185
189
  // Focus instead of following the hash, which a router would treat as a navigation.
@@ -348,18 +352,23 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
348
352
  </header>
349
353
 
350
354
  <!-- full-bleed: page owns the whole region (canvas/map); otherwise the
351
- single scroll region with padding. -->
355
+ single scroll region with padding. The page is rendered once and
356
+ moved between the two by a teleport rather than drawn in two
357
+ branches: switching branches remounted the whole page, so a section
358
+ tab going from a full-bleed page to a padded one cut instead of
359
+ playing its transition, and lost the page's state. Until mount the
360
+ page stays in the scroll region, which is what a server render has. -->
352
361
  <main :id="mainId" tabindex="-1" class="flex min-h-0 flex-1 flex-col outline-none">
353
- <div v-if="fullBleed" class="min-h-0 flex-1 overflow-hidden">
354
- <slot />
355
- </div>
362
+ <div v-show="bleeding" :id="bleedId" class="min-h-0 flex-1 overflow-hidden" />
356
363
  <LpScrollArea
357
- v-else
364
+ v-show="!bleeding"
358
365
  ref="scrollArea"
359
366
  class="min-h-0 flex-1"
360
367
  :content-class="mergeClass('px-4 py-6 md:px-6', contentClass)"
361
368
  >
362
- <slot />
369
+ <Teleport :to="`#${bleedId}`" :disabled="!bleeding" defer>
370
+ <slot />
371
+ </Teleport>
363
372
  </LpScrollArea>
364
373
  </main>
365
374
  <LpBottomNav
@@ -226,7 +226,7 @@ onBeforeUnmount(stop)
226
226
 
227
227
  /*
228
228
  * The app's locale (reka's ConfigProvider) when the counter has none of its
229
- * own, the same rule the dates follow: a Russian app read "4,594" otherwise.
229
+ * own, the same rule the dates follow: a French app read "4,594" otherwise.
230
230
  */
231
231
  const locale = useLocale(() => props.locale)
232
232
  // The grouped and compact forms are written in the locale; the plain one always uses ".".
@@ -250,7 +250,7 @@ function formatAt(v: number, padded: boolean): string {
250
250
  * The decimal count is what stays fixed: one place whenever a unit is in
251
251
  * play, so the row's shape only changes at a rollover, not on every frame.
252
252
  * Written in the app's locale: the cells find the fraction by that
253
- * locale's own mark (fractionMark), so "1,2 тыс." keeps its columns.
253
+ * locale's own mark (fractionMark), so "1,2 k" keeps its columns.
254
254
  */
255
255
  return compactNumber(v, { plainDecimals: 0, fixed: true, locale: locale.value, words: true })
256
256
  }
@@ -492,7 +492,7 @@ const label = computed(
492
492
  /* Faded, so a held-open column reads as an empty wheel rather than a zero the
493
493
  number actually has. */
494
494
  /*
495
- * A space separator (ru, fr, …) takes a whole column in a monospaced or
495
+ * A space separator (fr, pl, …) takes a whole column in a monospaced or
496
496
  * tabular face, so "7 271" read as "7 271". It is drawn as the narrow gap
497
497
  * the locale means.
498
498
  */
@@ -147,7 +147,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
147
147
  </span>
148
148
  </div>
149
149
  <!-- A narrow tile moves the delta under the figure rather than breaking the
150
- figure itself: "2085 ч" split across two lines reads as two values. -->
150
+ figure itself: "2085 h" split across two lines reads as two values. -->
151
151
  <div class="flex flex-wrap items-baseline gap-x-2">
152
152
  <!-- The placeholder sits INSIDE the value's own type size, so its line box
153
153
  is the real one: the tile cannot change height when the figure lands. -->
@@ -81,21 +81,32 @@ function rankExact<T extends SearchableCommand>(items: T[], terms: CommandSearch
81
81
  }
82
82
 
83
83
  const LATIN_KEYS = "`qwertyuiop[]asdfghjkl;'zxcvbnm,."
84
- const CYRILLIC_KEYS = "ёйцукенгшщзхъфывапролджэячсмитьбю"
85
- const LAYOUT_KEYS = new Map([...LATIN_KEYS].flatMap((key, i) => [[key, CYRILLIC_KEYS[i]!], [CYRILLIC_KEYS[i]!, key]]))
84
+ const CYRILLIC_LAYOUTS = ["ґйцукенгшщзхїфівапролджєячсмитьбю", "ёйцукенгшщзхъфывапролджэячсмитьбю"]
85
+ const LAYOUT_MAPS = CYRILLIC_LAYOUTS.map(keys => new Map([...LATIN_KEYS].flatMap((key, i) => [[key, keys[i]!], [keys[i]!, key]])))
86
86
 
87
- export function swapCommandLayout(value: string): string {
87
+ function swapWith(value: string, keys: Map<string, string>): string {
88
88
  return [...value].map(char => {
89
- const replacement = LAYOUT_KEYS.get(char.toLowerCase())
89
+ const replacement = keys.get(char.toLowerCase())
90
90
  return replacement ? char === char.toUpperCase() ? replacement.toUpperCase() : replacement : char
91
91
  }).join("")
92
92
  }
93
93
 
94
+ /** The query as if typed on the other layout: Latin to Ukrainian by default, `layout` 1 for the other Cyrillic one. */
95
+ export function swapCommandLayout(value: string, layout = 0): string {
96
+ return swapWith(value, LAYOUT_MAPS[layout] ?? LAYOUT_MAPS[0]!)
97
+ }
98
+
94
99
  export function searchCommandItems<T extends SearchableCommand>(items: T[], terms: CommandSearchTerms): { items: T[]; terms: string[] } {
95
100
  const exact = rankExact(items, terms)
96
101
  if (exact.length || !terms.include.length) return { items: exact, terms: terms.include }
97
- const alternate = { include: terms.include.map(swapCommandLayout), exclude: terms.exclude, groups: terms.groups }
98
- return { items: rankExact(items, alternate), terms: alternate.include }
102
+ let fallback = terms.include
103
+ for (const keys of LAYOUT_MAPS) {
104
+ const alternate = { include: terms.include.map(term => swapWith(term, keys)), exclude: terms.exclude, groups: terms.groups }
105
+ const found = rankExact(items, alternate)
106
+ if (found.length) return { items: found, terms: alternate.include }
107
+ if (fallback === terms.include) fallback = alternate.include
108
+ }
109
+ return { items: [], terms: fallback }
99
110
  }
100
111
 
101
112
  export function rankCommandItems<T extends SearchableCommand>(items: T[], terms: CommandSearchTerms): T[] {
@@ -35,7 +35,7 @@ export interface FormatBytesOptions {
35
35
  /**
36
36
  * A byte count in the largest unit that keeps it readable: 1 536 → "1.5 kB".
37
37
  * Binary steps, the way file managers and storage limits show sizes. Unit
38
- * names come from Intl, so a Russian app reads "1,5 МБ" without a table of
38
+ * names come from Intl, so a French app reads "1,5 Mo" without a table of
39
39
  * its own. One decimal under 10 (2.4 MB), none above (240 MB). Negative or
40
40
  * non-finite input is "—": there is no size to show.
41
41
  */
@@ -54,7 +54,7 @@ export function formatBytes(bytes: number, locale?: string, options: FormatBytes
54
54
  // Intl's "short" form spells the smallest unit out ("1023 byte", "1023 Byte")
55
55
  // while every other unit is a symbol, and its "narrow" form glues English
56
56
  // symbols to the figure ("1023B"). Narrow symbols with one no-break space
57
- // read the same in every locale: "1023 B", "1.5 kB", "1,5 МБ".
57
+ // read the same in every locale: "1023 B", "1.5 kB", "1,5 Mo".
58
58
  const parts = numberFormat(locale, {
59
59
  style: "unit",
60
60
  unit: BYTE_UNITS[step],
@@ -79,8 +79,8 @@ const COMPACT_UNITS: readonly (readonly [number, string])[] = [
79
79
  ]
80
80
 
81
81
  /*
82
- * The unit word and the gap before it as the locale writes them: "тыс." with a
83
- * no-break space in Russian, "K" glued on in English. Taken from Intl's compact
82
+ * The unit word and the gap before it as the locale writes them: "Md" with a
83
+ * no-break space in French, "K" glued on in English. Taken from Intl's compact
84
84
  * notation rather than a table, so any locale reads its own.
85
85
  */
86
86
  const compactSuffixes = new Map<string, string>()
@@ -99,14 +99,14 @@ function compactSuffix(locale: string, step: number): string {
99
99
 
100
100
  export interface CompactNumberOptions {
101
101
  /**
102
- * Writes the decimal separator the locale's way ("1,2k" in Russian). The
102
+ * Writes the decimal separator the locale's way ("1,2k" in French). The
103
103
  * k/M/B/T suffixes stay: Intl's own compact notation changes the shape of
104
- * the figure per locale ("1,2 тыс."), which a tick label cannot absorb.
104
+ * the figure per locale ("1,2 k" in French), which a tick label cannot absorb.
105
105
  * Unset keeps a plain "." whatever the browser says.
106
106
  */
107
107
  locale?: string
108
108
  /**
109
- * With a locale, write the unit as that locale does: "11,9 тыс." in Russian.
109
+ * With a locale, write the unit as that locale does: "13,1 Md" in French.
110
110
  * For a figure read on its own (a stat tile, a counter), where "11,9k" looks
111
111
  * foreign; not for axis ticks, where the longer word crowds the axis.
112
112
  */
@@ -124,7 +124,7 @@ export interface CompactNumberOptions {
124
124
 
125
125
  /**
126
126
  * A figure shortened with k/M/B/T: 1 200 → "1.2k", 3 400 000 → "3.4M"; with
127
- * `words` and a locale in that locale's own words, "1,2 тыс." in Russian.
127
+ * `words` and a locale in that locale's own words, "13,1 Md" in French.
128
128
  *
129
129
  * The unit is picked by what will PRINT, not by the raw size: 999 950 at one
130
130
  * place rounds to "1000k", which reads as the next unit up, so it becomes
@@ -163,7 +163,7 @@ export function compactNumber(value: number, options: CompactNumberOptions = {})
163
163
 
164
164
  /**
165
165
  * The character a locale writes between the whole and the fractional part:
166
- * "." in English, "," in Russian and German. A counter that splits a grouped
166
+ * "." in English, "," in French and German. A counter that splits a grouped
167
167
  * figure into columns has to find the fraction by this mark, not by ".",
168
168
  * because in German "." is the thousands separator.
169
169
  */
@@ -65,7 +65,7 @@ export function quotaState(
65
65
 
66
66
  /**
67
67
  * An amount in its unit, locale-aware. Bytes go through `formatBytes`, whose
68
- * unit names come from Intl, so a Russian app reads "1,5 ГБ" without a
68
+ * unit names come from Intl, so a French app reads "1,5 Go" without a
69
69
  * translation table of its own.
70
70
  */
71
71
  export function formatAmount(value: number, unit?: QuotaUnit, locale?: string): string {
@@ -19,7 +19,7 @@ export interface TimeSplit {
19
19
 
20
20
  export type TimeUnit = "d" | "h" | "m" | "s"
21
21
 
22
- /** Unit suffixes, so an app can write "2 д 3 ч" without reformatting. */
22
+ /** Unit suffixes, so an app can write "2 j 3 h" without reformatting. */
23
23
  export type TimeUnitLabels = Record<TimeUnit, string>
24
24
 
25
25
  export const DEFAULT_UNIT_LABELS: TimeUnitLabels = { d: "d", h: "h", m: "m", s: "s" }
@@ -5,7 +5,7 @@ import { injectConfigProviderContext } from "reka-ui"
5
5
  * The locale a date is written in: the component's own `locale`, else the one
6
6
  * the app gave reka's ConfigProvider, else undefined, which lets Intl use the
7
7
  * browser's. The calendars already followed ConfigProvider while the field
8
- * that shows the picked date did not, so a Russian app showed a Russian
8
+ * that shows the picked date did not, so a French app showed a French
9
9
  * calendar under "Oct 8, 2026".
10
10
  */
11
11
  export function useLocale(own?: MaybeRefOrGetter<string | undefined>): ComputedRef<string | undefined> {
package/src/nuxt.ts CHANGED
@@ -56,20 +56,7 @@ function iconsPlugin(mode: LeavepulseUiOptions["icons"], srcDir: string): string
56
56
  export default defineNuxtModule<LeavepulseUiOptions>({
57
57
  meta: { name: "@leavepulse/ui", configKey: "leavepulseUi" },
58
58
  defaults: { theme: true, link: true, icons: "scan" },
59
- setup(
60
- options: LeavepulseUiOptions,
61
- nuxt: {
62
- options: {
63
- runtimeConfig: { public: Record<string, unknown> }
64
- alias: Record<string, string>
65
- srcDir: string
66
- }
67
- hook: (
68
- name: "prepare:types",
69
- fn: (options: { references: { path: string }[] }) => void,
70
- ) => void
71
- },
72
- ) {
59
+ setup(options, nuxt) {
73
60
  const resolver = createResolver(import.meta.url)
74
61
  const skip = new Set(options.exclude ?? [])
75
62
  for (const name of COMPONENT_NAMES) {
@@ -7,8 +7,8 @@ import { useLabels } from "../composables/useLpConfig"
7
7
  const Editor = defineAsyncComponent(() => import("../components/LpPaletteTheme.vue"))
8
8
 
9
9
  /** Registers the studio itself; no second list of theme options in the app. */
10
- /** `hide` leaves out the same studio rows the app hides in its own studio. */
11
- export function usePaletteTheme(studio: MaybeRefOrGetter<ThemeStudio | undefined>, options: { id?: string; label?: string; scope?: PaletteScope; hide?: ThemeStudioPart[] } = {}) {
10
+ /** `hide` leaves out the same studio rows the app hides in its own studio; `keywords` adds the app's own search words. */
11
+ export function usePaletteTheme(studio: MaybeRefOrGetter<ThemeStudio | undefined>, options: { id?: string; label?: string; scope?: PaletteScope; hide?: ThemeStudioPart[]; keywords?: string[] } = {}) {
12
12
  const scope = options.scope ?? usePaletteScope()
13
13
  const text = useLabels("paletteTheme", { title: "Theme" })
14
14
  const currentStudio = () => {
@@ -21,7 +21,7 @@ export function usePaletteTheme(studio: MaybeRefOrGetter<ThemeStudio | undefined
21
21
  if (!current) return []
22
22
  return [{
23
23
  id: `${scope?.id}/${options.id ?? "theme"}`, label: options.label ?? text.value.title, icon: "lucide:palette",
24
- description: current.theme.value.name, keywords: ["theme", "appearance", "accent", "density", "тема", "цвет", "плотность"],
24
+ description: current.theme.value.name, keywords: ["theme", "appearance", "accent", "density", ...(options.keywords ?? [])],
25
25
  previewComponent: preview, editInPreview: true,
26
26
  }]
27
27
  }, { scope: options.scope })