@leavepulse/ui 0.53.0 → 0.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/chunks/{LpAppShell-BmMYcEVx.js → LpAppShell-DcSXik4a.js} +1 -1
  2. package/dist/chunks/{LpAvatar-Cb1jtOVv.js → LpAvatar-LTvy0OkE.js} +1 -1
  3. package/dist/chunks/{LpCard-BdxkMXjo.js → LpCard-DbjO5yaF.js} +1 -1
  4. package/dist/chunks/{LpCheckbox-Bkj13CbW.js → LpCheckbox-DvVYeOD-.js} +2 -2
  5. package/dist/chunks/{LpColorPicker-BLqPX5Vw.js → LpColorPicker-D1sQqtXS.js} +1 -1
  6. package/dist/chunks/{LpContextMenu-1cKew_Dc.js → LpContextMenu-EF_90u3g.js} +5 -1
  7. package/dist/chunks/{LpFileTree-bk5VjBey.js → LpFileTree-3E4w4Rjr.js} +1 -1
  8. package/dist/chunks/{LpFileTreeNode-BvMSBM7X.js → LpFileTreeNode-B4uB8Ks_.js} +2 -2
  9. package/dist/chunks/{LpLogViewer-BDFXzvcl.js → LpLogViewer-BfgtXVKm.js} +1 -1
  10. package/dist/chunks/{LpModalNav-BAxC9et7.js → LpModalNav-aWwc_5CD.js} +1 -1
  11. package/dist/chunks/{LpNotificationBell-DsqSyMwS.js → LpNotificationBell-wZ3meeim.js} +1 -1
  12. package/dist/chunks/LpOtpInput-PbeNJ5In.js +131 -0
  13. package/dist/chunks/{LpPie-BdSnta11.js → LpPie-B7ti5qCH.js} +1 -1
  14. package/dist/chunks/{LpRadio-B5AfqTpZ.js → LpRadio-CWA5Eb3M.js} +2 -2
  15. package/dist/chunks/{LpRadioGroup-DmEW0l78.js → LpRadioGroup-CCn-Q2_c.js} +2 -2
  16. package/dist/chunks/{LpSidebar-DpEiGi8L.js → LpSidebar-C2oolgwy.js} +1 -1
  17. package/dist/chunks/{LpSidebarNav-BUuxipX-.js → LpSidebarNav-C9dHu-2b.js} +1 -1
  18. package/dist/chunks/{LpSwitch-OrcOJX9m.js → LpSwitch-DG2AhXIL.js} +2 -2
  19. package/dist/chunks/{LpTableFilter-BV8PpLM9.js → LpTableFilter-CrW7_Rj4.js} +1 -1
  20. package/dist/chunks/{LpTabs-UM0FQmPA.js → LpTabs-BMSBB78h.js} +44 -17
  21. package/dist/chunks/{LpThemeSwitcher-BbYFFT5w.js → LpThemeSwitcher-CPmhYOjX.js} +1 -1
  22. package/dist/components/LpAppShell.vue.js +1 -1
  23. package/dist/components/LpAvatar.vue.js +1 -1
  24. package/dist/components/LpCard.vue.js +1 -1
  25. package/dist/components/LpChart.vue.js +1 -1
  26. package/dist/components/LpCheckbox.vue.js +1 -1
  27. package/dist/components/LpColorPicker.vue.js +1 -1
  28. package/dist/components/LpCommandPalette.vue.js +1 -1
  29. package/dist/components/LpContextMenu.vue.d.ts +2 -2
  30. package/dist/components/LpContextMenu.vue.js +1 -1
  31. package/dist/components/LpFileTree.vue.js +1 -1
  32. package/dist/components/LpFileTreeNode.vue.js +1 -1
  33. package/dist/components/LpLogViewer.vue.js +1 -1
  34. package/dist/components/LpModalNav.vue.js +1 -1
  35. package/dist/components/LpNotificationBell.vue.js +1 -1
  36. package/dist/components/LpOtpInput.vue.d.ts +17 -0
  37. package/dist/components/LpOtpInput.vue.js +1 -1
  38. package/dist/components/LpPaletteHeader.vue.js +1 -1
  39. package/dist/components/LpPie.vue.js +1 -1
  40. package/dist/components/LpRadio.vue.js +1 -1
  41. package/dist/components/LpRadioGroup.vue.js +1 -1
  42. package/dist/components/LpSidebar.vue.js +1 -1
  43. package/dist/components/LpSidebarNav.vue.js +1 -1
  44. package/dist/components/LpSwitch.vue.js +1 -1
  45. package/dist/components/LpTable.vue.js +3 -3
  46. package/dist/components/LpTableFilter.vue.js +1 -1
  47. package/dist/components/LpTabs.vue.d.ts +10 -2
  48. package/dist/components/LpTabs.vue.js +1 -1
  49. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  50. package/dist/components/otp.d.ts +2 -0
  51. package/dist/components/otp.js +17 -1
  52. package/dist/index.js +18 -18
  53. package/package.json +1 -1
  54. package/src/components/LpCheckbox.vue +2 -2
  55. package/src/components/LpContextMenu.vue +18 -1
  56. package/src/components/LpOtpInput.vue +84 -28
  57. package/src/components/LpRadio.vue +2 -2
  58. package/src/components/LpRadioGroup.vue +2 -2
  59. package/src/components/LpSwitch.vue +2 -2
  60. package/src/components/LpTabs.vue +60 -21
  61. package/src/components/otp.ts +29 -0
  62. package/dist/chunks/LpOtpInput-CziPF3Oq.js +0 -99
@@ -4,7 +4,7 @@ import { _ as _sfc_main$2 } from "./LpButton-CKSwC6Mu.js";
4
4
  import { _ as _sfc_main$3 } from "./LpIcon-DYtaid0K.js";
5
5
  import { _ as _sfc_main$5 } from "./LpScrollArea-Hz3-JWUG.js";
6
6
  import { _ as _sfc_main$4 } from "./LpShift-DXNsauQZ.js";
7
- import { _ as _sfc_main$1 } from "./LpSidebar-DpEiGi8L.js";
7
+ import { _ as _sfc_main$1 } from "./LpSidebar-C2oolgwy.js";
8
8
  import { useMergedAttrs } from "../composables/useMergedClass.js";
9
9
  const _hoisted_1 = ["href"];
10
10
  const _hoisted_2 = { class: "flex min-w-0 flex-1 flex-col" };
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, computed, ref, onMounted, openBlock, createBlock, withCtx, createVNode, unref, mergeProps, createCommentVNode, createElementBlock, Fragment, createTextVNode, toDisplayString } from "vue";
2
2
  import { AvatarRoot, AvatarImage, AvatarFallback } from "reka-ui";
3
3
  import { tv } from "tailwind-variants";
4
- import { _ as _sfc_main$1 } from "./LpContextMenu-1cKew_Dc.js";
4
+ import { _ as _sfc_main$1 } from "./LpContextMenu-EF_90u3g.js";
5
5
  import { _ as _sfc_main$2 } from "./LpIcon-DYtaid0K.js";
6
6
  import { useMergedAttrs } from "../composables/useMergedClass.js";
7
7
  const __default__ = { inheritAttrs: false };
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, computed, openBlock, createBlock, withCtx, resolveDynamicComponent, mergeProps, unref, renderSlot } from "vue";
2
2
  import { tv } from "tailwind-variants";
3
3
  import { useMergedAttrs } from "../composables/useMergedClass.js";
4
- import { _ as _sfc_main$1 } from "./LpContextMenu-1cKew_Dc.js";
4
+ import { _ as _sfc_main$1 } from "./LpContextMenu-EF_90u3g.js";
5
5
  const __default__ = { inheritAttrs: false };
6
6
  const _sfc_main = /* @__PURE__ */ defineComponent({
7
7
  ...__default__,
@@ -26,7 +26,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
26
26
  }
27
27
  const field = useFieldControl(() => ({ wrapped: false, id: props.id, disabled: props.disabled }));
28
28
  const { class: rootClass, attrs: rest } = useMergedAttrs(
29
- "group inline-flex cursor-pointer items-center gap-2 text-sm text-ink"
29
+ "group/check inline-flex cursor-pointer items-center gap-2 text-sm text-ink"
30
30
  );
31
31
  return (_ctx, _cache) => {
32
32
  return openBlock(), createElementBlock("label", mergeProps({ class: unref(rootClass) }, unref(rest)), [
@@ -36,7 +36,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
36
36
  "model-value": __props.indeterminate ? "indeterminate" : __props.modelValue,
37
37
  disabled: unref(field).disabled,
38
38
  "aria-describedby": unref(field).describedBy,
39
- class: "flex size-[18px] items-center justify-center rounded-[5px] border border-line-strong bg-surface-soft outline-none transition-[color,background-color,border-color,box-shadow,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] not-data-[state=checked]:not-data-[state=indeterminate]:group-hover:border-brand active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring data-[state=checked]:border-transparent data-[state=checked]:bg-brand data-[state=indeterminate]:border-transparent data-[state=indeterminate]:bg-brand disabled:cursor-not-allowed disabled:opacity-55",
39
+ class: "flex size-[18px] items-center justify-center rounded-[5px] border border-line-strong bg-surface-soft outline-none transition-[color,background-color,border-color,box-shadow,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] not-data-[state=checked]:not-data-[state=indeterminate]:group-hover/check:border-brand active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring data-[state=checked]:border-transparent data-[state=checked]:bg-brand data-[state=indeterminate]:border-transparent data-[state=indeterminate]:bg-brand disabled:cursor-not-allowed disabled:opacity-55",
40
40
  "onUpdate:modelValue": onUpdate
41
41
  }, {
42
42
  default: withCtx(() => [
@@ -5,7 +5,7 @@ import { useFieldControl } from "../composables/useField.js";
5
5
  import { DEFAULT_SWATCHES, formatColor, opaqueCss, parseColor, rgbToHsv, isLight, clampHsv } from "../components/color.js";
6
6
  import { useClipboard } from "../composables/useClipboard.js";
7
7
  import { POPOVER_PANEL } from "../components/dropdown.js";
8
- import { _ as _sfc_main$1 } from "./LpContextMenu-1cKew_Dc.js";
8
+ import { _ as _sfc_main$1 } from "./LpContextMenu-EF_90u3g.js";
9
9
  import { _ as _sfc_main$2 } from "./LpIcon-DYtaid0K.js";
10
10
  import { _ as _sfc_main$3 } from "./LpRollingText-DB7upf-5.js";
11
11
  const _hoisted_1 = ["id", "disabled", "aria-label", "aria-invalid", "aria-describedby"];
@@ -24,6 +24,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
24
24
  const text = el instanceof HTMLTextAreaElement || el instanceof HTMLInputElement && SELECTABLE.has(el.type);
25
25
  field = text ? { el, value: el.value, start: el.selectionStart ?? 0, end: el.selectionEnd ?? 0 } : null;
26
26
  }
27
+ function keepContextMenu(event) {
28
+ if (enabled.value) event.stopPropagation();
29
+ }
27
30
  function returnFocus(event) {
28
31
  const saved = field;
29
32
  field = null;
@@ -38,7 +41,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
38
41
  createVNode(unref(ContextMenuTrigger), {
39
42
  "as-child": "",
40
43
  disabled: !enabled.value,
41
- onContextmenuCapture: rememberField
44
+ onContextmenuCapture: rememberField,
45
+ onContextmenu: keepContextMenu
42
46
  }, {
43
47
  default: withCtx(() => [
44
48
  renderSlot(_ctx.$slots, "default")
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, ref, watch, computed, openBlock, createElementBlock, mergeProps, unref, Fragment, renderList, normalizeStyle, createBlock, createVNode, withCtx, createElementVNode, renderSlot, normalizeProps, guardReactiveProps, createTextVNode, toDisplayString, createCommentVNode } from "vue";
2
2
  import { computeStats, formatSize, sortNodes, subtreeIds, ancestorIds } from "../components/fileTree.js";
3
3
  import { _ as _sfc_main$1 } from "./LpEmptyState-BJbZXC8D.js";
4
- import { _ as _sfc_main$3 } from "./LpFileTreeNode-BvMSBM7X.js";
4
+ import { _ as _sfc_main$3 } from "./LpFileTreeNode-B4uB8Ks_.js";
5
5
  import { _ as _sfc_main$2 } from "./LpScrollArea-Hz3-JWUG.js";
6
6
  import { useMergedAttrs } from "../composables/useMergedClass.js";
7
7
  import { useLabels } from "../composables/useLpConfig.js";
@@ -1,8 +1,8 @@
1
1
  import { defineComponent, computed, resolveComponent, openBlock, createElementBlock, mergeProps, unref, createVNode, withCtx, createElementVNode, withModifiers, normalizeStyle, normalizeClass, createBlock, createCommentVNode, renderSlot, createTextVNode, toDisplayString, Transition, Fragment, renderList } from "vue";
2
2
  import { prefersReducedMotion, easingToken } from "../composables/easing.js";
3
3
  import { sortNodes, formatSize, formatModified, fileIcon } from "../components/fileTree.js";
4
- import { _ as _sfc_main$3 } from "./LpCheckbox-Bkj13CbW.js";
5
- import { _ as _sfc_main$1 } from "./LpContextMenu-1cKew_Dc.js";
4
+ import { _ as _sfc_main$3 } from "./LpCheckbox-DvVYeOD-.js";
5
+ import { _ as _sfc_main$1 } from "./LpContextMenu-EF_90u3g.js";
6
6
  import { _ as _sfc_main$2 } from "./LpIcon-DYtaid0K.js";
7
7
  import { useMergedAttrs } from "../composables/useMergedClass.js";
8
8
  const _hoisted_1 = ["aria-level", "aria-selected", "aria-expanded", "aria-disabled"];
@@ -2,7 +2,7 @@ import { defineComponent, useModel, computed, ref, shallowRef, onMounted, onBefo
2
2
  import { prefersReducedMotion } from "../composables/easing.js";
3
3
  import { useClipboard } from "../composables/useClipboard.js";
4
4
  import { useHotkeys } from "../composables/useHotkeys.js";
5
- import { _ as _sfc_main$3 } from "./LpContextMenu-1cKew_Dc.js";
5
+ import { _ as _sfc_main$3 } from "./LpContextMenu-EF_90u3g.js";
6
6
  import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
7
7
  import { _ as _sfc_main$2 } from "./LpScrollArea-Hz3-JWUG.js";
8
8
  import { useMergedAttrs } from "../composables/useMergedClass.js";
@@ -4,7 +4,7 @@ import { useLabels } from "../composables/useLpConfig.js";
4
4
  import { _ as _sfc_main$2 } from "./LpButton-CKSwC6Mu.js";
5
5
  import { _ as _sfc_main$3 } from "./LpIcon-DYtaid0K.js";
6
6
  import { _ as _sfc_main$1 } from "./LpModal-JNa3B_Lr.js";
7
- import { _ as _sfc_main$4 } from "./LpSidebar-DpEiGi8L.js";
7
+ import { _ as _sfc_main$4 } from "./LpSidebar-C2oolgwy.js";
8
8
  const _hoisted_1 = { class: "flex items-center gap-2" };
9
9
  const _sfc_main = /* @__PURE__ */ defineComponent({
10
10
  __name: "LpModalNav",
@@ -2,7 +2,7 @@ import { defineComponent, computed, useModel, getCurrentInstance, ref, onMounted
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { _ as _sfc_main$8 } from "./LpBadge-Fe0D1bYx.js";
4
4
  import { _ as _sfc_main$7 } from "./LpButton-CKSwC6Mu.js";
5
- import { _ as _sfc_main$5 } from "./LpContextMenu-1cKew_Dc.js";
5
+ import { _ as _sfc_main$5 } from "./LpContextMenu-EF_90u3g.js";
6
6
  import { _ as _sfc_main$3 } from "./LpEmptyState-BJbZXC8D.js";
7
7
  import { _ as _sfc_main$6 } from "./LpIcon-DYtaid0K.js";
8
8
  import { _ as _sfc_main$1 } from "./LpPopover-DCKeqiVn.js";
@@ -0,0 +1,131 @@
1
+ import { defineComponent, computed, ref, watch, openBlock, createBlock, unref, mergeProps, withCtx, createElementBlock, Fragment, renderList, createVNode, normalizeClass, createCommentVNode } from "vue";
2
+ import { PinInputRoot, PinInputInput } from "reka-ui";
3
+ import { useFieldControl } from "../composables/useField.js";
4
+ import { useMergedAttrs } from "../composables/useMergedClass.js";
5
+ import { splitCode, upperCells, joinCells, groupBreaks } from "../components/otp.js";
6
+ const _hoisted_1 = {
7
+ key: 0,
8
+ "aria-hidden": "true",
9
+ class: "h-0.5 w-2 shrink-0 rounded-full bg-muted opacity-60"
10
+ };
11
+ const __default__ = { inheritAttrs: false };
12
+ const _sfc_main = /* @__PURE__ */ defineComponent({
13
+ ...__default__,
14
+ __name: "LpOtpInput",
15
+ props: {
16
+ modelValue: {},
17
+ length: { default: 6 },
18
+ disabled: { type: Boolean },
19
+ mask: { type: Boolean },
20
+ alphanumeric: { type: Boolean, default: false },
21
+ uppercase: { type: Boolean, default: void 0 },
22
+ group: {},
23
+ invalid: { type: Boolean },
24
+ size: { default: "md" }
25
+ },
26
+ emits: ["update:modelValue", "complete"],
27
+ setup(__props, { emit: __emit }) {
28
+ const props = __props;
29
+ const emit = __emit;
30
+ const upper = computed(() => props.alphanumeric && (props.uppercase ?? true));
31
+ const local = ref(splitCode(props.modelValue, props.length));
32
+ let emitted = props.modelValue ?? "";
33
+ watch(
34
+ () => props.modelValue ?? "",
35
+ (value) => {
36
+ if (value === emitted) return;
37
+ emitted = value;
38
+ local.value = splitCode(value, props.length);
39
+ }
40
+ );
41
+ watch(
42
+ () => props.length,
43
+ (length) => {
44
+ local.value = local.value.slice(0, length);
45
+ }
46
+ );
47
+ const cells = computed({
48
+ get: () => local.value,
49
+ set: (arr) => {
50
+ local.value = upper.value ? upperCells(arr) : arr;
51
+ emitted = joinCells(local.value);
52
+ emit("update:modelValue", emitted);
53
+ }
54
+ });
55
+ const field = useFieldControl(() => ({
56
+ wrapped: false,
57
+ invalid: props.invalid,
58
+ disabled: props.disabled
59
+ }));
60
+ function onComplete(arr) {
61
+ emit("complete", joinCells(upper.value ? upperCells(arr) : arr));
62
+ }
63
+ const breaks = computed(() => groupBreaks(props.length, props.group));
64
+ const root = ref(null);
65
+ function onBeforeInput(event, index) {
66
+ if (event.inputType !== "deleteContentBackward") return;
67
+ event.preventDefault();
68
+ const target = event.target;
69
+ const next = [...local.value];
70
+ let clear = index;
71
+ if (!target.value && index > 0) {
72
+ clear = index - 1;
73
+ root.value?.$el.querySelectorAll("input")[clear]?.focus();
74
+ }
75
+ next[clear] = props.alphanumeric ? "" : void 0;
76
+ cells.value = next;
77
+ }
78
+ const cellSize = {
79
+ sm: "max-w-9 text-base",
80
+ md: "max-w-11 text-lg",
81
+ lg: "max-w-13 text-xl"
82
+ };
83
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
84
+ "flex min-w-0 max-w-full items-center gap-1.5 sm:gap-2"
85
+ );
86
+ return (_ctx, _cache) => {
87
+ return openBlock(), createBlock(unref(PinInputRoot), mergeProps({
88
+ ref_key: "root",
89
+ ref: root,
90
+ modelValue: cells.value,
91
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => cells.value = $event),
92
+ type: __props.alphanumeric ? "text" : "number",
93
+ mask: __props.mask,
94
+ disabled: unref(field).disabled,
95
+ otp: "",
96
+ class: unref(rootClass)
97
+ }, unref(rest), { onComplete }), {
98
+ default: withCtx(() => [
99
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.length, (i) => {
100
+ return openBlock(), createElementBlock(Fragment, { key: i }, [
101
+ createVNode(unref(PinInputInput), {
102
+ index: i - 1,
103
+ id: i === 1 ? unref(field).id : void 0,
104
+ "aria-invalid": unref(field).invalid || void 0,
105
+ "aria-describedby": unref(field).describedBy,
106
+ autocapitalize: upper.value ? "characters" : "none",
107
+ autocorrect: "off",
108
+ spellcheck: false,
109
+ class: normalizeClass([
110
+ cellSize[__props.size],
111
+ "aspect-square h-auto min-w-0 flex-1 basis-0 p-0",
112
+ "rounded-control border bg-surface-soft text-center font-semibold text-ink caret-brand",
113
+ "outline-none transition-colors duration-[var(--duration-fast)]",
114
+ "focus:border-brand focus:ring-2 focus:ring-ring",
115
+ "disabled:cursor-not-allowed disabled:opacity-55",
116
+ unref(field).invalid ? "border-danger focus:border-danger focus:ring-danger-soft" : "border-line"
117
+ ]),
118
+ onBeforeinput: ($event) => onBeforeInput($event, i - 1)
119
+ }, null, 8, ["index", "id", "aria-invalid", "aria-describedby", "autocapitalize", "class", "onBeforeinput"]),
120
+ breaks.value.has(i - 1) ? (openBlock(), createElementBlock("span", _hoisted_1)) : createCommentVNode("", true)
121
+ ], 64);
122
+ }), 128))
123
+ ]),
124
+ _: 1
125
+ }, 16, ["modelValue", "type", "mask", "disabled", "class"]);
126
+ };
127
+ }
128
+ });
129
+ export {
130
+ _sfc_main as _
131
+ };
@@ -2,7 +2,7 @@ import { defineComponent, computed, ref, watch, onBeforeUnmount, openBlock, crea
2
2
  import { prefersReducedMotion, easeTravel } from "../composables/easing.js";
3
3
  import { useReveal } from "../composables/useReveal.js";
4
4
  import { resolveSlices, arcPath, calloutLabels, formatTick } from "../components/chart.js";
5
- import { _ as _sfc_main$2 } from "./LpContextMenu-1cKew_Dc.js";
5
+ import { _ as _sfc_main$2 } from "./LpContextMenu-EF_90u3g.js";
6
6
  import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
7
7
  import { _ as _sfc_main$4 } from "./LpNumberFlow-z4WPZcZu.js";
8
8
  import { _ as _sfc_main$5 } from "./LpRollingText-DB7upf-5.js";
@@ -14,7 +14,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
14
14
  const props = __props;
15
15
  const { class: rootClass, attrs: rest } = useMergedAttrs(
16
16
  () => [
17
- "group inline-flex cursor-pointer items-center gap-2 text-sm text-ink",
17
+ "group/radio inline-flex cursor-pointer items-center gap-2 text-sm text-ink",
18
18
  props.disabled ? "cursor-not-allowed opacity-55" : ""
19
19
  ].join(" ")
20
20
  );
@@ -23,7 +23,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
23
23
  createVNode(unref(RadioGroupItem), {
24
24
  value: __props.value,
25
25
  disabled: __props.disabled,
26
- class: "flex size-[18px] shrink-0 items-center justify-center rounded-full border border-line-strong bg-surface-soft outline-none transition-[color,border-color,box-shadow,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] not-data-[state=checked]:group-hover:border-brand active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring data-[state=checked]:border-brand disabled:cursor-not-allowed disabled:opacity-55"
26
+ class: "flex size-[18px] shrink-0 items-center justify-center rounded-full border border-line-strong bg-surface-soft outline-none transition-[color,border-color,box-shadow,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] not-data-[state=checked]:group-hover/radio:border-brand active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring data-[state=checked]:border-brand disabled:cursor-not-allowed disabled:opacity-55"
27
27
  }, {
28
28
  default: withCtx(() => [
29
29
  createVNode(unref(RadioGroupIndicator), { class: "flex data-[state=checked]:animate-[indicator-in_140ms_var(--ease-emphasized)]" }, {
@@ -35,11 +35,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
35
35
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (opt) => {
36
36
  return openBlock(), createElementBlock("label", {
37
37
  key: opt.value,
38
- class: "group inline-flex cursor-pointer items-center gap-2 text-sm text-ink"
38
+ class: "group/radio inline-flex cursor-pointer items-center gap-2 text-sm text-ink"
39
39
  }, [
40
40
  createVNode(unref(RadioGroupItem), {
41
41
  value: opt.value,
42
- class: "flex size-[18px] items-center justify-center rounded-full border border-line-strong bg-surface-soft outline-none transition-[color,border-color,box-shadow,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] not-data-[state=checked]:group-hover:border-brand active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring data-[state=checked]:border-brand disabled:cursor-not-allowed disabled:opacity-55"
42
+ class: "flex size-[18px] items-center justify-center rounded-full border border-line-strong bg-surface-soft outline-none transition-[color,border-color,box-shadow,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] not-data-[state=checked]:group-hover/radio:border-brand active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring data-[state=checked]:border-brand disabled:cursor-not-allowed disabled:opacity-55"
43
43
  }, {
44
44
  default: withCtx(() => [
45
45
  createVNode(unref(RadioGroupIndicator), { class: "flex data-[state=checked]:animate-[indicator-in_140ms_var(--ease-emphasized)]" }, {
@@ -2,7 +2,7 @@ import { defineComponent, computed, ref, useId, openBlock, createElementBlock, F
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { _ as _sfc_main$3 } from "./LpDrawer-CBFVD624.js";
4
4
  import { _ as _sfc_main$1 } from "./LpInput-D-YGQbEv.js";
5
- import { _ as _sfc_main$2 } from "./LpSidebarNav-BUuxipX-.js";
5
+ import { _ as _sfc_main$2 } from "./LpSidebarNav-C9dHu-2b.js";
6
6
  const _hoisted_1 = ["aria-label"];
7
7
  const _hoisted_2 = {
8
8
  key: 2,
@@ -3,7 +3,7 @@ import { Motion } from "motion-v";
3
3
  import { CollapsibleRoot, CollapsibleTrigger, CollapsibleContent } from "reka-ui";
4
4
  import { usePillTransition } from "../composables/usePillTransition.js";
5
5
  import { _ as _sfc_main$3 } from "./LpBadge-Fe0D1bYx.js";
6
- import { _ as _sfc_main$4 } from "./LpContextMenu-1cKew_Dc.js";
6
+ import { _ as _sfc_main$4 } from "./LpContextMenu-EF_90u3g.js";
7
7
  import { _ as _sfc_main$2 } from "./LpIcon-DYtaid0K.js";
8
8
  import { _ as _sfc_main$1 } from "./LpScrollArea-Hz3-JWUG.js";
9
9
  import { resolveLink } from "../components/link.js";
@@ -27,8 +27,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
27
27
  const emit = __emit;
28
28
  const slots = useSlots();
29
29
  const labelled = computed(() => Boolean(props.label || props.description || slots.default));
30
- const TRACK = "group inline-flex h-5 w-9 shrink-0 items-center rounded-pill border border-line bg-surface-soft px-0.5 outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring data-[state=checked]:border-transparent data-[state=checked]:bg-brand disabled:cursor-not-allowed disabled:opacity-55";
31
- const THUMB = "h-3.5 w-3.5 rounded-full bg-ink shadow transition-[translate,width,background-color] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] group-active:w-5 group-data-[state=checked]:translate-x-4 group-data-[state=checked]:bg-ink-inverse group-data-[state=checked]:group-active:translate-x-2.5 motion-reduce:group-active:w-3.5";
30
+ const TRACK = "group/switch inline-flex h-5 w-9 shrink-0 items-center rounded-pill border border-line bg-surface-soft px-0.5 outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring data-[state=checked]:border-transparent data-[state=checked]:bg-brand disabled:cursor-not-allowed disabled:opacity-55";
31
+ const THUMB = "h-3.5 w-3.5 rounded-full bg-ink shadow transition-[translate,width,background-color] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] group-active/switch:w-5 group-data-[state=checked]/switch:translate-x-4 group-data-[state=checked]/switch:bg-ink-inverse group-data-[state=checked]/switch:group-active/switch:translate-x-2.5 motion-reduce:group-active/switch:w-3.5";
32
32
  const { class: rootClass, attrs: rest } = useMergedAttrs(() => {
33
33
  if (!labelled.value) return TRACK;
34
34
  return props.labelPosition === "start" ? "flex w-full cursor-pointer items-center justify-between gap-3 text-sm text-ink" : "inline-flex cursor-pointer items-center gap-2 text-sm text-ink";
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, ref, computed, openBlock, createElementBlock, createBlock, createCommentVNode, createElementVNode, Fragment, unref, normalizeClass, toDisplayString, createVNode, withCtx, renderList } from "vue";
2
- import { _ as _sfc_main$3 } from "./LpCheckbox-Bkj13CbW.js";
2
+ import { _ as _sfc_main$3 } from "./LpCheckbox-DvVYeOD-.js";
3
3
  import { _ as _sfc_main$1 } from "./LpInput-D-YGQbEv.js";
4
4
  import { _ as _sfc_main$2 } from "./LpShift-DXNsauQZ.js";
5
5
  import { usePaintSelect } from "../composables/usePaintSelect.js";
@@ -1,9 +1,22 @@
1
- import { defineComponent, ref, watch, nextTick, useId, computed, openBlock, createBlock, unref, withCtx, createVNode, normalizeClass, createElementBlock, Fragment, renderList, createCommentVNode, createElementVNode, toDisplayString, renderSlot } from "vue";
1
+ import { defineComponent, computed, ref, watch, nextTick, useId, openBlock, createBlock, unref, withCtx, createVNode, normalizeClass, createElementBlock, Fragment, renderList, createCommentVNode, createElementVNode, toDisplayString, renderSlot } from "vue";
2
2
  import { useReducedMotion, Motion } from "motion-v";
3
3
  import { TabsRoot, TabsList, TabsTrigger, TabsContent } from "reka-ui";
4
4
  import { usePillTransition } from "../composables/usePillTransition.js";
5
5
  import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
6
- const _hoisted_1 = { class: "relative z-10" };
6
+ const _hoisted_1 = {
7
+ key: 1,
8
+ class: "relative z-10 inline-flex"
9
+ };
10
+ const _hoisted_2 = {
11
+ key: 0,
12
+ "aria-hidden": "true",
13
+ class: "absolute -right-1 -top-0.5 size-2 rounded-full bg-accent"
14
+ };
15
+ const _hoisted_3 = {
16
+ key: 2,
17
+ "aria-hidden": "true",
18
+ class: "relative z-10 size-1.5 self-start rounded-full bg-accent"
19
+ };
7
20
  const _sfc_main = /* @__PURE__ */ defineComponent({
8
21
  __name: "LpTabs",
9
22
  props: {
@@ -12,11 +25,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
12
25
  items: {},
13
26
  variant: { default: "contained" },
14
27
  accent: { type: Boolean, default: false },
15
- block: { type: Boolean, default: false }
28
+ block: { type: Boolean, default: false },
29
+ label: {}
16
30
  },
17
31
  emits: ["update:modelValue"],
18
32
  setup(__props, { emit: __emit }) {
19
33
  const props = __props;
34
+ const bottom = computed(() => props.variant === "bottom");
20
35
  const emit = __emit;
21
36
  const current = ref(props.modelValue ?? props.defaultValue ?? props.items[0]?.value);
22
37
  watch(
@@ -50,6 +65,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
50
65
  () => reduceMotion.value ? { duration: 0 } : { type: "spring", stiffness: 520, damping: 42, mass: 0.9 }
51
66
  );
52
67
  function pillUnder(value, active) {
68
+ if (bottom.value) return active === value;
53
69
  return hovered.value ? hovered.value === value : active === value;
54
70
  }
55
71
  function releaseFocusAfterPointer(event) {
@@ -65,11 +81,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
65
81
  createVNode(unref(TabsList), {
66
82
  ref_key: "list",
67
83
  ref: list,
68
- class: normalizeClass(["max-w-full gap-1 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", [
84
+ "aria-label": __props.label,
85
+ class: normalizeClass(bottom.value ? "grid w-full auto-cols-fr grid-flow-col border-t border-line bg-surface pb-[env(safe-area-inset-bottom)] pl-[env(safe-area-inset-left)] pr-[env(safe-area-inset-right)]" : [
86
+ "max-w-full gap-1 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
69
87
  __props.block ? "flex w-full" : "inline-flex",
70
88
  __props.variant === "contained" ? "rounded-control border border-line bg-surface-soft p-1" : "",
71
89
  __props.variant === "underline" ? "border-b border-line" : ""
72
- ]]),
90
+ ]),
73
91
  onPointerleave: _cache[0] || (_cache[0] = ($event) => hovered.value = null)
74
92
  }, {
75
93
  default: withCtx(() => [
@@ -77,11 +95,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
77
95
  return openBlock(), createBlock(unref(TabsTrigger), {
78
96
  key: item.value,
79
97
  value: item.value,
80
- class: normalizeClass(["relative inline-flex shrink-0 items-center justify-center gap-1.5 whitespace-nowrap text-sm outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring", [
81
- __props.block ? "flex-1" : "",
82
- __props.variant === "underline" ? "rounded-t-md px-3 pt-1.5 pb-2" : "rounded-md px-3 py-1.5",
98
+ class: normalizeClass(["relative inline-flex items-center justify-center outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring", [
99
+ bottom.value ? "min-h-14 min-w-0 flex-col gap-0.5 px-1 py-1.5 text-[11px] font-medium focus-visible:ring-inset" : "shrink-0 gap-1.5 whitespace-nowrap text-sm",
100
+ __props.block && !bottom.value ? "flex-1" : "",
101
+ __props.variant === "underline" ? "rounded-t-md px-3 pt-1.5 pb-2" : "",
102
+ __props.variant === "contained" || __props.variant === "plain" ? "rounded-md px-3 py-1.5" : "",
83
103
  __props.accent ? "data-[state=active]:text-brand" : "data-[state=active]:text-ink",
84
- hovered.value === item.value ? "text-ink" : "text-muted"
104
+ hovered.value === item.value && !bottom.value ? "text-ink" : "text-muted"
85
105
  ]]),
86
106
  onPointerenter: ($event) => hovered.value = item.value,
87
107
  onPointerup: releaseFocusAfterPointer
@@ -94,25 +114,32 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
94
114
  class: normalizeClass(__props.variant === "underline" ? [
95
115
  "absolute inset-x-0 -bottom-px z-0 h-0.5 rounded-full",
96
116
  __props.accent ? "bg-brand" : "bg-ink"
117
+ ] : bottom.value ? [
118
+ "absolute inset-x-[22%] top-0 z-0 h-0.5 rounded-b-full",
119
+ __props.accent ? "bg-brand" : "bg-ink"
97
120
  ] : [
98
121
  "absolute inset-0 z-0 rounded-md shadow-sm",
99
122
  __props.accent ? "border border-brand/35 bg-brand/12" : "border border-line bg-surface-raised"
100
123
  ])
101
124
  }, null, 8, ["transition", "class"])) : createCommentVNode("", true),
102
- item.icon ? (openBlock(), createBlock(_sfc_main$1, {
103
- key: 1,
104
- name: item.icon,
105
- size: 14,
106
- class: "relative z-10"
107
- }, null, 8, ["name"])) : createCommentVNode("", true),
108
- createElementVNode("span", _hoisted_1, toDisplayString(item.label), 1)
125
+ item.icon ? (openBlock(), createElementBlock("span", _hoisted_1, [
126
+ createVNode(_sfc_main$1, {
127
+ name: item.icon,
128
+ size: bottom.value ? 22 : 14
129
+ }, null, 8, ["name", "size"]),
130
+ item.dot ? (openBlock(), createElementBlock("span", _hoisted_2)) : createCommentVNode("", true)
131
+ ])) : createCommentVNode("", true),
132
+ createElementVNode("span", {
133
+ class: normalizeClass(["relative z-10", bottom.value ? "max-w-full truncate" : ""])
134
+ }, toDisplayString(item.label), 3),
135
+ item.dot && !item.icon ? (openBlock(), createElementBlock("span", _hoisted_3)) : createCommentVNode("", true)
109
136
  ]),
110
137
  _: 2
111
138
  }, 1032, ["value", "class", "onPointerenter"]);
112
139
  }), 128))
113
140
  ]),
114
141
  _: 1
115
- }, 8, ["class"]),
142
+ }, 8, ["aria-label", "class"]),
116
143
  _ctx.$slots.panel ? (openBlock(), createBlock(unref(Motion), {
117
144
  key: 0,
118
145
  layout: true,
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, computed, onMounted, ref, openBlock, createBlock, withCtx, createElementVNode, normalizeClass, createElementBlock, createVNode, toDisplayString, createCommentVNode } from "vue";
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { u as useTheme, p as presets } from "./useTheme-DJm1JSsY.js";
4
- import { _ as _sfc_main$1 } from "./LpContextMenu-1cKew_Dc.js";
4
+ import { _ as _sfc_main$1 } from "./LpContextMenu-EF_90u3g.js";
5
5
  import { _ as _sfc_main$2 } from "./LpIcon-DYtaid0K.js";
6
6
  const _hoisted_1 = ["aria-label", "title"];
7
7
  const _hoisted_2 = {
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpAppShell-BmMYcEVx.js";
1
+ import { _ as _sfc_main } from "../chunks/LpAppShell-DcSXik4a.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpAvatar-Cb1jtOVv.js";
1
+ import { _ as _sfc_main } from "../chunks/LpAvatar-LTvy0OkE.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpCard-BdxkMXjo.js";
1
+ import { _ as _sfc_main } from "../chunks/LpCard-DbjO5yaF.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -5,7 +5,7 @@ import { prefersReducedMotion, easeTravel } from "../composables/easing.js";
5
5
  import { usePillTransition } from "../composables/usePillTransition.js";
6
6
  import { useReveal } from "../composables/useReveal.js";
7
7
  import { normalise, pointCount, resolveLabels, extent, axisTicks, plotHeight, plotWidth, xAt, yAt, areaPath, linePath, barPath, markerIndex, chartSummary, niceScale, nearestIndex, formatTick } from "./chart.js";
8
- import { _ as _sfc_main$1 } from "../chunks/LpContextMenu-1cKew_Dc.js";
8
+ import { _ as _sfc_main$1 } from "../chunks/LpContextMenu-EF_90u3g.js";
9
9
  import { _ as _sfc_main$2 } from "../chunks/LpIcon-DYtaid0K.js";
10
10
  import { _ as _sfc_main$3 } from "../chunks/LpShift-DXNsauQZ.js";
11
11
  import { useMergedAttrs } from "../composables/useMergedClass.js";
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpCheckbox-Bkj13CbW.js";
1
+ import { _ as _sfc_main } from "../chunks/LpCheckbox-DvVYeOD-.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpColorPicker-BLqPX5Vw.js";
1
+ import { _ as _sfc_main } from "../chunks/LpColorPicker-D1sQqtXS.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, ref, useId, computed, shallowRef, watch, useSlots, onBeforeUnmount, nextTick, openBlock, createBlock, unref, withCtx, createVNode, normalizeStyle, normalizeClass, withModifiers, createTextVNode, toDisplayString, createElementVNode, createElementBlock, Fragment, renderList, createCommentVNode, withDirectives, withKeys, vModelText, resolveDynamicComponent, Transition, renderSlot } from "vue";
2
2
  import { DialogRoot, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription } from "reka-ui";
3
- import { _ as _sfc_main$3 } from "../chunks/LpAvatar-Cb1jtOVv.js";
3
+ import { _ as _sfc_main$3 } from "../chunks/LpAvatar-LTvy0OkE.js";
4
4
  import { _ as _sfc_main$1 } from "../chunks/LpIcon-DYtaid0K.js";
5
5
  import { _ as _sfc_main$2 } from "../chunks/LpScrollArea-Hz3-JWUG.js";
6
6
  import { useAsyncTask } from "../composables/useAsyncTask.js";
@@ -38,9 +38,9 @@ type __VLS_Props = {
38
38
  titleIcon?: string;
39
39
  titleImage?: string;
40
40
  };
41
- declare var __VLS_16: {};
41
+ declare var __VLS_17: {};
42
42
  type __VLS_Slots = {} & {
43
- default?: (props: typeof __VLS_16) => any;
43
+ default?: (props: typeof __VLS_17) => any;
44
44
  };
45
45
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
46
46
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpContextMenu-1cKew_Dc.js";
1
+ import { _ as _sfc_main } from "../chunks/LpContextMenu-EF_90u3g.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpFileTree-bk5VjBey.js";
1
+ import { _ as _sfc_main } from "../chunks/LpFileTree-3E4w4Rjr.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpFileTreeNode-BvMSBM7X.js";
1
+ import { _ as _sfc_main } from "../chunks/LpFileTreeNode-B4uB8Ks_.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpLogViewer-BDFXzvcl.js";
1
+ import { _ as _sfc_main } from "../chunks/LpLogViewer-BfgtXVKm.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpModalNav-BAxC9et7.js";
1
+ import { _ as _sfc_main } from "../chunks/LpModalNav-aWwc_5CD.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpNotificationBell-DsqSyMwS.js";
1
+ import { _ as _sfc_main } from "../chunks/LpNotificationBell-wZ3meeim.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };