@nawa-captcha/vue 0.0.0-stage โ†’ 0.1.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 CHANGED
@@ -1,3 +1,46 @@
1
- # Temporary Holding Version
1
+ # @nawa-captcha/vue
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Nawa Captcha** โ€” a self-hosted, privacy-friendly and accessible puzzle CAPTCHA. A drop-in alternative to reCAPTCHA, hCaptcha and Turnstile with no third-party tracking: your server issues the challenge and verifies the answer.
4
+
5
+ This package: Vue 3 component with v-model.
6
+
7
+ - ๐Ÿงฉ 38 challenge types you choose from (one, two or many, per action): slider jigsaws, rotate, drag to the shadow, jigsaw, hold, icon/colour/clock/symmetry grids, match pairs, tap in order, spell, order and story tiles, connect the dots, maze, math, dice, invisible proof-of-work, an accessible text question and an audio challenge โ€” [see them live](https://oriebalzyuot96.github.io/nawa-captcha/#playground)
8
+ - ๐Ÿ”’ Answers are sealed (AES-256-GCM) and never reach the browser; pass tokens are signed and single-use
9
+ - โ™ฟ Keyboard, touch and screen-reader friendly (text question and audio challenge); Arabic and English; RTL
10
+ - ๐ŸŽจ Premium 3D design, six themes in light and dark plus high contrast (WCAG 2.2 AA), Pelagic UI tokens, optional sound effects
11
+ - ๐Ÿ–ฅ๏ธ Backends: Node.js / Express and ASP.NET Core (`NawaCaptcha.AspNetCore`, coming to NuGet)
12
+
13
+ ## Install
14
+
15
+ > **Coming to npm.** `@nawa-captcha/vue` is published once the `@nawa-captcha` npm organisation exists. Until then, build it from the [repository](https://github.com/oriebalzyuot96/nawa-captcha) (`npm install && npm run build`, then `npm pack -w @nawa-captcha/vue`).
16
+
17
+ ```bash
18
+ npm i @nawa-captcha/vue
19
+ # or
20
+ yarn add @nawa-captcha/vue
21
+ # or
22
+ pnpm add @nawa-captcha/vue
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ```vue
28
+ <script setup lang="ts">
29
+ import { ref } from 'vue';
30
+ import { NawaCaptcha } from '@nawa-captcha/vue';
31
+ const token = ref('');
32
+ </script>
33
+
34
+ <template>
35
+ <NawaCaptcha v-model="token" site-key="main" action="login" lang="en" />
36
+ <button :disabled="!token">Sign in</button>
37
+ </template>
38
+ ```
39
+
40
+ `types` narrows the server's allowed puzzles: `<NawaCaptcha v-model="token" action="login" :types="['slider', 'pairs']" />` (never widens them).
41
+
42
+ Then verify on your backend before trusting the request โ€” see the [full guide](https://github.com/oriebalzyuot96/nawa-captcha#readme).
43
+
44
+ ๐Ÿ“– Docs: https://oriebalzyuot96.github.io/nawa-captcha/ ยท ๐Ÿ’ป Source: https://github.com/oriebalzyuot96/nawa-captcha
45
+
46
+ MIT ยฉ oriebalzyuot96
@@ -0,0 +1,291 @@
1
+ import { type PropType } from 'vue';
2
+ import '@nawa-captcha/widget';
3
+ import type { NawaCaptchaErrorDetail, NawaCaptchaVerifiedDetail } from '@nawa-captcha/widget';
4
+ export type { NawaCaptchaErrorDetail, NawaCaptchaVerifiedDetail };
5
+ /**
6
+ * <NawaCaptcha v-model="token" action="login" lang="ar" @verified="โ€ฆ" />
7
+ *
8
+ * `v-model` holds the pass token ('' until verified). Setting it back to '' (e.g. after a
9
+ * failed submit, since tokens are single-use) makes the widget load a fresh challenge.
10
+ */
11
+ export declare const NawaCaptcha: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
12
+ modelValue: {
13
+ type: StringConstructor;
14
+ default: string;
15
+ };
16
+ siteKey: {
17
+ type: StringConstructor;
18
+ default: undefined;
19
+ };
20
+ endpoint: {
21
+ type: StringConstructor;
22
+ default: undefined;
23
+ };
24
+ action: {
25
+ type: StringConstructor;
26
+ default: undefined;
27
+ };
28
+ lang: {
29
+ type: PropType<"ar" | "en">;
30
+ default: undefined;
31
+ };
32
+ name: {
33
+ type: StringConstructor;
34
+ default: undefined;
35
+ };
36
+ type: {
37
+ type: StringConstructor;
38
+ default: undefined;
39
+ };
40
+ /** Narrows the server's allowed puzzle types (array or comma-separated). Never widens it. */
41
+ types: {
42
+ type: PropType<string | readonly string[]>;
43
+ default: undefined;
44
+ };
45
+ /** Theme preset or appearance shorthand (see the widget README). */
46
+ theme: {
47
+ type: StringConstructor;
48
+ default: undefined;
49
+ };
50
+ appearance: {
51
+ type: PropType<"auto" | "light" | "dark" | "high-contrast">;
52
+ default: undefined;
53
+ };
54
+ /** UI sound effects on by default (the visitor's toggle still wins). */
55
+ sound: {
56
+ type: BooleanConstructor;
57
+ default: undefined;
58
+ };
59
+ volume: {
60
+ type: NumberConstructor;
61
+ default: undefined;
62
+ };
63
+ muted: {
64
+ type: BooleanConstructor;
65
+ default: undefined;
66
+ };
67
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
68
+ [key: string]: any;
69
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
70
+ 'update:modelValue': (token: string) => boolean;
71
+ verified: (detail: NawaCaptchaVerifiedDetail) => true;
72
+ expired: () => true;
73
+ error: (detail: NawaCaptchaErrorDetail) => true;
74
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
75
+ modelValue: {
76
+ type: StringConstructor;
77
+ default: string;
78
+ };
79
+ siteKey: {
80
+ type: StringConstructor;
81
+ default: undefined;
82
+ };
83
+ endpoint: {
84
+ type: StringConstructor;
85
+ default: undefined;
86
+ };
87
+ action: {
88
+ type: StringConstructor;
89
+ default: undefined;
90
+ };
91
+ lang: {
92
+ type: PropType<"ar" | "en">;
93
+ default: undefined;
94
+ };
95
+ name: {
96
+ type: StringConstructor;
97
+ default: undefined;
98
+ };
99
+ type: {
100
+ type: StringConstructor;
101
+ default: undefined;
102
+ };
103
+ /** Narrows the server's allowed puzzle types (array or comma-separated). Never widens it. */
104
+ types: {
105
+ type: PropType<string | readonly string[]>;
106
+ default: undefined;
107
+ };
108
+ /** Theme preset or appearance shorthand (see the widget README). */
109
+ theme: {
110
+ type: StringConstructor;
111
+ default: undefined;
112
+ };
113
+ appearance: {
114
+ type: PropType<"auto" | "light" | "dark" | "high-contrast">;
115
+ default: undefined;
116
+ };
117
+ /** UI sound effects on by default (the visitor's toggle still wins). */
118
+ sound: {
119
+ type: BooleanConstructor;
120
+ default: undefined;
121
+ };
122
+ volume: {
123
+ type: NumberConstructor;
124
+ default: undefined;
125
+ };
126
+ muted: {
127
+ type: BooleanConstructor;
128
+ default: undefined;
129
+ };
130
+ }>> & Readonly<{
131
+ "onUpdate:modelValue"?: ((token: string) => any) | undefined;
132
+ onVerified?: ((detail: NawaCaptchaVerifiedDetail) => any) | undefined;
133
+ onExpired?: (() => any) | undefined;
134
+ onError?: ((detail: NawaCaptchaErrorDetail) => any) | undefined;
135
+ }>, {
136
+ modelValue: string;
137
+ type: string;
138
+ siteKey: string;
139
+ endpoint: string;
140
+ action: string;
141
+ lang: "ar" | "en";
142
+ name: string;
143
+ types: string | readonly string[];
144
+ theme: string;
145
+ appearance: "auto" | "light" | "dark" | "high-contrast";
146
+ sound: boolean;
147
+ volume: number;
148
+ muted: boolean;
149
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
150
+ /** @deprecated Renamed to {@link NawaCaptcha} (Nawa Guard is now Nawa Captcha). */
151
+ export declare const NawaGuard: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
152
+ modelValue: {
153
+ type: StringConstructor;
154
+ default: string;
155
+ };
156
+ siteKey: {
157
+ type: StringConstructor;
158
+ default: undefined;
159
+ };
160
+ endpoint: {
161
+ type: StringConstructor;
162
+ default: undefined;
163
+ };
164
+ action: {
165
+ type: StringConstructor;
166
+ default: undefined;
167
+ };
168
+ lang: {
169
+ type: PropType<"ar" | "en">;
170
+ default: undefined;
171
+ };
172
+ name: {
173
+ type: StringConstructor;
174
+ default: undefined;
175
+ };
176
+ type: {
177
+ type: StringConstructor;
178
+ default: undefined;
179
+ };
180
+ /** Narrows the server's allowed puzzle types (array or comma-separated). Never widens it. */
181
+ types: {
182
+ type: PropType<string | readonly string[]>;
183
+ default: undefined;
184
+ };
185
+ /** Theme preset or appearance shorthand (see the widget README). */
186
+ theme: {
187
+ type: StringConstructor;
188
+ default: undefined;
189
+ };
190
+ appearance: {
191
+ type: PropType<"auto" | "light" | "dark" | "high-contrast">;
192
+ default: undefined;
193
+ };
194
+ /** UI sound effects on by default (the visitor's toggle still wins). */
195
+ sound: {
196
+ type: BooleanConstructor;
197
+ default: undefined;
198
+ };
199
+ volume: {
200
+ type: NumberConstructor;
201
+ default: undefined;
202
+ };
203
+ muted: {
204
+ type: BooleanConstructor;
205
+ default: undefined;
206
+ };
207
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
208
+ [key: string]: any;
209
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
210
+ 'update:modelValue': (token: string) => boolean;
211
+ verified: (detail: NawaCaptchaVerifiedDetail) => true;
212
+ expired: () => true;
213
+ error: (detail: NawaCaptchaErrorDetail) => true;
214
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
215
+ modelValue: {
216
+ type: StringConstructor;
217
+ default: string;
218
+ };
219
+ siteKey: {
220
+ type: StringConstructor;
221
+ default: undefined;
222
+ };
223
+ endpoint: {
224
+ type: StringConstructor;
225
+ default: undefined;
226
+ };
227
+ action: {
228
+ type: StringConstructor;
229
+ default: undefined;
230
+ };
231
+ lang: {
232
+ type: PropType<"ar" | "en">;
233
+ default: undefined;
234
+ };
235
+ name: {
236
+ type: StringConstructor;
237
+ default: undefined;
238
+ };
239
+ type: {
240
+ type: StringConstructor;
241
+ default: undefined;
242
+ };
243
+ /** Narrows the server's allowed puzzle types (array or comma-separated). Never widens it. */
244
+ types: {
245
+ type: PropType<string | readonly string[]>;
246
+ default: undefined;
247
+ };
248
+ /** Theme preset or appearance shorthand (see the widget README). */
249
+ theme: {
250
+ type: StringConstructor;
251
+ default: undefined;
252
+ };
253
+ appearance: {
254
+ type: PropType<"auto" | "light" | "dark" | "high-contrast">;
255
+ default: undefined;
256
+ };
257
+ /** UI sound effects on by default (the visitor's toggle still wins). */
258
+ sound: {
259
+ type: BooleanConstructor;
260
+ default: undefined;
261
+ };
262
+ volume: {
263
+ type: NumberConstructor;
264
+ default: undefined;
265
+ };
266
+ muted: {
267
+ type: BooleanConstructor;
268
+ default: undefined;
269
+ };
270
+ }>> & Readonly<{
271
+ "onUpdate:modelValue"?: ((token: string) => any) | undefined;
272
+ onVerified?: ((detail: NawaCaptchaVerifiedDetail) => any) | undefined;
273
+ onExpired?: (() => any) | undefined;
274
+ onError?: ((detail: NawaCaptchaErrorDetail) => any) | undefined;
275
+ }>, {
276
+ modelValue: string;
277
+ type: string;
278
+ siteKey: string;
279
+ endpoint: string;
280
+ action: string;
281
+ lang: "ar" | "en";
282
+ name: string;
283
+ types: string | readonly string[];
284
+ theme: string;
285
+ appearance: "auto" | "light" | "dark" | "high-contrast";
286
+ sound: boolean;
287
+ volume: number;
288
+ muted: boolean;
289
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
290
+ export default NawaCaptcha;
291
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8D,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAChG,OAAO,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAsB,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAElH,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,CAAC;AAElE;;;;;GAKG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;cAOI,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;;;;;;;;;;;IAG7C,6FAA6F;;cAC3D,QAAQ,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;;;IACtE,oEAAoE;;;;;;cAEtC,QAAQ,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC;;;IACnF,wEAAwE;;;;;;;;;;;;;;;;iCAM3C,MAAM;uBAChB,yBAAyB;;oBAE5B,sBAAsB;;;;;;;;;;;;;;;;;;;cAjBd,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;;;;;;;;;;;IAG7C,6FAA6F;;cAC3D,QAAQ,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;;;IACtE,oEAAoE;;;;;;cAEtC,QAAQ,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC;;;IACnF,wEAAwE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EA4E1E,CAAC;AAEH,mFAAmF;AACnF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;cAvFM,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;;;;;;;;;;;IAG7C,6FAA6F;;cAC3D,QAAQ,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;;;IACtE,oEAAoE;;;;;;cAEtC,QAAQ,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC;;;IACnF,wEAAwE;;;;;;;;;;;;;;;;iCAM3C,MAAM;uBAChB,yBAAyB;;oBAE5B,sBAAsB;;;;;;;;;;;;;;;;;;;cAjBd,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;;;;;;;;;;;IAG7C,6FAA6F;;cAC3D,QAAQ,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;;;IACtE,oEAAoE;;;;;;cAEtC,QAAQ,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC;;;IACnF,wEAAwE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EA+ExC,CAAC;AAErC,eAAe,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,96 @@
1
+ import { defineComponent, h, onBeforeUnmount, onMounted, ref, watch } from 'vue';
2
+ import '@nawa-captcha/widget';
3
+ /**
4
+ * <NawaCaptcha v-model="token" action="login" lang="ar" @verified="โ€ฆ" />
5
+ *
6
+ * `v-model` holds the pass token ('' until verified). Setting it back to '' (e.g. after a
7
+ * failed submit, since tokens are single-use) makes the widget load a fresh challenge.
8
+ */
9
+ export const NawaCaptcha = defineComponent({
10
+ name: 'NawaCaptcha',
11
+ props: {
12
+ modelValue: { type: String, default: '' },
13
+ siteKey: { type: String, default: undefined },
14
+ endpoint: { type: String, default: undefined },
15
+ action: { type: String, default: undefined },
16
+ lang: { type: String, default: undefined },
17
+ name: { type: String, default: undefined },
18
+ type: { type: String, default: undefined },
19
+ /** Narrows the server's allowed puzzle types (array or comma-separated). Never widens it. */
20
+ types: { type: [String, Array], default: undefined },
21
+ /** Theme preset or appearance shorthand (see the widget README). */
22
+ theme: { type: String, default: undefined },
23
+ appearance: { type: String, default: undefined },
24
+ /** UI sound effects on by default (the visitor's toggle still wins). */
25
+ sound: { type: Boolean, default: undefined },
26
+ volume: { type: Number, default: undefined },
27
+ muted: { type: Boolean, default: undefined },
28
+ },
29
+ emits: {
30
+ 'update:modelValue': (token) => typeof token === 'string',
31
+ verified: (detail) => !!detail,
32
+ expired: () => true,
33
+ error: (detail) => !!detail,
34
+ },
35
+ setup(props, { emit, expose }) {
36
+ const el = ref(null);
37
+ let current = '';
38
+ const onVerified = (e) => {
39
+ const detail = e.detail;
40
+ current = detail.token;
41
+ emit('update:modelValue', detail.token);
42
+ emit('verified', detail);
43
+ };
44
+ const onExpired = () => {
45
+ current = '';
46
+ emit('update:modelValue', '');
47
+ emit('expired');
48
+ };
49
+ const onError = (e) => {
50
+ current = '';
51
+ emit('update:modelValue', '');
52
+ emit('error', e.detail);
53
+ };
54
+ onMounted(() => {
55
+ el.value?.addEventListener('nawa-captcha:verified', onVerified);
56
+ el.value?.addEventListener('nawa-captcha:expired', onExpired);
57
+ el.value?.addEventListener('nawa-captcha:error', onError);
58
+ });
59
+ onBeforeUnmount(() => {
60
+ el.value?.removeEventListener('nawa-captcha:verified', onVerified);
61
+ el.value?.removeEventListener('nawa-captcha:expired', onExpired);
62
+ el.value?.removeEventListener('nawa-captcha:error', onError);
63
+ });
64
+ watch(() => props.modelValue, (value) => {
65
+ if (!value && current) {
66
+ current = '';
67
+ el.value?.reset();
68
+ }
69
+ });
70
+ const reset = () => {
71
+ current = '';
72
+ emit('update:modelValue', '');
73
+ el.value?.reset();
74
+ };
75
+ expose({ reset });
76
+ return () => h('nawa-captcha', {
77
+ ref: el,
78
+ 'site-key': props.siteKey,
79
+ endpoint: props.endpoint,
80
+ action: props.action,
81
+ lang: props.lang,
82
+ name: props.name,
83
+ type: props.type,
84
+ types: props.types === undefined ? undefined : typeof props.types === 'string' ? props.types : props.types.join(','),
85
+ theme: props.theme,
86
+ appearance: props.appearance,
87
+ sound: props.sound,
88
+ volume: props.volume,
89
+ muted: props.muted,
90
+ });
91
+ },
92
+ });
93
+ /** @deprecated Renamed to {@link NawaCaptcha} (Nawa Guard is now Nawa Captcha). */
94
+ export const NawaGuard = NawaCaptcha;
95
+ export default NawaCaptcha;
96
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAiB,MAAM,KAAK,CAAC;AAChG,OAAO,sBAAsB,CAAC;AAK9B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;IACzC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE;QACL,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACzC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC7C,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,MAA+B,EAAE,OAAO,EAAE,SAAS,EAAE;QACnE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC1C,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC1C,6FAA6F;QAC7F,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAyC,EAAE,OAAO,EAAE,SAAS,EAAE;QAC5F,oEAAoE;QACpE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC3C,UAAU,EAAE,EAAE,IAAI,EAAE,MAA+D,EAAE,OAAO,EAAE,SAAS,EAAE;QACzG,wEAAwE;QACxE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;QAC5C,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC5C,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;KAC7C;IACD,KAAK,EAAE;QACL,mBAAmB,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ;QACjE,QAAQ,EAAE,CAAC,MAAiC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;QACzD,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;QACnB,KAAK,EAAE,CAAC,MAA8B,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;KACpD;IACD,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QAC3B,MAAM,EAAE,GAAG,GAAG,CAA4B,IAAI,CAAC,CAAC;QAChD,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,MAAM,UAAU,GAAG,CAAC,CAAQ,EAAQ,EAAE;YACpC,MAAM,MAAM,GAAI,CAA4C,CAAC,MAAM,CAAC;YACpE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;YACvB,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,GAAS,EAAE;YAC3B,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,CAAQ,EAAQ,EAAE;YACjC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAG,CAAyC,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC,CAAC;QAEF,SAAS,CAAC,GAAG,EAAE;YACb,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;YAChE,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;YAC9D,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,eAAe,CAAC,GAAG,EAAE;YACnB,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;YACnE,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;YACjE,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,KAAK,CACH,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EACtB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;gBACtB,OAAO,GAAG,EAAE,CAAC;gBACb,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;YACpB,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,KAAK,GAAG,GAAS,EAAE;YACvB,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YAC9B,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACpB,CAAC,CAAC;QACF,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAElB,OAAO,GAAG,EAAE,CACV,CAAC,CAAC,cAAc,EAAE;YAChB,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,KAAK,CAAC,OAAO;YACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;YACpH,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;IACP,CAAC;CACF,CAAC,CAAC;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AAErC,eAAe,WAAW,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,65 @@
1
1
  {
2
2
  "name": "@nawa-captcha/vue",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "Nawa Captcha for Vue 3: accessible, self-hosted puzzle CAPTCHA component with v-model โ€” a privacy-friendly reCAPTCHA alternative.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "typecheck": "tsc -p tsconfig.json --noEmit"
22
+ },
23
+ "dependencies": {
24
+ "@nawa-captcha/widget": "0.1.1"
25
+ },
26
+ "peerDependencies": {
27
+ "vue": "^3.3.0"
28
+ },
29
+ "devDependencies": {
30
+ "vue": "^3.5.0"
31
+ },
32
+ "keywords": [
33
+ "vue",
34
+ "vue3",
35
+ "vue-component",
36
+ "captcha",
37
+ "recaptcha-alternative",
38
+ "hcaptcha-alternative",
39
+ "turnstile-alternative",
40
+ "self-hosted-captcha",
41
+ "accessible-captcha",
42
+ "puzzle-captcha",
43
+ "slider-captcha",
44
+ "privacy",
45
+ "gdpr",
46
+ "bot-protection",
47
+ "anti-spam",
48
+ "proof-of-work",
49
+ "nawa-captcha",
50
+ "pelagic-ui",
51
+ "arabic",
52
+ "rtl"
53
+ ],
54
+ "homepage": "https://oriebalzyuot96.github.io/nawa-captcha/",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/oriebalzyuot96/nawa-captcha.git",
58
+ "directory": "packages/vue"
59
+ },
60
+ "bugs": "https://github.com/oriebalzyuot96/nawa-captcha/issues",
61
+ "author": "oriebalzyuot96",
62
+ "publishConfig": {
63
+ "access": "public"
64
+ }
65
+ }