@zag-js/clipboard 0.50.0 → 0.51.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.js CHANGED
@@ -1,246 +1,2 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
23
- anatomy: () => anatomy,
24
- connect: () => connect,
25
- contextProps: () => contextProps,
26
- indicatorProps: () => indicatorProps,
27
- machine: () => machine,
28
- props: () => props,
29
- splitIndicatorProps: () => splitIndicatorProps
30
- });
31
- module.exports = __toCommonJS(src_exports);
32
-
33
- // src/clipboard.anatomy.ts
34
- var import_anatomy = require("@zag-js/anatomy");
35
- var anatomy = (0, import_anatomy.createAnatomy)("clipboard").parts("root", "control", "trigger", "indicator", "input", "label");
36
- var parts = anatomy.build();
37
-
38
- // src/clipboard.connect.ts
39
- var import_dom_query2 = require("@zag-js/dom-query");
40
-
41
- // src/clipboard.dom.ts
42
- var import_dom_query = require("@zag-js/dom-query");
43
- var dom = (0, import_dom_query.createScope)({
44
- getRootId: (ctx) => ctx.ids?.root ?? `clip-${ctx.id}`,
45
- getInputId: (ctx) => ctx.ids?.input ?? `clip-input-${ctx.id}`,
46
- getLabelId: (ctx) => ctx.ids?.label ?? `clip-label-${ctx.id}`,
47
- getInputEl: (ctx) => dom.getById(ctx, dom.getInputId(ctx)),
48
- writeToClipboard: (ctx) => copyText(dom.getDoc(ctx), ctx.value)
49
- });
50
- function createNode(doc, text) {
51
- const node = doc.createElement("pre");
52
- Object.assign(node.style, {
53
- width: "1px",
54
- height: "1px",
55
- position: "fixed",
56
- top: "5px"
57
- });
58
- node.textContent = text;
59
- return node;
60
- }
61
- function copyNode(node) {
62
- const win = (0, import_dom_query.getWindow)(node);
63
- const selection = win.getSelection();
64
- if (selection == null) {
65
- return Promise.reject(new Error());
66
- }
67
- selection.removeAllRanges();
68
- const doc = node.ownerDocument;
69
- const range = doc.createRange();
70
- range.selectNodeContents(node);
71
- selection.addRange(range);
72
- doc.execCommand("copy");
73
- selection.removeAllRanges();
74
- return Promise.resolve();
75
- }
76
- function copyText(doc, text) {
77
- const win = doc.defaultView || window;
78
- if (win.navigator.clipboard?.writeText !== void 0) {
79
- return win.navigator.clipboard.writeText(text);
80
- }
81
- if (!doc.body) {
82
- return Promise.reject(new Error());
83
- }
84
- const node = createNode(doc, text);
85
- doc.body.appendChild(node);
86
- copyNode(node);
87
- doc.body.removeChild(node);
88
- return Promise.resolve();
89
- }
90
-
91
- // src/clipboard.connect.ts
92
- function connect(state, send, normalize) {
93
- const copied = state.matches("copied");
94
- return {
95
- copied,
96
- value: state.context.value,
97
- setValue(value) {
98
- send({ type: "VALUE.SET", value });
99
- },
100
- copy() {
101
- send({ type: "COPY" });
102
- },
103
- rootProps: normalize.element({
104
- ...parts.root.attrs,
105
- "data-copied": (0, import_dom_query2.dataAttr)(copied),
106
- id: dom.getRootId(state.context)
107
- }),
108
- labelProps: normalize.label({
109
- ...parts.label.attrs,
110
- htmlFor: dom.getInputId(state.context),
111
- "data-copied": (0, import_dom_query2.dataAttr)(copied),
112
- id: dom.getLabelId(state.context)
113
- }),
114
- controlProps: normalize.element({
115
- ...parts.control.attrs,
116
- "data-copied": (0, import_dom_query2.dataAttr)(copied)
117
- }),
118
- inputProps: normalize.input({
119
- ...parts.input.attrs,
120
- defaultValue: state.context.value,
121
- "data-copied": (0, import_dom_query2.dataAttr)(copied),
122
- readOnly: true,
123
- "data-readonly": "true",
124
- id: dom.getInputId(state.context),
125
- onFocus(event) {
126
- event.currentTarget.select();
127
- },
128
- onCopy() {
129
- send({ type: "INPUT.COPY" });
130
- }
131
- }),
132
- triggerProps: normalize.button({
133
- ...parts.trigger.attrs,
134
- "aria-label": copied ? "Copied to clipboard" : "Copy to clipboard",
135
- "data-copied": (0, import_dom_query2.dataAttr)(copied),
136
- onClick() {
137
- send({ type: "COPY" });
138
- }
139
- }),
140
- getIndicatorProps(props2) {
141
- return normalize.element({
142
- ...parts.indicator.attrs,
143
- hidden: props2.copied !== copied
144
- });
145
- }
146
- };
147
- }
148
-
149
- // src/clipboard.machine.ts
150
- var import_core = require("@zag-js/core");
151
- var import_utils = require("@zag-js/utils");
152
- function machine(userContext) {
153
- const ctx = (0, import_utils.compact)(userContext);
154
- return (0, import_core.createMachine)(
155
- {
156
- id: "clipboard",
157
- initial: "idle",
158
- context: {
159
- value: "",
160
- timeout: 3e3,
161
- ...ctx
162
- },
163
- watch: {
164
- value: ["syncInputElement"]
165
- },
166
- on: {
167
- "VALUE.SET": {
168
- actions: ["setValue"]
169
- },
170
- COPY: {
171
- target: "copied",
172
- actions: ["copyToClipboard", "invokeOnCopy"]
173
- }
174
- },
175
- states: {
176
- idle: {
177
- on: {
178
- "INPUT.COPY": {
179
- target: "copied",
180
- actions: ["invokeOnCopy"]
181
- }
182
- }
183
- },
184
- copied: {
185
- after: {
186
- COPY_TIMEOUT: "idle"
187
- },
188
- on: {
189
- COPY: {
190
- target: "copied",
191
- actions: ["copyToClipboard", "invokeOnCopy"]
192
- },
193
- "INPUT.COPY": {
194
- actions: ["invokeOnCopy"]
195
- }
196
- }
197
- }
198
- }
199
- },
200
- {
201
- actions: {
202
- setValue(ctx2, evt) {
203
- ctx2.value = evt.value;
204
- },
205
- copyToClipboard(ctx2) {
206
- dom.writeToClipboard(ctx2);
207
- },
208
- invokeOnCopy(ctx2) {
209
- ctx2.onStatusChange?.({ copied: true });
210
- },
211
- syncInputElement(ctx2) {
212
- dom.setValue(dom.getInputEl(ctx2), ctx2.value);
213
- }
214
- },
215
- delays: {
216
- COPY_TIMEOUT: (ctx2) => ctx2.timeout
217
- }
218
- }
219
- );
220
- }
221
-
222
- // src/clipboard.props.ts
223
- var import_types = require("@zag-js/types");
224
- var import_utils2 = require("@zag-js/utils");
225
- var props = (0, import_types.createProps)()([
226
- "getRootNode",
227
- "id",
228
- "ids",
229
- "value",
230
- "timeout",
231
- "onStatusChange"
232
- ]);
233
- var contextProps = (0, import_utils2.createSplitProps)(props);
234
- var indicatorProps = (0, import_types.createProps)()(["copied"]);
235
- var splitIndicatorProps = (0, import_utils2.createSplitProps)(indicatorProps);
236
- // Annotate the CommonJS export names for ESM import in node:
237
- 0 && (module.exports = {
238
- anatomy,
239
- connect,
240
- contextProps,
241
- indicatorProps,
242
- machine,
243
- props,
244
- splitIndicatorProps
245
- });
1
+ "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var src_exports={};__export(src_exports,{anatomy:()=>anatomy,connect:()=>connect,contextProps:()=>contextProps,indicatorProps:()=>indicatorProps,machine:()=>machine,props:()=>props,splitIndicatorProps:()=>splitIndicatorProps});module.exports=__toCommonJS(src_exports);var import_anatomy=require("@zag-js/anatomy");var anatomy=(0,import_anatomy.createAnatomy)("clipboard").parts("root","control","trigger","indicator","input","label");var parts=anatomy.build();var import_dom_query2=require("@zag-js/dom-query");var import_dom_query=require("@zag-js/dom-query");var dom=(0,import_dom_query.createScope)({getRootId:ctx=>ctx.ids?.root??`clip-${ctx.id}`,getInputId:ctx=>ctx.ids?.input??`clip-input-${ctx.id}`,getLabelId:ctx=>ctx.ids?.label??`clip-label-${ctx.id}`,getInputEl:ctx=>dom.getById(ctx,dom.getInputId(ctx)),writeToClipboard:ctx=>copyText(dom.getDoc(ctx),ctx.value)});function createNode(doc,text){const node=doc.createElement("pre");Object.assign(node.style,{width:"1px",height:"1px",position:"fixed",top:"5px"});node.textContent=text;return node}function copyNode(node){const win=(0,import_dom_query.getWindow)(node);const selection=win.getSelection();if(selection==null){return Promise.reject(new Error)}selection.removeAllRanges();const doc=node.ownerDocument;const range=doc.createRange();range.selectNodeContents(node);selection.addRange(range);doc.execCommand("copy");selection.removeAllRanges();return Promise.resolve()}function copyText(doc,text){const win=doc.defaultView||window;if(win.navigator.clipboard?.writeText!==void 0){return win.navigator.clipboard.writeText(text)}if(!doc.body){return Promise.reject(new Error)}const node=createNode(doc,text);doc.body.appendChild(node);copyNode(node);doc.body.removeChild(node);return Promise.resolve()}function connect(state,send,normalize){const copied=state.matches("copied");return{copied,value:state.context.value,setValue(value){send({type:"VALUE.SET",value})},copy(){send({type:"COPY"})},rootProps:normalize.element({...parts.root.attrs,"data-copied":(0,import_dom_query2.dataAttr)(copied),id:dom.getRootId(state.context)}),labelProps:normalize.label({...parts.label.attrs,htmlFor:dom.getInputId(state.context),"data-copied":(0,import_dom_query2.dataAttr)(copied),id:dom.getLabelId(state.context)}),controlProps:normalize.element({...parts.control.attrs,"data-copied":(0,import_dom_query2.dataAttr)(copied)}),inputProps:normalize.input({...parts.input.attrs,defaultValue:state.context.value,"data-copied":(0,import_dom_query2.dataAttr)(copied),readOnly:true,"data-readonly":"true",id:dom.getInputId(state.context),onFocus(event){event.currentTarget.select()},onCopy(){send({type:"INPUT.COPY"})}}),triggerProps:normalize.button({...parts.trigger.attrs,"aria-label":copied?"Copied to clipboard":"Copy to clipboard","data-copied":(0,import_dom_query2.dataAttr)(copied),onClick(){send({type:"COPY"})}}),getIndicatorProps(props2){return normalize.element({...parts.indicator.attrs,hidden:props2.copied!==copied})}}}var import_core=require("@zag-js/core");var import_utils=require("@zag-js/utils");function machine(userContext){const ctx=(0,import_utils.compact)(userContext);return(0,import_core.createMachine)({id:"clipboard",initial:"idle",context:{value:"",timeout:3e3,...ctx},watch:{value:["syncInputElement"]},on:{"VALUE.SET":{actions:["setValue"]},COPY:{target:"copied",actions:["copyToClipboard","invokeOnCopy"]}},states:{idle:{on:{"INPUT.COPY":{target:"copied",actions:["invokeOnCopy"]}}},copied:{after:{COPY_TIMEOUT:"idle"},on:{COPY:{target:"copied",actions:["copyToClipboard","invokeOnCopy"]},"INPUT.COPY":{actions:["invokeOnCopy"]}}}}},{actions:{setValue(ctx2,evt){ctx2.value=evt.value},copyToClipboard(ctx2){dom.writeToClipboard(ctx2)},invokeOnCopy(ctx2){ctx2.onStatusChange?.({copied:true})},syncInputElement(ctx2){dom.setValue(dom.getInputEl(ctx2),ctx2.value)}},delays:{COPY_TIMEOUT:ctx2=>ctx2.timeout}})}var import_types=require("@zag-js/types");var import_utils2=require("@zag-js/utils");var props=(0,import_types.createProps)()(["getRootNode","id","ids","value","timeout","onStatusChange"]);var contextProps=(0,import_utils2.createSplitProps)(props);var indicatorProps=(0,import_types.createProps)()(["copied"]);var splitIndicatorProps=(0,import_utils2.createSplitProps)(indicatorProps);0&&(module.exports={anatomy,connect,contextProps,indicatorProps,machine,props,splitIndicatorProps});
246
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/clipboard.anatomy.ts","../src/clipboard.connect.ts","../src/clipboard.dom.ts","../src/clipboard.machine.ts","../src/clipboard.props.ts"],"sourcesContent":["export { anatomy } from \"./clipboard.anatomy\"\nexport { connect } from \"./clipboard.connect\"\nexport { machine } from \"./clipboard.machine\"\nexport * from \"./clipboard.props\"\nexport type {\n MachineApi as Api,\n UserDefinedContext as Context,\n CopyStatusDetails,\n ElementIds,\n IndicatorProps,\n} from \"./clipboard.types\"\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"clipboard\").parts(\"root\", \"control\", \"trigger\", \"indicator\", \"input\", \"label\")\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./clipboard.anatomy\"\nimport type { MachineApi, Send, State } from \"./clipboard.types\"\nimport { dom } from \"./clipboard.dom\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const copied = state.matches(\"copied\")\n\n return {\n copied,\n value: state.context.value,\n setValue(value) {\n send({ type: \"VALUE.SET\", value })\n },\n copy() {\n send({ type: \"COPY\" })\n },\n rootProps: normalize.element({\n ...parts.root.attrs,\n \"data-copied\": dataAttr(copied),\n id: dom.getRootId(state.context),\n }),\n labelProps: normalize.label({\n ...parts.label.attrs,\n htmlFor: dom.getInputId(state.context),\n \"data-copied\": dataAttr(copied),\n id: dom.getLabelId(state.context),\n }),\n controlProps: normalize.element({\n ...parts.control.attrs,\n \"data-copied\": dataAttr(copied),\n }),\n inputProps: normalize.input({\n ...parts.input.attrs,\n defaultValue: state.context.value,\n \"data-copied\": dataAttr(copied),\n readOnly: true,\n \"data-readonly\": \"true\",\n id: dom.getInputId(state.context),\n onFocus(event) {\n event.currentTarget.select()\n },\n onCopy() {\n send({ type: \"INPUT.COPY\" })\n },\n }),\n triggerProps: normalize.button({\n ...parts.trigger.attrs,\n \"aria-label\": copied ? \"Copied to clipboard\" : \"Copy to clipboard\",\n \"data-copied\": dataAttr(copied),\n onClick() {\n send({ type: \"COPY\" })\n },\n }),\n getIndicatorProps(props) {\n return normalize.element({\n ...parts.indicator.attrs,\n hidden: props.copied !== copied,\n })\n },\n }\n}\n","import { createScope, getWindow } from \"@zag-js/dom-query\"\nimport type { MachineContext as Ctx } from \"./clipboard.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `clip-${ctx.id}`,\n getInputId: (ctx: Ctx) => ctx.ids?.input ?? `clip-input-${ctx.id}`,\n getLabelId: (ctx: Ctx) => ctx.ids?.label ?? `clip-label-${ctx.id}`,\n getInputEl: (ctx: Ctx) => dom.getById<HTMLInputElement>(ctx, dom.getInputId(ctx)),\n writeToClipboard: (ctx: Ctx) => copyText(dom.getDoc(ctx), ctx.value),\n})\n\nfunction createNode(doc: Document, text: string): HTMLElement {\n const node = doc.createElement(\"pre\")\n Object.assign(node.style, {\n width: \"1px\",\n height: \"1px\",\n position: \"fixed\",\n top: \"5px\",\n })\n node.textContent = text\n return node\n}\n\nfunction copyNode(node: HTMLElement): Promise<void> {\n const win = getWindow(node)\n\n const selection = win.getSelection()\n\n if (selection == null) {\n return Promise.reject(new Error())\n }\n\n selection.removeAllRanges()\n\n const doc = node.ownerDocument\n\n const range = doc.createRange()\n range.selectNodeContents(node)\n selection.addRange(range)\n\n doc.execCommand(\"copy\")\n selection.removeAllRanges()\n\n return Promise.resolve()\n}\n\nfunction copyText(doc: Document, text: string): Promise<void> {\n const win = doc.defaultView || window\n\n if (win.navigator.clipboard?.writeText !== undefined) {\n return win.navigator.clipboard.writeText(text)\n }\n\n if (!doc.body) {\n return Promise.reject(new Error())\n }\n\n const node = createNode(doc, text)\n\n doc.body.appendChild(node)\n copyNode(node)\n doc.body.removeChild(node)\n\n return Promise.resolve()\n}\n","import { createMachine } from \"@zag-js/core\"\nimport { compact } from \"@zag-js/utils\"\nimport { dom } from \"./clipboard.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./clipboard.types\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"clipboard\",\n initial: \"idle\",\n context: {\n value: \"\",\n timeout: 3000,\n ...ctx,\n },\n watch: {\n value: [\"syncInputElement\"],\n },\n on: {\n \"VALUE.SET\": {\n actions: [\"setValue\"],\n },\n COPY: {\n target: \"copied\",\n actions: [\"copyToClipboard\", \"invokeOnCopy\"],\n },\n },\n states: {\n idle: {\n on: {\n \"INPUT.COPY\": {\n target: \"copied\",\n actions: [\"invokeOnCopy\"],\n },\n },\n },\n copied: {\n after: {\n COPY_TIMEOUT: \"idle\",\n },\n on: {\n COPY: {\n target: \"copied\",\n actions: [\"copyToClipboard\", \"invokeOnCopy\"],\n },\n \"INPUT.COPY\": {\n actions: [\"invokeOnCopy\"],\n },\n },\n },\n },\n },\n {\n actions: {\n setValue(ctx, evt) {\n ctx.value = evt.value\n },\n copyToClipboard(ctx) {\n dom.writeToClipboard(ctx)\n },\n invokeOnCopy(ctx) {\n ctx.onStatusChange?.({ copied: true })\n },\n syncInputElement(ctx) {\n dom.setValue(dom.getInputEl(ctx), ctx.value)\n },\n },\n delays: {\n COPY_TIMEOUT: (ctx) => ctx.timeout,\n },\n },\n )\n}\n","import { createProps } from \"@zag-js/types\"\nimport type { IndicatorProps, UserDefinedContext } from \"./clipboard.types\"\nimport { createSplitProps } from \"@zag-js/utils\"\n\nexport const props = createProps<UserDefinedContext>()([\n \"getRootNode\",\n \"id\",\n \"ids\",\n \"value\",\n \"timeout\",\n \"onStatusChange\",\n])\nexport const contextProps = createSplitProps<UserDefinedContext>(props)\n\nexport const indicatorProps = createProps<IndicatorProps>()([\"copied\"])\nexport const splitIndicatorProps = createSplitProps<IndicatorProps>(indicatorProps)\n"],"mappings":"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","names":["import_dom_query","props","ctx","import_utils"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/clipboard.anatomy.ts","../src/clipboard.connect.ts","../src/clipboard.dom.ts","../src/clipboard.machine.ts","../src/clipboard.props.ts"],"sourcesContent":["export { anatomy } from \"./clipboard.anatomy\"\nexport { connect } from \"./clipboard.connect\"\nexport { machine } from \"./clipboard.machine\"\nexport * from \"./clipboard.props\"\nexport type {\n MachineApi as Api,\n UserDefinedContext as Context,\n CopyStatusDetails,\n ElementIds,\n IndicatorProps,\n} from \"./clipboard.types\"\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"clipboard\").parts(\"root\", \"control\", \"trigger\", \"indicator\", \"input\", \"label\")\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./clipboard.anatomy\"\nimport type { MachineApi, Send, State } from \"./clipboard.types\"\nimport { dom } from \"./clipboard.dom\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const copied = state.matches(\"copied\")\n\n return {\n copied,\n value: state.context.value,\n setValue(value) {\n send({ type: \"VALUE.SET\", value })\n },\n copy() {\n send({ type: \"COPY\" })\n },\n rootProps: normalize.element({\n ...parts.root.attrs,\n \"data-copied\": dataAttr(copied),\n id: dom.getRootId(state.context),\n }),\n labelProps: normalize.label({\n ...parts.label.attrs,\n htmlFor: dom.getInputId(state.context),\n \"data-copied\": dataAttr(copied),\n id: dom.getLabelId(state.context),\n }),\n controlProps: normalize.element({\n ...parts.control.attrs,\n \"data-copied\": dataAttr(copied),\n }),\n inputProps: normalize.input({\n ...parts.input.attrs,\n defaultValue: state.context.value,\n \"data-copied\": dataAttr(copied),\n readOnly: true,\n \"data-readonly\": \"true\",\n id: dom.getInputId(state.context),\n onFocus(event) {\n event.currentTarget.select()\n },\n onCopy() {\n send({ type: \"INPUT.COPY\" })\n },\n }),\n triggerProps: normalize.button({\n ...parts.trigger.attrs,\n \"aria-label\": copied ? \"Copied to clipboard\" : \"Copy to clipboard\",\n \"data-copied\": dataAttr(copied),\n onClick() {\n send({ type: \"COPY\" })\n },\n }),\n getIndicatorProps(props) {\n return normalize.element({\n ...parts.indicator.attrs,\n hidden: props.copied !== copied,\n })\n },\n }\n}\n","import { createScope, getWindow } from \"@zag-js/dom-query\"\nimport type { MachineContext as Ctx } from \"./clipboard.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `clip-${ctx.id}`,\n getInputId: (ctx: Ctx) => ctx.ids?.input ?? `clip-input-${ctx.id}`,\n getLabelId: (ctx: Ctx) => ctx.ids?.label ?? `clip-label-${ctx.id}`,\n getInputEl: (ctx: Ctx) => dom.getById<HTMLInputElement>(ctx, dom.getInputId(ctx)),\n writeToClipboard: (ctx: Ctx) => copyText(dom.getDoc(ctx), ctx.value),\n})\n\nfunction createNode(doc: Document, text: string): HTMLElement {\n const node = doc.createElement(\"pre\")\n Object.assign(node.style, {\n width: \"1px\",\n height: \"1px\",\n position: \"fixed\",\n top: \"5px\",\n })\n node.textContent = text\n return node\n}\n\nfunction copyNode(node: HTMLElement): Promise<void> {\n const win = getWindow(node)\n\n const selection = win.getSelection()\n\n if (selection == null) {\n return Promise.reject(new Error())\n }\n\n selection.removeAllRanges()\n\n const doc = node.ownerDocument\n\n const range = doc.createRange()\n range.selectNodeContents(node)\n selection.addRange(range)\n\n doc.execCommand(\"copy\")\n selection.removeAllRanges()\n\n return Promise.resolve()\n}\n\nfunction copyText(doc: Document, text: string): Promise<void> {\n const win = doc.defaultView || window\n\n if (win.navigator.clipboard?.writeText !== undefined) {\n return win.navigator.clipboard.writeText(text)\n }\n\n if (!doc.body) {\n return Promise.reject(new Error())\n }\n\n const node = createNode(doc, text)\n\n doc.body.appendChild(node)\n copyNode(node)\n doc.body.removeChild(node)\n\n return Promise.resolve()\n}\n","import { createMachine } from \"@zag-js/core\"\nimport { compact } from \"@zag-js/utils\"\nimport { dom } from \"./clipboard.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./clipboard.types\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"clipboard\",\n initial: \"idle\",\n context: {\n value: \"\",\n timeout: 3000,\n ...ctx,\n },\n watch: {\n value: [\"syncInputElement\"],\n },\n on: {\n \"VALUE.SET\": {\n actions: [\"setValue\"],\n },\n COPY: {\n target: \"copied\",\n actions: [\"copyToClipboard\", \"invokeOnCopy\"],\n },\n },\n states: {\n idle: {\n on: {\n \"INPUT.COPY\": {\n target: \"copied\",\n actions: [\"invokeOnCopy\"],\n },\n },\n },\n copied: {\n after: {\n COPY_TIMEOUT: \"idle\",\n },\n on: {\n COPY: {\n target: \"copied\",\n actions: [\"copyToClipboard\", \"invokeOnCopy\"],\n },\n \"INPUT.COPY\": {\n actions: [\"invokeOnCopy\"],\n },\n },\n },\n },\n },\n {\n actions: {\n setValue(ctx, evt) {\n ctx.value = evt.value\n },\n copyToClipboard(ctx) {\n dom.writeToClipboard(ctx)\n },\n invokeOnCopy(ctx) {\n ctx.onStatusChange?.({ copied: true })\n },\n syncInputElement(ctx) {\n dom.setValue(dom.getInputEl(ctx), ctx.value)\n },\n },\n delays: {\n COPY_TIMEOUT: (ctx) => ctx.timeout,\n },\n },\n )\n}\n","import { createProps } from \"@zag-js/types\"\nimport type { IndicatorProps, UserDefinedContext } from \"./clipboard.types\"\nimport { createSplitProps } from \"@zag-js/utils\"\n\nexport const props = createProps<UserDefinedContext>()([\n \"getRootNode\",\n \"id\",\n \"ids\",\n \"value\",\n \"timeout\",\n \"onStatusChange\",\n])\nexport const contextProps = createSplitProps<UserDefinedContext>(props)\n\nexport const indicatorProps = createProps<IndicatorProps>()([\"copied\"])\nexport const splitIndicatorProps = createSplitProps<IndicatorProps>(indicatorProps)\n"],"mappings":"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","names":["import_dom_query","props","ctx","import_utils"]}
package/dist/index.mjs CHANGED
@@ -1,213 +1,2 @@
1
- // src/clipboard.anatomy.ts
2
- import { createAnatomy } from "@zag-js/anatomy";
3
- var anatomy = createAnatomy("clipboard").parts("root", "control", "trigger", "indicator", "input", "label");
4
- var parts = anatomy.build();
5
-
6
- // src/clipboard.connect.ts
7
- import { dataAttr } from "@zag-js/dom-query";
8
-
9
- // src/clipboard.dom.ts
10
- import { createScope, getWindow } from "@zag-js/dom-query";
11
- var dom = createScope({
12
- getRootId: (ctx) => ctx.ids?.root ?? `clip-${ctx.id}`,
13
- getInputId: (ctx) => ctx.ids?.input ?? `clip-input-${ctx.id}`,
14
- getLabelId: (ctx) => ctx.ids?.label ?? `clip-label-${ctx.id}`,
15
- getInputEl: (ctx) => dom.getById(ctx, dom.getInputId(ctx)),
16
- writeToClipboard: (ctx) => copyText(dom.getDoc(ctx), ctx.value)
17
- });
18
- function createNode(doc, text) {
19
- const node = doc.createElement("pre");
20
- Object.assign(node.style, {
21
- width: "1px",
22
- height: "1px",
23
- position: "fixed",
24
- top: "5px"
25
- });
26
- node.textContent = text;
27
- return node;
28
- }
29
- function copyNode(node) {
30
- const win = getWindow(node);
31
- const selection = win.getSelection();
32
- if (selection == null) {
33
- return Promise.reject(new Error());
34
- }
35
- selection.removeAllRanges();
36
- const doc = node.ownerDocument;
37
- const range = doc.createRange();
38
- range.selectNodeContents(node);
39
- selection.addRange(range);
40
- doc.execCommand("copy");
41
- selection.removeAllRanges();
42
- return Promise.resolve();
43
- }
44
- function copyText(doc, text) {
45
- const win = doc.defaultView || window;
46
- if (win.navigator.clipboard?.writeText !== void 0) {
47
- return win.navigator.clipboard.writeText(text);
48
- }
49
- if (!doc.body) {
50
- return Promise.reject(new Error());
51
- }
52
- const node = createNode(doc, text);
53
- doc.body.appendChild(node);
54
- copyNode(node);
55
- doc.body.removeChild(node);
56
- return Promise.resolve();
57
- }
58
-
59
- // src/clipboard.connect.ts
60
- function connect(state, send, normalize) {
61
- const copied = state.matches("copied");
62
- return {
63
- copied,
64
- value: state.context.value,
65
- setValue(value) {
66
- send({ type: "VALUE.SET", value });
67
- },
68
- copy() {
69
- send({ type: "COPY" });
70
- },
71
- rootProps: normalize.element({
72
- ...parts.root.attrs,
73
- "data-copied": dataAttr(copied),
74
- id: dom.getRootId(state.context)
75
- }),
76
- labelProps: normalize.label({
77
- ...parts.label.attrs,
78
- htmlFor: dom.getInputId(state.context),
79
- "data-copied": dataAttr(copied),
80
- id: dom.getLabelId(state.context)
81
- }),
82
- controlProps: normalize.element({
83
- ...parts.control.attrs,
84
- "data-copied": dataAttr(copied)
85
- }),
86
- inputProps: normalize.input({
87
- ...parts.input.attrs,
88
- defaultValue: state.context.value,
89
- "data-copied": dataAttr(copied),
90
- readOnly: true,
91
- "data-readonly": "true",
92
- id: dom.getInputId(state.context),
93
- onFocus(event) {
94
- event.currentTarget.select();
95
- },
96
- onCopy() {
97
- send({ type: "INPUT.COPY" });
98
- }
99
- }),
100
- triggerProps: normalize.button({
101
- ...parts.trigger.attrs,
102
- "aria-label": copied ? "Copied to clipboard" : "Copy to clipboard",
103
- "data-copied": dataAttr(copied),
104
- onClick() {
105
- send({ type: "COPY" });
106
- }
107
- }),
108
- getIndicatorProps(props2) {
109
- return normalize.element({
110
- ...parts.indicator.attrs,
111
- hidden: props2.copied !== copied
112
- });
113
- }
114
- };
115
- }
116
-
117
- // src/clipboard.machine.ts
118
- import { createMachine } from "@zag-js/core";
119
- import { compact } from "@zag-js/utils";
120
- function machine(userContext) {
121
- const ctx = compact(userContext);
122
- return createMachine(
123
- {
124
- id: "clipboard",
125
- initial: "idle",
126
- context: {
127
- value: "",
128
- timeout: 3e3,
129
- ...ctx
130
- },
131
- watch: {
132
- value: ["syncInputElement"]
133
- },
134
- on: {
135
- "VALUE.SET": {
136
- actions: ["setValue"]
137
- },
138
- COPY: {
139
- target: "copied",
140
- actions: ["copyToClipboard", "invokeOnCopy"]
141
- }
142
- },
143
- states: {
144
- idle: {
145
- on: {
146
- "INPUT.COPY": {
147
- target: "copied",
148
- actions: ["invokeOnCopy"]
149
- }
150
- }
151
- },
152
- copied: {
153
- after: {
154
- COPY_TIMEOUT: "idle"
155
- },
156
- on: {
157
- COPY: {
158
- target: "copied",
159
- actions: ["copyToClipboard", "invokeOnCopy"]
160
- },
161
- "INPUT.COPY": {
162
- actions: ["invokeOnCopy"]
163
- }
164
- }
165
- }
166
- }
167
- },
168
- {
169
- actions: {
170
- setValue(ctx2, evt) {
171
- ctx2.value = evt.value;
172
- },
173
- copyToClipboard(ctx2) {
174
- dom.writeToClipboard(ctx2);
175
- },
176
- invokeOnCopy(ctx2) {
177
- ctx2.onStatusChange?.({ copied: true });
178
- },
179
- syncInputElement(ctx2) {
180
- dom.setValue(dom.getInputEl(ctx2), ctx2.value);
181
- }
182
- },
183
- delays: {
184
- COPY_TIMEOUT: (ctx2) => ctx2.timeout
185
- }
186
- }
187
- );
188
- }
189
-
190
- // src/clipboard.props.ts
191
- import { createProps } from "@zag-js/types";
192
- import { createSplitProps } from "@zag-js/utils";
193
- var props = createProps()([
194
- "getRootNode",
195
- "id",
196
- "ids",
197
- "value",
198
- "timeout",
199
- "onStatusChange"
200
- ]);
201
- var contextProps = createSplitProps(props);
202
- var indicatorProps = createProps()(["copied"]);
203
- var splitIndicatorProps = createSplitProps(indicatorProps);
204
- export {
205
- anatomy,
206
- connect,
207
- contextProps,
208
- indicatorProps,
209
- machine,
210
- props,
211
- splitIndicatorProps
212
- };
1
+ import{createAnatomy}from"@zag-js/anatomy";var anatomy=createAnatomy("clipboard").parts("root","control","trigger","indicator","input","label");var parts=anatomy.build();import{dataAttr}from"@zag-js/dom-query";import{createScope,getWindow}from"@zag-js/dom-query";var dom=createScope({getRootId:ctx=>ctx.ids?.root??`clip-${ctx.id}`,getInputId:ctx=>ctx.ids?.input??`clip-input-${ctx.id}`,getLabelId:ctx=>ctx.ids?.label??`clip-label-${ctx.id}`,getInputEl:ctx=>dom.getById(ctx,dom.getInputId(ctx)),writeToClipboard:ctx=>copyText(dom.getDoc(ctx),ctx.value)});function createNode(doc,text){const node=doc.createElement("pre");Object.assign(node.style,{width:"1px",height:"1px",position:"fixed",top:"5px"});node.textContent=text;return node}function copyNode(node){const win=getWindow(node);const selection=win.getSelection();if(selection==null){return Promise.reject(new Error)}selection.removeAllRanges();const doc=node.ownerDocument;const range=doc.createRange();range.selectNodeContents(node);selection.addRange(range);doc.execCommand("copy");selection.removeAllRanges();return Promise.resolve()}function copyText(doc,text){const win=doc.defaultView||window;if(win.navigator.clipboard?.writeText!==void 0){return win.navigator.clipboard.writeText(text)}if(!doc.body){return Promise.reject(new Error)}const node=createNode(doc,text);doc.body.appendChild(node);copyNode(node);doc.body.removeChild(node);return Promise.resolve()}function connect(state,send,normalize){const copied=state.matches("copied");return{copied,value:state.context.value,setValue(value){send({type:"VALUE.SET",value})},copy(){send({type:"COPY"})},rootProps:normalize.element({...parts.root.attrs,"data-copied":dataAttr(copied),id:dom.getRootId(state.context)}),labelProps:normalize.label({...parts.label.attrs,htmlFor:dom.getInputId(state.context),"data-copied":dataAttr(copied),id:dom.getLabelId(state.context)}),controlProps:normalize.element({...parts.control.attrs,"data-copied":dataAttr(copied)}),inputProps:normalize.input({...parts.input.attrs,defaultValue:state.context.value,"data-copied":dataAttr(copied),readOnly:true,"data-readonly":"true",id:dom.getInputId(state.context),onFocus(event){event.currentTarget.select()},onCopy(){send({type:"INPUT.COPY"})}}),triggerProps:normalize.button({...parts.trigger.attrs,"aria-label":copied?"Copied to clipboard":"Copy to clipboard","data-copied":dataAttr(copied),onClick(){send({type:"COPY"})}}),getIndicatorProps(props2){return normalize.element({...parts.indicator.attrs,hidden:props2.copied!==copied})}}}import{createMachine}from"@zag-js/core";import{compact}from"@zag-js/utils";function machine(userContext){const ctx=compact(userContext);return createMachine({id:"clipboard",initial:"idle",context:{value:"",timeout:3e3,...ctx},watch:{value:["syncInputElement"]},on:{"VALUE.SET":{actions:["setValue"]},COPY:{target:"copied",actions:["copyToClipboard","invokeOnCopy"]}},states:{idle:{on:{"INPUT.COPY":{target:"copied",actions:["invokeOnCopy"]}}},copied:{after:{COPY_TIMEOUT:"idle"},on:{COPY:{target:"copied",actions:["copyToClipboard","invokeOnCopy"]},"INPUT.COPY":{actions:["invokeOnCopy"]}}}}},{actions:{setValue(ctx2,evt){ctx2.value=evt.value},copyToClipboard(ctx2){dom.writeToClipboard(ctx2)},invokeOnCopy(ctx2){ctx2.onStatusChange?.({copied:true})},syncInputElement(ctx2){dom.setValue(dom.getInputEl(ctx2),ctx2.value)}},delays:{COPY_TIMEOUT:ctx2=>ctx2.timeout}})}import{createProps}from"@zag-js/types";import{createSplitProps}from"@zag-js/utils";var props=createProps()(["getRootNode","id","ids","value","timeout","onStatusChange"]);var contextProps=createSplitProps(props);var indicatorProps=createProps()(["copied"]);var splitIndicatorProps=createSplitProps(indicatorProps);export{anatomy,connect,contextProps,indicatorProps,machine,props,splitIndicatorProps};
213
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/clipboard.anatomy.ts","../src/clipboard.connect.ts","../src/clipboard.dom.ts","../src/clipboard.machine.ts","../src/clipboard.props.ts"],"sourcesContent":["import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"clipboard\").parts(\"root\", \"control\", \"trigger\", \"indicator\", \"input\", \"label\")\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./clipboard.anatomy\"\nimport type { MachineApi, Send, State } from \"./clipboard.types\"\nimport { dom } from \"./clipboard.dom\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const copied = state.matches(\"copied\")\n\n return {\n copied,\n value: state.context.value,\n setValue(value) {\n send({ type: \"VALUE.SET\", value })\n },\n copy() {\n send({ type: \"COPY\" })\n },\n rootProps: normalize.element({\n ...parts.root.attrs,\n \"data-copied\": dataAttr(copied),\n id: dom.getRootId(state.context),\n }),\n labelProps: normalize.label({\n ...parts.label.attrs,\n htmlFor: dom.getInputId(state.context),\n \"data-copied\": dataAttr(copied),\n id: dom.getLabelId(state.context),\n }),\n controlProps: normalize.element({\n ...parts.control.attrs,\n \"data-copied\": dataAttr(copied),\n }),\n inputProps: normalize.input({\n ...parts.input.attrs,\n defaultValue: state.context.value,\n \"data-copied\": dataAttr(copied),\n readOnly: true,\n \"data-readonly\": \"true\",\n id: dom.getInputId(state.context),\n onFocus(event) {\n event.currentTarget.select()\n },\n onCopy() {\n send({ type: \"INPUT.COPY\" })\n },\n }),\n triggerProps: normalize.button({\n ...parts.trigger.attrs,\n \"aria-label\": copied ? \"Copied to clipboard\" : \"Copy to clipboard\",\n \"data-copied\": dataAttr(copied),\n onClick() {\n send({ type: \"COPY\" })\n },\n }),\n getIndicatorProps(props) {\n return normalize.element({\n ...parts.indicator.attrs,\n hidden: props.copied !== copied,\n })\n },\n }\n}\n","import { createScope, getWindow } from \"@zag-js/dom-query\"\nimport type { MachineContext as Ctx } from \"./clipboard.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `clip-${ctx.id}`,\n getInputId: (ctx: Ctx) => ctx.ids?.input ?? `clip-input-${ctx.id}`,\n getLabelId: (ctx: Ctx) => ctx.ids?.label ?? `clip-label-${ctx.id}`,\n getInputEl: (ctx: Ctx) => dom.getById<HTMLInputElement>(ctx, dom.getInputId(ctx)),\n writeToClipboard: (ctx: Ctx) => copyText(dom.getDoc(ctx), ctx.value),\n})\n\nfunction createNode(doc: Document, text: string): HTMLElement {\n const node = doc.createElement(\"pre\")\n Object.assign(node.style, {\n width: \"1px\",\n height: \"1px\",\n position: \"fixed\",\n top: \"5px\",\n })\n node.textContent = text\n return node\n}\n\nfunction copyNode(node: HTMLElement): Promise<void> {\n const win = getWindow(node)\n\n const selection = win.getSelection()\n\n if (selection == null) {\n return Promise.reject(new Error())\n }\n\n selection.removeAllRanges()\n\n const doc = node.ownerDocument\n\n const range = doc.createRange()\n range.selectNodeContents(node)\n selection.addRange(range)\n\n doc.execCommand(\"copy\")\n selection.removeAllRanges()\n\n return Promise.resolve()\n}\n\nfunction copyText(doc: Document, text: string): Promise<void> {\n const win = doc.defaultView || window\n\n if (win.navigator.clipboard?.writeText !== undefined) {\n return win.navigator.clipboard.writeText(text)\n }\n\n if (!doc.body) {\n return Promise.reject(new Error())\n }\n\n const node = createNode(doc, text)\n\n doc.body.appendChild(node)\n copyNode(node)\n doc.body.removeChild(node)\n\n return Promise.resolve()\n}\n","import { createMachine } from \"@zag-js/core\"\nimport { compact } from \"@zag-js/utils\"\nimport { dom } from \"./clipboard.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./clipboard.types\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"clipboard\",\n initial: \"idle\",\n context: {\n value: \"\",\n timeout: 3000,\n ...ctx,\n },\n watch: {\n value: [\"syncInputElement\"],\n },\n on: {\n \"VALUE.SET\": {\n actions: [\"setValue\"],\n },\n COPY: {\n target: \"copied\",\n actions: [\"copyToClipboard\", \"invokeOnCopy\"],\n },\n },\n states: {\n idle: {\n on: {\n \"INPUT.COPY\": {\n target: \"copied\",\n actions: [\"invokeOnCopy\"],\n },\n },\n },\n copied: {\n after: {\n COPY_TIMEOUT: \"idle\",\n },\n on: {\n COPY: {\n target: \"copied\",\n actions: [\"copyToClipboard\", \"invokeOnCopy\"],\n },\n \"INPUT.COPY\": {\n actions: [\"invokeOnCopy\"],\n },\n },\n },\n },\n },\n {\n actions: {\n setValue(ctx, evt) {\n ctx.value = evt.value\n },\n copyToClipboard(ctx) {\n dom.writeToClipboard(ctx)\n },\n invokeOnCopy(ctx) {\n ctx.onStatusChange?.({ copied: true })\n },\n syncInputElement(ctx) {\n dom.setValue(dom.getInputEl(ctx), ctx.value)\n },\n },\n delays: {\n COPY_TIMEOUT: (ctx) => ctx.timeout,\n },\n },\n )\n}\n","import { createProps } from \"@zag-js/types\"\nimport type { IndicatorProps, UserDefinedContext } from \"./clipboard.types\"\nimport { createSplitProps } from \"@zag-js/utils\"\n\nexport const props = createProps<UserDefinedContext>()([\n \"getRootNode\",\n \"id\",\n \"ids\",\n \"value\",\n \"timeout\",\n \"onStatusChange\",\n])\nexport const contextProps = createSplitProps<UserDefinedContext>(props)\n\nexport const indicatorProps = createProps<IndicatorProps>()([\"copied\"])\nexport const splitIndicatorProps = createSplitProps<IndicatorProps>(indicatorProps)\n"],"mappings":"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","names":["props","ctx"]}
1
+ {"version":3,"sources":["../src/clipboard.anatomy.ts","../src/clipboard.connect.ts","../src/clipboard.dom.ts","../src/clipboard.machine.ts","../src/clipboard.props.ts"],"sourcesContent":["import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"clipboard\").parts(\"root\", \"control\", \"trigger\", \"indicator\", \"input\", \"label\")\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./clipboard.anatomy\"\nimport type { MachineApi, Send, State } from \"./clipboard.types\"\nimport { dom } from \"./clipboard.dom\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const copied = state.matches(\"copied\")\n\n return {\n copied,\n value: state.context.value,\n setValue(value) {\n send({ type: \"VALUE.SET\", value })\n },\n copy() {\n send({ type: \"COPY\" })\n },\n rootProps: normalize.element({\n ...parts.root.attrs,\n \"data-copied\": dataAttr(copied),\n id: dom.getRootId(state.context),\n }),\n labelProps: normalize.label({\n ...parts.label.attrs,\n htmlFor: dom.getInputId(state.context),\n \"data-copied\": dataAttr(copied),\n id: dom.getLabelId(state.context),\n }),\n controlProps: normalize.element({\n ...parts.control.attrs,\n \"data-copied\": dataAttr(copied),\n }),\n inputProps: normalize.input({\n ...parts.input.attrs,\n defaultValue: state.context.value,\n \"data-copied\": dataAttr(copied),\n readOnly: true,\n \"data-readonly\": \"true\",\n id: dom.getInputId(state.context),\n onFocus(event) {\n event.currentTarget.select()\n },\n onCopy() {\n send({ type: \"INPUT.COPY\" })\n },\n }),\n triggerProps: normalize.button({\n ...parts.trigger.attrs,\n \"aria-label\": copied ? \"Copied to clipboard\" : \"Copy to clipboard\",\n \"data-copied\": dataAttr(copied),\n onClick() {\n send({ type: \"COPY\" })\n },\n }),\n getIndicatorProps(props) {\n return normalize.element({\n ...parts.indicator.attrs,\n hidden: props.copied !== copied,\n })\n },\n }\n}\n","import { createScope, getWindow } from \"@zag-js/dom-query\"\nimport type { MachineContext as Ctx } from \"./clipboard.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `clip-${ctx.id}`,\n getInputId: (ctx: Ctx) => ctx.ids?.input ?? `clip-input-${ctx.id}`,\n getLabelId: (ctx: Ctx) => ctx.ids?.label ?? `clip-label-${ctx.id}`,\n getInputEl: (ctx: Ctx) => dom.getById<HTMLInputElement>(ctx, dom.getInputId(ctx)),\n writeToClipboard: (ctx: Ctx) => copyText(dom.getDoc(ctx), ctx.value),\n})\n\nfunction createNode(doc: Document, text: string): HTMLElement {\n const node = doc.createElement(\"pre\")\n Object.assign(node.style, {\n width: \"1px\",\n height: \"1px\",\n position: \"fixed\",\n top: \"5px\",\n })\n node.textContent = text\n return node\n}\n\nfunction copyNode(node: HTMLElement): Promise<void> {\n const win = getWindow(node)\n\n const selection = win.getSelection()\n\n if (selection == null) {\n return Promise.reject(new Error())\n }\n\n selection.removeAllRanges()\n\n const doc = node.ownerDocument\n\n const range = doc.createRange()\n range.selectNodeContents(node)\n selection.addRange(range)\n\n doc.execCommand(\"copy\")\n selection.removeAllRanges()\n\n return Promise.resolve()\n}\n\nfunction copyText(doc: Document, text: string): Promise<void> {\n const win = doc.defaultView || window\n\n if (win.navigator.clipboard?.writeText !== undefined) {\n return win.navigator.clipboard.writeText(text)\n }\n\n if (!doc.body) {\n return Promise.reject(new Error())\n }\n\n const node = createNode(doc, text)\n\n doc.body.appendChild(node)\n copyNode(node)\n doc.body.removeChild(node)\n\n return Promise.resolve()\n}\n","import { createMachine } from \"@zag-js/core\"\nimport { compact } from \"@zag-js/utils\"\nimport { dom } from \"./clipboard.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./clipboard.types\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"clipboard\",\n initial: \"idle\",\n context: {\n value: \"\",\n timeout: 3000,\n ...ctx,\n },\n watch: {\n value: [\"syncInputElement\"],\n },\n on: {\n \"VALUE.SET\": {\n actions: [\"setValue\"],\n },\n COPY: {\n target: \"copied\",\n actions: [\"copyToClipboard\", \"invokeOnCopy\"],\n },\n },\n states: {\n idle: {\n on: {\n \"INPUT.COPY\": {\n target: \"copied\",\n actions: [\"invokeOnCopy\"],\n },\n },\n },\n copied: {\n after: {\n COPY_TIMEOUT: \"idle\",\n },\n on: {\n COPY: {\n target: \"copied\",\n actions: [\"copyToClipboard\", \"invokeOnCopy\"],\n },\n \"INPUT.COPY\": {\n actions: [\"invokeOnCopy\"],\n },\n },\n },\n },\n },\n {\n actions: {\n setValue(ctx, evt) {\n ctx.value = evt.value\n },\n copyToClipboard(ctx) {\n dom.writeToClipboard(ctx)\n },\n invokeOnCopy(ctx) {\n ctx.onStatusChange?.({ copied: true })\n },\n syncInputElement(ctx) {\n dom.setValue(dom.getInputEl(ctx), ctx.value)\n },\n },\n delays: {\n COPY_TIMEOUT: (ctx) => ctx.timeout,\n },\n },\n )\n}\n","import { createProps } from \"@zag-js/types\"\nimport type { IndicatorProps, UserDefinedContext } from \"./clipboard.types\"\nimport { createSplitProps } from \"@zag-js/utils\"\n\nexport const props = createProps<UserDefinedContext>()([\n \"getRootNode\",\n \"id\",\n \"ids\",\n \"value\",\n \"timeout\",\n \"onStatusChange\",\n])\nexport const contextProps = createSplitProps<UserDefinedContext>(props)\n\nexport const indicatorProps = createProps<IndicatorProps>()([\"copied\"])\nexport const splitIndicatorProps = createSplitProps<IndicatorProps>(indicatorProps)\n"],"mappings":"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","names":["props","ctx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/clipboard",
3
- "version": "0.50.0",
3
+ "version": "0.51.1",
4
4
  "description": "Core logic for the clipboard widget implemented as a state machine",
5
5
  "keywords": [
6
6
  "js",
@@ -28,11 +28,11 @@
28
28
  "url": "https://github.com/chakra-ui/zag/issues"
29
29
  },
30
30
  "dependencies": {
31
- "@zag-js/anatomy": "0.50.0",
32
- "@zag-js/core": "0.50.0",
33
- "@zag-js/dom-query": "0.50.0",
34
- "@zag-js/utils": "0.50.0",
35
- "@zag-js/types": "0.50.0"
31
+ "@zag-js/anatomy": "0.51.1",
32
+ "@zag-js/core": "0.51.1",
33
+ "@zag-js/dom-query": "0.51.1",
34
+ "@zag-js/utils": "0.51.1",
35
+ "@zag-js/types": "0.51.1"
36
36
  },
37
37
  "devDependencies": {
38
38
  "clean-package": "2.2.0"