@iris-ui-kit/vue 0.2.22 → 0.2.23

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.
@@ -132,6 +132,16 @@ declare const IrisDashboardTemplate: vue.DefineComponent<vue.ExtractPropTypes<{
132
132
  type: BooleanConstructor;
133
133
  default: boolean;
134
134
  };
135
+ /**
136
+ * Controlled collapsed state. When unset (`undefined`), the component
137
+ * manages its own state seeded from `defaultCollapsed`; when set, this
138
+ * value takes precedence and changes are re-emitted via
139
+ * `update:collapsed` (`v-model:collapsed`).
140
+ */
141
+ collapsed: {
142
+ type: BooleanConstructor;
143
+ default: undefined;
144
+ };
135
145
  }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
136
146
  [key: string]: any;
137
147
  }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
@@ -164,12 +174,23 @@ declare const IrisDashboardTemplate: vue.DefineComponent<vue.ExtractPropTypes<{
164
174
  type: BooleanConstructor;
165
175
  default: boolean;
166
176
  };
177
+ /**
178
+ * Controlled collapsed state. When unset (`undefined`), the component
179
+ * manages its own state seeded from `defaultCollapsed`; when set, this
180
+ * value takes precedence and changes are re-emitted via
181
+ * `update:collapsed` (`v-model:collapsed`).
182
+ */
183
+ collapsed: {
184
+ type: BooleanConstructor;
185
+ default: undefined;
186
+ };
167
187
  }>> & Readonly<{
168
188
  "onUpdate:collapsed"?: ((_value: boolean) => any) | undefined;
169
189
  "onUpdate:activeId"?: ((_id: string) => any) | undefined;
170
190
  }>, {
171
191
  nav: IrisDashboardNavItem[];
172
192
  title: string;
193
+ collapsed: boolean;
173
194
  defaultCollapsed: boolean;
174
195
  sidebarTitle: string;
175
196
  activeId: string;
@@ -132,6 +132,16 @@ declare const IrisDashboardTemplate: vue.DefineComponent<vue.ExtractPropTypes<{
132
132
  type: BooleanConstructor;
133
133
  default: boolean;
134
134
  };
135
+ /**
136
+ * Controlled collapsed state. When unset (`undefined`), the component
137
+ * manages its own state seeded from `defaultCollapsed`; when set, this
138
+ * value takes precedence and changes are re-emitted via
139
+ * `update:collapsed` (`v-model:collapsed`).
140
+ */
141
+ collapsed: {
142
+ type: BooleanConstructor;
143
+ default: undefined;
144
+ };
135
145
  }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
136
146
  [key: string]: any;
137
147
  }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
@@ -164,12 +174,23 @@ declare const IrisDashboardTemplate: vue.DefineComponent<vue.ExtractPropTypes<{
164
174
  type: BooleanConstructor;
165
175
  default: boolean;
166
176
  };
177
+ /**
178
+ * Controlled collapsed state. When unset (`undefined`), the component
179
+ * manages its own state seeded from `defaultCollapsed`; when set, this
180
+ * value takes precedence and changes are re-emitted via
181
+ * `update:collapsed` (`v-model:collapsed`).
182
+ */
183
+ collapsed: {
184
+ type: BooleanConstructor;
185
+ default: undefined;
186
+ };
167
187
  }>> & Readonly<{
168
188
  "onUpdate:collapsed"?: ((_value: boolean) => any) | undefined;
169
189
  "onUpdate:activeId"?: ((_id: string) => any) | undefined;
170
190
  }>, {
171
191
  nav: IrisDashboardNavItem[];
172
192
  title: string;
193
+ collapsed: boolean;
173
194
  defaultCollapsed: boolean;
174
195
  sidebarTitle: string;
175
196
  activeId: string;
package/dist/skeletons.js CHANGED
@@ -1,4 +1,4 @@
1
- export { IrisDashboardTemplate, IrisLoginTemplate } from './chunk-ENKE2BPC.js';
1
+ export { IrisDashboardTemplate, IrisLoginTemplate } from './chunk-BEPH6PPL.js';
2
2
  import './chunk-3R3QDLJC.js';
3
3
  import './chunk-F77KIPOH.js';
4
4
  import './chunk-3V46HGRC.js';
package/dist/undo.cjs CHANGED
@@ -36,12 +36,17 @@ function useUndoStack(options) {
36
36
  index: raw.index
37
37
  });
38
38
  const sync = () => {
39
- state.value = {
39
+ const next = {
40
40
  canUndo: raw.canUndo(),
41
41
  canRedo: raw.canRedo(),
42
42
  depth: raw.depth,
43
43
  index: raw.index
44
44
  };
45
+ const cur = state.value;
46
+ if (next.canUndo === cur.canUndo && next.canRedo === cur.canRedo && next.depth === cur.depth && next.index === cur.index) {
47
+ return;
48
+ }
49
+ state.value = next;
45
50
  };
46
51
  const stack = trackUndoStack(raw, sync);
47
52
  const push = (snapshot) => stack.push(snapshot);
package/dist/undo.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/undo/useUndoStack.ts"],"names":["createUndoStack","shallowRef","undo"],"mappings":";;;;;;AAqBA,SAAS,cAAA,CAAkB,OAAqB,QAAA,EAAoC;AAClF,EAAA,MAAM,QAAA,uBAAe,GAAA,CAAwB,CAAC,QAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC9E,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyD;AAE9E,EAAA,OAAO,IAAI,MAAM,KAAA,EAAO;AAAA,IACtB,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAuB,QAAA,EAAmB;AACpD,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,IAAI,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACzB,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,UAAA,EAAA,GAAK,IAAI,IAAA,KAAoB;AAC3B,YAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAI,CAAA;AACnD,YAAA,QAAA,EAAS;AACT,YAAA,OAAO,MAAA;AAAA,UACT,CAAA;AACA,UAAA,QAAA,CAAS,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,QACtB;AACA,QAAA,OAAO,EAAA;AAAA,MACT;AACA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AACH;AAiCO,SAAS,aAAgB,OAAA,EAiB9B;AACA,EAAA,MAAM,GAAA,GAAMA,qBAAmB,OAAO,CAAA;AAEtC,EAAA,MAAM,QAAQC,cAAA,CAAmC;AAAA,IAC/C,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,IACrB,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,IACrB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAO,GAAA,CAAI;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,MACZ,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,MACrB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,OAAO,GAAA,CAAI;AAAA,KACb;AAAA,EACF,CAAA;AAMA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA;AAMtC,EAAA,MAAM,IAAA,GAAO,CAAC,QAAA,KAAmB,KAAA,CAAM,KAAK,QAAQ,CAAA;AACpD,EAAA,MAAMC,MAAA,GAAO,MAAqB,KAAA,CAAM,IAAA,EAAK;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAqB,KAAA,CAAM,IAAA,EAAK;AAC7C,EAAA,MAAM,KAAA,GAAQ,MAAY,KAAA,CAAM,KAAA,EAAM;AAEtC,EAAA,OAAO,EAAE,IAAA,QAAMA,MAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAM;AACjD","file":"undo.cjs","sourcesContent":["import { shallowRef, type ShallowRef } from 'vue'\nimport { createUndoStack, type UndoStack, type UndoStackOptions } from '@iris-ui-kit/core/undo'\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Wrap a raw {@link UndoStack} in a Proxy so that every mutating call\n * (`push`/`undo`/`redo`/`clear`) — including calls made directly on the\n * returned `stack` reference — triggers `onMutate()` afterwards.\n *\n * Core's `UndoStack` is a plain mutable object with **no change notification**\n * (JSDoc promises it is a stable, modifiable reference). Without this wrapper,\n * `api.stack.push(x)` mutated core silently and left the reactive `state`\n * permanently stale, with zero errors.\n *\n * Only the `get` trap is installed: mutating methods return pre-created,\n * cached wrapper closures (so `stack.push === stack.push` — stable function\n * identity), while read-only members (`canUndo`/`canRedo`/`depth`/`index`)\n * pass through untouched. `ownKeys`/`getOwnPropertyDescriptor` are forwarded\n * by the default traps, so enumeration behavior is unchanged.\n */\nfunction trackUndoStack<T>(stack: UndoStack<T>, onMutate: () => void): UndoStack<T> {\n const mutators = new Set<keyof UndoStack<T>>(['push', 'undo', 'redo', 'clear'])\n const wrappers = new Map<keyof UndoStack<T>, (...args: unknown[]) => unknown>()\n\n return new Proxy(stack, {\n get(target, prop: string | symbol, receiver): unknown {\n const key = prop as keyof UndoStack<T>\n if (mutators.has(key)) {\n let fn = wrappers.get(key)\n if (!fn) {\n const original = target[key] as (...args: unknown[]) => unknown\n fn = (...args: unknown[]) => {\n const result = Reflect.apply(original, target, args)\n onMutate()\n return result\n }\n wrappers.set(key, fn)\n }\n return fn\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n}\n\n/**\n * Reactive snapshot metadata for the UndoStack: convenience booleans that\n * update on every push/undo/redo/clear for use in UI bindings (enable/disable\n * undo/redo buttons).\n */\nexport interface UndoStackReactiveState {\n canUndo: boolean\n canRedo: boolean\n depth: number\n index: number\n}\n\n/**\n * Vue bridge over the framework-agnostic {@link createUndoStack}.\n * Creates the stack once in `setup()` and returns a stable controller\n * plus a reactive `state` that tracks `canUndo`/`canRedo`/`depth`/`index` for\n * easy UI binding.\n *\n * The returned `push`/`undo`/`redo`/`clear` automatically update the reactive\n * state — no manual `.value = ...` needed. The same holds for mutating the\n * returned `stack` directly (`api.stack.push(x)`, `api.stack.undo()`, …): the\n * raw stack is wrapped so every mutation is observed and synced.\n *\n * @example\n * const { push, undo, redo, state } = useUndoStack({ initial: formValues })\n * // After mutation:\n * push(currentValues)\n * // In template:\n * <button :disabled=\"!state.canUndo\" @click=\"undo\">Undo</button>\n * <button :disabled=\"!state.canRedo\" @click=\"redo\">Redo</button>\n */\nexport function useUndoStack<T>(options?: UndoStackOptions<T>): {\n /** Push a new snapshot onto the stack. Returns the stored value. */\n push: (snapshot: T) => T\n /** Undo: returns the previous snapshot, or undefined if nothing to undo. */\n undo: () => T | undefined\n /** Redo: returns the next snapshot, or undefined if nothing to redo. */\n redo: () => T | undefined\n /** Clear all history. */\n clear: () => void\n /**\n * The raw undo stack (stable reference, same across renders). Its mutating\n * methods (`push`/`undo`/`redo`/`clear`) are observed — direct calls keep\n * `state` in sync.\n */\n stack: UndoStack<T>\n /** Reactive metadata: canUndo, canRedo, depth, index. */\n state: ShallowRef<UndoStackReactiveState>\n} {\n const raw = createUndoStack<T>(options)\n\n const state = shallowRef<UndoStackReactiveState>({\n canUndo: raw.canUndo(),\n canRedo: raw.canRedo(),\n depth: raw.depth,\n index: raw.index,\n })\n\n const sync = () => {\n state.value = {\n canUndo: raw.canUndo(),\n canRedo: raw.canRedo(),\n depth: raw.depth,\n index: raw.index,\n }\n }\n\n // Wrap the raw stack so direct `api.stack.push/undo/redo/clear` calls also\n // refresh `state` — previously they mutated core silently and left the\n // reactive state permanently stale (defect group 1). The proxy is the single\n // sync point below.\n const stack = trackUndoStack(raw, sync)\n\n // Delegate through the wrapped stack: `onMutate` fires on every mutating\n // call — even true no-ops and calls returning `undefined` (a legal snapshot\n // value for a generic T, so the return value cannot distinguish \"no-op\"\n // from \"pointer moved\" — defect group 2, aligned with vue 0.2.19).\n const push = (snapshot: T): T => stack.push(snapshot)\n const undo = (): T | undefined => stack.undo()\n const redo = (): T | undefined => stack.redo()\n const clear = (): void => stack.clear()\n\n return { push, undo, redo, clear, stack, state }\n}\n"]}
1
+ {"version":3,"sources":["../src/undo/useUndoStack.ts"],"names":["createUndoStack","shallowRef","undo"],"mappings":";;;;;;AAqBA,SAAS,cAAA,CAAkB,OAAqB,QAAA,EAAoC;AAClF,EAAA,MAAM,QAAA,uBAAe,GAAA,CAAwB,CAAC,QAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC9E,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyD;AAE9E,EAAA,OAAO,IAAI,MAAM,KAAA,EAAO;AAAA,IACtB,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAuB,QAAA,EAAmB;AACpD,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,IAAI,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACzB,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,UAAA,EAAA,GAAK,IAAI,IAAA,KAAoB;AAC3B,YAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAI,CAAA;AACnD,YAAA,QAAA,EAAS;AACT,YAAA,OAAO,MAAA;AAAA,UACT,CAAA;AACA,UAAA,QAAA,CAAS,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,QACtB;AACA,QAAA,OAAO,EAAA;AAAA,MACT;AACA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AACH;AAuDO,SAAS,aAAgB,OAAA,EAiB9B;AACA,EAAA,MAAM,GAAA,GAAMA,qBAAmB,OAAO,CAAA;AAEtC,EAAA,MAAM,QAAQC,cAAA,CAAmC;AAAA,IAC/C,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,IACrB,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,IACrB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAO,GAAA,CAAI;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,MACrB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,OAAO,GAAA,CAAI;AAAA,KACb;AACA,IAAA,MAAM,MAAM,KAAA,CAAM,KAAA;AAQlB,IAAA,IACE,IAAA,CAAK,OAAA,KAAY,GAAA,CAAI,OAAA,IACrB,KAAK,OAAA,KAAY,GAAA,CAAI,OAAA,IACrB,IAAA,CAAK,UAAU,GAAA,CAAI,KAAA,IACnB,IAAA,CAAK,KAAA,KAAU,IAAI,KAAA,EACnB;AACA,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AAAA,EAChB,CAAA;AAMA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA;AAMtC,EAAA,MAAM,IAAA,GAAO,CAAC,QAAA,KAAmB,KAAA,CAAM,KAAK,QAAQ,CAAA;AACpD,EAAA,MAAMC,MAAA,GAAO,MAAqB,KAAA,CAAM,IAAA,EAAK;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAqB,KAAA,CAAM,IAAA,EAAK;AAC7C,EAAA,MAAM,KAAA,GAAQ,MAAY,KAAA,CAAM,KAAA,EAAM;AAEtC,EAAA,OAAO,EAAE,IAAA,QAAMA,MAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAM;AACjD","file":"undo.cjs","sourcesContent":["import { shallowRef, type ShallowRef } from 'vue'\nimport { createUndoStack, type UndoStack, type UndoStackOptions } from '@iris-ui-kit/core/undo'\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Wrap a raw {@link UndoStack} in a Proxy so that every mutating call\n * (`push`/`undo`/`redo`/`clear`) — including calls made directly on the\n * returned `stack` reference — triggers `onMutate()` afterwards.\n *\n * Core's `UndoStack` is a plain mutable object with **no change notification**\n * (JSDoc promises it is a stable, modifiable reference). Without this wrapper,\n * `api.stack.push(x)` mutated core silently and left the reactive `state`\n * permanently stale, with zero errors.\n *\n * Only the `get` trap is installed: mutating methods return pre-created,\n * cached wrapper closures (so `stack.push === stack.push` — stable function\n * identity), while read-only members (`canUndo`/`canRedo`/`depth`/`index`)\n * pass through untouched. `ownKeys`/`getOwnPropertyDescriptor` are forwarded\n * by the default traps, so enumeration behavior is unchanged.\n */\nfunction trackUndoStack<T>(stack: UndoStack<T>, onMutate: () => void): UndoStack<T> {\n const mutators = new Set<keyof UndoStack<T>>(['push', 'undo', 'redo', 'clear'])\n const wrappers = new Map<keyof UndoStack<T>, (...args: unknown[]) => unknown>()\n\n return new Proxy(stack, {\n get(target, prop: string | symbol, receiver): unknown {\n const key = prop as keyof UndoStack<T>\n if (mutators.has(key)) {\n let fn = wrappers.get(key)\n if (!fn) {\n const original = target[key] as (...args: unknown[]) => unknown\n fn = (...args: unknown[]) => {\n const result = Reflect.apply(original, target, args)\n onMutate()\n return result\n }\n wrappers.set(key, fn)\n }\n return fn\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n}\n\n/**\n * Reactive snapshot metadata for the UndoStack: convenience booleans that\n * update on every push/undo/redo/clear for use in UI bindings (enable/disable\n * undo/redo buttons).\n */\nexport interface UndoStackReactiveState {\n canUndo: boolean\n canRedo: boolean\n depth: number\n index: number\n}\n\n/** Keys of {@link UndoStackReactiveState} known to the sync guard below. */\nconst _STATE_KEYS = ['canUndo', 'canRedo', 'depth', 'index'] as const\ntype StateKey = (typeof _STATE_KEYS)[number]\n\n/** Keys of {@link UndoStackReactiveState} the guard does NOT know about yet. */\ntype _MissingKeys = Exclude<keyof UndoStackReactiveState, StateKey>\n\n/**\n * Compile-time exhaustiveness canary: if a 5th field is ever added to\n * {@link UndoStackReactiveState}, `_MissingKeys` becomes non-`never` and this\n * assignment fails to type-check (TS2322) — forcing the `sync` guard below to\n * cover the new field instead of silently desyncing. The `void` read marks the\n * const as used under `noUnusedLocals`.\n */\nconst _stateKeysExhaustive: _MissingKeys extends never ? true : never = true\nvoid _stateKeysExhaustive\n\n/**\n * Vue bridge over the framework-agnostic {@link createUndoStack}.\n * Creates the stack once in `setup()` and returns a stable controller\n * plus a reactive `state` that tracks `canUndo`/`canRedo`/`depth`/`index` for\n * easy UI binding.\n *\n * The returned `push`/`undo`/`redo`/`clear` automatically update the reactive\n * state — no manual `.value = ...` needed. The same holds for mutating the\n * returned `stack` directly (`api.stack.push(x)`, `api.stack.undo()`, …): the\n * raw stack is wrapped so every mutation is observed and synced.\n *\n * No-op mutations (duplicate pushes, merge-coalesced pushes, undo/redo on an\n * empty stack, clear on an empty stack) do **not** reassign `state.value` —\n * `state` is only refreshed when `canUndo`/`canRedo`/`depth`/`index` actually\n * change, so watchers on the reference fire only for real state moves.\n *\n * @example\n * const { push, undo, redo, state } = useUndoStack({ initial: formValues })\n * // After mutation:\n * push(currentValues)\n * // In template:\n * <button :disabled=\"!state.canUndo\" @click=\"undo\">Undo</button>\n * <button :disabled=\"!state.canRedo\" @click=\"redo\">Redo</button>\n */\nexport function useUndoStack<T>(options?: UndoStackOptions<T>): {\n /** Push a new snapshot onto the stack. Returns the stored value. */\n push: (snapshot: T) => T\n /** Undo: returns the previous snapshot, or undefined if nothing to undo. */\n undo: () => T | undefined\n /** Redo: returns the next snapshot, or undefined if nothing to redo. */\n redo: () => T | undefined\n /** Clear all history. */\n clear: () => void\n /**\n * The raw undo stack (stable reference, same across renders). Its mutating\n * methods (`push`/`undo`/`redo`/`clear`) are observed — direct calls keep\n * `state` in sync.\n */\n stack: UndoStack<T>\n /** Reactive metadata: canUndo, canRedo, depth, index. */\n state: ShallowRef<UndoStackReactiveState>\n} {\n const raw = createUndoStack<T>(options)\n\n const state = shallowRef<UndoStackReactiveState>({\n canUndo: raw.canUndo(),\n canRedo: raw.canRedo(),\n depth: raw.depth,\n index: raw.index,\n })\n\n const sync = () => {\n const next = {\n canUndo: raw.canUndo(),\n canRedo: raw.canRedo(),\n depth: raw.depth,\n index: raw.index,\n }\n const cur = state.value\n // Skip the shallowRef assignment when nothing actually changed. Core's\n // mutators are no-ops for: equals-dedup pushes, merge-coalesced pushes,\n // undo/redo on an empty stack, clear on an empty stack (and bounded-stack\n // pushes that trim to the exact same depth/index). `state` tracks metadata\n // only, so when all four fields are identical the reference is preserved\n // and no watcher/effect/render fires — the guard is a strict superset of\n // the documented no-op cases, with zero behavior change for real moves.\n if (\n next.canUndo === cur.canUndo &&\n next.canRedo === cur.canRedo &&\n next.depth === cur.depth &&\n next.index === cur.index\n ) {\n return\n }\n state.value = next\n }\n\n // Wrap the raw stack so direct `api.stack.push/undo/redo/clear` calls also\n // refresh `state` — previously they mutated core silently and left the\n // reactive state permanently stale (defect group 1). The proxy is the single\n // sync point below.\n const stack = trackUndoStack(raw, sync)\n\n // Delegate through the wrapped stack: `onMutate` fires on every mutating\n // call — even true no-ops and calls returning `undefined` (a legal snapshot\n // value for a generic T, so the return value cannot distinguish \"no-op\"\n // from \"pointer moved\" — defect group 2, aligned with vue 0.2.19).\n const push = (snapshot: T): T => stack.push(snapshot)\n const undo = (): T | undefined => stack.undo()\n const redo = (): T | undefined => stack.redo()\n const clear = (): void => stack.clear()\n\n return { push, undo, redo, clear, stack, state }\n}\n"]}
package/dist/undo.d.cts CHANGED
@@ -24,6 +24,11 @@ interface UndoStackReactiveState {
24
24
  * returned `stack` directly (`api.stack.push(x)`, `api.stack.undo()`, …): the
25
25
  * raw stack is wrapped so every mutation is observed and synced.
26
26
  *
27
+ * No-op mutations (duplicate pushes, merge-coalesced pushes, undo/redo on an
28
+ * empty stack, clear on an empty stack) do **not** reassign `state.value` —
29
+ * `state` is only refreshed when `canUndo`/`canRedo`/`depth`/`index` actually
30
+ * change, so watchers on the reference fire only for real state moves.
31
+ *
27
32
  * @example
28
33
  * const { push, undo, redo, state } = useUndoStack({ initial: formValues })
29
34
  * // After mutation:
package/dist/undo.d.ts CHANGED
@@ -24,6 +24,11 @@ interface UndoStackReactiveState {
24
24
  * returned `stack` directly (`api.stack.push(x)`, `api.stack.undo()`, …): the
25
25
  * raw stack is wrapped so every mutation is observed and synced.
26
26
  *
27
+ * No-op mutations (duplicate pushes, merge-coalesced pushes, undo/redo on an
28
+ * empty stack, clear on an empty stack) do **not** reassign `state.value` —
29
+ * `state` is only refreshed when `canUndo`/`canRedo`/`depth`/`index` actually
30
+ * change, so watchers on the reference fire only for real state moves.
31
+ *
27
32
  * @example
28
33
  * const { push, undo, redo, state } = useUndoStack({ initial: formValues })
29
34
  * // After mutation:
package/dist/undo.js CHANGED
@@ -1,3 +1,3 @@
1
- export { createUndoStack, useUndoStack } from './chunk-FG5USQSY.js';
1
+ export { createUndoStack, useUndoStack } from './chunk-I7PR4ILF.js';
2
2
  //# sourceMappingURL=undo.js.map
3
3
  //# sourceMappingURL=undo.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iris-ui-kit/vue",
3
- "version": "0.2.22",
3
+ "version": "0.2.23",
4
4
  "description": "Vue 3.5 adapter for Iris UI — full component set",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1 +0,0 @@
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"],"mappings":"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","file":"chunk-CWXH44OF.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 VNode } 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 * 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 const renderHandle = (handle: IrisResizableHandle): VNode => {\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 = { ...size.value }\n aspect = startSize.width / Math.max(1, startSize.height)\n emit('resizeStart', startSize)\n },\n onDrag: ({ dx, dy }) => {\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 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 setSize({ width: nextW, height: nextH })\n },\n onEnd: () => {\n emit('resizeEnd', size.value)\n },\n })\n\n return h('div', {\n ref: (el: unknown) => {\n handleRef.value = (el ?? null) as HTMLElement | null\n },\n 'data-iris-resizable-handle': handle,\n style: {\n ...handlePosition(handle),\n touchAction: 'none',\n background: 'transparent',\n zIndex: '1',\n },\n })\n }\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 [slots.default?.(), ...props.handles.map(renderHandle)],\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, 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 +0,0 @@
1
- {"version":3,"sources":["../src/primitives/input/Input.ts","../src/primitives/password-input/PasswordInput.ts","../src/primitives/checkbox/Checkbox.ts","../src/primitives/button/styles.ts","../src/primitives/button/Button.ts","../src/primitives/form-field/FormField.ts","../src/primitives/alert/Alert.ts","../src/primitives/divider/Divider.ts","../src/skeletons/LoginTemplate.ts","../src/skeletons/DashboardTemplate.ts"],"names":["defineComponent","ref","h","computed"],"mappings":"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","file":"chunk-ENKE2BPC.js","sourcesContent":["import { computed, defineComponent, h, ref, type PropType } from 'vue'\nimport type { Size } from '@iris-ui-kit/core'\n\nexport type IrisInputSize = Size\nexport type IrisInputType = 'text' | 'password' | 'email' | 'number' | 'search' | 'tel' | 'url'\n\n/**\n * Text input primitive. Wraps a native `<input>` with token-driven styling\n * plus optional `prefix` / `suffix` slots for icons or text adornments. The\n * value is two-way bound via `v-model`.\n *\n * Focus styling is handled with `:focus-within` on the wrapping `<label>`,\n * which doubles as the click target so the entire pill is clickable.\n */\nexport const IrisInput = defineComponent({\n name: 'IrisInput',\n inheritAttrs: false,\n props: {\n modelValue: { type: [String, Number] as PropType<string | number>, default: '' },\n type: { type: String as PropType<IrisInputType>, default: 'text' },\n size: { type: String as PropType<IrisInputSize>, default: 'md' },\n placeholder: { type: String, default: '' },\n disabled: { type: Boolean, default: false },\n readonly: { type: Boolean, default: false },\n /** Visual error state — does NOT enforce validation. */\n invalid: { type: Boolean, default: false },\n id: { type: String, default: undefined },\n /** Forwarded as `aria-describedby` on the inner <input>. Set by IrisFormField. */\n ariaDescribedby: { type: String, default: undefined },\n },\n emits: {\n 'update:modelValue': (_value: string) => true,\n focus: (_event: FocusEvent) => true,\n blur: (_event: FocusEvent) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const focused = ref(false)\n\n const sizeStyles = computed<Record<string, string>>(() => {\n const map: Record<IrisInputSize, { padding: string; fontSize: string; minHeight: string }> = {\n sm: {\n padding: '4px var(--iris-padding-sm)',\n fontSize: '12px',\n minHeight: '28px',\n },\n md: {\n padding: '6px var(--iris-padding-md)',\n fontSize: '14px',\n minHeight: '34px',\n },\n lg: {\n padding: '8px var(--iris-padding-md)',\n fontSize: '16px',\n minHeight: '40px',\n },\n }\n return map[props.size]\n })\n\n const wrapperStyle = computed<Record<string, string>>(() => {\n const borderColor = props.invalid\n ? 'var(--iris-danger)'\n : focused.value\n ? 'var(--iris-primary)'\n : 'var(--iris-border)'\n const boxShadow = focused.value\n ? `0 0 0 3px ${props.invalid ? 'rgba(239, 68, 68, 0.18)' : 'rgba(99, 102, 241, 0.18)'}`\n : 'none'\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--iris-gap-sm)',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n border: `1px solid ${borderColor}`,\n borderRadius: 'var(--iris-radius-md)',\n cursor: props.disabled ? 'not-allowed' : 'text',\n opacity: props.disabled ? '0.6' : '1',\n transition: 'border-color 120ms ease, box-shadow 120ms ease',\n boxShadow,\n ...sizeStyles.value,\n padding: sizeStyles.value.padding,\n minHeight: sizeStyles.value.minHeight,\n }\n })\n\n const inputStyle: Record<string, string> = {\n flex: '1',\n minWidth: '0',\n border: 'none',\n outline: 'none',\n background: 'transparent',\n color: 'inherit',\n fontFamily: 'inherit',\n fontSize: 'inherit',\n padding: '0',\n }\n\n const onInput = (event: Event) => {\n emit('update:modelValue', (event.target as HTMLInputElement).value)\n }\n const onFocus = (event: FocusEvent) => {\n focused.value = true\n emit('focus', event)\n }\n const onBlur = (event: FocusEvent) => {\n focused.value = false\n emit('blur', event)\n }\n\n return () => {\n const prefix = slots.prefix?.()\n const suffix = slots.suffix?.()\n return h(\n 'label',\n {\n ...attrs,\n 'data-iris-input': '',\n 'data-iris-input-size': props.size,\n 'data-state': props.invalid ? 'invalid' : focused.value ? 'focused' : 'idle',\n style: {\n ...wrapperStyle.value,\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n prefix &&\n h(\n 'span',\n {\n 'data-iris-input-prefix': '',\n style: { display: 'inline-flex', alignItems: 'center', color: 'var(--iris-muted)' },\n },\n prefix,\n ),\n h('input', {\n id: props.id,\n type: props.type,\n value: props.modelValue,\n placeholder: props.placeholder,\n disabled: props.disabled || undefined,\n readonly: props.readonly || undefined,\n 'aria-invalid': props.invalid ? 'true' : undefined,\n 'aria-describedby': props.ariaDescribedby,\n style: inputStyle,\n onInput,\n onFocus,\n onBlur,\n }),\n suffix &&\n h(\n 'span',\n {\n 'data-iris-input-suffix': '',\n style: { display: 'inline-flex', alignItems: 'center', color: 'var(--iris-muted)' },\n },\n suffix,\n ),\n ],\n )\n }\n },\n})\n","import { defineComponent, h, ref, type PropType } from 'vue'\nimport { IrisInput } from '../input/Input'\nimport { useI18n } from '../../i18n'\nimport type { Size } from '@iris-ui-kit/core'\n\nexport type IrisPasswordInputSize = Size\n\n/**\n * Password field wrapping {@link IrisInput}. Adds a visibility toggle as\n * the input's suffix slot — clicking it flips the input type between\n * `password` and `text`.\n */\nexport const IrisPasswordInput = defineComponent({\n name: 'IrisPasswordInput',\n inheritAttrs: false,\n props: {\n modelValue: { type: String, default: '' },\n size: { type: String as PropType<IrisPasswordInputSize>, default: 'md' },\n placeholder: { type: String, default: '' },\n disabled: { type: Boolean, default: false },\n readonly: { type: Boolean, default: false },\n invalid: { type: Boolean, default: false },\n id: { type: String, default: undefined },\n /** Allow the user to toggle visibility. Default `true`. */\n showToggle: { type: Boolean, default: true },\n },\n emits: {\n 'update:modelValue': (_value: string) => true,\n focus: (_event: FocusEvent) => true,\n blur: (_event: FocusEvent) => true,\n },\n setup(props, { attrs, emit, slots }) {\n const { t } = useI18n()\n const visible = ref(false)\n\n const onUpdate = (value: string) => emit('update:modelValue', value)\n const onFocus = (e: FocusEvent) => emit('focus', e)\n const onBlur = (e: FocusEvent) => emit('blur', e)\n\n const toggle = () => {\n if (props.disabled || props.readonly) return\n visible.value = !visible.value\n }\n\n return () =>\n h(\n IrisInput,\n {\n ...attrs,\n modelValue: props.modelValue,\n type: visible.value ? 'text' : 'password',\n size: props.size,\n placeholder: props.placeholder,\n disabled: props.disabled,\n readonly: props.readonly,\n invalid: props.invalid,\n id: props.id,\n 'data-iris-password-input': '',\n 'onUpdate:modelValue': onUpdate,\n onFocus,\n onBlur,\n },\n {\n prefix: slots.prefix,\n suffix: () => [\n slots.suffix?.(),\n props.showToggle\n ? h(\n 'button',\n {\n type: 'button',\n 'data-iris-password-input-toggle': '',\n 'aria-label': visible.value ? t('passwordInput.hide') : t('passwordInput.show'),\n 'aria-pressed': visible.value ? 'true' : 'false',\n onClick: toggle,\n style: {\n background: 'transparent',\n border: 'none',\n cursor: props.disabled ? 'not-allowed' : 'pointer',\n color: 'var(--iris-muted)',\n padding: '0 2px',\n fontSize: '13px',\n lineHeight: '1',\n },\n },\n visible.value ? '🙈' : '👁',\n )\n : null,\n ],\n },\n )\n },\n})\n","import { computed, defineComponent, h, type PropType } from 'vue'\nimport type { Size } from '@iris-ui-kit/core'\n\nexport type IrisCheckboxSize = Size\nexport type IrisCheckboxValue = boolean | 'indeterminate'\n\n/**\n * Tri-state checkbox: `false` (unchecked), `true` (checked), or\n * `'indeterminate'`. The native checkbox is hidden but focusable; the\n * visible box is purely visual and mirrors the state via `data-state`.\n *\n * `v-model` emits `boolean` only — switching FROM indeterminate emits the\n * boolean the user chose by clicking (becomes `true`).\n */\nexport const IrisCheckbox = defineComponent({\n name: 'IrisCheckbox',\n inheritAttrs: false,\n props: {\n modelValue: {\n type: [Boolean, String] as PropType<IrisCheckboxValue>,\n default: false,\n },\n size: { type: String as PropType<IrisCheckboxSize>, default: 'md' },\n disabled: { type: Boolean, default: false },\n id: { type: String, default: undefined },\n name: { type: String, default: undefined },\n value: { type: [String, Number] as PropType<string | number>, default: undefined },\n /** Forwarded as `aria-describedby` on the native checkbox input. Set by IrisFormField. */\n ariaDescribedby: { type: String, default: undefined },\n /**\n * Accessible name for the native checkbox input. Bound as `aria-label` on\n * the `<input>` itself (the element with the checkbox role), NOT the label\n * wrapper. Use when there is no visible label text.\n */\n ariaLabel: { type: String, default: undefined },\n /** Invalid state — sets aria-invalid. Set by IrisFormField. */\n invalid: { type: Boolean, default: false },\n },\n emits: {\n 'update:modelValue': (_value: boolean) => true,\n change: (_value: boolean) => true,\n },\n setup(props, { slots, attrs, emit }) {\n const state = computed<'checked' | 'unchecked' | 'indeterminate'>(() => {\n if (props.modelValue === 'indeterminate') return 'indeterminate'\n return props.modelValue ? 'checked' : 'unchecked'\n })\n\n const dim = computed(() => {\n const map: Record<IrisCheckboxSize, string> = { sm: '14px', md: '18px', lg: '22px' }\n return map[props.size]\n })\n\n const boxStyle = computed<Record<string, string>>(() => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: dim.value,\n height: dim.value,\n borderRadius: 'var(--iris-radius-sm)',\n border: '1px solid var(--iris-border)',\n background: state.value === 'unchecked' ? 'var(--iris-background)' : 'var(--iris-primary)',\n borderColor: state.value === 'unchecked' ? 'var(--iris-border)' : 'var(--iris-primary)',\n color: 'var(--iris-primary-foreground)',\n cursor: props.disabled ? 'not-allowed' : 'pointer',\n opacity: props.disabled ? '0.6' : '1',\n transition: 'background-color 120ms ease, border-color 120ms ease',\n verticalAlign: 'middle',\n }))\n\n const onChange = (event: Event) => {\n const next = (event.target as HTMLInputElement).checked\n emit('update:modelValue', next)\n emit('change', next)\n }\n\n const renderIndicator = () => {\n if (state.value === 'unchecked') return null\n if (state.value === 'indeterminate') {\n return h('span', {\n 'aria-hidden': 'true',\n style: { width: '60%', height: '2px', background: 'currentColor', borderRadius: '1px' },\n })\n }\n return h(\n 'svg',\n {\n 'aria-hidden': 'true',\n viewBox: '0 0 16 16',\n width: '80%',\n height: '80%',\n fill: 'none',\n },\n [\n h('path', {\n d: 'M3 8.5 L6.5 12 L13 4.5',\n stroke: 'currentColor',\n 'stroke-width': '2.4',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ],\n )\n }\n\n return () =>\n h(\n 'label',\n {\n ...attrs,\n 'data-iris-checkbox': '',\n 'data-iris-checkbox-size': props.size,\n 'data-state': state.value,\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--iris-gap-sm)',\n cursor: props.disabled ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n h('input', {\n type: 'checkbox',\n id: props.id,\n name: props.name,\n value: props.value,\n checked: props.modelValue === true,\n indeterminate: props.modelValue === 'indeterminate',\n disabled: props.disabled || undefined,\n 'aria-checked':\n state.value === 'indeterminate'\n ? 'mixed'\n : state.value === 'checked'\n ? 'true'\n : 'false',\n 'aria-describedby': props.ariaDescribedby,\n 'aria-label': props.ariaLabel,\n 'aria-invalid': props.invalid ? 'true' : undefined,\n style: {\n position: 'absolute',\n opacity: '0',\n width: '0',\n height: '0',\n pointerEvents: 'none',\n },\n onChange,\n }),\n h('span', { 'aria-hidden': 'true', style: boxStyle.value }, [renderIndicator()]),\n slots.default && h('span', null, slots.default()),\n ],\n )\n },\n})\n","/**\n * Singleton stylesheet for `IrisButton`. Lives in a single injected\n * `<style id=\"iris-button-styles\">` block. Holds only what cannot be inline:\n *\n * - `:hover` / `:focus-visible` pseudo-states\n * - `:disabled` / `[aria-busy=\"true\"]` attribute selectors\n * - The spinner keyframe\n *\n * Everything else (variant colors, size paddings) ships as inline `style`\n * bindings on each button instance, which keeps theme switching instant\n * because the values are CSS variables.\n *\n * Injection is **lazy** (first `IrisButton` mount triggers it) and\n * **idempotent** (subsequent mounts are no-ops). Safe under SSR — the\n * function short-circuits when `document` is undefined.\n */\n\nconst STYLE_ID = 'iris-button-styles'\n\nconst CSS = `\n.iris-button {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--iris-gap-sm, 4px);\n font-family: inherit;\n font-weight: 500;\n line-height: 1.2;\n border-radius: var(--iris-radius-md, 6px);\n white-space: nowrap;\n user-select: none;\n position: relative;\n transition:\n background-color 120ms ease,\n border-color 120ms ease,\n color 120ms ease,\n filter 120ms ease;\n}\n.iris-button:focus-visible {\n outline: 2px solid var(--iris-primary);\n outline-offset: 2px;\n}\n.iris-button[disabled],\n.iris-button[aria-busy=\"true\"] {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.iris-button[data-iris-button-variant=\"solid\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n filter: brightness(1.08);\n}\n.iris-button[data-iris-button-variant=\"outline\"]:not([disabled]):not([aria-busy=\"true\"]):hover,\n.iris-button[data-iris-button-variant=\"ghost\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n background-color: var(--iris-surface-hover);\n}\n.iris-button[data-iris-button-variant=\"link\"]:not([disabled]):not([aria-busy=\"true\"]):hover {\n text-decoration: underline;\n}\n.iris-button-leading {\n display: inline-flex;\n align-items: center;\n}\n.iris-button-spinner {\n width: 1em;\n height: 1em;\n display: inline-block;\n animation: iris-button-spin 0.7s linear infinite;\n}\n@keyframes iris-button-spin {\n to { transform: rotate(360deg); }\n}\n`\n\nlet installed = false\n\nexport function installButtonStyles(): void {\n if (installed) return\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID)) {\n installed = true\n return\n }\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = CSS\n document.head.appendChild(style)\n installed = true\n}\n\n/** Test-only reset. Removes the injected `<style>` and clears the flag. */\nexport function __resetButtonStyles(): void {\n installed = false\n if (typeof document === 'undefined') return\n document.getElementById(STYLE_ID)?.remove()\n}\n\n/** Test-only inspection of the cached install flag. */\nexport const __BUTTON_STYLE_ID = STYLE_ID\n","import { computed, defineComponent, h, type PropType, type VNode } from 'vue'\nimport type { IrisButtonSize, IrisButtonType, IrisButtonVariant } from './types'\nimport { installButtonStyles } from './styles'\nimport { findFirstElement, mergeSlotProps } from '../slot/Slot'\n\ntype StyleMap = Record<string, string>\n\nconst SIZE_STYLES: Record<IrisButtonSize, StyleMap> = {\n sm: {\n padding: 'var(--iris-padding-sm) var(--iris-padding-md)',\n fontSize: '12px',\n },\n md: {\n padding: 'var(--iris-padding-sm) var(--iris-padding-lg)',\n fontSize: '14px',\n },\n lg: {\n padding: 'var(--iris-padding-md) var(--iris-padding-lg)',\n fontSize: '16px',\n },\n}\n\nconst VARIANT_STYLES: Record<IrisButtonVariant, StyleMap> = {\n solid: {\n background: 'var(--iris-primary)',\n color: 'var(--iris-primary-foreground)',\n border: '1px solid var(--iris-primary)',\n },\n outline: {\n background: 'transparent',\n color: 'var(--iris-primary)',\n border: '1px solid var(--iris-border)',\n },\n ghost: {\n background: 'transparent',\n color: 'var(--iris-foreground)',\n border: '1px solid transparent',\n },\n link: {\n background: 'transparent',\n color: 'var(--iris-primary)',\n border: '1px solid transparent',\n textDecoration: 'none',\n },\n}\n\nfunction buildInlineStyle(variant: IrisButtonVariant, size: IrisButtonSize): StyleMap {\n const base: StyleMap = { ...SIZE_STYLES[size], ...VARIANT_STYLES[variant] }\n if (variant === 'link') {\n base.padding = '0'\n }\n return base\n}\n\nfunction renderSpinner(): VNode {\n return h(\n 'svg',\n {\n class: 'iris-button-spinner',\n viewBox: '0 0 24 24',\n fill: 'none',\n 'aria-hidden': 'true',\n },\n [\n h('circle', {\n cx: '12',\n cy: '12',\n r: '10',\n stroke: 'currentColor',\n 'stroke-opacity': '0.25',\n 'stroke-width': '3',\n }),\n h('path', {\n d: 'M22 12a10 10 0 0 1-10 10',\n stroke: 'currentColor',\n 'stroke-width': '3',\n 'stroke-linecap': 'round',\n }),\n ],\n )\n}\n\n/**\n * Foundational button primitive. Props-driven, no internal state machine —\n * Button's behavior is fully derived from `variant`, `size`, `disabled`, and\n * `loading`. Composite primitives (Popover, Tooltip, Dialog, Select) **do**\n * need state machines; Button does not, and forcing one on it would violate\n * the project's \"use a machine only when there is observable state to model\"\n * rule.\n *\n * Styling: variant colors and size paddings ship as inline `style` referencing\n * `var(--iris-*)` so theme switching is instant. A small singleton stylesheet\n * (auto-installed on first mount, removable in tests) covers `:hover`,\n * `:focus-visible`, and the spinner keyframe — things inline `style` cannot\n * express.\n *\n * Accessibility:\n * - native `<button>` (focusable, keyboard-activatable by default)\n * - `disabled` → HTML `disabled` + `aria-disabled=\"true\"`\n * - `loading` → `aria-busy=\"true\"` + click swallowed\n * - default `type=\"button\"` to prevent accidental form submission\n *\n * @example\n * <IrisButton variant=\"solid\" size=\"md\" @click=\"save\">Save</IrisButton>\n *\n * @example\n * <IrisButton variant=\"outline\" :loading=\"isSaving\" @click=\"save\">\n * <template #leading><CheckIcon /></template>\n * Save\n * </IrisButton>\n */\nexport const IrisButton = defineComponent({\n name: 'IrisButton',\n props: {\n variant: { type: String as PropType<IrisButtonVariant>, default: 'solid' },\n size: { type: String as PropType<IrisButtonSize>, default: 'md' },\n disabled: { type: Boolean, default: false },\n loading: { type: Boolean, default: false },\n type: { type: String as PropType<IrisButtonType>, default: 'button' },\n asChild: { type: Boolean, default: false },\n },\n emits: {\n click: (_event: MouseEvent) => true,\n },\n setup(props, { slots, emit }) {\n installButtonStyles()\n\n const isInteractive = computed(() => !props.disabled && !props.loading)\n const inlineStyle = computed(() => buildInlineStyle(props.variant, props.size))\n\n const onClick = (event: MouseEvent) => {\n if (!isInteractive.value) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n emit('click', event)\n }\n\n return () => {\n const baseProps: Record<string, unknown> = {\n class: 'iris-button',\n 'data-iris-button-variant': props.variant,\n 'data-iris-button-size': props.size,\n 'aria-disabled': props.disabled ? 'true' : undefined,\n 'aria-busy': props.loading ? 'true' : undefined,\n style: inlineStyle.value,\n onClick,\n }\n\n if (props.asChild) {\n const root = findFirstElement(slots.default?.())\n if (!root) {\n if (typeof process === 'undefined' || process.env?.NODE_ENV !== 'production') {\n console.warn('[iris-ui] IrisButton: as-child requires a single child element')\n }\n return null\n }\n // For non-<button> roots, the `disabled` HTML attribute may be a no-op.\n // We still set `aria-disabled` (above) and intercept clicks via\n // `composeEventHandlers` inside `mergeSlotProps`, which bails out if\n // the parent handler calls `event.preventDefault()`.\n const parentProps: Record<string, unknown> = {\n ...baseProps,\n disabled: isInteractive.value ? undefined : true,\n }\n const merged = mergeSlotProps(parentProps, (root.props ?? {}) as Record<string, unknown>)\n return h(root.type as string, merged, root.children as unknown as VNode[])\n }\n\n const leadingContent: VNode | VNode[] | undefined = props.loading\n ? renderSpinner()\n : slots.leading?.()\n\n const children: Array<VNode | VNode[] | undefined> = []\n if (leadingContent) {\n children.push(h('span', { class: 'iris-button-leading' }, leadingContent))\n }\n const defaultSlot = slots.default?.()\n if (defaultSlot) children.push(defaultSlot)\n\n return h(\n 'button',\n {\n ...baseProps,\n type: props.type,\n disabled: isInteractive.value ? undefined : true,\n },\n children,\n )\n }\n },\n})\n","import { Fragment, cloneVNode, computed, defineComponent, h, useId, type VNode } from 'vue'\n\n/**\n * Form-field wrapper that handles the label / hint / error trio with the\n * right a11y plumbing. Works as a non-invasive wrapper around any input-like\n * primitive (`IrisInput`, `IrisTextarea`, `IrisSelect`, `IrisNumberInput`,\n * `IrisSwitch`, `IrisCheckbox`, …): it locates the first VNode in the\n * default slot and clones it with the generated `id`, `aria-describedby`,\n * and `aria-invalid` attributes.\n *\n * Composition:\n *\n * ```html\n * <IrisFormField label=\"Email\" :error=\"errors.email\" hint=\"We never share it.\">\n * <IrisInput v-model=\"email\" />\n * </IrisFormField>\n * ```\n *\n * Pass `labelFor` if you want to pin the rendered `<label for>` to a\n * specific id (e.g. when the wrapped control is a custom non-`<input>`\n * widget).\n */\nexport const IrisFormField = defineComponent({\n name: 'IrisFormField',\n inheritAttrs: false,\n props: {\n label: { type: String, default: '' },\n hint: { type: String, default: '' },\n error: { type: String, default: '' },\n required: { type: Boolean, default: false },\n /** Override the auto-generated control id. */\n labelFor: { type: String, default: '' },\n /** Visual size of the label. */\n size: { type: String as () => 'sm' | 'md', default: 'md' },\n },\n setup(props, { slots, attrs }) {\n const baseId = useId()\n const controlId = computed(() => props.labelFor || `${baseId}-control`)\n const hintId = `${baseId}-hint`\n const errorId = `${baseId}-error`\n\n const describedBy = computed(() => {\n const ids: string[] = []\n if (props.hint) ids.push(hintId)\n if (props.error) ids.push(errorId)\n return ids.length > 0 ? ids.join(' ') : undefined\n })\n\n const labelStyle = computed<Record<string, string>>(() => ({\n fontSize: props.size === 'sm' ? '12px' : '14px',\n fontWeight: '500',\n color: props.error ? 'var(--iris-danger)' : 'var(--iris-foreground)',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n }))\n\n return () => {\n const children = (slots.default?.() ?? []) as VNode[]\n // Find the first non-text VNode and inject id + aria-*.\n let injected: VNode | null = null\n const restChildren: (VNode | null)[] = []\n let foundFirst = false\n children.forEach((child) => {\n if (!foundFirst && typeof child.type !== 'symbol' && typeof child.type !== 'string') {\n // Pass props that ALL Iris field primitives understand:\n // - id → forwarded to the native control\n // - invalid → flips aria-invalid + invalid styling\n // - ariaDescribedby → forwarded as aria-describedby on the native control\n injected = cloneVNode(child, {\n id: controlId.value,\n invalid: props.error ? true : undefined,\n ariaDescribedby: describedBy.value,\n })\n foundFirst = true\n } else {\n restChildren.push(child)\n }\n })\n\n return h(\n 'div',\n {\n ...attrs,\n 'data-iris-form-field': '',\n 'data-iris-form-field-state': props.error ? 'invalid' : 'valid',\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n props.label\n ? h(\n 'label',\n {\n for: controlId.value,\n 'data-iris-form-field-label': '',\n style: labelStyle.value,\n },\n [\n props.label,\n props.required\n ? h(\n 'span',\n {\n 'aria-hidden': 'true',\n 'data-iris-form-field-required': '',\n style: { color: 'var(--iris-danger)' },\n },\n '*',\n )\n : null,\n ],\n )\n : null,\n // The wrapped control + any trailing siblings.\n h(Fragment, null, [injected, ...restChildren]),\n props.hint && !props.error\n ? h(\n 'div',\n {\n id: hintId,\n 'data-iris-form-field-hint': '',\n style: { fontSize: '12px', color: 'var(--iris-muted)' },\n },\n props.hint,\n )\n : null,\n props.error\n ? h(\n 'div',\n {\n id: errorId,\n 'data-iris-form-field-error': '',\n role: 'alert',\n style: { fontSize: '12px', color: 'var(--iris-danger)' },\n },\n props.error,\n )\n : null,\n ],\n )\n }\n },\n})\n","import { computed, defineComponent, h, ref, watch, type PropType } from 'vue'\nimport { useI18n } from '../../i18n'\n\nexport type IrisAlertTone = 'info' | 'success' | 'warning' | 'danger'\n\nconst TONE_TO_VAR: Record<IrisAlertTone, string> = {\n info: '--iris-primary',\n success: '--iris-success',\n warning: '--iris-warning',\n danger: '--iris-danger',\n}\n\n/**\n * Inline status / feedback callout. Use for page- or section-level messages\n * that are part of the document flow (NOT transient — those use Toast).\n *\n * Composition:\n *\n * ```html\n * <IrisAlert tone=\"warning\" closable @close=\"...\">\n * <template #title>Heads up</template>\n * Storage is at 85 % of quota.\n * </IrisAlert>\n * ```\n *\n * Controlled (`v-model:open`) or uncontrolled (default visible). When closed\n * (uncontrolled), the component returns `null` from render rather than\n * leaving an empty wrapper in the tree.\n */\nexport const IrisAlert = defineComponent({\n name: 'IrisAlert',\n inheritAttrs: false,\n props: {\n tone: { type: String as PropType<IrisAlertTone>, default: 'info' },\n title: { type: String, default: '' },\n /** When true, a close button is rendered. */\n closable: { type: Boolean, default: false },\n /** Controlled visibility. Omit for uncontrolled (defaults to visible). */\n open: { type: Boolean, default: undefined },\n },\n emits: {\n 'update:open': (_value: boolean) => true,\n close: () => true,\n },\n setup(props, { slots, attrs, emit }) {\n const { t } = useI18n()\n const internalOpen = ref(true)\n\n watch(\n () => props.open,\n (value) => {\n if (value !== undefined) internalOpen.value = value\n },\n )\n\n const isOpen = computed(() => (props.open !== undefined ? props.open : internalOpen.value))\n\n const onClose = () => {\n if (props.open === undefined) internalOpen.value = false\n emit('update:open', false)\n emit('close')\n }\n\n const tonalVar = computed(() => `var(${TONE_TO_VAR[props.tone]})`)\n\n const containerStyle = computed<Record<string, string>>(() => ({\n display: 'flex',\n gap: 'var(--iris-gap-md, 12px)',\n padding: 'var(--iris-padding-md, 12px)',\n borderRadius: 'var(--iris-radius-md, 6px)',\n border: `1px solid ${tonalVar.value}`,\n // `backgroundColor` is the precomputed fallback under color-mix (engines\n // without it); the `background` shorthand overrides with the exact mix.\n backgroundColor: `var(${TONE_TO_VAR[props.tone]}-subtle)`,\n background: `color-mix(in srgb, ${tonalVar.value} 10%, var(--iris-background))`,\n color: 'var(--iris-foreground)',\n alignItems: 'flex-start',\n }))\n\n return () => {\n if (!isOpen.value) return null\n return h(\n 'div',\n {\n ...attrs,\n role: props.tone === 'danger' || props.tone === 'warning' ? 'alert' : 'status',\n 'data-iris-alert': '',\n 'data-iris-alert-tone': props.tone,\n style: { ...containerStyle.value, ...((attrs.style as Record<string, string>) ?? {}) },\n },\n [\n slots.icon\n ? h(\n 'span',\n {\n 'data-iris-alert-icon': '',\n style: { color: tonalVar.value, flexShrink: '0', display: 'inline-flex' },\n },\n slots.icon(),\n )\n : null,\n h('div', { 'data-iris-alert-body': '', style: { flex: '1', minWidth: '0' } }, [\n props.title || slots.title\n ? h(\n 'div',\n {\n 'data-iris-alert-title': '',\n style: { fontWeight: '600', marginBottom: '4px', color: tonalVar.value },\n },\n slots.title?.() ?? props.title,\n )\n : null,\n h('div', { 'data-iris-alert-content': '' }, slots.default?.()),\n ]),\n props.closable\n ? h(\n 'button',\n {\n type: 'button',\n 'data-iris-alert-close': '',\n 'aria-label': t('alert.close'),\n onClick: onClose,\n style: {\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'var(--iris-muted)',\n fontSize: '16px',\n padding: '0',\n lineHeight: '1',\n flexShrink: '0',\n },\n },\n '✕',\n )\n : null,\n ],\n )\n }\n },\n})\n","import { computed, defineComponent, h, type PropType } from 'vue'\n\nexport type IrisDividerOrientation = 'horizontal' | 'vertical'\nexport type IrisDividerSpacing = 'sm' | 'md' | 'lg'\n\nconst SPACING_MAP: Record<IrisDividerSpacing, string> = {\n sm: '8px',\n md: '16px',\n lg: '24px',\n}\n\n/**\n * Visual separator. Horizontal renders an `<hr>` for semantic correctness\n * (or a labelled `<div role=\"separator\">` when a label slot is supplied).\n * Vertical always renders a `<div role=\"separator\">`.\n *\n * Pass a `label` (or label slot) to render text in the middle — \"OR\"\n * separators, section dividers, etc.\n */\nexport const IrisDivider = defineComponent({\n name: 'IrisDivider',\n inheritAttrs: false,\n props: {\n orientation: { type: String as PropType<IrisDividerOrientation>, default: 'horizontal' },\n label: { type: String, default: '' },\n spacing: { type: String as PropType<IrisDividerSpacing>, default: 'md' },\n },\n setup(props, { slots, attrs }) {\n const isHorizontal = computed(() => props.orientation === 'horizontal')\n const hasLabel = computed(() => Boolean(props.label || slots.default))\n\n return () => {\n if (isHorizontal.value && !hasLabel.value) {\n return h('hr', {\n ...attrs,\n 'data-iris-divider': '',\n 'data-iris-divider-orientation': 'horizontal',\n style: {\n border: 'none',\n borderTop: '1px solid var(--iris-border)',\n margin: `${SPACING_MAP[props.spacing]} 0`,\n width: '100%',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n })\n }\n\n if (!isHorizontal.value) {\n return h('div', {\n ...attrs,\n role: 'separator',\n 'aria-orientation': 'vertical',\n 'data-iris-divider': '',\n 'data-iris-divider-orientation': 'vertical',\n style: {\n display: 'inline-block',\n width: '1px',\n alignSelf: 'stretch',\n background: 'var(--iris-border)',\n margin: `0 ${SPACING_MAP[props.spacing]}`,\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n })\n }\n\n // Horizontal + label → 3-column flex with text in the middle.\n return h(\n 'div',\n {\n ...attrs,\n role: 'separator',\n 'aria-orientation': 'horizontal',\n 'data-iris-divider': '',\n 'data-iris-divider-orientation': 'horizontal',\n 'data-iris-divider-has-label': 'true',\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n margin: `${SPACING_MAP[props.spacing]} 0`,\n color: 'var(--iris-muted)',\n fontSize: '12px',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n [\n h('span', { 'data-iris-divider-line': 'before', style: lineStyle() }),\n h('span', { 'data-iris-divider-label': '' }, slots.default?.() ?? props.label),\n h('span', { 'data-iris-divider-line': 'after', style: lineStyle() }),\n ],\n )\n }\n },\n})\n\nfunction lineStyle(): Record<string, string> {\n return {\n flex: '1',\n height: '1px',\n background: 'var(--iris-border)',\n }\n}\n","import { defineComponent, h, ref } from 'vue'\nimport { IrisStack } from '../layouts/Stack'\nimport { IrisContainer } from '../layouts/Container'\nimport { IrisInput } from '../primitives/input/Input'\nimport { IrisPasswordInput } from '../primitives/password-input/PasswordInput'\nimport { IrisCheckbox } from '../primitives/checkbox/Checkbox'\nimport { IrisButton } from '../primitives/button/Button'\nimport { IrisFormField } from '../primitives/form-field/FormField'\nimport { IrisAlert } from '../primitives/alert/Alert'\nimport { IrisDivider } from '../primitives/divider/Divider'\n\nexport interface IrisLoginSubmitPayload {\n email: string\n password: string\n remember: boolean\n}\n\n/**\n * Layer 4 system skeleton: a centered login page using only Iris primitives.\n * Demonstrates the recommended composition pattern (Container + Stack +\n * FormField wrappers) for forms.\n *\n * The template is opinionated about layout and a11y; data binding is left to\n * the consumer via the `submit` event + slot props.\n */\nexport const IrisLoginTemplate = defineComponent({\n name: 'IrisLoginTemplate',\n inheritAttrs: false,\n props: {\n title: { type: String, default: 'Sign in' },\n description: { type: String, default: '' },\n /** Show \"Remember me\" checkbox. */\n showRemember: { type: Boolean, default: true },\n /** Error message shown above the form. */\n error: { type: String, default: '' },\n submitLabel: { type: String, default: 'Sign in' },\n /** Disable the entire form (e.g. while a request is pending). */\n loading: { type: Boolean, default: false },\n },\n emits: {\n submit: (_payload: IrisLoginSubmitPayload) => true,\n },\n setup(props, { attrs, slots, emit }) {\n const email = ref('')\n const password = ref('')\n const remember = ref(false)\n\n const onSubmit = (event: Event) => {\n event.preventDefault()\n emit('submit', {\n email: email.value,\n password: password.value,\n remember: remember.value,\n })\n }\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n 'data-iris-login-template': '',\n style: {\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n padding: '24px',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n h(IrisContainer, { maxWidth: '420px', padding: 0 }, () => [\n h(\n 'form',\n {\n onSubmit,\n 'data-iris-login-form': '',\n style: {\n background: 'var(--iris-surface)',\n border: '1px solid var(--iris-border)',\n borderRadius: 'var(--iris-radius-lg, 8px)',\n padding: '32px',\n boxShadow: '0 6px 20px -8px rgba(0, 0, 0, 0.16)',\n },\n },\n [\n h(IrisStack, { spacing: 'lg' }, () => [\n slots.header\n ? slots.header()\n : h('div', { style: { textAlign: 'center' } }, [\n h(\n 'h1',\n {\n style: {\n margin: '0 0 4px 0',\n fontSize: '22px',\n fontWeight: '700',\n },\n },\n props.title,\n ),\n props.description\n ? h(\n 'p',\n {\n style: {\n margin: '0',\n color: 'var(--iris-muted)',\n fontSize: '14px',\n },\n },\n props.description,\n )\n : null,\n ]),\n props.error ? h(IrisAlert, { tone: 'danger', title: props.error }) : null,\n h(IrisFormField, { label: 'Email', required: true }, () =>\n h(IrisInput, {\n type: 'email',\n modelValue: email.value,\n 'onUpdate:modelValue': (v: string) => (email.value = v),\n placeholder: 'you@example.com',\n disabled: props.loading,\n autocomplete: 'email',\n } as Record<string, unknown>),\n ),\n h(IrisFormField, { label: 'Password', required: true }, () =>\n h(IrisPasswordInput, {\n modelValue: password.value,\n 'onUpdate:modelValue': (v: string) => (password.value = v),\n placeholder: 'Enter your password',\n disabled: props.loading,\n autocomplete: 'current-password',\n } as Record<string, unknown>),\n ),\n props.showRemember\n ? h(\n 'div',\n {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n },\n [\n h(\n IrisCheckbox,\n {\n modelValue: remember.value,\n 'onUpdate:modelValue': (v: boolean | 'indeterminate') => {\n remember.value = v === true\n },\n disabled: props.loading,\n } as Record<string, unknown>,\n () => 'Remember me',\n ),\n slots.forgot ? slots.forgot() : null,\n ],\n )\n : null,\n h(\n IrisButton,\n {\n type: 'submit',\n variant: 'solid',\n loading: props.loading,\n style: { width: '100%' },\n } as Record<string, unknown>,\n () => props.submitLabel,\n ),\n slots.footer\n ? h('div', null, [h(IrisDivider, { spacing: 'md', label: 'or' }), slots.footer()])\n : null,\n ]),\n ],\n ),\n ]),\n )\n },\n})\n","import { defineComponent, h, ref, type PropType } from 'vue'\nimport { IrisSidebarLayout } from '../layouts/SidebarLayout'\nimport { IrisHeaderLayout } from '../layouts/HeaderLayout'\nimport { IrisDashboardGrid, IrisDashboardCard } from '../layouts/DashboardGrid'\nimport { IrisStack } from '../layouts/Stack'\n\nexport interface IrisDashboardNavItem {\n id: string\n label: string\n /** Optional icon (any ReactNode-like; ignored if `slots.icon` is used). */\n icon?: string\n}\n\nexport interface IrisDashboardCardSpec {\n id: string\n title: string\n colSpan?: number | 'full'\n rowSpan?: number\n /** Plain text or HTML — replace via `#card.<id>` slot for full control. */\n body?: string\n}\n\n/**\n * Layer 4 system skeleton: a 3-region dashboard shell — sidebar + header +\n * main grid. Built from `IrisSidebarLayout` + `IrisHeaderLayout` +\n * `IrisDashboardGrid` so it inherits collapsing, sticky header, and responsive\n * column layout out of the box.\n */\nexport const IrisDashboardTemplate = defineComponent({\n name: 'IrisDashboardTemplate',\n inheritAttrs: false,\n props: {\n title: { type: String, default: 'Dashboard' },\n sidebarTitle: { type: String, default: '' },\n nav: { type: Array as PropType<IrisDashboardNavItem[]>, default: () => [] },\n /** Currently active nav item id. */\n activeId: { type: String, default: '' },\n /** Cards to render in the main grid. Skip to use the `default` slot only. */\n cards: { type: Array as PropType<IrisDashboardCardSpec[]>, default: () => [] },\n defaultCollapsed: { type: Boolean, default: false },\n },\n emits: {\n 'update:activeId': (_id: string) => true,\n 'update:collapsed': (_value: boolean) => true,\n },\n setup(props, { attrs, slots, emit }) {\n const collapsed = ref(props.defaultCollapsed)\n\n const onSelectNav = (id: string) => {\n emit('update:activeId', id)\n }\n\n return () =>\n h(\n 'div',\n {\n ...attrs,\n 'data-iris-dashboard-template': '',\n style: {\n width: '100%',\n height: '100vh',\n background: 'var(--iris-background)',\n color: 'var(--iris-foreground)',\n ...((attrs.style as Record<string, string> | undefined) ?? {}),\n },\n },\n h(\n IrisSidebarLayout,\n {\n collapsed: collapsed.value,\n 'onUpdate:collapsed': (v: boolean) => {\n collapsed.value = v\n emit('update:collapsed', v)\n },\n width: 240,\n collapsedWidth: 64,\n } as Record<string, unknown>,\n {\n sidebar: (state: { collapsed: boolean; setCollapsed: (v: boolean) => void }) =>\n h(IrisStack, { spacing: 'sm', style: { padding: '12px' } }, () => [\n slots['sidebar-header']\n ? slots['sidebar-header'](state)\n : props.sidebarTitle\n ? h(\n 'div',\n {\n style: {\n padding: '8px 12px',\n fontSize: '14px',\n fontWeight: '600',\n color: 'var(--iris-foreground)',\n opacity: state.collapsed ? 0 : 1,\n transition: 'opacity 120ms ease',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n },\n },\n props.sidebarTitle,\n )\n : null,\n h(\n 'nav',\n {\n 'aria-label': 'Primary',\n style: { display: 'flex', flexDirection: 'column', gap: '2px' },\n },\n props.nav.map((item) => {\n const isActive = item.id === props.activeId\n return h(\n 'button',\n {\n key: item.id,\n type: 'button',\n 'data-iris-dashboard-nav-item': item.id,\n 'data-iris-dashboard-nav-active': isActive ? 'true' : undefined,\n onClick: () => onSelectNav(item.id),\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n padding: '8px 12px',\n background: isActive ? 'var(--iris-primary)' : 'transparent',\n color: isActive\n ? 'var(--iris-primary-foreground, #fff)'\n : 'var(--iris-foreground)',\n border: 'none',\n borderRadius: 'var(--iris-radius-sm, 4px)',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: 'inherit',\n textAlign: 'start',\n outline: 'none',\n },\n },\n [\n item.icon\n ? h(\n 'span',\n {\n 'aria-hidden': 'true',\n style: {\n width: '16px',\n display: 'inline-flex',\n justifyContent: 'center',\n },\n },\n item.icon,\n )\n : null,\n h(\n 'span',\n {\n style: {\n opacity: state.collapsed ? 0 : 1,\n transition: 'opacity 120ms ease',\n whiteSpace: 'nowrap',\n },\n },\n item.label,\n ),\n ],\n )\n }),\n ),\n ]),\n default: () =>\n h(IrisHeaderLayout, {} as Record<string, unknown>, {\n header: () =>\n slots.header\n ? slots.header()\n : h(\n 'div',\n {\n style: {\n padding: '12px 20px',\n fontSize: '16px',\n fontWeight: '600',\n },\n },\n props.title,\n ),\n default: () =>\n slots.default\n ? slots.default()\n : h(\n 'div',\n { style: { padding: '20px' } },\n h(IrisDashboardGrid, { columns: 12, gap: 16 }, () =>\n props.cards.map((card) =>\n h(\n IrisDashboardCard,\n {\n key: card.id,\n colSpan: card.colSpan ?? 4,\n rowSpan: card.rowSpan ?? 1,\n 'data-iris-dashboard-card-id': card.id,\n } as Record<string, unknown>,\n () => [\n h(\n 'h3',\n {\n style: {\n margin: '0 0 8px 0',\n fontSize: '14px',\n fontWeight: '600',\n color: 'var(--iris-foreground)',\n },\n },\n card.title,\n ),\n slots[`card.${card.id}`]\n ? slots[`card.${card.id}`]!()\n : card.body\n ? h(\n 'div',\n { style: { fontSize: '13px', color: 'var(--iris-muted)' } },\n card.body,\n )\n : null,\n ],\n ),\n ),\n ),\n ),\n }),\n },\n ),\n )\n },\n})\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/undo/useUndoStack.ts"],"names":[],"mappings":";;;;;AAqBA,SAAS,cAAA,CAAkB,OAAqB,QAAA,EAAoC;AAClF,EAAA,MAAM,QAAA,uBAAe,GAAA,CAAwB,CAAC,QAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC9E,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyD;AAE9E,EAAA,OAAO,IAAI,MAAM,KAAA,EAAO;AAAA,IACtB,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAuB,QAAA,EAAmB;AACpD,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,IAAI,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACzB,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,UAAA,EAAA,GAAK,IAAI,IAAA,KAAoB;AAC3B,YAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAI,CAAA;AACnD,YAAA,QAAA,EAAS;AACT,YAAA,OAAO,MAAA;AAAA,UACT,CAAA;AACA,UAAA,QAAA,CAAS,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,QACtB;AACA,QAAA,OAAO,EAAA;AAAA,MACT;AACA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AACH;AAiCO,SAAS,aAAgB,OAAA,EAiB9B;AACA,EAAA,MAAM,GAAA,GAAM,gBAAmB,OAAO,CAAA;AAEtC,EAAA,MAAM,QAAQ,UAAA,CAAmC;AAAA,IAC/C,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,IACrB,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,IACrB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAO,GAAA,CAAI;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,MACZ,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,MACrB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,OAAO,GAAA,CAAI;AAAA,KACb;AAAA,EACF,CAAA;AAMA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA;AAMtC,EAAA,MAAM,IAAA,GAAO,CAAC,QAAA,KAAmB,KAAA,CAAM,KAAK,QAAQ,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,MAAqB,KAAA,CAAM,IAAA,EAAK;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAqB,KAAA,CAAM,IAAA,EAAK;AAC7C,EAAA,MAAM,KAAA,GAAQ,MAAY,KAAA,CAAM,KAAA,EAAM;AAEtC,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAM;AACjD","file":"chunk-FG5USQSY.js","sourcesContent":["import { shallowRef, type ShallowRef } from 'vue'\nimport { createUndoStack, type UndoStack, type UndoStackOptions } from '@iris-ui-kit/core/undo'\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Wrap a raw {@link UndoStack} in a Proxy so that every mutating call\n * (`push`/`undo`/`redo`/`clear`) — including calls made directly on the\n * returned `stack` reference — triggers `onMutate()` afterwards.\n *\n * Core's `UndoStack` is a plain mutable object with **no change notification**\n * (JSDoc promises it is a stable, modifiable reference). Without this wrapper,\n * `api.stack.push(x)` mutated core silently and left the reactive `state`\n * permanently stale, with zero errors.\n *\n * Only the `get` trap is installed: mutating methods return pre-created,\n * cached wrapper closures (so `stack.push === stack.push` — stable function\n * identity), while read-only members (`canUndo`/`canRedo`/`depth`/`index`)\n * pass through untouched. `ownKeys`/`getOwnPropertyDescriptor` are forwarded\n * by the default traps, so enumeration behavior is unchanged.\n */\nfunction trackUndoStack<T>(stack: UndoStack<T>, onMutate: () => void): UndoStack<T> {\n const mutators = new Set<keyof UndoStack<T>>(['push', 'undo', 'redo', 'clear'])\n const wrappers = new Map<keyof UndoStack<T>, (...args: unknown[]) => unknown>()\n\n return new Proxy(stack, {\n get(target, prop: string | symbol, receiver): unknown {\n const key = prop as keyof UndoStack<T>\n if (mutators.has(key)) {\n let fn = wrappers.get(key)\n if (!fn) {\n const original = target[key] as (...args: unknown[]) => unknown\n fn = (...args: unknown[]) => {\n const result = Reflect.apply(original, target, args)\n onMutate()\n return result\n }\n wrappers.set(key, fn)\n }\n return fn\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n}\n\n/**\n * Reactive snapshot metadata for the UndoStack: convenience booleans that\n * update on every push/undo/redo/clear for use in UI bindings (enable/disable\n * undo/redo buttons).\n */\nexport interface UndoStackReactiveState {\n canUndo: boolean\n canRedo: boolean\n depth: number\n index: number\n}\n\n/**\n * Vue bridge over the framework-agnostic {@link createUndoStack}.\n * Creates the stack once in `setup()` and returns a stable controller\n * plus a reactive `state` that tracks `canUndo`/`canRedo`/`depth`/`index` for\n * easy UI binding.\n *\n * The returned `push`/`undo`/`redo`/`clear` automatically update the reactive\n * state — no manual `.value = ...` needed. The same holds for mutating the\n * returned `stack` directly (`api.stack.push(x)`, `api.stack.undo()`, …): the\n * raw stack is wrapped so every mutation is observed and synced.\n *\n * @example\n * const { push, undo, redo, state } = useUndoStack({ initial: formValues })\n * // After mutation:\n * push(currentValues)\n * // In template:\n * <button :disabled=\"!state.canUndo\" @click=\"undo\">Undo</button>\n * <button :disabled=\"!state.canRedo\" @click=\"redo\">Redo</button>\n */\nexport function useUndoStack<T>(options?: UndoStackOptions<T>): {\n /** Push a new snapshot onto the stack. Returns the stored value. */\n push: (snapshot: T) => T\n /** Undo: returns the previous snapshot, or undefined if nothing to undo. */\n undo: () => T | undefined\n /** Redo: returns the next snapshot, or undefined if nothing to redo. */\n redo: () => T | undefined\n /** Clear all history. */\n clear: () => void\n /**\n * The raw undo stack (stable reference, same across renders). Its mutating\n * methods (`push`/`undo`/`redo`/`clear`) are observed — direct calls keep\n * `state` in sync.\n */\n stack: UndoStack<T>\n /** Reactive metadata: canUndo, canRedo, depth, index. */\n state: ShallowRef<UndoStackReactiveState>\n} {\n const raw = createUndoStack<T>(options)\n\n const state = shallowRef<UndoStackReactiveState>({\n canUndo: raw.canUndo(),\n canRedo: raw.canRedo(),\n depth: raw.depth,\n index: raw.index,\n })\n\n const sync = () => {\n state.value = {\n canUndo: raw.canUndo(),\n canRedo: raw.canRedo(),\n depth: raw.depth,\n index: raw.index,\n }\n }\n\n // Wrap the raw stack so direct `api.stack.push/undo/redo/clear` calls also\n // refresh `state` — previously they mutated core silently and left the\n // reactive state permanently stale (defect group 1). The proxy is the single\n // sync point below.\n const stack = trackUndoStack(raw, sync)\n\n // Delegate through the wrapped stack: `onMutate` fires on every mutating\n // call — even true no-ops and calls returning `undefined` (a legal snapshot\n // value for a generic T, so the return value cannot distinguish \"no-op\"\n // from \"pointer moved\" — defect group 2, aligned with vue 0.2.19).\n const push = (snapshot: T): T => stack.push(snapshot)\n const undo = (): T | undefined => stack.undo()\n const redo = (): T | undefined => stack.redo()\n const clear = (): void => stack.clear()\n\n return { push, undo, redo, clear, stack, state }\n}\n"]}