diff --git a/README.md b/README.md
index 3b33f9a..e15f903 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Svelte Copy
-A svelte action to copy text to clipboard. It uses the `navigator.clipboard` api, with a fallback to the legacy method.
+A svelte attachment/action to copy text to clipboard. It uses the `navigator.clipboard` api, with a fallback to the legacy method.
# Installing
@@ -10,6 +10,8 @@ npm install svelte-copy -D
This library only works with Svelte 5, checkout [svelte-copy@1](https://www.npmjs.com/package/svelte-copy/v/1.4.2) for Svelte 3/4 support.
+[Actions (use:)](https://svelte.dev/docs/svelte/use) and [attachments (@attach)](https://svelte.dev/docs/svelte/@attach) are both supported.
+
# Usage
The simplest use is to just pass the text you want to copy:
@@ -19,7 +21,17 @@ The simplest use is to just pass the text you want to copy:
import { copy } from 'svelte-copy';
-
+
+ Click me!
+
+```
+
+```svelte
+
+
+
Click me!
```
@@ -32,7 +44,28 @@ You can expand that with an options object:
+ Copy
+
+```
+
+```svelte
+
+
+=6.0.0'}
-
'@esbuild/aix-ppc64@0.21.5':
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
engines: {node: '>=12'}
@@ -208,6 +204,9 @@ packages:
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
@@ -396,6 +395,11 @@ packages:
'@shikijs/vscode-textmate@9.3.0':
resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==}
+ '@sveltejs/acorn-typescript@1.0.13':
+ resolution: {integrity: sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==}
+ peerDependencies:
+ acorn: ^8.9.0
+
'@sveltejs/adapter-static@3.0.5':
resolution: {integrity: sha512-kFJR7RxeB6FBvrKZWAEzIALatgy11ISaaZbcPup8JdWUdrmmfUHHTJ738YHJTEfnCiiXi6aX8Q6ePY7tnSMD6Q==}
peerDependencies:
@@ -480,18 +484,13 @@ packages:
'@vitest/utils@2.1.3':
resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==}
- acorn-typescript@1.4.13:
- resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==}
- peerDependencies:
- acorn: '>=8.9.0'
-
acorn@8.13.0:
resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==}
engines: {node: '>=0.4.0'}
hasBin: true
- aria-query@5.3.2:
- resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ aria-query@5.3.1:
+ resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==}
engines: {node: '>= 0.4'}
assertion-error@2.0.1:
@@ -537,6 +536,10 @@ packages:
resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==}
engines: {node: '>= 14.16.0'}
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
@@ -584,6 +587,9 @@ packages:
devalue@5.1.1:
resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
+ devalue@5.9.2:
+ resolution: {integrity: sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w==}
+
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
@@ -599,8 +605,16 @@ packages:
esm-env@1.0.0:
resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==}
- esrap@1.2.2:
- resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==}
+ esm-env@1.2.2:
+ resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
+
+ esrap@2.3.6:
+ resolution: {integrity: sha512-yc0OC12UjPqLoc+fe+v5GNs4TOjAigUw3sTikfC+xeBPGUw7gDRz3DtYaqEhxyMVJojcSWJw7jT0QWR+CbuE/A==}
+ peerDependencies:
+ '@typescript-eslint/types': ^8.2.0
+ peerDependenciesMeta:
+ '@typescript-eslint/types':
+ optional: true
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
@@ -673,8 +687,8 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
- is-reference@3.0.2:
- resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
+ is-reference@3.0.3:
+ resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==}
kleur@4.1.5:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
@@ -865,8 +879,8 @@ packages:
svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0
typescript: ^4.9.4 || ^5.0.0
- svelte@5.0.2:
- resolution: {integrity: sha512-TIqp5kjyTMa45L0McUvVfjuvlF/hyxVolyAc9APY3/FeF5aqYpt+Y1PckPQ7DlsDkthxNeq2+ystop8GlIV3kw==}
+ svelte@5.57.0:
+ resolution: {integrity: sha512-NdbDn7fl4be1ViUG0oq/lvG6OZy3oENolV2ONjiqqsfVoeAfzaQAKUcEX3MrQod/Bebv1PgwET9rfXhgn9s4Kg==}
engines: {node: '>=18'}
tiny-glob@0.2.9:
@@ -1023,11 +1037,6 @@ packages:
snapshots:
- '@ampproject/remapping@2.3.0':
- dependencies:
- '@jridgewell/gen-mapping': 0.3.5
- '@jridgewell/trace-mapping': 0.3.25
-
'@esbuild/aix-ppc64@0.21.5':
optional: true
@@ -1103,6 +1112,11 @@ snapshots:
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/set-array@1.2.1': {}
@@ -1247,13 +1261,17 @@ snapshots:
'@shikijs/vscode-textmate@9.3.0': {}
- '@sveltejs/adapter-static@3.0.5(@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.0.2)(vite@5.4.9(sass@1.80.3)))(svelte@5.0.2)(vite@5.4.9(sass@1.80.3)))':
+ '@sveltejs/acorn-typescript@1.0.13(acorn@8.13.0)':
dependencies:
- '@sveltejs/kit': 2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.0.2)(vite@5.4.9(sass@1.80.3)))(svelte@5.0.2)(vite@5.4.9(sass@1.80.3))
+ acorn: 8.13.0
+
+ '@sveltejs/adapter-static@3.0.5(@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.57.0)(vite@5.4.9(sass@1.80.3)))(svelte@5.57.0)(vite@5.4.9(sass@1.80.3)))':
+ dependencies:
+ '@sveltejs/kit': 2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.57.0)(vite@5.4.9(sass@1.80.3)))(svelte@5.57.0)(vite@5.4.9(sass@1.80.3))
- '@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.0.2)(vite@5.4.9(sass@1.80.3)))(svelte@5.0.2)(vite@5.4.9(sass@1.80.3))':
+ '@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.57.0)(vite@5.4.9(sass@1.80.3)))(svelte@5.57.0)(vite@5.4.9(sass@1.80.3))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.0.2)(vite@5.4.9(sass@1.80.3))
+ '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.57.0)(vite@5.4.9(sass@1.80.3))
'@types/cookie': 0.6.0
cookie: 0.6.0
devalue: 5.1.1
@@ -1265,38 +1283,38 @@ snapshots:
sade: 1.8.1
set-cookie-parser: 2.7.0
sirv: 3.0.0
- svelte: 5.0.2
+ svelte: 5.57.0
tiny-glob: 0.2.9
vite: 5.4.9(sass@1.80.3)
- '@sveltejs/package@2.3.5(svelte@5.0.2)(typescript@5.6.3)':
+ '@sveltejs/package@2.3.5(svelte@5.57.0)(typescript@5.6.3)':
dependencies:
chokidar: 4.0.1
kleur: 4.1.5
sade: 1.8.1
semver: 7.6.3
- svelte: 5.0.2
- svelte2tsx: 0.7.22(svelte@5.0.2)(typescript@5.6.3)
+ svelte: 5.57.0
+ svelte2tsx: 0.7.22(svelte@5.57.0)(typescript@5.6.3)
transitivePeerDependencies:
- typescript
- '@sveltejs/vite-plugin-svelte-inspector@3.0.0(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.0.2)(vite@5.4.9(sass@1.80.3)))(svelte@5.0.2)(vite@5.4.9(sass@1.80.3))':
+ '@sveltejs/vite-plugin-svelte-inspector@3.0.0(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.57.0)(vite@5.4.9(sass@1.80.3)))(svelte@5.57.0)(vite@5.4.9(sass@1.80.3))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.0.2)(vite@5.4.9(sass@1.80.3))
+ '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.57.0)(vite@5.4.9(sass@1.80.3))
debug: 4.3.7
- svelte: 5.0.2
+ svelte: 5.57.0
vite: 5.4.9(sass@1.80.3)
transitivePeerDependencies:
- supports-color
- '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.0.2)(vite@5.4.9(sass@1.80.3))':
+ '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.57.0)(vite@5.4.9(sass@1.80.3))':
dependencies:
- '@sveltejs/vite-plugin-svelte-inspector': 3.0.0(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.0.2)(vite@5.4.9(sass@1.80.3)))(svelte@5.0.2)(vite@5.4.9(sass@1.80.3))
+ '@sveltejs/vite-plugin-svelte-inspector': 3.0.0(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.57.0)(vite@5.4.9(sass@1.80.3)))(svelte@5.57.0)(vite@5.4.9(sass@1.80.3))
debug: 4.3.7
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.12
- svelte: 5.0.2
+ svelte: 5.57.0
vite: 5.4.9(sass@1.80.3)
vitefu: 1.0.3(vite@5.4.9(sass@1.80.3))
transitivePeerDependencies:
@@ -1358,13 +1376,9 @@ snapshots:
loupe: 3.1.2
tinyrainbow: 1.2.0
- acorn-typescript@1.4.13(acorn@8.13.0):
- dependencies:
- acorn: 8.13.0
-
acorn@8.13.0: {}
- aria-query@5.3.2: {}
+ aria-query@5.3.1: {}
assertion-error@2.0.1: {}
@@ -1402,6 +1416,8 @@ snapshots:
dependencies:
readdirp: 4.0.2
+ clsx@2.1.1: {}
+
comma-separated-tokens@2.0.3: {}
cookie@0.6.0: {}
@@ -1424,6 +1440,8 @@ snapshots:
devalue@5.1.1: {}
+ devalue@5.9.2: {}
+
devlop@1.1.0:
dependencies:
dequal: 2.0.3
@@ -1458,10 +1476,11 @@ snapshots:
esm-env@1.0.0: {}
- esrap@1.2.2:
+ esm-env@1.2.2: {}
+
+ esrap@2.3.6:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
- '@types/estree': 1.0.6
estree-walker@3.0.3:
dependencies:
@@ -1539,7 +1558,7 @@ snapshots:
is-number@7.0.0: {}
- is-reference@3.0.2:
+ is-reference@3.0.3:
dependencies:
'@types/estree': 1.0.6
@@ -1650,10 +1669,10 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
- prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.0.2):
+ prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.57.0):
dependencies:
prettier: 3.3.3
- svelte: 5.0.2
+ svelte: 5.57.0
prettier@3.3.3: {}
@@ -1691,10 +1710,10 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.24.0
fsevents: 2.3.3
- runed@0.15.3(svelte@5.0.2):
+ runed@0.15.3(svelte@5.57.0):
dependencies:
esm-env: 1.0.0
- svelte: 5.0.2
+ svelte: 5.57.0
sade@1.8.1:
dependencies:
@@ -1741,28 +1760,32 @@ snapshots:
character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0
- svelte2tsx@0.7.22(svelte@5.0.2)(typescript@5.6.3):
+ svelte2tsx@0.7.22(svelte@5.57.0)(typescript@5.6.3):
dependencies:
dedent-js: 1.0.1
pascal-case: 3.1.2
- svelte: 5.0.2
+ svelte: 5.57.0
typescript: 5.6.3
- svelte@5.0.2:
+ svelte@5.57.0:
dependencies:
- '@ampproject/remapping': 2.3.0
+ '@jridgewell/remapping': 2.3.5
'@jridgewell/sourcemap-codec': 1.5.0
+ '@sveltejs/acorn-typescript': 1.0.13(acorn@8.13.0)
'@types/estree': 1.0.6
acorn: 8.13.0
- acorn-typescript: 1.4.13(acorn@8.13.0)
- aria-query: 5.3.2
+ aria-query: 5.3.1
axobject-query: 4.1.0
- esm-env: 1.0.0
- esrap: 1.2.2
- is-reference: 3.0.2
+ clsx: 2.1.1
+ devalue: 5.9.2
+ esm-env: 1.2.2
+ esrap: 2.3.6
+ is-reference: 3.0.3
locate-character: 3.0.0
magic-string: 0.30.12
zimmerframe: 1.1.2
+ transitivePeerDependencies:
+ - '@typescript-eslint/types'
tiny-glob@0.2.9:
dependencies:
diff --git a/src/lib/copy.ts b/src/lib/copy.ts
index 91039a2..f289326 100644
--- a/src/lib/copy.ts
+++ b/src/lib/copy.ts
@@ -1,5 +1,6 @@
import type { Action } from 'svelte/action';
import type { Options } from './types';
+import { fromAction } from 'svelte/attachments';
export async function copyText(text: string) {
if ('clipboard' in navigator) {
@@ -62,14 +63,14 @@ function removeListeners(
* @example
*
*
*
- *
+ *
* Click me!
*
*/
-export const copy: Action = (
+export const copyAction: Action = (
element: Element,
initialOptions: string | Options,
) => {
@@ -105,3 +106,21 @@ export const copy: Action = (
},
};
};
+
+/**
+ * A svelte attachment to copy text to clipboard.
+ *
+ * @see https://svelte-copy.willow.codes
+ *
+ * @example
+ *
+ *
+ *
+ *
+ * Click me!
+ *
+ */
+export const copy = (options: string | Options) =>
+ fromAction(copyAction, () => options);
diff --git a/src/lib/index.ts b/src/lib/index.ts
index ee9a137..cc9214e 100644
--- a/src/lib/index.ts
+++ b/src/lib/index.ts
@@ -1,4 +1,4 @@
-export { copy, copyText } from './copy';
+export { copy, copyAction, copyText } from './copy';
export type {
Options,
ErrorCallback,
diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts
index 1381c1c..deb02b8 100644
--- a/src/routes/+page.server.ts
+++ b/src/routes/+page.server.ts
@@ -11,94 +11,186 @@ async function highlight(code: string) {
export async function load() {
return {
examples: {
- simple: await highlight(dedent`
-
+ attachment: {
+ simple: await highlight(dedent`
+
-
- Copy
-
- `),
- simpleObject: await highlight(dedent`
-
- Copy
-
- `),
- simpleCopyAlert: await highlight(dedent`
-
- Copy
-
- `),
- copyAlert: await highlight(dedent`
-
- Copy
-
- `),
- errorAlert: await highlight(dedent`
-
- Copy
-
- `),
- customEvents: await highlight(dedent`
-
- Copy
-
- `),
+
+ Copy
+
+ `),
+ simpleObject: await highlight(dedent`
+
+ Copy
+
+ `),
+ simpleCopyAlert: await highlight(dedent`
+
+ Copy
+
+ `),
+ copyAlert: await highlight(dedent`
+
+ Copy
+
+ `),
+ errorAlert: await highlight(dedent`
+
+ Copy
+
+ `),
+ customEvents: await highlight(dedent`
+
+ Copy
+
+ `),
+ copyText: await highlight(dedent`
+
+
+
+ `),
+ },
+ action: {
+ simple: await highlight(dedent`
+
+
+
+ Copy
+
+ `),
+ simpleObject: await highlight(dedent`
+
+ Copy
+
+ `),
+ simpleCopyAlert: await highlight(dedent`
+
+ Copy
+
+ `),
+ copyAlert: await highlight(dedent`
+
+ Copy
+
+ `),
+ errorAlert: await highlight(dedent`
+
+ Copy
+
+ `),
+ customEvents: await highlight(dedent`
+
+ Copy
+
+ `),
+ },
copyText: await highlight(dedent`
-
+ $effect(() => {
+ if (debounced.current) {
+ copyText(debounced.current)
+ .then(() => alert('Copied!'))
+ .catch((error) => alert(error?.message));
+ }
+ });
+
-
- `),
+
+ `),
},
};
}
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 0748a35..21b771e 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -2,7 +2,7 @@
import CopyTextExample from './CopyTextExample.svelte';
import Example from './Example.svelte';
import GitHub from './GitHub.svelte';
- import { copy } from '$lib';
+ import { copy, copyAction } from '$lib';
const { data } = $props();
@@ -20,27 +20,128 @@
The simplest use is to just pass the text you want to copy
-
+
{#snippet children(text)}
- Copy
+ Copy
{/snippet}
We could pass this as an object
-
+
{#snippet children(text)}
- Copy
+ Copy
{/snippet}
Let's alert the user if the text was copied
-
+
{#snippet children(text)}
+ Copy
+
+ {/snippet}
+
+
+ We could tell the user what was copied
+
+
+ {#snippet children(text)}
+
+ Copy
+
+ {/snippet}
+
+
+ If there was an error, we can check for that too
+
+
+ {#snippet children(text)}
+
+ Copy
+
+ {/snippet}
+
+
+ We can trigger the copy on custom events
+
+
+ {#snippet children(text)}
+
+ Copy
+
+ {/snippet}
+
+
+
+
-
+
{#snippet children(text)}
If there was an error, we can check for that too
-
+
{#snippet children(text)}
We can trigger the copy on custom events
-
+
{#snippet children(text)}