@cnc_cbz/usefultools-plugin-official 1.0.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/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # UsefulTools 官方工具插件包
2
+
3
+ UsefulTools 桌面应用的官方工具合集,包含 27 个常用开发/设计工具。
4
+
5
+ ## 包含的工具
6
+
7
+ | 工具 | 分类 | 说明 |
8
+ |------|------|------|
9
+ | JSON 格式化 | 编码开发 | 格式化、压缩、校验 |
10
+ | JS 代码运行器 | 编码开发 | 编写、运行、调试 JS 代码 |
11
+ | Google 翻译 | 文本处理 | 多语言翻译,支持自动检测 |
12
+ | 时间戳转换 | 转换解析 | 时间戳与日期互转,实时时钟 |
13
+ | 文本对比 | 文本处理 | 逐行对比两段文本,高亮差异 |
14
+ | JSON 对比 | 编码开发 | 深度比较两个 JSON 的 key 与 value 差异 |
15
+ | Cron 表达式 | 转换解析 | 解析 Cron 表达式,预览执行时间 |
16
+ | 正则测试 | 编码开发 | 测试正则表达式,可视化匹配结果 |
17
+ | JWT 解析器 | 转换解析 | 解析 JWT Token,查看 Header/Payload |
18
+ | 进制转换 | 转换解析 | 二/八/十/十六进制互转 |
19
+ | 加解密工坊 | 编码开发 | 流程化加解密、编码转换 |
20
+ | UUID 生成器 | 生成工具 | 批量生成 UUID v4/v7 |
21
+ | Hash 生成器 | 编码开发 | MD5、SHA-1、SHA-256、SHA-512 |
22
+ | URL 编解码 | 编码开发 | URL 编码与解码 |
23
+ | 颜色转换器 | 设计工具 | HEX、RGB、HSL 互转 |
24
+ | Markdown 预览 | 文本处理 | 实时渲染,左右分栏 |
25
+ | 密码生成器 | 生成工具 | 自定义长度与字符集 |
26
+ | JSON/YAML 互转 | 转换解析 | JSON 与 YAML 格式互转 |
27
+ | Lorem Ipsum | 生成工具 | 生成占位文本 |
28
+ | QR 码生成器 | 生成工具 | 输入 URL 或文本生成二维码 |
29
+ | HTML 实体 | 编码开发 | HTML 实体编码与解码 |
30
+ | SQL 格式化 | 编码开发 | 格式化 SQL 语句 |
31
+ | 图片压缩 | 设计工具 | 压缩图片、转换格式 |
32
+ | 大小写转换 | 文本处理 | camelCase、snake_case 等互转 |
33
+ | IP/子网计算器 | 转换解析 | 子网掩码计算、IP 范围查询 |
34
+ | 文本统计 | 文本处理 | 字数、字符数、行数、词频 |
35
+ | Chmod 计算器 | 转换解析 | Unix 文件权限计算 |
36
+
37
+ ## 开发
38
+
39
+ ```bash
40
+ pnpm install
41
+ pnpm build # 构建全部 27 个插件 bundle
42
+ pnpm tauri:dev # Tauri 桌面窗口调试
43
+ ```
44
+
45
+ ## 发布
46
+
47
+ ```bash
48
+ pnpm build
49
+ npm publish
50
+ ```
51
+
52
+ 发布后主应用会通过 npm registry 自动发现此包(关键词 `usefultools-plugin`)。
53
+
54
+ ## 想开发自己的工具?
55
+
56
+ 请使用 [UsefulTools 插件开发模板](https://github.com/your-org/usefultools-plugin-template)。
@@ -0,0 +1,333 @@
1
+ import { defineComponent, ref, computed, openBlock, createElementBlock, createCommentVNode, createElementVNode, Fragment, renderList, normalizeClass, toDisplayString, withDirectives, vModelText, createTextVNode } from "vue";
2
+ const _hoisted_1 = { class: "flex flex-col h-full gap-5" };
3
+ const _hoisted_2 = { class: "bg-deep-charcoal border-4 border-black rounded-xl p-4 shadow-hard" };
4
+ const _hoisted_3 = { class: "flex flex-col sm:flex-row gap-3" };
5
+ const _hoisted_4 = { class: "flex gap-2 shrink-0" };
6
+ const _hoisted_5 = ["onClick"];
7
+ const _hoisted_6 = ["placeholder"];
8
+ const _hoisted_7 = { class: "flex items-center gap-2 mt-3 flex-wrap" };
9
+ const _hoisted_8 = ["onClick"];
10
+ const _hoisted_9 = { class: "text-[10px] ml-0.5" };
11
+ const _hoisted_10 = {
12
+ key: 0,
13
+ class: "px-4 py-2 bg-coral-red/20 border-2 border-coral-red rounded flex items-center gap-2 text-coral-red font-bold text-sm"
14
+ };
15
+ const _hoisted_11 = {
16
+ key: 1,
17
+ class: "flex-1 grid grid-cols-1 lg:grid-cols-2 gap-4 min-h-0"
18
+ };
19
+ const _hoisted_12 = ["onClick"];
20
+ const _hoisted_13 = { class: "flex items-center justify-between" };
21
+ const _hoisted_14 = { class: "text-xs font-bold text-gray-500 uppercase tracking-wider" };
22
+ const _hoisted_15 = { class: "font-mono text-lg text-gray-100 break-all select-all" };
23
+ const _hoisted_16 = {
24
+ key: 2,
25
+ class: "bg-deep-charcoal border-4 border-black rounded-xl p-4 shadow-hard"
26
+ };
27
+ const _hoisted_17 = { class: "flex items-center gap-3 mb-3" };
28
+ const _hoisted_18 = { class: "flex items-center justify-between" };
29
+ const _hoisted_19 = { class: "select-all" };
30
+ const _sfc_main = /* @__PURE__ */ defineComponent({
31
+ __name: "index",
32
+ setup(__props) {
33
+ const input = ref("");
34
+ const inputBase = ref(10);
35
+ const copyField = ref("");
36
+ const errorMsg = ref("");
37
+ const bases = [
38
+ { label: "二进制", base: 2, prefix: "0b", key: "bin" },
39
+ { label: "八进制", base: 8, prefix: "0o", key: "oct" },
40
+ { label: "十进制", base: 10, prefix: "", key: "dec" },
41
+ { label: "十六进制", base: 16, prefix: "0x", key: "hex" }
42
+ ];
43
+ const baseOptions = [
44
+ { label: "二进制", value: 2 },
45
+ { label: "八进制", value: 8 },
46
+ { label: "十进制", value: 10 },
47
+ { label: "十六进制", value: 16 }
48
+ ];
49
+ function sanitize(raw) {
50
+ let s = raw.trim().toLowerCase();
51
+ if (s.startsWith("0x")) s = s.slice(2);
52
+ else if (s.startsWith("0b")) s = s.slice(2);
53
+ else if (s.startsWith("0o")) s = s.slice(2);
54
+ return s;
55
+ }
56
+ const parsed = computed(() => {
57
+ const raw = input.value.trim();
58
+ if (!raw) {
59
+ errorMsg.value = "";
60
+ return null;
61
+ }
62
+ try {
63
+ const s = sanitize(raw);
64
+ if (!s) {
65
+ errorMsg.value = "输入为空";
66
+ return null;
67
+ }
68
+ const val = BigInt(`${inputBase.value === 10 ? "" : "0" + { 2: "b", 8: "o", 16: "x" }[inputBase.value]}${s}`);
69
+ errorMsg.value = "";
70
+ return val;
71
+ } catch {
72
+ errorMsg.value = `无效的 ${inputBase.value} 进制数`;
73
+ return null;
74
+ }
75
+ });
76
+ const results = computed(() => {
77
+ if (parsed.value === null) return [];
78
+ const v = parsed.value;
79
+ const isNeg = v < 0n;
80
+ const abs = isNeg ? -v : v;
81
+ const sign = isNeg ? "-" : "";
82
+ return bases.map((b) => ({
83
+ ...b,
84
+ value: sign + b.prefix + abs.toString(b.base).toUpperCase(),
85
+ raw: sign + abs.toString(b.base).toUpperCase()
86
+ }));
87
+ });
88
+ const customBase = ref(3);
89
+ const customResult = computed(() => {
90
+ if (parsed.value === null) return "";
91
+ const v = parsed.value;
92
+ const isNeg = v < 0n;
93
+ const abs = isNeg ? -v : v;
94
+ const sign = isNeg ? "-" : "";
95
+ return sign + toBaseString(abs, customBase.value);
96
+ });
97
+ function toBaseString(value, base) {
98
+ if (value === 0n) return "0";
99
+ const digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
100
+ const b = BigInt(base);
101
+ let result = "";
102
+ let v = value;
103
+ while (v > 0n) {
104
+ result = digits[Number(v % b)] + result;
105
+ v = v / b;
106
+ }
107
+ return result;
108
+ }
109
+ function setExample(val, base) {
110
+ input.value = val;
111
+ inputBase.value = base;
112
+ }
113
+ async function copy(text, field) {
114
+ await navigator.clipboard.writeText(text);
115
+ copyField.value = field;
116
+ setTimeout(() => {
117
+ copyField.value = "";
118
+ }, 1200);
119
+ }
120
+ return (_ctx, _cache) => {
121
+ var _a;
122
+ return openBlock(), createElementBlock("div", _hoisted_1, [
123
+ createCommentVNode(" 输入区 "),
124
+ createElementVNode("div", _hoisted_2, [
125
+ _cache[4] || (_cache[4] = createElementVNode(
126
+ "div",
127
+ { class: "flex items-center gap-2 mb-3" },
128
+ [
129
+ createElementVNode("span", { class: "material-icons text-primary text-lg" }, "swap_horiz"),
130
+ createElementVNode("span", { class: "text-sm font-bold text-gray-400 uppercase tracking-wider" }, "输入")
131
+ ],
132
+ -1
133
+ /* CACHED */
134
+ )),
135
+ createElementVNode("div", _hoisted_3, [
136
+ createElementVNode("div", _hoisted_4, [
137
+ (openBlock(), createElementBlock(
138
+ Fragment,
139
+ null,
140
+ renderList(baseOptions, (opt) => {
141
+ return createElementVNode("button", {
142
+ key: opt.value,
143
+ onClick: ($event) => inputBase.value = opt.value,
144
+ class: normalizeClass(["h-10 px-3 font-bold border-2 border-black rounded text-sm transition-all", inputBase.value === opt.value ? "bg-primary text-black shadow-none translate-x-0.5 translate-y-0.5" : "bg-bg-dark text-gray-400 shadow-hard-sm hover:shadow-none hover:translate-x-0.5 hover:translate-y-0.5"])
145
+ }, toDisplayString(opt.label), 11, _hoisted_5);
146
+ }),
147
+ 64
148
+ /* STABLE_FRAGMENT */
149
+ ))
150
+ ]),
151
+ withDirectives(createElementVNode("input", {
152
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => input.value = $event),
153
+ placeholder: `输入${(_a = baseOptions.find((o) => o.value === inputBase.value)) == null ? void 0 : _a.label}数值...`,
154
+ class: "flex-1 h-10 bg-bg-dark text-gray-100 border-4 border-black rounded-lg px-4 font-mono text-sm shadow-hard focus:border-primary focus:shadow-none focus:translate-x-[4px] focus:translate-y-[4px] transition-all outline-none placeholder-gray-600"
155
+ }, null, 8, _hoisted_6), [
156
+ [vModelText, input.value]
157
+ ])
158
+ ]),
159
+ createCommentVNode(" 快捷示例 "),
160
+ createElementVNode("div", _hoisted_7, [
161
+ _cache[3] || (_cache[3] = createElementVNode(
162
+ "span",
163
+ { class: "text-xs text-gray-600" },
164
+ "示例:",
165
+ -1
166
+ /* CACHED */
167
+ )),
168
+ (openBlock(), createElementBlock(
169
+ Fragment,
170
+ null,
171
+ renderList([
172
+ { val: "255", base: 10 },
173
+ { val: "11111111", base: 2 },
174
+ { val: "FF", base: 16 },
175
+ { val: "377", base: 8 }
176
+ ], (ex) => {
177
+ return createElementVNode("button", {
178
+ key: ex.val + ex.base,
179
+ onClick: ($event) => setExample(ex.val, ex.base),
180
+ class: "px-2 py-0.5 text-xs font-mono bg-bg-dark border border-gray-700 rounded hover:border-primary hover:text-primary transition-all cursor-pointer text-gray-500"
181
+ }, [
182
+ createTextVNode(
183
+ toDisplayString(ex.val),
184
+ 1
185
+ /* TEXT */
186
+ ),
187
+ createElementVNode(
188
+ "sub",
189
+ _hoisted_9,
190
+ "(" + toDisplayString(ex.base) + ")",
191
+ 1
192
+ /* TEXT */
193
+ )
194
+ ], 8, _hoisted_8);
195
+ }),
196
+ 64
197
+ /* STABLE_FRAGMENT */
198
+ ))
199
+ ])
200
+ ]),
201
+ createCommentVNode(" 错误提示 "),
202
+ errorMsg.value && input.value.trim() ? (openBlock(), createElementBlock("div", _hoisted_10, [
203
+ _cache[5] || (_cache[5] = createElementVNode(
204
+ "span",
205
+ { class: "material-icons text-lg" },
206
+ "error_outline",
207
+ -1
208
+ /* CACHED */
209
+ )),
210
+ createTextVNode(
211
+ " " + toDisplayString(errorMsg.value),
212
+ 1
213
+ /* TEXT */
214
+ )
215
+ ])) : createCommentVNode("v-if", true),
216
+ createCommentVNode(" 转换结果 "),
217
+ results.value.length ? (openBlock(), createElementBlock("div", _hoisted_11, [
218
+ (openBlock(true), createElementBlock(
219
+ Fragment,
220
+ null,
221
+ renderList(results.value, (r) => {
222
+ return openBlock(), createElementBlock("div", {
223
+ key: r.key,
224
+ class: "bg-deep-charcoal border-4 border-black rounded-xl p-4 shadow-hard flex flex-col gap-2 cursor-pointer hover:border-primary transition-all group",
225
+ onClick: ($event) => copy(r.raw, r.key)
226
+ }, [
227
+ createElementVNode("div", _hoisted_13, [
228
+ createElementVNode(
229
+ "span",
230
+ _hoisted_14,
231
+ toDisplayString(r.label),
232
+ 1
233
+ /* TEXT */
234
+ ),
235
+ createElementVNode(
236
+ "span",
237
+ {
238
+ class: normalizeClass(["material-icons text-sm opacity-0 group-hover:opacity-100 transition-opacity", copyField.value === r.key ? "text-neon-green" : "text-gray-500"])
239
+ },
240
+ toDisplayString(copyField.value === r.key ? "check" : "content_copy"),
241
+ 3
242
+ /* TEXT, CLASS */
243
+ )
244
+ ]),
245
+ createElementVNode(
246
+ "div",
247
+ _hoisted_15,
248
+ toDisplayString(r.value),
249
+ 1
250
+ /* TEXT */
251
+ )
252
+ ], 8, _hoisted_12);
253
+ }),
254
+ 128
255
+ /* KEYED_FRAGMENT */
256
+ ))
257
+ ])) : createCommentVNode("v-if", true),
258
+ createCommentVNode(" 自定义进制 "),
259
+ parsed.value !== null ? (openBlock(), createElementBlock("div", _hoisted_16, [
260
+ createElementVNode("div", _hoisted_17, [
261
+ _cache[6] || (_cache[6] = createElementVNode(
262
+ "span",
263
+ { class: "material-icons text-neon-green text-lg" },
264
+ "tune",
265
+ -1
266
+ /* CACHED */
267
+ )),
268
+ _cache[7] || (_cache[7] = createElementVNode(
269
+ "span",
270
+ { class: "text-sm font-bold text-gray-400 uppercase tracking-wider" },
271
+ "自定义进制",
272
+ -1
273
+ /* CACHED */
274
+ )),
275
+ withDirectives(createElementVNode(
276
+ "input",
277
+ {
278
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => customBase.value = $event),
279
+ type: "number",
280
+ min: "2",
281
+ max: "36",
282
+ class: "w-16 h-8 bg-bg-dark text-gray-100 border-2 border-black rounded px-2 font-mono text-sm text-center outline-none focus:border-primary"
283
+ },
284
+ null,
285
+ 512
286
+ /* NEED_PATCH */
287
+ ), [
288
+ [
289
+ vModelText,
290
+ customBase.value,
291
+ void 0,
292
+ { number: true }
293
+ ]
294
+ ]),
295
+ _cache[8] || (_cache[8] = createElementVNode(
296
+ "span",
297
+ { class: "text-xs text-gray-600" },
298
+ "(2 ~ 36)",
299
+ -1
300
+ /* CACHED */
301
+ ))
302
+ ]),
303
+ createElementVNode("div", {
304
+ class: "font-mono text-sm text-gray-100 break-all bg-bg-dark rounded-lg p-3 border-2 border-black cursor-pointer hover:border-primary transition-all group",
305
+ onClick: _cache[2] || (_cache[2] = ($event) => copy(customResult.value, "custom"))
306
+ }, [
307
+ createElementVNode("span", _hoisted_18, [
308
+ createElementVNode(
309
+ "span",
310
+ _hoisted_19,
311
+ toDisplayString(customResult.value),
312
+ 1
313
+ /* TEXT */
314
+ ),
315
+ createElementVNode(
316
+ "span",
317
+ {
318
+ class: normalizeClass(["material-icons text-sm opacity-0 group-hover:opacity-100 transition-opacity", copyField.value === "custom" ? "text-neon-green" : "text-gray-500"])
319
+ },
320
+ toDisplayString(copyField.value === "custom" ? "check" : "content_copy"),
321
+ 3
322
+ /* TEXT, CLASS */
323
+ )
324
+ ])
325
+ ])
326
+ ])) : createCommentVNode("v-if", true)
327
+ ]);
328
+ };
329
+ }
330
+ });
331
+ export {
332
+ _sfc_main as default
333
+ };
@@ -0,0 +1,142 @@
1
+ import { defineComponent, ref, computed, openBlock, createElementBlock, createElementVNode, withDirectives, vModelText, Fragment, renderList, toDisplayString, normalizeClass, createCommentVNode } from "vue";
2
+ const _hoisted_1 = { class: "flex flex-col h-full gap-5" };
3
+ const _hoisted_2 = { class: "bg-deep-charcoal border-4 border-black rounded-xl p-4 shadow-hard" };
4
+ const _hoisted_3 = { class: "flex flex-wrap gap-2 mt-3" };
5
+ const _hoisted_4 = ["onClick"];
6
+ const _hoisted_5 = {
7
+ key: 0,
8
+ class: "flex-1 grid grid-cols-1 lg:grid-cols-2 gap-3 overflow-auto min-h-0"
9
+ };
10
+ const _hoisted_6 = ["onClick"];
11
+ const _hoisted_7 = { class: "flex items-center justify-between mb-1" };
12
+ const _hoisted_8 = { class: "text-xs font-bold text-gray-500 uppercase tracking-wider" };
13
+ const _sfc_main = /* @__PURE__ */ defineComponent({
14
+ __name: "index",
15
+ setup(__props) {
16
+ const input = ref("");
17
+ const copyField = ref("");
18
+ function splitWords(str) {
19
+ return str.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").replace(/[-_./\\]+/g, " ").trim().split(/\s+/).filter(Boolean);
20
+ }
21
+ const conversions = computed(() => {
22
+ const words = splitWords(input.value);
23
+ if (!words.length) return [];
24
+ return [
25
+ { label: "camelCase", value: words.map((w, i) => i === 0 ? w.toLowerCase() : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(""), color: "text-electric-blue" },
26
+ { label: "PascalCase", value: words.map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(""), color: "text-vibrant-purple" },
27
+ { label: "snake_case", value: words.map((w) => w.toLowerCase()).join("_"), color: "text-neon-green" },
28
+ { label: "SCREAMING_SNAKE", value: words.map((w) => w.toUpperCase()).join("_"), color: "text-coral-red" },
29
+ { label: "kebab-case", value: words.map((w) => w.toLowerCase()).join("-"), color: "text-primary" },
30
+ { label: "UPPER CASE", value: input.value.toUpperCase(), color: "text-hot-pink" },
31
+ { label: "lower case", value: input.value.toLowerCase(), color: "text-gray-300" },
32
+ { label: "Title Case", value: words.map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(" "), color: "text-electric-blue" },
33
+ { label: "dot.case", value: words.map((w) => w.toLowerCase()).join("."), color: "text-vibrant-purple" },
34
+ { label: "path/case", value: words.map((w) => w.toLowerCase()).join("/"), color: "text-neon-green" }
35
+ ];
36
+ });
37
+ async function copy(text, field) {
38
+ await navigator.clipboard.writeText(text);
39
+ copyField.value = field;
40
+ setTimeout(() => {
41
+ copyField.value = "";
42
+ }, 1200);
43
+ }
44
+ return (_ctx, _cache) => {
45
+ return openBlock(), createElementBlock("div", _hoisted_1, [
46
+ createElementVNode("div", _hoisted_2, [
47
+ _cache[2] || (_cache[2] = createElementVNode(
48
+ "div",
49
+ { class: "flex items-center gap-2 mb-3" },
50
+ [
51
+ createElementVNode("span", { class: "material-icons text-primary text-lg" }, "text_fields"),
52
+ createElementVNode("span", { class: "text-sm font-bold text-gray-400 uppercase tracking-wider" }, "大小写转换")
53
+ ],
54
+ -1
55
+ /* CACHED */
56
+ )),
57
+ withDirectives(createElementVNode(
58
+ "input",
59
+ {
60
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => input.value = $event),
61
+ placeholder: "输入文本,如 hello world、helloWorld、hello_world...",
62
+ class: "w-full h-12 bg-bg-dark text-gray-100 border-4 border-black rounded-lg px-4 font-mono text-sm shadow-hard focus:border-primary focus:shadow-none focus:translate-x-[4px] focus:translate-y-[4px] transition-all outline-none placeholder-gray-600"
63
+ },
64
+ null,
65
+ 512
66
+ /* NEED_PATCH */
67
+ ), [
68
+ [vModelText, input.value]
69
+ ]),
70
+ createElementVNode("div", _hoisted_3, [
71
+ _cache[1] || (_cache[1] = createElementVNode(
72
+ "span",
73
+ { class: "text-xs text-gray-600" },
74
+ "示例:",
75
+ -1
76
+ /* CACHED */
77
+ )),
78
+ (openBlock(), createElementBlock(
79
+ Fragment,
80
+ null,
81
+ renderList(["hello world", "helloWorld", "my_variable_name", "MyClassName"], (ex) => {
82
+ return createElementVNode("button", {
83
+ key: ex,
84
+ onClick: ($event) => input.value = ex,
85
+ class: "px-2 py-0.5 text-xs font-mono bg-bg-dark border border-gray-700 rounded hover:border-primary hover:text-primary transition-all cursor-pointer text-gray-500"
86
+ }, toDisplayString(ex), 9, _hoisted_4);
87
+ }),
88
+ 64
89
+ /* STABLE_FRAGMENT */
90
+ ))
91
+ ])
92
+ ]),
93
+ conversions.value.length ? (openBlock(), createElementBlock("div", _hoisted_5, [
94
+ (openBlock(true), createElementBlock(
95
+ Fragment,
96
+ null,
97
+ renderList(conversions.value, (c) => {
98
+ return openBlock(), createElementBlock("div", {
99
+ key: c.label,
100
+ class: "bg-deep-charcoal border-4 border-black rounded-xl p-4 shadow-hard cursor-pointer hover:border-primary transition-all group",
101
+ onClick: ($event) => copy(c.value, c.label)
102
+ }, [
103
+ createElementVNode("div", _hoisted_7, [
104
+ createElementVNode(
105
+ "span",
106
+ _hoisted_8,
107
+ toDisplayString(c.label),
108
+ 1
109
+ /* TEXT */
110
+ ),
111
+ createElementVNode(
112
+ "span",
113
+ {
114
+ class: normalizeClass(["material-icons text-sm opacity-0 group-hover:opacity-100 transition-opacity", copyField.value === c.label ? "text-neon-green" : "text-gray-500"])
115
+ },
116
+ toDisplayString(copyField.value === c.label ? "check" : "content_copy"),
117
+ 3
118
+ /* TEXT, CLASS */
119
+ )
120
+ ]),
121
+ createElementVNode(
122
+ "div",
123
+ {
124
+ class: normalizeClass(["font-mono text-sm select-all break-all", c.color])
125
+ },
126
+ toDisplayString(c.value),
127
+ 3
128
+ /* TEXT, CLASS */
129
+ )
130
+ ], 8, _hoisted_6);
131
+ }),
132
+ 128
133
+ /* KEYED_FRAGMENT */
134
+ ))
135
+ ])) : createCommentVNode("v-if", true)
136
+ ]);
137
+ };
138
+ }
139
+ });
140
+ export {
141
+ _sfc_main as default
142
+ };