@iris-ui-kit/vue 0.2.24 → 0.2.25
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/behaviors.cjs +25 -8
- package/dist/behaviors.cjs.map +1 -1
- package/dist/behaviors.js +1 -1
- package/dist/{chunk-FSDQHBI2.js → chunk-3547J6IN.js} +2 -2
- package/dist/chunk-3547J6IN.js.map +1 -0
- package/dist/{chunk-3IH7IJ5S.js → chunk-7L6UB6MD.js} +27 -10
- package/dist/chunk-7L6UB6MD.js.map +1 -0
- package/dist/error-boundary.cjs.map +1 -1
- package/dist/error-boundary.js +1 -1
- package/dist/index.cjs +25 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-3IH7IJ5S.js.map +0 -1
- package/dist/chunk-FSDQHBI2.js.map +0 -1
package/dist/behaviors.cjs
CHANGED
|
@@ -659,13 +659,11 @@ var IrisLongPress = vue.defineComponent({
|
|
|
659
659
|
longpress: () => true
|
|
660
660
|
},
|
|
661
661
|
setup(props, { slots, emit }) {
|
|
662
|
-
const
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
}
|
|
668
|
-
});
|
|
662
|
+
const fire = () => {
|
|
663
|
+
props.onLongPress?.();
|
|
664
|
+
emit("longpress");
|
|
665
|
+
};
|
|
666
|
+
let ctrl = core.createLongPress({ holdDelay: props.holdDelay, onLongPress: fire });
|
|
669
667
|
const onPointerDown = () => {
|
|
670
668
|
if (props.disabled) return;
|
|
671
669
|
ctrl.press();
|
|
@@ -676,6 +674,24 @@ var IrisLongPress = vue.defineComponent({
|
|
|
676
674
|
const onPointerLeave = () => {
|
|
677
675
|
ctrl.cancel();
|
|
678
676
|
};
|
|
677
|
+
const onPointerCancel = () => {
|
|
678
|
+
ctrl.cancel();
|
|
679
|
+
};
|
|
680
|
+
vue.watch(
|
|
681
|
+
() => props.holdDelay,
|
|
682
|
+
(holdDelay) => {
|
|
683
|
+
const wasPressing = ctrl.state() === "pressing";
|
|
684
|
+
ctrl.cancel();
|
|
685
|
+
ctrl = core.createLongPress({ holdDelay, onLongPress: fire });
|
|
686
|
+
if (wasPressing) ctrl.press();
|
|
687
|
+
}
|
|
688
|
+
);
|
|
689
|
+
vue.watch(
|
|
690
|
+
() => props.disabled,
|
|
691
|
+
(disabled) => {
|
|
692
|
+
if (disabled) ctrl.cancel();
|
|
693
|
+
}
|
|
694
|
+
);
|
|
679
695
|
vue.onBeforeUnmount(() => ctrl.cancel());
|
|
680
696
|
return () => vue.h(
|
|
681
697
|
"span",
|
|
@@ -684,7 +700,8 @@ var IrisLongPress = vue.defineComponent({
|
|
|
684
700
|
style: { display: "contents" },
|
|
685
701
|
onPointerdown: onPointerDown,
|
|
686
702
|
onPointerup: onPointerUp,
|
|
687
|
-
onPointerleave: onPointerLeave
|
|
703
|
+
onPointerleave: onPointerLeave,
|
|
704
|
+
onPointercancel: onPointerCancel
|
|
688
705
|
},
|
|
689
706
|
slots.default?.()
|
|
690
707
|
);
|
package/dist/behaviors.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/drag/useDrag.ts","../src/behaviors/Resizable.ts","../src/behaviors/Movable.ts","../src/behaviors/Hotkey.ts","../src/behaviors/ClickOutside.ts","../src/behaviors/Sortable.ts","../src/behaviors/LongPress.ts"],"names":["watch","onScopeDispose","defineComponent","ref","computed","h","onMounted","onUpdated","watchEffect","onBeforeUnmount","createSortable","createLongPress"],"mappings":"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","file":"behaviors.cjs","sourcesContent":["import { onScopeDispose, watch, type Ref } from 'vue'\n\nexport interface DragState {\n /** Pointer x in client coordinates. */\n x: number\n /** Pointer y in client coordinates. */\n y: number\n /** Cumulative delta from pointerdown. */\n dx: number\n /** Cumulative delta from pointerdown. */\n dy: number\n /** The active pointer event. */\n event: PointerEvent\n}\n\nexport interface UseDragOptions {\n /** The element the drag handle is bound to. */\n handle: Ref<HTMLElement | null | undefined>\n /** Drag is only initiated for these pointer button(s). Default `[0]` (primary). */\n buttons?: number[]\n /** Called on pointerdown that starts a drag. Return `false` to cancel. */\n onStart?: (state: DragState) => boolean | void\n /** Called on every pointermove while dragging. */\n onDrag?: (state: DragState) => void\n /** Called on pointerup or pointercancel. */\n onEnd?: (state: DragState) => void\n /** Disable the drag. */\n disabled?: Ref<boolean | undefined>\n}\n\n/**\n * Bind pointer-driven drag handlers to an element. Uses `setPointerCapture`\n * so the drag continues even if the pointer leaves the element. Cancels on\n * `pointercancel` (e.g. browser interruption).\n *\n * Pure pointer events — works for mouse, touch, and pen. The handle element\n * gets `touchAction: 'none'` automatically while a drag is in progress to\n * prevent scrolling interference on touch devices.\n *\n * @example\n * const handleRef = ref<HTMLElement | null>(null)\n * useDrag({\n * handle: handleRef,\n * onDrag: ({ dx }) => (offsetX.value = startOffset + dx),\n * })\n */\nexport function useDrag(options: UseDragOptions): void {\n const buttons = options.buttons ?? [0]\n let startX = 0\n let startY = 0\n let active: PointerEvent | null = null\n\n const onPointerDown = (event: PointerEvent) => {\n if (options.disabled?.value) return\n if (!buttons.includes(event.button)) return\n const handle = options.handle.value\n if (!handle) return\n\n startX = event.clientX\n startY = event.clientY\n const state: DragState = {\n x: event.clientX,\n y: event.clientY,\n dx: 0,\n dy: 0,\n event,\n }\n const result = options.onStart?.(state)\n if (result === false) return\n active = event\n handle.setPointerCapture?.(event.pointerId)\n handle.style.touchAction = 'none'\n event.preventDefault()\n }\n\n const onPointerMove = (event: PointerEvent) => {\n if (!active || active.pointerId !== event.pointerId) return\n options.onDrag?.({\n x: event.clientX,\n y: event.clientY,\n dx: event.clientX - startX,\n dy: event.clientY - startY,\n event,\n })\n }\n\n const onPointerEnd = (event: PointerEvent) => {\n if (!active || active.pointerId !== event.pointerId) return\n const handle = options.handle.value\n handle?.releasePointerCapture?.(event.pointerId)\n if (handle) handle.style.touchAction = ''\n options.onEnd?.({\n x: event.clientX,\n y: event.clientY,\n dx: event.clientX - startX,\n dy: event.clientY - startY,\n event,\n })\n active = null\n }\n\n const attach = (el: HTMLElement) => {\n el.addEventListener('pointerdown', onPointerDown)\n el.addEventListener('pointermove', onPointerMove)\n el.addEventListener('pointerup', onPointerEnd)\n el.addEventListener('pointercancel', onPointerEnd)\n }\n\n const detach = (el: HTMLElement) => {\n el.removeEventListener('pointerdown', onPointerDown)\n el.removeEventListener('pointermove', onPointerMove)\n el.removeEventListener('pointerup', onPointerEnd)\n el.removeEventListener('pointercancel', onPointerEnd)\n }\n\n watch(\n options.handle,\n (el, prev) => {\n if (prev) detach(prev)\n if (el) attach(el)\n },\n { immediate: true, flush: 'post' },\n )\n\n onScopeDispose(() => {\n const el = options.handle.value\n if (el) detach(el)\n })\n}\n","import { computed, defineComponent, h, ref, type PropType, type Ref } from 'vue'\nimport { useDrag } from '../primitives/drag/useDrag'\n\nexport type IrisResizableHandle =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n\nexport interface IrisResizableSize {\n width: number\n height: number\n}\n\nconst ALL_HANDLES: IrisResizableHandle[] = [\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n]\n\nconst HANDLE_CURSORS: Record<IrisResizableHandle, string> = {\n top: 'ns-resize',\n right: 'ew-resize',\n bottom: 'ns-resize',\n left: 'ew-resize',\n 'top-left': 'nwse-resize',\n 'top-right': 'nesw-resize',\n 'bottom-left': 'nesw-resize',\n 'bottom-right': 'nwse-resize',\n}\n\nfunction handlePosition(handle: IrisResizableHandle): Record<string, string> {\n const s: Record<string, string> = { position: 'absolute' }\n const t = handle.includes('top')\n const b = handle.includes('bottom')\n const l = handle.includes('left')\n const r = handle.includes('right')\n if (t) s.top = '-4px'\n if (b) s.bottom = '-4px'\n if (l) s.left = '-4px'\n if (r) s.right = '-4px'\n const isCorner = (t || b) && (l || r)\n if (isCorner) {\n s.width = '12px'\n s.height = '12px'\n } else if (t || b) {\n s.left = '0'\n s.right = '0'\n s.height = '8px'\n } else {\n s.top = '0'\n s.bottom = '0'\n s.width = '8px'\n }\n s.cursor = HANDLE_CURSORS[handle]\n return s\n}\n\n/**\n * Internal per-handle sub-component (NOT exported). Declared at module level\n * so its type identity is stable across parent re-renders: each handle\n * instance's `setup()` — and therefore its single `useDrag` call — runs\n * exactly once. The previous implementation invoked `useDrag` from a\n * per-render `renderHandle()` helper with a fresh ref each time; because Vue\n * never re-invokes old *function* refs on patch, those listener sets were\n * never detached and emitted duplicates from the second drag onward.\n */\nconst ResizableHandle = defineComponent({\n name: 'ResizableHandle',\n props: {\n handle: { type: String as PropType<IrisResizableHandle>, required: true },\n disabled: { type: Boolean, default: false },\n keepAspect: { type: Boolean, default: false },\n minWidth: { type: Number, default: 40 },\n minHeight: { type: Number, default: 40 },\n maxWidth: { type: Number, default: Infinity },\n maxHeight: { type: Number, default: Infinity },\n /** Stable computed ref from the parent; read only (never mutated). */\n sizeRef: { type: Object as PropType<Ref<IrisResizableSize>>, required: true },\n /** Stable setup-level callbacks from the parent. */\n onUpdate: { type: Function as PropType<(next: IrisResizableSize) => void>, required: true },\n onResizeStart: {\n type: Function as PropType<(s: IrisResizableSize) => void>,\n default: undefined,\n },\n onResizeEnd: { type: Function as PropType<() => void>, default: undefined },\n },\n setup(props) {\n // Created ONCE per handle instance (not per render):\n const handleRef = ref<HTMLElement | null>(null)\n let startSize: IrisResizableSize = { width: 0, height: 0 }\n let aspect = 1\n\n useDrag({\n handle: handleRef,\n disabled: computed(() => props.disabled),\n onStart: () => {\n startSize = { ...props.sizeRef.value }\n aspect = startSize.width / Math.max(1, startSize.height)\n props.onResizeStart?.(startSize)\n },\n onDrag: ({ dx, dy }) => {\n const t = props.handle.includes('top')\n const b = props.handle.includes('bottom')\n const l = props.handle.includes('left')\n const r = props.handle.includes('right')\n let nextW = startSize.width\n let nextH = startSize.height\n if (r) nextW = startSize.width + dx\n if (l) nextW = startSize.width - dx\n if (b) nextH = startSize.height + dy\n if (t) nextH = startSize.height - dy\n if (props.keepAspect && (t || b) && (l || r)) {\n nextH = nextW / aspect\n }\n nextW = Math.max(props.minWidth, Math.min(props.maxWidth, nextW))\n nextH = Math.max(props.minHeight, Math.min(props.maxHeight, nextH))\n props.onUpdate({ width: nextW, height: nextH })\n },\n onEnd: () => props.onResizeEnd?.(),\n })\n\n return () =>\n h('div', {\n ref: (el: unknown) => {\n handleRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-resizable-handle': props.handle,\n style: {\n ...handlePosition(props.handle),\n touchAction: 'none',\n background: 'transparent',\n zIndex: '1',\n },\n })\n },\n})\n\n/**\n * Behavior wrapper: makes its child resizable via 8-direction handles. The\n * wrapper itself is `display: inline-block; position: relative` so the child\n * can be ANY element. Handles overlay the wrapper's edges.\n *\n * Composable with `IrisMovable`, `IrisHotkey`, `IrisClickOutside`.\n *\n * @example\n * <IrisResizable :defaultSize=\"{ width: 400, height: 300 }\">\n * <IrisList :items=\"rows\" />\n * </IrisResizable>\n */\nexport const IrisResizable = defineComponent({\n name: 'IrisResizable',\n inheritAttrs: false,\n props: {\n size: { type: Object as PropType<IrisResizableSize>, default: undefined },\n defaultSize: {\n type: Object as PropType<IrisResizableSize>,\n default: () => ({ width: 200, height: 200 }),\n },\n handles: { type: Array as PropType<IrisResizableHandle[]>, default: () => ALL_HANDLES },\n minWidth: { type: Number, default: 40 },\n minHeight: { type: Number, default: 40 },\n maxWidth: { type: Number, default: Infinity },\n maxHeight: { type: Number, default: Infinity },\n keepAspect: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n },\n emits: {\n 'update:size': (_v: IrisResizableSize) => true,\n resizeStart: (_v: IrisResizableSize) => true,\n resizeEnd: (_v: IrisResizableSize) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const isControlled = computed(() => props.size !== undefined)\n const internal = ref<IrisResizableSize>({ ...props.defaultSize })\n const size = computed<IrisResizableSize>(() =>\n isControlled.value ? (props.size as IrisResizableSize) : internal.value,\n )\n\n const setSize = (next: IrisResizableSize) => {\n if (!isControlled.value) internal.value = next\n emit('update:size', next)\n }\n\n // Stable setup-level bindings: passed as props to the keyed handle\n // instances so they never trigger re-invocation of the child setup.\n const emitResizeStart = (s: IrisResizableSize) => emit('resizeStart', s)\n const emitResizeEnd = () => emit('resizeEnd', size.value)\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n 'data-iris-resizable': '',\n 'data-state': props.disabled ? 'disabled' : 'idle',\n style: {\n position: 'relative',\n display: 'inline-block',\n width: `${size.value.width}px`,\n height: `${size.value.height}px`,\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n slots.default?.(),\n ...props.handles.map((handle) =>\n h(ResizableHandle, {\n key: handle,\n handle,\n disabled: props.disabled,\n keepAspect: props.keepAspect,\n minWidth: props.minWidth,\n minHeight: props.minHeight,\n maxWidth: props.maxWidth,\n maxHeight: props.maxHeight,\n sizeRef: size,\n onUpdate: setSize,\n onResizeStart: emitResizeStart,\n onResizeEnd: emitResizeEnd,\n }),\n ),\n ],\n )\n },\n})\n","import { computed, defineComponent, h, onMounted, onUpdated, ref, type PropType } from 'vue'\nimport { useDrag } from '../primitives/drag/useDrag'\n\nexport interface IrisMovablePosition {\n x: number\n y: number\n}\n\nexport interface IrisMovableBounds {\n minX?: number\n maxX?: number\n minY?: number\n maxY?: number\n}\n\n/**\n * Behavior wrapper: makes its child draggable via `transform`. The whole\n * wrapper drags by default; pass `byHandle` + put `data-iris-movable-handle`\n * on a descendant to restrict the drag origin.\n *\n * Renders `position: absolute` — wrap inside a `position: relative`\n * container for predictable layout.\n */\nexport const IrisMovable = defineComponent({\n name: 'IrisMovable',\n inheritAttrs: false,\n props: {\n position: { type: Object as PropType<IrisMovablePosition>, default: undefined },\n defaultPosition: {\n type: Object as PropType<IrisMovablePosition>,\n default: () => ({ x: 0, y: 0 }),\n },\n bounds: { type: Object as PropType<IrisMovableBounds>, default: () => ({}) },\n byHandle: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n },\n emits: {\n 'update:position': (_v: IrisMovablePosition) => true,\n dragStart: (_v: IrisMovablePosition) => true,\n dragEnd: (_v: IrisMovablePosition) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const isControlled = computed(() => props.position !== undefined)\n const internal = ref<IrisMovablePosition>({ ...props.defaultPosition })\n const position = computed<IrisMovablePosition>(() =>\n isControlled.value ? (props.position as IrisMovablePosition) : internal.value,\n )\n\n const rootRef = ref<HTMLElement | null>(null)\n const handleRef = ref<HTMLElement | null>(null)\n const dragging = ref(false)\n let startPos: IrisMovablePosition = { x: 0, y: 0 }\n\n // Find handle inside the wrapper when byHandle is set.\n const refreshHandle = () => {\n if (!props.byHandle) return\n handleRef.value =\n rootRef.value?.querySelector<HTMLElement>('[data-iris-movable-handle]') ?? null\n }\n onMounted(refreshHandle)\n onUpdated(refreshHandle)\n\n const dragTarget = computed(() => (props.byHandle ? handleRef : rootRef))\n\n const clamp = (p: IrisMovablePosition): IrisMovablePosition => ({\n x: Math.max(props.bounds.minX ?? -Infinity, Math.min(props.bounds.maxX ?? Infinity, p.x)),\n y: Math.max(props.bounds.minY ?? -Infinity, Math.min(props.bounds.maxY ?? Infinity, p.y)),\n })\n\n const setPosition = (next: IrisMovablePosition) => {\n if (!isControlled.value) internal.value = next\n emit('update:position', next)\n }\n\n useDrag({\n handle: computed(() => dragTarget.value.value),\n disabled: computed(() => props.disabled),\n onStart: () => {\n startPos = position.value\n dragging.value = true\n emit('dragStart', position.value)\n },\n onDrag: ({ dx, dy }) => {\n setPosition(clamp({ x: startPos.x + dx, y: startPos.y + dy }))\n },\n onEnd: () => {\n dragging.value = false\n emit('dragEnd', position.value)\n },\n })\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n ref: (el: unknown) => {\n rootRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-movable': '',\n 'data-state': dragging.value ? 'dragging' : 'idle',\n style: {\n position: 'absolute',\n left: '0',\n top: '0',\n transform: `translate3d(${position.value.x}px, ${position.value.y}px, 0)`,\n cursor: props.byHandle ? 'default' : props.disabled ? 'not-allowed' : 'grab',\n touchAction: 'none',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n slots.default?.(),\n )\n },\n})\n","import { defineComponent, onBeforeUnmount, watchEffect, type PropType } from 'vue'\n\nfunction parseShortcut(spec: string): {\n key: string\n shift: boolean\n alt: boolean\n ctrl: boolean\n meta: boolean\n ctrlOrMeta: boolean\n} {\n const parts = spec.split('+').map((p) => p.trim())\n const key = parts[parts.length - 1]!.toLowerCase()\n const mods = new Set(parts.slice(0, -1).map((p) => p.toLowerCase()))\n return {\n key,\n shift: mods.has('shift'),\n alt: mods.has('alt') || mods.has('option'),\n ctrl: mods.has('ctrl') || mods.has('control'),\n meta: mods.has('meta') || mods.has('cmd') || mods.has('command'),\n ctrlOrMeta: mods.has('mod'),\n }\n}\n\nfunction isInputTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el) return false\n const tag = el.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (el.isContentEditable) return true\n return false\n}\n\nfunction matches(event: KeyboardEvent, parsed: ReturnType<typeof parseShortcut>): boolean {\n if (event.key.toLowerCase() !== parsed.key) return false\n if (parsed.shift !== event.shiftKey) return false\n if (parsed.alt !== event.altKey) return false\n if (parsed.ctrlOrMeta) {\n if (!event.ctrlKey && !event.metaKey) return false\n } else {\n if (parsed.ctrl !== event.ctrlKey) return false\n if (parsed.meta !== event.metaKey) return false\n }\n return true\n}\n\n/**\n * Behavior wrapper: binds a global keyboard shortcut while children are\n * mounted. Renderless — returns children verbatim via a Fragment.\n *\n * `shortcut` format: `'Escape'`, `'Mod+s'` (Mod = Ctrl on Win/Linux, Cmd on\n * macOS), `'Shift+/'`. Accepts a single string or array of strings.\n *\n * @example\n * <IrisHotkey shortcut=\"Escape\" @trigger=\"close\">\n * <IrisDialog>…</IrisDialog>\n * </IrisHotkey>\n */\nexport const IrisHotkey = defineComponent({\n name: 'IrisHotkey',\n inheritAttrs: false,\n props: {\n shortcut: { type: [String, Array] as PropType<string | string[]>, required: true },\n disabled: { type: Boolean, default: false },\n allowInInputs: { type: Boolean, default: false },\n scope: { type: String as PropType<'document' | 'window'>, default: 'document' },\n },\n emits: {\n trigger: (_event: KeyboardEvent) => true,\n },\n setup(props, { slots, emit }) {\n let detach: (() => void) | null = null\n\n watchEffect((onCleanup) => {\n detach?.()\n detach = null\n if (props.disabled) return\n const specs = Array.isArray(props.shortcut) ? props.shortcut : [props.shortcut]\n const parsed = specs.map(parseShortcut)\n const target: EventTarget = props.scope === 'window' ? window : document\n const onKey = (event: Event) => {\n const e = event as KeyboardEvent\n if (!props.allowInInputs && isInputTarget(e.target)) return\n for (const p of parsed) {\n if (matches(e, p)) {\n emit('trigger', e)\n return\n }\n }\n }\n target.addEventListener('keydown', onKey)\n detach = () => target.removeEventListener('keydown', onKey)\n onCleanup(() => detach?.())\n })\n\n onBeforeUnmount(() => detach?.())\n\n return () => slots.default?.()\n },\n})\n","import { defineComponent, h, onBeforeUnmount, ref, watchEffect, type PropType, type Ref } from 'vue'\n\n/**\n * Behavior wrapper: fires `outside` when a `pointerdown` happens outside the\n * wrapped child tree. Wraps children in a `<span style=\"display:contents\">`\n * to capture the bounding box without affecting layout.\n *\n * Pass `ignore` (refs to additional \"inside\" elements) for trigger buttons\n * that live outside the wrapper but should still count as inside.\n */\nexport const IrisClickOutside = defineComponent({\n name: 'IrisClickOutside',\n inheritAttrs: false,\n props: {\n disabled: { type: Boolean, default: false },\n ignore: {\n type: Array as PropType<Ref<HTMLElement | null | undefined>[]>,\n default: () => [],\n },\n },\n emits: {\n outside: (_event: PointerEvent) => true,\n },\n setup(props, { slots, emit }) {\n const wrapperRef = ref<HTMLElement | null>(null)\n let detach: (() => void) | null = null\n\n watchEffect((onCleanup) => {\n detach?.()\n detach = null\n if (props.disabled) return\n if (typeof document === 'undefined') return\n const handler = (event: PointerEvent) => {\n const target = event.target as Node | null\n if (!target) return\n const wrapper = wrapperRef.value\n if (wrapper) {\n let node: Node | null = target\n while (node) {\n if (node === wrapper) return\n if ((node as HTMLElement).parentNode === wrapper) return\n node = node.parentNode\n }\n }\n for (const r of props.ignore) {\n const el = r.value\n if (el && el.contains(target)) return\n }\n emit('outside', event)\n }\n document.addEventListener('pointerdown', handler)\n detach = () => document.removeEventListener('pointerdown', handler)\n onCleanup(() => detach?.())\n })\n\n onBeforeUnmount(() => detach?.())\n\n return () =>\n h(\n 'span',\n {\n ref: (el: unknown) => {\n wrapperRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-click-outside': '',\n style: { display: 'contents' },\n },\n slots.default?.(),\n )\n },\n})\n","import { defineComponent, h, onBeforeUnmount, ref, type PropType, type VNode } from 'vue'\nimport { createSortable, type SortableRect } from '@iris-ui-kit/core'\n\n/** The data attribute on each sortable item for the collision system. */\nexport const SORTABLE_ITEM_ATTR = 'data-iris-sortable-item'\n\n/**\n * Behavior wrapper: makes a list of items sortable via drag-and-drop. Wraps\n * each direct child in a sortable item context. The consumer supplies the\n * `items` array and an `onReorder` callback. Items render through the default\n * slot; each item is wrapped with drag detection from `createSortable`.\n *\n * Composable: stack with `IrisResizable` / `IrisMovable` / `IrisHotkey` for\n * richer interactions on the same wrapped UI.\n *\n * @example\n * <IrisSortable :items=\"items\" @reorder=\"items = $event\">\n * <div v-for=\"(label, i) in items\" :key=\"i\">{{ label }}</div>\n * </IrisSortable>\n */\nexport const IrisSortable = defineComponent({\n name: 'IrisSortable',\n inheritAttrs: false,\n props: {\n /** The ordered items. Used to detect which item is at which position. */\n items: {\n type: Array as PropType<readonly unknown[]>,\n required: true,\n },\n /** Called when the user drops an item in a new position. */\n onReorder: {\n type: Function as PropType<(next: unknown[]) => void>,\n default: undefined,\n },\n /** Optional item key getter. Defaults to `String(index)`. */\n getKey: {\n type: Function as PropType<(item: unknown, index: number) => string>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n orientation: {\n type: String as PropType<'vertical' | 'horizontal'>,\n default: 'vertical',\n },\n class: {\n type: String,\n default: undefined,\n },\n style: {\n type: Object as PropType<Record<string, string | number>>,\n default: undefined,\n },\n },\n emits: {\n reorder: (_next: unknown[]) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const containerRef = ref<HTMLElement | null>(null)\n const sortable = createSortable()\n const activeKey = ref<string | null>(null)\n\n // Subscribe to sortable state changes to track the active drag key\n const unsub = sortable.subscribe((state) => {\n activeKey.value = state.activeId\n })\n onBeforeUnmount(unsub)\n\n // Find the DOM order index of a child by its data-iris-sortable-item value.\n const indexOf = (key: string): number => {\n const container = containerRef.value\n if (!container) return -1\n return Array.from(\n container.querySelectorAll<HTMLElement>(`[${SORTABLE_ITEM_ATTR}]`),\n ).findIndex((el) => el.getAttribute(SORTABLE_ITEM_ATTR) === key)\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (props.disabled) return\n const target = (e.target as HTMLElement).closest(`[${SORTABLE_ITEM_ATTR}]`)\n if (!target) return\n const container = containerRef.value\n if (!container) return\n const key = target.getAttribute(SORTABLE_ITEM_ATTR) ?? ''\n const index = indexOf(key)\n if (index < 0) return\n sortable.press(key, e.clientX, e.clientY)\n }\n\n const onPointerMove = (e: PointerEvent) => {\n if (!sortable.isPending() && sortable.getState().activeId === null) return\n const items = containerRef.value?.querySelectorAll<HTMLElement>(`[${SORTABLE_ITEM_ATTR}]`)\n const rects: SortableRect[] = Array.from(items ?? []).map((el) => {\n const rect = el.getBoundingClientRect()\n return {\n id: el.getAttribute(SORTABLE_ITEM_ATTR) ?? '',\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n })\n // Promote pending press to active drag once past the movement threshold\n sortable.tryStart(e.clientX, e.clientY)\n if (sortable.getState().activeId !== null) {\n sortable.moveOver({ x: e.clientX, y: e.clientY }, rects)\n }\n }\n\n const onPointerUp = () => {\n const state = sortable.getState()\n if (state.activeId === null) {\n sortable.cancel()\n return\n }\n const result = sortable.end()\n if (result.activeId && result.overId && result.activeId !== result.overId) {\n const from = indexOf(result.activeId)\n const to = indexOf(result.overId)\n if (from >= 0 && to >= 0) {\n const next = [...(props.items as unknown[])]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved!)\n if (props.onReorder) {\n props.onReorder(next)\n }\n emit('reorder', next)\n }\n }\n }\n\n const resolveKey = (item: unknown, index: number): string =>\n props.getKey ? props.getKey(item, index) : String(index)\n\n return () => {\n const children: VNode[] = []\n const defaultSlots = slots.default?.()\n if (defaultSlots) {\n const itemsArray = props.items as unknown[]\n defaultSlots.forEach((child, index) => {\n const item = itemsArray[index]\n const key = resolveKey(item, index)\n const isDragging = key === activeKey.value\n children.push(\n h(\n 'div',\n {\n key,\n [SORTABLE_ITEM_ATTR]: key,\n 'data-iris-sortable-dragging': isDragging ? '' : undefined,\n style: {\n transition: isDragging ? 'none' : 'transform 150ms ease',\n opacity: isDragging ? 0.4 : 1,\n position: 'relative',\n zIndex: isDragging ? 100 : undefined,\n },\n },\n [child],\n ),\n )\n })\n }\n\n return h(\n 'div',\n {\n ...attrs,\n ref: (el: unknown) => {\n containerRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-sortable': '',\n 'data-state': activeKey.value ? 'dragging' : 'idle',\n class: props.class,\n style: {\n display: 'flex',\n flexDirection: props.orientation === 'horizontal' ? 'row' : 'column',\n gap: 'var(--iris-gap-sm, 4px)',\n opacity: props.disabled ? 0.6 : 1,\n userSelect: activeKey.value ? 'none' : undefined,\n ...((props.style as Record<string, string | number> | undefined) ?? {}),\n },\n onPointerdown: onPointerDown,\n onPointermove: onPointerMove,\n onPointerup: onPointerUp,\n onPointerleave: onPointerUp,\n },\n children,\n )\n }\n },\n})\n","import { defineComponent, h, onBeforeUnmount, type PropType } from 'vue'\nimport { createLongPress } from '@iris-ui-kit/core'\n\n/**\n * Behavior wrapper: fires `onLongPress` once the pointer has been held down\n * for `holdDelay` ms without an intervening pointerup/pointerleave. Wraps\n * children in a `<span data-iris-long-press style=\"display:contents\">` so it\n * doesn't affect layout. Backed by `createLongPress`'s statechart timer.\n *\n * @example\n * <IrisLongPress :hold-delay=\"500\" @longpress=\"onLongPress\">\n * <IrisButton>Hold me</IrisButton>\n * </IrisLongPress>\n */\nexport const IrisLongPress = defineComponent({\n name: 'IrisLongPress',\n inheritAttrs: false,\n props: {\n /** Time the pointer must be held before `onLongPress` fires, in ms. */\n holdDelay: {\n type: Number,\n default: 500,\n },\n /** Called once when the hold reaches `holdDelay` without an intervening release. */\n onLongPress: {\n type: Function as PropType<() => void>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: {\n longpress: () => true,\n },\n setup(props, { slots, emit }) {\n const ctrl = createLongPress({\n holdDelay: props.holdDelay,\n onLongPress: () => {\n props.onLongPress?.()\n emit('longpress')\n },\n })\n\n const onPointerDown = () => {\n if (props.disabled) return\n ctrl.press()\n }\n const onPointerUp = () => {\n ctrl.release()\n }\n const onPointerLeave = () => {\n ctrl.cancel()\n }\n\n onBeforeUnmount(() => ctrl.cancel())\n\n return () =>\n h(\n 'span',\n {\n 'data-iris-long-press': '',\n style: { display: 'contents' },\n onPointerdown: onPointerDown,\n onPointerup: onPointerUp,\n onPointerleave: onPointerLeave,\n },\n slots.default?.(),\n )\n },\n})\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/primitives/drag/useDrag.ts","../src/behaviors/Resizable.ts","../src/behaviors/Movable.ts","../src/behaviors/Hotkey.ts","../src/behaviors/ClickOutside.ts","../src/behaviors/Sortable.ts","../src/behaviors/LongPress.ts"],"names":["watch","onScopeDispose","defineComponent","ref","computed","h","onMounted","onUpdated","watchEffect","onBeforeUnmount","createSortable","createLongPress"],"mappings":"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","file":"behaviors.cjs","sourcesContent":["import { onScopeDispose, watch, type Ref } from 'vue'\n\nexport interface DragState {\n /** Pointer x in client coordinates. */\n x: number\n /** Pointer y in client coordinates. */\n y: number\n /** Cumulative delta from pointerdown. */\n dx: number\n /** Cumulative delta from pointerdown. */\n dy: number\n /** The active pointer event. */\n event: PointerEvent\n}\n\nexport interface UseDragOptions {\n /** The element the drag handle is bound to. */\n handle: Ref<HTMLElement | null | undefined>\n /** Drag is only initiated for these pointer button(s). Default `[0]` (primary). */\n buttons?: number[]\n /** Called on pointerdown that starts a drag. Return `false` to cancel. */\n onStart?: (state: DragState) => boolean | void\n /** Called on every pointermove while dragging. */\n onDrag?: (state: DragState) => void\n /** Called on pointerup or pointercancel. */\n onEnd?: (state: DragState) => void\n /** Disable the drag. */\n disabled?: Ref<boolean | undefined>\n}\n\n/**\n * Bind pointer-driven drag handlers to an element. Uses `setPointerCapture`\n * so the drag continues even if the pointer leaves the element. Cancels on\n * `pointercancel` (e.g. browser interruption).\n *\n * Pure pointer events — works for mouse, touch, and pen. The handle element\n * gets `touchAction: 'none'` automatically while a drag is in progress to\n * prevent scrolling interference on touch devices.\n *\n * @example\n * const handleRef = ref<HTMLElement | null>(null)\n * useDrag({\n * handle: handleRef,\n * onDrag: ({ dx }) => (offsetX.value = startOffset + dx),\n * })\n */\nexport function useDrag(options: UseDragOptions): void {\n const buttons = options.buttons ?? [0]\n let startX = 0\n let startY = 0\n let active: PointerEvent | null = null\n\n const onPointerDown = (event: PointerEvent) => {\n if (options.disabled?.value) return\n if (!buttons.includes(event.button)) return\n const handle = options.handle.value\n if (!handle) return\n\n startX = event.clientX\n startY = event.clientY\n const state: DragState = {\n x: event.clientX,\n y: event.clientY,\n dx: 0,\n dy: 0,\n event,\n }\n const result = options.onStart?.(state)\n if (result === false) return\n active = event\n handle.setPointerCapture?.(event.pointerId)\n handle.style.touchAction = 'none'\n event.preventDefault()\n }\n\n const onPointerMove = (event: PointerEvent) => {\n if (!active || active.pointerId !== event.pointerId) return\n options.onDrag?.({\n x: event.clientX,\n y: event.clientY,\n dx: event.clientX - startX,\n dy: event.clientY - startY,\n event,\n })\n }\n\n const onPointerEnd = (event: PointerEvent) => {\n if (!active || active.pointerId !== event.pointerId) return\n const handle = options.handle.value\n handle?.releasePointerCapture?.(event.pointerId)\n if (handle) handle.style.touchAction = ''\n options.onEnd?.({\n x: event.clientX,\n y: event.clientY,\n dx: event.clientX - startX,\n dy: event.clientY - startY,\n event,\n })\n active = null\n }\n\n const attach = (el: HTMLElement) => {\n el.addEventListener('pointerdown', onPointerDown)\n el.addEventListener('pointermove', onPointerMove)\n el.addEventListener('pointerup', onPointerEnd)\n el.addEventListener('pointercancel', onPointerEnd)\n }\n\n const detach = (el: HTMLElement) => {\n el.removeEventListener('pointerdown', onPointerDown)\n el.removeEventListener('pointermove', onPointerMove)\n el.removeEventListener('pointerup', onPointerEnd)\n el.removeEventListener('pointercancel', onPointerEnd)\n }\n\n watch(\n options.handle,\n (el, prev) => {\n if (prev) detach(prev)\n if (el) attach(el)\n },\n { immediate: true, flush: 'post' },\n )\n\n onScopeDispose(() => {\n const el = options.handle.value\n if (el) detach(el)\n })\n}\n","import { computed, defineComponent, h, ref, type PropType, type Ref } from 'vue'\nimport { useDrag } from '../primitives/drag/useDrag'\n\nexport type IrisResizableHandle =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n\nexport interface IrisResizableSize {\n width: number\n height: number\n}\n\nconst ALL_HANDLES: IrisResizableHandle[] = [\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n]\n\nconst HANDLE_CURSORS: Record<IrisResizableHandle, string> = {\n top: 'ns-resize',\n right: 'ew-resize',\n bottom: 'ns-resize',\n left: 'ew-resize',\n 'top-left': 'nwse-resize',\n 'top-right': 'nesw-resize',\n 'bottom-left': 'nesw-resize',\n 'bottom-right': 'nwse-resize',\n}\n\nfunction handlePosition(handle: IrisResizableHandle): Record<string, string> {\n const s: Record<string, string> = { position: 'absolute' }\n const t = handle.includes('top')\n const b = handle.includes('bottom')\n const l = handle.includes('left')\n const r = handle.includes('right')\n if (t) s.top = '-4px'\n if (b) s.bottom = '-4px'\n if (l) s.left = '-4px'\n if (r) s.right = '-4px'\n const isCorner = (t || b) && (l || r)\n if (isCorner) {\n s.width = '12px'\n s.height = '12px'\n } else if (t || b) {\n s.left = '0'\n s.right = '0'\n s.height = '8px'\n } else {\n s.top = '0'\n s.bottom = '0'\n s.width = '8px'\n }\n s.cursor = HANDLE_CURSORS[handle]\n return s\n}\n\n/**\n * Internal per-handle sub-component (NOT exported). Declared at module level\n * so its type identity is stable across parent re-renders: each handle\n * instance's `setup()` — and therefore its single `useDrag` call — runs\n * exactly once. The previous implementation invoked `useDrag` from a\n * per-render `renderHandle()` helper with a fresh ref each time; because Vue\n * never re-invokes old *function* refs on patch, those listener sets were\n * never detached and emitted duplicates from the second drag onward.\n */\nconst ResizableHandle = defineComponent({\n name: 'ResizableHandle',\n props: {\n handle: { type: String as PropType<IrisResizableHandle>, required: true },\n disabled: { type: Boolean, default: false },\n keepAspect: { type: Boolean, default: false },\n minWidth: { type: Number, default: 40 },\n minHeight: { type: Number, default: 40 },\n maxWidth: { type: Number, default: Infinity },\n maxHeight: { type: Number, default: Infinity },\n /** Stable computed ref from the parent; read only (never mutated). */\n sizeRef: { type: Object as PropType<Ref<IrisResizableSize>>, required: true },\n /** Stable setup-level callbacks from the parent. */\n onUpdate: { type: Function as PropType<(next: IrisResizableSize) => void>, required: true },\n onResizeStart: {\n type: Function as PropType<(s: IrisResizableSize) => void>,\n default: undefined,\n },\n onResizeEnd: { type: Function as PropType<() => void>, default: undefined },\n },\n setup(props) {\n // Created ONCE per handle instance (not per render):\n const handleRef = ref<HTMLElement | null>(null)\n let startSize: IrisResizableSize = { width: 0, height: 0 }\n let aspect = 1\n\n useDrag({\n handle: handleRef,\n disabled: computed(() => props.disabled),\n onStart: () => {\n startSize = { ...props.sizeRef.value }\n aspect = startSize.width / Math.max(1, startSize.height)\n props.onResizeStart?.(startSize)\n },\n onDrag: ({ dx, dy }) => {\n const t = props.handle.includes('top')\n const b = props.handle.includes('bottom')\n const l = props.handle.includes('left')\n const r = props.handle.includes('right')\n let nextW = startSize.width\n let nextH = startSize.height\n if (r) nextW = startSize.width + dx\n if (l) nextW = startSize.width - dx\n if (b) nextH = startSize.height + dy\n if (t) nextH = startSize.height - dy\n if (props.keepAspect && (t || b) && (l || r)) {\n nextH = nextW / aspect\n }\n nextW = Math.max(props.minWidth, Math.min(props.maxWidth, nextW))\n nextH = Math.max(props.minHeight, Math.min(props.maxHeight, nextH))\n props.onUpdate({ width: nextW, height: nextH })\n },\n onEnd: () => props.onResizeEnd?.(),\n })\n\n return () =>\n h('div', {\n ref: (el: unknown) => {\n handleRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-resizable-handle': props.handle,\n style: {\n ...handlePosition(props.handle),\n touchAction: 'none',\n background: 'transparent',\n zIndex: '1',\n },\n })\n },\n})\n\n/**\n * Behavior wrapper: makes its child resizable via 8-direction handles. The\n * wrapper itself is `display: inline-block; position: relative` so the child\n * can be ANY element. Handles overlay the wrapper's edges.\n *\n * Composable with `IrisMovable`, `IrisHotkey`, `IrisClickOutside`.\n *\n * @example\n * <IrisResizable :defaultSize=\"{ width: 400, height: 300 }\">\n * <IrisList :items=\"rows\" />\n * </IrisResizable>\n */\nexport const IrisResizable = defineComponent({\n name: 'IrisResizable',\n inheritAttrs: false,\n props: {\n size: { type: Object as PropType<IrisResizableSize>, default: undefined },\n defaultSize: {\n type: Object as PropType<IrisResizableSize>,\n default: () => ({ width: 200, height: 200 }),\n },\n handles: { type: Array as PropType<IrisResizableHandle[]>, default: () => ALL_HANDLES },\n minWidth: { type: Number, default: 40 },\n minHeight: { type: Number, default: 40 },\n maxWidth: { type: Number, default: Infinity },\n maxHeight: { type: Number, default: Infinity },\n keepAspect: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n },\n emits: {\n 'update:size': (_v: IrisResizableSize) => true,\n resizeStart: (_v: IrisResizableSize) => true,\n resizeEnd: (_v: IrisResizableSize) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const isControlled = computed(() => props.size !== undefined)\n const internal = ref<IrisResizableSize>({ ...props.defaultSize })\n const size = computed<IrisResizableSize>(() =>\n isControlled.value ? (props.size as IrisResizableSize) : internal.value,\n )\n\n const setSize = (next: IrisResizableSize) => {\n if (!isControlled.value) internal.value = next\n emit('update:size', next)\n }\n\n // Stable setup-level bindings: passed as props to the keyed handle\n // instances so they never trigger re-invocation of the child setup.\n const emitResizeStart = (s: IrisResizableSize) => emit('resizeStart', s)\n const emitResizeEnd = () => emit('resizeEnd', size.value)\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n 'data-iris-resizable': '',\n 'data-state': props.disabled ? 'disabled' : 'idle',\n style: {\n position: 'relative',\n display: 'inline-block',\n width: `${size.value.width}px`,\n height: `${size.value.height}px`,\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n slots.default?.(),\n ...props.handles.map((handle) =>\n h(ResizableHandle, {\n key: handle,\n handle,\n disabled: props.disabled,\n keepAspect: props.keepAspect,\n minWidth: props.minWidth,\n minHeight: props.minHeight,\n maxWidth: props.maxWidth,\n maxHeight: props.maxHeight,\n sizeRef: size,\n onUpdate: setSize,\n onResizeStart: emitResizeStart,\n onResizeEnd: emitResizeEnd,\n }),\n ),\n ],\n )\n },\n})\n","import { computed, defineComponent, h, onMounted, onUpdated, ref, type PropType } from 'vue'\nimport { useDrag } from '../primitives/drag/useDrag'\n\nexport interface IrisMovablePosition {\n x: number\n y: number\n}\n\nexport interface IrisMovableBounds {\n minX?: number\n maxX?: number\n minY?: number\n maxY?: number\n}\n\n/**\n * Behavior wrapper: makes its child draggable via `transform`. The whole\n * wrapper drags by default; pass `byHandle` + put `data-iris-movable-handle`\n * on a descendant to restrict the drag origin.\n *\n * Renders `position: absolute` — wrap inside a `position: relative`\n * container for predictable layout.\n */\nexport const IrisMovable = defineComponent({\n name: 'IrisMovable',\n inheritAttrs: false,\n props: {\n position: { type: Object as PropType<IrisMovablePosition>, default: undefined },\n defaultPosition: {\n type: Object as PropType<IrisMovablePosition>,\n default: () => ({ x: 0, y: 0 }),\n },\n bounds: { type: Object as PropType<IrisMovableBounds>, default: () => ({}) },\n byHandle: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n },\n emits: {\n 'update:position': (_v: IrisMovablePosition) => true,\n dragStart: (_v: IrisMovablePosition) => true,\n dragEnd: (_v: IrisMovablePosition) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const isControlled = computed(() => props.position !== undefined)\n const internal = ref<IrisMovablePosition>({ ...props.defaultPosition })\n const position = computed<IrisMovablePosition>(() =>\n isControlled.value ? (props.position as IrisMovablePosition) : internal.value,\n )\n\n const rootRef = ref<HTMLElement | null>(null)\n const handleRef = ref<HTMLElement | null>(null)\n const dragging = ref(false)\n let startPos: IrisMovablePosition = { x: 0, y: 0 }\n\n // Find handle inside the wrapper when byHandle is set.\n const refreshHandle = () => {\n if (!props.byHandle) return\n handleRef.value =\n rootRef.value?.querySelector<HTMLElement>('[data-iris-movable-handle]') ?? null\n }\n onMounted(refreshHandle)\n onUpdated(refreshHandle)\n\n const dragTarget = computed(() => (props.byHandle ? handleRef : rootRef))\n\n const clamp = (p: IrisMovablePosition): IrisMovablePosition => ({\n x: Math.max(props.bounds.minX ?? -Infinity, Math.min(props.bounds.maxX ?? Infinity, p.x)),\n y: Math.max(props.bounds.minY ?? -Infinity, Math.min(props.bounds.maxY ?? Infinity, p.y)),\n })\n\n const setPosition = (next: IrisMovablePosition) => {\n if (!isControlled.value) internal.value = next\n emit('update:position', next)\n }\n\n useDrag({\n handle: computed(() => dragTarget.value.value),\n disabled: computed(() => props.disabled),\n onStart: () => {\n startPos = position.value\n dragging.value = true\n emit('dragStart', position.value)\n },\n onDrag: ({ dx, dy }) => {\n setPosition(clamp({ x: startPos.x + dx, y: startPos.y + dy }))\n },\n onEnd: () => {\n dragging.value = false\n emit('dragEnd', position.value)\n },\n })\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n ref: (el: unknown) => {\n rootRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-movable': '',\n 'data-state': dragging.value ? 'dragging' : 'idle',\n style: {\n position: 'absolute',\n left: '0',\n top: '0',\n transform: `translate3d(${position.value.x}px, ${position.value.y}px, 0)`,\n cursor: props.byHandle ? 'default' : props.disabled ? 'not-allowed' : 'grab',\n touchAction: 'none',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n slots.default?.(),\n )\n },\n})\n","import { defineComponent, onBeforeUnmount, watchEffect, type PropType } from 'vue'\n\nfunction parseShortcut(spec: string): {\n key: string\n shift: boolean\n alt: boolean\n ctrl: boolean\n meta: boolean\n ctrlOrMeta: boolean\n} {\n const parts = spec.split('+').map((p) => p.trim())\n const key = parts[parts.length - 1]!.toLowerCase()\n const mods = new Set(parts.slice(0, -1).map((p) => p.toLowerCase()))\n return {\n key,\n shift: mods.has('shift'),\n alt: mods.has('alt') || mods.has('option'),\n ctrl: mods.has('ctrl') || mods.has('control'),\n meta: mods.has('meta') || mods.has('cmd') || mods.has('command'),\n ctrlOrMeta: mods.has('mod'),\n }\n}\n\nfunction isInputTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el) return false\n const tag = el.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (el.isContentEditable) return true\n return false\n}\n\nfunction matches(event: KeyboardEvent, parsed: ReturnType<typeof parseShortcut>): boolean {\n if (event.key.toLowerCase() !== parsed.key) return false\n if (parsed.shift !== event.shiftKey) return false\n if (parsed.alt !== event.altKey) return false\n if (parsed.ctrlOrMeta) {\n if (!event.ctrlKey && !event.metaKey) return false\n } else {\n if (parsed.ctrl !== event.ctrlKey) return false\n if (parsed.meta !== event.metaKey) return false\n }\n return true\n}\n\n/**\n * Behavior wrapper: binds a global keyboard shortcut while children are\n * mounted. Renderless — returns children verbatim via a Fragment.\n *\n * `shortcut` format: `'Escape'`, `'Mod+s'` (Mod = Ctrl on Win/Linux, Cmd on\n * macOS), `'Shift+/'`. Accepts a single string or array of strings.\n *\n * @example\n * <IrisHotkey shortcut=\"Escape\" @trigger=\"close\">\n * <IrisDialog>…</IrisDialog>\n * </IrisHotkey>\n */\nexport const IrisHotkey = defineComponent({\n name: 'IrisHotkey',\n inheritAttrs: false,\n props: {\n shortcut: { type: [String, Array] as PropType<string | string[]>, required: true },\n disabled: { type: Boolean, default: false },\n allowInInputs: { type: Boolean, default: false },\n scope: { type: String as PropType<'document' | 'window'>, default: 'document' },\n },\n emits: {\n trigger: (_event: KeyboardEvent) => true,\n },\n setup(props, { slots, emit }) {\n let detach: (() => void) | null = null\n\n watchEffect((onCleanup) => {\n detach?.()\n detach = null\n if (props.disabled) return\n const specs = Array.isArray(props.shortcut) ? props.shortcut : [props.shortcut]\n const parsed = specs.map(parseShortcut)\n const target: EventTarget = props.scope === 'window' ? window : document\n const onKey = (event: Event) => {\n const e = event as KeyboardEvent\n if (!props.allowInInputs && isInputTarget(e.target)) return\n for (const p of parsed) {\n if (matches(e, p)) {\n emit('trigger', e)\n return\n }\n }\n }\n target.addEventListener('keydown', onKey)\n detach = () => target.removeEventListener('keydown', onKey)\n onCleanup(() => detach?.())\n })\n\n onBeforeUnmount(() => detach?.())\n\n return () => slots.default?.()\n },\n})\n","import { defineComponent, h, onBeforeUnmount, ref, watchEffect, type PropType, type Ref } from 'vue'\n\n/**\n * Behavior wrapper: fires `outside` when a `pointerdown` happens outside the\n * wrapped child tree. Wraps children in a `<span style=\"display:contents\">`\n * to capture the bounding box without affecting layout.\n *\n * Pass `ignore` (refs to additional \"inside\" elements) for trigger buttons\n * that live outside the wrapper but should still count as inside.\n */\nexport const IrisClickOutside = defineComponent({\n name: 'IrisClickOutside',\n inheritAttrs: false,\n props: {\n disabled: { type: Boolean, default: false },\n ignore: {\n type: Array as PropType<Ref<HTMLElement | null | undefined>[]>,\n default: () => [],\n },\n },\n emits: {\n outside: (_event: PointerEvent) => true,\n },\n setup(props, { slots, emit }) {\n const wrapperRef = ref<HTMLElement | null>(null)\n let detach: (() => void) | null = null\n\n watchEffect((onCleanup) => {\n detach?.()\n detach = null\n if (props.disabled) return\n if (typeof document === 'undefined') return\n const handler = (event: PointerEvent) => {\n const target = event.target as Node | null\n if (!target) return\n const wrapper = wrapperRef.value\n if (wrapper) {\n let node: Node | null = target\n while (node) {\n if (node === wrapper) return\n if ((node as HTMLElement).parentNode === wrapper) return\n node = node.parentNode\n }\n }\n for (const r of props.ignore) {\n const el = r.value\n if (el && el.contains(target)) return\n }\n emit('outside', event)\n }\n document.addEventListener('pointerdown', handler)\n detach = () => document.removeEventListener('pointerdown', handler)\n onCleanup(() => detach?.())\n })\n\n onBeforeUnmount(() => detach?.())\n\n return () =>\n h(\n 'span',\n {\n ref: (el: unknown) => {\n wrapperRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-click-outside': '',\n style: { display: 'contents' },\n },\n slots.default?.(),\n )\n },\n})\n","import { defineComponent, h, onBeforeUnmount, ref, type PropType, type VNode } from 'vue'\nimport { createSortable, type SortableRect } from '@iris-ui-kit/core'\n\n/** The data attribute on each sortable item for the collision system. */\nexport const SORTABLE_ITEM_ATTR = 'data-iris-sortable-item'\n\n/**\n * Behavior wrapper: makes a list of items sortable via drag-and-drop. Wraps\n * each direct child in a sortable item context. The consumer supplies the\n * `items` array and an `onReorder` callback. Items render through the default\n * slot; each item is wrapped with drag detection from `createSortable`.\n *\n * Composable: stack with `IrisResizable` / `IrisMovable` / `IrisHotkey` for\n * richer interactions on the same wrapped UI.\n *\n * @example\n * <IrisSortable :items=\"items\" @reorder=\"items = $event\">\n * <div v-for=\"(label, i) in items\" :key=\"i\">{{ label }}</div>\n * </IrisSortable>\n */\nexport const IrisSortable = defineComponent({\n name: 'IrisSortable',\n inheritAttrs: false,\n props: {\n /** The ordered items. Used to detect which item is at which position. */\n items: {\n type: Array as PropType<readonly unknown[]>,\n required: true,\n },\n /** Called when the user drops an item in a new position. */\n onReorder: {\n type: Function as PropType<(next: unknown[]) => void>,\n default: undefined,\n },\n /** Optional item key getter. Defaults to `String(index)`. */\n getKey: {\n type: Function as PropType<(item: unknown, index: number) => string>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n orientation: {\n type: String as PropType<'vertical' | 'horizontal'>,\n default: 'vertical',\n },\n class: {\n type: String,\n default: undefined,\n },\n style: {\n type: Object as PropType<Record<string, string | number>>,\n default: undefined,\n },\n },\n emits: {\n reorder: (_next: unknown[]) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const containerRef = ref<HTMLElement | null>(null)\n const sortable = createSortable()\n const activeKey = ref<string | null>(null)\n\n // Subscribe to sortable state changes to track the active drag key\n const unsub = sortable.subscribe((state) => {\n activeKey.value = state.activeId\n })\n onBeforeUnmount(unsub)\n\n // Find the DOM order index of a child by its data-iris-sortable-item value.\n const indexOf = (key: string): number => {\n const container = containerRef.value\n if (!container) return -1\n return Array.from(\n container.querySelectorAll<HTMLElement>(`[${SORTABLE_ITEM_ATTR}]`),\n ).findIndex((el) => el.getAttribute(SORTABLE_ITEM_ATTR) === key)\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (props.disabled) return\n const target = (e.target as HTMLElement).closest(`[${SORTABLE_ITEM_ATTR}]`)\n if (!target) return\n const container = containerRef.value\n if (!container) return\n const key = target.getAttribute(SORTABLE_ITEM_ATTR) ?? ''\n const index = indexOf(key)\n if (index < 0) return\n sortable.press(key, e.clientX, e.clientY)\n }\n\n const onPointerMove = (e: PointerEvent) => {\n if (!sortable.isPending() && sortable.getState().activeId === null) return\n const items = containerRef.value?.querySelectorAll<HTMLElement>(`[${SORTABLE_ITEM_ATTR}]`)\n const rects: SortableRect[] = Array.from(items ?? []).map((el) => {\n const rect = el.getBoundingClientRect()\n return {\n id: el.getAttribute(SORTABLE_ITEM_ATTR) ?? '',\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n })\n // Promote pending press to active drag once past the movement threshold\n sortable.tryStart(e.clientX, e.clientY)\n if (sortable.getState().activeId !== null) {\n sortable.moveOver({ x: e.clientX, y: e.clientY }, rects)\n }\n }\n\n const onPointerUp = () => {\n const state = sortable.getState()\n if (state.activeId === null) {\n sortable.cancel()\n return\n }\n const result = sortable.end()\n if (result.activeId && result.overId && result.activeId !== result.overId) {\n const from = indexOf(result.activeId)\n const to = indexOf(result.overId)\n if (from >= 0 && to >= 0) {\n const next = [...(props.items as unknown[])]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved!)\n if (props.onReorder) {\n props.onReorder(next)\n }\n emit('reorder', next)\n }\n }\n }\n\n const resolveKey = (item: unknown, index: number): string =>\n props.getKey ? props.getKey(item, index) : String(index)\n\n return () => {\n const children: VNode[] = []\n const defaultSlots = slots.default?.()\n if (defaultSlots) {\n const itemsArray = props.items as unknown[]\n defaultSlots.forEach((child, index) => {\n const item = itemsArray[index]\n const key = resolveKey(item, index)\n const isDragging = key === activeKey.value\n children.push(\n h(\n 'div',\n {\n key,\n [SORTABLE_ITEM_ATTR]: key,\n 'data-iris-sortable-dragging': isDragging ? '' : undefined,\n style: {\n transition: isDragging ? 'none' : 'transform 150ms ease',\n opacity: isDragging ? 0.4 : 1,\n position: 'relative',\n zIndex: isDragging ? 100 : undefined,\n },\n },\n [child],\n ),\n )\n })\n }\n\n return h(\n 'div',\n {\n ...attrs,\n ref: (el: unknown) => {\n containerRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-sortable': '',\n 'data-state': activeKey.value ? 'dragging' : 'idle',\n class: props.class,\n style: {\n display: 'flex',\n flexDirection: props.orientation === 'horizontal' ? 'row' : 'column',\n gap: 'var(--iris-gap-sm, 4px)',\n opacity: props.disabled ? 0.6 : 1,\n userSelect: activeKey.value ? 'none' : undefined,\n ...((props.style as Record<string, string | number> | undefined) ?? {}),\n },\n onPointerdown: onPointerDown,\n onPointermove: onPointerMove,\n onPointerup: onPointerUp,\n onPointerleave: onPointerUp,\n },\n children,\n )\n }\n },\n})\n","import { defineComponent, h, onBeforeUnmount, watch, type PropType } from 'vue'\nimport { createLongPress } from '@iris-ui-kit/core'\n\n/**\n * Behavior wrapper: fires `onLongPress` once the pointer has been held down\n * for `holdDelay` ms without an intervening pointerup/pointerleave. Wraps\n * children in a `<span data-iris-long-press style=\"display:contents\">` so it\n * doesn't affect layout. Backed by `createLongPress`'s statechart timer.\n *\n * @example\n * <IrisLongPress :hold-delay=\"500\" @longpress=\"onLongPress\">\n * <IrisButton>Hold me</IrisButton>\n * </IrisLongPress>\n */\nexport const IrisLongPress = defineComponent({\n name: 'IrisLongPress',\n inheritAttrs: false,\n props: {\n /** Time the pointer must be held before `onLongPress` fires, in ms. */\n holdDelay: {\n type: Number,\n default: 500,\n },\n /** Called once when the hold reaches `holdDelay` without an intervening release. */\n onLongPress: {\n type: Function as PropType<() => void>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: {\n longpress: () => true,\n },\n setup(props, { slots, emit }) {\n const fire = () => {\n props.onLongPress?.()\n emit('longpress')\n }\n // `let`, not `const`: reassigned on holdDelay change; closures (handlers,\n // unmount hook) read the CURRENT binding.\n let ctrl = createLongPress({ holdDelay: props.holdDelay, onLongPress: fire })\n\n const onPointerDown = () => {\n if (props.disabled) return\n ctrl.press()\n }\n const onPointerUp = () => {\n ctrl.release()\n }\n const onPointerLeave = () => {\n ctrl.cancel()\n }\n // Touch scroll / system gesture: the pointer is removed from the active\n // set without pointerup — send CANCEL so the pending hold never fires.\n const onPointerCancel = () => {\n ctrl.cancel()\n }\n\n // holdDelay prop changes re-arm the timer with the new value.\n watch(\n () => props.holdDelay,\n (holdDelay) => {\n const wasPressing = ctrl.state() === 'pressing'\n ctrl.cancel() // clears the pending after-timer (machine exit cancels pending)\n ctrl = createLongPress({ holdDelay, onLongPress: fire })\n if (wasPressing) ctrl.press() // re-arm with the new delay\n },\n )\n\n // disabled flipping true mid-hold aborts the pending gesture.\n watch(\n () => props.disabled,\n (disabled) => {\n if (disabled) ctrl.cancel()\n },\n )\n\n onBeforeUnmount(() => ctrl.cancel())\n\n return () =>\n h(\n 'span',\n {\n 'data-iris-long-press': '',\n style: { display: 'contents' },\n onPointerdown: onPointerDown,\n onPointerup: onPointerUp,\n onPointerleave: onPointerLeave,\n onPointercancel: onPointerCancel,\n },\n slots.default?.(),\n )\n },\n})\n"]}
|
package/dist/behaviors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { IrisClickOutside, IrisHotkey, IrisLongPress, IrisMovable, IrisResizable } from './chunk-
|
|
1
|
+
export { IrisClickOutside, IrisHotkey, IrisLongPress, IrisMovable, IrisResizable } from './chunk-7L6UB6MD.js';
|
|
2
2
|
export { IrisSortable, SORTABLE_ITEM_ATTR } from './chunk-W3B6E5GN.js';
|
|
3
3
|
//# sourceMappingURL=behaviors.js.map
|
|
4
4
|
//# sourceMappingURL=behaviors.js.map
|
|
@@ -75,5 +75,5 @@ var IrisErrorBoundary = defineComponent({
|
|
|
75
75
|
});
|
|
76
76
|
|
|
77
77
|
export { IrisErrorBoundary };
|
|
78
|
-
//# sourceMappingURL=chunk-
|
|
79
|
-
//# sourceMappingURL=chunk-
|
|
78
|
+
//# sourceMappingURL=chunk-3547J6IN.js.map
|
|
79
|
+
//# sourceMappingURL=chunk-3547J6IN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error-boundary/IrisErrorBoundary.ts"],"names":[],"mappings":";;;AA0CO,IAAM,oBAAoB,eAAA,CAAgB;AAAA,EAC/C,IAAA,EAAM,mBAAA;AAAA,EACN,YAAA,EAAc,KAAA;AAAA,EACd,KAAA,EAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,KAAA,CAAM,KAAA,EAAO,EAAE,KAAA,EAAO,OAAM,EAAG;AAC7B,IAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAa,IAAI,CAAA;AAG/B,IAAA,MAAM,UAAA,GAAa,oBAAmB,CAAG,UAAA;AAEzC,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AAAA,IAChB,CAAA;AAEA,IAAA,eAAA,CAAgB,CAAC,GAAA,EAAK,QAAA,EAAU,IAAA,KAAS;AACvC,MAAA,KAAA,CAAM,KAAA,GAAQ,GAAA;AACd,MAAA,KAAA,CAAM,OAAA,GAAU,KAAK,IAAI,CAAA;AAOzB,MAAA,IAAI;AACF,QAAA,UAAA,CAAW,MAAA,CAAO,YAAA,GAAe,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AAAA,MACtD,SAAS,YAAA,EAAc;AACrB,QAAA,OAAA,CAAQ,MAAM,YAAY,CAAA;AAAA,MAC5B;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,wBAAwB,MAAa;AACzC,MAAA,MAAM,OAAA,GACJ,KAAA,CAAM,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,OAAA,GACxC,KAAA,CAAM,KAAA,CAAM,OAAA,GACZ,CAAA,CAAE,uBAAuB,CAAA;AAE/B,MAAA,OAAO,CAAA;AAAA,QACL,KAAA;AAAA,QACA;AAAA,UACE,GAAG,KAAA;AAAA,UACH,0BAAA,EAA4B,EAAA;AAAA,UAC5B,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,MAAA,EAAQ,8BAAA;AAAA,YACR,YAAA,EAAc,4BAAA;AAAA,YACd,KAAA,EAAO,oBAAA;AAAA,YACP,GAAK,KAAA,CAAM,KAAA,IAAgD;AAAC;AAC9D,SACF;AAAA,QACA;AAAA,UACE,EAAE,KAAA,EAAO,EAAE,kCAAA,EAAoC,EAAA,IAAM,OAAO,CAAA;AAAA,UAC5D,CAAA;AAAA,YACE,QAAA;AAAA,YACA;AAAA,cACE,IAAA,EAAM,QAAA;AAAA,cACN,gCAAA,EAAkC,EAAA;AAAA,cAClC,OAAA,EAAS;AAAA,aACX;AAAA,YACA,EAAE,qBAAqB;AAAA;AACzB;AACF,OACF;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,KAAA,CAAM,UAAU,IAAA,EAAM;AACxB,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,QAAA;AACvC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAO,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AAAA,QAC7C;AACA,QAAA,OAAO,qBAAA,EAAsB;AAAA,MAC/B;AACA,MAAA,OAAO,MAAM,OAAA,IAAU;AAAA,IACzB,CAAA;AAAA,EACF;AACF,CAAC","file":"chunk-3547J6IN.js","sourcesContent":["import {\n defineComponent,\n getCurrentInstance,\n h,\n onErrorCaptured,\n ref,\n type PropType,\n type VNode,\n} from 'vue'\nimport { useI18n } from '../i18n'\n\n/** Render-customization payload handed to the `#fallback` slot / `fallback` prop. */\nexport interface IrisErrorBoundaryFallbackProps {\n /** The error caught while rendering the guarded subtree. */\n error: unknown\n /** Clears the error and re-attempts rendering the children. */\n reset: () => void\n}\n\n/** Public prop surface of {@link IrisErrorBoundary}. */\nexport interface IrisErrorBoundaryProps {\n /**\n * Custom fallback renderer. Receives `{ error, reset }` and returns the\n * fallback UI. A `#fallback` scoped slot takes precedence when both are given.\n * When neither is supplied the themed DEFAULT fallback renders.\n */\n fallback?: (props: IrisErrorBoundaryFallbackProps) => VNode | VNode[] | string\n /** Invoked with the caught error (and Vue's error-info string) for logging. */\n onError?: (error: unknown, info?: string) => void\n}\n\n/**\n * IrisErrorBoundary: catches errors thrown while rendering its guarded subtree\n * (default slot), switches to a fallback, and exposes `reset()` to clear the\n * error and re-attempt rendering. Catching does NOT rethrow — a single broken\n * subtree no longer crashes the whole tree.\n *\n * Customize via a `#fallback` scoped slot or the `fallback` prop, each receiving\n * `{ error, reset }`. Without either, a themed, accessible (`role=\"alert\"`)\n * default fallback shows the error message + a retry button, i18n'd through\n * `useI18n()` (English defaults without a provider).\n */\nexport const IrisErrorBoundary = defineComponent({\n name: 'IrisErrorBoundary',\n inheritAttrs: false,\n props: {\n fallback: {\n type: Function as PropType<IrisErrorBoundaryProps['fallback']>,\n default: undefined,\n },\n onError: {\n type: Function as PropType<IrisErrorBoundaryProps['onError']>,\n default: undefined,\n },\n },\n setup(props, { attrs, slots }) {\n const { t } = useI18n()\n const error = ref<unknown>(null)\n // App-level telemetry handler (Sentry/…). Read live so a handler\n // configured after this component's setup is still picked up.\n const appContext = getCurrentInstance()!.appContext\n\n const reset = () => {\n error.value = null\n }\n\n onErrorCaptured((err, instance, info) => {\n error.value = err\n props.onError?.(err, info)\n // Vue's handleError skips its app.config.errorHandler branch when a hook\n // returns false, so forward explicitly with the exact args Vue would\n // have passed — (err, exposedInstance, errorInfo). Guarded so a throwing\n // handler is logged, not rethrown: a bare call would escape containment\n // from inside the hook and re-enter handleError with the handler's own\n // error (Vue's own path wraps the handler in callWithErrorHandling).\n try {\n appContext.config.errorHandler?.(err, instance, info)\n } catch (handlerError) {\n console.error(handlerError)\n }\n // Stop further propagation so the error does not crash the parent tree.\n return false\n })\n\n const renderDefaultFallback = (): VNode => {\n const message =\n error.value instanceof Error && error.value.message\n ? error.value.message\n : t('errorBoundary.message')\n\n return h(\n 'div',\n {\n ...attrs,\n 'data-iris-error-boundary': '',\n role: 'alert',\n style: {\n padding: '16px',\n border: '1px solid var(--iris-danger)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n color: 'var(--iris-danger)',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n h('div', { 'data-iris-error-boundary-message': '' }, message),\n h(\n 'button',\n {\n type: 'button',\n 'data-iris-error-boundary-retry': '',\n onClick: reset,\n },\n t('errorBoundary.retry'),\n ),\n ],\n )\n }\n\n return () => {\n if (error.value !== null) {\n const custom = slots.fallback ?? props.fallback\n if (custom) {\n return custom({ error: error.value, reset })\n }\n return renderDefaultFallback()\n }\n return slots.default?.()\n }\n },\n})\n"]}
|
|
@@ -495,13 +495,11 @@ var IrisLongPress = defineComponent({
|
|
|
495
495
|
longpress: () => true
|
|
496
496
|
},
|
|
497
497
|
setup(props, { slots, emit }) {
|
|
498
|
-
const
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
}
|
|
504
|
-
});
|
|
498
|
+
const fire = () => {
|
|
499
|
+
props.onLongPress?.();
|
|
500
|
+
emit("longpress");
|
|
501
|
+
};
|
|
502
|
+
let ctrl = createLongPress({ holdDelay: props.holdDelay, onLongPress: fire });
|
|
505
503
|
const onPointerDown = () => {
|
|
506
504
|
if (props.disabled) return;
|
|
507
505
|
ctrl.press();
|
|
@@ -512,6 +510,24 @@ var IrisLongPress = defineComponent({
|
|
|
512
510
|
const onPointerLeave = () => {
|
|
513
511
|
ctrl.cancel();
|
|
514
512
|
};
|
|
513
|
+
const onPointerCancel = () => {
|
|
514
|
+
ctrl.cancel();
|
|
515
|
+
};
|
|
516
|
+
watch(
|
|
517
|
+
() => props.holdDelay,
|
|
518
|
+
(holdDelay) => {
|
|
519
|
+
const wasPressing = ctrl.state() === "pressing";
|
|
520
|
+
ctrl.cancel();
|
|
521
|
+
ctrl = createLongPress({ holdDelay, onLongPress: fire });
|
|
522
|
+
if (wasPressing) ctrl.press();
|
|
523
|
+
}
|
|
524
|
+
);
|
|
525
|
+
watch(
|
|
526
|
+
() => props.disabled,
|
|
527
|
+
(disabled) => {
|
|
528
|
+
if (disabled) ctrl.cancel();
|
|
529
|
+
}
|
|
530
|
+
);
|
|
515
531
|
onBeforeUnmount(() => ctrl.cancel());
|
|
516
532
|
return () => h(
|
|
517
533
|
"span",
|
|
@@ -520,7 +536,8 @@ var IrisLongPress = defineComponent({
|
|
|
520
536
|
style: { display: "contents" },
|
|
521
537
|
onPointerdown: onPointerDown,
|
|
522
538
|
onPointerup: onPointerUp,
|
|
523
|
-
onPointerleave: onPointerLeave
|
|
539
|
+
onPointerleave: onPointerLeave,
|
|
540
|
+
onPointercancel: onPointerCancel
|
|
524
541
|
},
|
|
525
542
|
slots.default?.()
|
|
526
543
|
);
|
|
@@ -528,5 +545,5 @@ var IrisLongPress = defineComponent({
|
|
|
528
545
|
});
|
|
529
546
|
|
|
530
547
|
export { IrisClickOutside, IrisHotkey, IrisLongPress, IrisMovable, IrisResizable, useDrag };
|
|
531
|
-
//# sourceMappingURL=chunk-
|
|
532
|
-
//# sourceMappingURL=chunk-
|
|
548
|
+
//# sourceMappingURL=chunk-7L6UB6MD.js.map
|
|
549
|
+
//# sourceMappingURL=chunk-7L6UB6MD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/drag/useDrag.ts","../src/behaviors/Resizable.ts","../src/behaviors/Movable.ts","../src/behaviors/Hotkey.ts","../src/behaviors/ClickOutside.ts","../src/behaviors/LongPress.ts"],"names":["defineComponent","computed","ref","h","watchEffect","onBeforeUnmount","watch"],"mappings":"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","file":"chunk-7L6UB6MD.js","sourcesContent":["import { onScopeDispose, watch, type Ref } from 'vue'\n\nexport interface DragState {\n /** Pointer x in client coordinates. */\n x: number\n /** Pointer y in client coordinates. */\n y: number\n /** Cumulative delta from pointerdown. */\n dx: number\n /** Cumulative delta from pointerdown. */\n dy: number\n /** The active pointer event. */\n event: PointerEvent\n}\n\nexport interface UseDragOptions {\n /** The element the drag handle is bound to. */\n handle: Ref<HTMLElement | null | undefined>\n /** Drag is only initiated for these pointer button(s). Default `[0]` (primary). */\n buttons?: number[]\n /** Called on pointerdown that starts a drag. Return `false` to cancel. */\n onStart?: (state: DragState) => boolean | void\n /** Called on every pointermove while dragging. */\n onDrag?: (state: DragState) => void\n /** Called on pointerup or pointercancel. */\n onEnd?: (state: DragState) => void\n /** Disable the drag. */\n disabled?: Ref<boolean | undefined>\n}\n\n/**\n * Bind pointer-driven drag handlers to an element. Uses `setPointerCapture`\n * so the drag continues even if the pointer leaves the element. Cancels on\n * `pointercancel` (e.g. browser interruption).\n *\n * Pure pointer events — works for mouse, touch, and pen. The handle element\n * gets `touchAction: 'none'` automatically while a drag is in progress to\n * prevent scrolling interference on touch devices.\n *\n * @example\n * const handleRef = ref<HTMLElement | null>(null)\n * useDrag({\n * handle: handleRef,\n * onDrag: ({ dx }) => (offsetX.value = startOffset + dx),\n * })\n */\nexport function useDrag(options: UseDragOptions): void {\n const buttons = options.buttons ?? [0]\n let startX = 0\n let startY = 0\n let active: PointerEvent | null = null\n\n const onPointerDown = (event: PointerEvent) => {\n if (options.disabled?.value) return\n if (!buttons.includes(event.button)) return\n const handle = options.handle.value\n if (!handle) return\n\n startX = event.clientX\n startY = event.clientY\n const state: DragState = {\n x: event.clientX,\n y: event.clientY,\n dx: 0,\n dy: 0,\n event,\n }\n const result = options.onStart?.(state)\n if (result === false) return\n active = event\n handle.setPointerCapture?.(event.pointerId)\n handle.style.touchAction = 'none'\n event.preventDefault()\n }\n\n const onPointerMove = (event: PointerEvent) => {\n if (!active || active.pointerId !== event.pointerId) return\n options.onDrag?.({\n x: event.clientX,\n y: event.clientY,\n dx: event.clientX - startX,\n dy: event.clientY - startY,\n event,\n })\n }\n\n const onPointerEnd = (event: PointerEvent) => {\n if (!active || active.pointerId !== event.pointerId) return\n const handle = options.handle.value\n handle?.releasePointerCapture?.(event.pointerId)\n if (handle) handle.style.touchAction = ''\n options.onEnd?.({\n x: event.clientX,\n y: event.clientY,\n dx: event.clientX - startX,\n dy: event.clientY - startY,\n event,\n })\n active = null\n }\n\n const attach = (el: HTMLElement) => {\n el.addEventListener('pointerdown', onPointerDown)\n el.addEventListener('pointermove', onPointerMove)\n el.addEventListener('pointerup', onPointerEnd)\n el.addEventListener('pointercancel', onPointerEnd)\n }\n\n const detach = (el: HTMLElement) => {\n el.removeEventListener('pointerdown', onPointerDown)\n el.removeEventListener('pointermove', onPointerMove)\n el.removeEventListener('pointerup', onPointerEnd)\n el.removeEventListener('pointercancel', onPointerEnd)\n }\n\n watch(\n options.handle,\n (el, prev) => {\n if (prev) detach(prev)\n if (el) attach(el)\n },\n { immediate: true, flush: 'post' },\n )\n\n onScopeDispose(() => {\n const el = options.handle.value\n if (el) detach(el)\n })\n}\n","import { computed, defineComponent, h, ref, type PropType, type Ref } from 'vue'\nimport { useDrag } from '../primitives/drag/useDrag'\n\nexport type IrisResizableHandle =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n\nexport interface IrisResizableSize {\n width: number\n height: number\n}\n\nconst ALL_HANDLES: IrisResizableHandle[] = [\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n]\n\nconst HANDLE_CURSORS: Record<IrisResizableHandle, string> = {\n top: 'ns-resize',\n right: 'ew-resize',\n bottom: 'ns-resize',\n left: 'ew-resize',\n 'top-left': 'nwse-resize',\n 'top-right': 'nesw-resize',\n 'bottom-left': 'nesw-resize',\n 'bottom-right': 'nwse-resize',\n}\n\nfunction handlePosition(handle: IrisResizableHandle): Record<string, string> {\n const s: Record<string, string> = { position: 'absolute' }\n const t = handle.includes('top')\n const b = handle.includes('bottom')\n const l = handle.includes('left')\n const r = handle.includes('right')\n if (t) s.top = '-4px'\n if (b) s.bottom = '-4px'\n if (l) s.left = '-4px'\n if (r) s.right = '-4px'\n const isCorner = (t || b) && (l || r)\n if (isCorner) {\n s.width = '12px'\n s.height = '12px'\n } else if (t || b) {\n s.left = '0'\n s.right = '0'\n s.height = '8px'\n } else {\n s.top = '0'\n s.bottom = '0'\n s.width = '8px'\n }\n s.cursor = HANDLE_CURSORS[handle]\n return s\n}\n\n/**\n * Internal per-handle sub-component (NOT exported). Declared at module level\n * so its type identity is stable across parent re-renders: each handle\n * instance's `setup()` — and therefore its single `useDrag` call — runs\n * exactly once. The previous implementation invoked `useDrag` from a\n * per-render `renderHandle()` helper with a fresh ref each time; because Vue\n * never re-invokes old *function* refs on patch, those listener sets were\n * never detached and emitted duplicates from the second drag onward.\n */\nconst ResizableHandle = defineComponent({\n name: 'ResizableHandle',\n props: {\n handle: { type: String as PropType<IrisResizableHandle>, required: true },\n disabled: { type: Boolean, default: false },\n keepAspect: { type: Boolean, default: false },\n minWidth: { type: Number, default: 40 },\n minHeight: { type: Number, default: 40 },\n maxWidth: { type: Number, default: Infinity },\n maxHeight: { type: Number, default: Infinity },\n /** Stable computed ref from the parent; read only (never mutated). */\n sizeRef: { type: Object as PropType<Ref<IrisResizableSize>>, required: true },\n /** Stable setup-level callbacks from the parent. */\n onUpdate: { type: Function as PropType<(next: IrisResizableSize) => void>, required: true },\n onResizeStart: {\n type: Function as PropType<(s: IrisResizableSize) => void>,\n default: undefined,\n },\n onResizeEnd: { type: Function as PropType<() => void>, default: undefined },\n },\n setup(props) {\n // Created ONCE per handle instance (not per render):\n const handleRef = ref<HTMLElement | null>(null)\n let startSize: IrisResizableSize = { width: 0, height: 0 }\n let aspect = 1\n\n useDrag({\n handle: handleRef,\n disabled: computed(() => props.disabled),\n onStart: () => {\n startSize = { ...props.sizeRef.value }\n aspect = startSize.width / Math.max(1, startSize.height)\n props.onResizeStart?.(startSize)\n },\n onDrag: ({ dx, dy }) => {\n const t = props.handle.includes('top')\n const b = props.handle.includes('bottom')\n const l = props.handle.includes('left')\n const r = props.handle.includes('right')\n let nextW = startSize.width\n let nextH = startSize.height\n if (r) nextW = startSize.width + dx\n if (l) nextW = startSize.width - dx\n if (b) nextH = startSize.height + dy\n if (t) nextH = startSize.height - dy\n if (props.keepAspect && (t || b) && (l || r)) {\n nextH = nextW / aspect\n }\n nextW = Math.max(props.minWidth, Math.min(props.maxWidth, nextW))\n nextH = Math.max(props.minHeight, Math.min(props.maxHeight, nextH))\n props.onUpdate({ width: nextW, height: nextH })\n },\n onEnd: () => props.onResizeEnd?.(),\n })\n\n return () =>\n h('div', {\n ref: (el: unknown) => {\n handleRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-resizable-handle': props.handle,\n style: {\n ...handlePosition(props.handle),\n touchAction: 'none',\n background: 'transparent',\n zIndex: '1',\n },\n })\n },\n})\n\n/**\n * Behavior wrapper: makes its child resizable via 8-direction handles. The\n * wrapper itself is `display: inline-block; position: relative` so the child\n * can be ANY element. Handles overlay the wrapper's edges.\n *\n * Composable with `IrisMovable`, `IrisHotkey`, `IrisClickOutside`.\n *\n * @example\n * <IrisResizable :defaultSize=\"{ width: 400, height: 300 }\">\n * <IrisList :items=\"rows\" />\n * </IrisResizable>\n */\nexport const IrisResizable = defineComponent({\n name: 'IrisResizable',\n inheritAttrs: false,\n props: {\n size: { type: Object as PropType<IrisResizableSize>, default: undefined },\n defaultSize: {\n type: Object as PropType<IrisResizableSize>,\n default: () => ({ width: 200, height: 200 }),\n },\n handles: { type: Array as PropType<IrisResizableHandle[]>, default: () => ALL_HANDLES },\n minWidth: { type: Number, default: 40 },\n minHeight: { type: Number, default: 40 },\n maxWidth: { type: Number, default: Infinity },\n maxHeight: { type: Number, default: Infinity },\n keepAspect: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n },\n emits: {\n 'update:size': (_v: IrisResizableSize) => true,\n resizeStart: (_v: IrisResizableSize) => true,\n resizeEnd: (_v: IrisResizableSize) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const isControlled = computed(() => props.size !== undefined)\n const internal = ref<IrisResizableSize>({ ...props.defaultSize })\n const size = computed<IrisResizableSize>(() =>\n isControlled.value ? (props.size as IrisResizableSize) : internal.value,\n )\n\n const setSize = (next: IrisResizableSize) => {\n if (!isControlled.value) internal.value = next\n emit('update:size', next)\n }\n\n // Stable setup-level bindings: passed as props to the keyed handle\n // instances so they never trigger re-invocation of the child setup.\n const emitResizeStart = (s: IrisResizableSize) => emit('resizeStart', s)\n const emitResizeEnd = () => emit('resizeEnd', size.value)\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n 'data-iris-resizable': '',\n 'data-state': props.disabled ? 'disabled' : 'idle',\n style: {\n position: 'relative',\n display: 'inline-block',\n width: `${size.value.width}px`,\n height: `${size.value.height}px`,\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n slots.default?.(),\n ...props.handles.map((handle) =>\n h(ResizableHandle, {\n key: handle,\n handle,\n disabled: props.disabled,\n keepAspect: props.keepAspect,\n minWidth: props.minWidth,\n minHeight: props.minHeight,\n maxWidth: props.maxWidth,\n maxHeight: props.maxHeight,\n sizeRef: size,\n onUpdate: setSize,\n onResizeStart: emitResizeStart,\n onResizeEnd: emitResizeEnd,\n }),\n ),\n ],\n )\n },\n})\n","import { computed, defineComponent, h, onMounted, onUpdated, ref, type PropType } from 'vue'\nimport { useDrag } from '../primitives/drag/useDrag'\n\nexport interface IrisMovablePosition {\n x: number\n y: number\n}\n\nexport interface IrisMovableBounds {\n minX?: number\n maxX?: number\n minY?: number\n maxY?: number\n}\n\n/**\n * Behavior wrapper: makes its child draggable via `transform`. The whole\n * wrapper drags by default; pass `byHandle` + put `data-iris-movable-handle`\n * on a descendant to restrict the drag origin.\n *\n * Renders `position: absolute` — wrap inside a `position: relative`\n * container for predictable layout.\n */\nexport const IrisMovable = defineComponent({\n name: 'IrisMovable',\n inheritAttrs: false,\n props: {\n position: { type: Object as PropType<IrisMovablePosition>, default: undefined },\n defaultPosition: {\n type: Object as PropType<IrisMovablePosition>,\n default: () => ({ x: 0, y: 0 }),\n },\n bounds: { type: Object as PropType<IrisMovableBounds>, default: () => ({}) },\n byHandle: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n },\n emits: {\n 'update:position': (_v: IrisMovablePosition) => true,\n dragStart: (_v: IrisMovablePosition) => true,\n dragEnd: (_v: IrisMovablePosition) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const isControlled = computed(() => props.position !== undefined)\n const internal = ref<IrisMovablePosition>({ ...props.defaultPosition })\n const position = computed<IrisMovablePosition>(() =>\n isControlled.value ? (props.position as IrisMovablePosition) : internal.value,\n )\n\n const rootRef = ref<HTMLElement | null>(null)\n const handleRef = ref<HTMLElement | null>(null)\n const dragging = ref(false)\n let startPos: IrisMovablePosition = { x: 0, y: 0 }\n\n // Find handle inside the wrapper when byHandle is set.\n const refreshHandle = () => {\n if (!props.byHandle) return\n handleRef.value =\n rootRef.value?.querySelector<HTMLElement>('[data-iris-movable-handle]') ?? null\n }\n onMounted(refreshHandle)\n onUpdated(refreshHandle)\n\n const dragTarget = computed(() => (props.byHandle ? handleRef : rootRef))\n\n const clamp = (p: IrisMovablePosition): IrisMovablePosition => ({\n x: Math.max(props.bounds.minX ?? -Infinity, Math.min(props.bounds.maxX ?? Infinity, p.x)),\n y: Math.max(props.bounds.minY ?? -Infinity, Math.min(props.bounds.maxY ?? Infinity, p.y)),\n })\n\n const setPosition = (next: IrisMovablePosition) => {\n if (!isControlled.value) internal.value = next\n emit('update:position', next)\n }\n\n useDrag({\n handle: computed(() => dragTarget.value.value),\n disabled: computed(() => props.disabled),\n onStart: () => {\n startPos = position.value\n dragging.value = true\n emit('dragStart', position.value)\n },\n onDrag: ({ dx, dy }) => {\n setPosition(clamp({ x: startPos.x + dx, y: startPos.y + dy }))\n },\n onEnd: () => {\n dragging.value = false\n emit('dragEnd', position.value)\n },\n })\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n ref: (el: unknown) => {\n rootRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-movable': '',\n 'data-state': dragging.value ? 'dragging' : 'idle',\n style: {\n position: 'absolute',\n left: '0',\n top: '0',\n transform: `translate3d(${position.value.x}px, ${position.value.y}px, 0)`,\n cursor: props.byHandle ? 'default' : props.disabled ? 'not-allowed' : 'grab',\n touchAction: 'none',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n slots.default?.(),\n )\n },\n})\n","import { defineComponent, onBeforeUnmount, watchEffect, type PropType } from 'vue'\n\nfunction parseShortcut(spec: string): {\n key: string\n shift: boolean\n alt: boolean\n ctrl: boolean\n meta: boolean\n ctrlOrMeta: boolean\n} {\n const parts = spec.split('+').map((p) => p.trim())\n const key = parts[parts.length - 1]!.toLowerCase()\n const mods = new Set(parts.slice(0, -1).map((p) => p.toLowerCase()))\n return {\n key,\n shift: mods.has('shift'),\n alt: mods.has('alt') || mods.has('option'),\n ctrl: mods.has('ctrl') || mods.has('control'),\n meta: mods.has('meta') || mods.has('cmd') || mods.has('command'),\n ctrlOrMeta: mods.has('mod'),\n }\n}\n\nfunction isInputTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el) return false\n const tag = el.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (el.isContentEditable) return true\n return false\n}\n\nfunction matches(event: KeyboardEvent, parsed: ReturnType<typeof parseShortcut>): boolean {\n if (event.key.toLowerCase() !== parsed.key) return false\n if (parsed.shift !== event.shiftKey) return false\n if (parsed.alt !== event.altKey) return false\n if (parsed.ctrlOrMeta) {\n if (!event.ctrlKey && !event.metaKey) return false\n } else {\n if (parsed.ctrl !== event.ctrlKey) return false\n if (parsed.meta !== event.metaKey) return false\n }\n return true\n}\n\n/**\n * Behavior wrapper: binds a global keyboard shortcut while children are\n * mounted. Renderless — returns children verbatim via a Fragment.\n *\n * `shortcut` format: `'Escape'`, `'Mod+s'` (Mod = Ctrl on Win/Linux, Cmd on\n * macOS), `'Shift+/'`. Accepts a single string or array of strings.\n *\n * @example\n * <IrisHotkey shortcut=\"Escape\" @trigger=\"close\">\n * <IrisDialog>…</IrisDialog>\n * </IrisHotkey>\n */\nexport const IrisHotkey = defineComponent({\n name: 'IrisHotkey',\n inheritAttrs: false,\n props: {\n shortcut: { type: [String, Array] as PropType<string | string[]>, required: true },\n disabled: { type: Boolean, default: false },\n allowInInputs: { type: Boolean, default: false },\n scope: { type: String as PropType<'document' | 'window'>, default: 'document' },\n },\n emits: {\n trigger: (_event: KeyboardEvent) => true,\n },\n setup(props, { slots, emit }) {\n let detach: (() => void) | null = null\n\n watchEffect((onCleanup) => {\n detach?.()\n detach = null\n if (props.disabled) return\n const specs = Array.isArray(props.shortcut) ? props.shortcut : [props.shortcut]\n const parsed = specs.map(parseShortcut)\n const target: EventTarget = props.scope === 'window' ? window : document\n const onKey = (event: Event) => {\n const e = event as KeyboardEvent\n if (!props.allowInInputs && isInputTarget(e.target)) return\n for (const p of parsed) {\n if (matches(e, p)) {\n emit('trigger', e)\n return\n }\n }\n }\n target.addEventListener('keydown', onKey)\n detach = () => target.removeEventListener('keydown', onKey)\n onCleanup(() => detach?.())\n })\n\n onBeforeUnmount(() => detach?.())\n\n return () => slots.default?.()\n },\n})\n","import { defineComponent, h, onBeforeUnmount, ref, watchEffect, type PropType, type Ref } from 'vue'\n\n/**\n * Behavior wrapper: fires `outside` when a `pointerdown` happens outside the\n * wrapped child tree. Wraps children in a `<span style=\"display:contents\">`\n * to capture the bounding box without affecting layout.\n *\n * Pass `ignore` (refs to additional \"inside\" elements) for trigger buttons\n * that live outside the wrapper but should still count as inside.\n */\nexport const IrisClickOutside = defineComponent({\n name: 'IrisClickOutside',\n inheritAttrs: false,\n props: {\n disabled: { type: Boolean, default: false },\n ignore: {\n type: Array as PropType<Ref<HTMLElement | null | undefined>[]>,\n default: () => [],\n },\n },\n emits: {\n outside: (_event: PointerEvent) => true,\n },\n setup(props, { slots, emit }) {\n const wrapperRef = ref<HTMLElement | null>(null)\n let detach: (() => void) | null = null\n\n watchEffect((onCleanup) => {\n detach?.()\n detach = null\n if (props.disabled) return\n if (typeof document === 'undefined') return\n const handler = (event: PointerEvent) => {\n const target = event.target as Node | null\n if (!target) return\n const wrapper = wrapperRef.value\n if (wrapper) {\n let node: Node | null = target\n while (node) {\n if (node === wrapper) return\n if ((node as HTMLElement).parentNode === wrapper) return\n node = node.parentNode\n }\n }\n for (const r of props.ignore) {\n const el = r.value\n if (el && el.contains(target)) return\n }\n emit('outside', event)\n }\n document.addEventListener('pointerdown', handler)\n detach = () => document.removeEventListener('pointerdown', handler)\n onCleanup(() => detach?.())\n })\n\n onBeforeUnmount(() => detach?.())\n\n return () =>\n h(\n 'span',\n {\n ref: (el: unknown) => {\n wrapperRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-click-outside': '',\n style: { display: 'contents' },\n },\n slots.default?.(),\n )\n },\n})\n","import { defineComponent, h, onBeforeUnmount, watch, type PropType } from 'vue'\nimport { createLongPress } from '@iris-ui-kit/core'\n\n/**\n * Behavior wrapper: fires `onLongPress` once the pointer has been held down\n * for `holdDelay` ms without an intervening pointerup/pointerleave. Wraps\n * children in a `<span data-iris-long-press style=\"display:contents\">` so it\n * doesn't affect layout. Backed by `createLongPress`'s statechart timer.\n *\n * @example\n * <IrisLongPress :hold-delay=\"500\" @longpress=\"onLongPress\">\n * <IrisButton>Hold me</IrisButton>\n * </IrisLongPress>\n */\nexport const IrisLongPress = defineComponent({\n name: 'IrisLongPress',\n inheritAttrs: false,\n props: {\n /** Time the pointer must be held before `onLongPress` fires, in ms. */\n holdDelay: {\n type: Number,\n default: 500,\n },\n /** Called once when the hold reaches `holdDelay` without an intervening release. */\n onLongPress: {\n type: Function as PropType<() => void>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: {\n longpress: () => true,\n },\n setup(props, { slots, emit }) {\n const fire = () => {\n props.onLongPress?.()\n emit('longpress')\n }\n // `let`, not `const`: reassigned on holdDelay change; closures (handlers,\n // unmount hook) read the CURRENT binding.\n let ctrl = createLongPress({ holdDelay: props.holdDelay, onLongPress: fire })\n\n const onPointerDown = () => {\n if (props.disabled) return\n ctrl.press()\n }\n const onPointerUp = () => {\n ctrl.release()\n }\n const onPointerLeave = () => {\n ctrl.cancel()\n }\n // Touch scroll / system gesture: the pointer is removed from the active\n // set without pointerup — send CANCEL so the pending hold never fires.\n const onPointerCancel = () => {\n ctrl.cancel()\n }\n\n // holdDelay prop changes re-arm the timer with the new value.\n watch(\n () => props.holdDelay,\n (holdDelay) => {\n const wasPressing = ctrl.state() === 'pressing'\n ctrl.cancel() // clears the pending after-timer (machine exit cancels pending)\n ctrl = createLongPress({ holdDelay, onLongPress: fire })\n if (wasPressing) ctrl.press() // re-arm with the new delay\n },\n )\n\n // disabled flipping true mid-hold aborts the pending gesture.\n watch(\n () => props.disabled,\n (disabled) => {\n if (disabled) ctrl.cancel()\n },\n )\n\n onBeforeUnmount(() => ctrl.cancel())\n\n return () =>\n h(\n 'span',\n {\n 'data-iris-long-press': '',\n style: { display: 'contents' },\n onPointerdown: onPointerDown,\n onPointerup: onPointerUp,\n onPointerleave: onPointerLeave,\n onPointercancel: onPointerCancel,\n },\n slots.default?.(),\n )\n },\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/i18n/context.ts","../src/i18n/useI18n.ts","../src/error-boundary/IrisErrorBoundary.ts"],"names":["createI18n","inject","ref","onBeforeUnmount","computed","defineComponent","getCurrentInstance","onErrorCaptured","h"],"mappings":"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","file":"error-boundary.cjs","sourcesContent":["import { type InjectionKey } from 'vue'\nimport type { I18n } from '@iris-ui-kit/core'\n\n/** Injection key carrying the active {@link I18n} instance to `useI18n`. */\nexport const I18nInjectionKey: InjectionKey<I18n> = Symbol('IrisI18n')\n","import { computed, inject, onBeforeUnmount, ref, type ComputedRef, type Ref } from 'vue'\nimport { createI18n, type I18n, type I18nState } from '@iris-ui-kit/core'\nimport { I18nInjectionKey } from './context'\n\nexport interface UseI18nReturn {\n locale: ComputedRef<string>\n t: I18n['t']\n formatDate: I18n['formatDate']\n formatNumber: I18n['formatNumber']\n formatRelativeTime: I18n['formatRelativeTime']\n setLocale: I18n['setLocale']\n setMessages: I18n['setMessages']\n}\n\n// Shared fallback so components can call `useI18n()` without an enclosing\n// provider — they get English defaults rather than throwing.\nlet fallbackI18n: I18n | null = null\nfunction getFallback(): I18n {\n if (fallbackI18n === null) fallbackI18n = createI18n()\n return fallbackI18n\n}\n\n/**\n * Reactive access to the active locale + translation/formatting helpers.\n * Works with or without an `<IrisI18nProvider>` (falls back to English\n * defaults). `t` / formatters read the live locale at call time, and `locale`\n * is a reactive ref so templates re-render on change.\n */\nexport function useI18n(): UseI18nReturn {\n const i18n = inject(I18nInjectionKey, null) ?? getFallback()\n const state = ref(i18n.getState()) as Ref<I18nState>\n const unsubscribe = i18n.subscribe((next) => {\n state.value = next\n })\n onBeforeUnmount(unsubscribe)\n\n return {\n locale: computed(() => state.value.locale),\n t: (key, params) => {\n void state.value.locale\n return i18n.t(key, params)\n },\n formatDate: (value, options) => {\n void state.value.locale\n return i18n.formatDate(value, options)\n },\n formatNumber: (value, options) => {\n void state.value.locale\n return i18n.formatNumber(value, options)\n },\n formatRelativeTime: (value, unit, options) => {\n void state.value.locale\n return i18n.formatRelativeTime(value, unit, options)\n },\n setLocale: i18n.setLocale,\n setMessages: i18n.setMessages,\n }\n}\n","import { defineComponent, getCurrentInstance, h, onErrorCaptured, ref, type PropType, type VNode } from 'vue'\nimport { useI18n } from '../i18n'\n\n/** Render-customization payload handed to the `#fallback` slot / `fallback` prop. */\nexport interface IrisErrorBoundaryFallbackProps {\n /** The error caught while rendering the guarded subtree. */\n error: unknown\n /** Clears the error and re-attempts rendering the children. */\n reset: () => void\n}\n\n/** Public prop surface of {@link IrisErrorBoundary}. */\nexport interface IrisErrorBoundaryProps {\n /**\n * Custom fallback renderer. Receives `{ error, reset }` and returns the\n * fallback UI. A `#fallback` scoped slot takes precedence when both are given.\n * When neither is supplied the themed DEFAULT fallback renders.\n */\n fallback?: (props: IrisErrorBoundaryFallbackProps) => VNode | VNode[] | string\n /** Invoked with the caught error (and Vue's error-info string) for logging. */\n onError?: (error: unknown, info?: string) => void\n}\n\n/**\n * IrisErrorBoundary: catches errors thrown while rendering its guarded subtree\n * (default slot), switches to a fallback, and exposes `reset()` to clear the\n * error and re-attempt rendering. Catching does NOT rethrow — a single broken\n * subtree no longer crashes the whole tree.\n *\n * Customize via a `#fallback` scoped slot or the `fallback` prop, each receiving\n * `{ error, reset }`. Without either, a themed, accessible (`role=\"alert\"`)\n * default fallback shows the error message + a retry button, i18n'd through\n * `useI18n()` (English defaults without a provider).\n */\nexport const IrisErrorBoundary = defineComponent({\n name: 'IrisErrorBoundary',\n inheritAttrs: false,\n props: {\n fallback: {\n type: Function as PropType<IrisErrorBoundaryProps['fallback']>,\n default: undefined,\n },\n onError: {\n type: Function as PropType<IrisErrorBoundaryProps['onError']>,\n default: undefined,\n },\n },\n setup(props, { attrs, slots }) {\n const { t } = useI18n()\n const error = ref<unknown>(null)\n // App-level telemetry handler (Sentry/…). Read live so a handler\n // configured after this component's setup is still picked up.\n const appContext = getCurrentInstance()!.appContext\n\n const reset = () => {\n error.value = null\n }\n\n onErrorCaptured((err, instance, info) => {\n error.value = err\n props.onError?.(err, info)\n // Vue's handleError skips its app.config.errorHandler branch when a hook\n // returns false, so forward explicitly with the exact args Vue would\n // have passed — (err, exposedInstance, errorInfo). Guarded so a throwing\n // handler is logged, not rethrown: a bare call would escape containment\n // from inside the hook and re-enter handleError with the handler's own\n // error (Vue's own path wraps the handler in callWithErrorHandling).\n try {\n appContext.config.errorHandler?.(err, instance, info)\n } catch (handlerError) {\n console.error(handlerError)\n }\n // Stop further propagation so the error does not crash the parent tree.\n return false\n })\n\n const renderDefaultFallback = (): VNode => {\n const message =\n error.value instanceof Error && error.value.message\n ? error.value.message\n : t('errorBoundary.message')\n\n return h(\n 'div',\n {\n ...attrs,\n 'data-iris-error-boundary': '',\n role: 'alert',\n style: {\n padding: '16px',\n border: '1px solid var(--iris-danger)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n color: 'var(--iris-danger)',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n h('div', { 'data-iris-error-boundary-message': '' }, message),\n h(\n 'button',\n {\n type: 'button',\n 'data-iris-error-boundary-retry': '',\n onClick: reset,\n },\n t('errorBoundary.retry'),\n ),\n ],\n )\n }\n\n return () => {\n if (error.value !== null) {\n const custom = slots.fallback ?? props.fallback\n if (custom) {\n return custom({ error: error.value, reset })\n }\n return renderDefaultFallback()\n }\n return slots.default?.()\n }\n },\n})\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/i18n/context.ts","../src/i18n/useI18n.ts","../src/error-boundary/IrisErrorBoundary.ts"],"names":["createI18n","inject","ref","onBeforeUnmount","computed","defineComponent","getCurrentInstance","onErrorCaptured","h"],"mappings":"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","file":"error-boundary.cjs","sourcesContent":["import { type InjectionKey } from 'vue'\nimport type { I18n } from '@iris-ui-kit/core'\n\n/** Injection key carrying the active {@link I18n} instance to `useI18n`. */\nexport const I18nInjectionKey: InjectionKey<I18n> = Symbol('IrisI18n')\n","import { computed, inject, onBeforeUnmount, ref, type ComputedRef, type Ref } from 'vue'\nimport { createI18n, type I18n, type I18nState } from '@iris-ui-kit/core'\nimport { I18nInjectionKey } from './context'\n\nexport interface UseI18nReturn {\n locale: ComputedRef<string>\n t: I18n['t']\n formatDate: I18n['formatDate']\n formatNumber: I18n['formatNumber']\n formatRelativeTime: I18n['formatRelativeTime']\n setLocale: I18n['setLocale']\n setMessages: I18n['setMessages']\n}\n\n// Shared fallback so components can call `useI18n()` without an enclosing\n// provider — they get English defaults rather than throwing.\nlet fallbackI18n: I18n | null = null\nfunction getFallback(): I18n {\n if (fallbackI18n === null) fallbackI18n = createI18n()\n return fallbackI18n\n}\n\n/**\n * Reactive access to the active locale + translation/formatting helpers.\n * Works with or without an `<IrisI18nProvider>` (falls back to English\n * defaults). `t` / formatters read the live locale at call time, and `locale`\n * is a reactive ref so templates re-render on change.\n */\nexport function useI18n(): UseI18nReturn {\n const i18n = inject(I18nInjectionKey, null) ?? getFallback()\n const state = ref(i18n.getState()) as Ref<I18nState>\n const unsubscribe = i18n.subscribe((next) => {\n state.value = next\n })\n onBeforeUnmount(unsubscribe)\n\n return {\n locale: computed(() => state.value.locale),\n t: (key, params) => {\n void state.value.locale\n return i18n.t(key, params)\n },\n formatDate: (value, options) => {\n void state.value.locale\n return i18n.formatDate(value, options)\n },\n formatNumber: (value, options) => {\n void state.value.locale\n return i18n.formatNumber(value, options)\n },\n formatRelativeTime: (value, unit, options) => {\n void state.value.locale\n return i18n.formatRelativeTime(value, unit, options)\n },\n setLocale: i18n.setLocale,\n setMessages: i18n.setMessages,\n }\n}\n","import {\n defineComponent,\n getCurrentInstance,\n h,\n onErrorCaptured,\n ref,\n type PropType,\n type VNode,\n} from 'vue'\nimport { useI18n } from '../i18n'\n\n/** Render-customization payload handed to the `#fallback` slot / `fallback` prop. */\nexport interface IrisErrorBoundaryFallbackProps {\n /** The error caught while rendering the guarded subtree. */\n error: unknown\n /** Clears the error and re-attempts rendering the children. */\n reset: () => void\n}\n\n/** Public prop surface of {@link IrisErrorBoundary}. */\nexport interface IrisErrorBoundaryProps {\n /**\n * Custom fallback renderer. Receives `{ error, reset }` and returns the\n * fallback UI. A `#fallback` scoped slot takes precedence when both are given.\n * When neither is supplied the themed DEFAULT fallback renders.\n */\n fallback?: (props: IrisErrorBoundaryFallbackProps) => VNode | VNode[] | string\n /** Invoked with the caught error (and Vue's error-info string) for logging. */\n onError?: (error: unknown, info?: string) => void\n}\n\n/**\n * IrisErrorBoundary: catches errors thrown while rendering its guarded subtree\n * (default slot), switches to a fallback, and exposes `reset()` to clear the\n * error and re-attempt rendering. Catching does NOT rethrow — a single broken\n * subtree no longer crashes the whole tree.\n *\n * Customize via a `#fallback` scoped slot or the `fallback` prop, each receiving\n * `{ error, reset }`. Without either, a themed, accessible (`role=\"alert\"`)\n * default fallback shows the error message + a retry button, i18n'd through\n * `useI18n()` (English defaults without a provider).\n */\nexport const IrisErrorBoundary = defineComponent({\n name: 'IrisErrorBoundary',\n inheritAttrs: false,\n props: {\n fallback: {\n type: Function as PropType<IrisErrorBoundaryProps['fallback']>,\n default: undefined,\n },\n onError: {\n type: Function as PropType<IrisErrorBoundaryProps['onError']>,\n default: undefined,\n },\n },\n setup(props, { attrs, slots }) {\n const { t } = useI18n()\n const error = ref<unknown>(null)\n // App-level telemetry handler (Sentry/…). Read live so a handler\n // configured after this component's setup is still picked up.\n const appContext = getCurrentInstance()!.appContext\n\n const reset = () => {\n error.value = null\n }\n\n onErrorCaptured((err, instance, info) => {\n error.value = err\n props.onError?.(err, info)\n // Vue's handleError skips its app.config.errorHandler branch when a hook\n // returns false, so forward explicitly with the exact args Vue would\n // have passed — (err, exposedInstance, errorInfo). Guarded so a throwing\n // handler is logged, not rethrown: a bare call would escape containment\n // from inside the hook and re-enter handleError with the handler's own\n // error (Vue's own path wraps the handler in callWithErrorHandling).\n try {\n appContext.config.errorHandler?.(err, instance, info)\n } catch (handlerError) {\n console.error(handlerError)\n }\n // Stop further propagation so the error does not crash the parent tree.\n return false\n })\n\n const renderDefaultFallback = (): VNode => {\n const message =\n error.value instanceof Error && error.value.message\n ? error.value.message\n : t('errorBoundary.message')\n\n return h(\n 'div',\n {\n ...attrs,\n 'data-iris-error-boundary': '',\n role: 'alert',\n style: {\n padding: '16px',\n border: '1px solid var(--iris-danger)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n color: 'var(--iris-danger)',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n h('div', { 'data-iris-error-boundary-message': '' }, message),\n h(\n 'button',\n {\n type: 'button',\n 'data-iris-error-boundary-retry': '',\n onClick: reset,\n },\n t('errorBoundary.retry'),\n ),\n ],\n )\n }\n\n return () => {\n if (error.value !== null) {\n const custom = slots.fallback ?? props.fallback\n if (custom) {\n return custom({ error: error.value, reset })\n }\n return renderDefaultFallback()\n }\n return slots.default?.()\n }\n },\n})\n"]}
|
package/dist/error-boundary.js
CHANGED