@derivesome/webtools 1.0.0

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 (45) hide show
  1. package/.package.json.~undo-tree~ +8 -0
  2. package/.tsconfig.cjs.json.~undo-tree~ +8 -0
  3. package/.tsconfig.json.~undo-tree~ +8 -0
  4. package/dist/cjs/element-size-ref.d.ts +15 -0
  5. package/dist/cjs/element-size-ref.d.ts.map +1 -0
  6. package/dist/cjs/element-size-ref.js +54 -0
  7. package/dist/cjs/element-size-ref.js.map +1 -0
  8. package/dist/cjs/index.d.ts +3 -0
  9. package/dist/cjs/index.d.ts.map +1 -0
  10. package/dist/cjs/index.js +19 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/resize-observer-ref.d.ts +4 -0
  13. package/dist/cjs/resize-observer-ref.d.ts.map +1 -0
  14. package/dist/cjs/resize-observer-ref.js +20 -0
  15. package/dist/cjs/resize-observer-ref.js.map +1 -0
  16. package/dist/esm/element-size-ref.d.ts +15 -0
  17. package/dist/esm/element-size-ref.d.ts.map +1 -0
  18. package/dist/esm/element-size-ref.js +50 -0
  19. package/dist/esm/element-size-ref.js.map +1 -0
  20. package/dist/esm/index.d.ts +3 -0
  21. package/dist/esm/index.d.ts.map +1 -0
  22. package/dist/esm/index.js +3 -0
  23. package/dist/esm/index.js.map +1 -0
  24. package/dist/esm/package.json +1 -0
  25. package/dist/esm/resize-observer-ref.d.ts +4 -0
  26. package/dist/esm/resize-observer-ref.d.ts.map +1 -0
  27. package/dist/esm/resize-observer-ref.js +16 -0
  28. package/dist/esm/resize-observer-ref.js.map +1 -0
  29. package/package.json +46 -0
  30. package/package.json~ +42 -0
  31. package/src/.element-size-ref.ts.~undo-tree~ +118 -0
  32. package/src/.index.ts.~undo-tree~ +9 -0
  33. package/src/.resize-observer-ref.ts.~undo-tree~ +74 -0
  34. package/src/.resize-observer.ts.~undo-tree~ +42 -0
  35. package/src/element-size-ref.ts +74 -0
  36. package/src/element-size-ref.ts~ +65 -0
  37. package/src/index.ts +2 -0
  38. package/src/index.ts~ +1 -0
  39. package/src/resize-observer-ref.ts +21 -0
  40. package/src/resize-observer-ref.ts~ +19 -0
  41. package/src/resize-observer.ts~ +21 -0
  42. package/tsconfig.cjs.json +8 -0
  43. package/tsconfig.cjs.json~ +8 -0
  44. package/tsconfig.json +24 -0
  45. package/tsconfig.json~ +24 -0
@@ -0,0 +1,74 @@
1
+ import { ref, Reference, unref, type MaybeReference } from "@derivesome/core";
2
+ import {
3
+ createResizeObserverRef,
4
+ ResizeObserverRef,
5
+ } from "./resize-observer-ref";
6
+
7
+ export type ElementSize = { width: number; height: number };
8
+
9
+ export type CreateElementSizeRefOptions = ResizeObserverOptions & {
10
+ initialSize?: ElementSize;
11
+ };
12
+
13
+ export type ElementSizeRef = {
14
+ size: Reference<ElementSize>;
15
+ observer: ResizeObserverRef;
16
+ };
17
+
18
+ export const createElementSizeRef = (
19
+ element: MaybeReference<Element | null | undefined>,
20
+ options: CreateElementSizeRefOptions = {},
21
+ ): ElementSizeRef => {
22
+ const { box = "content-box" } = options;
23
+
24
+ const initialElement = unref(element);
25
+ const initialRect = initialElement
26
+ ? initialElement.getBoundingClientRect()
27
+ : null;
28
+ const size = ref<ElementSize>({
29
+ width: initialRect?.width || options.initialSize?.width || 0,
30
+ height: initialRect?.height || options.initialSize?.height || 0,
31
+ });
32
+
33
+ const obs = createResizeObserverRef(
34
+ element,
35
+ (entries) => {
36
+ const entry = entries[0];
37
+ if (!entry) return;
38
+ const el = unref(element);
39
+ if (!el) return;
40
+ const isSVG = el.namespaceURI?.includes("svg") ?? false;
41
+ if (isSVG) {
42
+ const rect = el.getBoundingClientRect();
43
+ size.set({ width: rect.width, height: rect.height });
44
+ return;
45
+ }
46
+
47
+ const boxSize =
48
+ box === "border-box"
49
+ ? entry.borderBoxSize
50
+ : box === "content-box"
51
+ ? entry.contentBoxSize
52
+ : entry.devicePixelContentBoxSize;
53
+
54
+ if (boxSize && boxSize.length > 0) {
55
+ let width = 0;
56
+ let height = 0;
57
+ for (const bs of boxSize) {
58
+ width += bs.inlineSize;
59
+ height += bs.blockSize;
60
+ }
61
+ size.set({ width, height });
62
+ } else {
63
+ // fallback for browsers without boxSize support
64
+ size.set({
65
+ width: entry.contentRect.width,
66
+ height: entry.contentRect.height,
67
+ });
68
+ }
69
+ },
70
+ options,
71
+ );
72
+
73
+ return { size, observer: obs };
74
+ };
@@ -0,0 +1,65 @@
1
+ import { ref, Reference, unref, type MaybeReference } from '@derivesome/core';
2
+ import { createResizeObserverRef, ResizeObserverRef } from './resize-observer-ref';
3
+
4
+ export type ElementSize = { width: number, height: number };
5
+
6
+ export type CreateElementSizeRefOptions = ResizeObserverOptions & {
7
+ initialSize?: ElementSize;
8
+ }
9
+
10
+ export type ElementSizeRef = {
11
+ size: Reference<ElementSize>;
12
+ observer: ResizeObserverRef;
13
+ }
14
+
15
+ export const createElementSizeRef = (
16
+ element: MaybeReference<Element | null | undefined>,
17
+ options: CreateElementSizeRefOptions = {}
18
+ ): ElementSizeRef => {
19
+ const { box = "content-box" } = options;
20
+
21
+ const initialElement = unref(element);
22
+ const initialRect = initialElement ? initialElement.getBoundingClientRect() : null;
23
+ const size = ref<ElementSize>({
24
+ width: (initialRect?.width || options.initialSize?.width || 0),
25
+ height: (initialRect?.height || options.initialSize?.height || 0),
26
+ });
27
+
28
+ const obs = createResizeObserverRef(element, (entries) => {
29
+ const entry = entries[0];
30
+ if (!entry) return;
31
+ const el = unref(element);
32
+ if (!el) return;
33
+ const isSVG = el.namespaceURI?.includes("svg") ?? false;
34
+ if (isSVG) {
35
+ const rect = el.getBoundingClientRect();
36
+ size.set({ width: rect.width, height: rect.height });
37
+ return;
38
+ }
39
+
40
+ const boxSize =
41
+ box === "border-box"
42
+ ? entry.borderBoxSize
43
+ : box === "content-box"
44
+ ? entry.contentBoxSize
45
+ : entry.devicePixelContentBoxSize;
46
+
47
+ if (boxSize && boxSize.length > 0) {
48
+ let width = 0;
49
+ let height = 0;
50
+ for (const bs of boxSize) {
51
+ width += bs.inlineSize;
52
+ height += bs.blockSize;
53
+ }
54
+ size.set({ width, height });
55
+ } else {
56
+ // fallback for browsers without boxSize support
57
+ size.set({
58
+ width: entry.contentRect.width,
59
+ height: entry.contentRect.height,
60
+ });
61
+ }
62
+ }, options);
63
+
64
+ return { size, observer: obs }
65
+ }
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './resize-observer-ref';
2
+ export * from './element-size-ref';
package/src/index.ts~ ADDED
@@ -0,0 +1 @@
1
+ export * from './resize-observer-ref';
@@ -0,0 +1,21 @@
1
+ import { Derived, derived, unref, type MaybeReference } from '@derivesome/core';
2
+
3
+ export type ResizeObserverRef = Derived<ResizeObserver | null>;
4
+
5
+ export const createResizeObserverRef = (
6
+ element: MaybeReference<Element | null | undefined>,
7
+ callback: ResizeObserverCallback,
8
+ options: ResizeObserverOptions = {}
9
+ ): ResizeObserverRef => {
10
+ const elref = derived(() => unref(element));
11
+ return derived<ResizeObserver | null>((prev) => {
12
+ if (prev) {
13
+ prev.disconnect();
14
+ }
15
+ const el = elref.get();
16
+ if (!el) return null;
17
+ const obs = new ResizeObserver(callback);
18
+ obs.observe(el, options);
19
+ return obs;
20
+ });
21
+ }
@@ -0,0 +1,19 @@
1
+ import { Derived, derived, unref, type MaybeReference } from '@derivesome/core';
2
+
3
+ export const createResizeObserverRef = (
4
+ element: MaybeReference<Element | null | undefined>,
5
+ callback: ResizeObserverCallback,
6
+ options: ResizeObserverOptions = {}
7
+ ): Derived<ResizeObserver | null> => {
8
+ const elref = derived(() => unref(element));
9
+ return derived<ResizeObserver | null>((prev) => {
10
+ if (prev) {
11
+ prev.disconnect();
12
+ }
13
+ const el = elref.get();
14
+ if (!el) return null;
15
+ const obs = new ResizeObserver(callback);
16
+ obs.observe(el, options);
17
+ return obs;
18
+ });
19
+ }
@@ -0,0 +1,21 @@
1
+ import { unref, type MaybeReference } from '@derivesome/core';
2
+
3
+ export type ElementSize = { width: number, height: number };
4
+
5
+ export type ResizeObserverBox =
6
+ | "border-box"
7
+ | "content-box"
8
+ | "device-pixel-content-box";
9
+
10
+ export interface CreateResizeObserverOptions {
11
+ box?: ResizeObserverBox;
12
+ initialSize?: ElementSize;
13
+ }
14
+
15
+ export const createResizeObserver = (
16
+ element: MaybeReference<Element | null | undefined>,
17
+ options: CreateResizeObserverOptions = {}
18
+ ) => {
19
+
20
+ const initialElement = unref(element);
21
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "module": "commonjs",
5
+ "moduleResolution": "node10",
6
+ "outDir": "./dist/cjs"
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "module": "commonjs",
5
+ "moduleResolution": "node10",
6
+ "outDir": "./dist/cjs"
7
+ }
8
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": "./src",
4
+ "outDir": "./dist/esm",
5
+ "module": "esnext",
6
+ "moduleResolution": "bundler",
7
+ "target": "esnext",
8
+ "lib": ["esnext", "dom", "dom.iterable", "ES2020"],
9
+ "types": ["node"],
10
+ "sourceMap": true,
11
+ "declaration": true,
12
+ "declarationMap": true,
13
+ "noUncheckedIndexedAccess": true,
14
+ "exactOptionalPropertyTypes": true,
15
+ "strict": true,
16
+ "isolatedModules": true,
17
+ "esModuleInterop": true,
18
+ "noUncheckedSideEffectImports": true,
19
+ "moduleDetection": "force",
20
+ "skipLibCheck": true
21
+ },
22
+ "include": ["./src/**/*.ts"],
23
+ "exclude": ["./src/**/*.test.ts"]
24
+ }
package/tsconfig.json~ ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": "./src",
4
+ "outDir": "./dist/esm",
5
+ "module": "esnext",
6
+ "moduleResolution": "bundler",
7
+ "target": "esnext",
8
+ "lib": ["esnext", "dom", "dom.iterable", "ES2020"],
9
+ "types": ["node"],
10
+ "sourceMap": true,
11
+ "declaration": true,
12
+ "declarationMap": true,
13
+ "noUncheckedIndexedAccess": true,
14
+ "exactOptionalPropertyTypes": true,
15
+ "strict": true,
16
+ "isolatedModules": true,
17
+ "esModuleInterop": true,
18
+ "noUncheckedSideEffectImports": true,
19
+ "moduleDetection": "force",
20
+ "skipLibCheck": true
21
+ },
22
+ "include": ["./src/**/*.ts"],
23
+ "exclude": ["./src/**/*.test.ts"]
24
+ }