@leavepulse/ui 0.72.5 → 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.
- package/dist/assets/{LpNumberFlow-Chp9pEDe.css → LpNumberFlow-P1balINP.css} +1 -1
- package/dist/chunks/{LpAppShell-DMSJg18Q.js → LpAppShell-CPCG0I-c.js} +1 -1
- package/dist/chunks/{LpCodeDisplay-AQx-3nNb.js → LpCodeDisplay-CE9TxCA4.js} +1 -1
- package/dist/chunks/{LpCommandScope-BlKcgBnK.js → LpCommandScope-CtUhJe8T.js} +1 -1
- package/dist/chunks/{LpCountdown-BxE7stYk.js → LpCountdown-DgeY3cLG.js} +1 -1
- package/dist/chunks/{LpGauge-BO1PYYqD.js → LpGauge-KZaQ_FDR.js} +1 -1
- package/dist/chunks/{LpModalNav-CE3iLnxB.js → LpModalNav-DQpV2kdn.js} +1 -1
- package/dist/chunks/{LpNumberFlow-CcxEGUy0.js → LpNumberFlow-Vqj0tP7B.js} +1 -1
- package/dist/chunks/{LpPaletteTheme-CdEEMMEF.js → LpPaletteTheme-DiLYKQiZ.js} +1 -1
- package/dist/chunks/{LpPie-Mr3EtFEd.js → LpPie-DrZepi0p.js} +1 -1
- package/dist/chunks/{LpProgress-rOlyafqp.js → LpProgress-Yr6ONG5t.js} +1 -1
- package/dist/chunks/{LpQuota-B12yijdB.js → LpQuota-Dk2MyI2Z.js} +1 -1
- package/dist/chunks/{LpSidebar-BciLMBgY.js → LpSidebar-BoNLKgh-.js} +1 -1
- package/dist/chunks/{LpSidebarNav-HYcG-ib8.js → LpSidebarNav-Bky8chrv.js} +1 -1
- package/dist/chunks/{LpSidebarRow-Di2VYz-Z.js → LpSidebarRow-BRYhNDSo.js} +1 -1
- package/dist/chunks/{LpStat-D6V6Fdfc.js → LpStat-BVf2UvEc.js} +1 -1
- package/dist/chunks/{LpThemeStudio-BJDKf3_Z.js → LpThemeStudio-BpORDvH6.js} +1 -1
- package/dist/chunks/{LpThemeSwitcher-BDrIJswA.js → LpThemeSwitcher-BnEn_mvf.js} +2 -2
- package/dist/chunks/{LpUptimeBar-BtkZRwY0.js → LpUptimeBar-DqNvvMBK.js} +1 -1
- package/dist/chunks/{palette-Cvxl_1tM.js → palette-Co8tSASo.js} +1 -1
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpCodeDisplay.vue.js +1 -1
- package/dist/components/LpCommandScope.vue.js +1 -1
- package/dist/components/LpCountdown.vue.js +1 -1
- package/dist/components/LpGauge.vue.js +1 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNumberFlow.vue.js +1 -1
- package/dist/components/LpPaletteStats.vue.js +1 -1
- package/dist/components/LpPaletteTheme.vue.js +1 -1
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpProgress.vue.js +1 -1
- package/dist/components/LpQuota.vue.js +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSidebarRow.vue.js +1 -1
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpThemeStudio.vue.js +1 -1
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/commandSearch.d.ts +2 -1
- package/dist/components/commandSearch.js +15 -6
- package/dist/components/format.d.ts +6 -6
- package/dist/components/quota.d.ts +1 -1
- package/dist/components/timeSpan.d.ts +1 -1
- package/dist/index.js +17 -17
- package/dist/theme/palette.d.ts +2 -1
- package/package.json +1 -1
- package/src/components/LpNumberFlow.vue +3 -3
- package/src/components/LpStat.vue +1 -1
- package/src/components/commandSearch.ts +17 -6
- package/src/components/format.ts +9 -9
- package/src/components/quota.ts +1 -1
- package/src/components/timeSpan.ts +1 -1
- package/src/composables/useLocale.ts +1 -1
- package/src/nuxt.ts +1 -14
- 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 (
|
|
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
|
*/
|
|
@@ -5,7 +5,7 @@ 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-
|
|
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" };
|
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
}];
|
|
@@ -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-
|
|
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";
|
|
@@ -10,7 +10,8 @@ export interface CommandSearchTerms {
|
|
|
10
10
|
groups: string[];
|
|
11
11
|
}
|
|
12
12
|
export declare function parseCommandQuery(value: string): CommandSearchTerms;
|
|
13
|
-
|
|
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
|
|
52
|
-
const
|
|
53
|
-
function
|
|
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 =
|
|
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
|
-
|
|
63
|
-
|
|
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
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
168
|
-
import { _ as _92 } from "./chunks/LpQuota-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
220
|
-
import { _ as _120 } from "./chunks/LpPaletteTheme-
|
|
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 = {
|
package/dist/theme/palette.d.ts
CHANGED
|
@@ -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
|
@@ -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
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
85
|
-
const
|
|
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
|
-
|
|
87
|
+
function swapWith(value: string, keys: Map<string, string>): string {
|
|
88
88
|
return [...value].map(char => {
|
|
89
|
-
const replacement =
|
|
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
|
-
|
|
98
|
-
|
|
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[] {
|
package/src/components/format.ts
CHANGED
|
@@ -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
|
|
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: "
|
|
83
|
-
* no-break space in
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
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
|
*/
|
package/src/components/quota.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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) {
|
package/src/theme/palette.ts
CHANGED
|
@@ -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 })
|