@ai-matrx/kit 0.5.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.
- package/CHANGELOG.md +132 -0
- package/LICENSE +21 -0
- package/README.md +72 -0
- package/dist/autosave.cjs +92 -0
- package/dist/autosave.cjs.map +1 -0
- package/dist/autosave.d.cts +17 -0
- package/dist/autosave.d.ts +17 -0
- package/dist/autosave.js +72 -0
- package/dist/autosave.js.map +1 -0
- package/dist/clipboard.cjs +152 -0
- package/dist/clipboard.cjs.map +1 -0
- package/dist/clipboard.d.cts +17 -0
- package/dist/clipboard.d.ts +17 -0
- package/dist/clipboard.js +132 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/color-util.cjs +790 -0
- package/dist/color-util.cjs.map +1 -0
- package/dist/color-util.d.cts +235 -0
- package/dist/color-util.d.ts +235 -0
- package/dist/color-util.js +767 -0
- package/dist/color-util.js.map +1 -0
- package/dist/concurrency.cjs +59 -0
- package/dist/concurrency.cjs.map +1 -0
- package/dist/concurrency.d.cts +19 -0
- package/dist/concurrency.d.ts +19 -0
- package/dist/concurrency.js +38 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/confirm.cjs +344 -0
- package/dist/confirm.cjs.map +1 -0
- package/dist/confirm.d.cts +132 -0
- package/dist/confirm.d.ts +132 -0
- package/dist/confirm.js +312 -0
- package/dist/confirm.js.map +1 -0
- package/dist/delimiter-guard.cjs +172 -0
- package/dist/delimiter-guard.cjs.map +1 -0
- package/dist/delimiter-guard.d.cts +119 -0
- package/dist/delimiter-guard.d.ts +119 -0
- package/dist/delimiter-guard.js +151 -0
- package/dist/delimiter-guard.js.map +1 -0
- package/dist/drafts.cjs +223 -0
- package/dist/drafts.cjs.map +1 -0
- package/dist/drafts.d.cts +62 -0
- package/dist/drafts.d.ts +62 -0
- package/dist/drafts.js +201 -0
- package/dist/drafts.js.map +1 -0
- package/dist/idb-store.cjs +178 -0
- package/dist/idb-store.cjs.map +1 -0
- package/dist/idb-store.d.cts +111 -0
- package/dist/idb-store.d.ts +111 -0
- package/dist/idb-store.js +155 -0
- package/dist/idb-store.js.map +1 -0
- package/dist/idle-scheduler.cjs +268 -0
- package/dist/idle-scheduler.cjs.map +1 -0
- package/dist/idle-scheduler.d.cts +185 -0
- package/dist/idle-scheduler.d.ts +185 -0
- package/dist/idle-scheduler.js +246 -0
- package/dist/idle-scheduler.js.map +1 -0
- package/dist/index.cjs +3113 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +897 -0
- package/dist/index.d.ts +897 -0
- package/dist/index.js +3088 -0
- package/dist/index.js.map +1 -0
- package/dist/invalidation.cjs +64 -0
- package/dist/invalidation.cjs.map +1 -0
- package/dist/invalidation.d.cts +52 -0
- package/dist/invalidation.d.ts +52 -0
- package/dist/invalidation.js +43 -0
- package/dist/invalidation.js.map +1 -0
- package/dist/json-format.cjs +319 -0
- package/dist/json-format.cjs.map +1 -0
- package/dist/json-format.d.cts +148 -0
- package/dist/json-format.d.ts +148 -0
- package/dist/json-format.js +286 -0
- package/dist/json-format.js.map +1 -0
- package/dist/latest-request.cjs +36 -0
- package/dist/latest-request.cjs.map +1 -0
- package/dist/latest-request.d.cts +29 -0
- package/dist/latest-request.d.ts +29 -0
- package/dist/latest-request.js +16 -0
- package/dist/latest-request.js.map +1 -0
- package/dist/qr.cjs +109 -0
- package/dist/qr.cjs.map +1 -0
- package/dist/qr.d.cts +47 -0
- package/dist/qr.d.ts +47 -0
- package/dist/qr.js +78 -0
- package/dist/qr.js.map +1 -0
- package/dist/react-tree.cjs +69 -0
- package/dist/react-tree.cjs.map +1 -0
- package/dist/react-tree.d.cts +38 -0
- package/dist/react-tree.d.ts +38 -0
- package/dist/react-tree.js +38 -0
- package/dist/react-tree.js.map +1 -0
- package/dist/search-scoring.cjs +116 -0
- package/dist/search-scoring.cjs.map +1 -0
- package/dist/search-scoring.d.cts +77 -0
- package/dist/search-scoring.d.ts +77 -0
- package/dist/search-scoring.js +95 -0
- package/dist/search-scoring.js.map +1 -0
- package/dist/text-case.cjs +313 -0
- package/dist/text-case.cjs.map +1 -0
- package/dist/text-case.d.cts +53 -0
- package/dist/text-case.d.ts +53 -0
- package/dist/text-case.js +292 -0
- package/dist/text-case.js.map +1 -0
- package/dist/toast.cjs +74 -0
- package/dist/toast.cjs.map +1 -0
- package/dist/toast.d.cts +92 -0
- package/dist/toast.d.ts +92 -0
- package/dist/toast.js +54 -0
- package/dist/toast.js.map +1 -0
- package/dist/url-state.cjs +212 -0
- package/dist/url-state.cjs.map +1 -0
- package/dist/url-state.d.cts +90 -0
- package/dist/url-state.d.ts +90 -0
- package/dist/url-state.js +199 -0
- package/dist/url-state.js.map +1 -0
- package/package.json +286 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type ClipboardNotifyKind = "success" | "error";
|
|
2
|
+
interface UseClipboardOptions {
|
|
3
|
+
/** Surface outcomes to the user — wrap your toast here. */
|
|
4
|
+
notify?: (message: string, kind: ClipboardNotifyKind) => void;
|
|
5
|
+
}
|
|
6
|
+
interface UseClipboardResult {
|
|
7
|
+
copyText: (text: string, successMessage?: string) => Promise<void>;
|
|
8
|
+
copyImage: (imageSrc: string, successMessage?: string) => Promise<void>;
|
|
9
|
+
copyLink: (link: string, stripParams?: boolean, successMessage?: string) => Promise<void>;
|
|
10
|
+
pasteText: () => Promise<string>;
|
|
11
|
+
pasteImage: () => Promise<File | null>;
|
|
12
|
+
lastCopied: string | null;
|
|
13
|
+
error: Error | null;
|
|
14
|
+
}
|
|
15
|
+
declare function useClipboard(options?: UseClipboardOptions): UseClipboardResult;
|
|
16
|
+
|
|
17
|
+
export { type ClipboardNotifyKind, type UseClipboardOptions, type UseClipboardResult, useClipboard };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type ClipboardNotifyKind = "success" | "error";
|
|
2
|
+
interface UseClipboardOptions {
|
|
3
|
+
/** Surface outcomes to the user — wrap your toast here. */
|
|
4
|
+
notify?: (message: string, kind: ClipboardNotifyKind) => void;
|
|
5
|
+
}
|
|
6
|
+
interface UseClipboardResult {
|
|
7
|
+
copyText: (text: string, successMessage?: string) => Promise<void>;
|
|
8
|
+
copyImage: (imageSrc: string, successMessage?: string) => Promise<void>;
|
|
9
|
+
copyLink: (link: string, stripParams?: boolean, successMessage?: string) => Promise<void>;
|
|
10
|
+
pasteText: () => Promise<string>;
|
|
11
|
+
pasteImage: () => Promise<File | null>;
|
|
12
|
+
lastCopied: string | null;
|
|
13
|
+
error: Error | null;
|
|
14
|
+
}
|
|
15
|
+
declare function useClipboard(options?: UseClipboardOptions): UseClipboardResult;
|
|
16
|
+
|
|
17
|
+
export { type ClipboardNotifyKind, type UseClipboardOptions, type UseClipboardResult, useClipboard };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
// src/clipboard.ts
|
|
5
|
+
import { useCallback, useState } from "react";
|
|
6
|
+
function toError(err, fallback) {
|
|
7
|
+
if (err instanceof Error) return err;
|
|
8
|
+
if (typeof err === "string" && err) return new Error(err);
|
|
9
|
+
return new Error(fallback);
|
|
10
|
+
}
|
|
11
|
+
function useClipboard(options = {}) {
|
|
12
|
+
const { notify } = options;
|
|
13
|
+
const [lastCopied, setLastCopied] = useState(null);
|
|
14
|
+
const [error, setError] = useState(null);
|
|
15
|
+
const handleSuccess = (type, successMessage) => {
|
|
16
|
+
setLastCopied(type);
|
|
17
|
+
setError(null);
|
|
18
|
+
notify?.(
|
|
19
|
+
successMessage ?? `${type.charAt(0).toUpperCase() + type.slice(1)} copied to clipboard!`,
|
|
20
|
+
"success"
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
const handleError = (err, type) => {
|
|
24
|
+
const message = `Failed to copy ${type}`;
|
|
25
|
+
setError(toError(err, message));
|
|
26
|
+
console.error(message, err);
|
|
27
|
+
notify?.(message, "error");
|
|
28
|
+
};
|
|
29
|
+
const copyText = useCallback(
|
|
30
|
+
async (text, successMessage) => {
|
|
31
|
+
try {
|
|
32
|
+
await navigator.clipboard.writeText(text);
|
|
33
|
+
handleSuccess("text", successMessage);
|
|
34
|
+
} catch (err) {
|
|
35
|
+
handleError(err, "text");
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
[notify]
|
|
39
|
+
);
|
|
40
|
+
const copyImage = useCallback(
|
|
41
|
+
async (imageSrc, successMessage) => {
|
|
42
|
+
try {
|
|
43
|
+
const response = await fetch(imageSrc);
|
|
44
|
+
if (!response.ok)
|
|
45
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
46
|
+
const blob = await response.blob();
|
|
47
|
+
const canvas = document.createElement("canvas");
|
|
48
|
+
const ctx = canvas.getContext("2d");
|
|
49
|
+
if (!ctx) throw new Error("Failed to get canvas context");
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
const img = new Image();
|
|
52
|
+
img.onload = () => {
|
|
53
|
+
canvas.width = img.width;
|
|
54
|
+
canvas.height = img.height;
|
|
55
|
+
ctx.drawImage(img, 0, 0);
|
|
56
|
+
canvas.toBlob((pngBlob) => {
|
|
57
|
+
if (pngBlob) {
|
|
58
|
+
const item = new ClipboardItem({ "image/png": pngBlob });
|
|
59
|
+
navigator.clipboard.write([item]).then(
|
|
60
|
+
() => {
|
|
61
|
+
handleSuccess("image", successMessage);
|
|
62
|
+
resolve();
|
|
63
|
+
},
|
|
64
|
+
(err) => reject(
|
|
65
|
+
toError(err, "Failed to write image to clipboard")
|
|
66
|
+
)
|
|
67
|
+
);
|
|
68
|
+
} else {
|
|
69
|
+
reject(new Error("Failed to convert image to PNG"));
|
|
70
|
+
}
|
|
71
|
+
}, "image/png");
|
|
72
|
+
};
|
|
73
|
+
img.onerror = () => reject(new Error("Failed to load image"));
|
|
74
|
+
img.src = URL.createObjectURL(blob);
|
|
75
|
+
});
|
|
76
|
+
} catch (err) {
|
|
77
|
+
handleError(err, "image");
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
[notify]
|
|
81
|
+
);
|
|
82
|
+
const copyLink = useCallback(
|
|
83
|
+
async (link, stripParams = false, successMessage) => {
|
|
84
|
+
try {
|
|
85
|
+
let value = link;
|
|
86
|
+
if (stripParams) {
|
|
87
|
+
const url = new URL(link);
|
|
88
|
+
value = `${url.origin}${url.pathname}`;
|
|
89
|
+
}
|
|
90
|
+
await navigator.clipboard.writeText(value);
|
|
91
|
+
handleSuccess("link", successMessage);
|
|
92
|
+
} catch (err) {
|
|
93
|
+
handleError(err, "link");
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
[notify]
|
|
97
|
+
);
|
|
98
|
+
const pasteText = useCallback(async () => {
|
|
99
|
+
try {
|
|
100
|
+
const text = await navigator.clipboard.readText();
|
|
101
|
+
setError(null);
|
|
102
|
+
return text;
|
|
103
|
+
} catch (err) {
|
|
104
|
+
setError(toError(err, "Failed to paste text"));
|
|
105
|
+
console.error("Failed to paste text: ", err);
|
|
106
|
+
return "";
|
|
107
|
+
}
|
|
108
|
+
}, []);
|
|
109
|
+
const pasteImage = useCallback(async () => {
|
|
110
|
+
try {
|
|
111
|
+
if (!navigator.clipboard?.read) return null;
|
|
112
|
+
const items = await navigator.clipboard.read();
|
|
113
|
+
for (const item of items) {
|
|
114
|
+
const imageType = item.types.find((type) => type.startsWith("image/"));
|
|
115
|
+
if (imageType) {
|
|
116
|
+
const blob = await item.getType(imageType);
|
|
117
|
+
return new File([blob], "pasted-image.png", { type: imageType });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
} catch (err) {
|
|
122
|
+
setError(toError(err, "Failed to paste image"));
|
|
123
|
+
console.error("Failed to paste image: ", err);
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}, []);
|
|
127
|
+
return { copyText, copyImage, copyLink, pasteText, pasteImage, lastCopied, error };
|
|
128
|
+
}
|
|
129
|
+
export {
|
|
130
|
+
useClipboard
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/clipboard.ts"],"sourcesContent":["\"use client\";\n\n/**\n * useClipboard — copy/paste text, links, and images with the browser quirks\n * already solved: image copy re-encodes through a canvas to PNG (the only type\n * `ClipboardItem` reliably accepts), paste-image feature-detects\n * `clipboard.read` (absent in Safari < 16.4) instead of throwing, and link\n * copy can strip query params.\n *\n * The notifier is INJECTED — the package does not know your toast system. The\n * host passes `notify` once (usually wrapping its toast); without it, successes\n * are silent and failures still land in `error` + the console, so nothing is\n * ever swallowed.\n */\nimport { useCallback, useState } from \"react\";\n\nexport type ClipboardNotifyKind = \"success\" | \"error\";\n\nexport interface UseClipboardOptions {\n /** Surface outcomes to the user — wrap your toast here. */\n notify?: (message: string, kind: ClipboardNotifyKind) => void;\n}\n\nexport interface UseClipboardResult {\n copyText: (text: string, successMessage?: string) => Promise<void>;\n copyImage: (imageSrc: string, successMessage?: string) => Promise<void>;\n copyLink: (\n link: string,\n stripParams?: boolean,\n successMessage?: string,\n ) => Promise<void>;\n pasteText: () => Promise<string>;\n pasteImage: () => Promise<File | null>;\n lastCopied: string | null;\n error: Error | null;\n}\n\nfunction toError(err: unknown, fallback: string): Error {\n if (err instanceof Error) return err;\n if (typeof err === \"string\" && err) return new Error(err);\n return new Error(fallback);\n}\n\nexport function useClipboard(\n options: UseClipboardOptions = {},\n): UseClipboardResult {\n const { notify } = options;\n const [lastCopied, setLastCopied] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const handleSuccess = (type: string, successMessage: string | undefined) => {\n setLastCopied(type);\n setError(null);\n notify?.(\n successMessage ??\n `${type.charAt(0).toUpperCase() + type.slice(1)} copied to clipboard!`,\n \"success\",\n );\n };\n\n const handleError = (err: unknown, type: string) => {\n const message = `Failed to copy ${type}`;\n setError(toError(err, message));\n console.error(message, err);\n notify?.(message, \"error\");\n };\n\n const copyText = useCallback(\n async (text: string, successMessage?: string) => {\n try {\n await navigator.clipboard.writeText(text);\n handleSuccess(\"text\", successMessage);\n } catch (err) {\n handleError(err, \"text\");\n }\n },\n [notify],\n );\n\n const copyImage = useCallback(\n async (imageSrc: string, successMessage?: string) => {\n try {\n const response = await fetch(imageSrc);\n if (!response.ok)\n throw new Error(`HTTP error! status: ${response.status}`);\n const blob = await response.blob();\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Failed to get canvas context\");\n\n return new Promise<void>((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n\n canvas.toBlob((pngBlob) => {\n if (pngBlob) {\n const item = new ClipboardItem({ \"image/png\": pngBlob });\n navigator.clipboard.write([item]).then(\n () => {\n handleSuccess(\"image\", successMessage);\n resolve();\n },\n (err) =>\n reject(\n toError(err, \"Failed to write image to clipboard\"),\n ),\n );\n } else {\n reject(new Error(\"Failed to convert image to PNG\"));\n }\n }, \"image/png\");\n };\n img.onerror = () => reject(new Error(\"Failed to load image\"));\n img.src = URL.createObjectURL(blob);\n });\n } catch (err) {\n handleError(err, \"image\");\n }\n },\n [notify],\n );\n\n const copyLink = useCallback(\n async (link: string, stripParams = false, successMessage?: string) => {\n try {\n let value = link;\n if (stripParams) {\n const url = new URL(link);\n value = `${url.origin}${url.pathname}`;\n }\n await navigator.clipboard.writeText(value);\n handleSuccess(\"link\", successMessage);\n } catch (err) {\n handleError(err, \"link\");\n }\n },\n [notify],\n );\n\n const pasteText = useCallback(async () => {\n try {\n const text = await navigator.clipboard.readText();\n setError(null);\n return text;\n } catch (err) {\n setError(toError(err, \"Failed to paste text\"));\n console.error(\"Failed to paste text: \", err);\n return \"\";\n }\n }, []);\n\n const pasteImage = useCallback(async () => {\n try {\n // clipboard.read() is not available in Safari < 16.4\n if (!navigator.clipboard?.read) return null;\n const items = await navigator.clipboard.read();\n for (const item of items) {\n const imageType = item.types.find((type) => type.startsWith(\"image/\"));\n if (imageType) {\n const blob = await item.getType(imageType);\n return new File([blob], \"pasted-image.png\", { type: imageType });\n }\n }\n return null;\n } catch (err) {\n setError(toError(err, \"Failed to paste image\"));\n console.error(\"Failed to paste image: \", err);\n return null;\n }\n }, []);\n\n return { copyText, copyImage, copyLink, pasteText, pasteImage, lastCopied, error };\n}\n"],"mappings":"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","names":[]}
|