@atscript/vue-aooth 0.1.79 → 0.1.81

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.
@@ -0,0 +1,277 @@
1
+ import { computed, createBlock, createElementVNode, defineComponent, mergeProps, normalizeClass, onUnmounted, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
2
+ import { AsFieldShell } from "@atscript/vue-form";
3
+ //#region src/components/as-copy.vue?vue&type=script&setup=true&lang.ts
4
+ const _hoisted_1 = { class: "as-copy-row" };
5
+ const _hoisted_2 = [
6
+ "id",
7
+ "value",
8
+ "name",
9
+ "aria-describedby"
10
+ ];
11
+ const _hoisted_3 = ["disabled", "aria-label"];
12
+ const _hoisted_4 = {
13
+ class: "as-copy-label",
14
+ "aria-live": "polite"
15
+ };
16
+ //#endregion
17
+ //#region src/components/as-copy.vue
18
+ var as_copy_default = /* @__PURE__ */ defineComponent({
19
+ __name: "as-copy",
20
+ props: {
21
+ onBlur: {
22
+ type: Function,
23
+ required: true
24
+ },
25
+ error: {
26
+ type: String,
27
+ required: false
28
+ },
29
+ model: {
30
+ type: Object,
31
+ required: true
32
+ },
33
+ value: {
34
+ type: null,
35
+ required: false
36
+ },
37
+ label: {
38
+ type: String,
39
+ required: false
40
+ },
41
+ description: {
42
+ type: String,
43
+ required: false
44
+ },
45
+ hint: {
46
+ type: String,
47
+ required: false
48
+ },
49
+ placeholder: {
50
+ type: String,
51
+ required: false
52
+ },
53
+ prefixIcon: {
54
+ type: String,
55
+ required: false
56
+ },
57
+ suffixIcon: {
58
+ type: String,
59
+ required: false
60
+ },
61
+ class: {
62
+ type: [Object, String],
63
+ required: false
64
+ },
65
+ style: {
66
+ type: [Object, String],
67
+ required: false
68
+ },
69
+ optional: {
70
+ type: Boolean,
71
+ required: false,
72
+ skipCheck: true
73
+ },
74
+ onToggleOptional: {
75
+ type: Function,
76
+ required: false
77
+ },
78
+ required: {
79
+ type: Boolean,
80
+ required: false,
81
+ skipCheck: true
82
+ },
83
+ readonly: {
84
+ type: Boolean,
85
+ required: false,
86
+ skipCheck: true
87
+ },
88
+ type: {
89
+ type: String,
90
+ required: true
91
+ },
92
+ formAction: {
93
+ type: Object,
94
+ required: false
95
+ },
96
+ name: {
97
+ type: String,
98
+ required: false
99
+ },
100
+ field: {
101
+ type: Object,
102
+ required: false
103
+ },
104
+ options: {
105
+ type: Array,
106
+ required: false
107
+ },
108
+ maxLength: {
109
+ type: Number,
110
+ required: false
111
+ },
112
+ autocomplete: {
113
+ type: String,
114
+ required: false
115
+ },
116
+ title: {
117
+ type: String,
118
+ required: false
119
+ },
120
+ level: {
121
+ type: Number,
122
+ required: false
123
+ },
124
+ onRemove: {
125
+ type: Function,
126
+ required: false
127
+ },
128
+ canRemove: {
129
+ type: Boolean,
130
+ required: false
131
+ },
132
+ removeLabel: {
133
+ type: String,
134
+ required: false
135
+ },
136
+ arrayIndex: {
137
+ type: Number,
138
+ required: false
139
+ },
140
+ path: {
141
+ type: String,
142
+ required: true
143
+ },
144
+ valueHelp: {
145
+ type: Object,
146
+ required: false
147
+ },
148
+ singularLabel: {
149
+ type: String,
150
+ required: false
151
+ },
152
+ inputId: {
153
+ type: String,
154
+ required: true
155
+ },
156
+ errorId: {
157
+ type: String,
158
+ required: true
159
+ },
160
+ descId: {
161
+ type: String,
162
+ required: true
163
+ },
164
+ ariaDescribedBy: {
165
+ type: String,
166
+ required: false
167
+ },
168
+ currencyCode: {
169
+ type: String,
170
+ required: false
171
+ },
172
+ unitCode: {
173
+ type: String,
174
+ required: false
175
+ },
176
+ precisionScale: {
177
+ type: Number,
178
+ required: false
179
+ },
180
+ prefix: {
181
+ type: String,
182
+ required: false
183
+ },
184
+ suffix: {
185
+ type: String,
186
+ required: false
187
+ },
188
+ scale: {
189
+ type: Number,
190
+ required: false
191
+ },
192
+ hasAdornment: {
193
+ type: Boolean,
194
+ required: false
195
+ },
196
+ disabled: {
197
+ type: Boolean,
198
+ required: false
199
+ },
200
+ hidden: {
201
+ type: Boolean,
202
+ required: false
203
+ },
204
+ copiedLabel: {
205
+ type: String,
206
+ required: false,
207
+ default: "Copied"
208
+ },
209
+ copyLabel: {
210
+ type: String,
211
+ required: false,
212
+ default: "Copy"
213
+ }
214
+ },
215
+ setup(__props) {
216
+ const props = __props;
217
+ const text = computed(() => props.value ?? props.model?.value ?? "");
218
+ const copied = ref(false);
219
+ const error = ref();
220
+ let revertTimer;
221
+ async function onCopy() {
222
+ if (!navigator.clipboard?.writeText) {
223
+ copied.value = false;
224
+ error.value = "Copy failed — select and copy manually";
225
+ return;
226
+ }
227
+ try {
228
+ await navigator.clipboard.writeText(text.value);
229
+ error.value = void 0;
230
+ copied.value = true;
231
+ clearTimeout(revertTimer);
232
+ revertTimer = setTimeout(() => {
233
+ copied.value = false;
234
+ revertTimer = void 0;
235
+ }, 1500);
236
+ } catch {
237
+ copied.value = false;
238
+ clearTimeout(revertTimer);
239
+ revertTimer = void 0;
240
+ error.value = "Copy failed — select and copy manually";
241
+ }
242
+ }
243
+ function onFocus(e) {
244
+ e.target.select();
245
+ }
246
+ onUnmounted(() => clearTimeout(revertTimer));
247
+ return (_ctx, _cache) => {
248
+ return openBlock(), createBlock(unref(AsFieldShell), mergeProps(_ctx.$props, {
249
+ "field-class": "as-copy",
250
+ error: error.value
251
+ }), {
252
+ default: withCtx(() => [createElementVNode("div", _hoisted_1, [createElementVNode("input", {
253
+ id: __props.inputId,
254
+ type: "text",
255
+ readonly: "",
256
+ value: text.value,
257
+ name: __props.name,
258
+ class: "as-copy-input",
259
+ "aria-describedby": __props.ariaDescribedBy,
260
+ onFocus
261
+ }, null, 40, _hoisted_2), createElementVNode("button", {
262
+ type: "button",
263
+ class: normalizeClass(["as-copy-btn", { copied: copied.value }]),
264
+ disabled: !text.value,
265
+ "aria-label": copied.value ? __props.copiedLabel : __props.copyLabel,
266
+ onClick: onCopy
267
+ }, [createElementVNode("span", {
268
+ class: normalizeClass(["as-copy-icon", copied.value ? "i-as-check-circle" : "i-as-copy"]),
269
+ "aria-hidden": "true"
270
+ }, null, 2), createElementVNode("span", _hoisted_4, toDisplayString(copied.value ? __props.copiedLabel : __props.copyLabel), 1)], 10, _hoisted_3)])]),
271
+ _: 1
272
+ }, 16, ["error"]);
273
+ };
274
+ }
275
+ });
276
+ //#endregion
277
+ export { as_copy_default as t };
@@ -0,0 +1,282 @@
1
+ let vue = require("vue");
2
+ let _atscript_vue_form = require("@atscript/vue-form");
3
+ //#region src/components/as-copy.vue?vue&type=script&setup=true&lang.ts
4
+ const _hoisted_1 = { class: "as-copy-row" };
5
+ const _hoisted_2 = [
6
+ "id",
7
+ "value",
8
+ "name",
9
+ "aria-describedby"
10
+ ];
11
+ const _hoisted_3 = ["disabled", "aria-label"];
12
+ const _hoisted_4 = {
13
+ class: "as-copy-label",
14
+ "aria-live": "polite"
15
+ };
16
+ //#endregion
17
+ //#region src/components/as-copy.vue
18
+ var as_copy_default = /* @__PURE__ */ (0, vue.defineComponent)({
19
+ __name: "as-copy",
20
+ props: {
21
+ onBlur: {
22
+ type: Function,
23
+ required: true
24
+ },
25
+ error: {
26
+ type: String,
27
+ required: false
28
+ },
29
+ model: {
30
+ type: Object,
31
+ required: true
32
+ },
33
+ value: {
34
+ type: null,
35
+ required: false
36
+ },
37
+ label: {
38
+ type: String,
39
+ required: false
40
+ },
41
+ description: {
42
+ type: String,
43
+ required: false
44
+ },
45
+ hint: {
46
+ type: String,
47
+ required: false
48
+ },
49
+ placeholder: {
50
+ type: String,
51
+ required: false
52
+ },
53
+ prefixIcon: {
54
+ type: String,
55
+ required: false
56
+ },
57
+ suffixIcon: {
58
+ type: String,
59
+ required: false
60
+ },
61
+ class: {
62
+ type: [Object, String],
63
+ required: false
64
+ },
65
+ style: {
66
+ type: [Object, String],
67
+ required: false
68
+ },
69
+ optional: {
70
+ type: Boolean,
71
+ required: false,
72
+ skipCheck: true
73
+ },
74
+ onToggleOptional: {
75
+ type: Function,
76
+ required: false
77
+ },
78
+ required: {
79
+ type: Boolean,
80
+ required: false,
81
+ skipCheck: true
82
+ },
83
+ readonly: {
84
+ type: Boolean,
85
+ required: false,
86
+ skipCheck: true
87
+ },
88
+ type: {
89
+ type: String,
90
+ required: true
91
+ },
92
+ formAction: {
93
+ type: Object,
94
+ required: false
95
+ },
96
+ name: {
97
+ type: String,
98
+ required: false
99
+ },
100
+ field: {
101
+ type: Object,
102
+ required: false
103
+ },
104
+ options: {
105
+ type: Array,
106
+ required: false
107
+ },
108
+ maxLength: {
109
+ type: Number,
110
+ required: false
111
+ },
112
+ autocomplete: {
113
+ type: String,
114
+ required: false
115
+ },
116
+ title: {
117
+ type: String,
118
+ required: false
119
+ },
120
+ level: {
121
+ type: Number,
122
+ required: false
123
+ },
124
+ onRemove: {
125
+ type: Function,
126
+ required: false
127
+ },
128
+ canRemove: {
129
+ type: Boolean,
130
+ required: false
131
+ },
132
+ removeLabel: {
133
+ type: String,
134
+ required: false
135
+ },
136
+ arrayIndex: {
137
+ type: Number,
138
+ required: false
139
+ },
140
+ path: {
141
+ type: String,
142
+ required: true
143
+ },
144
+ valueHelp: {
145
+ type: Object,
146
+ required: false
147
+ },
148
+ singularLabel: {
149
+ type: String,
150
+ required: false
151
+ },
152
+ inputId: {
153
+ type: String,
154
+ required: true
155
+ },
156
+ errorId: {
157
+ type: String,
158
+ required: true
159
+ },
160
+ descId: {
161
+ type: String,
162
+ required: true
163
+ },
164
+ ariaDescribedBy: {
165
+ type: String,
166
+ required: false
167
+ },
168
+ currencyCode: {
169
+ type: String,
170
+ required: false
171
+ },
172
+ unitCode: {
173
+ type: String,
174
+ required: false
175
+ },
176
+ precisionScale: {
177
+ type: Number,
178
+ required: false
179
+ },
180
+ prefix: {
181
+ type: String,
182
+ required: false
183
+ },
184
+ suffix: {
185
+ type: String,
186
+ required: false
187
+ },
188
+ scale: {
189
+ type: Number,
190
+ required: false
191
+ },
192
+ hasAdornment: {
193
+ type: Boolean,
194
+ required: false
195
+ },
196
+ disabled: {
197
+ type: Boolean,
198
+ required: false
199
+ },
200
+ hidden: {
201
+ type: Boolean,
202
+ required: false
203
+ },
204
+ copiedLabel: {
205
+ type: String,
206
+ required: false,
207
+ default: "Copied"
208
+ },
209
+ copyLabel: {
210
+ type: String,
211
+ required: false,
212
+ default: "Copy"
213
+ }
214
+ },
215
+ setup(__props) {
216
+ const props = __props;
217
+ const text = (0, vue.computed)(() => props.value ?? props.model?.value ?? "");
218
+ const copied = (0, vue.ref)(false);
219
+ const error = (0, vue.ref)();
220
+ let revertTimer;
221
+ async function onCopy() {
222
+ if (!navigator.clipboard?.writeText) {
223
+ copied.value = false;
224
+ error.value = "Copy failed — select and copy manually";
225
+ return;
226
+ }
227
+ try {
228
+ await navigator.clipboard.writeText(text.value);
229
+ error.value = void 0;
230
+ copied.value = true;
231
+ clearTimeout(revertTimer);
232
+ revertTimer = setTimeout(() => {
233
+ copied.value = false;
234
+ revertTimer = void 0;
235
+ }, 1500);
236
+ } catch {
237
+ copied.value = false;
238
+ clearTimeout(revertTimer);
239
+ revertTimer = void 0;
240
+ error.value = "Copy failed — select and copy manually";
241
+ }
242
+ }
243
+ function onFocus(e) {
244
+ e.target.select();
245
+ }
246
+ (0, vue.onUnmounted)(() => clearTimeout(revertTimer));
247
+ return (_ctx, _cache) => {
248
+ return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_atscript_vue_form.AsFieldShell), (0, vue.mergeProps)(_ctx.$props, {
249
+ "field-class": "as-copy",
250
+ error: error.value
251
+ }), {
252
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", _hoisted_1, [(0, vue.createElementVNode)("input", {
253
+ id: __props.inputId,
254
+ type: "text",
255
+ readonly: "",
256
+ value: text.value,
257
+ name: __props.name,
258
+ class: "as-copy-input",
259
+ "aria-describedby": __props.ariaDescribedBy,
260
+ onFocus
261
+ }, null, 40, _hoisted_2), (0, vue.createElementVNode)("button", {
262
+ type: "button",
263
+ class: (0, vue.normalizeClass)(["as-copy-btn", { copied: copied.value }]),
264
+ disabled: !text.value,
265
+ "aria-label": copied.value ? __props.copiedLabel : __props.copyLabel,
266
+ onClick: onCopy
267
+ }, [(0, vue.createElementVNode)("span", {
268
+ class: (0, vue.normalizeClass)(["as-copy-icon", copied.value ? "i-as-check-circle" : "i-as-copy"]),
269
+ "aria-hidden": "true"
270
+ }, null, 2), (0, vue.createElementVNode)("span", _hoisted_4, (0, vue.toDisplayString)(copied.value ? __props.copiedLabel : __props.copyLabel), 1)], 10, _hoisted_3)])]),
271
+ _: 1
272
+ }, 16, ["error"]);
273
+ };
274
+ }
275
+ });
276
+ //#endregion
277
+ Object.defineProperty(exports, "as_copy_default", {
278
+ enumerable: true,
279
+ get: function() {
280
+ return as_copy_default;
281
+ }
282
+ });
@@ -0,0 +1,2 @@
1
+ const require_as_copy = require("./as-copy-USMxrTlI.cjs");
2
+ module.exports = require_as_copy.as_copy_default;
@@ -0,0 +1,14 @@
1
+ import * as vue from "vue";
2
+ import { TAsComponentProps } from "@atscript/vue-form";
3
+
4
+ //#region src/components/as-copy.vue.d.ts
5
+ type __VLS_Props = TAsComponentProps<string | undefined> & {
6
+ copiedLabel?: string;
7
+ copyLabel?: string;
8
+ };
9
+ declare const __VLS_export: vue.DefineComponent<__VLS_Props, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
10
+ copiedLabel: string;
11
+ copyLabel: string;
12
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
13
+ declare const _default: typeof __VLS_export;
14
+ export = _default;
@@ -0,0 +1,15 @@
1
+ import * as vue from "vue";
2
+ import { TAsComponentProps } from "@atscript/vue-form";
3
+
4
+ //#region src/components/as-copy.vue.d.ts
5
+ type __VLS_Props = TAsComponentProps<string | undefined> & {
6
+ copiedLabel?: string;
7
+ copyLabel?: string;
8
+ };
9
+ declare const __VLS_export: vue.DefineComponent<__VLS_Props, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
10
+ copiedLabel: string;
11
+ copyLabel: string;
12
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
13
+ declare const _default: typeof __VLS_export;
14
+ //#endregion
15
+ export { _default as default };
@@ -0,0 +1,2 @@
1
+ import { t as as_copy_default } from "./as-copy-CxLJdyxe.mjs";
2
+ export { as_copy_default as default };
@@ -1,2 +1,2 @@
1
- const require_as_password_rules = require("./as-password-rules-Dqk2jgol.cjs");
1
+ const require_as_password_rules = require("./as-password-rules-DBoLmROR.cjs");
2
2
  module.exports = require_as_password_rules.as_password_rules_default;
@@ -1,2 +1,2 @@
1
- import { t as as_password_rules_default } from "./as-password-rules-9OToIqwo.mjs";
1
+ import { t as as_password_rules_default } from "./as-password-rules-DuKe47j8.mjs";
2
2
  export { as_password_rules_default as default };
@@ -0,0 +1,293 @@
1
+ let vue = require("vue");
2
+ let _atscript_vue_form = require("@atscript/vue-form");
3
+ //#region src/components/as-qr-code.vue?vue&type=script&setup=true&lang.ts
4
+ const _hoisted_1 = {
5
+ key: 0,
6
+ class: "as-qr-code-stack"
7
+ };
8
+ const _hoisted_2 = ["innerHTML"];
9
+ const _hoisted_3 = {
10
+ key: 1,
11
+ class: "as-qr-code-secret"
12
+ };
13
+ //#endregion
14
+ //#region src/components/as-qr-code.vue
15
+ var as_qr_code_default = /* @__PURE__ */ (0, vue.defineComponent)({
16
+ __name: "as-qr-code",
17
+ props: {
18
+ onBlur: {
19
+ type: Function,
20
+ required: true
21
+ },
22
+ error: {
23
+ type: String,
24
+ required: false
25
+ },
26
+ model: {
27
+ type: Object,
28
+ required: true
29
+ },
30
+ value: {
31
+ type: null,
32
+ required: false
33
+ },
34
+ label: {
35
+ type: String,
36
+ required: false
37
+ },
38
+ description: {
39
+ type: String,
40
+ required: false
41
+ },
42
+ hint: {
43
+ type: String,
44
+ required: false
45
+ },
46
+ placeholder: {
47
+ type: String,
48
+ required: false
49
+ },
50
+ prefixIcon: {
51
+ type: String,
52
+ required: false
53
+ },
54
+ suffixIcon: {
55
+ type: String,
56
+ required: false
57
+ },
58
+ class: {
59
+ type: [Object, String],
60
+ required: false
61
+ },
62
+ style: {
63
+ type: [Object, String],
64
+ required: false
65
+ },
66
+ optional: {
67
+ type: Boolean,
68
+ required: false,
69
+ skipCheck: true
70
+ },
71
+ onToggleOptional: {
72
+ type: Function,
73
+ required: false
74
+ },
75
+ required: {
76
+ type: Boolean,
77
+ required: false,
78
+ skipCheck: true
79
+ },
80
+ readonly: {
81
+ type: Boolean,
82
+ required: false,
83
+ skipCheck: true
84
+ },
85
+ type: {
86
+ type: String,
87
+ required: true
88
+ },
89
+ formAction: {
90
+ type: Object,
91
+ required: false
92
+ },
93
+ name: {
94
+ type: String,
95
+ required: false
96
+ },
97
+ field: {
98
+ type: Object,
99
+ required: false
100
+ },
101
+ options: {
102
+ type: Array,
103
+ required: false
104
+ },
105
+ maxLength: {
106
+ type: Number,
107
+ required: false
108
+ },
109
+ autocomplete: {
110
+ type: String,
111
+ required: false
112
+ },
113
+ title: {
114
+ type: String,
115
+ required: false
116
+ },
117
+ level: {
118
+ type: Number,
119
+ required: false
120
+ },
121
+ onRemove: {
122
+ type: Function,
123
+ required: false
124
+ },
125
+ canRemove: {
126
+ type: Boolean,
127
+ required: false
128
+ },
129
+ removeLabel: {
130
+ type: String,
131
+ required: false
132
+ },
133
+ arrayIndex: {
134
+ type: Number,
135
+ required: false
136
+ },
137
+ path: {
138
+ type: String,
139
+ required: true
140
+ },
141
+ valueHelp: {
142
+ type: Object,
143
+ required: false
144
+ },
145
+ singularLabel: {
146
+ type: String,
147
+ required: false
148
+ },
149
+ inputId: {
150
+ type: String,
151
+ required: true
152
+ },
153
+ errorId: {
154
+ type: String,
155
+ required: true
156
+ },
157
+ descId: {
158
+ type: String,
159
+ required: true
160
+ },
161
+ ariaDescribedBy: {
162
+ type: String,
163
+ required: false
164
+ },
165
+ currencyCode: {
166
+ type: String,
167
+ required: false
168
+ },
169
+ unitCode: {
170
+ type: String,
171
+ required: false
172
+ },
173
+ precisionScale: {
174
+ type: Number,
175
+ required: false
176
+ },
177
+ prefix: {
178
+ type: String,
179
+ required: false
180
+ },
181
+ suffix: {
182
+ type: String,
183
+ required: false
184
+ },
185
+ scale: {
186
+ type: Number,
187
+ required: false
188
+ },
189
+ hasAdornment: {
190
+ type: Boolean,
191
+ required: false
192
+ },
193
+ disabled: {
194
+ type: Boolean,
195
+ required: false
196
+ },
197
+ hidden: {
198
+ type: Boolean,
199
+ required: false
200
+ },
201
+ size: {
202
+ type: Number,
203
+ required: false,
204
+ default: 192
205
+ },
206
+ errorCorrection: {
207
+ type: String,
208
+ required: false,
209
+ default: "M"
210
+ },
211
+ manualSecret: {
212
+ type: Boolean,
213
+ required: false,
214
+ default: true
215
+ }
216
+ },
217
+ setup(__props) {
218
+ const props = __props;
219
+ const uri = (0, vue.computed)(() => props.value ?? props.model?.value);
220
+ const svg = (0, vue.ref)();
221
+ const error = (0, vue.ref)();
222
+ const secret = (0, vue.ref)();
223
+ let qrcodeModulePromise;
224
+ function loadQrcode() {
225
+ qrcodeModulePromise ??= import("qrcode");
226
+ return qrcodeModulePromise;
227
+ }
228
+ const SECRET_RE = /[?&]secret=([^&]+)/;
229
+ function extractSecret(value) {
230
+ const m = SECRET_RE.exec(value);
231
+ return m ? decodeURIComponent(m[1]) : void 0;
232
+ }
233
+ let renderToken = 0;
234
+ (0, vue.watch)(uri, async (value) => {
235
+ const token = ++renderToken;
236
+ error.value = void 0;
237
+ if (!value) {
238
+ svg.value = void 0;
239
+ secret.value = void 0;
240
+ return;
241
+ }
242
+ secret.value = extractSecret(value);
243
+ let lib;
244
+ try {
245
+ const mod = await loadQrcode();
246
+ lib = mod.default ?? mod;
247
+ } catch (err) {
248
+ if (token !== renderToken) return;
249
+ svg.value = void 0;
250
+ secret.value = void 0;
251
+ console.error("[AsQrCode] qrcode peer dependency is not installed", err);
252
+ error.value = "Install the optional 'qrcode' dependency to render QR codes.";
253
+ return;
254
+ }
255
+ try {
256
+ const out = await lib.toString(value, {
257
+ type: "svg",
258
+ margin: 0,
259
+ width: props.size,
260
+ errorCorrectionLevel: props.errorCorrection
261
+ });
262
+ if (token !== renderToken) return;
263
+ svg.value = out;
264
+ } catch (err) {
265
+ if (token !== renderToken) return;
266
+ svg.value = void 0;
267
+ secret.value = void 0;
268
+ console.error("[AsQrCode] failed to render QR code", err);
269
+ error.value = "Failed to render QR code.";
270
+ }
271
+ }, { immediate: true });
272
+ return (_ctx, _cache) => {
273
+ return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(_atscript_vue_form.AsFieldShell), (0, vue.mergeProps)(_ctx.$props, {
274
+ "field-class": "as-qr-code",
275
+ error: error.value
276
+ }), {
277
+ default: (0, vue.withCtx)(() => [uri.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1, [svg.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
278
+ key: 0,
279
+ class: "as-qr-code-svg",
280
+ innerHTML: svg.value
281
+ }, null, 8, _hoisted_2)) : (0, vue.createCommentVNode)("v-if", true), __props.manualSecret && secret.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_3, (0, vue.toDisplayString)(secret.value), 1)) : (0, vue.createCommentVNode)("v-if", true)])) : (0, vue.createCommentVNode)("v-if", true)]),
282
+ _: 1
283
+ }, 16, ["error"]);
284
+ };
285
+ }
286
+ });
287
+ //#endregion
288
+ Object.defineProperty(exports, "as_qr_code_default", {
289
+ enumerable: true,
290
+ get: function() {
291
+ return as_qr_code_default;
292
+ }
293
+ });
@@ -0,0 +1,288 @@
1
+ import { computed, createBlock, createCommentVNode, createElementBlock, defineComponent, mergeProps, openBlock, ref, toDisplayString, unref, watch, withCtx } from "vue";
2
+ import { AsFieldShell } from "@atscript/vue-form";
3
+ //#region src/components/as-qr-code.vue?vue&type=script&setup=true&lang.ts
4
+ const _hoisted_1 = {
5
+ key: 0,
6
+ class: "as-qr-code-stack"
7
+ };
8
+ const _hoisted_2 = ["innerHTML"];
9
+ const _hoisted_3 = {
10
+ key: 1,
11
+ class: "as-qr-code-secret"
12
+ };
13
+ //#endregion
14
+ //#region src/components/as-qr-code.vue
15
+ var as_qr_code_default = /* @__PURE__ */ defineComponent({
16
+ __name: "as-qr-code",
17
+ props: {
18
+ onBlur: {
19
+ type: Function,
20
+ required: true
21
+ },
22
+ error: {
23
+ type: String,
24
+ required: false
25
+ },
26
+ model: {
27
+ type: Object,
28
+ required: true
29
+ },
30
+ value: {
31
+ type: null,
32
+ required: false
33
+ },
34
+ label: {
35
+ type: String,
36
+ required: false
37
+ },
38
+ description: {
39
+ type: String,
40
+ required: false
41
+ },
42
+ hint: {
43
+ type: String,
44
+ required: false
45
+ },
46
+ placeholder: {
47
+ type: String,
48
+ required: false
49
+ },
50
+ prefixIcon: {
51
+ type: String,
52
+ required: false
53
+ },
54
+ suffixIcon: {
55
+ type: String,
56
+ required: false
57
+ },
58
+ class: {
59
+ type: [Object, String],
60
+ required: false
61
+ },
62
+ style: {
63
+ type: [Object, String],
64
+ required: false
65
+ },
66
+ optional: {
67
+ type: Boolean,
68
+ required: false,
69
+ skipCheck: true
70
+ },
71
+ onToggleOptional: {
72
+ type: Function,
73
+ required: false
74
+ },
75
+ required: {
76
+ type: Boolean,
77
+ required: false,
78
+ skipCheck: true
79
+ },
80
+ readonly: {
81
+ type: Boolean,
82
+ required: false,
83
+ skipCheck: true
84
+ },
85
+ type: {
86
+ type: String,
87
+ required: true
88
+ },
89
+ formAction: {
90
+ type: Object,
91
+ required: false
92
+ },
93
+ name: {
94
+ type: String,
95
+ required: false
96
+ },
97
+ field: {
98
+ type: Object,
99
+ required: false
100
+ },
101
+ options: {
102
+ type: Array,
103
+ required: false
104
+ },
105
+ maxLength: {
106
+ type: Number,
107
+ required: false
108
+ },
109
+ autocomplete: {
110
+ type: String,
111
+ required: false
112
+ },
113
+ title: {
114
+ type: String,
115
+ required: false
116
+ },
117
+ level: {
118
+ type: Number,
119
+ required: false
120
+ },
121
+ onRemove: {
122
+ type: Function,
123
+ required: false
124
+ },
125
+ canRemove: {
126
+ type: Boolean,
127
+ required: false
128
+ },
129
+ removeLabel: {
130
+ type: String,
131
+ required: false
132
+ },
133
+ arrayIndex: {
134
+ type: Number,
135
+ required: false
136
+ },
137
+ path: {
138
+ type: String,
139
+ required: true
140
+ },
141
+ valueHelp: {
142
+ type: Object,
143
+ required: false
144
+ },
145
+ singularLabel: {
146
+ type: String,
147
+ required: false
148
+ },
149
+ inputId: {
150
+ type: String,
151
+ required: true
152
+ },
153
+ errorId: {
154
+ type: String,
155
+ required: true
156
+ },
157
+ descId: {
158
+ type: String,
159
+ required: true
160
+ },
161
+ ariaDescribedBy: {
162
+ type: String,
163
+ required: false
164
+ },
165
+ currencyCode: {
166
+ type: String,
167
+ required: false
168
+ },
169
+ unitCode: {
170
+ type: String,
171
+ required: false
172
+ },
173
+ precisionScale: {
174
+ type: Number,
175
+ required: false
176
+ },
177
+ prefix: {
178
+ type: String,
179
+ required: false
180
+ },
181
+ suffix: {
182
+ type: String,
183
+ required: false
184
+ },
185
+ scale: {
186
+ type: Number,
187
+ required: false
188
+ },
189
+ hasAdornment: {
190
+ type: Boolean,
191
+ required: false
192
+ },
193
+ disabled: {
194
+ type: Boolean,
195
+ required: false
196
+ },
197
+ hidden: {
198
+ type: Boolean,
199
+ required: false
200
+ },
201
+ size: {
202
+ type: Number,
203
+ required: false,
204
+ default: 192
205
+ },
206
+ errorCorrection: {
207
+ type: String,
208
+ required: false,
209
+ default: "M"
210
+ },
211
+ manualSecret: {
212
+ type: Boolean,
213
+ required: false,
214
+ default: true
215
+ }
216
+ },
217
+ setup(__props) {
218
+ const props = __props;
219
+ const uri = computed(() => props.value ?? props.model?.value);
220
+ const svg = ref();
221
+ const error = ref();
222
+ const secret = ref();
223
+ let qrcodeModulePromise;
224
+ function loadQrcode() {
225
+ qrcodeModulePromise ??= import("qrcode");
226
+ return qrcodeModulePromise;
227
+ }
228
+ const SECRET_RE = /[?&]secret=([^&]+)/;
229
+ function extractSecret(value) {
230
+ const m = SECRET_RE.exec(value);
231
+ return m ? decodeURIComponent(m[1]) : void 0;
232
+ }
233
+ let renderToken = 0;
234
+ watch(uri, async (value) => {
235
+ const token = ++renderToken;
236
+ error.value = void 0;
237
+ if (!value) {
238
+ svg.value = void 0;
239
+ secret.value = void 0;
240
+ return;
241
+ }
242
+ secret.value = extractSecret(value);
243
+ let lib;
244
+ try {
245
+ const mod = await loadQrcode();
246
+ lib = mod.default ?? mod;
247
+ } catch (err) {
248
+ if (token !== renderToken) return;
249
+ svg.value = void 0;
250
+ secret.value = void 0;
251
+ console.error("[AsQrCode] qrcode peer dependency is not installed", err);
252
+ error.value = "Install the optional 'qrcode' dependency to render QR codes.";
253
+ return;
254
+ }
255
+ try {
256
+ const out = await lib.toString(value, {
257
+ type: "svg",
258
+ margin: 0,
259
+ width: props.size,
260
+ errorCorrectionLevel: props.errorCorrection
261
+ });
262
+ if (token !== renderToken) return;
263
+ svg.value = out;
264
+ } catch (err) {
265
+ if (token !== renderToken) return;
266
+ svg.value = void 0;
267
+ secret.value = void 0;
268
+ console.error("[AsQrCode] failed to render QR code", err);
269
+ error.value = "Failed to render QR code.";
270
+ }
271
+ }, { immediate: true });
272
+ return (_ctx, _cache) => {
273
+ return openBlock(), createBlock(unref(AsFieldShell), mergeProps(_ctx.$props, {
274
+ "field-class": "as-qr-code",
275
+ error: error.value
276
+ }), {
277
+ default: withCtx(() => [uri.value ? (openBlock(), createElementBlock("div", _hoisted_1, [svg.value ? (openBlock(), createElementBlock("div", {
278
+ key: 0,
279
+ class: "as-qr-code-svg",
280
+ innerHTML: svg.value
281
+ }, null, 8, _hoisted_2)) : createCommentVNode("v-if", true), __props.manualSecret && secret.value ? (openBlock(), createElementBlock("div", _hoisted_3, toDisplayString(secret.value), 1)) : createCommentVNode("v-if", true)])) : createCommentVNode("v-if", true)]),
282
+ _: 1
283
+ }, 16, ["error"]);
284
+ };
285
+ }
286
+ });
287
+ //#endregion
288
+ export { as_qr_code_default as t };
@@ -0,0 +1,2 @@
1
+ const require_as_qr_code = require("./as-qr-code-BoEy7mvV.cjs");
2
+ module.exports = require_as_qr_code.as_qr_code_default;
@@ -0,0 +1,16 @@
1
+ import * as vue from "vue";
2
+ import { TAsComponentProps } from "@atscript/vue-form";
3
+
4
+ //#region src/components/as-qr-code.vue.d.ts
5
+ type __VLS_Props = TAsComponentProps<string | undefined> & {
6
+ size?: number;
7
+ errorCorrection?: "L" | "M" | "Q" | "H";
8
+ manualSecret?: boolean;
9
+ };
10
+ declare const __VLS_export: vue.DefineComponent<__VLS_Props, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
11
+ size: number;
12
+ errorCorrection: "L" | "M" | "Q" | "H";
13
+ manualSecret: boolean;
14
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
15
+ declare const _default: typeof __VLS_export;
16
+ export = _default;
@@ -0,0 +1,17 @@
1
+ import * as vue from "vue";
2
+ import { TAsComponentProps } from "@atscript/vue-form";
3
+
4
+ //#region src/components/as-qr-code.vue.d.ts
5
+ type __VLS_Props = TAsComponentProps<string | undefined> & {
6
+ size?: number;
7
+ errorCorrection?: "L" | "M" | "Q" | "H";
8
+ manualSecret?: boolean;
9
+ };
10
+ declare const __VLS_export: vue.DefineComponent<__VLS_Props, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
11
+ size: number;
12
+ errorCorrection: "L" | "M" | "Q" | "H";
13
+ manualSecret: boolean;
14
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
15
+ declare const _default: typeof __VLS_export;
16
+ //#endregion
17
+ export { _default as default };
@@ -0,0 +1,2 @@
1
+ import { t as as_qr_code_default } from "./as-qr-code-U4sjF5lD.mjs";
2
+ export { as_qr_code_default as default };
package/dist/index.cjs CHANGED
@@ -1,5 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_as_consent_array = require("./as-consent-array-B8gtVvew.cjs");
3
- const require_as_password_rules = require("./as-password-rules-Dqk2jgol.cjs");
3
+ const require_as_copy = require("./as-copy-USMxrTlI.cjs");
4
+ const require_as_password_rules = require("./as-password-rules-DBoLmROR.cjs");
5
+ const require_as_qr_code = require("./as-qr-code-BoEy7mvV.cjs");
4
6
  exports.AsConsentArray = require_as_consent_array.as_consent_array_default;
7
+ exports.AsCopy = require_as_copy.as_copy_default;
5
8
  exports.AsPasswordRules = require_as_password_rules.as_password_rules_default;
9
+ exports.AsQrCode = require_as_qr_code.as_qr_code_default;
package/dist/index.d.cts CHANGED
@@ -1,3 +1,5 @@
1
1
  import _default from "./as-consent-array.cjs";
2
- import _default$1 from "./as-password-rules.cjs";
3
- export { _default as AsConsentArray, _default$1 as AsPasswordRules };
2
+ import _default$1 from "./as-copy.cjs";
3
+ import _default$2 from "./as-password-rules.cjs";
4
+ import _default$3 from "./as-qr-code.cjs";
5
+ export { _default as AsConsentArray, _default$1 as AsCopy, _default$2 as AsPasswordRules, _default$3 as AsQrCode };
package/dist/index.d.mts CHANGED
@@ -1,3 +1,5 @@
1
1
  import _default from "./as-consent-array.mjs";
2
- import _default$1 from "./as-password-rules.mjs";
3
- export { _default as AsConsentArray, _default$1 as AsPasswordRules };
2
+ import _default$1 from "./as-copy.mjs";
3
+ import _default$2 from "./as-password-rules.mjs";
4
+ import _default$3 from "./as-qr-code.mjs";
5
+ export { _default as AsConsentArray, _default$1 as AsCopy, _default$2 as AsPasswordRules, _default$3 as AsQrCode };
package/dist/index.mjs CHANGED
@@ -1,3 +1,5 @@
1
1
  import { t as as_consent_array_default } from "./as-consent-array-C1GpSvgX.mjs";
2
- import { t as as_password_rules_default } from "./as-password-rules-9OToIqwo.mjs";
3
- export { as_consent_array_default as AsConsentArray, as_password_rules_default as AsPasswordRules };
2
+ import { t as as_copy_default } from "./as-copy-CxLJdyxe.mjs";
3
+ import { t as as_password_rules_default } from "./as-password-rules-DuKe47j8.mjs";
4
+ import { t as as_qr_code_default } from "./as-qr-code-U4sjF5lD.mjs";
5
+ export { as_consent_array_default as AsConsentArray, as_copy_default as AsCopy, as_password_rules_default as AsPasswordRules, as_qr_code_default as AsQrCode };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atscript/vue-aooth",
3
- "version": "0.1.79",
3
+ "version": "0.1.81",
4
4
  "description": "Custom form components for the Aooth auth system, built on @atscript/vue-form",
5
5
  "keywords": [
6
6
  "aooth",
@@ -39,38 +39,56 @@
39
39
  "import": "./dist/as-consent-array.mjs",
40
40
  "require": "./dist/as-consent-array.cjs"
41
41
  },
42
+ "./as-copy": {
43
+ "types": "./dist/as-copy.d.mts",
44
+ "import": "./dist/as-copy.mjs",
45
+ "require": "./dist/as-copy.cjs"
46
+ },
42
47
  "./as-password-rules": {
43
48
  "types": "./dist/as-password-rules.d.mts",
44
49
  "import": "./dist/as-password-rules.mjs",
45
50
  "require": "./dist/as-password-rules.cjs"
46
51
  },
52
+ "./as-qr-code": {
53
+ "types": "./dist/as-qr-code.d.mts",
54
+ "import": "./dist/as-qr-code.mjs",
55
+ "require": "./dist/as-qr-code.cjs"
56
+ },
47
57
  "./package.json": "./package.json"
48
58
  },
49
59
  "publishConfig": {
50
60
  "access": "public"
51
61
  },
52
62
  "dependencies": {
53
- "@atscript/ui": "^0.1.79",
54
- "@atscript/vue-form": "^0.1.79"
63
+ "@atscript/ui": "^0.1.81",
64
+ "@atscript/vue-form": "^0.1.81"
55
65
  },
56
66
  "devDependencies": {
57
- "@atscript/core": "^0.1.64",
58
- "@atscript/typescript": "^0.1.64",
67
+ "@atscript/core": "^0.1.66",
68
+ "@atscript/typescript": "^0.1.66",
59
69
  "@tsdown/css": "^0.21.4",
70
+ "@types/qrcode": "^1.5.5",
60
71
  "@vitejs/plugin-vue": "^6",
61
72
  "@vue/test-utils": "^2",
62
73
  "happy-dom": "^18",
63
- "unplugin-atscript": "^0.1.64",
74
+ "qrcode": "^1.5.4",
75
+ "unplugin-atscript": "^0.1.66",
64
76
  "vitest": "npm:@voidzero-dev/vite-plus-test@0.1.14",
65
77
  "vue": "^3",
66
78
  "vue-tsc": "~3.2.9",
67
79
  "vunor": "^0.2.1",
68
- "@atscript/ui-fns": "^0.1.79"
80
+ "@atscript/ui-fns": "^0.1.81"
69
81
  },
70
82
  "peerDependencies": {
83
+ "qrcode": "^1.5.4",
71
84
  "vue": "^3",
72
- "@atscript/ui-fns": "^0.1.79",
73
- "@atscript/vue-form": "^0.1.79"
85
+ "@atscript/ui-fns": "^0.1.81",
86
+ "@atscript/vue-form": "^0.1.81"
87
+ },
88
+ "peerDependenciesMeta": {
89
+ "qrcode": {
90
+ "optional": true
91
+ }
74
92
  },
75
93
  "scripts": {
76
94
  "build": "node ../../scripts/gen-exports.mjs && vp pack",