@iris-ui-kit/vue 0.2.19 → 0.2.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/admin.cjs +24 -6
  2. package/dist/admin.cjs.map +1 -1
  3. package/dist/admin.js +3 -3
  4. package/dist/{chunk-I6D5VXQK.js → chunk-3V46HGRC.js} +4 -3
  5. package/dist/chunk-3V46HGRC.js.map +1 -0
  6. package/dist/{chunk-2ETVCAVL.js → chunk-4WQOZ2OV.js} +7 -8
  7. package/dist/chunk-4WQOZ2OV.js.map +1 -0
  8. package/dist/{chunk-QLUIKEMJ.js → chunk-ENKE2BPC.js} +3 -3
  9. package/dist/{chunk-QLUIKEMJ.js.map → chunk-ENKE2BPC.js.map} +1 -1
  10. package/dist/chunk-FG5USQSY.js +55 -0
  11. package/dist/chunk-FG5USQSY.js.map +1 -0
  12. package/dist/{chunk-W2JVHGFR.js → chunk-MO7AAXA6.js} +33 -13
  13. package/dist/chunk-MO7AAXA6.js.map +1 -0
  14. package/dist/{chunk-H7HVVPYR.js → chunk-UPC4GN3F.js} +8 -2
  15. package/dist/chunk-UPC4GN3F.js.map +1 -0
  16. package/dist/{chunk-72PZMU6R.js → chunk-ZTPIXL7Q.js} +21 -3
  17. package/dist/chunk-ZTPIXL7Q.js.map +1 -0
  18. package/dist/index.cjs +119 -45
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.js +32 -11
  21. package/dist/index.js.map +1 -1
  22. package/dist/layouts.cjs +2 -1
  23. package/dist/layouts.cjs.map +1 -1
  24. package/dist/layouts.js +1 -1
  25. package/dist/provider.cjs +53 -9
  26. package/dist/provider.cjs.map +1 -1
  27. package/dist/provider.js +3 -3
  28. package/dist/skeletons.cjs +2 -1
  29. package/dist/skeletons.cjs.map +1 -1
  30. package/dist/skeletons.js +2 -2
  31. package/dist/skins.cjs +6 -0
  32. package/dist/skins.cjs.map +1 -1
  33. package/dist/skins.js +1 -1
  34. package/dist/theme.cjs +19 -1
  35. package/dist/theme.cjs.map +1 -1
  36. package/dist/theme.js +1 -1
  37. package/dist/undo.cjs +37 -28
  38. package/dist/undo.cjs.map +1 -1
  39. package/dist/undo.d.cts +8 -2
  40. package/dist/undo.d.ts +8 -2
  41. package/dist/undo.js +1 -1
  42. package/package.json +1 -1
  43. package/dist/chunk-2ETVCAVL.js.map +0 -1
  44. package/dist/chunk-72PZMU6R.js.map +0 -1
  45. package/dist/chunk-H7HVVPYR.js.map +0 -1
  46. package/dist/chunk-I6D5VXQK.js.map +0 -1
  47. package/dist/chunk-RLVG5JQH.js +0 -46
  48. package/dist/chunk-RLVG5JQH.js.map +0 -1
  49. package/dist/chunk-W2JVHGFR.js.map +0 -1
package/dist/skeletons.js CHANGED
@@ -1,7 +1,7 @@
1
- export { IrisDashboardTemplate, IrisLoginTemplate } from './chunk-QLUIKEMJ.js';
1
+ export { IrisDashboardTemplate, IrisLoginTemplate } from './chunk-ENKE2BPC.js';
2
2
  import './chunk-3R3QDLJC.js';
3
3
  import './chunk-F77KIPOH.js';
4
- import './chunk-I6D5VXQK.js';
4
+ import './chunk-3V46HGRC.js';
5
5
  import './chunk-TCAXRWT6.js';
6
6
  //# sourceMappingURL=skeletons.js.map
7
7
  //# sourceMappingURL=skeletons.js.map
package/dist/skins.cjs CHANGED
@@ -31,6 +31,12 @@ var SkinProvider = vue.defineComponent({
31
31
  vue.watch(current, () => {
32
32
  if (applied) apply();
33
33
  });
34
+ vue.watch(
35
+ () => props.target,
36
+ () => {
37
+ if (applied) apply();
38
+ }
39
+ );
34
40
  vue.onBeforeUnmount(() => {
35
41
  unsubscribe();
36
42
  applied?.revert();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/skins/SkinProvider.ts","../src/skins/useSkin.ts"],"names":["defineComponent","ref","applySkin","onMounted","injectGlobalStyles","watch","onBeforeUnmount","provide","inject","computed"],"mappings":";;;;;;;AAyBO,IAAM,WAAA,0BAAoD,UAAU;AAOpE,IAAM,eAAeA,mBAAA,CAAgB;AAAA,EAC1C,IAAA,EAAM,kBAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAgC,UAAU,IAAA,EAAK;AAAA,IAC/D,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAwC,SAAS,IAAA,EAAK;AAAA,IACtE,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,MAAA;AAAU,GAC/C;AAAA,EACA,KAAA,CAAM,KAAA,EAAO,EAAE,KAAA,EAAM,EAAG;AACtB,IAAA,MAAM,OAAA,GAAUC,OAAA,CAAI,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAC1C,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU,CAAC,IAAA,KAAS;AACnD,MAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,IAAI,OAAA,GAAkC,IAAA;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,IAAU,QAAA,CAAS,eAAA;AAChD,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,OAAA,EAAS,MAAA,EAAO;AAChB,MAAA,OAAA,GAAUC,eAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,IAC/C,CAAA;AAEA,IAAAC,aAAA,CAAU,MAAM;AACd,MAAAC,wBAAA,CAAmB,MAAM,QAAQ,CAAA;AACjC,MAAA,KAAA,EAAM;AAAA,IACR,CAAC,CAAA;AACD,IAAAC,SAAA,CAAM,SAAS,MAAM;AACnB,MAAA,IAAI,SAAS,KAAA,EAAM;AAAA,IACrB,CAAC,CAAA;AACD,IAAAC,mBAAA,CAAgB,MAAM;AACpB,MAAA,WAAA,EAAY;AACZ,MAAA,OAAA,EAAS,MAAA,EAAO;AAChB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAC,CAAA;AAED,IAAAC,WAAA,CAAQ,aAAa,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA;AACtD,IAAA,OAAO,MAAM,MAAM,OAAA,IAAU;AAAA,EAC/B;AACF,CAAC;AAEM,SAAS,cAAA,GAAkC;AAChD,EAAA,MAAM,GAAA,GAAMC,WAAO,WAAW,CAAA;AAC9B,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,uDAAuD,CAAA;AACjF,EAAA,OAAO,GAAA;AACT;ACrDO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,cAAA,EAAe;AAC3C,EAAA,OAAO;AAAA,IACL,IAAA,EAAMC,YAAA,CAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,IAClC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,QAAQ,MAAA,CAAO;AAAA,GACjB;AACF","file":"skins.cjs","sourcesContent":["import {\n defineComponent,\n inject,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n watch,\n type InjectionKey,\n type PropType,\n type Ref,\n} from 'vue'\nimport { injectGlobalStyles } from '@iris-ui-kit/theme'\nimport {\n applySkin,\n type ApplySkinResult,\n type ResolvedSkin,\n type SkinEngine,\n} from '@iris-ui-kit/skins'\n\nexport interface IrisSkinContext {\n engine: SkinEngine\n current: Ref<ResolvedSkin>\n}\n\nexport const IrisSkinKey: InjectionKey<IrisSkinContext> = Symbol('IrisSkin')\n\n/**\n * Renderless provider mirroring `<IrisThemeProvider>` for skins: subscribes to\n * the engine store, applies/reverts the resolved skin on the target element,\n * and provides the engine + current skin to descendants. Zero skin logic.\n */\nexport const SkinProvider = defineComponent({\n name: 'IrisSkinProvider',\n props: {\n engine: { type: Object as PropType<SkinEngine>, required: true },\n target: { type: Object as PropType<HTMLElement | null>, default: null },\n cspNonce: { type: String, default: undefined },\n },\n setup(props, { slots }) {\n const current = ref(props.engine.current()) as Ref<ResolvedSkin>\n const unsubscribe = props.engine.subscribe((next) => {\n current.value = next\n })\n\n let applied: ApplySkinResult | null = null\n const targetEl = () => props.target ?? document.documentElement\n const apply = () => {\n applied?.revert()\n applied = applySkin(current.value, targetEl())\n }\n\n onMounted(() => {\n injectGlobalStyles(props.cspNonce)\n apply()\n })\n watch(current, () => {\n if (applied) apply()\n })\n onBeforeUnmount(() => {\n unsubscribe()\n applied?.revert()\n applied = null\n })\n\n provide(IrisSkinKey, { engine: props.engine, current })\n return () => slots.default?.()\n },\n})\n\nexport function useSkinContext(): IrisSkinContext {\n const ctx = inject(IrisSkinKey)\n if (!ctx) throw new Error('[iris-ui] useSkin(): no <SkinProvider> ancestor found')\n return ctx\n}\n","import type { ComputedRef } from 'vue'\nimport { computed } from 'vue'\nimport type { ResolvedSkin, Skin, SkinMode, SkinPatch, SkinError } from '@iris-ui-kit/skins'\nimport { useSkinContext } from './SkinProvider'\n\nexport interface UseSkinReturn {\n skin: ComputedRef<ResolvedSkin>\n setSkin: (id: string) => void\n loadSkin: (source: string | Skin) => Promise<ResolvedSkin>\n useFromCatalog: (id: string) => Promise<ResolvedSkin>\n patch: (overrides: SkinPatch) => void\n resetPatch: () => void\n setMode: (mode: SkinMode) => void\n getMode: () => SkinMode\n /** Logical selected id (pre system-variant remap) — e.g. 'auto' while following the system. */\n getActiveId: () => string\n availableSkins: () => Skin[]\n errors: () => SkinError[]\n}\n\n/** Read + control the active skin from anywhere inside a `<SkinProvider>`. */\nexport function useSkin(): UseSkinReturn {\n const { engine, current } = useSkinContext()\n return {\n skin: computed(() => current.value),\n setSkin: engine.setSkin,\n loadSkin: engine.loadSkin,\n useFromCatalog: engine.useFromCatalog,\n patch: engine.patch,\n resetPatch: engine.resetPatch,\n setMode: engine.setMode,\n getMode: engine.getMode,\n getActiveId: engine.getActiveId,\n availableSkins: engine.availableSkins,\n errors: engine.errors,\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/skins/SkinProvider.ts","../src/skins/useSkin.ts"],"names":["defineComponent","ref","applySkin","onMounted","injectGlobalStyles","watch","onBeforeUnmount","provide","inject","computed"],"mappings":";;;;;;;AAyBO,IAAM,WAAA,0BAAoD,UAAU;AAOpE,IAAM,eAAeA,mBAAA,CAAgB;AAAA,EAC1C,IAAA,EAAM,kBAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAgC,UAAU,IAAA,EAAK;AAAA,IAC/D,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAwC,SAAS,IAAA,EAAK;AAAA,IACtE,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,MAAA;AAAU,GAC/C;AAAA,EACA,KAAA,CAAM,KAAA,EAAO,EAAE,KAAA,EAAM,EAAG;AACtB,IAAA,MAAM,OAAA,GAAUC,OAAA,CAAI,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAC1C,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU,CAAC,IAAA,KAAS;AACnD,MAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,IAAI,OAAA,GAAkC,IAAA;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,IAAU,QAAA,CAAS,eAAA;AAChD,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,OAAA,EAAS,MAAA,EAAO;AAChB,MAAA,OAAA,GAAUC,eAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,IAC/C,CAAA;AAEA,IAAAC,aAAA,CAAU,MAAM;AACd,MAAAC,wBAAA,CAAmB,MAAM,QAAQ,CAAA;AACjC,MAAA,KAAA,EAAM;AAAA,IACR,CAAC,CAAA;AACD,IAAAC,SAAA,CAAM,SAAS,MAAM;AACnB,MAAA,IAAI,SAAS,KAAA,EAAM;AAAA,IACrB,CAAC,CAAA;AACD,IAAAA,SAAA;AAAA,MACE,MAAM,KAAA,CAAM,MAAA;AAAA,MACZ,MAAM;AACJ,QAAA,IAAI,SAAS,KAAA,EAAM;AAAA,MACrB;AAAA,KACF;AACA,IAAAC,mBAAA,CAAgB,MAAM;AACpB,MAAA,WAAA,EAAY;AACZ,MAAA,OAAA,EAAS,MAAA,EAAO;AAChB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAC,CAAA;AAED,IAAAC,WAAA,CAAQ,aAAa,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA;AACtD,IAAA,OAAO,MAAM,MAAM,OAAA,IAAU;AAAA,EAC/B;AACF,CAAC;AAEM,SAAS,cAAA,GAAkC;AAChD,EAAA,MAAM,GAAA,GAAMC,WAAO,WAAW,CAAA;AAC9B,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,uDAAuD,CAAA;AACjF,EAAA,OAAO,GAAA;AACT;AC3DO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,cAAA,EAAe;AAC3C,EAAA,OAAO;AAAA,IACL,IAAA,EAAMC,YAAA,CAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,IAClC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,QAAQ,MAAA,CAAO;AAAA,GACjB;AACF","file":"skins.cjs","sourcesContent":["import {\n defineComponent,\n inject,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n watch,\n type InjectionKey,\n type PropType,\n type Ref,\n} from 'vue'\nimport { injectGlobalStyles } from '@iris-ui-kit/theme'\nimport {\n applySkin,\n type ApplySkinResult,\n type ResolvedSkin,\n type SkinEngine,\n} from '@iris-ui-kit/skins'\n\nexport interface IrisSkinContext {\n engine: SkinEngine\n current: Ref<ResolvedSkin>\n}\n\nexport const IrisSkinKey: InjectionKey<IrisSkinContext> = Symbol('IrisSkin')\n\n/**\n * Renderless provider mirroring `<IrisThemeProvider>` for skins: subscribes to\n * the engine store, applies/reverts the resolved skin on the target element,\n * and provides the engine + current skin to descendants. Zero skin logic.\n */\nexport const SkinProvider = defineComponent({\n name: 'IrisSkinProvider',\n props: {\n engine: { type: Object as PropType<SkinEngine>, required: true },\n target: { type: Object as PropType<HTMLElement | null>, default: null },\n cspNonce: { type: String, default: undefined },\n },\n setup(props, { slots }) {\n const current = ref(props.engine.current()) as Ref<ResolvedSkin>\n const unsubscribe = props.engine.subscribe((next) => {\n current.value = next\n })\n\n let applied: ApplySkinResult | null = null\n const targetEl = () => props.target ?? document.documentElement\n const apply = () => {\n applied?.revert()\n applied = applySkin(current.value, targetEl())\n }\n\n onMounted(() => {\n injectGlobalStyles(props.cspNonce)\n apply()\n })\n watch(current, () => {\n if (applied) apply()\n })\n watch(\n () => props.target,\n () => {\n if (applied) apply()\n },\n )\n onBeforeUnmount(() => {\n unsubscribe()\n applied?.revert()\n applied = null\n })\n\n provide(IrisSkinKey, { engine: props.engine, current })\n return () => slots.default?.()\n },\n})\n\nexport function useSkinContext(): IrisSkinContext {\n const ctx = inject(IrisSkinKey)\n if (!ctx) throw new Error('[iris-ui] useSkin(): no <SkinProvider> ancestor found')\n return ctx\n}\n","import type { ComputedRef } from 'vue'\nimport { computed } from 'vue'\nimport type { ResolvedSkin, Skin, SkinMode, SkinPatch, SkinError } from '@iris-ui-kit/skins'\nimport { useSkinContext } from './SkinProvider'\n\nexport interface UseSkinReturn {\n skin: ComputedRef<ResolvedSkin>\n setSkin: (id: string) => void\n loadSkin: (source: string | Skin) => Promise<ResolvedSkin>\n useFromCatalog: (id: string) => Promise<ResolvedSkin>\n patch: (overrides: SkinPatch) => void\n resetPatch: () => void\n setMode: (mode: SkinMode) => void\n getMode: () => SkinMode\n /** Logical selected id (pre system-variant remap) — e.g. 'auto' while following the system. */\n getActiveId: () => string\n availableSkins: () => Skin[]\n errors: () => SkinError[]\n}\n\n/** Read + control the active skin from anywhere inside a `<SkinProvider>`. */\nexport function useSkin(): UseSkinReturn {\n const { engine, current } = useSkinContext()\n return {\n skin: computed(() => current.value),\n setSkin: engine.setSkin,\n loadSkin: engine.loadSkin,\n useFromCatalog: engine.useFromCatalog,\n patch: engine.patch,\n resetPatch: engine.resetPatch,\n setMode: engine.setMode,\n getMode: engine.getMode,\n getActiveId: engine.getActiveId,\n availableSkins: engine.availableSkins,\n errors: engine.errors,\n }\n}\n"]}
package/dist/skins.js CHANGED
@@ -1,3 +1,3 @@
1
- export { IrisSkinKey, SkinProvider, SkinResolutionError, applySkin, builtinSkins, createSkinCatalog, createSkinEngine, createSkinRegistry, darkSkin, lightSkin, loadSkin, localStorageSkinStorage, memorySkinStorage, renderSkinStyle, resolveSkin, skinBootScript, skinError, skinToCssEntries, useSkin, useSkinContext, validateSkin } from './chunk-H7HVVPYR.js';
1
+ export { IrisSkinKey, SkinProvider, SkinResolutionError, applySkin, builtinSkins, createSkinCatalog, createSkinEngine, createSkinRegistry, darkSkin, lightSkin, loadSkin, localStorageSkinStorage, memorySkinStorage, renderSkinStyle, resolveSkin, skinBootScript, skinError, skinToCssEntries, useSkin, useSkinContext, validateSkin } from './chunk-UPC4GN3F.js';
2
2
  //# sourceMappingURL=skins.js.map
3
3
  //# sourceMappingURL=skins.js.map
package/dist/theme.cjs CHANGED
@@ -29,7 +29,7 @@ var ThemeProvider = vue.defineComponent({
29
29
  },
30
30
  setup(props, { slots }) {
31
31
  const current = vue.ref(props.store.store.getState());
32
- const unsubscribe = props.store.store.subscribe((next) => {
32
+ let unsubscribe = props.store.store.subscribe((next) => {
33
33
  current.value = next;
34
34
  });
35
35
  let applied = null;
@@ -51,6 +51,24 @@ var ThemeProvider = vue.defineComponent({
51
51
  vue.watch(current, () => {
52
52
  if (applied) applyCurrent();
53
53
  });
54
+ vue.watch(
55
+ () => props.store,
56
+ (nextStore) => {
57
+ unsubscribe();
58
+ unsubscribe = nextStore.store.subscribe((next) => {
59
+ current.value = next;
60
+ });
61
+ current.value = nextStore.store.getState();
62
+ if (applied) applyCurrent();
63
+ }
64
+ );
65
+ vue.watch(
66
+ () => props.target,
67
+ () => {
68
+ if (applied) applyCurrent();
69
+ if (dirApplied) applyDir();
70
+ }
71
+ );
54
72
  vue.watch(
55
73
  () => props.dir,
56
74
  () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/ThemeProvider.ts","../src/theme/useTheme.ts","../src/theme/useColorScheme.ts"],"names":["defineComponent","ref","applyTheme","applyDirection","onMounted","injectGlobalStyles","watch","onBeforeUnmount","provide","computed","inject","getColorScheme","watchColorScheme"],"mappings":"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","file":"theme.cjs","sourcesContent":["import {\n computed,\n defineComponent,\n inject,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n watch,\n type ComputedRef,\n type InjectionKey,\n type PropType,\n type Ref,\n} from 'vue'\nimport {\n applyDirection,\n applyTheme,\n injectGlobalStyles,\n type ApplyDirectionResult,\n type ApplyThemeResult,\n type Direction,\n type ThemeStore,\n} from '@iris-ui-kit/theme'\nimport type { IrisTheme } from '@iris-ui-kit/tokens'\n\nexport interface IrisThemeContext {\n store: ThemeStore\n current: Ref<IrisTheme>\n dir: ComputedRef<Direction>\n}\n\nexport const IrisThemeKey: InjectionKey<IrisThemeContext> = Symbol('IrisTheme')\n\n/**\n * Renderless provider that:\n * 1. exposes the theme store to descendants via `provide`,\n * 2. applies the current theme to a target element on mount and on change,\n * 3. reverts the inline custom properties on unmount.\n *\n * `target` defaults to `document.documentElement`. Pass an element ref to\n * scope a theme to a subtree.\n */\nexport const ThemeProvider = defineComponent({\n name: 'IrisThemeProvider',\n props: {\n store: {\n type: Object as PropType<ThemeStore>,\n required: true,\n },\n target: {\n type: Object as PropType<HTMLElement | null>,\n default: null,\n },\n /** Writing direction; sets `dir` on the target for RTL. Default `'ltr'`. */\n dir: {\n type: String as PropType<Direction>,\n default: 'ltr',\n },\n /** CSP nonce for injected inline stylesheets. */\n cspNonce: {\n type: String,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const current = ref(props.store.store.getState()) as Ref<IrisTheme>\n const unsubscribe = props.store.store.subscribe((next) => {\n current.value = next\n })\n\n let applied: ApplyThemeResult | null = null\n let dirApplied: ApplyDirectionResult | null = null\n\n const targetEl = () => props.target ?? document.documentElement\n\n const applyCurrent = () => {\n applied?.revert()\n applied = applyTheme(current.value, targetEl())\n }\n\n const applyDir = () => {\n dirApplied?.revert()\n dirApplied = applyDirection(props.dir, targetEl())\n }\n\n onMounted(() => {\n injectGlobalStyles(props.cspNonce)\n applyCurrent()\n applyDir()\n })\n\n watch(current, () => {\n if (applied) applyCurrent()\n })\n\n watch(\n () => props.dir,\n () => {\n if (dirApplied) applyDir()\n },\n )\n\n onBeforeUnmount(() => {\n unsubscribe()\n applied?.revert()\n applied = null\n dirApplied?.revert()\n dirApplied = null\n })\n\n provide(IrisThemeKey, { store: props.store, current, dir: computed(() => props.dir) })\n\n return () => slots.default?.()\n },\n})\n\nexport function useThemeContext(): IrisThemeContext {\n const ctx = inject(IrisThemeKey)\n if (!ctx) {\n throw new Error('[iris-ui] useTheme(): no <ThemeProvider> ancestor found')\n }\n return ctx\n}\n\n/**\n * Current writing direction (`'ltr'` / `'rtl'`) from the nearest\n * `<ThemeProvider>`, or a static `'ltr'` ref when there is none.\n */\nexport function useDirection(): ComputedRef<Direction> {\n const ctx = inject(IrisThemeKey, null)\n return ctx ? ctx.dir : computed(() => 'ltr' as Direction)\n}\n","import { computed, type ComputedRef } from 'vue'\nimport type { IrisTheme } from '@iris-ui-kit/tokens'\nimport { useThemeContext } from './ThemeProvider'\n\nexport interface UseThemeReturn {\n /** Reactive ref to the active theme. */\n theme: ComputedRef<IrisTheme>\n /** Switch by name or by passing a theme directly. */\n setTheme: (target: string | IrisTheme) => void\n /** Map of all themes registered with the store. */\n availableThemes: Record<string, IrisTheme>\n}\n\n/**\n * Read and write the current theme from anywhere inside a <ThemeProvider>.\n *\n * @example\n * const { theme, setTheme } = useTheme()\n * theme.value.colors['iris.primary']\n * setTheme('dark')\n */\nexport function useTheme(): UseThemeReturn {\n const ctx = useThemeContext()\n return {\n theme: computed(() => ctx.current.value),\n setTheme: ctx.store.setTheme,\n availableThemes: ctx.store.availableThemes,\n }\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\nimport { getColorScheme, watchColorScheme, type ColorScheme } from '@iris-ui-kit/theme'\n\n/**\n * Reactive system color scheme (`'light'` / `'dark'`) from\n * `prefers-color-scheme`. SSR-safe (reports `'light'` until matchMedia is\n * available). Wire it to a theme store to auto-follow the system:\n *\n * ```ts\n * const scheme = useColorScheme()\n * watch(scheme, (s) => store.setTheme(s === 'dark' ? 'dark' : 'light'), { immediate: true })\n * ```\n */\nexport function useColorScheme(): Ref<ColorScheme> {\n const scheme = ref<ColorScheme>(getColorScheme())\n const stop = watchColorScheme((s) => {\n scheme.value = s\n })\n onBeforeUnmount(stop)\n return scheme\n}\n"]}
1
+ {"version":3,"sources":["../src/theme/ThemeProvider.ts","../src/theme/useTheme.ts","../src/theme/useColorScheme.ts"],"names":["defineComponent","ref","applyTheme","applyDirection","onMounted","injectGlobalStyles","watch","onBeforeUnmount","provide","computed","inject","getColorScheme","watchColorScheme"],"mappings":"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","file":"theme.cjs","sourcesContent":["import {\n computed,\n defineComponent,\n inject,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n watch,\n type ComputedRef,\n type InjectionKey,\n type PropType,\n type Ref,\n} from 'vue'\nimport {\n applyDirection,\n applyTheme,\n injectGlobalStyles,\n type ApplyDirectionResult,\n type ApplyThemeResult,\n type Direction,\n type ThemeStore,\n} from '@iris-ui-kit/theme'\nimport type { IrisTheme } from '@iris-ui-kit/tokens'\n\nexport interface IrisThemeContext {\n store: ThemeStore\n current: Ref<IrisTheme>\n dir: ComputedRef<Direction>\n}\n\nexport const IrisThemeKey: InjectionKey<IrisThemeContext> = Symbol('IrisTheme')\n\n/**\n * Renderless provider that:\n * 1. exposes the theme store to descendants via `provide`,\n * 2. applies the current theme to a target element on mount and on change,\n * 3. reverts the inline custom properties on unmount.\n *\n * `target` defaults to `document.documentElement`. Pass an element ref to\n * scope a theme to a subtree.\n */\nexport const ThemeProvider = defineComponent({\n name: 'IrisThemeProvider',\n props: {\n store: {\n type: Object as PropType<ThemeStore>,\n required: true,\n },\n target: {\n type: Object as PropType<HTMLElement | null>,\n default: null,\n },\n /** Writing direction; sets `dir` on the target for RTL. Default `'ltr'`. */\n dir: {\n type: String as PropType<Direction>,\n default: 'ltr',\n },\n /** CSP nonce for injected inline stylesheets. */\n cspNonce: {\n type: String,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const current = ref(props.store.store.getState()) as Ref<IrisTheme>\n let unsubscribe = props.store.store.subscribe((next) => {\n current.value = next\n })\n\n let applied: ApplyThemeResult | null = null\n let dirApplied: ApplyDirectionResult | null = null\n\n const targetEl = () => props.target ?? document.documentElement\n\n const applyCurrent = () => {\n applied?.revert()\n applied = applyTheme(current.value, targetEl())\n }\n\n const applyDir = () => {\n dirApplied?.revert()\n dirApplied = applyDirection(props.dir, targetEl())\n }\n\n onMounted(() => {\n injectGlobalStyles(props.cspNonce)\n applyCurrent()\n applyDir()\n })\n\n watch(current, () => {\n if (applied) applyCurrent()\n })\n\n watch(\n () => props.store,\n (nextStore) => {\n unsubscribe()\n unsubscribe = nextStore.store.subscribe((next) => {\n current.value = next\n })\n current.value = nextStore.store.getState()\n if (applied) applyCurrent()\n },\n )\n\n watch(\n () => props.target,\n () => {\n if (applied) applyCurrent()\n if (dirApplied) applyDir()\n },\n )\n\n watch(\n () => props.dir,\n () => {\n if (dirApplied) applyDir()\n },\n )\n\n onBeforeUnmount(() => {\n unsubscribe()\n applied?.revert()\n applied = null\n dirApplied?.revert()\n dirApplied = null\n })\n\n provide(IrisThemeKey, { store: props.store, current, dir: computed(() => props.dir) })\n\n return () => slots.default?.()\n },\n})\n\nexport function useThemeContext(): IrisThemeContext {\n const ctx = inject(IrisThemeKey)\n if (!ctx) {\n throw new Error('[iris-ui] useTheme(): no <ThemeProvider> ancestor found')\n }\n return ctx\n}\n\n/**\n * Current writing direction (`'ltr'` / `'rtl'`) from the nearest\n * `<ThemeProvider>`, or a static `'ltr'` ref when there is none.\n */\nexport function useDirection(): ComputedRef<Direction> {\n const ctx = inject(IrisThemeKey, null)\n return ctx ? ctx.dir : computed(() => 'ltr' as Direction)\n}\n","import { computed, type ComputedRef } from 'vue'\nimport type { IrisTheme } from '@iris-ui-kit/tokens'\nimport { useThemeContext } from './ThemeProvider'\n\nexport interface UseThemeReturn {\n /** Reactive ref to the active theme. */\n theme: ComputedRef<IrisTheme>\n /** Switch by name or by passing a theme directly. */\n setTheme: (target: string | IrisTheme) => void\n /** Map of all themes registered with the store. */\n availableThemes: Record<string, IrisTheme>\n}\n\n/**\n * Read and write the current theme from anywhere inside a <ThemeProvider>.\n *\n * @example\n * const { theme, setTheme } = useTheme()\n * theme.value.colors['iris.primary']\n * setTheme('dark')\n */\nexport function useTheme(): UseThemeReturn {\n const ctx = useThemeContext()\n return {\n theme: computed(() => ctx.current.value),\n setTheme: ctx.store.setTheme,\n availableThemes: ctx.store.availableThemes,\n }\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\nimport { getColorScheme, watchColorScheme, type ColorScheme } from '@iris-ui-kit/theme'\n\n/**\n * Reactive system color scheme (`'light'` / `'dark'`) from\n * `prefers-color-scheme`. SSR-safe (reports `'light'` until matchMedia is\n * available). Wire it to a theme store to auto-follow the system:\n *\n * ```ts\n * const scheme = useColorScheme()\n * watch(scheme, (s) => store.setTheme(s === 'dark' ? 'dark' : 'light'), { immediate: true })\n * ```\n */\nexport function useColorScheme(): Ref<ColorScheme> {\n const scheme = ref<ColorScheme>(getColorScheme())\n const stop = watchColorScheme((s) => {\n scheme.value = s\n })\n onBeforeUnmount(stop)\n return scheme\n}\n"]}
package/dist/theme.js CHANGED
@@ -1,3 +1,3 @@
1
- export { IrisThemeKey, ThemeProvider, useColorScheme, useDirection, useTheme, useThemeContext } from './chunk-72PZMU6R.js';
1
+ export { IrisThemeKey, ThemeProvider, useColorScheme, useDirection, useTheme, useThemeContext } from './chunk-ZTPIXL7Q.js';
2
2
  //# sourceMappingURL=theme.js.map
3
3
  //# sourceMappingURL=theme.js.map
package/dist/undo.cjs CHANGED
@@ -4,41 +4,50 @@ var vue = require('vue');
4
4
  var undo = require('@iris-ui-kit/core/undo');
5
5
 
6
6
  // src/undo/useUndoStack.ts
7
+ function trackUndoStack(stack, onMutate) {
8
+ const mutators = /* @__PURE__ */ new Set(["push", "undo", "redo", "clear"]);
9
+ const wrappers = /* @__PURE__ */ new Map();
10
+ return new Proxy(stack, {
11
+ get(target, prop, receiver) {
12
+ const key = prop;
13
+ if (mutators.has(key)) {
14
+ let fn = wrappers.get(key);
15
+ if (!fn) {
16
+ const original = target[key];
17
+ fn = (...args) => {
18
+ const result = Reflect.apply(original, target, args);
19
+ onMutate();
20
+ return result;
21
+ };
22
+ wrappers.set(key, fn);
23
+ }
24
+ return fn;
25
+ }
26
+ return Reflect.get(target, prop, receiver);
27
+ }
28
+ });
29
+ }
7
30
  function useUndoStack(options) {
8
- const stack = undo.createUndoStack(options);
31
+ const raw = undo.createUndoStack(options);
9
32
  const state = vue.shallowRef({
10
- canUndo: stack.canUndo(),
11
- canRedo: stack.canRedo(),
12
- depth: stack.depth,
13
- index: stack.index
33
+ canUndo: raw.canUndo(),
34
+ canRedo: raw.canRedo(),
35
+ depth: raw.depth,
36
+ index: raw.index
14
37
  });
15
38
  const sync = () => {
16
39
  state.value = {
17
- canUndo: stack.canUndo(),
18
- canRedo: stack.canRedo(),
19
- depth: stack.depth,
20
- index: stack.index
40
+ canUndo: raw.canUndo(),
41
+ canRedo: raw.canRedo(),
42
+ depth: raw.depth,
43
+ index: raw.index
21
44
  };
22
45
  };
23
- const push = (snapshot) => {
24
- const result = stack.push(snapshot);
25
- sync();
26
- return result;
27
- };
28
- const undo$1 = () => {
29
- const result = stack.undo();
30
- sync();
31
- return result;
32
- };
33
- const redo = () => {
34
- const result = stack.redo();
35
- sync();
36
- return result;
37
- };
38
- const clear = () => {
39
- stack.clear();
40
- sync();
41
- };
46
+ const stack = trackUndoStack(raw, sync);
47
+ const push = (snapshot) => stack.push(snapshot);
48
+ const undo$1 = () => stack.undo();
49
+ const redo = () => stack.redo();
50
+ const clear = () => stack.clear();
42
51
  return { push, undo: undo$1, redo, clear, stack, state };
43
52
  }
44
53
 
package/dist/undo.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/undo/useUndoStack.ts"],"names":["createUndoStack","shallowRef","undo"],"mappings":";;;;;;AAgCO,SAAS,aAAgB,OAAA,EAa9B;AACA,EAAA,MAAM,KAAA,GAAQA,qBAAmB,OAAO,CAAA;AAExC,EAAA,MAAM,QAAQC,cAAA,CAAmC;AAAA,IAC/C,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,IACvB,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,IACvB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,OAAO,KAAA,CAAM;AAAA,GACd,CAAA;AAED,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,MACZ,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,MACvB,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,MACvB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,QAAA,KAAmB;AAC/B,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAClC,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAMC,SAAO,MAAqB;AAChC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,EAAK;AAK1B,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,OAAO,MAAqB;AAChC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,EAAK;AAC1B,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AAEA,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/**\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.\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 /** The raw undo stack (stable reference, same across renders). */\n stack: UndoStack<T>\n /** Reactive metadata: canUndo, canRedo, depth, index. */\n state: ShallowRef<UndoStackReactiveState>\n} {\n const stack = createUndoStack<T>(options)\n\n const state = shallowRef<UndoStackReactiveState>({\n canUndo: stack.canUndo(),\n canRedo: stack.canRedo(),\n depth: stack.depth,\n index: stack.index,\n })\n\n const sync = () => {\n state.value = {\n canUndo: stack.canUndo(),\n canRedo: stack.canRedo(),\n depth: stack.depth,\n index: stack.index,\n }\n }\n\n const push = (snapshot: T): T => {\n const result = stack.push(snapshot)\n sync()\n return result\n }\n\n const undo = (): T | undefined => {\n const result = stack.undo()\n // Always sync: `undefined` is a legal snapshot value for a generic T, so\n // the return value cannot distinguish \"no-op\" from \"moved onto an\n // undefined snapshot\". A true no-op writes identical values, which is\n // harmless (same as push/clear).\n sync()\n return result\n }\n\n const redo = (): T | undefined => {\n const result = stack.redo()\n sync()\n return result\n }\n\n const clear = () => {\n stack.clear()\n sync()\n }\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;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"]}
package/dist/undo.d.cts CHANGED
@@ -20,7 +20,9 @@ interface UndoStackReactiveState {
20
20
  * easy UI binding.
21
21
  *
22
22
  * The returned `push`/`undo`/`redo`/`clear` automatically update the reactive
23
- * state — no manual `.value = ...` needed.
23
+ * state — no manual `.value = ...` needed. The same holds for mutating the
24
+ * returned `stack` directly (`api.stack.push(x)`, `api.stack.undo()`, …): the
25
+ * raw stack is wrapped so every mutation is observed and synced.
24
26
  *
25
27
  * @example
26
28
  * const { push, undo, redo, state } = useUndoStack({ initial: formValues })
@@ -39,7 +41,11 @@ declare function useUndoStack<T>(options?: UndoStackOptions<T>): {
39
41
  redo: () => T | undefined;
40
42
  /** Clear all history. */
41
43
  clear: () => void;
42
- /** The raw undo stack (stable reference, same across renders). */
44
+ /**
45
+ * The raw undo stack (stable reference, same across renders). Its mutating
46
+ * methods (`push`/`undo`/`redo`/`clear`) are observed — direct calls keep
47
+ * `state` in sync.
48
+ */
43
49
  stack: UndoStack<T>;
44
50
  /** Reactive metadata: canUndo, canRedo, depth, index. */
45
51
  state: ShallowRef<UndoStackReactiveState>;
package/dist/undo.d.ts CHANGED
@@ -20,7 +20,9 @@ interface UndoStackReactiveState {
20
20
  * easy UI binding.
21
21
  *
22
22
  * The returned `push`/`undo`/`redo`/`clear` automatically update the reactive
23
- * state — no manual `.value = ...` needed.
23
+ * state — no manual `.value = ...` needed. The same holds for mutating the
24
+ * returned `stack` directly (`api.stack.push(x)`, `api.stack.undo()`, …): the
25
+ * raw stack is wrapped so every mutation is observed and synced.
24
26
  *
25
27
  * @example
26
28
  * const { push, undo, redo, state } = useUndoStack({ initial: formValues })
@@ -39,7 +41,11 @@ declare function useUndoStack<T>(options?: UndoStackOptions<T>): {
39
41
  redo: () => T | undefined;
40
42
  /** Clear all history. */
41
43
  clear: () => void;
42
- /** The raw undo stack (stable reference, same across renders). */
44
+ /**
45
+ * The raw undo stack (stable reference, same across renders). Its mutating
46
+ * methods (`push`/`undo`/`redo`/`clear`) are observed — direct calls keep
47
+ * `state` in sync.
48
+ */
43
49
  stack: UndoStack<T>;
44
50
  /** Reactive metadata: canUndo, canRedo, depth, index. */
45
51
  state: ShallowRef<UndoStackReactiveState>;
package/dist/undo.js CHANGED
@@ -1,3 +1,3 @@
1
- export { createUndoStack, useUndoStack } from './chunk-RLVG5JQH.js';
1
+ export { createUndoStack, useUndoStack } from './chunk-FG5USQSY.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.19",
3
+ "version": "0.2.21",
4
4
  "description": "Vue 3.5 adapter for Iris UI — full component set",
5
5
  "license": "MIT",
6
6
  "type": "module",