@leavepulse/ui 0.53.0 → 0.53.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.
Files changed (50) 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/{LpPie-BdSnta11.js → LpPie-B7ti5qCH.js} +1 -1
  13. package/dist/chunks/{LpRadio-B5AfqTpZ.js → LpRadio-CWA5Eb3M.js} +2 -2
  14. package/dist/chunks/{LpRadioGroup-DmEW0l78.js → LpRadioGroup-CCn-Q2_c.js} +2 -2
  15. package/dist/chunks/{LpSidebar-DpEiGi8L.js → LpSidebar-C2oolgwy.js} +1 -1
  16. package/dist/chunks/{LpSidebarNav-BUuxipX-.js → LpSidebarNav-C9dHu-2b.js} +1 -1
  17. package/dist/chunks/{LpSwitch-OrcOJX9m.js → LpSwitch-DG2AhXIL.js} +2 -2
  18. package/dist/chunks/{LpTableFilter-BV8PpLM9.js → LpTableFilter-CrW7_Rj4.js} +1 -1
  19. package/dist/chunks/{LpThemeSwitcher-BbYFFT5w.js → LpThemeSwitcher-CPmhYOjX.js} +1 -1
  20. package/dist/components/LpAppShell.vue.js +1 -1
  21. package/dist/components/LpAvatar.vue.js +1 -1
  22. package/dist/components/LpCard.vue.js +1 -1
  23. package/dist/components/LpChart.vue.js +1 -1
  24. package/dist/components/LpCheckbox.vue.js +1 -1
  25. package/dist/components/LpColorPicker.vue.js +1 -1
  26. package/dist/components/LpCommandPalette.vue.js +1 -1
  27. package/dist/components/LpContextMenu.vue.d.ts +2 -2
  28. package/dist/components/LpContextMenu.vue.js +1 -1
  29. package/dist/components/LpFileTree.vue.js +1 -1
  30. package/dist/components/LpFileTreeNode.vue.js +1 -1
  31. package/dist/components/LpLogViewer.vue.js +1 -1
  32. package/dist/components/LpModalNav.vue.js +1 -1
  33. package/dist/components/LpNotificationBell.vue.js +1 -1
  34. package/dist/components/LpPaletteHeader.vue.js +1 -1
  35. package/dist/components/LpPie.vue.js +1 -1
  36. package/dist/components/LpRadio.vue.js +1 -1
  37. package/dist/components/LpRadioGroup.vue.js +1 -1
  38. package/dist/components/LpSidebar.vue.js +1 -1
  39. package/dist/components/LpSidebarNav.vue.js +1 -1
  40. package/dist/components/LpSwitch.vue.js +1 -1
  41. package/dist/components/LpTable.vue.js +3 -3
  42. package/dist/components/LpTableFilter.vue.js +1 -1
  43. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  44. package/dist/index.js +16 -16
  45. package/package.json +1 -1
  46. package/src/components/LpCheckbox.vue +2 -2
  47. package/src/components/LpContextMenu.vue +18 -1
  48. package/src/components/LpRadio.vue +2 -2
  49. package/src/components/LpRadioGroup.vue +2 -2
  50. package/src/components/LpSwitch.vue +2 -2
@@ -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";
@@ -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,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
  };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, computed, openBlock, createElementBlock, createElementVNode, renderSlot, createBlock, createVNode, createCommentVNode, toDisplayString } from "vue";
2
- import { _ as _sfc_main$1 } from "../chunks/LpAvatar-Cb1jtOVv.js";
2
+ import { _ as _sfc_main$1 } from "../chunks/LpAvatar-LTvy0OkE.js";
3
3
  import { _ as _sfc_main$2 } from "../chunks/LpIcon-DYtaid0K.js";
4
4
  import { _ as _sfc_main$3 } from "../chunks/HighlightText-BvnYZkhi.js";
5
5
  import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpPie-BdSnta11.js";
1
+ import { _ as _sfc_main } from "../chunks/LpPie-B7ti5qCH.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpRadio-B5AfqTpZ.js";
1
+ import { _ as _sfc_main } from "../chunks/LpRadio-CWA5Eb3M.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpRadioGroup-DmEW0l78.js";
1
+ import { _ as _sfc_main } from "../chunks/LpRadioGroup-CCn-Q2_c.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebar-DpEiGi8L.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebar-C2oolgwy.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebarNav-BUuxipX-.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebarNav-C9dHu-2b.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSwitch-OrcOJX9m.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSwitch-DG2AhXIL.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,13 +1,13 @@
1
1
  import { defineComponent, computed, useAttrs, ref, shallowRef, watch, onMounted, onBeforeUnmount, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList, createElementVNode, Transition, renderSlot, mergeProps, normalizeStyle, createBlock, TransitionGroup, unref, withModifiers, nextTick } from "vue";
2
- import { _ as _sfc_main$7 } from "../chunks/LpCheckbox-Bkj13CbW.js";
3
- import { _ as _sfc_main$6 } from "../chunks/LpContextMenu-1cKew_Dc.js";
2
+ import { _ as _sfc_main$7 } from "../chunks/LpCheckbox-DvVYeOD-.js";
3
+ import { _ as _sfc_main$6 } from "../chunks/LpContextMenu-EF_90u3g.js";
4
4
  import { _ as _sfc_main$2 } from "../chunks/LpIcon-DYtaid0K.js";
5
5
  import { _ as _sfc_main$a } from "../chunks/LpPagination-BcDlo3r_.js";
6
6
  import { _ as _sfc_main$8 } from "../chunks/LpPopover-DCKeqiVn.js";
7
7
  import { _ as _sfc_main$5 } from "../chunks/LpScrollArea-Hz3-JWUG.js";
8
8
  import { _ as _sfc_main$4 } from "../chunks/LpRollingText-DB7upf-5.js";
9
9
  import { _ as _sfc_main$3 } from "../chunks/LpShift-DXNsauQZ.js";
10
- import { _ as _sfc_main$9 } from "../chunks/LpTableFilter-BV8PpLM9.js";
10
+ import { _ as _sfc_main$9 } from "../chunks/LpTableFilter-CrW7_Rj4.js";
11
11
  import { useAsyncTask } from "../composables/useAsyncTask.js";
12
12
  import { useHotkeys } from "../composables/useHotkeys.js";
13
13
  import { usePaintSelect } from "../composables/usePaintSelect.js";
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpTableFilter-BV8PpLM9.js";
1
+ import { _ as _sfc_main } from "../chunks/LpTableFilter-CrW7_Rj4.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-BbYFFT5w.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-CPmhYOjX.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
package/dist/index.js CHANGED
@@ -4,21 +4,21 @@ import { _ as _3 } from "./chunks/LpMapPicker-Cc84LaM3.js";
4
4
  import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
5
5
  import { _ as _4 } from "./chunks/LpActionBar-CnfFVIwC.js";
6
6
  import { _ as _5 } from "./chunks/LpAlert-B6ilrM7T.js";
7
- import { _ as _6 } from "./chunks/LpAppShell-BmMYcEVx.js";
7
+ import { _ as _6 } from "./chunks/LpAppShell-DcSXik4a.js";
8
8
  import { _ as _7 } from "./chunks/LpAutocomplete-C8IgSMsi.js";
9
- import { _ as _8 } from "./chunks/LpAvatar-Cb1jtOVv.js";
9
+ import { _ as _8 } from "./chunks/LpAvatar-LTvy0OkE.js";
10
10
  import { _ as _9 } from "./chunks/LpBadge-Fe0D1bYx.js";
11
11
  import { _ as _10 } from "./chunks/LpBreadcrumbs-D4TsoFju.js";
12
12
  import { _ as _11 } from "./chunks/LpButton-CKSwC6Mu.js";
13
13
  import { _ as _12 } from "./chunks/LpCalendar-DrA2McTU.js";
14
- import { _ as _13 } from "./chunks/LpCard-BdxkMXjo.js";
14
+ import { _ as _13 } from "./chunks/LpCard-DbjO5yaF.js";
15
15
  import { default as default2 } from "./components/LpChart.vue.js";
16
16
  import { backgroundOf, csvField, downloadFile, fileStem, inlineSvg, resolveCssColor, svgToPng, toCsv } from "./components/exportData.js";
17
17
  import { CHART_PALETTE, axisTicks, chartSummary, formatTick, markerIndex, niceScale, resolveSlices } from "./components/chart.js";
18
- import { _ as _14 } from "./chunks/LpCheckbox-Bkj13CbW.js";
18
+ import { _ as _14 } from "./chunks/LpCheckbox-DvVYeOD-.js";
19
19
  import { _ as _15 } from "./chunks/LpCodeBlock-ca7ANFyW.js";
20
20
  import { tokenizeLines } from "./components/codeHighlight.js";
21
- import { _ as _16 } from "./chunks/LpColorPicker-BLqPX5Vw.js";
21
+ import { _ as _16 } from "./chunks/LpColorPicker-D1sQqtXS.js";
22
22
  import { DEFAULT_SWATCHES, clampHsv, formatColor, hsvToHsl, hsvToRgb, isLight, normalizeHue, opaqueCss, parseColor, parseHex, rgbToHex, rgbToHsv } from "./components/color.js";
23
23
  import { default as default3 } from "./components/LpCommandPalette.vue.js";
24
24
  import { applyQueryFilters, highlightParts, parseCommandQuery, parsePaletteQuery, rankCommandItems } from "./components/commandSearch.js";
@@ -33,7 +33,7 @@ import { comboKeys, comboSteps } from "./components/keys.js";
33
33
  import { _ as _18 } from "./chunks/LpConfirmDialog-Ca-CTlxT.js";
34
34
  import { _ as _19 } from "./chunks/LpConfirmHost-BAaSaT2b.js";
35
35
  import { confirm, useConfirm } from "./components/confirm.js";
36
- import { _ as _20 } from "./chunks/LpContextMenu-1cKew_Dc.js";
36
+ import { _ as _20 } from "./chunks/LpContextMenu-EF_90u3g.js";
37
37
  import { _ as _21 } from "./chunks/LpDatePicker-BrdFtSTy.js";
38
38
  import { _ as _22 } from "./chunks/LpDateRangePicker-Drd7EbIz.js";
39
39
  import { _ as _23 } from "./chunks/LpRangeCalendar-DZuaRV0W.js";
@@ -44,7 +44,7 @@ import { _ as _26 } from "./chunks/LpDrawer-CBFVD624.js";
44
44
  import { _ as _27 } from "./chunks/LpDropdownMenu-DrpJJBp0.js";
45
45
  import { default as default9 } from "./components/LpDropzone.vue.js";
46
46
  import { _ as _28 } from "./chunks/LpEmptyState-BJbZXC8D.js";
47
- import { _ as _29 } from "./chunks/LpFileTree-bk5VjBey.js";
47
+ import { _ as _29 } from "./chunks/LpFileTree-3E4w4Rjr.js";
48
48
  import { ancestorIds, checkStateOf, checkedCount, computeStats, fileIcon, formatModified, formatSize, sortNodes, subtreeIds, subtreeSize } from "./components/fileTree.js";
49
49
  import { _ as _30 } from "./chunks/LpFieldNotice-wtieLUTj.js";
50
50
  import { _ as _31 } from "./chunks/LpFormField-CtVYj6tO.js";
@@ -56,25 +56,25 @@ import { _ as _34 } from "./chunks/LpInput-D-YGQbEv.js";
56
56
  import { _ as _35 } from "./chunks/LpLightbox-EVXzAq62.js";
57
57
  import { fileNameOf } from "./components/lightbox.js";
58
58
  import { _ as _36 } from "./chunks/LpLink-Krkjhe_y.js";
59
- import { _ as _37 } from "./chunks/LpLogViewer-BDFXzvcl.js";
59
+ import { _ as _37 } from "./chunks/LpLogViewer-BfgtXVKm.js";
60
60
  import { countLevels, matchPositions, matchesTerm, ringWindow, stepMatch } from "./components/logSearch.js";
61
61
  import { _ as _38 } from "./chunks/LpMediaGallery-BnlkN_1f.js";
62
62
  import { _ as _39 } from "./chunks/LpModal-JNa3B_Lr.js";
63
- import { _ as _40 } from "./chunks/LpModalNav-BAxC9et7.js";
64
- import { _ as _41 } from "./chunks/LpNotificationBell-DsqSyMwS.js";
63
+ import { _ as _40 } from "./chunks/LpModalNav-aWwc_5CD.js";
64
+ import { _ as _41 } from "./chunks/LpNotificationBell-wZ3meeim.js";
65
65
  import { _ as _42 } from "./chunks/LpNumberField-B77O-z28.js";
66
66
  import { _ as _43 } from "./chunks/LpTimeField-Cqe7fXnh.js";
67
67
  import { _ as _44 } from "./chunks/LpNumberFlow-z4WPZcZu.js";
68
68
  import { _ as _45 } from "./chunks/LpOtpInput-CziPF3Oq.js";
69
69
  import { _ as _46 } from "./chunks/LpPagination-BcDlo3r_.js";
70
70
  import { _ as _47 } from "./chunks/LpPasswordInput-eKzQhbQP.js";
71
- import { _ as _48 } from "./chunks/LpPie-BdSnta11.js";
71
+ import { _ as _48 } from "./chunks/LpPie-B7ti5qCH.js";
72
72
  import { _ as _49 } from "./chunks/LpPhoneInput-BCbrrhgE.js";
73
73
  import { filterCountries, flagEmoji, loadCountries, matchCountryByValue } from "./components/countries.js";
74
74
  import { _ as _50 } from "./chunks/LpPopover-DCKeqiVn.js";
75
75
  import { _ as _51 } from "./chunks/LpProgress-CBU1iI69.js";
76
- import { _ as _52 } from "./chunks/LpRadio-B5AfqTpZ.js";
77
- import { _ as _53 } from "./chunks/LpRadioGroup-DmEW0l78.js";
76
+ import { _ as _52 } from "./chunks/LpRadio-CWA5Eb3M.js";
77
+ import { _ as _53 } from "./chunks/LpRadioGroup-CCn-Q2_c.js";
78
78
  import { _ as _54 } from "./chunks/LpRollingText-DB7upf-5.js";
79
79
  import { _ as _55 } from "./chunks/LpScrollArea-Hz3-JWUG.js";
80
80
  import { _ as _56 } from "./chunks/LpSegmented-C09EEam2.js";
@@ -83,7 +83,7 @@ import { _ as _58 } from "./chunks/LpSelect-DNIL6MB9.js";
83
83
  import { _ as _59 } from "./chunks/LpServiceNode-D8uJ8sGk.js";
84
84
  import { _ as _60 } from "./chunks/LpShift-DXNsauQZ.js";
85
85
  import { default as default11 } from "./components/LpShortcutsDialog.vue.js";
86
- import { _ as _61 } from "./chunks/LpSidebar-DpEiGi8L.js";
86
+ import { _ as _61 } from "./chunks/LpSidebar-C2oolgwy.js";
87
87
  import { _ as _62 } from "./chunks/LpSkeleton-BB6XIV-w.js";
88
88
  import { _ as _63 } from "./chunks/LpSlider-Cuzmrd7p.js";
89
89
  import { _ as _64 } from "./chunks/LpRangeSlider-C1yF9-nP.js";
@@ -92,7 +92,7 @@ import { formatClipTime, isNativeLoop, planLoop, seamProgress, seamReached } fro
92
92
  import { _ as _66 } from "./chunks/LpSparkline-CB80N8SJ.js";
93
93
  import { _ as _67 } from "./chunks/LpStat-B-7udBRP.js";
94
94
  import { _ as _68 } from "./chunks/LpStepper-C7XiVKZj.js";
95
- import { _ as _69 } from "./chunks/LpSwitch-OrcOJX9m.js";
95
+ import { _ as _69 } from "./chunks/LpSwitch-DG2AhXIL.js";
96
96
  import { default as default12 } from "./components/LpTable.vue.js";
97
97
  import { compareValues } from "./components/tableSort.js";
98
98
  import { _ as _70 } from "./chunks/LpTableOfContents-BUcAfGPQ.js";
@@ -100,7 +100,7 @@ import { _ as _71 } from "./chunks/LpTabs-UM0FQmPA.js";
100
100
  import { _ as _72 } from "./chunks/LpTagsInput-D1SuqbhB.js";
101
101
  import { addTags, splitTags } from "./components/tags.js";
102
102
  import { _ as _73 } from "./chunks/LpTextarea-uuScWo6-.js";
103
- import { _ as _74 } from "./chunks/LpThemeSwitcher-BbYFFT5w.js";
103
+ import { _ as _74 } from "./chunks/LpThemeSwitcher-CPmhYOjX.js";
104
104
  import { _ as _75 } from "./chunks/LpTilt-B7KHX1zH.js";
105
105
  import { _ as _76 } from "./chunks/LpToaster-DTtWuKvq.js";
106
106
  import { _ as _77 } from "./chunks/LpTooltip-CXVKcOXT.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.53.0",
3
+ "version": "0.53.1",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -35,7 +35,7 @@ const field = useFieldControl(() => ({ wrapped: false, id: props.id, disabled: p
35
35
 
36
36
  // The label sits a fixed distance from the box; a dense list of options needs that closer.
37
37
  const { class: rootClass, attrs: rest } = useMergedAttrs(
38
- "group inline-flex cursor-pointer items-center gap-2 text-sm text-ink",
38
+ "group/check inline-flex cursor-pointer items-center gap-2 text-sm text-ink",
39
39
  )
40
40
  </script>
41
41
 
@@ -49,7 +49,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
49
49
  :model-value="indeterminate ? 'indeterminate' : modelValue"
50
50
  :disabled="field.disabled"
51
51
  :aria-describedby="field.describedBy"
52
- 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"
52
+ 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"
53
53
  @update:model-value="onUpdate"
54
54
  >
55
55
  <CheckboxIndicator
@@ -79,6 +79,18 @@ function rememberField() {
79
79
  : null
80
80
  }
81
81
 
82
+ /*
83
+ * A right-click the menu answers goes no further than its trigger. reka opens
84
+ * the menu a tick later, and only if nothing has called preventDefault by then;
85
+ * an app that silences the browser's own menu with a window listener (most
86
+ * desktop shells do) got there first, so the menu never opened while a long
87
+ * press, which reka times itself, still did. reka cancels the native menu on
88
+ * its own once it opens.
89
+ */
90
+ function keepContextMenu(event: Event) {
91
+ if (enabled.value) event.stopPropagation()
92
+ }
93
+
82
94
  function returnFocus(event: Event) {
83
95
  const saved = field
84
96
  field = null
@@ -95,7 +107,12 @@ function returnFocus(event: Event) {
95
107
  late, losing its state and focus. A disabled trigger leaves the browser's
96
108
  own menu in place. -->
97
109
  <ContextMenuRoot>
98
- <ContextMenuTrigger as-child :disabled="!enabled" @contextmenu.capture="rememberField">
110
+ <ContextMenuTrigger
111
+ as-child
112
+ :disabled="!enabled"
113
+ @contextmenu.capture="rememberField"
114
+ @contextmenu="keepContextMenu"
115
+ >
99
116
  <slot />
100
117
  </ContextMenuTrigger>
101
118
  <ContextMenuPortal v-if="items.length">
@@ -18,7 +18,7 @@ const props = defineProps<{ value: string; label?: string; disabled?: boolean }>
18
18
  // options needs to close up — `class="gap-1"` should win over the default.
19
19
  const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
20
20
  [
21
- "group inline-flex cursor-pointer items-center gap-2 text-sm text-ink",
21
+ "group/radio inline-flex cursor-pointer items-center gap-2 text-sm text-ink",
22
22
  props.disabled ? "cursor-not-allowed opacity-55" : "",
23
23
  ].join(" "),
24
24
  )
@@ -32,7 +32,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
32
32
  <RadioGroupItem
33
33
  :value="value"
34
34
  :disabled="disabled"
35
- 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"
35
+ 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"
36
36
  >
37
37
  <RadioGroupIndicator
38
38
  class="flex data-[state=checked]:animate-[indicator-in_140ms_var(--ease-emphasized)]"
@@ -45,11 +45,11 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
45
45
  <label
46
46
  v-for="opt in options"
47
47
  :key="opt.value"
48
- class="group inline-flex cursor-pointer items-center gap-2 text-sm text-ink"
48
+ class="group/radio inline-flex cursor-pointer items-center gap-2 text-sm text-ink"
49
49
  >
50
50
  <RadioGroupItem
51
51
  :value="opt.value"
52
- 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"
52
+ 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"
53
53
  >
54
54
  <RadioGroupIndicator
55
55
  class="flex data-[state=checked]:animate-[indicator-in_140ms_var(--ease-emphasized)]"
@@ -33,9 +33,9 @@ const slots = useSlots()
33
33
  const labelled = computed(() => Boolean(props.label || props.description || slots.default))
34
34
 
35
35
  const TRACK =
36
- "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"
36
+ "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"
37
37
  const THUMB =
38
- "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"
38
+ "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"
39
39
 
40
40
  // Bare, the switch is the root, so a consumer asking for a bigger track must not
41
41
  // have to depend on stylesheet order to get it. With text, the row is the root