@fitin/vue 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.es.js CHANGED
@@ -142,10 +142,14 @@ var S = ["data-scope"], C = /* @__PURE__ */ n({
142
142
  class: i(r.class)
143
143
  }, [u(e.$slots, "default")], 14, S));
144
144
  }
145
- }), w = { install(e) {
145
+ });
146
+ //#endregion
147
+ //#region src/index.ts
148
+ function w(e) {
146
149
  e.component("FitinCanvas", v), e.component("FitinContainer", C);
147
- } };
150
+ }
151
+ var T = { install: w };
148
152
  //#endregion
149
- export { v as FitinCanvas, C as FitinContainer, w as plugin, b as useFitin, x as useFitinState };
153
+ export { v as FitinCanvas, C as FitinContainer, T as default, w as install, b as useFitin, x as useFitinState };
150
154
 
151
155
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","names":[],"sources":["../src/components/keys.ts","../src/components/logging.ts","../src/components/fitin-canvas.vue","../src/components/fitin-canvas.vue","../src/components/hooks.ts","../src/components/fitin-container.vue","../src/components/fitin-container.vue","../src/index.ts"],"sourcesContent":["import { type InjectionKey } from \"vue\";\r\nimport type { Observable } from \"rxjs\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\n\r\nexport const FitinCanvasKey: InjectionKey<\r\n Observable<IResizeEvent | undefined>\r\n> = Symbol(\"fitin-canvas\");\r\n\r\nexport const FitinContainerKey: InjectionKey<\r\n (\"affect-self\" | \"affect-descendant\")[]\r\n> = Symbol(\"fitin-container\");\r\n","export function logE(message: string): void {\r\n console.error(\"[@fitin/vue]\", message);\r\n}\r\nexport function logW(message: string): void {\r\n console.warn(\"[@fitin/vue]\", message);\r\n}\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n inject,\r\n provide,\r\n ref,\r\n watchEffect,\r\n type CSSProperties,\r\n} from \"vue\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { Fitin, type Mode, type IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey } from \"./keys\";\r\nimport { logE } from \"./logging\";\r\n\r\n/**\r\n * Vue SFC does not support TypeScript advanced types(e.g., Omit, Pick and Partial).\r\n * However, these are exactly the types that `FitinOptions` depends on.\r\n * Solution: declare the type from scratch (i.e. rewrite it explicitly without relying on utility types).\r\n */\r\ntype FitinCanvasProps = {\r\n designWidth: number; // physical design width of container\r\n designHeight: number; // physical design height of container\r\n mode?: Mode;\r\n minDesignWidth?: number; // minimum physical design width of container\r\n minDesignHeight?: number; // minimum physical design height of container\r\n wait?: number; // in ms\r\n computeScaleXY?: (\r\n designWidth: number,\r\n designHeight: number,\r\n scaleX: number,\r\n scaleY: number,\r\n ) => number;\r\n viewport?: HTMLElement | \"parent\";\r\n center?: boolean;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\nconst props = defineProps<FitinCanvasProps>();\r\n\r\nconst canvasRef = ref<HTMLElement>();\r\n\r\nconst canvasStyle = computed<CSSProperties>(() =>\r\n props.center\r\n ? {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n overflow: \"hidden\"\r\n }\r\n : {\r\n position: \"relative\",\r\n overflow: \"hidden\"\r\n },\r\n);\r\n\r\nlet fitin: Fitin;\r\nlet subject = new BehaviorSubject<IResizeEvent | undefined>(undefined);\r\nprovide(FitinCanvasKey, subject.asObservable());\r\nconst resizeObservable = inject(FitinCanvasKey);\r\n\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n logE(\"Nested fitin-canvas is forbidden\");\r\n return;\r\n }\r\n\r\n fitin = new Fitin(props);\r\n\r\n const handleResize = (event: IResizeEvent) => {\r\n if (event && canvasRef.value) {\r\n canvasRef.value.style.width = `${event.effectiveWidth}px`;\r\n canvasRef.value.style.height = `${event.effectiveHeight}px`;\r\n }\r\n subject.next(event);\r\n };\r\n\r\n const viewport =\r\n props.viewport === \"parent\"\r\n ? canvasRef.value?.parentElement\r\n : props.viewport;\r\n if (viewport) {\r\n fitin.subscribe(viewport, handleResize);\r\n } else {\r\n fitin.subscribe(handleResize);\r\n }\r\n\r\n onCleanup(() => {\r\n fitin.dispose();\r\n });\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n ref=\"canvasRef\"\r\n role=\"fitin-canvas\"\r\n :style=\"canvasStyle\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n inject,\r\n provide,\r\n ref,\r\n watchEffect,\r\n type CSSProperties,\r\n} from \"vue\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { Fitin, type Mode, type IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey } from \"./keys\";\r\nimport { logE } from \"./logging\";\r\n\r\n/**\r\n * Vue SFC does not support TypeScript advanced types(e.g., Omit, Pick and Partial).\r\n * However, these are exactly the types that `FitinOptions` depends on.\r\n * Solution: declare the type from scratch (i.e. rewrite it explicitly without relying on utility types).\r\n */\r\ntype FitinCanvasProps = {\r\n designWidth: number; // physical design width of container\r\n designHeight: number; // physical design height of container\r\n mode?: Mode;\r\n minDesignWidth?: number; // minimum physical design width of container\r\n minDesignHeight?: number; // minimum physical design height of container\r\n wait?: number; // in ms\r\n computeScaleXY?: (\r\n designWidth: number,\r\n designHeight: number,\r\n scaleX: number,\r\n scaleY: number,\r\n ) => number;\r\n viewport?: HTMLElement | \"parent\";\r\n center?: boolean;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\nconst props = defineProps<FitinCanvasProps>();\r\n\r\nconst canvasRef = ref<HTMLElement>();\r\n\r\nconst canvasStyle = computed<CSSProperties>(() =>\r\n props.center\r\n ? {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n overflow: \"hidden\"\r\n }\r\n : {\r\n position: \"relative\",\r\n overflow: \"hidden\"\r\n },\r\n);\r\n\r\nlet fitin: Fitin;\r\nlet subject = new BehaviorSubject<IResizeEvent | undefined>(undefined);\r\nprovide(FitinCanvasKey, subject.asObservable());\r\nconst resizeObservable = inject(FitinCanvasKey);\r\n\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n logE(\"Nested fitin-canvas is forbidden\");\r\n return;\r\n }\r\n\r\n fitin = new Fitin(props);\r\n\r\n const handleResize = (event: IResizeEvent) => {\r\n if (event && canvasRef.value) {\r\n canvasRef.value.style.width = `${event.effectiveWidth}px`;\r\n canvasRef.value.style.height = `${event.effectiveHeight}px`;\r\n }\r\n subject.next(event);\r\n };\r\n\r\n const viewport =\r\n props.viewport === \"parent\"\r\n ? canvasRef.value?.parentElement\r\n : props.viewport;\r\n if (viewport) {\r\n fitin.subscribe(viewport, handleResize);\r\n } else {\r\n fitin.subscribe(handleResize);\r\n }\r\n\r\n onCleanup(() => {\r\n fitin.dispose();\r\n });\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n ref=\"canvasRef\"\r\n role=\"fitin-canvas\"\r\n :style=\"canvasStyle\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","import { inject, provide, reactive, watchEffect } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey, FitinContainerKey } from \"./keys\";\r\nimport { logE, logW } from \"./logging\";\r\nimport type { Observable } from \"rxjs\";\r\n\r\nexport function provideFitinContainer(\r\n value: \"affect-self\" | \"affect-descendant\",\r\n) {\r\n const paths = inject(FitinContainerKey) || [];\r\n paths.push(value);\r\n provide(FitinContainerKey, paths);\r\n}\r\n\r\nexport function useFitin(\r\n resizeHandler?: (event: undefined | IResizeEvent) => void,\r\n): undefined | Observable<undefined | IResizeEvent> {\r\n const resizeObservable = inject(FitinCanvasKey);\r\n if (resizeObservable) {\r\n const paths = inject(FitinContainerKey) || [];\r\n if (paths.find((path) => path === \"affect-descendant\")) {\r\n logW(\"There's an ancestor fitin-container resizing all descendants\");\r\n }\r\n\r\n watchEffect((onCleanup) => {\r\n const subscription = resizeObservable.subscribe(resizeHandler);\r\n onCleanup(() => subscription.unsubscribe());\r\n });\r\n } else {\r\n logE(\"A fitin-container must be used within a fitin-canvas context\");\r\n }\r\n\r\n return resizeObservable;\r\n}\r\n\r\nexport function useFitinState() {\r\n const state = reactive<{\r\n scaleX: number;\r\n scaleY: number;\r\n scaleXY: number;\r\n effectiveWidth: undefined | number;\r\n effectiveHeight: undefined | number;\r\n }>({\r\n scaleX: 1,\r\n scaleY: 1,\r\n scaleXY: 1,\r\n effectiveWidth: undefined,\r\n effectiveHeight: undefined,\r\n });\r\n useFitin((event) => {\r\n if (event) {\r\n state.scaleX = event.scaleX;\r\n state.scaleY = event.scaleY;\r\n state.scaleXY = event.scaleXY;\r\n state.effectiveWidth = event.effectiveWidth;\r\n state.effectiveHeight = event.effectiveHeight;\r\n }\r\n });\r\n\r\n return state;\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { ref, watchEffect, computed, type CSSProperties } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { provideFitinContainer, useFitin } from \"./hooks\";\r\n\r\ntype FitinContainerProps = {\r\n designWidth: number;\r\n designHeight: number;\r\n transformOriginX?: \"left\" | \"center\" | \"right\";\r\n transformOriginY?: \"top\" | \"center\" | \"bottom\";\r\n style?: CSSProperties;\r\n class?: string;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps<FitinContainerProps>();\r\n\r\nconst affectScope = computed(() =>\r\n props.transformOriginX || props.transformOriginY\r\n ? \"affect-descendant\"\r\n : \"affect-self\",\r\n);\r\n\r\nprovideFitinContainer(affectScope.value);\r\n\r\nconst fitinStyle = ref<CSSProperties>({});\r\n\r\nfunction adjustContainer(event: IResizeEvent, props: FitinContainerProps) {\r\n if (props.transformOriginX || props.transformOriginY) {\r\n let transform: string;\r\n let transformOrigin: string;\r\n if (props.transformOriginX && props.transformOriginY) {\r\n const res = event.transformXY(\r\n props.transformOriginX,\r\n props.transformOriginY,\r\n );\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else if (props.transformOriginX) {\r\n const res = event.transformX(props.transformOriginX);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else {\r\n const res = event.transformY(props.transformOriginY!);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n }\r\n fitinStyle.value = {\r\n position: \"absolute\",\r\n width: `${props.designWidth}px`,\r\n height: `${props.designHeight}px`,\r\n transform: transform,\r\n transformOrigin: transformOrigin,\r\n };\r\n } else {\r\n fitinStyle.value = {\r\n width: `${event.scaleX * props.designWidth}px`,\r\n height: `${event.scaleY * props.designHeight}px`,\r\n };\r\n }\r\n}\r\n\r\nconst resizeObservable = useFitin();\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n const subscription = resizeObservable.subscribe(\r\n (event: IResizeEvent | undefined) => {\r\n if (event) {\r\n adjustContainer(event, props);\r\n }\r\n },\r\n );\r\n onCleanup(() => subscription.unsubscribe());\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n role=\"fitin-container\"\r\n :data-scope=\"affectScope\"\r\n :style=\"[props.style, fitinStyle]\"\r\n :class=\"props.class\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, watchEffect, computed, type CSSProperties } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { provideFitinContainer, useFitin } from \"./hooks\";\r\n\r\ntype FitinContainerProps = {\r\n designWidth: number;\r\n designHeight: number;\r\n transformOriginX?: \"left\" | \"center\" | \"right\";\r\n transformOriginY?: \"top\" | \"center\" | \"bottom\";\r\n style?: CSSProperties;\r\n class?: string;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps<FitinContainerProps>();\r\n\r\nconst affectScope = computed(() =>\r\n props.transformOriginX || props.transformOriginY\r\n ? \"affect-descendant\"\r\n : \"affect-self\",\r\n);\r\n\r\nprovideFitinContainer(affectScope.value);\r\n\r\nconst fitinStyle = ref<CSSProperties>({});\r\n\r\nfunction adjustContainer(event: IResizeEvent, props: FitinContainerProps) {\r\n if (props.transformOriginX || props.transformOriginY) {\r\n let transform: string;\r\n let transformOrigin: string;\r\n if (props.transformOriginX && props.transformOriginY) {\r\n const res = event.transformXY(\r\n props.transformOriginX,\r\n props.transformOriginY,\r\n );\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else if (props.transformOriginX) {\r\n const res = event.transformX(props.transformOriginX);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else {\r\n const res = event.transformY(props.transformOriginY!);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n }\r\n fitinStyle.value = {\r\n position: \"absolute\",\r\n width: `${props.designWidth}px`,\r\n height: `${props.designHeight}px`,\r\n transform: transform,\r\n transformOrigin: transformOrigin,\r\n };\r\n } else {\r\n fitinStyle.value = {\r\n width: `${event.scaleX * props.designWidth}px`,\r\n height: `${event.scaleY * props.designHeight}px`,\r\n };\r\n }\r\n}\r\n\r\nconst resizeObservable = useFitin();\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n const subscription = resizeObservable.subscribe(\r\n (event: IResizeEvent | undefined) => {\r\n if (event) {\r\n adjustContainer(event, props);\r\n }\r\n },\r\n );\r\n onCleanup(() => subscription.unsubscribe());\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n role=\"fitin-container\"\r\n :data-scope=\"affectScope\"\r\n :style=\"[props.style, fitinStyle]\"\r\n :class=\"props.class\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","import type { App, Plugin } from \"vue\";\r\nimport FitinCanvas from \"./components/fitin-canvas.vue\";\r\nimport FitinContainer from \"./components/fitin-container.vue\";\r\nexport { useFitin, useFitinState } from \"./components/hooks\";\r\n\r\nexport { FitinCanvas, FitinContainer };\r\nexport const plugin: Plugin = {\r\n install(app: App) {\r\n app.component(\"FitinCanvas\", FitinCanvas);\r\n app.component(\"FitinContainer\", FitinContainer);\r\n },\r\n};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","names":[],"sources":["../src/components/keys.ts","../src/components/logging.ts","../src/components/fitin-canvas.vue","../src/components/fitin-canvas.vue","../src/components/hooks.ts","../src/components/fitin-container.vue","../src/components/fitin-container.vue","../src/index.ts"],"sourcesContent":["import { type InjectionKey } from \"vue\";\r\nimport type { Observable } from \"rxjs\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\n\r\nexport const FitinCanvasKey: InjectionKey<\r\n Observable<IResizeEvent | undefined>\r\n> = Symbol(\"fitin-canvas\");\r\n\r\nexport const FitinContainerKey: InjectionKey<\r\n (\"affect-self\" | \"affect-descendant\")[]\r\n> = Symbol(\"fitin-container\");\r\n","export function logE(message: string): void {\r\n console.error(\"[@fitin/vue]\", message);\r\n}\r\nexport function logW(message: string): void {\r\n console.warn(\"[@fitin/vue]\", message);\r\n}\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n inject,\r\n provide,\r\n ref,\r\n watchEffect,\r\n type CSSProperties,\r\n} from \"vue\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { Fitin, type Mode, type IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey } from \"./keys\";\r\nimport { logE } from \"./logging\";\r\n\r\n/**\r\n * Vue SFC does not support TypeScript advanced types(e.g., Omit, Pick and Partial).\r\n * However, these are exactly the types that `FitinOptions` depends on.\r\n * Solution: declare the type from scratch (i.e. rewrite it explicitly without relying on utility types).\r\n */\r\ntype FitinCanvasProps = {\r\n designWidth: number; // physical design width of container\r\n designHeight: number; // physical design height of container\r\n mode?: Mode;\r\n minDesignWidth?: number; // minimum physical design width of container\r\n minDesignHeight?: number; // minimum physical design height of container\r\n wait?: number; // in ms\r\n computeScaleXY?: (\r\n designWidth: number,\r\n designHeight: number,\r\n scaleX: number,\r\n scaleY: number,\r\n ) => number;\r\n viewport?: HTMLElement | \"parent\";\r\n center?: boolean;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\nconst props = defineProps<FitinCanvasProps>();\r\n\r\nconst canvasRef = ref<HTMLElement>();\r\n\r\nconst canvasStyle = computed<CSSProperties>(() =>\r\n props.center\r\n ? {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n overflow: \"hidden\"\r\n }\r\n : {\r\n position: \"relative\",\r\n overflow: \"hidden\"\r\n },\r\n);\r\n\r\nlet fitin: Fitin;\r\nlet subject = new BehaviorSubject<IResizeEvent | undefined>(undefined);\r\nprovide(FitinCanvasKey, subject.asObservable());\r\nconst resizeObservable = inject(FitinCanvasKey);\r\n\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n logE(\"Nested fitin-canvas is forbidden\");\r\n return;\r\n }\r\n\r\n fitin = new Fitin(props);\r\n\r\n const handleResize = (event: IResizeEvent) => {\r\n if (event && canvasRef.value) {\r\n canvasRef.value.style.width = `${event.effectiveWidth}px`;\r\n canvasRef.value.style.height = `${event.effectiveHeight}px`;\r\n }\r\n subject.next(event);\r\n };\r\n\r\n const viewport =\r\n props.viewport === \"parent\"\r\n ? canvasRef.value?.parentElement\r\n : props.viewport;\r\n if (viewport) {\r\n fitin.subscribe(viewport, handleResize);\r\n } else {\r\n fitin.subscribe(handleResize);\r\n }\r\n\r\n onCleanup(() => {\r\n fitin.dispose();\r\n });\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n ref=\"canvasRef\"\r\n role=\"fitin-canvas\"\r\n :style=\"canvasStyle\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n inject,\r\n provide,\r\n ref,\r\n watchEffect,\r\n type CSSProperties,\r\n} from \"vue\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { Fitin, type Mode, type IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey } from \"./keys\";\r\nimport { logE } from \"./logging\";\r\n\r\n/**\r\n * Vue SFC does not support TypeScript advanced types(e.g., Omit, Pick and Partial).\r\n * However, these are exactly the types that `FitinOptions` depends on.\r\n * Solution: declare the type from scratch (i.e. rewrite it explicitly without relying on utility types).\r\n */\r\ntype FitinCanvasProps = {\r\n designWidth: number; // physical design width of container\r\n designHeight: number; // physical design height of container\r\n mode?: Mode;\r\n minDesignWidth?: number; // minimum physical design width of container\r\n minDesignHeight?: number; // minimum physical design height of container\r\n wait?: number; // in ms\r\n computeScaleXY?: (\r\n designWidth: number,\r\n designHeight: number,\r\n scaleX: number,\r\n scaleY: number,\r\n ) => number;\r\n viewport?: HTMLElement | \"parent\";\r\n center?: boolean;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\nconst props = defineProps<FitinCanvasProps>();\r\n\r\nconst canvasRef = ref<HTMLElement>();\r\n\r\nconst canvasStyle = computed<CSSProperties>(() =>\r\n props.center\r\n ? {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n overflow: \"hidden\"\r\n }\r\n : {\r\n position: \"relative\",\r\n overflow: \"hidden\"\r\n },\r\n);\r\n\r\nlet fitin: Fitin;\r\nlet subject = new BehaviorSubject<IResizeEvent | undefined>(undefined);\r\nprovide(FitinCanvasKey, subject.asObservable());\r\nconst resizeObservable = inject(FitinCanvasKey);\r\n\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n logE(\"Nested fitin-canvas is forbidden\");\r\n return;\r\n }\r\n\r\n fitin = new Fitin(props);\r\n\r\n const handleResize = (event: IResizeEvent) => {\r\n if (event && canvasRef.value) {\r\n canvasRef.value.style.width = `${event.effectiveWidth}px`;\r\n canvasRef.value.style.height = `${event.effectiveHeight}px`;\r\n }\r\n subject.next(event);\r\n };\r\n\r\n const viewport =\r\n props.viewport === \"parent\"\r\n ? canvasRef.value?.parentElement\r\n : props.viewport;\r\n if (viewport) {\r\n fitin.subscribe(viewport, handleResize);\r\n } else {\r\n fitin.subscribe(handleResize);\r\n }\r\n\r\n onCleanup(() => {\r\n fitin.dispose();\r\n });\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n ref=\"canvasRef\"\r\n role=\"fitin-canvas\"\r\n :style=\"canvasStyle\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","import { inject, provide, reactive, watchEffect } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey, FitinContainerKey } from \"./keys\";\r\nimport { logE, logW } from \"./logging\";\r\nimport type { Observable } from \"rxjs\";\r\n\r\nexport function provideFitinContainer(\r\n value: \"affect-self\" | \"affect-descendant\",\r\n) {\r\n const paths = inject(FitinContainerKey) || [];\r\n paths.push(value);\r\n provide(FitinContainerKey, paths);\r\n}\r\n\r\nexport function useFitin(\r\n resizeHandler?: (event: undefined | IResizeEvent) => void,\r\n): undefined | Observable<undefined | IResizeEvent> {\r\n const resizeObservable = inject(FitinCanvasKey);\r\n if (resizeObservable) {\r\n const paths = inject(FitinContainerKey) || [];\r\n if (paths.find((path) => path === \"affect-descendant\")) {\r\n logW(\"There's an ancestor fitin-container resizing all descendants\");\r\n }\r\n\r\n watchEffect((onCleanup) => {\r\n const subscription = resizeObservable.subscribe(resizeHandler);\r\n onCleanup(() => subscription.unsubscribe());\r\n });\r\n } else {\r\n logE(\"A fitin-container must be used within a fitin-canvas context\");\r\n }\r\n\r\n return resizeObservable;\r\n}\r\n\r\nexport function useFitinState() {\r\n const state = reactive<{\r\n scaleX: number;\r\n scaleY: number;\r\n scaleXY: number;\r\n effectiveWidth: undefined | number;\r\n effectiveHeight: undefined | number;\r\n }>({\r\n scaleX: 1,\r\n scaleY: 1,\r\n scaleXY: 1,\r\n effectiveWidth: undefined,\r\n effectiveHeight: undefined,\r\n });\r\n useFitin((event) => {\r\n if (event) {\r\n state.scaleX = event.scaleX;\r\n state.scaleY = event.scaleY;\r\n state.scaleXY = event.scaleXY;\r\n state.effectiveWidth = event.effectiveWidth;\r\n state.effectiveHeight = event.effectiveHeight;\r\n }\r\n });\r\n\r\n return state;\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { ref, watchEffect, computed, type CSSProperties } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { provideFitinContainer, useFitin } from \"./hooks\";\r\n\r\ntype FitinContainerProps = {\r\n designWidth: number;\r\n designHeight: number;\r\n transformOriginX?: \"left\" | \"center\" | \"right\";\r\n transformOriginY?: \"top\" | \"center\" | \"bottom\";\r\n style?: CSSProperties;\r\n class?: string;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps<FitinContainerProps>();\r\n\r\nconst affectScope = computed(() =>\r\n props.transformOriginX || props.transformOriginY\r\n ? \"affect-descendant\"\r\n : \"affect-self\",\r\n);\r\n\r\nprovideFitinContainer(affectScope.value);\r\n\r\nconst fitinStyle = ref<CSSProperties>({});\r\n\r\nfunction adjustContainer(event: IResizeEvent, props: FitinContainerProps) {\r\n if (props.transformOriginX || props.transformOriginY) {\r\n let transform: string;\r\n let transformOrigin: string;\r\n if (props.transformOriginX && props.transformOriginY) {\r\n const res = event.transformXY(\r\n props.transformOriginX,\r\n props.transformOriginY,\r\n );\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else if (props.transformOriginX) {\r\n const res = event.transformX(props.transformOriginX);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else {\r\n const res = event.transformY(props.transformOriginY!);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n }\r\n fitinStyle.value = {\r\n position: \"absolute\",\r\n width: `${props.designWidth}px`,\r\n height: `${props.designHeight}px`,\r\n transform: transform,\r\n transformOrigin: transformOrigin,\r\n };\r\n } else {\r\n fitinStyle.value = {\r\n width: `${event.scaleX * props.designWidth}px`,\r\n height: `${event.scaleY * props.designHeight}px`,\r\n };\r\n }\r\n}\r\n\r\nconst resizeObservable = useFitin();\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n const subscription = resizeObservable.subscribe(\r\n (event: IResizeEvent | undefined) => {\r\n if (event) {\r\n adjustContainer(event, props);\r\n }\r\n },\r\n );\r\n onCleanup(() => subscription.unsubscribe());\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n role=\"fitin-container\"\r\n :data-scope=\"affectScope\"\r\n :style=\"[props.style, fitinStyle]\"\r\n :class=\"props.class\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, watchEffect, computed, type CSSProperties } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { provideFitinContainer, useFitin } from \"./hooks\";\r\n\r\ntype FitinContainerProps = {\r\n designWidth: number;\r\n designHeight: number;\r\n transformOriginX?: \"left\" | \"center\" | \"right\";\r\n transformOriginY?: \"top\" | \"center\" | \"bottom\";\r\n style?: CSSProperties;\r\n class?: string;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps<FitinContainerProps>();\r\n\r\nconst affectScope = computed(() =>\r\n props.transformOriginX || props.transformOriginY\r\n ? \"affect-descendant\"\r\n : \"affect-self\",\r\n);\r\n\r\nprovideFitinContainer(affectScope.value);\r\n\r\nconst fitinStyle = ref<CSSProperties>({});\r\n\r\nfunction adjustContainer(event: IResizeEvent, props: FitinContainerProps) {\r\n if (props.transformOriginX || props.transformOriginY) {\r\n let transform: string;\r\n let transformOrigin: string;\r\n if (props.transformOriginX && props.transformOriginY) {\r\n const res = event.transformXY(\r\n props.transformOriginX,\r\n props.transformOriginY,\r\n );\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else if (props.transformOriginX) {\r\n const res = event.transformX(props.transformOriginX);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else {\r\n const res = event.transformY(props.transformOriginY!);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n }\r\n fitinStyle.value = {\r\n position: \"absolute\",\r\n width: `${props.designWidth}px`,\r\n height: `${props.designHeight}px`,\r\n transform: transform,\r\n transformOrigin: transformOrigin,\r\n };\r\n } else {\r\n fitinStyle.value = {\r\n width: `${event.scaleX * props.designWidth}px`,\r\n height: `${event.scaleY * props.designHeight}px`,\r\n };\r\n }\r\n}\r\n\r\nconst resizeObservable = useFitin();\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n const subscription = resizeObservable.subscribe(\r\n (event: IResizeEvent | undefined) => {\r\n if (event) {\r\n adjustContainer(event, props);\r\n }\r\n },\r\n );\r\n onCleanup(() => subscription.unsubscribe());\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n role=\"fitin-container\"\r\n :data-scope=\"affectScope\"\r\n :style=\"[props.style, fitinStyle]\"\r\n :class=\"props.class\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","import type { App, Plugin } from \"vue\";\r\nimport FitinCanvas from \"./components/fitin-canvas.vue\";\r\nimport FitinContainer from \"./components/fitin-container.vue\";\r\nexport { useFitin, useFitinState } from \"./components/hooks\";\r\nimport \"./types.ts\";\r\n\r\nexport { FitinCanvas, FitinContainer };\r\nexport function install(app: App) {\r\n app.component(\"FitinCanvas\", FitinCanvas);\r\n app.component(\"FitinContainer\", FitinContainer);\r\n}\r\nexport default { install } as Plugin;\r\n"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("vue"),require("rxjs"),require("@fitin/core")):typeof define==`function`&&define.amd?define([`exports`,`vue`,`rxjs`,`@fitin/core`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.Fitin={},e.Vue,e.rxjs,e.FitinCore))})(this,function(e,t,n,r){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var i=Symbol(`fitin-canvas`),a=Symbol(`fitin-container`);function o(e){console.error(`[@fitin/vue]`,e)}function s(e){console.warn(`[@fitin/vue]`,e)}var c=(0,t.defineComponent)({inheritAttrs:!1,__name:`fitin-canvas`,props:{designWidth:{},designHeight:{},mode:{},minDesignWidth:{},minDesignHeight:{},wait:{},computeScaleXY:{type:Function},viewport:{},center:{type:Boolean}},setup(e){let a=e,s=(0,t.ref)(),c=(0,t.computed)(()=>a.center?{position:`absolute`,top:`50%`,left:`50%`,transform:`translate(-50%, -50%)`,overflow:`hidden`}:{position:`relative`,overflow:`hidden`}),l,u=new n.BehaviorSubject(void 0);(0,t.provide)(i,u.asObservable());let d=(0,t.inject)(i);return(0,t.watchEffect)(e=>{if(d){o(`Nested fitin-canvas is forbidden`);return}l=new r.Fitin(a);let t=e=>{e&&s.value&&(s.value.style.width=`${e.effectiveWidth}px`,s.value.style.height=`${e.effectiveHeight}px`),u.next(e)},n=a.viewport===`parent`?s.value?.parentElement:a.viewport;n?l.subscribe(n,t):l.subscribe(t),e(()=>{l.dispose()})}),(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`section`,{ref_key:`canvasRef`,ref:s,role:`fitin-canvas`,style:(0,t.normalizeStyle)(c.value)},[(0,t.renderSlot)(e.$slots,`default`)],4))}});function l(e){let n=(0,t.inject)(a)||[];n.push(e),(0,t.provide)(a,n)}function u(e){let n=(0,t.inject)(i);return n?(((0,t.inject)(a)||[]).find(e=>e===`affect-descendant`)&&s(`There's an ancestor fitin-container resizing all descendants`),(0,t.watchEffect)(t=>{let r=n.subscribe(e);t(()=>r.unsubscribe())})):o(`A fitin-container must be used within a fitin-canvas context`),n}function d(){let e=(0,t.reactive)({scaleX:1,scaleY:1,scaleXY:1,effectiveWidth:void 0,effectiveHeight:void 0});return u(t=>{t&&(e.scaleX=t.scaleX,e.scaleY=t.scaleY,e.scaleXY=t.scaleXY,e.effectiveWidth=t.effectiveWidth,e.effectiveHeight=t.effectiveHeight)}),e}var f=[`data-scope`],p=(0,t.defineComponent)({inheritAttrs:!1,__name:`fitin-container`,props:{designWidth:{},designHeight:{},transformOriginX:{},transformOriginY:{},style:{},class:{}},setup(e){let n=e,r=(0,t.computed)(()=>n.transformOriginX||n.transformOriginY?`affect-descendant`:`affect-self`);l(r.value);let i=(0,t.ref)({});function a(e,t){if(t.transformOriginX||t.transformOriginY){let n,r;if(t.transformOriginX&&t.transformOriginY){let i=e.transformXY(t.transformOriginX,t.transformOriginY);n=i.transform,r=i.transformOrigin}else if(t.transformOriginX){let i=e.transformX(t.transformOriginX);n=i.transform,r=i.transformOrigin}else{let i=e.transformY(t.transformOriginY);n=i.transform,r=i.transformOrigin}i.value={position:`absolute`,width:`${t.designWidth}px`,height:`${t.designHeight}px`,transform:n,transformOrigin:r}}else i.value={width:`${e.scaleX*t.designWidth}px`,height:`${e.scaleY*t.designHeight}px`}}let o=u();return(0,t.watchEffect)(e=>{if(o){let t=o.subscribe(e=>{e&&a(e,n)});e(()=>t.unsubscribe())}}),(e,a)=>((0,t.openBlock)(),(0,t.createElementBlock)(`section`,{role:`fitin-container`,"data-scope":r.value,style:(0,t.normalizeStyle)([n.style,i.value]),class:(0,t.normalizeClass)(n.class)},[(0,t.renderSlot)(e.$slots,`default`)],14,f))}});e.FitinCanvas=c,e.FitinContainer=p,e.plugin={install(e){e.component(`FitinCanvas`,c),e.component(`FitinContainer`,p)}},e.useFitin=u,e.useFitinState=d});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("vue"),require("rxjs"),require("@fitin/core")):typeof define==`function`&&define.amd?define([`exports`,`vue`,`rxjs`,`@fitin/core`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.Fitin={},e.Vue,e.rxjs,e.FitinCore))})(this,function(e,t,n,r){Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var i=Symbol(`fitin-canvas`),a=Symbol(`fitin-container`);function o(e){console.error(`[@fitin/vue]`,e)}function s(e){console.warn(`[@fitin/vue]`,e)}var c=(0,t.defineComponent)({inheritAttrs:!1,__name:`fitin-canvas`,props:{designWidth:{},designHeight:{},mode:{},minDesignWidth:{},minDesignHeight:{},wait:{},computeScaleXY:{type:Function},viewport:{},center:{type:Boolean}},setup(e){let a=e,s=(0,t.ref)(),c=(0,t.computed)(()=>a.center?{position:`absolute`,top:`50%`,left:`50%`,transform:`translate(-50%, -50%)`,overflow:`hidden`}:{position:`relative`,overflow:`hidden`}),l,u=new n.BehaviorSubject(void 0);(0,t.provide)(i,u.asObservable());let d=(0,t.inject)(i);return(0,t.watchEffect)(e=>{if(d){o(`Nested fitin-canvas is forbidden`);return}l=new r.Fitin(a);let t=e=>{e&&s.value&&(s.value.style.width=`${e.effectiveWidth}px`,s.value.style.height=`${e.effectiveHeight}px`),u.next(e)},n=a.viewport===`parent`?s.value?.parentElement:a.viewport;n?l.subscribe(n,t):l.subscribe(t),e(()=>{l.dispose()})}),(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`section`,{ref_key:`canvasRef`,ref:s,role:`fitin-canvas`,style:(0,t.normalizeStyle)(c.value)},[(0,t.renderSlot)(e.$slots,`default`)],4))}});function l(e){let n=(0,t.inject)(a)||[];n.push(e),(0,t.provide)(a,n)}function u(e){let n=(0,t.inject)(i);return n?(((0,t.inject)(a)||[]).find(e=>e===`affect-descendant`)&&s(`There's an ancestor fitin-container resizing all descendants`),(0,t.watchEffect)(t=>{let r=n.subscribe(e);t(()=>r.unsubscribe())})):o(`A fitin-container must be used within a fitin-canvas context`),n}function d(){let e=(0,t.reactive)({scaleX:1,scaleY:1,scaleXY:1,effectiveWidth:void 0,effectiveHeight:void 0});return u(t=>{t&&(e.scaleX=t.scaleX,e.scaleY=t.scaleY,e.scaleXY=t.scaleXY,e.effectiveWidth=t.effectiveWidth,e.effectiveHeight=t.effectiveHeight)}),e}var f=[`data-scope`],p=(0,t.defineComponent)({inheritAttrs:!1,__name:`fitin-container`,props:{designWidth:{},designHeight:{},transformOriginX:{},transformOriginY:{},style:{},class:{}},setup(e){let n=e,r=(0,t.computed)(()=>n.transformOriginX||n.transformOriginY?`affect-descendant`:`affect-self`);l(r.value);let i=(0,t.ref)({});function a(e,t){if(t.transformOriginX||t.transformOriginY){let n,r;if(t.transformOriginX&&t.transformOriginY){let i=e.transformXY(t.transformOriginX,t.transformOriginY);n=i.transform,r=i.transformOrigin}else if(t.transformOriginX){let i=e.transformX(t.transformOriginX);n=i.transform,r=i.transformOrigin}else{let i=e.transformY(t.transformOriginY);n=i.transform,r=i.transformOrigin}i.value={position:`absolute`,width:`${t.designWidth}px`,height:`${t.designHeight}px`,transform:n,transformOrigin:r}}else i.value={width:`${e.scaleX*t.designWidth}px`,height:`${e.scaleY*t.designHeight}px`}}let o=u();return(0,t.watchEffect)(e=>{if(o){let t=o.subscribe(e=>{e&&a(e,n)});e(()=>t.unsubscribe())}}),(e,a)=>((0,t.openBlock)(),(0,t.createElementBlock)(`section`,{role:`fitin-container`,"data-scope":r.value,style:(0,t.normalizeStyle)([n.style,i.value]),class:(0,t.normalizeClass)(n.class)},[(0,t.renderSlot)(e.$slots,`default`)],14,f))}});function m(e){e.component(`FitinCanvas`,c),e.component(`FitinContainer`,p)}var h={install:m};e.FitinCanvas=c,e.FitinContainer=p,e.default=h,e.install=m,e.useFitin=u,e.useFitinState=d});
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","names":[],"sources":["../src/components/keys.ts","../src/components/logging.ts","../src/components/fitin-canvas.vue","../src/components/fitin-canvas.vue","../src/components/hooks.ts","../src/components/fitin-container.vue","../src/components/fitin-container.vue","../src/index.ts"],"sourcesContent":["import { type InjectionKey } from \"vue\";\r\nimport type { Observable } from \"rxjs\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\n\r\nexport const FitinCanvasKey: InjectionKey<\r\n Observable<IResizeEvent | undefined>\r\n> = Symbol(\"fitin-canvas\");\r\n\r\nexport const FitinContainerKey: InjectionKey<\r\n (\"affect-self\" | \"affect-descendant\")[]\r\n> = Symbol(\"fitin-container\");\r\n","export function logE(message: string): void {\r\n console.error(\"[@fitin/vue]\", message);\r\n}\r\nexport function logW(message: string): void {\r\n console.warn(\"[@fitin/vue]\", message);\r\n}\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n inject,\r\n provide,\r\n ref,\r\n watchEffect,\r\n type CSSProperties,\r\n} from \"vue\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { Fitin, type Mode, type IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey } from \"./keys\";\r\nimport { logE } from \"./logging\";\r\n\r\n/**\r\n * Vue SFC does not support TypeScript advanced types(e.g., Omit, Pick and Partial).\r\n * However, these are exactly the types that `FitinOptions` depends on.\r\n * Solution: declare the type from scratch (i.e. rewrite it explicitly without relying on utility types).\r\n */\r\ntype FitinCanvasProps = {\r\n designWidth: number; // physical design width of container\r\n designHeight: number; // physical design height of container\r\n mode?: Mode;\r\n minDesignWidth?: number; // minimum physical design width of container\r\n minDesignHeight?: number; // minimum physical design height of container\r\n wait?: number; // in ms\r\n computeScaleXY?: (\r\n designWidth: number,\r\n designHeight: number,\r\n scaleX: number,\r\n scaleY: number,\r\n ) => number;\r\n viewport?: HTMLElement | \"parent\";\r\n center?: boolean;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\nconst props = defineProps<FitinCanvasProps>();\r\n\r\nconst canvasRef = ref<HTMLElement>();\r\n\r\nconst canvasStyle = computed<CSSProperties>(() =>\r\n props.center\r\n ? {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n overflow: \"hidden\"\r\n }\r\n : {\r\n position: \"relative\",\r\n overflow: \"hidden\"\r\n },\r\n);\r\n\r\nlet fitin: Fitin;\r\nlet subject = new BehaviorSubject<IResizeEvent | undefined>(undefined);\r\nprovide(FitinCanvasKey, subject.asObservable());\r\nconst resizeObservable = inject(FitinCanvasKey);\r\n\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n logE(\"Nested fitin-canvas is forbidden\");\r\n return;\r\n }\r\n\r\n fitin = new Fitin(props);\r\n\r\n const handleResize = (event: IResizeEvent) => {\r\n if (event && canvasRef.value) {\r\n canvasRef.value.style.width = `${event.effectiveWidth}px`;\r\n canvasRef.value.style.height = `${event.effectiveHeight}px`;\r\n }\r\n subject.next(event);\r\n };\r\n\r\n const viewport =\r\n props.viewport === \"parent\"\r\n ? canvasRef.value?.parentElement\r\n : props.viewport;\r\n if (viewport) {\r\n fitin.subscribe(viewport, handleResize);\r\n } else {\r\n fitin.subscribe(handleResize);\r\n }\r\n\r\n onCleanup(() => {\r\n fitin.dispose();\r\n });\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n ref=\"canvasRef\"\r\n role=\"fitin-canvas\"\r\n :style=\"canvasStyle\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n inject,\r\n provide,\r\n ref,\r\n watchEffect,\r\n type CSSProperties,\r\n} from \"vue\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { Fitin, type Mode, type IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey } from \"./keys\";\r\nimport { logE } from \"./logging\";\r\n\r\n/**\r\n * Vue SFC does not support TypeScript advanced types(e.g., Omit, Pick and Partial).\r\n * However, these are exactly the types that `FitinOptions` depends on.\r\n * Solution: declare the type from scratch (i.e. rewrite it explicitly without relying on utility types).\r\n */\r\ntype FitinCanvasProps = {\r\n designWidth: number; // physical design width of container\r\n designHeight: number; // physical design height of container\r\n mode?: Mode;\r\n minDesignWidth?: number; // minimum physical design width of container\r\n minDesignHeight?: number; // minimum physical design height of container\r\n wait?: number; // in ms\r\n computeScaleXY?: (\r\n designWidth: number,\r\n designHeight: number,\r\n scaleX: number,\r\n scaleY: number,\r\n ) => number;\r\n viewport?: HTMLElement | \"parent\";\r\n center?: boolean;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\nconst props = defineProps<FitinCanvasProps>();\r\n\r\nconst canvasRef = ref<HTMLElement>();\r\n\r\nconst canvasStyle = computed<CSSProperties>(() =>\r\n props.center\r\n ? {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n overflow: \"hidden\"\r\n }\r\n : {\r\n position: \"relative\",\r\n overflow: \"hidden\"\r\n },\r\n);\r\n\r\nlet fitin: Fitin;\r\nlet subject = new BehaviorSubject<IResizeEvent | undefined>(undefined);\r\nprovide(FitinCanvasKey, subject.asObservable());\r\nconst resizeObservable = inject(FitinCanvasKey);\r\n\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n logE(\"Nested fitin-canvas is forbidden\");\r\n return;\r\n }\r\n\r\n fitin = new Fitin(props);\r\n\r\n const handleResize = (event: IResizeEvent) => {\r\n if (event && canvasRef.value) {\r\n canvasRef.value.style.width = `${event.effectiveWidth}px`;\r\n canvasRef.value.style.height = `${event.effectiveHeight}px`;\r\n }\r\n subject.next(event);\r\n };\r\n\r\n const viewport =\r\n props.viewport === \"parent\"\r\n ? canvasRef.value?.parentElement\r\n : props.viewport;\r\n if (viewport) {\r\n fitin.subscribe(viewport, handleResize);\r\n } else {\r\n fitin.subscribe(handleResize);\r\n }\r\n\r\n onCleanup(() => {\r\n fitin.dispose();\r\n });\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n ref=\"canvasRef\"\r\n role=\"fitin-canvas\"\r\n :style=\"canvasStyle\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","import { inject, provide, reactive, watchEffect } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey, FitinContainerKey } from \"./keys\";\r\nimport { logE, logW } from \"./logging\";\r\nimport type { Observable } from \"rxjs\";\r\n\r\nexport function provideFitinContainer(\r\n value: \"affect-self\" | \"affect-descendant\",\r\n) {\r\n const paths = inject(FitinContainerKey) || [];\r\n paths.push(value);\r\n provide(FitinContainerKey, paths);\r\n}\r\n\r\nexport function useFitin(\r\n resizeHandler?: (event: undefined | IResizeEvent) => void,\r\n): undefined | Observable<undefined | IResizeEvent> {\r\n const resizeObservable = inject(FitinCanvasKey);\r\n if (resizeObservable) {\r\n const paths = inject(FitinContainerKey) || [];\r\n if (paths.find((path) => path === \"affect-descendant\")) {\r\n logW(\"There's an ancestor fitin-container resizing all descendants\");\r\n }\r\n\r\n watchEffect((onCleanup) => {\r\n const subscription = resizeObservable.subscribe(resizeHandler);\r\n onCleanup(() => subscription.unsubscribe());\r\n });\r\n } else {\r\n logE(\"A fitin-container must be used within a fitin-canvas context\");\r\n }\r\n\r\n return resizeObservable;\r\n}\r\n\r\nexport function useFitinState() {\r\n const state = reactive<{\r\n scaleX: number;\r\n scaleY: number;\r\n scaleXY: number;\r\n effectiveWidth: undefined | number;\r\n effectiveHeight: undefined | number;\r\n }>({\r\n scaleX: 1,\r\n scaleY: 1,\r\n scaleXY: 1,\r\n effectiveWidth: undefined,\r\n effectiveHeight: undefined,\r\n });\r\n useFitin((event) => {\r\n if (event) {\r\n state.scaleX = event.scaleX;\r\n state.scaleY = event.scaleY;\r\n state.scaleXY = event.scaleXY;\r\n state.effectiveWidth = event.effectiveWidth;\r\n state.effectiveHeight = event.effectiveHeight;\r\n }\r\n });\r\n\r\n return state;\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { ref, watchEffect, computed, type CSSProperties } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { provideFitinContainer, useFitin } from \"./hooks\";\r\n\r\ntype FitinContainerProps = {\r\n designWidth: number;\r\n designHeight: number;\r\n transformOriginX?: \"left\" | \"center\" | \"right\";\r\n transformOriginY?: \"top\" | \"center\" | \"bottom\";\r\n style?: CSSProperties;\r\n class?: string;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps<FitinContainerProps>();\r\n\r\nconst affectScope = computed(() =>\r\n props.transformOriginX || props.transformOriginY\r\n ? \"affect-descendant\"\r\n : \"affect-self\",\r\n);\r\n\r\nprovideFitinContainer(affectScope.value);\r\n\r\nconst fitinStyle = ref<CSSProperties>({});\r\n\r\nfunction adjustContainer(event: IResizeEvent, props: FitinContainerProps) {\r\n if (props.transformOriginX || props.transformOriginY) {\r\n let transform: string;\r\n let transformOrigin: string;\r\n if (props.transformOriginX && props.transformOriginY) {\r\n const res = event.transformXY(\r\n props.transformOriginX,\r\n props.transformOriginY,\r\n );\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else if (props.transformOriginX) {\r\n const res = event.transformX(props.transformOriginX);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else {\r\n const res = event.transformY(props.transformOriginY!);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n }\r\n fitinStyle.value = {\r\n position: \"absolute\",\r\n width: `${props.designWidth}px`,\r\n height: `${props.designHeight}px`,\r\n transform: transform,\r\n transformOrigin: transformOrigin,\r\n };\r\n } else {\r\n fitinStyle.value = {\r\n width: `${event.scaleX * props.designWidth}px`,\r\n height: `${event.scaleY * props.designHeight}px`,\r\n };\r\n }\r\n}\r\n\r\nconst resizeObservable = useFitin();\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n const subscription = resizeObservable.subscribe(\r\n (event: IResizeEvent | undefined) => {\r\n if (event) {\r\n adjustContainer(event, props);\r\n }\r\n },\r\n );\r\n onCleanup(() => subscription.unsubscribe());\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n role=\"fitin-container\"\r\n :data-scope=\"affectScope\"\r\n :style=\"[props.style, fitinStyle]\"\r\n :class=\"props.class\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, watchEffect, computed, type CSSProperties } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { provideFitinContainer, useFitin } from \"./hooks\";\r\n\r\ntype FitinContainerProps = {\r\n designWidth: number;\r\n designHeight: number;\r\n transformOriginX?: \"left\" | \"center\" | \"right\";\r\n transformOriginY?: \"top\" | \"center\" | \"bottom\";\r\n style?: CSSProperties;\r\n class?: string;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps<FitinContainerProps>();\r\n\r\nconst affectScope = computed(() =>\r\n props.transformOriginX || props.transformOriginY\r\n ? \"affect-descendant\"\r\n : \"affect-self\",\r\n);\r\n\r\nprovideFitinContainer(affectScope.value);\r\n\r\nconst fitinStyle = ref<CSSProperties>({});\r\n\r\nfunction adjustContainer(event: IResizeEvent, props: FitinContainerProps) {\r\n if (props.transformOriginX || props.transformOriginY) {\r\n let transform: string;\r\n let transformOrigin: string;\r\n if (props.transformOriginX && props.transformOriginY) {\r\n const res = event.transformXY(\r\n props.transformOriginX,\r\n props.transformOriginY,\r\n );\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else if (props.transformOriginX) {\r\n const res = event.transformX(props.transformOriginX);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else {\r\n const res = event.transformY(props.transformOriginY!);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n }\r\n fitinStyle.value = {\r\n position: \"absolute\",\r\n width: `${props.designWidth}px`,\r\n height: `${props.designHeight}px`,\r\n transform: transform,\r\n transformOrigin: transformOrigin,\r\n };\r\n } else {\r\n fitinStyle.value = {\r\n width: `${event.scaleX * props.designWidth}px`,\r\n height: `${event.scaleY * props.designHeight}px`,\r\n };\r\n }\r\n}\r\n\r\nconst resizeObservable = useFitin();\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n const subscription = resizeObservable.subscribe(\r\n (event: IResizeEvent | undefined) => {\r\n if (event) {\r\n adjustContainer(event, props);\r\n }\r\n },\r\n );\r\n onCleanup(() => subscription.unsubscribe());\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n role=\"fitin-container\"\r\n :data-scope=\"affectScope\"\r\n :style=\"[props.style, fitinStyle]\"\r\n :class=\"props.class\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","import type { App, Plugin } from \"vue\";\r\nimport FitinCanvas from \"./components/fitin-canvas.vue\";\r\nimport FitinContainer from \"./components/fitin-container.vue\";\r\nexport { useFitin, useFitinState } from \"./components/hooks\";\r\n\r\nexport { FitinCanvas, FitinContainer };\r\nexport const plugin: Plugin = {\r\n install(app: App) {\r\n app.component(\"FitinCanvas\", FitinCanvas);\r\n app.component(\"FitinContainer\", FitinContainer);\r\n },\r\n};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","names":[],"sources":["../src/components/keys.ts","../src/components/logging.ts","../src/components/fitin-canvas.vue","../src/components/fitin-canvas.vue","../src/components/hooks.ts","../src/components/fitin-container.vue","../src/components/fitin-container.vue","../src/index.ts"],"sourcesContent":["import { type InjectionKey } from \"vue\";\r\nimport type { Observable } from \"rxjs\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\n\r\nexport const FitinCanvasKey: InjectionKey<\r\n Observable<IResizeEvent | undefined>\r\n> = Symbol(\"fitin-canvas\");\r\n\r\nexport const FitinContainerKey: InjectionKey<\r\n (\"affect-self\" | \"affect-descendant\")[]\r\n> = Symbol(\"fitin-container\");\r\n","export function logE(message: string): void {\r\n console.error(\"[@fitin/vue]\", message);\r\n}\r\nexport function logW(message: string): void {\r\n console.warn(\"[@fitin/vue]\", message);\r\n}\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n inject,\r\n provide,\r\n ref,\r\n watchEffect,\r\n type CSSProperties,\r\n} from \"vue\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { Fitin, type Mode, type IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey } from \"./keys\";\r\nimport { logE } from \"./logging\";\r\n\r\n/**\r\n * Vue SFC does not support TypeScript advanced types(e.g., Omit, Pick and Partial).\r\n * However, these are exactly the types that `FitinOptions` depends on.\r\n * Solution: declare the type from scratch (i.e. rewrite it explicitly without relying on utility types).\r\n */\r\ntype FitinCanvasProps = {\r\n designWidth: number; // physical design width of container\r\n designHeight: number; // physical design height of container\r\n mode?: Mode;\r\n minDesignWidth?: number; // minimum physical design width of container\r\n minDesignHeight?: number; // minimum physical design height of container\r\n wait?: number; // in ms\r\n computeScaleXY?: (\r\n designWidth: number,\r\n designHeight: number,\r\n scaleX: number,\r\n scaleY: number,\r\n ) => number;\r\n viewport?: HTMLElement | \"parent\";\r\n center?: boolean;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\nconst props = defineProps<FitinCanvasProps>();\r\n\r\nconst canvasRef = ref<HTMLElement>();\r\n\r\nconst canvasStyle = computed<CSSProperties>(() =>\r\n props.center\r\n ? {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n overflow: \"hidden\"\r\n }\r\n : {\r\n position: \"relative\",\r\n overflow: \"hidden\"\r\n },\r\n);\r\n\r\nlet fitin: Fitin;\r\nlet subject = new BehaviorSubject<IResizeEvent | undefined>(undefined);\r\nprovide(FitinCanvasKey, subject.asObservable());\r\nconst resizeObservable = inject(FitinCanvasKey);\r\n\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n logE(\"Nested fitin-canvas is forbidden\");\r\n return;\r\n }\r\n\r\n fitin = new Fitin(props);\r\n\r\n const handleResize = (event: IResizeEvent) => {\r\n if (event && canvasRef.value) {\r\n canvasRef.value.style.width = `${event.effectiveWidth}px`;\r\n canvasRef.value.style.height = `${event.effectiveHeight}px`;\r\n }\r\n subject.next(event);\r\n };\r\n\r\n const viewport =\r\n props.viewport === \"parent\"\r\n ? canvasRef.value?.parentElement\r\n : props.viewport;\r\n if (viewport) {\r\n fitin.subscribe(viewport, handleResize);\r\n } else {\r\n fitin.subscribe(handleResize);\r\n }\r\n\r\n onCleanup(() => {\r\n fitin.dispose();\r\n });\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n ref=\"canvasRef\"\r\n role=\"fitin-canvas\"\r\n :style=\"canvasStyle\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n inject,\r\n provide,\r\n ref,\r\n watchEffect,\r\n type CSSProperties,\r\n} from \"vue\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\nimport { Fitin, type Mode, type IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey } from \"./keys\";\r\nimport { logE } from \"./logging\";\r\n\r\n/**\r\n * Vue SFC does not support TypeScript advanced types(e.g., Omit, Pick and Partial).\r\n * However, these are exactly the types that `FitinOptions` depends on.\r\n * Solution: declare the type from scratch (i.e. rewrite it explicitly without relying on utility types).\r\n */\r\ntype FitinCanvasProps = {\r\n designWidth: number; // physical design width of container\r\n designHeight: number; // physical design height of container\r\n mode?: Mode;\r\n minDesignWidth?: number; // minimum physical design width of container\r\n minDesignHeight?: number; // minimum physical design height of container\r\n wait?: number; // in ms\r\n computeScaleXY?: (\r\n designWidth: number,\r\n designHeight: number,\r\n scaleX: number,\r\n scaleY: number,\r\n ) => number;\r\n viewport?: HTMLElement | \"parent\";\r\n center?: boolean;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\nconst props = defineProps<FitinCanvasProps>();\r\n\r\nconst canvasRef = ref<HTMLElement>();\r\n\r\nconst canvasStyle = computed<CSSProperties>(() =>\r\n props.center\r\n ? {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n overflow: \"hidden\"\r\n }\r\n : {\r\n position: \"relative\",\r\n overflow: \"hidden\"\r\n },\r\n);\r\n\r\nlet fitin: Fitin;\r\nlet subject = new BehaviorSubject<IResizeEvent | undefined>(undefined);\r\nprovide(FitinCanvasKey, subject.asObservable());\r\nconst resizeObservable = inject(FitinCanvasKey);\r\n\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n logE(\"Nested fitin-canvas is forbidden\");\r\n return;\r\n }\r\n\r\n fitin = new Fitin(props);\r\n\r\n const handleResize = (event: IResizeEvent) => {\r\n if (event && canvasRef.value) {\r\n canvasRef.value.style.width = `${event.effectiveWidth}px`;\r\n canvasRef.value.style.height = `${event.effectiveHeight}px`;\r\n }\r\n subject.next(event);\r\n };\r\n\r\n const viewport =\r\n props.viewport === \"parent\"\r\n ? canvasRef.value?.parentElement\r\n : props.viewport;\r\n if (viewport) {\r\n fitin.subscribe(viewport, handleResize);\r\n } else {\r\n fitin.subscribe(handleResize);\r\n }\r\n\r\n onCleanup(() => {\r\n fitin.dispose();\r\n });\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n ref=\"canvasRef\"\r\n role=\"fitin-canvas\"\r\n :style=\"canvasStyle\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","import { inject, provide, reactive, watchEffect } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { FitinCanvasKey, FitinContainerKey } from \"./keys\";\r\nimport { logE, logW } from \"./logging\";\r\nimport type { Observable } from \"rxjs\";\r\n\r\nexport function provideFitinContainer(\r\n value: \"affect-self\" | \"affect-descendant\",\r\n) {\r\n const paths = inject(FitinContainerKey) || [];\r\n paths.push(value);\r\n provide(FitinContainerKey, paths);\r\n}\r\n\r\nexport function useFitin(\r\n resizeHandler?: (event: undefined | IResizeEvent) => void,\r\n): undefined | Observable<undefined | IResizeEvent> {\r\n const resizeObservable = inject(FitinCanvasKey);\r\n if (resizeObservable) {\r\n const paths = inject(FitinContainerKey) || [];\r\n if (paths.find((path) => path === \"affect-descendant\")) {\r\n logW(\"There's an ancestor fitin-container resizing all descendants\");\r\n }\r\n\r\n watchEffect((onCleanup) => {\r\n const subscription = resizeObservable.subscribe(resizeHandler);\r\n onCleanup(() => subscription.unsubscribe());\r\n });\r\n } else {\r\n logE(\"A fitin-container must be used within a fitin-canvas context\");\r\n }\r\n\r\n return resizeObservable;\r\n}\r\n\r\nexport function useFitinState() {\r\n const state = reactive<{\r\n scaleX: number;\r\n scaleY: number;\r\n scaleXY: number;\r\n effectiveWidth: undefined | number;\r\n effectiveHeight: undefined | number;\r\n }>({\r\n scaleX: 1,\r\n scaleY: 1,\r\n scaleXY: 1,\r\n effectiveWidth: undefined,\r\n effectiveHeight: undefined,\r\n });\r\n useFitin((event) => {\r\n if (event) {\r\n state.scaleX = event.scaleX;\r\n state.scaleY = event.scaleY;\r\n state.scaleXY = event.scaleXY;\r\n state.effectiveWidth = event.effectiveWidth;\r\n state.effectiveHeight = event.effectiveHeight;\r\n }\r\n });\r\n\r\n return state;\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { ref, watchEffect, computed, type CSSProperties } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { provideFitinContainer, useFitin } from \"./hooks\";\r\n\r\ntype FitinContainerProps = {\r\n designWidth: number;\r\n designHeight: number;\r\n transformOriginX?: \"left\" | \"center\" | \"right\";\r\n transformOriginY?: \"top\" | \"center\" | \"bottom\";\r\n style?: CSSProperties;\r\n class?: string;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps<FitinContainerProps>();\r\n\r\nconst affectScope = computed(() =>\r\n props.transformOriginX || props.transformOriginY\r\n ? \"affect-descendant\"\r\n : \"affect-self\",\r\n);\r\n\r\nprovideFitinContainer(affectScope.value);\r\n\r\nconst fitinStyle = ref<CSSProperties>({});\r\n\r\nfunction adjustContainer(event: IResizeEvent, props: FitinContainerProps) {\r\n if (props.transformOriginX || props.transformOriginY) {\r\n let transform: string;\r\n let transformOrigin: string;\r\n if (props.transformOriginX && props.transformOriginY) {\r\n const res = event.transformXY(\r\n props.transformOriginX,\r\n props.transformOriginY,\r\n );\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else if (props.transformOriginX) {\r\n const res = event.transformX(props.transformOriginX);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else {\r\n const res = event.transformY(props.transformOriginY!);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n }\r\n fitinStyle.value = {\r\n position: \"absolute\",\r\n width: `${props.designWidth}px`,\r\n height: `${props.designHeight}px`,\r\n transform: transform,\r\n transformOrigin: transformOrigin,\r\n };\r\n } else {\r\n fitinStyle.value = {\r\n width: `${event.scaleX * props.designWidth}px`,\r\n height: `${event.scaleY * props.designHeight}px`,\r\n };\r\n }\r\n}\r\n\r\nconst resizeObservable = useFitin();\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n const subscription = resizeObservable.subscribe(\r\n (event: IResizeEvent | undefined) => {\r\n if (event) {\r\n adjustContainer(event, props);\r\n }\r\n },\r\n );\r\n onCleanup(() => subscription.unsubscribe());\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n role=\"fitin-container\"\r\n :data-scope=\"affectScope\"\r\n :style=\"[props.style, fitinStyle]\"\r\n :class=\"props.class\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, watchEffect, computed, type CSSProperties } from \"vue\";\r\nimport type { IResizeEvent } from \"@fitin/core\";\r\nimport { provideFitinContainer, useFitin } from \"./hooks\";\r\n\r\ntype FitinContainerProps = {\r\n designWidth: number;\r\n designHeight: number;\r\n transformOriginX?: \"left\" | \"center\" | \"right\";\r\n transformOriginY?: \"top\" | \"center\" | \"bottom\";\r\n style?: CSSProperties;\r\n class?: string;\r\n};\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps<FitinContainerProps>();\r\n\r\nconst affectScope = computed(() =>\r\n props.transformOriginX || props.transformOriginY\r\n ? \"affect-descendant\"\r\n : \"affect-self\",\r\n);\r\n\r\nprovideFitinContainer(affectScope.value);\r\n\r\nconst fitinStyle = ref<CSSProperties>({});\r\n\r\nfunction adjustContainer(event: IResizeEvent, props: FitinContainerProps) {\r\n if (props.transformOriginX || props.transformOriginY) {\r\n let transform: string;\r\n let transformOrigin: string;\r\n if (props.transformOriginX && props.transformOriginY) {\r\n const res = event.transformXY(\r\n props.transformOriginX,\r\n props.transformOriginY,\r\n );\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else if (props.transformOriginX) {\r\n const res = event.transformX(props.transformOriginX);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n } else {\r\n const res = event.transformY(props.transformOriginY!);\r\n transform = res.transform;\r\n transformOrigin = res.transformOrigin;\r\n }\r\n fitinStyle.value = {\r\n position: \"absolute\",\r\n width: `${props.designWidth}px`,\r\n height: `${props.designHeight}px`,\r\n transform: transform,\r\n transformOrigin: transformOrigin,\r\n };\r\n } else {\r\n fitinStyle.value = {\r\n width: `${event.scaleX * props.designWidth}px`,\r\n height: `${event.scaleY * props.designHeight}px`,\r\n };\r\n }\r\n}\r\n\r\nconst resizeObservable = useFitin();\r\nwatchEffect((onCleanup) => {\r\n if (resizeObservable) {\r\n const subscription = resizeObservable.subscribe(\r\n (event: IResizeEvent | undefined) => {\r\n if (event) {\r\n adjustContainer(event, props);\r\n }\r\n },\r\n );\r\n onCleanup(() => subscription.unsubscribe());\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <section\r\n role=\"fitin-container\"\r\n :data-scope=\"affectScope\"\r\n :style=\"[props.style, fitinStyle]\"\r\n :class=\"props.class\"\r\n >\r\n <slot />\r\n </section>\r\n</template>\r\n","import type { App, Plugin } from \"vue\";\r\nimport FitinCanvas from \"./components/fitin-canvas.vue\";\r\nimport FitinContainer from \"./components/fitin-container.vue\";\r\nexport { useFitin, useFitinState } from \"./components/hooks\";\r\nimport \"./types.ts\";\r\n\r\nexport { FitinCanvas, FitinContainer };\r\nexport function install(app: App) {\r\n app.component(\"FitinCanvas\", FitinCanvas);\r\n app.component(\"FitinContainer\", FitinContainer);\r\n}\r\nexport default { install } as Plugin;\r\n"],"mappings":"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"}
@@ -1,7 +1,10 @@
1
- import type { Plugin } from "vue";
1
+ import type { App, Plugin } from "vue";
2
2
  import FitinCanvas from "./components/fitin-canvas.vue";
3
3
  import FitinContainer from "./components/fitin-container.vue";
4
4
  export { useFitin, useFitinState } from "./components/hooks";
5
+ import "./types.ts";
5
6
  export { FitinCanvas, FitinContainer };
6
- export declare const plugin: Plugin;
7
+ export declare function install(app: App): void;
8
+ declare const _default: Plugin;
9
+ export default _default;
7
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAO,MAAM,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACvC,eAAO,MAAM,MAAM,EAAE,MAKpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACvC,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,QAG/B;wBAC6B,MAAM;AAApC,wBAAqC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Vue's TypeScript global component type augmentation.
3
+ * When registering components via `app.use(Fitin)` and use components globally,
4
+ * TS doesn't know Fitin global components exist, and no autocomplete for component name/props/emits,
5
+ * if this type augmentation is missing.
6
+ */
7
+ import FitinCanvas from "./components/fitin-canvas.vue";
8
+ import FitinContainer from "./components/fitin-container.vue";
9
+ declare module "vue" {
10
+ interface GlobalComponents {
11
+ FitinCanvas: typeof FitinCanvas;
12
+ FitinContainer: typeof FitinContainer;
13
+ }
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAE9D,OAAO,QAAQ,KAAK,CAAC;IACnB,UAAiB,gBAAgB;QAC/B,WAAW,EAAE,OAAO,WAAW,CAAC;QAChC,cAAc,EAAE,OAAO,cAAc,CAAC;KACvC;CACF;AAED,OAAO,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fitin/vue",
3
3
  "private": false,
4
- "version": "0.1.0",
4
+ "version": "0.1.1",
5
5
  "type": "module",
6
6
  "main": "./dist/index.umd.js",
7
7
  "module": "./dist/index.es.js",
package/src/index.ts CHANGED
@@ -2,11 +2,11 @@ import type { App, Plugin } from "vue";
2
2
  import FitinCanvas from "./components/fitin-canvas.vue";
3
3
  import FitinContainer from "./components/fitin-container.vue";
4
4
  export { useFitin, useFitinState } from "./components/hooks";
5
+ import "./types.ts";
5
6
 
6
7
  export { FitinCanvas, FitinContainer };
7
- export const plugin: Plugin = {
8
- install(app: App) {
9
- app.component("FitinCanvas", FitinCanvas);
10
- app.component("FitinContainer", FitinContainer);
11
- },
12
- };
8
+ export function install(app: App) {
9
+ app.component("FitinCanvas", FitinCanvas);
10
+ app.component("FitinContainer", FitinContainer);
11
+ }
12
+ export default { install } as Plugin;
package/src/types.ts ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Vue's TypeScript global component type augmentation.
3
+ * When registering components via `app.use(Fitin)` and use components globally,
4
+ * TS doesn't know Fitin global components exist, and no autocomplete for component name/props/emits,
5
+ * if this type augmentation is missing.
6
+ */
7
+ import FitinCanvas from "./components/fitin-canvas.vue";
8
+ import FitinContainer from "./components/fitin-container.vue";
9
+
10
+ declare module "vue" {
11
+ export interface GlobalComponents {
12
+ FitinCanvas: typeof FitinCanvas;
13
+ FitinContainer: typeof FitinContainer;
14
+ }
15
+ }
16
+
17
+ export {};
package/vite.config.ts CHANGED
@@ -15,6 +15,7 @@ export default defineConfig({
15
15
  external: ["vue", "rxjs", "@fitin/core"],
16
16
  output: {
17
17
  format: "umd",
18
+ exports: "named",
18
19
  globals: {
19
20
  vue: "Vue",
20
21
  rxjs: "rxjs",