eimzo-sign-vue 0.1.0

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,140 @@
1
+ # eimzo-sign-vue
2
+
3
+ Vue 2.7 / Vue 3 uchun **E-IMZO imzolash modali**: sertifikat tanlash, WYSIWYS
4
+ ("nimani ko'rsang — shuni imzolaysan") ko'rinish, bir nechta hujjatni bitta
5
+ sertifikat bilan **partiyali** imzolash, tiplangan xatolar va audit hook.
6
+
7
+ Yuqori xavfsizlik talablariga mo'ljallangan. Barcha imzolash mantig'i framework-agnostik
8
+ [`eimzo-sign-core`](../core) da.
9
+
10
+ ---
11
+
12
+ ## O'rnatish
13
+
14
+ ```sh
15
+ pnpm add eimzo-sign-vue eimzo-sign-core
16
+ # yoki git orqali:
17
+ pnpm add "github:ORG/eimzo-sign#workspace=eimzo-sign-vue"
18
+ ```
19
+
20
+ `peerDependencies`: `vue@^2.7 || >=3.3`.
21
+
22
+ - **Vue 3** — `import ... from 'eimzo-sign-vue'` (tayyor `dist`).
23
+ - **Vue 2.7** — `dist` Vue 3 ga kompilyatsiya qilingan. Vue 2.7 loyihalar:
24
+ - imperativ API (`createEimzo().sign(...)`) va headless `SignFlow` to'g'ridan-to'g'ri ishlaydi;
25
+ - tayyor SFC kerak bo'lsa `eimzo-sign-vue/src` source path'ini bundler'ingizda
26
+ kompilyatsiya qiling (`transpileDependencies`), yoki `SignFlow` atrofida
27
+ o'z shabloningizni yozing (misol: repo ildizidagi `src/App.vue`).
28
+
29
+ ---
30
+
31
+ ## Tez boshlash (imperativ)
32
+
33
+ ```ts
34
+ import { createEimzo } from 'eimzo-sign-vue'
35
+ import 'eimzo-sign-vue/style.css' // ixtiyoriy — createEimzo({ injectStyles:false }) bo'lsa
36
+
37
+ const eimzo = createEimzo({
38
+ apiKeys: [['example.uz', import.meta.env.VITE_EIMZO_KEY]], // .env dan, kodga yozmang
39
+ onAudit: (e) => auditLog.write(e), // SIEM ga
40
+ })
41
+
42
+ app.use(eimzo) // $eimzoSign / useEimzoSign uchun (ixtiyoriy)
43
+ ```
44
+
45
+ ```ts
46
+ // komponent ichida
47
+ try {
48
+ const { results } = await this.$eimzoSign([
49
+ { id: 'p1', title: "To'lov №1", content: xml1,
50
+ preview: [{ label: 'Summa', value: '1 000 000 UZS' }, { label: 'Qabul qiluvchi', value: 'ACME LLC' }] },
51
+ { id: 'p2', title: "To'lov №2", content: xml2 },
52
+ ])
53
+ // results: [{ id, pkcs7_64, signature_hex, signer_serial_number }, ...]
54
+ await api.submitSigned(results)
55
+ } catch (e) {
56
+ if (e.code === 'E_CANCELLED') {
57
+ if (e.partial) await api.submitSigned(e.partial) // yarim ishni saqlab qolish
58
+ return
59
+ }
60
+ notify.error(e.message)
61
+ }
62
+ ```
63
+
64
+ Kompozitsiya API:
65
+
66
+ ```ts
67
+ import { useEimzoSign } from 'eimzo-sign-vue'
68
+ const { sign, client } = useEimzoSign()
69
+ ```
70
+
71
+ ## Deklarativ komponent
72
+
73
+ ```vue
74
+ <EimzoSignModal
75
+ v-if="show"
76
+ :client="eimzo.client"
77
+ :docs="docs"
78
+ messages="uz-latn"
79
+ :idle-timeout-ms="120000"
80
+ @signed="onSigned"
81
+ @cancelled="onCancelled"
82
+ />
83
+ ```
84
+
85
+ ---
86
+
87
+ ## Xato kodlari (`error.code`)
88
+
89
+ Matnni hech qachon parslamang — `code` bo'yicha shox tanlang.
90
+
91
+ | Kod | Ma'nosi |
92
+ |---|---|
93
+ | `E_NOT_INSTALLED` | E-IMZO dasturi yo'q / javob bermayapti |
94
+ | `E_VERSION_LOW` | Eski E-IMZO versiyasi |
95
+ | `E_API_KEY_REJECTED` | Domen API kaliti noto'g'ri |
96
+ | `E_NO_CERTS` | Sertifikat topilmadi |
97
+ | `E_KEY_LOAD_CANCELLED` | Parol oynasi yopildi |
98
+ | `E_SERIAL_MISMATCH` | Imzolangan sertifikat tanlangandan farq qiladi (**xavfsizlik**) |
99
+ | `E_SIGN_FAILED` | `create_pkcs7` muvaffaqiyatsiz |
100
+ | `E_TIMEOUT` | E-IMZO javob bermadi |
101
+ | `E_CANCELLED` | Foydalanuvchi / idle bekor qildi (`.partial` da imzolanganlar) |
102
+ | `E_TRANSPORT` | Lokal soket xatosi |
103
+ | `E_MISCONFIGURED` | Noto'g'ri sozlash (masalan `apiKeys` yo'q) |
104
+
105
+ ---
106
+
107
+ ## Xavfsizlik
108
+
109
+ - **Serverda tekshirish SHART.** Bu kutubxona client-side PKCS#7 ishlab beradi,
110
+ autentifikatsiya QILMAYDI. Server: imzo zanjiri, OCSP/CRL bekor qilinishi,
111
+ timestamp, va `signer_serial_number` / TIN sessiyadagi foydalanuvchiga
112
+ mosligini tekshirishi kerak.
113
+ - **`apiKeys` kutubxonada emas** — ilova `.env` dan beradi.
114
+ - **WYSIWYS** — `preview` ni to'ldiring; modal xom `content` ni faqat
115
+ matn sifatida ko'rsatadi (`v-html` ishlatilmaydi).
116
+ - **Log yo'q** — kutubxona `console` ga yozmaydi; barcha kuzatuv `onAudit`
117
+ orqali va faqat `serial` / `docId` ni uzatadi (CN / TIN / imzo bloklari emas).
118
+ - **Serial tekshiruvi** — har imzodan keyin avtomatik (`E_SERIAL_MISMATCH`).
119
+ - **Timeout + idle** — har chaqiruv timeoutli; modal harakatsiz tursa
120
+ `idleTimeoutMs` dan keyin bekor bo'ladi.
121
+ - **CSP** — `connect-src ws://127.0.0.1:64646 wss://127.0.0.1:64443`.
122
+ Inline uslub xohlamasangiz `style.css` ni import qiling + `injectStyles:false`.
123
+ - Vendored E-IMZO SDK SHA-256 bilan pinlangan — [`core/src/vendor/VENDOR.md`](../core/src/vendor/VENDOR.md).
124
+
125
+ ---
126
+
127
+ ## API
128
+
129
+ | Eksport | Tavsif |
130
+ |---|---|
131
+ | `createEimzo(options)` | Kontroller + Vue plugin. `{ client, sign, install }` |
132
+ | `useEimzoSign()` | Kompozitsiya API — kontrollerni qaytaradi |
133
+ | `EimzoSignModal` | SFC komponent (deklarativ) |
134
+ | `openSignModal(opts)` | Modalni imperativ ochish (plugin'siz) |
135
+ | `SignFlow` | Framework-agnostik holat mashinasi |
136
+ | `resolveMessages`, `uzLatn`, `uzCyrl`, `ru` | i18n |
137
+ | `injectStyles`, `styleCss` | Uslublar |
138
+
139
+ `eimzo-sign-core` dan qayta eksport: `EimzoClient`, `EimzoError`,
140
+ `certIsExpired`, `certIsUsable`, `certExpiresSoon`, `sortCerts`, `dedupeCerts`.
@@ -0,0 +1,115 @@
1
+ /**
2
+ * E-IMZO imzolash modali (Vue 2.7 / Vue 3, vue-demi orqali).
3
+ *
4
+ * Butun mantiq framework-agnostik `SignFlow` da — bu komponent faqat uni
5
+ * ko'rsatadi va foydalanuvchi harakatlarini uzatadi.
6
+ *
7
+ * Hodisalar:
8
+ * - `signed` ({ results }) — barcha hujjatlar imzolandi;
9
+ * - `cancelled` (EimzoError) — bekor qilindi yoki fatal xato.
10
+ * Ikkalasidan keyin ota-komponent modalni `v-if` bilan yopishi kerak.
11
+ */
12
+ import { type PropType } from 'vue-demi';
13
+ import { EimzoClient, EimzoError, type Cert } from 'eimzo-sign-core';
14
+ import { type SignRequestDoc } from './sign-flow';
15
+ import { type EimzoMessages, type LocaleKey } from './i18n';
16
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
17
+ client: {
18
+ type: PropType<EimzoClient>;
19
+ required: true;
20
+ };
21
+ docs: {
22
+ type: PropType<SignRequestDoc[]>;
23
+ required: true;
24
+ };
25
+ messages: {
26
+ type: PropType<LocaleKey | EimzoMessages>;
27
+ default: string;
28
+ };
29
+ autoInstall: {
30
+ type: BooleanConstructor;
31
+ default: boolean;
32
+ };
33
+ /** Modal shuncha ms harakatsiz tursa — avtomatik bekor qilinadi. 0 — o'chiradi. */
34
+ idleTimeoutMs: {
35
+ type: NumberConstructor;
36
+ default: number;
37
+ };
38
+ theme: {
39
+ type: PropType<"light" | "dark">;
40
+ default: undefined;
41
+ };
42
+ injectStyles: {
43
+ type: BooleanConstructor;
44
+ default: boolean;
45
+ };
46
+ }>, {
47
+ t: import("vue").ComputedRef<EimzoMessages>;
48
+ state: import("vue").ShallowRef<import("./sign-flow").FlowState, import("./sign-flow").FlowState>;
49
+ rootEl: import("vue").ShallowRef<HTMLElement | null, HTMLElement | null>;
50
+ ID_CARD_SERIAL: string;
51
+ multi: import("vue").ComputedRef<boolean>;
52
+ pendingCount: import("vue").ComputedRef<number>;
53
+ failedCount: import("vue").ComputedRef<number>;
54
+ showDocList: import("vue").ComputedRef<boolean>;
55
+ busy: import("vue").ComputedRef<boolean>;
56
+ rawOpen: import("vue").ShallowRef<Record<string, boolean>, Record<string, boolean>>;
57
+ toggleRaw: (id: string) => void;
58
+ onSelect: (serial: string) => void;
59
+ onPrimary: () => undefined;
60
+ onRetryLoad: () => void;
61
+ onCancel: () => void;
62
+ badge: (cert: Cert) => {
63
+ kind: "ok" | "warn" | "danger";
64
+ text: string;
65
+ };
66
+ certUsable: (c: Cert) => boolean;
67
+ errText: (e?: EimzoError) => string;
68
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
69
+ signed: (_payload: {
70
+ results: unknown[];
71
+ }) => true;
72
+ cancelled: (_error: EimzoError) => true;
73
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
74
+ client: {
75
+ type: PropType<EimzoClient>;
76
+ required: true;
77
+ };
78
+ docs: {
79
+ type: PropType<SignRequestDoc[]>;
80
+ required: true;
81
+ };
82
+ messages: {
83
+ type: PropType<LocaleKey | EimzoMessages>;
84
+ default: string;
85
+ };
86
+ autoInstall: {
87
+ type: BooleanConstructor;
88
+ default: boolean;
89
+ };
90
+ /** Modal shuncha ms harakatsiz tursa — avtomatik bekor qilinadi. 0 — o'chiradi. */
91
+ idleTimeoutMs: {
92
+ type: NumberConstructor;
93
+ default: number;
94
+ };
95
+ theme: {
96
+ type: PropType<"light" | "dark">;
97
+ default: undefined;
98
+ };
99
+ injectStyles: {
100
+ type: BooleanConstructor;
101
+ default: boolean;
102
+ };
103
+ }>> & Readonly<{
104
+ onSigned?: ((_payload: {
105
+ results: unknown[];
106
+ }) => any) | undefined;
107
+ onCancelled?: ((_error: EimzoError) => any) | undefined;
108
+ }>, {
109
+ messages: EimzoMessages | "uz-latn" | "uz-cyrl" | "ru";
110
+ autoInstall: boolean;
111
+ idleTimeoutMs: number;
112
+ theme: "light" | "dark";
113
+ injectStyles: boolean;
114
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
115
+ export default _default;
@@ -0,0 +1,50 @@
1
+ import { EimzoClient, type AuditEvent, type EimzoVersion, type SignResult } from 'eimzo-sign-core';
2
+ import { type SignModalResult } from './mount';
3
+ import type { SignRequestDoc } from './sign-flow';
4
+ import type { EimzoMessages, LocaleKey } from './i18n';
5
+ /** `$eimzoSign` ga uzatish mumkin bo'lgan qulay ko'rinishlar. */
6
+ export type SignInput = string | SignRequestDoc | ReadonlyArray<SignRequestDoc>;
7
+ export interface EimzoOptions {
8
+ /** `[[domen, kalit], ...]` — E-IMZO tomonidan beriladi. Kutubxonada default YO'Q. */
9
+ apiKeys: ReadonlyArray<readonly [domain: string, key: string]>;
10
+ timeoutMs?: number;
11
+ keyLoadTimeoutMs?: number;
12
+ minVersion?: EimzoVersion;
13
+ /** Audit hook — kutubxona `console` ga yozmaydi. */
14
+ onAudit?: (event: AuditEvent) => void;
15
+ messages?: LocaleKey | EimzoMessages;
16
+ autoInstall?: boolean;
17
+ idleTimeoutMs?: number;
18
+ theme?: 'light' | 'dark';
19
+ injectStyles?: boolean;
20
+ }
21
+ export interface SignOverrides {
22
+ messages?: LocaleKey | EimzoMessages;
23
+ autoInstall?: boolean;
24
+ idleTimeoutMs?: number;
25
+ theme?: 'light' | 'dark';
26
+ container?: HTMLElement;
27
+ }
28
+ export interface EimzoController {
29
+ /** Quyi darajali yadro (listCerts, install va h.k. kerak bo'lса). */
30
+ readonly client: EimzoClient;
31
+ /** Modalni ochib, hujjat(lar)ni imzolaydi. */
32
+ sign(input: SignInput, overrides?: SignOverrides): Promise<SignModalResult>;
33
+ /** Vue plugin: `app.use(controller)` / `Vue.use(controller)`. */
34
+ install(app: unknown): void;
35
+ }
36
+ /** Plugin ichида yoки `useEimzoSign()` da ishlатилади. */
37
+ export declare function getActiveController(): EimzoController | null;
38
+ /**
39
+ * E-IMZO kontrollerini yaratadi. Vue plugin sifatida ham, oddiy obyekt sifatida
40
+ * ham ishlatiladi.
41
+ *
42
+ * @example
43
+ * const eimzo = createEimzo({ apiKeys: [['example.uz', KEY]], onAudit: log })
44
+ * app.use(eimzo) // ixtiyoriy — $eimzoSign / useEimzoSign uchun
45
+ * const { results } = await eimzo.sign(docs)
46
+ */
47
+ export declare function createEimzo(options: EimzoOptions): EimzoController;
48
+ export declare const EIMZO_INJECTION_KEY: unique symbol;
49
+ /** Natija turi — chaqiruvchida ishlatish uchun re-export. */
50
+ export type { SignModalResult, SignResult };
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ import type { EimzoErrorCode } from 'eimzo-sign-core';
2
+ /**
3
+ * Modaldagi barcha matnlar. Ilova o'z tarjimasini yoki brend leksikasini
4
+ * (`createEimzo({ messages })` orqali) berishi mumkin.
5
+ */
6
+ export interface EimzoMessages {
7
+ title: string;
8
+ loading: string;
9
+ selectCert: string;
10
+ idCard: string;
11
+ noCerts: string;
12
+ badgeExpired: string;
13
+ badgeExpiresSoon: (days: number) => string;
14
+ badgeValidTo: (date: string) => string;
15
+ certOrg: string;
16
+ certTin: string;
17
+ whatYouSign: string;
18
+ showRaw: string;
19
+ hideRaw: string;
20
+ docPending: string;
21
+ docSigning: string;
22
+ docDone: string;
23
+ docFailed: string;
24
+ cancel: string;
25
+ close: string;
26
+ retry: string;
27
+ sign: (count: number) => string;
28
+ signing: string;
29
+ retryFailed: (count: number) => string;
30
+ progress: (done: number, total: number) => string;
31
+ /** Xato kodi -> foydalanuvchiga ko'rsatiladigan matn. */
32
+ errors: Record<EimzoErrorCode, string>;
33
+ }
34
+ export declare const uzLatn: EimzoMessages;
35
+ export declare const uzCyrl: EimzoMessages;
36
+ export declare const ru: EimzoMessages;
37
+ export declare const locales: {
38
+ readonly 'uz-latn': EimzoMessages;
39
+ readonly 'uz-cyrl': EimzoMessages;
40
+ readonly ru: EimzoMessages;
41
+ };
42
+ export type LocaleKey = keyof typeof locales;
43
+ export declare function resolveMessages(locale: LocaleKey | EimzoMessages | undefined): EimzoMessages;
package/dist/index.cjs ADDED
@@ -0,0 +1,291 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("vue-demi"),d=require("eimzo-sign-core"),t=require("vue"),b="IDCARD";class A{constructor(o){this.listeners=new Set,this.ac=new AbortController,this.finished=!1,this.client=o.client,this.autoInstall=o.autoInstall??!0,this.state={status:"loading",certs:[],idCardAvailable:!1,selectedSerial:null,docs:o.docs.map(r=>({id:r.id,title:r.title,content:r.content,preview:r.preview??[],status:"pending"})),progress:{done:0,total:o.docs.length}},this.promise=new Promise((r,s)=>{this.resolveOuter=r,this.rejectOuter=s}),this.load()}getState(){return this.state}subscribe(o){return this.listeners.add(o),()=>this.listeners.delete(o)}setState(o){this.state={...this.state,...o};for(const r of this.listeners)r(this.state)}get selectedCert(){const{selectedSerial:o,certs:r}=this.state;return o?o===b?d.EimzoClient.idCardCert():r.find(s=>s.serialNumber===o)??null:null}get canConfirm(){return(this.state.status==="ready"||this.state.status==="partial")&&this.selectedCert!==null&&this.pendingDocs.length>0}get pendingDocs(){return this.state.docs.filter(o=>o.status!=="done")}async load(){var o;this.setState({status:"loading",fatal:void 0,lastError:void 0});try{this.autoInstall&&await this.client.install();const[r,s]=await Promise.all([this.client.listCerts(),this.client.isIdCardPlugged()]),n=d.sortCerts(d.dedupeCerts(r));if(n.length===0&&!s){this.fail(new d.EimzoError("E_NO_CERTS","Imzolash uchun sertifikat topilmadi."));return}const l=n.find(i=>d.certIsUsable(i));this.setState({status:"ready",certs:n,idCardAvailable:s,selectedSerial:(l==null?void 0:l.serialNumber)??(s?b:((o=n[0])==null?void 0:o.serialNumber)??null)})}catch(r){this.fail(d.toEimzoError(r,"E_NOT_INSTALLED","E-IMZO bilan ulanib bo'lmadi."))}}retryLoad(){this.state.status!=="error"||this.finished||this.load()}selectCert(o){this.state.status!=="ready"&&this.state.status!=="partial"||this.setState({selectedSerial:o,lastError:void 0})}async confirm(){if(!this.canConfirm||this.finished)return;const o=this.selectedCert;if(!o)return;const r=this.pendingDocs;this.patchDocs(r.map(s=>s.id),{status:"pending",error:void 0}),this.setState({status:"signing",lastError:void 0,progress:{done:this.state.docs.length-r.length,total:this.state.docs.length}});try{const s=await this.client.signBatch(o,r.map(l=>({id:l.id,content:l.content})),{signal:this.ac.signal,onProgress:l=>{const i=this.state.docs.length-r.length+l.done;this.setState({progress:{done:i,total:this.state.docs.length}}),l.currentId&&this.patchDocs([l.currentId],{status:"signing"})}});for(const l of s)l.ok?this.patchDocs([l.id],{status:"done",result:{id:l.id,pkcs7_64:l.pkcs7_64,signature_hex:l.signature_hex,signer_serial_number:l.signer_serial_number}}):this.patchDocs([l.id],{status:"failed",error:l.error});const n=this.state.docs.filter(l=>l.status==="failed");n.length===0?this.succeed():this.setState({status:"partial",lastError:new d.EimzoError("E_SIGN_FAILED",`${n.length} ta hujjat imzolanmadi.`)})}catch(s){if(d.EimzoError.is(s,"E_CANCELLED")){this.cancelledByAbort();return}this.patchDocs(r.map(n=>n.id),{status:"pending"}),this.setState({status:this.state.docs.some(n=>n.status==="done")?"partial":"ready",lastError:d.toEimzoError(s,"E_SIGN_FAILED","Imzolab bo'lmadi.")})}}cancel(){if(!this.finished){if(this.state.status==="signing"){this.ac.abort();return}if(this.state.status==="error"&&this.state.fatal){const o=this.state.fatal;this.finish(()=>this.rejectOuter(o));return}this.finish(()=>this.rejectOuter(this.cancelError()))}}succeed(){const o=this.state.docs.map(r=>r.result).filter(r=>!!r);this.finish(()=>this.resolveOuter({results:o}))}cancelledByAbort(){this.patchDocs(this.state.docs.filter(o=>o.status==="signing").map(o=>o.id),{status:"pending"}),this.finish(()=>this.rejectOuter(this.cancelError()))}fail(o){this.setState({status:"error",fatal:o})}cancelError(){const o=this.state.docs.map(s=>s.result).filter(s=>!!s),r=new d.EimzoError("E_CANCELLED","Imzolash bekor qilindi.");return r.partial=o,r}finish(o){this.finished||(this.finished=!0,o())}patchDocs(o,r){const s=new Set(o);this.setState({docs:this.state.docs.map(n=>s.has(n.id)?{...n,...r}:n)})}}const ee={E_NOT_INSTALLED:"E-IMZO dasturi topilmadi. Uni ishga tushiring va sahifani yangilang.",E_VERSION_LOW:"E-IMZO dasturining eski versiyasi. Iltimos, yangilang.",E_API_KEY_REJECTED:"Imzolash xizmati sozlamasida xatolik (API kaliti).",E_NO_CERTS:"Imzolash uchun sertifikat topilmadi.",E_KEY_LOAD_CANCELLED:"Kalit tanlanmadi yoki parol kiritilmadi.",E_SERIAL_MISMATCH:"Imzolangan sertifikat tanlangandan farq qiladi. Qaytadan urinib ko'ring.",E_SIGN_FAILED:"Hujjatni imzolab bo'lmadi.",E_TIMEOUT:"E-IMZO javob bermadi. Qaytadan urinib ko'ring.",E_CANCELLED:"Imzolash bekor qilindi.",E_TRANSPORT:"E-IMZO bilan aloqa uzildi.",E_MISCONFIGURED:"Imzolash noto'g'ri sozlangan."},z={title:"Elektron imzo",loading:"Kalitlar yuklanmoqda…",selectCert:"Imzolovchi sertifikatni tanlang",idCard:"ID-karta",noCerts:"Sertifikat topilmadi. E-IMZO dasturi ochiqligini tekshiring.",badgeExpired:"Muddati o'tgan",badgeExpiresSoon:e=>`${e} kunda tugaydi`,badgeValidTo:e=>`${e} gacha`,certOrg:"Tashkilot",certTin:"STIR / JSHSHIR",whatYouSign:"Siz quyidagi hujjat(lar)ni imzolayapsiz:",showRaw:"To'liq tarkibni ko'rsatish",hideRaw:"Yashirish",docPending:"Kutilmoqda",docSigning:"Imzolanmoqda…",docDone:"Imzolandi",docFailed:"Xatolik",cancel:"Bekor qilish",close:"Yopish",retry:"Qayta urinish",sign:e=>e>1?`Imzolash (${e})`:"Imzolash",signing:"Imzolanmoqda…",retryFailed:e=>`Xatoliklarni qayta imzolash (${e})`,progress:(e,o)=>`${e} / ${o} imzolandi`,errors:ee},x={title:"Электрон имзо",loading:"Калитлар юкланмоқда…",selectCert:"Имзоловчи сертификатни танланг",idCard:"ID-карта",noCerts:"Сертификат топилмади. E-IMZO дастури очиқлигини текширинг.",badgeExpired:"Муддати ўтган",badgeExpiresSoon:e=>`${e} кунда тугайди`,badgeValidTo:e=>`${e} гача`,certOrg:"Ташкилот",certTin:"СТИР / ЖШШИР",whatYouSign:"Сиз қуйидаги ҳужжат(лар)ни имзолаяпсиз:",showRaw:"Тўлиқ таркибни кўрсатиш",hideRaw:"Яшириш",docPending:"Кутилмоқда",docSigning:"Имзоланмоқда…",docDone:"Имзоланди",docFailed:"Хатолик",cancel:"Бекор қилиш",close:"Ёпиш",retry:"Қайта уриниш",sign:e=>e>1?`Имзолаш (${e})`:"Имзолаш",signing:"Имзоланмоқда…",retryFailed:e=>`Хатоликларни қайта имзолаш (${e})`,progress:(e,o)=>`${e} / ${o} имзоланди`,errors:{E_NOT_INSTALLED:"E-IMZO дастури топилмади. Уни ишга туширинг ва саҳифани янгиланг.",E_VERSION_LOW:"E-IMZO дастурининг эски версияси. Илтимос, янгиланг.",E_API_KEY_REJECTED:"Имзолаш хизмати созламасида хатолик (API калити).",E_NO_CERTS:"Имзолаш учун сертификат топилмади.",E_KEY_LOAD_CANCELLED:"Калит танланмади ёки парол киритилмади.",E_SERIAL_MISMATCH:"Имзоланган сертификат танлангандан фарқ қилади. Қайтадан уриниб кўринг.",E_SIGN_FAILED:"Ҳужжатни имзолаб бўлмади.",E_TIMEOUT:"E-IMZO жавоб бермади. Қайтадан уриниб кўринг.",E_CANCELLED:"Имзолаш бекор қилинди.",E_TRANSPORT:"E-IMZO билан алоқа узилди.",E_MISCONFIGURED:"Имзолаш нотўғри созланган."}},M={title:"Электронная подпись",loading:"Загрузка ключей…",selectCert:"Выберите сертификат для подписи",idCard:"ID-карта",noCerts:"Сертификаты не найдены. Проверьте, запущено ли приложение E-IMZO.",badgeExpired:"Истёк",badgeExpiresSoon:e=>`истекает через ${e} дн.`,badgeValidTo:e=>`до ${e}`,certOrg:"Организация",certTin:"ИНН / ПИНФЛ",whatYouSign:"Вы подписываете следующие документы:",showRaw:"Показать полное содержимое",hideRaw:"Скрыть",docPending:"Ожидание",docSigning:"Подписывается…",docDone:"Подписано",docFailed:"Ошибка",cancel:"Отмена",close:"Закрыть",retry:"Повторить",sign:e=>e>1?`Подписать (${e})`:"Подписать",signing:"Подписывается…",retryFailed:e=>`Повторить неудавшиеся (${e})`,progress:(e,o)=>`${e} / ${o} подписано`,errors:{E_NOT_INSTALLED:"Приложение E-IMZO не найдено. Запустите его и обновите страницу.",E_VERSION_LOW:"Устаревшая версия E-IMZO. Пожалуйста, обновите.",E_API_KEY_REJECTED:"Ошибка конфигурации сервиса подписи (API-ключ).",E_NO_CERTS:"Сертификаты для подписи не найдены.",E_KEY_LOAD_CANCELLED:"Ключ не выбран или пароль не введён.",E_SERIAL_MISMATCH:"Подписанный сертификат отличается от выбранного. Попробуйте снова.",E_SIGN_FAILED:"Не удалось подписать документ.",E_TIMEOUT:"E-IMZO не ответил. Попробуйте снова.",E_CANCELLED:"Подписание отменено.",E_TRANSPORT:"Связь с E-IMZO прервана.",E_MISCONFIGURED:"Подписание настроено неверно."}},V={"uz-latn":z,"uz-cyrl":x,ru:M};function R(e){return e?typeof e=="string"?V[e]??z:e:z}const C="eimzo-sign-vue-styles",j=`
2
+ .eimzo-modal-root {
3
+ --eimzo-primary: #0057ff;
4
+ --eimzo-primary-contrast: #fff;
5
+ --eimzo-danger: #c0392b;
6
+ --eimzo-ok: #1e7e34;
7
+ --eimzo-bg: #fff;
8
+ --eimzo-fg: #1a1a1a;
9
+ --eimzo-muted: #6b7280;
10
+ --eimzo-border: #e2e5e9;
11
+ --eimzo-overlay: rgba(17, 24, 39, 0.55);
12
+ --eimzo-radius: 10px;
13
+ --eimzo-shadow: 0 10px 40px rgba(0, 0, 0, 0.25);
14
+ --eimzo-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
15
+ }
16
+ @media (prefers-color-scheme: dark) {
17
+ .eimzo-modal-root:not([data-theme="light"]) {
18
+ --eimzo-bg: #1f2430;
19
+ --eimzo-fg: #f3f4f6;
20
+ --eimzo-muted: #9aa4b2;
21
+ --eimzo-border: #333b4d;
22
+ --eimzo-overlay: rgba(0, 0, 0, 0.65);
23
+ }
24
+ }
25
+
26
+ .eimzo-overlay {
27
+ position: fixed;
28
+ inset: 0;
29
+ z-index: 2147483000;
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ padding: 16px;
34
+ background: var(--eimzo-overlay);
35
+ font-family: var(--eimzo-font);
36
+ color: var(--eimzo-fg);
37
+ }
38
+ .eimzo-modal {
39
+ width: 100%;
40
+ max-width: 480px;
41
+ max-height: calc(100vh - 32px);
42
+ display: flex;
43
+ flex-direction: column;
44
+ background: var(--eimzo-bg);
45
+ border-radius: var(--eimzo-radius);
46
+ box-shadow: var(--eimzo-shadow);
47
+ overflow: hidden;
48
+ }
49
+ .eimzo-head,
50
+ .eimzo-foot {
51
+ display: flex;
52
+ align-items: center;
53
+ gap: 8px;
54
+ padding: 14px 18px;
55
+ }
56
+ .eimzo-head {
57
+ justify-content: space-between;
58
+ border-bottom: 1px solid var(--eimzo-border);
59
+ }
60
+ .eimzo-title {
61
+ margin: 0;
62
+ font-size: 16px;
63
+ font-weight: 600;
64
+ }
65
+ .eimzo-x {
66
+ border: 0;
67
+ background: transparent;
68
+ font-size: 22px;
69
+ line-height: 1;
70
+ cursor: pointer;
71
+ color: var(--eimzo-muted);
72
+ padding: 4px 8px;
73
+ }
74
+ .eimzo-x:disabled {
75
+ opacity: 0.4;
76
+ cursor: not-allowed;
77
+ }
78
+ .eimzo-body {
79
+ padding: 16px 18px;
80
+ overflow-y: auto;
81
+ }
82
+ .eimzo-foot {
83
+ justify-content: flex-end;
84
+ border-top: 1px solid var(--eimzo-border);
85
+ }
86
+
87
+ .eimzo-section-label {
88
+ font-size: 12px;
89
+ font-weight: 600;
90
+ text-transform: uppercase;
91
+ letter-spacing: 0.04em;
92
+ color: var(--eimzo-muted);
93
+ margin: 0 0 8px;
94
+ }
95
+
96
+ .eimzo-cert-list {
97
+ list-style: none;
98
+ margin: 0 0 16px;
99
+ padding: 0;
100
+ display: flex;
101
+ flex-direction: column;
102
+ gap: 8px;
103
+ }
104
+ .eimzo-cert {
105
+ display: flex;
106
+ gap: 10px;
107
+ align-items: flex-start;
108
+ padding: 10px 12px;
109
+ border: 1px solid var(--eimzo-border);
110
+ border-radius: 8px;
111
+ cursor: pointer;
112
+ }
113
+ .eimzo-cert:hover {
114
+ border-color: var(--eimzo-primary);
115
+ }
116
+ .eimzo-cert.is-selected {
117
+ border-color: var(--eimzo-primary);
118
+ box-shadow: inset 0 0 0 1px var(--eimzo-primary);
119
+ }
120
+ .eimzo-cert.is-disabled {
121
+ opacity: 0.55;
122
+ cursor: not-allowed;
123
+ }
124
+ .eimzo-cert input {
125
+ margin-top: 3px;
126
+ }
127
+ .eimzo-cert-main {
128
+ flex: 1;
129
+ min-width: 0;
130
+ }
131
+ .eimzo-cert-cn {
132
+ font-weight: 600;
133
+ font-size: 14px;
134
+ word-break: break-word;
135
+ }
136
+ .eimzo-cert-meta {
137
+ font-size: 12px;
138
+ color: var(--eimzo-muted);
139
+ margin-top: 2px;
140
+ }
141
+ .eimzo-badge {
142
+ display: inline-block;
143
+ font-size: 11px;
144
+ font-weight: 600;
145
+ padding: 1px 7px;
146
+ border-radius: 999px;
147
+ margin-top: 6px;
148
+ }
149
+ .eimzo-badge.ok {
150
+ background: rgba(30, 126, 52, 0.12);
151
+ color: var(--eimzo-ok);
152
+ }
153
+ .eimzo-badge.warn {
154
+ background: rgba(191, 149, 10, 0.15);
155
+ color: #8a6d0b;
156
+ }
157
+ .eimzo-badge.danger {
158
+ background: rgba(192, 57, 43, 0.12);
159
+ color: var(--eimzo-danger);
160
+ }
161
+
162
+ .eimzo-docs {
163
+ list-style: none;
164
+ margin: 0 0 8px;
165
+ padding: 0;
166
+ display: flex;
167
+ flex-direction: column;
168
+ gap: 6px;
169
+ }
170
+ .eimzo-doc {
171
+ border: 1px solid var(--eimzo-border);
172
+ border-radius: 8px;
173
+ padding: 10px 12px;
174
+ }
175
+ .eimzo-doc-head {
176
+ display: flex;
177
+ justify-content: space-between;
178
+ gap: 8px;
179
+ align-items: baseline;
180
+ }
181
+ .eimzo-doc-title {
182
+ font-weight: 600;
183
+ font-size: 14px;
184
+ }
185
+ .eimzo-doc-status {
186
+ font-size: 12px;
187
+ white-space: nowrap;
188
+ }
189
+ .eimzo-doc.is-done .eimzo-doc-status {
190
+ color: var(--eimzo-ok);
191
+ }
192
+ .eimzo-doc.is-failed .eimzo-doc-status {
193
+ color: var(--eimzo-danger);
194
+ }
195
+ .eimzo-preview {
196
+ margin: 8px 0 0;
197
+ border-collapse: collapse;
198
+ width: 100%;
199
+ font-size: 13px;
200
+ }
201
+ .eimzo-preview th {
202
+ text-align: left;
203
+ font-weight: 500;
204
+ color: var(--eimzo-muted);
205
+ padding: 2px 10px 2px 0;
206
+ vertical-align: top;
207
+ white-space: nowrap;
208
+ }
209
+ .eimzo-preview td {
210
+ padding: 2px 0;
211
+ word-break: break-word;
212
+ }
213
+ .eimzo-raw {
214
+ margin-top: 8px;
215
+ font-size: 12px;
216
+ }
217
+ .eimzo-raw pre {
218
+ margin: 6px 0 0;
219
+ padding: 8px;
220
+ background: rgba(127, 127, 127, 0.1);
221
+ border-radius: 6px;
222
+ max-height: 180px;
223
+ overflow: auto;
224
+ white-space: pre-wrap;
225
+ word-break: break-word;
226
+ }
227
+ .eimzo-link {
228
+ background: none;
229
+ border: 0;
230
+ color: var(--eimzo-primary);
231
+ cursor: pointer;
232
+ padding: 0;
233
+ font-size: 12px;
234
+ text-decoration: underline;
235
+ }
236
+
237
+ .eimzo-progress {
238
+ font-size: 13px;
239
+ color: var(--eimzo-muted);
240
+ margin: 8px 0 0;
241
+ }
242
+ .eimzo-alert {
243
+ margin: 0 0 12px;
244
+ padding: 10px 12px;
245
+ border-radius: 8px;
246
+ font-size: 13px;
247
+ background: rgba(192, 57, 43, 0.1);
248
+ color: var(--eimzo-danger);
249
+ }
250
+ .eimzo-alert.info {
251
+ background: rgba(0, 87, 255, 0.08);
252
+ color: var(--eimzo-primary);
253
+ }
254
+
255
+ .eimzo-btn {
256
+ border: 1px solid var(--eimzo-border);
257
+ background: var(--eimzo-bg);
258
+ color: var(--eimzo-fg);
259
+ border-radius: 8px;
260
+ padding: 8px 16px;
261
+ font-size: 14px;
262
+ font-weight: 500;
263
+ cursor: pointer;
264
+ }
265
+ .eimzo-btn:disabled {
266
+ opacity: 0.5;
267
+ cursor: not-allowed;
268
+ }
269
+ .eimzo-btn.primary {
270
+ background: var(--eimzo-primary);
271
+ border-color: var(--eimzo-primary);
272
+ color: var(--eimzo-primary-contrast);
273
+ }
274
+ .eimzo-spin {
275
+ display: inline-block;
276
+ width: 14px;
277
+ height: 14px;
278
+ margin-right: 6px;
279
+ border: 2px solid currentColor;
280
+ border-right-color: transparent;
281
+ border-radius: 50%;
282
+ vertical-align: -2px;
283
+ animation: eimzo-spin 0.7s linear infinite;
284
+ }
285
+ @keyframes eimzo-spin {
286
+ to { transform: rotate(360deg); }
287
+ }
288
+ @media (prefers-reduced-motion: reduce) {
289
+ .eimzo-spin { animation-duration: 2s; }
290
+ }
291
+ `;let I=!1;function F(){if(I||typeof document>"u")return;if(document.getElementById(C)){I=!0;return}const e=document.createElement("style");e.id=C,e.textContent=j,document.head.appendChild(e),I=!0}const te=c.defineComponent({name:"EimzoSignModal",props:{client:{type:Object,required:!0},docs:{type:Array,required:!0},messages:{type:[String,Object],default:"uz-latn"},autoInstall:{type:Boolean,default:!0},idleTimeoutMs:{type:Number,default:12e4},theme:{type:String,default:void 0},injectStyles:{type:Boolean,default:!0}},emits:{signed:e=>!0,cancelled:e=>!0},setup(e,{emit:o}){e.injectStyles&&F();const r=c.computed(()=>R(e.messages)),s=new A({client:e.client,docs:e.docs,autoInstall:e.autoInstall}),n=c.shallowRef(s.getState()),l=s.subscribe(a=>{n.value=a});s.promise.then(a=>o("signed",a),a=>o("cancelled",a));const i=c.computed(()=>e.docs.length>1),u=c.computed(()=>n.value.docs.filter(a=>a.status!=="done").length),p=c.computed(()=>n.value.docs.filter(a=>a.status==="failed").length),h=c.computed(()=>i.value&&(n.value.status==="signing"||n.value.status==="partial")),m=c.computed(()=>n.value.status==="signing"),k=a=>s.selectCert(a),q=()=>void s.confirm(),Y=()=>s.retryLoad(),Z=()=>s.cancel(),E=c.shallowRef({}),K=a=>{E.value={...E.value,[a]:!E.value[a]}};function U(a){if(d.certIsExpired(a))return{kind:"danger",text:r.value.badgeExpired};if(d.certExpiresSoon(a)){const g=Math.max(1,Math.ceil((a.validTo.getTime()-Date.now())/864e5));return{kind:"warn",text:r.value.badgeExpiresSoon(g)}}return{kind:"ok",text:r.value.badgeValidTo(G(a.validTo))}}const G=a=>{try{return a.toLocaleDateString()}catch{return a.toISOString().slice(0,10)}},H=a=>d.certIsUsable(a),J=a=>a?r.value.errors[a.code]??a.message:"",S=c.shallowRef(null);let v,_="";const f=()=>{e.idleTimeoutMs&&(clearTimeout(v),v=setTimeout(()=>s.cancel(),e.idleTimeoutMs))},T=a=>{f(),a.key==="Escape"&&!m.value&&(a.preventDefault(),s.cancel()),a.key==="Tab"&&Q(a)},Q=a=>{const g=S.value;if(!g)return;const W=g.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),y=Array.from(W).filter(X=>!X.hasAttribute("disabled"));if(y.length===0)return;const O=y[0],B=y[y.length-1],L=g.ownerDocument.activeElement;a.shiftKey&&L===O?(a.preventDefault(),B.focus()):!a.shiftKey&&L===B&&(a.preventDefault(),O.focus())};return c.onMounted(()=>{_=document.body.style.overflow,document.body.style.overflow="hidden",document.addEventListener("keydown",T,!0),["mousemove","pointerdown","wheel"].forEach(a=>document.addEventListener(a,f,{passive:!0})),f(),requestAnimationFrame(()=>{var a,g;(g=(a=S.value)==null?void 0:a.querySelector("button, input:not([disabled])"))==null||g.focus()})}),c.onBeforeUnmount(()=>{l(),clearTimeout(v),document.body.style.overflow=_,document.removeEventListener("keydown",T,!0),["mousemove","pointerdown","wheel"].forEach(a=>document.removeEventListener(a,f)),s.cancel()}),{t:r,state:n,rootEl:S,ID_CARD_SERIAL:b,multi:i,pendingCount:u,failedCount:p,showDocList:h,busy:m,rawOpen:E,toggleRaw:K,onSelect:k,onPrimary:q,onRetryLoad:Y,onCancel:Z,badge:U,certUsable:H,errText:J}}}),oe=(e,o)=>{const r=e.__vccOpts||e;for(const[s,n]of o)r[s]=n;return r},ie=["data-theme"],re={class:"eimzo-modal",role:"dialog","aria-modal":"true","aria-labelledby":"eimzo-title"},ae={class:"eimzo-head"},se={id:"eimzo-title",class:"eimzo-title"},ne=["aria-label","disabled"],le={class:"eimzo-body"},de={key:0},ce={key:1,class:"eimzo-alert",role:"alert"},me={class:"eimzo-section-label"},ue={class:"eimzo-docs"},pe={class:"eimzo-doc-head"},ge={class:"eimzo-doc-title"},he={class:"eimzo-doc-status"},Ee={class:"eimzo-progress"},fe={class:"eimzo-section-label"},ye={class:"eimzo-cert-list"},be={style:{display:"flex",gap:"10px",width:"100%"}},ze=["value","checked","disabled","onChange"],ke={class:"eimzo-cert-main"},Se={class:"eimzo-cert-cn"},ve={key:0,class:"eimzo-cert-meta"},Ie={key:1,class:"eimzo-cert-meta"},Ce={style:{display:"flex",gap:"10px",width:"100%"}},we=["value","checked","disabled"],De={class:"eimzo-cert-main"},Ne={class:"eimzo-cert-cn"},_e={class:"eimzo-section-label"},Te={class:"eimzo-docs"},Oe={class:"eimzo-doc-head"},Be={class:"eimzo-doc-title"},Le={key:0,class:"eimzo-preview"},Ae={class:"eimzo-raw"},xe=["onClick"],Me={key:0},Ve={class:"eimzo-foot"},Re=["disabled"],je=["disabled"],Fe={key:0,class:"eimzo-spin","aria-hidden":"true"};function Pe(e,o,r,s,n,l){return t.openBlock(),t.createElementBlock("div",{ref:"rootEl",class:"eimzo-modal-root eimzo-overlay","data-theme":e.theme,onMousedown:o[5]||(o[5]=t.withModifiers(i=>!e.busy&&e.onCancel(),["self"]))},[t.createElementVNode("div",re,[t.createElementVNode("div",ae,[t.createElementVNode("h2",se,t.toDisplayString(e.t.title),1),t.createElementVNode("button",{class:"eimzo-x",type:"button","aria-label":e.t.close,disabled:e.busy,onClick:o[0]||(o[0]=(...i)=>e.onCancel&&e.onCancel(...i))}," × ",8,ne)]),t.createElementVNode("div",le,[e.state.status==="loading"?(t.openBlock(),t.createElementBlock("p",de,[o[6]||(o[6]=t.createElementVNode("span",{class:"eimzo-spin","aria-hidden":"true"},null,-1)),t.createTextVNode(t.toDisplayString(e.t.loading),1)])):e.state.status==="error"?(t.openBlock(),t.createElementBlock("div",ce,t.toDisplayString(e.errText(e.state.fatal)),1)):(t.openBlock(),t.createElementBlock(t.Fragment,{key:2},[e.state.lastError?(t.openBlock(),t.createElementBlock("div",{key:0,class:t.normalizeClass(["eimzo-alert",{info:e.state.lastError.code==="E_KEY_LOAD_CANCELLED"}]),role:"alert"},t.toDisplayString(e.errText(e.state.lastError)),3)):t.createCommentVNode("",!0),e.showDocList?(t.openBlock(),t.createElementBlock(t.Fragment,{key:1},[t.createElementVNode("p",me,t.toDisplayString(e.t.whatYouSign),1),t.createElementVNode("ul",ue,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.state.docs,i=>(t.openBlock(),t.createElementBlock("li",{key:i.id,class:t.normalizeClass(["eimzo-doc",{"is-done":i.status==="done","is-failed":i.status==="failed"}])},[t.createElementVNode("div",pe,[t.createElementVNode("span",ge,t.toDisplayString(i.title),1),t.createElementVNode("span",he,[i.status==="done"?(t.openBlock(),t.createElementBlock(t.Fragment,{key:0},[t.createTextVNode("✓ "+t.toDisplayString(e.t.docDone),1)],64)):i.status==="signing"?(t.openBlock(),t.createElementBlock(t.Fragment,{key:1},[t.createTextVNode(t.toDisplayString(e.t.docSigning),1)],64)):i.status==="failed"?(t.openBlock(),t.createElementBlock(t.Fragment,{key:2},[t.createTextVNode(" ✕ "+t.toDisplayString(e.errText(i.error)),1)],64)):(t.openBlock(),t.createElementBlock(t.Fragment,{key:3},[t.createTextVNode(t.toDisplayString(e.t.docPending),1)],64))])])],2))),128))]),t.createElementVNode("p",Ee,t.toDisplayString(e.t.progress(e.state.progress.done,e.state.progress.total)),1)],64)):(t.openBlock(),t.createElementBlock(t.Fragment,{key:2},[t.createElementVNode("p",fe,t.toDisplayString(e.t.selectCert),1),t.createElementVNode("ul",ye,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.state.certs,i=>(t.openBlock(),t.createElementBlock("li",{key:i.serialNumber,class:t.normalizeClass(["eimzo-cert",{"is-selected":e.state.selectedSerial===i.serialNumber,"is-disabled":!e.certUsable(i)||e.busy}])},[t.createElementVNode("label",be,[t.createElementVNode("input",{type:"radio",name:"eimzo-cert",value:i.serialNumber,checked:e.state.selectedSerial===i.serialNumber,disabled:!e.certUsable(i)||e.busy,onChange:u=>e.onSelect(i.serialNumber)},null,40,ze),t.createElementVNode("span",ke,[t.createElementVNode("span",Se,t.toDisplayString(i.CN),1),i.O?(t.openBlock(),t.createElementBlock("span",ve,t.toDisplayString(e.t.certOrg)+": "+t.toDisplayString(i.O),1)):t.createCommentVNode("",!0),i.TIN?(t.openBlock(),t.createElementBlock("span",Ie,t.toDisplayString(e.t.certTin)+": "+t.toDisplayString(i.TIN),1)):t.createCommentVNode("",!0),t.createElementVNode("span",{class:t.normalizeClass(["eimzo-badge",e.badge(i).kind])},t.toDisplayString(e.badge(i).text),3)])])],2))),128)),e.state.idCardAvailable?(t.openBlock(),t.createElementBlock("li",{key:0,class:t.normalizeClass(["eimzo-cert",{"is-selected":e.state.selectedSerial===e.ID_CARD_SERIAL,"is-disabled":e.busy}])},[t.createElementVNode("label",Ce,[t.createElementVNode("input",{type:"radio",name:"eimzo-cert",value:e.ID_CARD_SERIAL,checked:e.state.selectedSerial===e.ID_CARD_SERIAL,disabled:e.busy,onChange:o[1]||(o[1]=i=>e.onSelect(e.ID_CARD_SERIAL))},null,40,we),t.createElementVNode("span",De,[t.createElementVNode("span",Ne,t.toDisplayString(e.t.idCard),1)])])],2)):t.createCommentVNode("",!0)]),t.createElementVNode("p",_e,t.toDisplayString(e.t.whatYouSign),1),t.createElementVNode("ul",Te,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.state.docs,i=>(t.openBlock(),t.createElementBlock("li",{key:i.id,class:"eimzo-doc"},[t.createElementVNode("div",Oe,[t.createElementVNode("span",Be,t.toDisplayString(i.title),1)]),i.preview.length?(t.openBlock(),t.createElementBlock("table",Le,[t.createElementVNode("tbody",null,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(i.preview,(u,p)=>(t.openBlock(),t.createElementBlock("tr",{key:p},[t.createElementVNode("th",null,t.toDisplayString(u.label),1),t.createElementVNode("td",null,t.toDisplayString(u.value),1)]))),128))])])):t.createCommentVNode("",!0),t.createElementVNode("div",Ae,[t.createElementVNode("button",{type:"button",class:"eimzo-link",onClick:u=>e.toggleRaw(i.id)},t.toDisplayString(e.rawOpen[i.id]?e.t.hideRaw:e.t.showRaw),9,xe),e.rawOpen[i.id]?(t.openBlock(),t.createElementBlock("pre",Me,t.toDisplayString(i.content),1)):t.createCommentVNode("",!0)])]))),128))])],64))],64))]),t.createElementVNode("div",Ve,[t.createElementVNode("button",{type:"button",class:"eimzo-btn",disabled:e.busy,onClick:o[2]||(o[2]=(...i)=>e.onCancel&&e.onCancel(...i))},t.toDisplayString(e.state.status==="error"?e.t.close:e.t.cancel),9,Re),e.state.status==="error"?(t.openBlock(),t.createElementBlock("button",{key:0,type:"button",class:"eimzo-btn primary",onClick:o[3]||(o[3]=(...i)=>e.onRetryLoad&&e.onRetryLoad(...i))},t.toDisplayString(e.t.retry),1)):(t.openBlock(),t.createElementBlock("button",{key:1,type:"button",class:"eimzo-btn primary",disabled:e.busy||e.state.status==="loading"||e.pendingCount===0,onClick:o[4]||(o[4]=(...i)=>e.onPrimary&&e.onPrimary(...i))},[e.busy?(t.openBlock(),t.createElementBlock("span",Fe)):t.createCommentVNode("",!0),e.busy?(t.openBlock(),t.createElementBlock(t.Fragment,{key:1},[t.createTextVNode(t.toDisplayString(e.t.signing),1)],64)):e.state.status==="partial"?(t.openBlock(),t.createElementBlock(t.Fragment,{key:2},[t.createTextVNode(t.toDisplayString(e.t.retryFailed(e.failedCount)),1)],64)):(t.openBlock(),t.createElementBlock(t.Fragment,{key:3},[t.createTextVNode(t.toDisplayString(e.t.sign(e.pendingCount)),1)],64))],8,je))])])],40,ie)}const w=oe(te,[["render",Pe]]);function P(e){if(typeof document>"u")return Promise.reject(new Error("openSignModal faqat brauzer muhitida ishlaydi"));const o=document.createElement("div");o.setAttribute("data-eimzo-sign-modal",""),(e.container??document.body).appendChild(o);const r={client:e.client,docs:e.docs,messages:e.messages??"uz-latn",autoInstall:e.autoInstall??!0,idleTimeoutMs:e.idleTimeoutMs??12e4,theme:e.theme,injectStyles:e.injectStyles??!0};return new Promise((s,n)=>{let l=()=>{},i=!1;const u=m=>{i||(i=!0,l(),o.remove(),m())},p=m=>u(()=>s(m)),h=m=>u(()=>n(m));if(c.isVue2&&c.Vue2){const m=new c.Vue2({render:k=>k(w,{props:r,on:{signed:p,cancelled:h}})});m.$mount(o),l=()=>m.$destroy()}else{const m=c.createApp(w,{...r,onSigned:p,onCancelled:h});m.mount(o),l=()=>m.unmount()}})}let D=null;function $(){return D}function $e(e){if(typeof e=="string")return[{id:"doc-1",title:"Hujjat",content:e}];if(Array.isArray(e))return e.map((r,s)=>({...r,id:r.id||`doc-${s+1}`}));const o=e;return[{...o,id:o.id||"doc-1"}]}function qe(e){const o=new d.EimzoClient({apiKeys:e.apiKeys,...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},...e.keyLoadTimeoutMs!==void 0?{keyLoadTimeoutMs:e.keyLoadTimeoutMs}:{},...e.minVersion?{minVersion:e.minVersion}:{},...e.onAudit?{onAudit:e.onAudit}:{}}),r={messages:e.messages??"uz-latn",autoInstall:e.autoInstall??!0,idleTimeoutMs:e.idleTimeoutMs??12e4,theme:e.theme,injectStyles:e.injectStyles??!0},s=(l,i={})=>P({client:o,docs:$e(l),messages:i.messages??r.messages,autoInstall:i.autoInstall??r.autoInstall,idleTimeoutMs:i.idleTimeoutMs??r.idleTimeoutMs,theme:i.theme??r.theme,injectStyles:r.injectStyles,...i.container?{container:i.container}:{}}),n={client:o,sign:s,install(l){var u,p;D=n;const i=l;if((u=i.config)!=null&&u.globalProperties){i.config.globalProperties.$eimzoSign=s,(p=i.provide)==null||p.call(i,N,n);return}i.prototype&&(i.prototype.$eimzoSign=s)}};return D=n,n}const N=Symbol("eimzo-sign-controller");function Ye(){const o=c.inject(N,null)??$();if(!o)throw new Error("[eimzo-sign] createEimzo(...) chaqirilmagan yoki app.use(...) qilinmagan.");return o}Object.defineProperty(exports,"EimzoClient",{enumerable:!0,get:()=>d.EimzoClient});Object.defineProperty(exports,"EimzoError",{enumerable:!0,get:()=>d.EimzoError});Object.defineProperty(exports,"certExpiresSoon",{enumerable:!0,get:()=>d.certExpiresSoon});Object.defineProperty(exports,"certIsExpired",{enumerable:!0,get:()=>d.certIsExpired});Object.defineProperty(exports,"certIsUsable",{enumerable:!0,get:()=>d.certIsUsable});Object.defineProperty(exports,"dedupeCerts",{enumerable:!0,get:()=>d.dedupeCerts});Object.defineProperty(exports,"sortCerts",{enumerable:!0,get:()=>d.sortCerts});exports.EIMZO_INJECTION_KEY=N;exports.EimzoSignModal=w;exports.ID_CARD_SERIAL=b;exports.STYLE_ID=C;exports.SignFlow=A;exports.createEimzo=qe;exports.getActiveController=$;exports.injectStyles=F;exports.locales=V;exports.openSignModal=P;exports.resolveMessages=R;exports.ru=M;exports.styleCss=j;exports.useEimzoSign=Ye;exports.uzCyrl=x;exports.uzLatn=z;