@leavepulse/ui 0.94.0 → 0.94.1
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/LpTabs-7yQjX2ih.css +18 -0
- package/dist/chunks/{LpAppShell-xEBmGV78.js → LpAppShell-DlpQierx.js} +1 -1
- package/dist/chunks/{LpModalNav-DVXAF-DG.js → LpModalNav-BFjiHWbr.js} +1 -1
- package/dist/chunks/{LpSidebar-BIhusppV.js → LpSidebar-BKhVDsMt.js} +2 -2
- package/dist/chunks/{LpSidebarNav-CFcI7--7.js → LpSidebarNav-DbCap8z1.js} +33 -19
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpTabs.vue.js +11 -6
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/src/components/LpSidebar.vue +1 -1
- package/src/components/LpSidebarNav.vue +18 -8
- package/src/components/LpTabs.vue +14 -5
- package/dist/assets/LpTabs-D7EyG21l.css +0 -18
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
|
|
2
|
+
.lp-tab-badge-enter-active[data-v-60b1eda3],
|
|
3
|
+
.lp-tab-badge-leave-active[data-v-60b1eda3] {
|
|
4
|
+
transition:
|
|
5
|
+
opacity var(--duration-fast) var(--ease-emphasized),
|
|
6
|
+
transform var(--duration-fast) var(--ease-emphasized);
|
|
7
|
+
}
|
|
8
|
+
.lp-tab-badge-enter-from[data-v-60b1eda3],
|
|
9
|
+
.lp-tab-badge-leave-to[data-v-60b1eda3] {
|
|
10
|
+
opacity: 0;
|
|
11
|
+
transform: scale(0.6);
|
|
12
|
+
}
|
|
13
|
+
@media (prefers-reduced-motion: reduce) {
|
|
14
|
+
.lp-tab-badge-enter-active[data-v-60b1eda3],
|
|
15
|
+
.lp-tab-badge-leave-active[data-v-60b1eda3] {
|
|
16
|
+
transition: none;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -14,7 +14,7 @@ import { _ as _sfc_main$4 } from "./LpIcon-CxHFPwKt.js";
|
|
|
14
14
|
import { _ as _sfc_main$8 } from "./LpPageScrollbar-C9sTeU-2.js";
|
|
15
15
|
import { _ as _sfc_main$7 } from "./LpScrollArea-CqvwfZs2.js";
|
|
16
16
|
import { _ as _sfc_main$5 } from "./LpShift-DAgS_d2x.js";
|
|
17
|
-
import { _ as _sfc_main$1 } from "./LpSidebar-
|
|
17
|
+
import { _ as _sfc_main$1 } from "./LpSidebar-BKhVDsMt.js";
|
|
18
18
|
import { mergeClass, useMergedAttrs } from "../composables/useMergedClass.js";
|
|
19
19
|
import { nodeWindow, isHTMLElement } from "../composables/realm.js";
|
|
20
20
|
const _hoisted_1 = ["href"];
|
|
@@ -5,7 +5,7 @@ import { _ as _sfc_main$2 } from "./LpButton-BvVoF-PO.js";
|
|
|
5
5
|
import { _ as _sfc_main$3 } from "./LpIcon-CxHFPwKt.js";
|
|
6
6
|
import { MODAL_MAX_HEIGHT } from "../components/modalDepth.js";
|
|
7
7
|
import { _ as _sfc_main$1 } from "./LpModal-D1E7rQzw.js";
|
|
8
|
-
import { _ as _sfc_main$4 } from "./LpSidebar-
|
|
8
|
+
import { _ as _sfc_main$4 } from "./LpSidebar-BKhVDsMt.js";
|
|
9
9
|
const _hoisted_1 = { class: "flex items-center gap-2" };
|
|
10
10
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
11
11
|
__name: "LpModalNav",
|
|
@@ -8,7 +8,7 @@ import { _ as _sfc_main$5 } from "./LpDrawer-BkWjFdV0.js";
|
|
|
8
8
|
import { _ as _sfc_main$2 } from "./LpIcon-CxHFPwKt.js";
|
|
9
9
|
import { _ as _sfc_main$3 } from "./LpInput-DGMpxrcg.js";
|
|
10
10
|
import { _ as _sfc_main$1 } from "./LpTooltip-BKde8Xjv.js";
|
|
11
|
-
import { _ as _sfc_main$4 } from "./LpSidebarNav-
|
|
11
|
+
import { _ as _sfc_main$4 } from "./LpSidebarNav-DbCap8z1.js";
|
|
12
12
|
const _hoisted_1 = ["data-compact", "aria-label"];
|
|
13
13
|
const _hoisted_2 = {
|
|
14
14
|
key: 0,
|
|
@@ -55,7 +55,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
55
55
|
search: {},
|
|
56
56
|
loading: { type: Boolean },
|
|
57
57
|
skeletonRows: { default: 6 },
|
|
58
|
-
skeletonHeader: { type: Boolean, default:
|
|
58
|
+
skeletonHeader: { type: Boolean, default: false },
|
|
59
59
|
responsive: { type: Boolean, default: false },
|
|
60
60
|
open: { type: Boolean },
|
|
61
61
|
mobileBreakpoint: { default: "md" },
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent, computed, ref, openBlock, createBlock, mergeProps, unref, withCtx, createElementBlock, createElementVNode, createCommentVNode, Fragment, renderList, toDisplayString, createVNode, normalizeClass, createTextVNode, createSlots, renderSlot } from "vue";
|
|
1
|
+
import { defineComponent, computed, ref, openBlock, createBlock, mergeProps, unref, withCtx, createElementBlock, createElementVNode, createCommentVNode, Fragment, renderList, normalizeStyle, toDisplayString, createVNode, normalizeClass, createTextVNode, createSlots, renderSlot } from "vue";
|
|
2
2
|
import { CollapsibleRoot, CollapsibleTrigger, CollapsibleContent } from "reka-ui";
|
|
3
3
|
import { _ as _sfc_main$5 } from "./LpBadge-Bh5roBr_.js";
|
|
4
4
|
import "../components/commandSearch.js";
|
|
@@ -17,25 +17,30 @@ const _hoisted_1 = {
|
|
|
17
17
|
key: 0,
|
|
18
18
|
class: "flex items-center gap-3 px-1"
|
|
19
19
|
};
|
|
20
|
-
const _hoisted_2 = { class: "
|
|
20
|
+
const _hoisted_2 = { class: "flex flex-col gap-1" };
|
|
21
21
|
const _hoisted_3 = {
|
|
22
|
+
key: 0,
|
|
23
|
+
class: "px-3 pb-1 pt-3"
|
|
24
|
+
};
|
|
25
|
+
const _hoisted_4 = { class: "flex h-9 items-center gap-3 px-3" };
|
|
26
|
+
const _hoisted_5 = {
|
|
22
27
|
key: 0,
|
|
23
28
|
class: "flex flex-col gap-0.5"
|
|
24
29
|
};
|
|
25
|
-
const
|
|
30
|
+
const _hoisted_6 = {
|
|
26
31
|
key: 0,
|
|
27
32
|
class: "px-2 pb-1 pt-2 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted"
|
|
28
33
|
};
|
|
29
|
-
const
|
|
34
|
+
const _hoisted_7 = {
|
|
30
35
|
key: 0,
|
|
31
36
|
class: "flex flex-col gap-0.5"
|
|
32
37
|
};
|
|
33
|
-
const
|
|
38
|
+
const _hoisted_8 = {
|
|
34
39
|
key: 0,
|
|
35
40
|
class: "mx-3 mb-1 border-t border-line"
|
|
36
41
|
};
|
|
37
|
-
const
|
|
38
|
-
const
|
|
42
|
+
const _hoisted_9 = { class: "min-w-0 flex-1 truncate text-left" };
|
|
43
|
+
const _hoisted_10 = {
|
|
39
44
|
key: 2,
|
|
40
45
|
class: "px-2 pb-1 pt-2 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted"
|
|
41
46
|
};
|
|
@@ -49,7 +54,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
49
54
|
itemActive: {},
|
|
50
55
|
loading: { type: Boolean },
|
|
51
56
|
skeletonRows: { default: 6 },
|
|
52
|
-
skeletonHeader: { type: Boolean, default:
|
|
57
|
+
skeletonHeader: { type: Boolean, default: false },
|
|
53
58
|
collapsedKeys: { default: () => [] },
|
|
54
59
|
hoverFollow: { type: Boolean, default: false },
|
|
55
60
|
compact: { type: Boolean },
|
|
@@ -172,13 +177,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
172
177
|
if (item.children?.length && !item.to && !item.href) toggle(item);
|
|
173
178
|
emit("activate", item);
|
|
174
179
|
}
|
|
180
|
+
const SKELETON_WIDTHS = ["55%", "70%", "45%", "62%", "50%", "68%"];
|
|
175
181
|
const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
176
182
|
"flex min-h-0 flex-1 flex-col gap-4"
|
|
177
183
|
);
|
|
178
184
|
return (_ctx, _cache) => {
|
|
179
185
|
return __props.loading ? (openBlock(), createBlock(_sfc_main$1, mergeProps({
|
|
180
186
|
key: 0,
|
|
181
|
-
class: unref(rootClass)
|
|
187
|
+
class: [unref(rootClass), "overflow-hidden"]
|
|
182
188
|
}, unref(rest)), {
|
|
183
189
|
default: withCtx(() => [
|
|
184
190
|
__props.skeletonHeader ? (openBlock(), createElementBlock("div", _hoisted_1, [..._cache[1] || (_cache[1] = [
|
|
@@ -190,10 +196,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
190
196
|
])])) : createCommentVNode("", true),
|
|
191
197
|
createElementVNode("div", _hoisted_2, [
|
|
192
198
|
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.skeletonRows, (n) => {
|
|
193
|
-
return openBlock(), createElementBlock(
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
199
|
+
return openBlock(), createElementBlock(Fragment, { key: n }, [
|
|
200
|
+
n === 4 ? (openBlock(), createElementBlock("div", _hoisted_3, [..._cache[2] || (_cache[2] = [
|
|
201
|
+
createElementVNode("div", { class: "lp-skeleton-item h-2.5 w-20 rounded-small bg-surface-soft/60" }, null, -1)
|
|
202
|
+
])])) : createCommentVNode("", true),
|
|
203
|
+
createElementVNode("div", _hoisted_4, [
|
|
204
|
+
_cache[3] || (_cache[3] = createElementVNode("div", { class: "lp-skeleton-item size-4 shrink-0 rounded-small bg-surface-soft" }, null, -1)),
|
|
205
|
+
createElementVNode("div", {
|
|
206
|
+
class: "lp-skeleton-item h-3 rounded-small bg-surface-soft",
|
|
207
|
+
style: normalizeStyle({ width: SKELETON_WIDTHS[(n - 1) % SKELETON_WIDTHS.length] })
|
|
208
|
+
}, null, 4)
|
|
209
|
+
])
|
|
210
|
+
], 64);
|
|
197
211
|
}), 128))
|
|
198
212
|
])
|
|
199
213
|
]),
|
|
@@ -209,8 +223,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
209
223
|
class: "contents",
|
|
210
224
|
onKeydown: onKey
|
|
211
225
|
}, [
|
|
212
|
-
__props.pinned.length ? (openBlock(), createElementBlock("div",
|
|
213
|
-
!__props.compact ? (openBlock(), createElementBlock("p",
|
|
226
|
+
__props.pinned.length ? (openBlock(), createElementBlock("div", _hoisted_5, [
|
|
227
|
+
!__props.compact ? (openBlock(), createElementBlock("p", _hoisted_6, toDisplayString(__props.labels.pinned), 1)) : createCommentVNode("", true),
|
|
214
228
|
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.pinned, (item) => {
|
|
215
229
|
return openBlock(), createBlock(_sfc_main$3, {
|
|
216
230
|
key: `pinned:${item.id}`,
|
|
@@ -230,7 +244,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
230
244
|
return openBlock(), createElementBlock(Fragment, {
|
|
231
245
|
key: sectionKey(section) || si
|
|
232
246
|
}, [
|
|
233
|
-
__props.compact && section.collapsible && section.title ? (openBlock(), createElementBlock("div",
|
|
247
|
+
__props.compact && section.collapsible && section.title ? (openBlock(), createElementBlock("div", _hoisted_7, [
|
|
234
248
|
createVNode(_sfc_main$3, {
|
|
235
249
|
item: sectionItem(section),
|
|
236
250
|
active: false,
|
|
@@ -252,7 +266,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
252
266
|
"onUpdate:open": (o) => emit("toggle-section", sectionKey(section), !o)
|
|
253
267
|
}, {
|
|
254
268
|
default: withCtx(() => [
|
|
255
|
-
__props.compact && (si > 0 || __props.pinned.length) ? (openBlock(), createElementBlock("div",
|
|
269
|
+
__props.compact && (si > 0 || __props.pinned.length) ? (openBlock(), createElementBlock("div", _hoisted_8)) : !__props.compact && section.title && section.collapsible ? (openBlock(), createBlock(unref(CollapsibleTrigger), {
|
|
256
270
|
key: 1,
|
|
257
271
|
"data-lp-nav-row": "",
|
|
258
272
|
class: "group/section mt-2 flex cursor-pointer items-center gap-2 rounded-control px-2 py-1 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:bg-ink/[0.04] hover:text-ink focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"
|
|
@@ -264,7 +278,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
264
278
|
size: 14,
|
|
265
279
|
class: "shrink-0"
|
|
266
280
|
}, null, 8, ["name"])) : createCommentVNode("", true),
|
|
267
|
-
createElementVNode("span",
|
|
281
|
+
createElementVNode("span", _hoisted_9, toDisplayString(section.title), 1),
|
|
268
282
|
section.items.some(unref(waiting)) ? (openBlock(), createElementBlock("span", {
|
|
269
283
|
key: 1,
|
|
270
284
|
class: normalizeClass(["size-1.5 shrink-0 rounded-full bg-brand transition-opacity duration-[var(--duration-fast)] motion-reduce:transition-none", isOpen(section) ? "opacity-0" : "opacity-100"])
|
|
@@ -286,7 +300,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
286
300
|
})
|
|
287
301
|
]),
|
|
288
302
|
_: 2
|
|
289
|
-
}, 1024)) : !__props.compact && section.title ? (openBlock(), createElementBlock("p",
|
|
303
|
+
}, 1024)) : !__props.compact && section.title ? (openBlock(), createElementBlock("p", _hoisted_10, toDisplayString(section.title), 1)) : createCommentVNode("", true),
|
|
290
304
|
createVNode(unref(CollapsibleContent), { class: "flex flex-col gap-0.5 overflow-hidden data-[state=open]:animate-[collapsible-down_260ms_var(--ease-emphasized)] data-[state=closed]:animate-[collapsible-up_200ms_var(--ease-emphasized)] motion-reduce:animate-none" }, {
|
|
291
305
|
default: withCtx(() => [
|
|
292
306
|
(openBlock(true), createElementBlock(Fragment, null, renderList(section.items, (item) => {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { defineComponent, computed, ref, watch, nextTick, useId, openBlock, createBlock, unref, withCtx, resolveDynamicComponent, mergeProps, createVNode, normalizeClass, createElementBlock, Fragment, renderList, createCommentVNode, renderSlot } from "vue";
|
|
1
|
+
import { defineComponent, computed, ref, watch, nextTick, onMounted, useId, openBlock, createBlock, unref, withCtx, resolveDynamicComponent, mergeProps, createVNode, normalizeClass, createElementBlock, Fragment, renderList, createCommentVNode, renderSlot } from "vue";
|
|
2
2
|
import { isHTMLElement } from "../composables/realm.js";
|
|
3
3
|
import { usePaletteScope, usePaletteCommands } from "../composables/usePaletteCommands.js";
|
|
4
4
|
import { Motion } from "motion-v";
|
|
5
5
|
import { TabsRoot, TabsList, TabsTrigger, TabsContent } from "reka-ui";
|
|
6
|
+
import { useResizeObserver } from "../composables/useResizeObserver.js";
|
|
6
7
|
import { usePillTransition } from "../composables/usePillTransition.js";
|
|
7
8
|
import { useStepHistory } from "../composables/useOverlayHistory.js";
|
|
8
9
|
import { _ as _sfc_main$2 } from "../chunks/LpContextMenu-DEFirphS.js";
|
|
@@ -11,7 +12,7 @@ import { _ as _sfc_main$3 } from "../chunks/LpTabFace-uoZgD_SN.js";
|
|
|
11
12
|
import { _ as _sfc_main$1 } from "../chunks/LpScrollStrip-D4tsOfAQ.js";
|
|
12
13
|
import { pickTab, BOTTOM_BAR, BOTTOM_ITEM, BOTTOM_MARKER } from "./tabs.js";
|
|
13
14
|
import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
|
|
14
|
-
import '../assets/LpTabs-
|
|
15
|
+
import '../assets/LpTabs-7yQjX2ih.css';const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
15
16
|
__name: "LpTabs",
|
|
16
17
|
props: {
|
|
17
18
|
modelValue: {},
|
|
@@ -47,9 +48,13 @@ import '../assets/LpTabs-D7EyG21l.css';const _sfc_main = /* @__PURE__ */ defineC
|
|
|
47
48
|
const strip = ref(null);
|
|
48
49
|
const Passthrough = (_, { slots }) => slots.default?.();
|
|
49
50
|
const list = ref(null);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
function revealActive(smooth) {
|
|
52
|
+
if (bottom.value) return;
|
|
53
|
+
strip.value?.reveal(list.value?.$el?.querySelector('[data-state="active"]'), { smooth });
|
|
54
|
+
}
|
|
55
|
+
watch(current, () => void nextTick(() => revealActive(true)));
|
|
56
|
+
onMounted(() => requestAnimationFrame(() => revealActive(false)));
|
|
57
|
+
useResizeObserver(() => strip.value?.scroller, () => revealActive(false));
|
|
53
58
|
function holdMousePick(event) {
|
|
54
59
|
if (event.button !== 0 || event.ctrlKey || bottom.value) return;
|
|
55
60
|
if (!isHTMLElement(event.target) || !event.target.closest('[role="tab"]')) return;
|
|
@@ -224,7 +229,7 @@ import '../assets/LpTabs-D7EyG21l.css';const _sfc_main = /* @__PURE__ */ defineC
|
|
|
224
229
|
};
|
|
225
230
|
}
|
|
226
231
|
});
|
|
227
|
-
const LpTabs = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
232
|
+
const LpTabs = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-60b1eda3"]]);
|
|
228
233
|
export {
|
|
229
234
|
LpTabs as default
|
|
230
235
|
};
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { _ as _3 } from "./chunks/LpMapPicker-V0Lybi10.js";
|
|
|
4
4
|
import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
|
|
5
5
|
import { _ as _4 } from "./chunks/LpActionBar-43WHmTsM.js";
|
|
6
6
|
import { _ as _5 } from "./chunks/LpAlert-Q0h7Gucu.js";
|
|
7
|
-
import { _ as _6 } from "./chunks/LpAppShell-
|
|
7
|
+
import { _ as _6 } from "./chunks/LpAppShell-DlpQierx.js";
|
|
8
8
|
import { _ as _7 } from "./chunks/LpAutocomplete-YPxAPHEo.js";
|
|
9
9
|
import { _ as _8 } from "./chunks/LpAvatar-CfLBqlY1.js";
|
|
10
10
|
import { _ as _9 } from "./chunks/LpBadge-Bh5roBr_.js";
|
|
@@ -65,7 +65,7 @@ import { compilePattern, findIds, messageShape, structuredPayload, timeMs } from
|
|
|
65
65
|
import { countLevels, matchPositions, matchesTerm, ringWindow, stepMatch } from "./components/logSearch.js";
|
|
66
66
|
import { _ as _39 } from "./chunks/LpMediaGallery-CTejKF2-.js";
|
|
67
67
|
import { _ as _40 } from "./chunks/LpModal-D1E7rQzw.js";
|
|
68
|
-
import { _ as _41 } from "./chunks/LpModalNav-
|
|
68
|
+
import { _ as _41 } from "./chunks/LpModalNav-BFjiHWbr.js";
|
|
69
69
|
import { _ as _42 } from "./chunks/LpNotificationBell-KRgdRZs-.js";
|
|
70
70
|
import { _ as _43 } from "./chunks/LpNotificationFeed-CMGYU8c-.js";
|
|
71
71
|
import { _ as _44 } from "./chunks/LpNumberField-C0LSu-tl.js";
|
|
@@ -94,7 +94,7 @@ import { _ as _64 } from "./chunks/LpShift-DAgS_d2x.js";
|
|
|
94
94
|
import { _ as _65 } from "./chunks/LpSwap-M7nFeW3C.js";
|
|
95
95
|
import { _ as _66 } from "./chunks/LpHintExample-YzCXiSUp.js";
|
|
96
96
|
import { default as default11 } from "./components/LpShortcutsDialog.vue.js";
|
|
97
|
-
import { _ as _67 } from "./chunks/LpSidebar-
|
|
97
|
+
import { _ as _67 } from "./chunks/LpSidebar-BKhVDsMt.js";
|
|
98
98
|
import { _ as _68 } from "./chunks/LpContextSwitcher-COw6GHPW.js";
|
|
99
99
|
import { _ as _69 } from "./chunks/LpSkeleton-leTl53V9.js";
|
|
100
100
|
import { _ as _70 } from "./chunks/LpSlider-DUd4gXnw.js";
|
package/package.json
CHANGED
|
@@ -56,7 +56,7 @@ const props = withDefaults(
|
|
|
56
56
|
previewDelay?: number
|
|
57
57
|
labels: { pinned: string; pin: string; unpin: string; expand: string }
|
|
58
58
|
}>(),
|
|
59
|
-
{ skeletonRows: 6, skeletonHeader:
|
|
59
|
+
{ skeletonRows: 6, skeletonHeader: false, collapsedKeys: () => [], hoverFollow: false, pinned: () => [], previewDelay: 900 },
|
|
60
60
|
)
|
|
61
61
|
|
|
62
62
|
const emit = defineEmits<{
|
|
@@ -212,6 +212,8 @@ function activate(item: SidebarItem) {
|
|
|
212
212
|
}
|
|
213
213
|
|
|
214
214
|
// The nav fills the remaining height with a fixed gap between groups; a short sidebar needs both under the consumer's control.
|
|
215
|
+
const SKELETON_WIDTHS = ["55%", "70%", "45%", "62%", "50%", "68%"]
|
|
216
|
+
|
|
215
217
|
const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
216
218
|
"flex min-h-0 flex-1 flex-col gap-4",
|
|
217
219
|
)
|
|
@@ -222,7 +224,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
222
224
|
LpSkeleton wrapper so it pulses in phase with every other placeholder
|
|
223
225
|
on the page and stops under reduced motion. -->
|
|
224
226
|
<LpSkeleton v-if="loading"
|
|
225
|
-
:class="rootClass"
|
|
227
|
+
:class="[rootClass, 'overflow-hidden']"
|
|
226
228
|
v-bind="rest">
|
|
227
229
|
<div v-if="skeletonHeader" class="flex items-center gap-3 px-1">
|
|
228
230
|
<div class="lp-skeleton-item size-10 shrink-0 rounded-pill bg-surface-soft" />
|
|
@@ -231,12 +233,20 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
231
233
|
<div class="lp-skeleton-item h-3 w-16 rounded-small bg-surface-soft/60" />
|
|
232
234
|
</div>
|
|
233
235
|
</div>
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
236
|
+
<!-- Rows in the shape of the items they stand in for: an icon and a label
|
|
237
|
+
of uneven width at the item's own height and padding, with a section
|
|
238
|
+
label after the first three. A run of full-width bars read as a list
|
|
239
|
+
of buttons, not as navigation. -->
|
|
240
|
+
<div class="flex flex-col gap-1">
|
|
241
|
+
<template v-for="n in skeletonRows" :key="n">
|
|
242
|
+
<div v-if="n === 4" class="px-3 pb-1 pt-3">
|
|
243
|
+
<div class="lp-skeleton-item h-2.5 w-20 rounded-small bg-surface-soft/60" />
|
|
244
|
+
</div>
|
|
245
|
+
<div class="flex h-9 items-center gap-3 px-3">
|
|
246
|
+
<div class="lp-skeleton-item size-4 shrink-0 rounded-small bg-surface-soft" />
|
|
247
|
+
<div class="lp-skeleton-item h-3 rounded-small bg-surface-soft" :style="{ width: SKELETON_WIDTHS[(n - 1) % SKELETON_WIDTHS.length] }" />
|
|
248
|
+
</div>
|
|
249
|
+
</template>
|
|
240
250
|
</div>
|
|
241
251
|
</LpSkeleton>
|
|
242
252
|
|
|
@@ -3,7 +3,8 @@ import { isHTMLElement } from "../composables/useView"
|
|
|
3
3
|
import { usePaletteCommands, usePaletteScope } from "../composables/usePaletteCommands"
|
|
4
4
|
import { Motion } from "motion-v"
|
|
5
5
|
import { TabsContent, TabsList, TabsRoot, TabsTrigger } from "reka-ui"
|
|
6
|
-
import { computed, nextTick, ref, useId, watch, type FunctionalComponent } from "vue"
|
|
6
|
+
import { computed, nextTick, onMounted, ref, useId, watch, type FunctionalComponent } from "vue"
|
|
7
|
+
import { useResizeObserver } from "../composables/useResizeObserver"
|
|
7
8
|
import { usePillTransition } from "../composables/usePillTransition"
|
|
8
9
|
import { useStepHistory } from "../composables/useOverlayHistory"
|
|
9
10
|
import LpContextMenu, { type ContextMenuItemDef } from "./LpContextMenu.vue"
|
|
@@ -106,13 +107,21 @@ watch(
|
|
|
106
107
|
// A row wider than its container scrolls sideways (a phone, a narrow card)
|
|
107
108
|
// instead of wrapping each label onto two lines. LpScrollStrip lets a mouse
|
|
108
109
|
// reach the tabs off to the side (wheel, drag, edge buttons), and the active
|
|
109
|
-
// tab is brought into view whenever it changes, including from outside
|
|
110
|
+
// tab is brought into view whenever it changes, including from outside, and
|
|
111
|
+
// also on mount and when the row resizes: a tab picked by the address before
|
|
112
|
+
// the first paint, or left beyond the edge by a narrower window, would
|
|
113
|
+
// otherwise sit off-screen with nothing saying which section is open. Those
|
|
114
|
+
// two jump; only a change the person can follow eases.
|
|
110
115
|
const strip = ref<InstanceType<typeof LpScrollStrip> | null>(null)
|
|
111
116
|
const Passthrough: FunctionalComponent = (_, { slots }) => slots.default?.()
|
|
112
117
|
const list = ref<{ $el: HTMLElement } | null>(null)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
})
|
|
118
|
+
function revealActive(smooth: boolean) {
|
|
119
|
+
if (bottom.value) return
|
|
120
|
+
strip.value?.reveal(list.value?.$el?.querySelector('[data-state="active"]'), { smooth })
|
|
121
|
+
}
|
|
122
|
+
watch(current, () => void nextTick(() => revealActive(true)))
|
|
123
|
+
onMounted(() => requestAnimationFrame(() => revealActive(false)))
|
|
124
|
+
useResizeObserver(() => strip.value?.scroller, () => revealActive(false))
|
|
116
125
|
|
|
117
126
|
/*
|
|
118
127
|
* reka selects a tab on mousedown, so a press meant to drag the row would
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
.lp-tab-badge-enter-active[data-v-43a45129],
|
|
3
|
-
.lp-tab-badge-leave-active[data-v-43a45129] {
|
|
4
|
-
transition:
|
|
5
|
-
opacity var(--duration-fast) var(--ease-emphasized),
|
|
6
|
-
transform var(--duration-fast) var(--ease-emphasized);
|
|
7
|
-
}
|
|
8
|
-
.lp-tab-badge-enter-from[data-v-43a45129],
|
|
9
|
-
.lp-tab-badge-leave-to[data-v-43a45129] {
|
|
10
|
-
opacity: 0;
|
|
11
|
-
transform: scale(0.6);
|
|
12
|
-
}
|
|
13
|
-
@media (prefers-reduced-motion: reduce) {
|
|
14
|
-
.lp-tab-badge-enter-active[data-v-43a45129],
|
|
15
|
-
.lp-tab-badge-leave-active[data-v-43a45129] {
|
|
16
|
-
transition: none;
|
|
17
|
-
}
|
|
18
|
-
}
|