diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/doculan-tutorials.iml b/.idea/doculan-tutorials.iml new file mode 100644 index 0000000..d8b3f6c --- /dev/null +++ b/.idea/doculan-tutorials.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1d3ce46 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e571363 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..8306744 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/docs/API-Documentation/E-Sign.md b/docs/API-Documentation/E-Sign.md new file mode 100644 index 0000000..0463784 --- /dev/null +++ b/docs/API-Documentation/E-Sign.md @@ -0,0 +1,1275 @@ +## Files Operation APIs + +The Files Operation **APIs allow you to retrieve individual files or list all available files** associated with your account or documents. + + +**Base URL:** +https://api.doculan.ai + + +--- + +## 🔹 1 Get Document + +Retrieve a specific file using its document ID. +Optionally, you can return the actual PDF file or just the file metadata. + +### **Endpoint** + +```` +GET api/v1/documents/ +```` + +### **Headers** + +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + + + + +### **Path Parameters** +| Name | Type | Required | Description | +|-----|------|----------|-------------| +| `document_id` | string | ✅ Yes | Unique identifier of the document | + + + + +### **Request Body** +> _Not required_ + +### **Response Body Example** + +```` +json + +{ + "document_id": "682c5804-f860-4p08-802f-d5538j5aabd8", + "file_path": "example.com/files/dev/OnePageContract.pdf", + "metadata_path": "example.com/metadata/682c5804.json", + "fileName": "OnePageContract.pdf", + "size": 35599, + "last_modified": "2025-12-26T16:19:53.484243+00:00", + "created_by": { + "name": "Jane Smith", + "email": "jane.smith@example.com" + } +} +```` + +### **Responses** +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + +### Tags +`Files Operation` + +--- + +## 🔹 2 Get Documents + +Retrieve a list of all available files. + +### **Endpoint** + +```` +GET api/v1/documents/{document_id} +```` + + + +### **Headers** +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + +### **Query Parameters** +> _None_ + + + +### **Request Body** +> _Not required_ + +### **Response Body Example** + +```` +json + +{ + "files": [ + { + "document_id": "92c79f09-76c5-4cf8-bab6-9t68785acefc", + "file_path": "example.com/files/automation/Two-party-sample.pdf", + "metadata_path": "example.com/metadata/92c79f09.json", + "fileName": "Two-party-sample.pdf", + "size": 2746, + "last_modified": "2025-12-06T15:37:02.145324+00:00", + "created_by": { + "name": "Test User", + "email": "test.user@example.com" + } + }, + { + "document_id": "b530324b-a18d-43b8-k943-19640164a094", + "file_path": "example.com/files/automation/Folder1/Employee-Onboarding.pdf", + "metadata_path": "example.com/metadata/b530324b.json", + "fileName": "Employee-Onboarding.pdf", + "size": 539879, + "last_modified": "2025-12-08T11:07:52.468852+00:00", + "created_by": { + "name": "Test User", + "email": "test.user@example.com" + } + } + ] +} + +```` + + +### **Responses** +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + +### **Response Format** +- Content-Type: `application/json` +- Returns an array of file objects with associated metadata. + +### Tags +`Files Operation` + +--- + +## Document Template APIs + +This section describes the APIs used to retrieve document templates from the system. + +--- + +## 🔹 1 Get All Document Templates + +Retrieve a list of all available document templates. + +### **Endpoint** + + +```` +GET api/v1/documents/templates/all/ +```` + +### **Headers** + +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + + + +### **Query Parameters** +| Name | Type | Required | Description | +|-----|------|----------|-------------| +| `is_global` | boolean \| null | ❌ No | Filter global templates | + + +### **Request Body** + +> _Not required_ + + +### **Response Body Example** + +```` +json + +{ + "local": { + "ATTESTATION AND AGREEMENT": { + "fields": [ + { + "id": "1766830885432-signature", + "type": "signature", + "x": 429, + "y": 902, + "width": 362, + "height": 36, + "page": 1, + "color": "hsl(196, 100%, 90%)", + "style": "both", + "partyId": "1", + "required": false, + "record": false, + "timestamp": false, + "options": [] + }, + { + "id": "1766830532236-text", + "type": "text", + "x": 501, + "y": 980, + "width": 310, + "height": 28, + "page": 1, + "color": "hsl(196, 100%, 90%)", + "style": "", + "partyId": "1", + "required": false, + "record": false, + "timestamp": false, + "options": [] + } ], + "parties": [ + { + "id": "1", + "name": "Party 1", + "email": "user@example.com", + "color": "hsl(196, 100%, 90%)", + "priority": 0 + } + ], + "document_id": "e1j8k49c-b726-4c9e-b168-m487cfaf6bcc" + } + }, + "global": { + "Demo2-Temp": { + "fields": [ + { + "id": "1765457294716-text", + "type": "text", + "x": 252, + "y": 188, + "width": 100, + "height": 25, + "page": 1, + "color": "hsl(196, 100%, 90%)", + "style": "both", + "partyId": "1", + "required": false, + "record": false, + "timestamp": false, + "options": [] + }, + { + "id": "1765457303824-date", + "type": "date", + "x": 555, + "y": 245, + "width": 100, + "height": 25, + "page": 1, + "color": "hsl(196, 100%, 90%)", + "style": "both", + "partyId": "1", + "required": false, + "record": false, + "timestamp": false, + "options": [] + } + ], + "parties": [ + { + "id": "1", + "name": "Party 1", + "email": "user@example.com", + "color": "hsl(196, 100%, 90%)", + "priority": 0 + } + ], + "document_id": "daac0bba-130b-4eeb-83fd-bi794882e972" + } + } +} + +```` + +### **Responses** + + +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + + + + + +### **Tags** +`Document Template` + +--- + +## Document Tracker APIs + +This API allows clients to retrieve the current status of a document using its tracking and document identifiers. + +--- + +## 🔹 1 Get Over All Status + +Retrieves a list of all document statuses. + +### **Endpoint** + +```` +GET api/v1/documents/status +```` +--- + +### **Headers** +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + + + +### **Request Body** +> _Not required_ + +### **Response Body Example** + +```` +json + +{ + "total_documents": 7, + "status_counts": { + "completed": 1, + "cancelled": 1, + "expired": 1, + "in_progress": 1, + "declined": 1, + "shared": 1, + "scheduled": 1 + }, + "documents": [ + { + "document_id": "00f3435b-460a-40e0-a2a9-5547450b82f1", + "tracking_id": "0254861d-bc0c-463f-9ab5-76007a852811", + "validity_date": "2025-12-12T18:29:59.000Z", + "status": "completed", + "datetime": "2025-12-12T16:12:49.689499+00:00", + "parties": [ + { + "id": "1", + "name": "User One", + "email": "user.one@example.test", + "color": "hsl(196, 100%, 90%)", + "status": { + "sent": [ + { + "isSent": true, + "dateTime": "2025-12-12T16:00:50.797238+00:00", + "party_name": "User One", + "party_email": "user.one@example.test", + "ip": "34.201.55.91", + "browser": "Chrome", + "os": "Windows 11", + "device": "PC/Laptop", + "location": { + "city": "New York", + "region": "New York", + "country": "US", + "timestamp": "2025-12-12T16:00:31.616Z", + "timezone": "America/New_York" + } + } + ], + "opened": [ + { + "isOpened": true, + "dateTime": "2025-12-12T16:11:04.313365+00:00", + "party_name": "User One", + "party_email": "user.one@example.test", + "ip": "34.201.45.91", + "browser": "Chrome", + "os": "Windows 11", + "device": "PC/Laptop", + "location": { + "city": "New York", + "region": "New York", + "country": "US", + "timestamp": "2025-12-12T16:10:46.089Z", + "timezone": "America/New_York" + } + } + ], + "signed": [ + { + "isSigned": true, + "dateTime": "2025-12-12T16:12:49.689499+00:00", + "party_name": "User One", + "party_email": "user.one@example.test", + "ip": "34.201.45.91", + "browser": "Chrome", + "os": "Windows 11", + "device": "PC/Laptop", + "location": { + "city": "New York", + "region": "New York", + "country": "US", + "timestamp": "2025-12-12T16:12:29.632Z", + "timezone": "America/New_York" + } + } + ] + } + } + ] + }, + { + "document_id": "011baa59-f55b-4fed-b15c-d1653fb72e46", + "tracking_id": "0e3bc8c4-b7b2-4471-bcf4-03756c17dae7", + "validity_date": "2026-02-28T18:29:59.000Z", + "status": "cancelled", + "datetime": "2025-12-31T21:48:44.275476+00:00", + "parties": [ + { + "id": "1", + "name": "User Two", + "email": "user.two@example.test", + "color": null, + "status": { + "cancelled": [ + { + "isCancelled": true, + "reason": "Invalid document format", + "dateTime": "2025-12-31T21:48:44.275476+00:00", + "party_name": "User Two", + "party_email": "user.two@example.test", + "ip": "18.211.90.44", + "browser": "Chrome", + "os": "Windows 11", + "device": "PC/Laptop", + "location": { + "city": "Austin", + "region": "Texas", + "country": "US", + "timestamp": "2025-12-31T21:48:38.999Z", + "timezone": "America/Chicago" + } + } + ] + } + } + ] + }, + { + "document_id": "92c79f09-76c5-4cf8-bab6-9b98721ncefc", + "tracking_id": "ac532311-6c71-4f65-aea6-a6chnj77faefa", + "validity_date": "2026-12-12T18:29:59.000Z", + "status": "scheduled", + "datetime": "2026-01-06T13:42:49.000600+00:00", + "parties": [ + { + "id": "1", + "name": "Signer One", + "email": "signer.one@example.test", + "color": "hsl(196, 100%, 90%)", + "status": { + "scheduled": [ + { + "isScheduled": true, + "dateTime": "2026-01-06T13:42:49.000600+00:00", + "party_name": "Signer One", + "party_email": "signer.one@example.test", + "ip": "34.228.4.221", + "browser": "HeadlessChrome", + "os": "Linux", + "device": "PC/Laptop", + "location": { + "city": "Ashburn", + "region": "Virginia", + "country": "US", + "timestamp": "2026-01-06T13:42:48.584Z", + "timezone": "America/New_York" + } + } + ] + } + }, + { + "id": "2", + "name": "Signer Two", + "email": "signer.two@example.test", + "color": "hsl(80, 70%, 90%)", + "status": {} + } + ] + }, + { + "document_id": "021fc34b-b267-43ba-a7af-455286ebe90b", + "tracking_id": "0e8aa699-9114-4cbb-a479-m50cf693f988", + "validity_date": "2025-12-10T23:59:59.000Z", + "status": "in_progress", + "datetime": "2025-12-10T16:42:15.133172+00:00", + "parties": [ + { + "id": "1", + "name": "User Three", + "email": "user.three@example.test", + "color": "hsl(196, 100%, 90%)", + "status": {} + } + ] + }, + { + "document_id": "92c79f09-76c5-4cf8-bab6-9b9523565acefc", + "tracking_id": "05433b6b-3f7e-4d7f-a333-8c4b258gf598a8", + "validity_date": "2026-03-01T18:29:59.000Z", + "status": "shared", + "datetime": "2026-01-06T13:15:29.208286+00:00", + "parties": [ + { + "id": "1", + "name": "User Four", + "email": "user.four@example.test", + "color": "#ccf1ffff", + "status": { + "shared": [ + { + "isShared": true, + "dateTime": "2026-01-06T13:15:29.208286+00:00", + "party_name": "User Four", + "party_email": "user.four@example.test", + "ip": "44.193.15.98", + "browser": "Chrome", + "os": "Linux", + "device": "PC/Laptop", + "location": { + "city": "Ashburn", + "region": "Virginia", + "country": "US", + "timestamp": "2026-01-06T13:15:25.699Z", + "timezone": "America/New_York" + } + } + ] + } + } + ] + } + ] +} + + +```` + +### **Responses** +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + + + + +--- + +### **Tags** +`Document Tracker` + +--- + +## 🔹 2 Get Document Status By Party + +Retrieve the document status for an individual party using tracking, document, and party identifiers. + +### **Endpoint** + +```` +GET api/v1/documents/party-status +```` + +### **Headers** +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + + + +### **Query Parameters** +| Name | Type | Required | Description | +|-----|------|----------|-------------| +| `tracking_id` | string | ✅ Yes | Unique tracking identifier of the document | +| `document_id` | string | ✅ Yes | Unique identifier of the document | +| `party_id` | string | ✅ Yes | Unique identifier of the party | + + + + +### **Request Body** +> _Not required_ + + +### **Response Body Example** + +```` +json + +{ + "tracking_id": "09aa3a64-fd50-4afa-a79e-e70ek5cea2a6", + "document_id": "form-doc-dded726c-a117-42e3-9df9-a3a3c5hg91b2", + "validity_date": "2025-12-11T18:29:59.000Z", + "tracking_status": { + "status": "completed", + "dateTime": "2025-12-11T14:29:10.596474+00:00", + "ip": "34.102.136.180", + "browser": "Chrome", + "os": "Windows 11", + "device": "PC/Laptop", + "location": { + "city": "San Francisco", + "region": "California", + "country": "US", + "timestamp": "2025-12-11T14:29:09.599Z", + "timezone": "America/Los_Angeles" + } + }, + "party_id": "1", + "party_info": { + "id": "1", + "name": "John Doe", + "email": "john.doe@example.com", + "color": "hsl(196, 100%, 90%)", + "status": { + "sent": [ + { + "isSent": true, + "dateTime": "2025-12-11T14:26:25.598788+00:00", + "party_name": "John Doe", + "party_email": "john.doe@example.com", + "ip": "34.102.136.180", + "browser": "Chrome", + "os": "Windows 11", + "device": "PC/Laptop", + "location": { + "city": "San Francisco", + "region": "California", + "country": "US", + "timestamp": "2025-12-11T14:26:22.091Z", + "timezone": "America/Los_Angeles" + } + } + ], + "opened": [ + { + "isOpened": true, + "dateTime": "2025-12-11T14:28:46.051332+00:00", + "party_name": "John Doe", + "party_email": "john.doe@example.com", + "ip": "34.102.136.180", + "browser": "Chrome", + "os": "Windows 11", + "device": "PC/Laptop", + "location": { + "city": "San Francisco", + "region": "California", + "country": "US", + "timestamp": "2025-12-11T14:28:46.738Z", + "timezone": "America/Los_Angeles" + } + } + ], + "signed": [ + { + "isSigned": true, + "dateTime": "2025-12-11T14:29:10.596474+00:00", + "party_name": "John Doe", + "party_email": "john.doe@example.com", + "ip": "34.102.136.180", + "browser": "Chrome", + "os": "Windows 11", + "device": "PC/Laptop", + "location": { + "city": "San Francisco", + "region": "California", + "country": "US", + "timestamp": "2025-12-11T14:29:09.599Z", + "timezone": "America/Los_Angeles" + } + } + ] + } + }, + "fields": [ + { + "id": "176544595874381-date", + "type": "date", + "x": 545, + "y": 852, + "width": 100, + "height": 25, + "page": 0, + "color": "hsl(196, 100%, 90%)", + "style": "both", + "partyId": "1", + "required": false, + "record": false, + "timestamp": false, + "options": [], + "signed": true, + "value": "12/11/2025", + "signed_at": "2025-12-11T14:29:08.922733+00:00" + }, + { + "id": "1765446872111-date", + "type": "date", + "x": 625, + "y": 297, + "width": 100, + "height": 25, + "page": 0, + "color": "hsl(196, 100%, 90%)", + "style": "both", + "partyId": "1", + "required": false, + "record": false, + "timestamp": false, + "options": [], + "signed": true, + "value": "12/11/2025", + "signed_at": "2025-12-11T14:29:08.922758+00:00" + } + ], + "otp_enabled": null, + "wet_sign": false +} + +```` + +### **Responses** +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + + + +### **Example** + +> tracking_id=13c34dd9-7f31-4s3d-9b1c-b006ehy587f + +> document_id=e1bfqwe9-a677-43ad-b211-0b4afbj55a77 + +> party_id=1 + +### **Tags** +`Document Tracker` + + +--- + +## 🔹 3 Resend E-Sign + +Resend the document access or signing link for an existing document using its document and tracking identifiers. + +### **Endpoint** + +```` +POST api/v1/documents/resend +```` + +### **Headers** +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + + +### **Query Parameters** +| Name | Type | Required | Description | +|-----|------|----------|-------------| +| `store_as_default` | boolean | ❌ No | Store the provided configuration as default | + + +### **Request Body Example** + +```` +json + +{ + "document_id": "fce52a1e-5q95-4cf8-99ba-e62994f3ceb0", + "tracking_id": "076a3e8b-2uue-49va-8d7e-d6d28k98f2ed", + "validityDate": "2025-12-31T18:29:59.000Z", + "remainder": 0, + "client_info": + { + "ip": "3.82.145.27", + "city": "New York", + "region": "New York", + "country": "US", + "timezone": "America/New_York", + "timestamp": "2025-12-21T10:14:01.699Z", + "aws_region": "us-east-1", + "browser": "Chrome", + "device": "PC/Laptop", + "os": "Windows 10" + } +} + +```` + +### **Response Body Example** + +```` +json + +{ + "message": "Resend initiated", + "tracking_id": "076a1e8b-27ae-4e5a-8d7e-d6d24j78f2ed", + "new_validityDate": "2026-12-31T18:29:59.000Z" +} + + +```` + +### **Response** + +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + +### **Example** + +> store_as_default=false + + +### **Tags** + +`Document Tracker` + +--- + +## 🔹 4 Download Signed Document + +Retrieve the final signed PDF document. + +### **Endpoint** + +```` +GET api/v1/documents/signed-pdf +```` +### **Headers** +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + + +### **Query Parameters** +| Name | Type | Required | Description | +|-----|------|----------|-------------| +| `tracking_id` | string | ✅ Yes | Unique tracking identifier of the document | +| `document_id` | string | ✅ Yes | Unique identifier of the document | + + +### **Request Body** +> _Not required_ + +### **Response Example** + +This API returns the **signed document** in **PDF format.** + + A **sample signed document** is provided below for reference. + + You may **download** the sample PDF for structure and content of the response. + + +

+ + 📄 Download Sample PDF + +

+ +### **Responses** +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + + +### **Example** + + +> tracking_id=a2bfeeb9-a677-43ad-b211-0b4afby76a77 + +> document_id=fyo50e1e-5d05-4cf8-99ba-e62994y7ceb0 + +### **Tags** + +`Document Tracker` + +--- + +## 🔹 5 Download Certificate + +Retrieve the completion certificate for a fully processed document. + +### **Endpoint** + +```` +GET api/v1/documents/complete-certificates +```` + +### **Headers** +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + + + +### **Query Parameters** +| Name | Type | Required | Description | +|-----|------|----------|-------------| +| `document_id` | string | ✅ Yes | Unique identifier of the document | +| `tracking_id` | string | ✅ Yes | Unique tracking identifier of the document | + + + +### **Request Body** +> _Not required_ + +### **Response Example** + + This API returns **Certificate of Completion** in **PDF** format, serving as proof of the completed signing process. + + A sample certificate is attached below for reference. + + You may **download** the sample PDF for detailed information. + + +

+ + 📄 Download Sample PDF + +

+ + +### **Responses** +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + + +### **Example** + +> document_id=fce50e1e-5d05-4cf8-99ba-b6797y6tceb0 + +> tracking_id=e1bfeeb9-a677-43ad-f411-0b4afbj71a77 + +### **Tags** + +`Document Tracker` + +--- + +## 🔹 6 Log Action + +Log a document-related action such as cancellation, rejection, or other workflow events. + +### **Endpoint** + +```` +POST api/v1/documents/log-action +```` + +--- + +### **Headers** +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + +--- + + +### **Request Body Example** + +```` +json + +{ + "document_id": "687u5804-d360-4e98-802f-d5531htyrf675abd8", + "tracking_id": "7054eab3-c0f2-40e2-9b9e-731c1444df6d", + "action": "CANCELLED", + "party_id": "1", + "reason": "User requested cancellation", + "client_info": { + "ip": "3.128.94.52", + "city": "Lisle", + "region": "Illinois", + "country": "US", + "timezone": "America/Chicago", + "timestamp": "2025-12-21T04:14:01.699Z", + "browser": "Chrome", + "device": "PC/Laptop", + "os": "Windows 10" + }, + "holder": { + "name": "John Doe", + "email": "johndoe@virtualansoftware.com", + "address": { + "address_line_1": "3333 Warrenville Road", + "address_line_2": "Suite 200", + "city": "Lisle", + "country": "USA", + "state": "IL", + "zipcode": "60532" + } + } +} + + +```` + +### **Response Body Example** + +```` +json + +{ + "message": "Action 'CANCELLED' logged successfully." +} + +```` + +### **Responses** + +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + + +### **Tags** + +`Document Tracker` + +--- + +## 🔹 7 Send E-Sign + +Send a document to one or more parties for review or signing. + +### **Endpoint** + + +```` +POST api/v1/documents/send +```` + +### **Headers** +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + + + +### **Query Parameters** +| Name | Type | Required | Default | Description | +|-----|------|----------|---------|-------------| +| `store_as_default` | boolean | ❌ No | `false` | Store configuration as default | + + +### **Request Body Example** + +```` +json + +{ + "document_id": "fct60e1e-5d05-4cf8-99ja-e65258f3ceb0", + "validityDate": "2025-12-31T18:29:59.000Z", + "remainder": 0, + "parties": + [ + { + "id": "1", + "name": "Sarah Williams", + "email": "sarah.williams@virtualansoftware.com" + } + ], + "email_response": [ + { + "email_subject": ": Summary of Your API Integration Check", + "email_body": "Hi [Fullname], We have completed the...[Documnet Link]" + } + ], + "cc_emails": [ + "jason.brown@virtualansoftware.com" + ], + "client_info": { + "ip": "3.156.94.85", + "city": "Lisle", + "region": "Illinois", + "country": "US", + "timezone": "America/Chicago", + "timestamp": "2025-12-21T04:14:01.699Z", + "aws_region": "us-east-2", + "browser": "Chrome", + "device": "PC/Laptop", + "os": "Windows 10" + }, + "holder": { + "name": "John Doe", + "email": "johndoe@virtualansoftware.com", + "address": { + "address_line_1": "3333 Warrenville Road", + "address_line_2": "Suite 200", + "city": "Lisle", + "country": "USA", + "state": "IL", + "zipcode": "60532" + } + }, + "otp_enabled": false, + "template_info": { + "template_type": "Myself", + "template_name": "Testing-template" + } +} + +```` + +### **Response Body Example** + +```` +json + +{ + "tracking_id": "036589d1-45c7-4c7f-b83c-cde17bg5yhj72c", + "status": "sent" +} + +```` + +### **Responses** + +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + +### **Tags** + +`Document Tracker` + +--- + +## 🔹 8 Sign API + +Submit **signed field values** for a document by a specific party. + + +**Endpoint** +```` +POST api/v1/documents/sign +```` + +### **Headers** + +| Name | Type | Required | Description | +| ------------------- | ------------------ | -------- | ---------------------------------------------------------- | +| `x-api-key` | string | ✅ Yes | API key used to authenticate the request | +| `Content type` | application/json | ✅ Yes | Specifies that the API response is returned in JSON format | + + + +### **Request Body Example** + +```` +json + +{ + "tracking_id": "98258l97c-56f6-4ffa-9c6e-62efbae24b36", + "document_id": "fchgt56yhje1e-5d05-4cf8-99ba-e62994f3ceb0", + "party_id": "1", + "fields": [ + { + "fields_ids": [ + { + "field_id": "1766751979232-text", + "value": "Maxin", + "font": "", + "style": "" + } + ] + } + ], + "client_info": { + "ip": "3.128.94.52", + "city": "Lisle", + "region": "Illinois", + "country": "US", + "timezone": "America/Chicago", + "timestamp": "2025-12-27T04:02:59.239Z", + "aws_region": "us-east-2", + "browser": "Chrome", + "device": "PC/Laptop", + "os": "Windows 10" + } +} + + +```` + +### **Response Body Example** + +```` +json + +{ + "status": "completed", + "message": "Signature processed and metadata updated", + "document_id": "nhy67e1e-5d05-4cf8-99ba-e62994f3ceb0", + "tracking_id": "u7y6b7c1-c683-4299-8eb6-7806e8ac59a0", + "signed": true +} + +```` + +### **Responses** + +| Status Code | Description | +| ------------------------------------------------------- | ------------------- | +| 200 | Successful response | +| 422 | Validation error | + +### **Tags** + +`Document Tracker` + +--- + diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 0000000..a18d8d5 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +docs.doculan.ai \ No newline at end of file diff --git a/docs/Contacts/Contact-Delete.md b/docs/Contacts/Contact-Delete.md index 2541d9e..ee114bf 100644 --- a/docs/Contacts/Contact-Delete.md +++ b/docs/Contacts/Contact-Delete.md @@ -1,47 +1,25 @@ +# How to Delete Contact? + +This guide explains how to **Delete a contact in Doculan**, helping you maintain a clean and accurate directory by removing unused or outdated entries.
+From the **Contacts** page, locate the desired contact and select the **Delete** option. A confirmation pop-up will appear—review the details and confirm the action to proceed. +Once confirmed, the contact is permanently removed from the system. This ensures your contact list remains organized, up to date, and relevant. + +--- + + # Steps to Delete Contact -1. Open the **Contacts** page to view all contacts. +1. Navigate to **Contacts** page to view all contacts. 2. Click the **Delete (trash icon)** next to the contact you want to remove. 3. Confirm by clicking **Delete**. 4. The contact will be deleted successfully. -**Screenshot1:** +**Screenshot 1:** -Step 1 — Delete Contact +Step 1 — Delete Contact -**Screenshot2:** +**Screenshot 2:** Step 2 — Delete Contact ----> The above **Screenshots** represent that how to **Delete Contact.** - -**Demo Video:** - - - -
- - -
- ----> The above **Video** represent that how to **Delete Contact.** \ No newline at end of file +> The above **Screenshots** represent that how to **Delete Contact.** \ No newline at end of file diff --git a/docs/Contacts/Contact-Update.md b/docs/Contacts/Contact-Update.md index 3c55d2b..69df723 100644 --- a/docs/Contacts/Contact-Update.md +++ b/docs/Contacts/Contact-Update.md @@ -1,48 +1,24 @@ +# How to Update Contact? + +This guide helps to **Update a contact in Doculan** allows you to keep recipient information accurate and up to date.
+From the **Contacts** page, select the **edit** option, update the required details, and save the changes. The updated information is instantly reflected across all workflows where the contact is used. This ensures smooth communication and helps prevent errors caused by outdated information. + +--- + # Steps to Update Contact -1. Go to the **Contacts** page to view existing contacts. -2. Click the **Edit (pen icon)** next to the contact you want to modify. -3. Update the contact details (Name, Email, Phone Number, etc.). -4. Click **Save Changes**. -5. The contact information will be updated successfully. +1. Navigate to **Contacts** page to view your existing contacts. +2. Click the **Edit (pen icon)** next to the contact you want to customize. +3. Update the required details, such as **Name, Email, Phone Number**, or other relevant information. +4. Click **Save Changes** to apply the updates. +5. The contact information will be updated successfully and reflected across all related workflows. -**Screenshot1:** +**Screenshot 1:** -Step 1 — Update Contact +Step 1 — Update Contact -**Screenshot2:** +**Screenshot 2:** Step 2 — Update Contact ----> The above **Screenshots** represent that how to **Update Contact.** - -**Demo Video:** - - - -
- - -
- ----> The above **Video** represent that how to **Update Contact.** \ No newline at end of file +> The above **Screenshots** represent that how to **Update Contact.** \ No newline at end of file diff --git a/docs/Contacts/Contact_Create.md b/docs/Contacts/Contact_Create.md index fc34896..f46261d 100644 --- a/docs/Contacts/Contact_Create.md +++ b/docs/Contacts/Contact_Create.md @@ -1,6 +1,16 @@ +# How to Create Contact? + +This guide helps to **Creating a Contact in Doculan** allows you to store essential recipient information for quicker form assignment and communication.
+To add a contact, navigate to the **Contacts** section and click **Add Contact**. Enter the required details, such as the recipient’s **name, email address, and phone number**, then save the information. +Once saved, the contact becomes instantly available for use across forms and workflows, ensuring efficient and organized management of your recipient directory. + +--- + + + # Steps to Create Contact -1. Open the **Doculan Dashboard** and go to the **Contacts** section. +1. Navigate to **Doculan Dashboard** and then Click **Contacts** section. 2. Click on **Add Contact**. 3. Fill in all required details such as: - Full Name @@ -8,13 +18,13 @@ - Mobile Number - Other optional fields 4. Click **Add Contact** to save. -5. The contact will be successfully created and stored in the system. +5. The contact will be **successfully created and stored in the Doculan Storage.** -**Screenshot1:** +**Screenshot 1:** Step 1 — Create Contact ----> The above **Screenshot** represent that how to **Create Contact.** +> *The above **Screenshot** represent that how to **Create Contact.*** **Demo Video:** @@ -34,19 +44,17 @@ } - - - -
-
----> The above **Video** represent that how to **Create Contact.** \ No newline at end of file +> The above **Video** represent that how to **Create,Update and Delete Contact.** + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Document/Documents_Compare.md b/docs/Document/Documents_Compare.md new file mode 100644 index 0000000..5a58c84 --- /dev/null +++ b/docs/Document/Documents_Compare.md @@ -0,0 +1,89 @@ +# How to Versioning & Comparison Document? + +This guide explains how to **Compare** different versions of a document in Doculan using the built-in **Versioning and Comparison feature**. The comparison tool allows you to review revisions, track changes, and ensure document accuracy before finalizing or sharing. + +Each time a document is edited and saved, the system automatically maintains a version history. Users can compare the current version with previous versions to clearly identify modifications, additions, and deletions. + +This feature helps: +- Track document revisions over time. +- Review changes before finalizing. +- Maintain audit clarity. +- Prevent accidental content loss. + +## Step 1: Accessing the Compare Feature + +1. Open the document in the **Document** Editor. +2. Navigate to the **top-right corner** of the editor. +3. Click the **Compare** button to access available document versions. + +**Screenshot 1** + +Step 1 — Compare a Document + +--- + +## Step 2: Comparing Document Versions + +4. Select the version you want to **compare** with the current version. +5. The editor will display a **side-by-side or highlighted** comparison view. +6. Changes will be clearly marked to distinguish revisions. + +**Screenshot 2** + +Step 1 — Compare a Document + +The comparison view highlights: + + - **Added content** + - **Removed content** + - **Modified text** + +> This allows users to quickly review differences without manually scanning the entire document. + +--- + +## Step 3: Reviewing Changes + +The comparison interface provides a clear visual representation of updates, making it easy to: + +- Verify corrections. +- Confirm content updates. +- Review collaborative edits. +- Ensure document accuracy before sending or publishing. + +> Once the review is complete, users may proceed with further edits or finalize the document as needed. + +--- + +## Step 4: Tracking the History + +Click the **History** button in the **Document Editor** to verify the document’s version history. + +The **History panel** displays a chronological list of all saved versions, including details such as: + +- Version number +- Date of modification +- User who made the changes + +**Screenshot 3** + +Step 1 — Compare a Document + +From this panel, you can review previous versions and select a specific version to **compare** with the current document. This helps ensure transparency, track revisions accurately, and maintain full control over document updates. + +**Screenshot 4** + +Step 1 — Compare a Document + +> The above screenshots represent the **File History** and **Version History** popups, displaying the document’s saved versions and allowing users to view or compare previous versions for accurate revision tracking. + +--- + +## Best Practices + +- Save documents regularly to maintain version history. +- Use clear version naming (if applicable). +- Compare versions before sending important documents. +- Review changes carefully in multi-party collaboration scenarios. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Document/Documents_Create.md b/docs/Document/Documents_Create.md index bc13add..6617aaa 100644 --- a/docs/Document/Documents_Create.md +++ b/docs/Document/Documents_Create.md @@ -1,26 +1,65 @@ -# Steps to Create a New Document +# How to Create Document? -1. Go to **Doculan Dashboard → Documents → Create** -2. Choose your preferred method: - - **Create manually**, or - - **Use AI to generate the document** -3. Start writing or editing your text -4. Format the document as needed: - - Change **font styles & colors** - - **Increase / Decrease** font size - - Insert **images**, **logos**, or **pages** -5. Doculan provides **spell check** to ensure accuracy -6. Save the document (**PDF format only**) +This guide explains how to **Create a document in Doculan** allows you to build professional, fully customizable files either manually or with AI assistance. You can edit text, apply formatting, adjust styles, and insert images or additional pages to structure your document effectively. Built-in spell check ensures accuracy before saving your work.
+Once completed, the document can be saved and exported in PDF format for secure storage, sharing, and distribution. -**Screenshot1:** +--- -Step 1 — Create a New Document -**Screenshot2:** +## Step 1: Steps to Create a New Document -Step 2 — Create a New Document +1. Navigate to the **Doculan Dashboard**. +2. Select **Documents** from the main menu. +3. Click the **Create** button to start creating a new document. ----> The above **Screenshots** represent that how to **Create a new Document.** +**Screenshot 1** + +Step 1 — Create a New Document + +--- + +## Step 2: Choose Document Creation Method + +4. A popup appears with the message: + **“Create with AI or Create Manually”** + +**Screenshot 2** + +Step 1 — Create a New Document + +--- + +## Step 3: Enter Document Type + +5. Enter the required **Document Type** to auto-generate the document. + +**Alternatively:** + +- Click **Create Manully** to proceed with manual document creation. + +**Screenshot 3** + +Step 1 — Create a New Document + +--- + +## Step 4: Use the Document Editor and Format the Document + +6. The **Document Editor** opens with full editing capabilities. +7. All editing panels are fully **draggable**, allowing you to reposition them anywhere around the document workspace for enhanced flexibility and convenience. + +You can format the document using the following options: + +- Change **font styles** and **text colors** +- Increase or decrease **font size** +- Insert **images**, **logos**, or **additional pages** +- Use **spell check** to ensure content accuracy + +**Screenshot 4** + +Step 1 — Create a New Document + +--- **Demo Video:** @@ -40,16 +79,17 @@ } -
+
-
----> The above **Video** represent that how to **Create Document.** +> The above **Video** represent that how to **Create a document in Doculan**, guiding you through each step of the document creation process within the platform.. +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Document/Documents_E-sign.md b/docs/Document/Documents_E-sign.md new file mode 100644 index 0000000..9a0cc44 --- /dev/null +++ b/docs/Document/Documents_E-sign.md @@ -0,0 +1,27 @@ +# How to use E-Sign in the Document Editor? + +The **E-Sign** feature allows you to convert a standard document into an E-Sign document directly from the **Document Editor**. This enables you to add recipients, insert signature fields, and prepare the document for electronic signing. + +--- + +## Steps to Open the E-Sign in Document Editor + +1. After completing your document in the **Document Editor**, click the **E-Sign** icon to proceed with configuring the document for electronic signing. + +Step 1 — Create a New Document + +2. This will open a “Save & E-Sign” pop-up window. + - Enter the Document Name. + - Click Save & Continue. + +Step 1 — Create a New Document + +3. A new pop-up will then appear, prompting you to select a folder for file upload. + +Step 1 — Create a New Document + +4. Choose the appropriate folder and confirm to proceed to the E-Sign configuration. + +Step 1 — Create a New Document + +> After configuring the **E-Sign document**, add the required fields (such as **Signature, Text, or Date fields**) to proceed with the E-Sign process. \ No newline at end of file diff --git a/docs/Document/Documents_Upload.md b/docs/Document/Documents_Upload.md index 6815392..61b5f10 100644 --- a/docs/Document/Documents_Upload.md +++ b/docs/Document/Documents_Upload.md @@ -1,49 +1,52 @@ -# Steps to Upload to Doculan Storage - -- Documents can be saved **locally** or in **Doculan Storage** -- If saving to Doculan storage: - - Select the correct **folder path / storage path** - - Upload the **PDF file** - -**Screenshot1:** - -Step 1 — Upload to Doculan Storage
- - -**Screenshot2:** - -Step 2 — Upload to Doculan Storage
- - ----> The above **Screenshots** represent that how to **Upload Document.** - -**Demo Video:** - - - -
- - -
- ----> The above **Video** represent that how to **Upload Document.** +# How to Save Document? + +This guide helps to **Save a document to Doculan** allows you to securely store and manage files within the platform.
+To upload a document, simply select the appropriate storage path, select your PDF file, and upload it to the designated folder. This ensures your documents are centrally organized and easily accessible for future workflows. By following this process, you can maintain structured document management and enable seamless retrieval whenever needed. + +--- + +## Step 1: Save the Document + +1. After creating or editing the document, click the **Save** button within the **Document Editor** to securely store your changes. + +**Screenshot 1** + +Step 1 — Create a New Document + +--- + +## Step 2: Enter Document Name + +2. The **Save New File** popup appears. +3. Enter the required **Document Name**. +4. Click **Confirm Save** to proceed. + +**Screenshot 2** + +Step 1 — Create a New Document + +--- + +## Step 3: Select Storage Location + +5. The **File Upload** popup appears. +6. Select the required **folder** where the document should be stored in **Doculan Storage**. +7. Click **Upload File** to save the document. + +**Screenshot 3** + +Step 1 — Create a New Document + +--- + +## Step 4: Verify Saved Document + +8. The document is successfully uploaded and is now available in the selected folder within **Doculan Storage**, where it can be viewed and managed as needed. + +**Screenshot 4** + +Step 1 — Create a New Document + +© Doculan by [Virtualan Software](https://www.virtualan.io) + +--- diff --git a/docs/E_Sign/Co-Signer.md b/docs/E_Sign/Co-Signer.md new file mode 100644 index 0000000..1b41eae --- /dev/null +++ b/docs/E_Sign/Co-Signer.md @@ -0,0 +1,103 @@ +# How to Use the Co-Signer Option? + +The **Co-Signer** option allows multiple recipients to sign the same document at the same stage of the signing process. When recipients are configured as co-signers, they receive the **E-Sign email simultaneously** and can sign the document independently. + +This feature is useful when multiple parties need to approve or sign a document **in parallel** without waiting for another signer to complete their action. + +Using the **Co-Signer option**, you can: + +- Allow multiple recipients to **sign the document at the same time**. +- Avoid delays caused by sequential signing. +- Assign **parallel signing responsibilities**. +- Maintain a flexible signing workflow. + +## Step 1: Add Recipients + +1. Open the **E-Sign Document Editor**. + +Screenshot for Document + +2. Enter the recipient’s **Name** and **Email Address**. + +Screenshot for Document + +> Add additional recipients as required. + +--- + +## Step 2: Configure Co-Signing Order + +3. Locate the **Signing Order** or **Recipient Order section**. + +Screenshot for Document + +4. Drag and drop recipients to arrange their signing order. +5. Place the recipients who should sign together in the **same signing level**. + +Screenshot for Document + +6. Recipients placed at the same level will act as Co-Signers. + +Screenshot for Document + +> If all recipients are placed in the **same signing order**, it becomes an **unordered signing process**. In this case, all recipients will receive the **E-Sign email simultaneously** and can sign the document independently. + +--- + +## Step 3: Send the Document + +7. Review the recipient order and field assignments. +8. Click Send to deliver the document. + +Screenshot for Document + +--- + +## Signing Process + +- **Co-Signers receive the E-Sign email at the same time**. +- Each signer can open the document and complete their signature independently. +- The document moves to the next recipient only after all co-signers have completed signing. + +--- + +## Example Workflow + +- Recipient 1 & Recipient 2 → **Co-Signers** (receive the email simultaneously) +- Recipient 3 → Receives the document after **both co-signers complete the signing process**. +- Recipient 1, Recipient 2 & Recipient 3 → If all recipients are placed in the **same signing order**. In this case, all recipients will receive the **E-Sign email simultaneously** and can sign the document independently. + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** Represent how to use the **Co-Signer** feature to sign a document, providing a step-by-step walkthrough of the complete signing process. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/E_Sign/bulk-mail.md b/docs/E_Sign/bulk-mail.md index a371075..f48ca89 100644 --- a/docs/E_Sign/bulk-mail.md +++ b/docs/E_Sign/bulk-mail.md @@ -1,36 +1,43 @@  # How to Send Bulk Mail in Doculan? -This guide explains how to send **bulk e-sign documents** to multiple recipients at once. -Bulk e-sign helps automate sending the same contract or form (like NDAs, consent forms, or offer letters) to many users simultaneously — each receiving their own personalized copy. +This guide provides a comprehensive overview of how to distribute **bulk e-sign documents** to multiple recipients simultaneously within Doculan. + +The Bulk E-Sign feature empowers organizations to efficiently circulate identical contracts or forms—such as NDAs, consent agreements, or offer letters—to numerous recipients at once. Each recipient receives a secure, personalized copy for individual signing, ensuring both efficiency and compliance. --- -## Overview -In bulk mode: -- One template or document is sent to **many recipients**. -- Each recipient gets a **separate document** for signing. -- You can import recipient details manually or via **CSV file**. -- The system tracks each email independently and provides a complete audit trail. +When utilizing Bulk Mode: +- A single document or template is distributed to **multiple recipients**. +- Each recipient receives a **distinct and secure copy** for signing. +- Recipient details may be entered manually or imported via a **CSV file**. +- The system independently tracks each document and maintains a comprehensive audit trail for full transparency and compliance. --- -## Step 1 — Open the Bulk Mail Setup +## Step 1: Open the Bulk Mail Setup -1. Go to your **Dashboard**. +1. Navigate to your **Dashboard**. 2. Locate the folder containing your e-sign-ready document. 3. Click the **⋮ (three dots)** menu under the **Actions** column. -4. Select **E-Sign** to open the configuration page. +4. Select **E-Sign** to enter the configuration page. 5. Click **Send Mail**, then choose the **Bulk Mail** option. --- -## Step 2 — Prepare Your Document Fields +## Step 2: Prepare Your Document Fields + +Before proceeding, ensure that the document includes all necessary fields, such as: +- Signature +- Name +- Email +- Date +- Text or additional required input fields -Ensure the document has all the required **signature**, **text**, **date**, and **email** fields configured before bulk sending. +All fields must be correctly assigned and saved prior to **bulk** sending. -> **Tip:** You can save a document as a **template** so that each bulk recipient gets an identical copy with predefined fields. +> **Tip:** Save the document as a reusable Template to ensure consistency across all distributed copies. @@ -51,14 +58,15 @@ You can add recipients in two ways: ### Option 1: Upload CSV File -
+Uploading a **CSV file** is the most efficient method when distributing documents at scale. +
Steps to Upload CSV File 1. Click **Upload CSV File**. -2. Choose a file from your computer that follows the required format. -3. Doculan reads each row as one recipient. -4. Verify the uploaded data in the preview table. -5. Click **Validate** to ensure all email addresses are correctly formatted. +2. Select a properly formatted **CSV file** from your device. +3. The system will interpret each row as an individual recipient. +4. Review the preview table to verify accuracy. +5. Click **Validate** to confirm proper email formatting and data structure.
#### CSV File Format Example @@ -82,15 +90,17 @@ You can add recipients in two ways: | Sarah Lee | sarah@example.com | Virtualan | HR | | Amit Patel | amit@example.com | Virtualan | Legal | --> -**Each line = one recipient’s document** -All the documents are generated and sent individually. +**Each row in the CSV file represents one recipient and generates one unique document.** +> *All documents are securely created and delivered individually.*
--- ### Option 2: Enter Manually -
+For smaller distributions, recipients may be entered directly. + +
Steps to Enter Recipients Manually 1. In the **Recipients** text area, type details for each recipient. @@ -108,6 +118,7 @@ Amit Patel, amit@example.com Screenshot for Document +> *This method offers flexibility when handling a limited number of recipients.* --- -## Step 4 — Track Bulk Document Status +## Step 4: Track Bulk Document Status Once sent, return to your folder and click **Audit** on the corresponding bulk batch. @@ -204,7 +215,7 @@ You’ll see: - Recipient’s IP & device info - Completed or declined status -You can also export this data as a report for compliance records. +> *You can also export this data as a report for compliance records.* --- @@ -266,4 +277,37 @@ You can also export this data as a report for compliance records. Now, you can efficiently manage hundreds of contracts or forms using Doculan’s bulk automation and AI-assisted tools. +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **send a document using the bulk email feature**. + © Doculan by [Virtualan Software](https://www.virtualan.io) diff --git a/docs/E_Sign/cancel-esign-document.md b/docs/E_Sign/cancel-esign-document.md index 079013c..4db5daf 100644 --- a/docs/E_Sign/cancel-esign-document.md +++ b/docs/E_Sign/cancel-esign-document.md @@ -1,8 +1,9 @@  -# How to Cancel an eSign Document? +# How to Cancel an E-Sign Document? -Sometimes you may need to **cancel an ongoing e-signature request** for example, if you sent it to the wrong recipient, updated the document, or no longer need it signed. -This guide explains how to cancel such eSign documents in **Doculan** and what happens afterward. +There may be occasions when it becomes necessary to **cancel an active e-signature request**—for instance, if the document was sent to an incorrect recipient, requires revision, or is no longer needed for signing. + +This guide outlines the proper procedure to cancel an eSign document in **Doculan**, along with the system actions that follow cancellation. --- @@ -13,9 +14,9 @@ This guide explains how to cancel such eSign documents in **Doculan** and what h 3. Choose **Audit** to confirm the current activity and signer progress (optional). 4. Once confirmed, click the **Cancel eSign** option. -Screenshot for Document +Screenshot for Document -> You can only cancel documents that are *not yet completed* or *not fully signed by all parties*. +> You can only cancel documents that are *not yet completed* or *not fully signed by all parties*. --- @@ -23,7 +24,7 @@ This guide explains how to cancel such eSign documents in **Doculan** and what h After selecting **Cancel eSign**, a pop-up confirmation appears. -
+
Steps to Confirm Cancellation 1. Click **Cancel eSign** from the dropdown menu. @@ -44,7 +45,7 @@ When the document is cancelled: | Effect | Description | |--------|-------------| -| **Status Update** | Status changes to **Cancelled** immediately in the dashboard | +| **Status Update** | The document status changes instantly to **Cancelled** on the dashboard. | | **Recipient Access** | Any signer trying to open the old link will see: *"This document has been cancelled by the administrator and is no longer available."* | | **Email Notification** | All recipients receive an automatic email informing them of the cancellation | | **Audit Log** | A new entry is created in the **Order Trail** indicating cancellation time and user ID | @@ -53,9 +54,9 @@ When the document is cancelled: --- -## Step 4: Track Audit History +## Step 4: Review the Audit History -You can verify all cancellation events in the **Audit Trail**. +All cancellation activities can be verified through the **Audit Trail**. 1. Click the **Audit** button for the specific document. 2. The Audit page displays( all entries below with timestamp) diff --git a/docs/E_Sign/cancel-shared-document.md b/docs/E_Sign/cancel-shared-document.md index 10b7d30..0384421 100644 --- a/docs/E_Sign/cancel-shared-document.md +++ b/docs/E_Sign/cancel-shared-document.md @@ -1,11 +1,8 @@ # How to Cancel a Shared Document? -Sometimes, after sharing a document, you may need to **cancel or revoke access** — for example, if the wrong recipient was added or the document content has changed. -Doculan allows you to **cancel shared documents instantly**, preventing any further access or activity. +Sometimes, after sharing a document, you may need to **cancel or revoke access**—for example, if an incorrect recipient was added or the document content has been updated. +Doculan allows you to **cancel shared documents instantly**, immediately preventing any further access or activity and ensuring your document remains secure and under your control. ---- - -## Overview Cancelling a shared document: - Immediately **revokes access** for all recipients. @@ -13,7 +10,7 @@ Cancelling a shared document: - Updates the document status to **Cancelled**. - Keeps the original audit trail for record-keeping. -> Once cancelled, the document cannot be reopened or signed unless resent as a new document. +> Once cancelled, the document cannot be reopened or accessed again. To share it, you must send it as a new document. --- @@ -22,14 +19,14 @@ Cancelling a shared document: ## Step 1: Identify the document to cancel: -- Look for the document currently marked as **Shared**. -- It eligible for cancellation. +- Locate the document currently marked as **Shared** in the Status column. +- Only documents with this status are eligible for cancellation. Screenshot for Document - You can verify recipient activity (viewed/unopened) by clicking the **Audit** button. -Screenshot for Document +Screenshot for Document --- @@ -51,20 +48,20 @@ A confirmation popup appears with details of the document name and recipients. _“Are you sure you want to cancel sharing this document? This action is irreversible.”_ - Click **Confirm** to proceed. -Screenshot for Document +Screenshot for Document --- ## Step 4: Verify the cancellation: After confirming: -- The document’s **Status** immediately changes to **Cancelled**. +- The document’s **Status** immediately updated to **Cancelled**. - All previously shared links become invalid. - Recipients who attempt to open the link will see a message: _“Access revoked — this document is no longer available.”_ - Click the **Audit** option to see the timestamps and recipient details. -Screenshot for Document +Screenshot for Document --- @@ -80,6 +77,6 @@ After confirming: --- - **You’ve successfully cancelled a shared document in Doculan!** +> **You’ve successfully cancelled a shared document in Doculan!** © Doculan by [Virtualan Software](https://www.virtualan.io) diff --git a/docs/E_Sign/create-template.md b/docs/E_Sign/create-template.md index de1391e..c9e757a 100644 --- a/docs/E_Sign/create-template.md +++ b/docs/E_Sign/create-template.md @@ -1,8 +1,8 @@  # How to Create a Template? -Creating a template in **Doculan eSign** allows you to **save time** by reusing pre-defined document layouts and field placements. -Instead of setting up each eSign from scratch, you can configure your document once and save it as a reusable template. +Creating a template in **Doculan eSign** allows you to **save time** by reusing predefined document layouts and field placements. +Instead of setting up each eSign request from scratch, you can configure the document once and save it as a reusable template—ensuring consistency, efficiency, and accuracy across all future transactions. You can create two kinds of templates in Doculan: - **Myself Template:** Visible only to you (for personal or one-time use) @@ -17,7 +17,7 @@ Templates store your field mapping, parties, and email configurations ready to r - In the eSign editor page, - After adding all fields and parties, -- You'll find **Save E-Sign** Button. +- You'll find **Create** Button. Screenshot for Document @@ -37,21 +37,55 @@ When saving the template, you'll be prompted to choose between: Screenshot for Document - Your new template is now saved successfully. +> Your template is now successfully created and stored within the system. --- ## Step 3: Verify your saved template: - Return to the **Template** tab. -- In the dropdown, search for the template name you just created. +- Use the dropdown or search bar to locate your newly saved template. - Select it‚ your saved layout should load instantly. -- Confirm that all fields, parties, and configurations are intact. +- Verify that all fields, parties, and configurations load correctly. --- **You've successfully created a Template in Doculan eSign!** -You can now quickly load, edit, and reuse saved templates to speed up your document workflows. +You can now quickly load, edit, and reuse saved templates to accelerate your document workflows and ensure consistent, efficient processing every time. + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **Create to create and save Template** + © Doculan by [Virtualan Software](https://www.virtualan.io) diff --git a/docs/E_Sign/decline-esign-document.md b/docs/E_Sign/decline-esign-document.md index 33ac703..0dc53d4 100644 --- a/docs/E_Sign/decline-esign-document.md +++ b/docs/E_Sign/decline-esign-document.md @@ -1,14 +1,14 @@ - + # How to Decline an eSign Document? -In some cases, a signer may need to **decline** an eSign document for example, if the document contains incorrect information, unauthorized clauses, or was sent in error. -This guide explains how recipients can **decline an e-sign request**, what happens after it's declined, and how senders can track this status in **Doculan**. +In certain situations, a signer may need to **decline an eSign document** — for example, if it contains incorrect information, unauthorized clauses, or was sent in error. +This guide explains how recipients can **decline an e-sign request**, what happens after it's declined, and how senders can track the declined status in **Doculan**. --- ## Step 1: Click "Decline" to Reject the Document -You'll see action buttons at the right side of the document page: +On the right side of the document page, the following action buttons are available: - **AI Assist** - **Submit** - **Decline** @@ -28,24 +28,24 @@ To decline: A pop-up window appears with a text area labeled **Decline Document**. -
+
Steps to Confirm Decline -1. Enter the reason +1. Enter a clear and appropriate reason for declining the document. 2. Click **Confirm Decline**. -3. The document will immediately be marked as **Declined**. +3. The document status will immediately update to **Declined**.
Screenshot for Document -> Once you decline a document, it cannot be reopened or signed later. +> Once a document has been declined, it cannot be reopened or signed at a later time. > The sender must create a new eSign request if changes are made. --- ## Step 3: System Actions After Decline -After the recipient declines the document: +Upon confirmation, the system performs the following actions: | Effect | Description | |--------|-------------| @@ -59,20 +59,15 @@ After the recipient declines the document: ## Step 4: Check the Audit Trail -To confirm who declined and when: +To verify the decline and review the document history: 1. Click **Audit** beside the document. -2. The Audit page displays( all entries below with timestamp) +2. The Audit page will display a complete timeline of activity, including: - Document creation time - Sent time - Opened by - Signed by - Declined by [User Name] - Screenshot for Document @@ -81,9 +76,10 @@ To confirm who declined and when: ## Step 5: What Happens Next? -After a document is declined: +Once a document is declined: - The document **e-sign workflow is terminated** immediately. -- Other recipients in the sequence will not receive the document. +- Any remaining recipients in the signing sequence will not receive the document. +- The process must be re-initiated by the sender if revisions are required. --- diff --git a/docs/E_Sign/default_e-sign-document.md b/docs/E_Sign/default_e-sign-document.md new file mode 100644 index 0000000..d8135af --- /dev/null +++ b/docs/E_Sign/default_e-sign-document.md @@ -0,0 +1,104 @@ +# How to use the default E-Sign Document? + +The **Default Signature** feature allows you to quickly sign your own document. This is ideal for internal approvals, personal agreements, or any situation where only your signature is required. It provides a fast, secure, and legally compliant way to finalize documents independently. + +--- + +## Step 1: Create a Signature + +Here is the professionally structured version of your steps: + +1. Navigate to **Settings**. + +Screenshot for Document + +2. Select the **Signature** tab from the menu. + +Screenshot for Document + +> This will allow you to upload, draw, or type your signature for future use in documents. + +--- + +## Step 2: Create Default Signature + +3. Click **Add Signature** to create and save your signature. + +- Users may: + - Upload an image file + - Draw a signature + - Type a signature (auto-generated format) + +Screenshot for Document + +4. After adding your signature, select it from the list and click **Set as Default** to make it your primary signature for future documents. + +Screenshot for Document + +5. You can add up to **five signatures** to your account. However, only **one signature** can be set as the **default signature** at a time. + +Screenshot for Document + +> The **default signature** will be automatically applied whenever you use the signing feature, unless you manually select a different saved signature. + +--- + +## Step 3: Sign the Document Using the Default Signature + +6. Navigate to the selected document and open the **Action Menu**, then click the **Sign** button to begin the signing process. + +Screenshot for Document + +7. When you open the e-sign document, your **default signature** will be automatically applied to the designated signature field within the document. + +Screenshot for Document + +> Enter any required information, review the document carefully, and click **Submit** to complete the signing process. + +--- + +## step 4: After Submitting + +- A pop-up message will appear confirming **Submission Successful**. +- You can choose to view the signed document or download it as a ZIP file. + +Screenshot for Document + +**You have successfully signed the document using your default signature.** + +> The signing workflow operates within Doculan’s secure cloud environment, ensuring encrypted storage, controlled access, compliance support, and full traceability throughout the document lifecycle. + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** Represent how to use the **Default Signature** feature to sign a document, providing a step-by-step walkthrough of the complete signing process. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/E_Sign/delegate-email.md b/docs/E_Sign/delegate-email.md new file mode 100644 index 0000000..e20e4a3 --- /dev/null +++ b/docs/E_Sign/delegate-email.md @@ -0,0 +1,82 @@ +# How to use Delegate Email? + +The **Delegate Email** feature allows a recipient to assign (delegate) the document to another person for signing. This is useful when the original recipient is unavailable or when signing authority belongs to someone else. + +It ensures flexibility while maintaining a secure and trackable signing workflow. + +--- + +## Step 1: Open the Sent Document + +1. Open the Sent Documents section. + +- Locate the document. +- Click the **Action Menu** (⋮ three dots) next to the document. +- Select **Edit**. + +Screenshot for Document + +> You can only delegate if the recipient has not yet signed the document. + +--- + +# Step 2: Edit & Delegate Recipient Details + +2. The first recipient is not eligible for **delegation**, as they have already completed the **signing process**. + +Screenshot for Document + +3. The recipient details can be modified to **delegate** the document to another email address, provided the original recipient has not yet signed the document. + +Screenshot for Document + +> You may include a **CC email address** if you need to receive a copy of the completed document. + +--- + +## Step 3: Update & Resend Email + +5. After completing the **delegation process**, select **Update** or **Update & Resend** to apply the changes and send the document to the updated recipient. + +Screenshot for Document + +- The document has been **successfully resent to the updated (delegated) recipient**. + +Screenshot for Document + +> Once the recipient details are updated, the original recipient will no longer have access to the document. + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **video** demonstrates how to use the **Delegate Email** feature in an e-sign document, providing a step-by-step walkthrough of updating recipient details before signing. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/E_Sign/delete-template.md b/docs/E_Sign/delete-template.md index d844f7e..c749da5 100644 --- a/docs/E_Sign/delete-template.md +++ b/docs/E_Sign/delete-template.md @@ -29,8 +29,8 @@ You can delete: ## Step 2: Click the "Delete Template" button: - After selecting the template, click the **Delete Template** button. -- A confirmation prompt will appear asking: - > "Are you sure you want to delete this template permanently?" +- A confirmation prompt will appear asking:
+ _"Are you sure you want to delete this template permanently?"_ - Click **Permenantly Delete** button to proceed. Screenshot for Document diff --git a/docs/E_Sign/doculan_eSign_Instructions.md b/docs/E_Sign/doculan_eSign_Instructions.md index 4f6d523..c757c02 100644 --- a/docs/E_Sign/doculan_eSign_Instructions.md +++ b/docs/E_Sign/doculan_eSign_Instructions.md @@ -21,9 +21,10 @@ Currently, if no documents are sent for signing, the status will show as empty. ### AI Assist -The **AI Assist** chatbot can be opened anytime by selecting **AI Assist** from the toolbar. +> The **AI Assist** chatbot can be opened anytime by selecting **AI Assist** from the toolbar. It allows you to ask questions about any document and get quick insights or summaries. +© Doculan by [Virtualan Software](https://www.virtualan.io) --- diff --git a/docs/E_Sign/multiple-party-document.md b/docs/E_Sign/multiple-party-document.md index 29a6472..a4a98a9 100644 --- a/docs/E_Sign/multiple-party-document.md +++ b/docs/E_Sign/multiple-party-document.md @@ -1,18 +1,18 @@  # How to Send Multiple Party Document? -This guide explains how to send a **multi-party e-sign document** in Doculan, where two or more recipients must review and sign the same document in a defined order. -A **multi-party document** allows you to send one contract to multiple signers (Party 1, Party 2, Party 3, etc.). -Each recipient receives the document **in sequence**, after the previous party has completed their signing. +This guide explains how to send a **multi-party e-sign document** in Doculan, where two or more recipients are required to review and sign the same document in a defined sequence. + +A **multi-party document** enables you to send a single contract to multiple signatories (Party 1, Party 2, Party 3, etc.). Each recipient receives the document **in sequence**, only after the previous party has completed their signing process. --- ## Step 1: Add Multiple Parties -Switch to the **Parties** tab to define recipients. +Navigate to the **Parties** tab to define all recipients. -
+
Steps to Add Parties 1. By default, you'll see **Party 1** already listed. @@ -22,11 +22,11 @@ Switch to the **Parties** tab to define recipients. - **Signature** - **Initial** etc at the respective places. --> 2. Click the **Add Party** button to create additional recipients. -3. Fill in their details (Party 2, Party 3, etc.). -4. Verify that the fields you placed earlier are linked to the respective Parties by relating the colour of the Fields to colour of the Party. +3. Enter the required details for each additional party (Party 2, Party 3, etc.). +4. Ensure that all previously added fields (Signature, Date, Initial, etc.) are correctly assigned to the appropriate party. This can be verified by matching the field color with the corresponding party color. 5. Repeat this process for every signer. -> **Important:** Each party must have a valid email address, and every field (Signature, Date, etc.) must be linked to a specific party. +> **Important:** Each party must have a valid email address, and every field must be assigned to a specific party. 6. Click **Save** once all parties are added.
@@ -41,10 +41,12 @@ When multiple parties are added, Doculan follows a **sequential signing** flow: - **Party 1** receives the email first. - Once Party 1 completes signing, the document is automatically sent to **Party 2**. -- The sequence continues until all parties have signed. +- The process continues in sequence until all parties have signed. +> *This ensures an organized and structured signing process.* + --- @@ -62,16 +64,20 @@ Once your parties and fields are set: Screenshot for Document +8. Move the recipient details to arrange them in the **desired signing order**. + +Screenshot for Document + > *Emails are sent sequentially to each party. You can also schedule the email for a future date/time.* --- ## Step 4: Track the Document -After sending, navigate to your folder and click **Audit** for that document. +After sending the document, navigate to the respective folder and select Audit for the document. -You can view: -- Party details (Name, Email) +The Audit section provides: +- Party details (Name and Email Address) - Document status: *Sent, Opened, Signed, Completed, Expired, Declined* - Timestamps for every action - Sequential signing progress @@ -79,33 +85,34 @@ You can view: ### Common Actions | Action | Description | |--------|-------------| -| **Audit** | Timestamps and activity logs | +| **Audit** | View timestamps and activity logs | | **Resend** | Available only if the email is expired | | **Cancel** | Cancels ongoing signing process | -| **Download** | Available if the document is completed | +| **Download** | Available once the document is completed + + --- ## Step 5: Recipient Experience -Each party experience happens **in order**. +Each recipient’s signing experience takes place **in a sequential order**. ### Party 1 -1. Receives the first email with the document link. -2. Clicks the link to open the **Signing Page**. +1. Receives the initial email containing the document link. +2. Clicks the link to access the **Signing Page**. Screenshot for Document -3. Verifies OTP sent to their email. -4. Reviews, fills in the required fields, and signs. +3. Completes OTP verification sent to their email. +4. Reviews the document, fills in the required fields, and signs. Screenshot for Document -5. Clicks **Submit**. +5. Clicks **Submit** to finalize their portion. -Document Attachment -Once Party 1 completes signing, the document is automatically sent to **Party 2**. +Once Party 1 completes signing, the document is automatically forwarded to **Party 2**. --- @@ -115,15 +122,15 @@ Once Party 1 completes signing, the document is automatically sent to **Party 2* Screenshot for Document -2. Click the document link and verify OTP. +2. Click the document link and complete OTP verification. 3. They can **view previously filled fields** before completing their own. Screenshot for Document -4. Fill in their details, sign, and click **Submit**. +4. Enter their required details, sign, and click **Submit**. -Document Attachment +> *This process continues until all designated parties have completed signing.* --- @@ -131,6 +138,8 @@ Document Attachment Recipients can click **AI Assist** on their signing screen to ask document-specific questions. +Screenshot for Document + > *AI Assist works only for the uploaded document. It does not answer unrelated queries.* --- @@ -168,7 +177,7 @@ Open **Order Trail** from the document actions menu to view: Screenshot for Document -This ensures a verifiable audit history for compliance and legal verification. +> *This ensures a verifiable audit history for compliance and legal verification.* --- @@ -176,4 +185,37 @@ This ensures a verifiable audit history for compliance and legal verification. Your workflow is now complete, all parties have securely signed, and the document is stored, certified, and traceable. +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **Create an multi-party E-Sign Document and Send to Recipient**. + © Doculan by [Virtualan Software](https://www.virtualan.io) diff --git a/docs/E_Sign/myself-or-team-template.md b/docs/E_Sign/myself-or-team-template.md index 016ae3a..8b2caad 100644 --- a/docs/E_Sign/myself-or-team-template.md +++ b/docs/E_Sign/myself-or-team-template.md @@ -8,22 +8,22 @@ Doculan offers **two types of templates**: 1. **Myself Template** 2. **Team Template** -Let's break them down step-by-step. +Let's break them down step-by-step. --- ## 1. Myself Template -The **Myself Template** is for your **personal use only**. -These templates are visible **only to you** and are best suited for private or one-time workflows. +The **Myself Template** is intended for individual use. It remains private and accessible solely to the creator, making it ideal for **personal workflows** or confidential document preparation. +This template type ensures that your customized formats remain secure, controlled, and **independent** from team visibility. -
+
When to Use Templates -- You are the **only user** sending or managing the eSign process. -- You want to maintain **personalized templates** without sharing them with the team. -- You often send the **same contract format** to different recipients (like NDAs, offer letters, or invoices). -- You need a **draft-safe workspace** where no one else can modify your templates. +- You are the **sole user** responsible sending or managing the eSign process. +- You prefer to maintain **personalized templates** without sharing them with the team. +- You frequently send the **same contract format** to multiple recipients (like NDAs, offer letters, or invoices). +- You require a **private**, **draft-safe workspace** where your templates remain secure and cannot be modified by others.
--- @@ -32,19 +32,20 @@ These templates are visible **only to you** and are best suited for private or o | Feature | Description | |----------|--------------| -| Visibility | Private (only visible to the creator) | +| Visibility | Private (accessible only to the creator) | | Access | Only you can create, update, or delete | -| Use Case | Individual or recurring personal contracts | +| Use Case | Personal or recurring individual contracts | | Sharing | Not shareable with other team members | +> The **Myself Template** offers autonomy and privacy, ensuring complete control over personal document formats. --- ## 2. Team Template -The **Team Template** is designed for **collaboration** and shared workflows. -These templates are **visible to all members** within your Doculan workspace. +The **Team Template** is designed to support **collaborative environments** and standardized **organizational workflows**. +These templates are accessible to **members within the same Doculan workspace**, ensuring consistency across departments and teams. -
+
When to Use Team Templates - You're working with a **group of users** sending similar types of contracts. @@ -60,14 +61,14 @@ These templates are **visible to all members** within your Doculan workspace. | Feature | Description | |----------|-------------| | Visibility | Shared with all users in your organization | -| Access | Editable by team admins or creators | -| Use Case | Common templates (e.g., client onboarding forms, offer letters) | -| Sharing | Automatically available to your team members | +| Access | Editable by authorized creators or administrators | +| Use Case | Standardized contracts (e.g., onboarding forms, offer letters, client agreements) | +| Sharing | Automatically available to relevant team members | --- - **You've learned about Myself and Team Templates in Doculan!** + **You now understand the distinction between Myself and Team Templates in Doculan!** -> Templates help automate your eSign process and enable faster, error-free document setup whether you're working alone or collaborating with a team. +> Templates help automate your eSign workflow and enable faster, more accurate document setup—whether you’re working independently or collaborating with a team. © Doculan by [Virtualan Software](https://www.virtualan.io) diff --git a/docs/E_Sign/rename-file.md b/docs/E_Sign/rename-file.md new file mode 100644 index 0000000..1254398 --- /dev/null +++ b/docs/E_Sign/rename-file.md @@ -0,0 +1,31 @@ +# How to Rename the File? + +The **Rename File** feature allows you to update the name of an existing document without changing its content, structure, or workflow. This helps improve document organization, clarity, and version control within your workspace. + +**Renaming** a file is especially useful when: + +- Updating document versions (e.g., Contract_v2). +- Correcting naming errors. +- Standardizing file naming conventions. +- Making documents easier to identify in the dashboard. + +--- + +## Steps to Rename the File + +1. From the **Dashboard**, locate the document you want to rename. +2. Select the appropriate file. +3. Click the **⋮ (three-dot)** icon under the **Actions** column. +4. Click the **Rename button** to update the file name. + +**Screenshot 1** + +Screenshot for Document + +5. Enter the new file name and click **Save** to apply the changes. + +**Screenshot 2** + +Screenshot for Document + +> The rename action does not affect the document’s content, recipients, audit trail, or signing status. It simply updates the display name for better management and tracking. \ No newline at end of file diff --git a/docs/E_Sign/resend-esign-document.md b/docs/E_Sign/resend-esign-document.md index a4feac6..e2f0677 100644 --- a/docs/E_Sign/resend-esign-document.md +++ b/docs/E_Sign/resend-esign-document.md @@ -1,15 +1,14 @@  # How to Resend an eSign Document? -Sometimes, an eSign document may need to be resent again, for example, if the **recipient missed the email**, the **document expired**, or **email details were updated**. -This guide covers all the ways you can **resend eSign requests** in Doculan, including how to handle expired, pending, or failed email deliveries. +At times, an eSign document may need to be resent—for example, if the **recipient did not receive the email**, the **document has expired**, or the **recipient’s email details were updated**. +This guide explains when and how you can **resend an eSign request in Doculan**, including how the system handles expired or pending documents while maintaining audit integrity. --- -## Step 1: Understanding When You Can Resend +## Step 1: Understand Resend Eligibility -You can resend a document only under certain conditions. -Doculan enforces strict resend rules to ensure audit accuracy. +For compliance and audit accuracy, Doculan allows resending only under specific conditions. | Document Status | Can Resend? | Description | |------------------|-------------|--------------| @@ -22,7 +21,7 @@ Doculan enforces strict resend rules to ensure audit accuracy. Screenshot for Document -> **Note:** You can only resend *if the document status is not Completed, Cancelled, or Declined.* +> **Note:** You may only resend a document *if its status is **not Completed, Cancelled, or Declined**.* --- @@ -30,37 +29,39 @@ Doculan enforces strict resend rules to ensure audit accuracy. In the **Actions** column for that document: -1. Click the **three-dot menu** (â‹®). +1. Under the Actions column, click the **⋮ (three-dot)** icon. 2. You'll see options like: - View - Audit - Download - **Resend** *(visible only if applicable)* -3. Click **Resend**. -4. Set an expiry date(if needed) before send button. +3. From the dropdown menu, select **Resend**. +4. If necessary, update or set a new **expiry date**. +5. Click Send to resend the request. Screenshot for Document +> *The system will immediately dispatch the document again to the recipient.* --- -## Step 3: View Audit Trail After Resend +## Step 3: Verify Resend Activity in the Audit Trail You can always check the **Audit** log to confirm resend activity. Steps: 1. Click the **Audit** button in the Actions column. -2. You'll see a chronological list of all actions with timestamps: +2. The Audit page will display a chronological record of activities, including: - Original document creation - - First send + - Initial send date and time - Resend date/time - - Recipient open, view, and sign + - Recipient open, view, and signing activity Screenshot for Document --- - **You've learned how to resend an eSign document in Doculan!** + **You have successfully learned how to resend an eSign document in Doculan!** -> Resending ensures that no document signing opportunity is missed — especially when recipients fail to act before expiry or emails fail to deliver. It helps maintain a smooth, uninterrupted e-signature workflow. +> Resending ensures that no document signing opportunity is missed—especially when recipients do not respond before expiry or when emails fail to deliver. It helps maintain a smooth and uninterrupted e-signature workflow. © Doculan by [Virtualan Software](https://www.virtualan.io) diff --git a/docs/E_Sign/resend-shared-document.md b/docs/E_Sign/resend-shared-document.md index 1dc36d8..4bd3b57 100644 --- a/docs/E_Sign/resend-shared-document.md +++ b/docs/E_Sign/resend-shared-document.md @@ -1,19 +1,16 @@  # How to Resend a Shared Document? -Sometimes recipients may miss your shared email, or the access link might expire before they view the document. -Doculan makes it easy to **resend shared documents** instantly without re-uploading or reconfiguring sharing settings. +Sometimes, recipients may miss your shared email, or the access link may expire before they have a chance to view the document. +Doculan makes it easy to **resend shared documents** instantly—without the need to re-upload the file or reconfigure the sharing settings—ensuring a seamless and uninterrupted document access experience. ---- - -## Overview Resending allows you to: -- Reissue expired or unopened links. -- Update recipient details (e.g., corrected email). -- Maintain a complete tracking history for compliance. +- Reissue links that have been opened or remain unopened. + +- Maintain a complete and uninterrupted tracking history for compliance purposes. -> *You can only resend documents with a status of **Expired** or **Unopened**. Completed or cancelled shares cannot be resent.* +> *You can only resend documents with a status of **Shared**. Completed or cancelled shares cannot be resent.* --- @@ -21,8 +18,8 @@ Resending allows you to: ## Step 1: Identify the document to resend -- In the **Status** column, look for the document marked as **Expired** or **Shared**. -- These are eligible for resending. +- In the **Status** column, look for the document marked as **Shared**. +- Only documents with this status are eligible for resending. Screenshot for Document @@ -30,16 +27,16 @@ Resending allows you to: ## Step 2: Set reminder and validity - Click **Resend** -- Resend popup shows up for setting validity and reminder. +- A pop-up window will appear, allowing you to configure the link validity period and set a reminder before resending. -Screenshot for Document +Screenshot for Document ## Step 3: View Audit Trail After Resend -- You can also verify the activity by clicking the **Audit** button. -- It displays timestamps and recipient details. +- YClick the **Audit** button to verify the document activity. +- The **audit trail** displays detailed timestamps and recipient information, including resend activity. -Screenshot for Document +Screenshot for Document --- @@ -47,10 +44,11 @@ Resending allows you to: | Condition | Action | Notes | |------------|---------|-------| -| Expired | Resend available | Must set new expiry date | -| Opened/Unopened | Resend available | Use same or updated email | +| Shared | Resend available | Must set new expiry date | +| Opened | Resend available | Use same or updated email | | Cancelled | Not allowed | Document link is deactivated | | Audit Trail | Always updated | Shows all resend activity | + --- diff --git a/docs/E_Sign/schedule-email.md b/docs/E_Sign/schedule-email.md new file mode 100644 index 0000000..8e8e8a0 --- /dev/null +++ b/docs/E_Sign/schedule-email.md @@ -0,0 +1,95 @@ +# How to Schedule an Email? + +The **Schedule Email** feature allows you to send a document at a specific date and time instead of sending it immediately. This is useful for planned approvals, contract releases, reminders, or time-sensitive communications. + +When to Use **Schedule Email** Use this feature when: +- The document must be delivered on a **future date**. +- You want to align document delivery with a **deadline** or **event**. +- The recipient should not receive the document immediately. +- You are preparing documents in advance. + +--- + +## Step 1: Open the E-sign Document + +1. Navigate to your **Document** section. +2. Select the appropriate file. +3. Build or configure the **E-Sign document** as required. +4. Click **Send** to proceed. + +Screenshot for Document + +--- + +## Step 2: Send the Document via Email + +- Enter the recipient’s **Name**. +- Provide the recipient’s **Email Address**. + +Screenshot for Document + +--- + +## Step 3: Confirm and Schedule + +5. Locate the Schedule Email option in the send settings. + +- Enable or toggle the Schedule option. + +Screenshot for Document + +6. Select the desired: + - Date + - Time +7. Click **Schedule & Send** to confirm and schedule the document for delivery. + +Screenshot for Document + +> Ensure the selected time zone is correct to avoid delivery delays. + +--- + +## After Scheduling + +- The document status may show as **Scheduled** until it is **sent**. +- You can edit or cancel the scheduled email before the scheduled time (if allowed). +- **Once the scheduled time arrives**, the document will be delivered automatically to recipients. + +Screenshot for Document + +> The email has been successfully scheduled for delivery. + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **video** demonstrates how to use the **Schedule E-Sign** feature in e-sign documents, providing a step-by-step walkthrough of scheduling a document for future delivery. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/E_Sign/self-sign-document.md b/docs/E_Sign/self-sign-document.md new file mode 100644 index 0000000..bebf857 --- /dev/null +++ b/docs/E_Sign/self-sign-document.md @@ -0,0 +1,72 @@ +# How to use self sign feature? + +The **Self Sign** feature allows you to quickly sign your own document without sending it to additional recipients. This is ideal for internal approvals, personal agreements, or any situation where only your signature is required. It provides a fast, secure, and legally compliant way to finalize documents independently. + +When to Use Self Sign? + +Use the Self Sign feature in the following scenarios: +- You are the only signer required for the document. +- No external recipients or additional approvals are needed. +- A legally binding electronic signature is required for personal or internal purposes. +- You need to quickly review and finalize a document without initiating a multi-party workflow. + +> This feature is ideal for **Single-User** signing processes where speed, simplicity, and compliance are essential. + +--- + +## Step 1: Navigate to the self sign document + +1. Navigate to the document and verify that its status is marked as **Pending**. +2. Open the **Action Menu** and click the **Sign** button to proceed with the signing process. + +**Screenshort 1** + +Screenshot for Document + +**Screenshort 2** + +Screenshot for Document + +--- + +## Step 2: Follow these steps to Self Sign + +3. An **Electronic Record & Signature Disclosure** pop-up will be displayed. + +- Review the disclosure carefully, then click **Continue** to proceed with the signing process. + +**Screenshort 3** + +Screenshot for Document + +4. Open the document and click on the **Signature** field. + +- A pop-up will appear, allowing you to either **type (write)** your signature or **draw** it manually. +- Choose your preferred option, apply the signature, and proceed with the signing process. + +**Screenshort 4** + +Screenshot for Document + +**Screenshort 5** + +Screenshot for Document + +5. Enter the required information into all mandatory fields within the document before proceeding with submission. + +**Screenshort 5** + +Screenshot for Document + +--- + +## step 4: After Submitting + +- A pop-up message will appear confirming **Submission Successful**. +- You can choose to view the signed document or download it as a ZIP file. + +Screenshot for Document + +**You have successfully completed the Self Sign process** + +> The **Self Sign** workflow operates within Doculan’s secure cloud environment, ensuring encrypted storage, controlled access, compliance support, and full traceability throughout the document lifecycle. diff --git a/docs/E_Sign/share-document.md b/docs/E_Sign/share-document.md index f9324df..69234a4 100644 --- a/docs/E_Sign/share-document.md +++ b/docs/E_Sign/share-document.md @@ -1,21 +1,17 @@  # How to Share a Document? -The **Share Document** feature in Doculan allows you to send any stored document to individuals or groups quickly and securely without requiring them to log in. -You can share for **review**, **reference**, or **collaboration**, while maintaining full control over access permissions. +The **Share Document** feature in Doculan enables you to quickly and securely send any stored document to individuals or groups—without requiring them to log in. +You can share documents for **review**, **reference**, or **collaboration** while maintaining full control over access permissions, ensuring both flexibility and security throughout the process. ---- - -## Overview - -The **Share** feature provides a simple way to send read-only access to any stored file directly from your dashboard. +The **Share** feature offers a simple and efficient way to provide read-only access to any stored file directly from your dashboard, ensuring secure and controlled document viewing. It is often used to: -- Share signed contracts or templates with clients. -- Send drafts for approval or feedback. -- Collaborate with colleagues without duplicating files. + +- Send draft documents for review or feedback before finalizing. +- Collaborate with colleagues without creating duplicate files. -> Note: Shared documents are temporary links; recipients can view or download only until access expires. +> Note: Shared documents are accessible through temporary links; Recipients can view or download the file only until the access period expires. --- @@ -26,7 +22,7 @@ It is often used to: - In the **Actions** column, click the **three-dot (⋮)** button beside the document you want to share. - From the dropdown menu, select **Share**. -Screenshot for Document +Screenshot for Document --- @@ -41,17 +37,17 @@ Once you click Share, a popup or side panel will appear with fields for: Screenshot for Document -- **Expiry Date:** Set how long the link should remain active. -- **Reminder:** Choose to send an email reminder before expiration. +- **Expiry Date:** Specify how long the shared link should remain active. +- **Reminder:** Optionally schedule an email reminder before the link expires. Screenshot for Document -- **Email body:** Add a personalized message for context. -- Optionally, click **AI Assist** to generate a professional message body for your email. +- **Email body:** Add a personalized message to provide context for the recipient. +- Optionally, click **AI Assist** to generate a professional and well-structured email message automatically. Screenshot for Document -- **Schedule Mail** Schedule the E-mail deilvery time for the recipient. +- **Schedule Mail** Set a specific date and time for the email to be delivered to the recipient. Screenshot for Document @@ -63,11 +59,12 @@ Once you click Share, a popup or side panel will appear with fields for: After sending: - Go back to your **Dashboard** and select the same folder. -- Check the **Status** column to view sharing status (e.g., *Shared*, *Opened*, *Expired*). +- Check the **Status** column to view sharing status (e.g., *Shared*, *Opened*). +- To verify the link’s validity period, review the **Expiry Date** displayed at the bottom of the **Audit Trail**. Screenshot for Document -- Click the **Audit** button to see complete tracking details — when it was sent, opened, or downloaded. +- Click the **Audit** button to view complete tracking details, including when the document was sent, opened, and downloaded. Screenshot for Document @@ -78,9 +75,9 @@ After sending: | Setting | Description | Notes | |----------|--------------|-------| | View Only | Recipients can view or download | Recommended for clients | -| Expiry | Auto-revokes access after set date | Can't be reopened | | Reminder | Sends email before expiry | Optional | | Audit Trail | Tracks every share action | Can be exported as report | + --- @@ -88,4 +85,35 @@ After sending: **You've successfully shared a document using Doculan's Share feature!** + **Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **Share Document** + © Doculan by [Virtualan Software](https://www.virtualan.io) diff --git a/docs/E_Sign/single-party-document.md b/docs/E_Sign/single-party-document.md index 376efea..504c100 100644 --- a/docs/E_Sign/single-party-document.md +++ b/docs/E_Sign/single-party-document.md @@ -1,23 +1,23 @@  # How to Send Single Party Document? -This guide explains how to send a **single party e-sign document** in Doculan, from preparing the document to sending, tracking, and completion. +This guide provides step-by-step instructions for sending a **single-party e-sign document** in Doculan, covering document preparation, configuration, delivery, tracking, and completion. -A **single party document** is a contract that requires only **one recipient** to sign. -Follow the steps below to configure and send it for e-signing. +A **single-party document** is a contract that requires the signature of only **one recipient**. +Follow the steps below to configure and send the document for electronic signing. --- -## Step 1: Create or Select a Document +## Step 1: Initiate and Upload the Document 1. From the **Dashboard**, click **Create Document**. -2. Choose or create a folder named **e-sign documents**. +2. Select an existing folder or create a new folder named **E-Sign Documents**. 3. Upload the document using the **Upload** button. Screenshot for Document 4. Click the **⋮ (three-dot)** icon under the **Actions** column. -5. We can also upload the document by selecting this **Upload** option from **Actions** column and choose your **contract file (PDF)**. +5. We can also upload the document by selecting this **Upload** option from **Actions** column and choose your **contract file (PDF Format)**. Screenshot for Document @@ -27,31 +27,31 @@ Once uploaded, you'll see your document listed in the folder view. ## Step 2: Open for E-Sign Configuration -1. In the document list, find your uploaded contract. -2. Under **Actions**, click the **⋮ (three-dot)** menu. +1. Locate the uploaded contract in the document list. +2. Under the **Actions**, click the **⋮ (three-dot)** menu for the selected document. 3. Select **E-Sign**. Screenshot for Document -This will open the **E-Sign Editing Page**, where you can define fields and assign them to the recipient. +You will be redirected to the E-Sign Configuration Interface, where signing fields and recipient roles are defined. --- -## Step 3: Configure Fields +## Step 3: Configure Signing Fields with Precision Click the **Fields** tab to access all available input elements. | Field Type | Description | |-------------|-------------| -| **Signature** | For the recipient to sign. | -| **Date** | Auto-fills with current date or allows manual entry. | -| **Text / Textarea** | Collect text-based inputs. | -| **Email / Number** | Capture contact details. | -| **Checkbox / Dropdown** | For selections or acknowledgements. | -| **Attachment** | Recipient uploads supporting files. | -| **Initial** | For initials beside key clauses. | - -
+| **Signature** | Allows the recipient to provide a digital signature. | +| **Date** | Auto-populates with the current date or allows manual entry. | +| **Text / Textarea** | Captures text-based information. | +| **Email / Number** | Collects contact details. | +| **Checkbox / Dropdown** | Enables selections or acknowledgments. | +| **Attachment** | Allows the recipient to upload supporting documents. | +| **Initial** | Captures initials beside specific clauses. | + +
Steps to Add Fields 1. Drag and drop the required fields (e.g., Signature, Date) into the document. @@ -62,42 +62,49 @@ Click the **Fields** tab to access all available input elements.
-Screenshot for Document +Screenshot for Document ---- - -## Step 4: Add Party Details + > *Since this is a single-party document, you do not need to add more parties.* --- -## Step 5: Send Mail +## Step 4: Execute Delivery – Send for Signature -Click **Send Mail** to send the document for signing. +Click **Send Mail** to initiate the signing process. -You'll now configure email delivery. ### Email Setup: 1. Select **Single Mail**. -2. Enter the recipient's **Name** and **Email ID**. +2. Enter the recipient's **Name** and **Email Address**. Screenshot for Document -3. Choose an **Expiry Date** and **Reminder Options**. +3. Move the recipient details to arrange them in the **desired signing order**. + +Screenshot for Document + +4. Choose an **Expiry Date** and **Reminder Options**. Screenshot for Document -4. Write the email message manually **or** use **AI Assist** to generate it. -5. Drag and drop the **document link** placeholder into the message body. -6. Click **Send Mail**. +Under **Security Settings**, We have to enable only the following options: +- **OTP Verification** +- **Certificate** + +Screenshot for Document + +5. Write the email message manually **or** use **AI Assist** to generate it. +6. Drag and drop the **document link** placeholder into the message body. +7. Click **Send Mail**. Screenshot for Document @@ -105,7 +112,7 @@ You'll now configure email delivery. --- -## Step 6: Track and Manage the Document +## Step 5: Track and Manage the Document After sending, navigate to your folder and click your document. @@ -128,7 +135,7 @@ You'll see: Screenshot for Document -All timestamps and audit logs are recorded for compliance and traceability. +> All timestamps and audit logs are recorded for compliance and traceability. ### Actions Available | Action | Description | @@ -145,7 +152,7 @@ All timestamps and audit logs are recorded for compliance and traceability. --- -## Step 7: Recipient Experience +## Step 6: Recipient Signing Experience When your recipient receives the email: @@ -160,6 +167,7 @@ When your recipient receives the email: - Fill in required details. - Click inside the **Signature Field** to sign. + Screenshot for Document ### Signature Options @@ -171,29 +179,35 @@ When your recipient receives the email: --- -## Step 8: AI Assist for Recipients +## Step 7: AI Assist for Recipients -Recipients can also click **AI Assist** during signing to ask questions about the contract's contents. -The AI will respond contextually, it does **not** handle general queries. +During the signing process, recipients may use **AI Assist** to ask questions related to the contract’s content. +The AI provides contextual assistance specific to the document and does not respond to general queries. + +Screenshot for Document --- -## Step 9: After Submission +## Step 8: After Submission -If the recipient declines: + +- A pop-up appears as **Submission Successfull** +- You can either view the document or download the document as zip file. + +Screenshot for Document + - A **Certificate of Completion** is generated. - The signed PDF is **SSL certified**. - Copies are sent to both sender and recipient via email. - The document status changes to **Completed**. -Screenshot for Document Screenshot for Document @@ -204,4 +218,35 @@ If they complete: **Congratulations!** You have successfully configured and sent a **single-party e-sign document** using **Doculan**. +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **Create an E-Sign Document and Send to Recipient**. + © Doculan by [Virtualan Software](https://www.virtualan.io) diff --git a/docs/E_Sign/update-template.md b/docs/E_Sign/update-template.md index 6a44717..2850f23 100644 --- a/docs/E_Sign/update-template.md +++ b/docs/E_Sign/update-template.md @@ -1,8 +1,8 @@  # How to Update a Template? -Updating a template in **Doculan eSign** allows you to modify existing layouts, fields, or signer configurations, without having to recreate them from scratch. -It's perfect when your contracts evolve or you want to add new terms or fields to an existing format. +Updating a template in **Doculan eSign** enables you to refine existing document layouts, adjust field placements, or modify signer configurations without recreating the template from the beginning. +It’s ideal when your contracts evolve or when you need to add new terms or fields to an existing format, ensuring your templates stay current and adaptable. --- @@ -12,15 +12,15 @@ It's perfect when your contracts evolve or you want to add new terms or fields t Screenshot for Document -- From the dropdown list, select the template you wish to modify. +- From the template dropdown list, select the template you wish to modify. Screenshot for Document -- The saved layout (fields, parties, and configurations) will automatically load. +- The saved configuration — including fields, parties, and layout settings — will load automatically into the editor. Screenshot for Document -> **Tip:** If your desired template isn't visible, click **Refresh** or reload the page to sync template data. +> **Tip:** If the template does not appear in the list, click Refresh or reload the page to synchronize the latest data. --- @@ -56,7 +56,7 @@ It's perfect when your contracts evolve or you want to add new terms or fields t ## Step 2: Save the updated configuration back to the template: -Now that your fields and parties are updated, let's save the new version. +After making the necessary modifications to fields, party roles, or layout structure, you must save the updated version. 1. Click the **Save E-Sign** button. @@ -82,9 +82,16 @@ Example: ## Step 3: Verify your updated template: -- Return to the **Template** dropdown and search for your updated version. -- Select it to ensure all recent changes (fields, parties, layout) are correctly loaded. -- Optionally, send a test document using this updated template to confirm it works as intended. +To confirm that your changes were successfully saved: + +- Return to the Template dropdown. +- Search for the updated template name. +- Select the template to verify: + - Field placements + - Party configurations + - Layout adjustments + +For additional assurance, you may send a test document using the updated template to confirm that all elements function as expected. --- @@ -92,6 +99,37 @@ Example: **You've successfully updated your eSign Template!** -Your team can now reuse the latest version seamlessly across all document workflows. +> Your team can now reuse the latest version seamlessly across all document workflows. + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **Update Template** © Doculan by [Virtualan Software](https://www.virtualan.io) diff --git a/docs/E_Sign/variable-fields.md b/docs/E_Sign/variable-fields.md new file mode 100644 index 0000000..1856483 --- /dev/null +++ b/docs/E_Sign/variable-fields.md @@ -0,0 +1,157 @@ +# How to use Variable field? + +The **Variable Field** feature allows you to create reusable dynamic placeholders within a document. These placeholders automatically populate the same value wherever they appear, eliminating the need to enter repetitive information multiple times. + +Variable fields improve efficiency, accuracy, and consistency—especially in contracts, agreements, and form-based documents. + +--- + +## Step 1: Access the Variable Registry + +1. Navigate to the **Doculan Dashboard**. + +Screenshot for Document + +2. From the main menu, click **Variable Registry** to access the centralized repository of **Global Variables**. + +Screenshot for Document + +> This section allows you to create, manage, and maintain reusable variable resources across your documents. + +--- + +## Step 2: Configure the Variable Registry + +3. Click the **Create Variable** button in the top-right corner to add a new variable. + +A pop-up window will appear prompting you to: +- Select the appropriate **Scope**. +- Choose the previously created **Variable** from the list. +- Select the appropriate **Field Type**, then enter the required **Label** and **Value** as needed.
+Ensure all information is accurate before saving, as the entered value will apply according to the selected scope. + +Screenshot for Document + +4. Click **Save** to apply and store the new variable. + +Screenshot for Document + +> Once configured, the variable field will be properly linked and ready for use within the document. + +--- + +## Step 3: Add a Required Variable Field + +5. Drag and drop the **Required Field** into the document at the desired location. + +6. Click on the inserted field to open the **Settings** panel.
+- A pop-up window will appear prompting you to: + - Enable the **Variable option** and manually assign the **Variable Field**. + - Select the appropriate **Scope**. + - Choose the required **Variable** from the Variable Details list. + - Select the relevant **Label** for the field. + +Screenshot for Document + +Screenshot for Document + + +
+ Select the Required Scope + +Select the required Scope based on your use case: + +* **Global** – Applies the variable value across the entire document (and wherever the same global variable is used). +* **Current** – Applies the value only to the selected field instance without affecting other variables. + +
+ +> Choose the appropriate scope to control how and where the variable value is applied. + +--- + +## Step 4: Using the "Current" Scope in a Field + +7. To apply a value only to a specific field instance: + +- Assign another **Variable Field** and access its **Settings panel**. +- Select the **Scope** as **Current**. +- Enter the relevant **Label Name** for the field. + +Screenshot for Document + +8. During the sending process, the **Variable Registry** will open automatically. +- Enter the **current variable value** in the **Variable Registry** and review the **variable field details** to ensure the correct information is applied. + +Screenshot for Document + +> The value entered will update according to the selected scope rules. + +--- + +## Step 5: Recipient Signing Experience + +9. When your recipient receives the email: + +- They click the **document link** in the email. +- Predefined variable values will be automatically populated throughout the document. + +Screenshot for Document + +- The recipient is required to complete only the **signature field**, as all other details have been pre-populated using **variable fields**. + +Screenshot for Document + +- For the second recipient, only the signature field requires completion, since all other details have been pre-populated through variable fields.” + +Screenshot for Document + +> These **Variable Fields** are used to predefine and manage consistent values within a document. + +--- + +## Step 6: After Submission + +- A confirmation pop-up message will appear indicating that the **submission was successful**. +- You may then choose to view the signed document or download it as a ZIP file. + +Screenshot for Document + +**The document has been successfully signed using the configured variable fields.** + +> They allow you to set a value once and automatically apply it wherever the same variable appears, ensuring accuracy, reducing repetition, and maintaining consistency throughout the document. + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **video** demonstrates how to use the **Variable Field** feature in e-sign documents, providing a clear step-by-step walkthrough on how to create, configure, and apply variable fields within a document. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Embedded-Esign/EmbdedEsign.md b/docs/Embedded-Esign/EmbdedEsign.md new file mode 100644 index 0000000..a537e46 --- /dev/null +++ b/docs/Embedded-Esign/EmbdedEsign.md @@ -0,0 +1,130 @@ +# How to use Embedded Esign? +It allows users to **embed the E-Sign** process directly within forms, enabling recipients to **review and sign documents without leaving the form workflow**.This creates a seamless and intuitive signing experience while **securely capturing signed documents** and automatically storing completed forms in **Doculan Storage**.
+This section explains how to configure and use **E-Sign Embedded** within Forms in Doculan. + +--- + +### Step 1: Creating a Form with E-Sign Embedded + +1. Navigate to the **Doculan Dashboard**. +2. Click **Forms**. +3. Click **Create New Form**. +4. Enter the **Form Title** and **Form Description**. +5. Select the **folder path** to store submitted form data. +6. Drag and drop the required form fields. +7. Add the **E-Sign Embedded** field. +8. Provide a **Label Name** for the field. +9. Attach a **Document**. +10. Select the **Template Type**: + - **Myself** + - **Team** +11. Attach the required **Template**. + +**Screenshot 1** + +PDF Scrolling + + +> The above **Screenshot** represent that **Creating a Form with E-Sign Embedded** + +--- + +### Step 2: Configuring Recipient and Security Settings + +1. Add the recipient’s **Email ID** and **Name**. +2. Set the **Validity Date** and **Reminder**. +3. Under **Security Settings**, enable and configure **OTP Verification** for secure access. + +> **Note:** You may disable OTP Verification if required, but enabling this option is considered a best practice. + +--- + +### Step 3: Send and Fill the Form + +1. Enter the **Email Subject** and **Email Body**, ensuring the message clearly communicates the purpose of the document. +2. Click **Send** to deliver the email to the recipient. + +The recipient will receive the email and open the form using **OTP Verification**. + +The recipient can: +- Fill in the required form fields. +- Click **Open & Sign Document** to proceed with the embedded e-sign process. + +**Screenshot 2** + +PDF Scrolling + +> The above **Screenshot** represent that **Send and Fill the Form** + +--- + +### Step 4: Completing the E-Sign Process + +1. The document will open. +2. Complete the required fields and apply your **E-Sign** in the designated areas. +3. Click the **Submit** button to finalize the signing process. + +The **E-Sign Document** will be submitted successfully. + +You can: +- View the signed document +- Download the **ZIP file** to your local system for record-keeping. + +--- + +### Step 5: Submitting the Form + +1. After completing the E-Sign process, return to the **Forms** page. +2. In the **Agreement (E-Sign Embedded Field)**, click the **Refresh** button. +3. The status will change from **Pending** to **Signed**. + +**Screenshot 3** + +PDF Scrolling + +> The above **Screenshot** represent that **Submitting the Form** + +4. Click **Submit Form**. +5. The completed form will be stored in **Doculan Storage**. + +**Screenshot 4** + +PDF Scrolling + +> The above **Screenshot** represent that **Form Successfully Submitted in Doculan Storage** + +--- + + +**Demo Video:** + + + +
+ + +
+ +The above **Video** represent that how to **Create an Form with Embedded E-Sign Document**. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Forms/Form-Delete.md b/docs/Forms/Form-Delete.md index 0b94d5a..e8c208c 100644 --- a/docs/Forms/Form-Delete.md +++ b/docs/Forms/Form-Delete.md @@ -1,11 +1,20 @@ +# How to Delete Form? + +This guide explains how to **delete a form in Doculan**. A form can only be deleted if it has **no linked recipients or submissions**.
+To delete a form, navigate to the **Forms** section, open the Actions menu, and select **Delete** to permanently remove it. A confirmation pop-up will appear, allowing you to review and verify the action before final deletion.
+This process ensures that only unused or draft forms are safely removed from the system, maintaining data integrity and compliance. + +--- + ## **Step:1 Navigate to Delete the Form** - Forms can be deleted **only if no recipients are linked** -> Forms with recipients or submissions **cannot be deleted** -- Go to **Dashboard → Forms** -- Click **Action → Delete** +- Navigate to the **Doculan Dashboard** and click **Forms.** +- Locate the **form** and click the **⋮ (three-dot) icon** under the Actions column. +- Click **Delete.** + -**Screenshot1:** +**Screenshot 1:** Step 1 — Delete the Form @@ -17,8 +26,8 @@ A confirmation popup appears with details. _“Are you sure you want to delete this form ? This action cannot be undone.”_ - Click **Permenantly Delete** button to proceed. -**Screenshot2:** +**Screenshot 2:** Step 2 — Delete the Form ---->The above **Screenshots** represents that how to **Delete Form.** +> The above **Screenshots** represents that how to **Delete Form.** diff --git a/docs/Forms/Form_Cancel.md b/docs/Forms/Form_Cancel.md index 4f96662..7feb15f 100644 --- a/docs/Forms/Form_Cancel.md +++ b/docs/Forms/Form_Cancel.md @@ -1,12 +1,21 @@ +# How to Cancel Form? + +This guide explains how to **cancel a form in Doculan** when it is **no longer required**. It walks you through navigating to the form, initiating the cancellation, confirming the action, and reviewing the audit trail for tracking purposes.
+This process ensures you can safely stop a form workflow with full transparency and maintain a complete record of activity. + +--- + + ## **Step 1: Navigate to Cancel the Form** -- Status must be **Sent** -- Go to **Dashboard → Forms** -- Click **Action → Cancel** +- The form status must be **sent** to proceed with cancellation. +- Navigate to the **Doculan Dashboard** and click **Forms.** +- Locate the **form** and click the **⋮ (three-dot) icon** under the Actions column. +- Click **cancel** to stop the form workflow. -**Screenshot1:** +**Screenshot 1:** -Step 1 — Cancel the Form +Step 1 — Cancel the Form --- @@ -14,29 +23,31 @@ ## **Step 2: Confirm the Cancellation** -A confirmation popup appears with details. -- Review the message: - _“Are you sure you want to cancel this form ? This action is irreversible.”_ -- Click **Confirm** to proceed. +A confirmation pop-up will appear with the cancellation details. +- Review the message carefully: + _“Are you sure you want to cancel this form ? This action is irreversible.”_ +- Click **Confirm** to proceed with the cancellation. Step 2 — Cancel the Form ---> Check the **status** after the form is **cancelled.** +> Check the **status** after the form is **cancelled.** Step 3 — Cancel the Form --->The above **Screenshots** represents that How to **cancel the Form.** +>The above **Screenshots** represents that How to **cancel the Form.** --- # **Step 3: Audit Trail** -- Click **Audit Button** -- Check the timesheet from the audit trail. +- Navigate to the **Doculan Dashboard and click Forms.** +- Locate the required **form** and click the **⋮ (three-dot) icon** under the **Actions column.** +- From the Actions menu, you can perform the following operations: +- **Audit** – View the detailed activity log and timeline from the audit trail. Step 4 — Cancel the Form --->The above **Screenshot** represent that **Audit Workflow of Cancel Form.** +>The above **Screenshot** represent that **Audit Workflow of Cancel Form.** diff --git a/docs/Forms/Form_Clone.md b/docs/Forms/Form_Clone.md index d7c2618..4c920ec 100644 --- a/docs/Forms/Form_Clone.md +++ b/docs/Forms/Form_Clone.md @@ -1,27 +1,73 @@ +# How to Clone Form? + +Cloning a form in **Doculan** allows you to **instantly duplicate an existing form** and **reuse its structure without rebuilding** it from scratch. After cloning, you can review and modify the **details**, **add recipients**, and send it just like a new form.
+This feature streamlines recurring form workflows, saving time while ensuring consistency and efficiency. + +--- + ## **Step1: Navigate to Clone the Form** -- Go to **Dashboard → Forms** -- Click **Action → Clone** -- Review & click **Send Form** -- Add recipients again and send -- All the steps are same as like Create and Send Form, As we already seen in [How to Create and Send Forms ](Form_Create.md) +- Navigate to the **Doculan Dashboard** and click **Forms.** +- Locate the **required form** and click the **⋮ (three-dot) icon** under the Actions column. +- Click **Clone** and form will be cloned +- Review the cloned form and click **Send Form**. +- Add **recipients again and send** +- All the steps are same as like Create and Send Form, As we already seen in [How to Create and Send Forms?](Forms/Form_Create.md) -> Forms can be cloned even if they are **Completed, Cancelled, Resent, or Expired** +> Forms can be cloned even if their status is **Completed, Cancelled, Resent, or Expired**. -**Screenshot1:** +**Screenshot 1:** Step 1 — Clone the Form - The above **Screenshot** represent that how to **Clone Form.** +> The above **Screenshot** represent that how to **Clone Form.** --- # **Step 2: Audit Trail** -- Click **Audit Button** -- Check the timesheet from the audit trail. +- Navigate to the **Doculan Dashboard and click Forms.** +- Locate the required **form** and click the **⋮ (three-dot) icon** under the **Actions column.** +- From the Actions menu, you can perform the following operations: +- **Audit** – View detailed submission logs and the complete activity history. + +**Screenshot 2:** + +Step 2 — Clone the Form + +The above **Screenshot** represent that **Audit Workflow of Clone Form.** + +--- + + **Demo Video:** + + + +
+ + +
-**Screenshot2:** -Step 2 — Clone the Form +> The above **Video** represent that how to **Clone the form**. -The above **Screenshot** represent that **Audit Workflow of Clone Form.** \ No newline at end of file +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Forms/Form_Create.md b/docs/Forms/Form_Create.md index 49f1e7e..795fc19 100644 --- a/docs/Forms/Form_Create.md +++ b/docs/Forms/Form_Create.md @@ -1,10 +1,16 @@ -## **Step 1: Create the Form** +# How to Create and Send Forms? -- Go to the **Forms** page. -- Upload a **logo** (optional). -- Enter **Form Title** and **Form Description**. -- Select the **folder path** to store submitted data. -- Drag and drop required fields: +This guide explains the complete process of **creating a form, sending it to users, capturing their submissions, and reviewing the collected data**.
+Follow the step-by-step instructions to efficiently create, send, manage, and analyze your form data within the system. +--- + +## **Step 1: Navigate to Create the Form** + +- Navigate to the **Doculan Dashboard**. Click **Forms** from the main menu. +- Click **Create New Form** to manually design a form, or select **Generate with AI** to automatically create a form using **AI** assistance. +- For manual form creation, click the **Create New Form** button to proceed. +- We have to Upload a **logo** (optional). Enter **Form Title** and **Form Description**. +- Select the **folder path** to store submitted data. Drag and drop required fields: | Field Type | Description | |------------------|-------------| @@ -14,73 +20,82 @@ | Date | Date selection | | Radio Buttons | Single-choice option | | File Upload | Upload documents/images | +| Signature | Digital Signature Capture | +| E-Sign Embed | Embedded Signing Experience | ### File Upload Options: - Accepted file types - Maximum file size (MB) - Allow multiple files -**Screenshot1:** +**Screenshot 1:** Step 1 — Create the Form -**Screenshot2:** +**Screenshot 2:** Step 2 — Create the Form ----> The above **Screenshots** represent that how to create **form** +> The above **Screenshots** represent that how to create **form** -# **Step 2: Send the Form** +# **Step 2: Navigate to Send the Form** -- Click **Send Form** -- Add **recipient name & email** -- Set **validity date** & **reminders** -- Drag & drop the **form link** into the email body -- Click **Send** - -**Screenshot1:** +- Click **Send Form**. +- Enter the recipient’s **name** and **email address**. +- Set the **validity date** and configure any **reminders**, if required. +- Drag & drop the **Form link** and **Fullname** placeholders into the email body +- Click **Send** to deliver the form to the recipient. +**Screenshot 1:** Step 1 — Send the Form -**Screenshot2:** +**Screenshot 2:** Step 2 — Send the Form ----> The above **Screenshots** represent that how to send **form.** +> The above **Screenshots** represent that how to send **form.** -# **Step 3: Recipient Submission** +# **Step 3: Navigate to Recipient Submission** -- Recipient receives form link by email -- Complete **OTP verification** +- The recipient receives the form link via email. +- Complete the **OTP verification** process to access the form. - Fill required fields and click **Submit** -- Recipient can **preview & download PDF** after submission +- After submission, the recipient can preview and download the PDF copy of their response. -**Screenshot1:** +**Screenshot 1:** Step 1 — Recipient Submission -**Screenshot2:** +**Screenshot 2:** + +Step 1 — Recipient Submission -Step 2 — Recipient Submission +**Screenshot 3:** +Step 2 — Recipient Submission ----> The above **Screenshots** represent that how to Complete **otp verification** and **fill the form** and download the responses in **PDF Format** -# **Step 4: Review Submissions** +> The above **Screenshots** represent that how to Complete **otp verification** and **fill the form** and download the responses in **PDF Format** + +# **Step 4: Navigate to Review Submissions** +To review and manage form submissions in Doculan, follow the steps below: - Form status changes to **Completed** -- Navigate: **Dashboard → Forms** -- View actions under **Actions menu**: - - **Audit** – view submission logs - - **View** – check individual submission -- **Download all submissions as CSV** +- Navigate to the **Doculan Dashboard** and click **Forms.** +- Locate the required form and click the **⋮ (three-dot) icon** under the **Actions** column. +- From the Actions menu, you can perform the following operations: + - **Audit** – View detailed submission logs and activity history. + - **View** – Review individual form submissions. +- Download all form submissions in **CSV format** for reporting or offline analysis. -**Screenshot1:** +**Screenshot 1:** Step 1 — Review Submissions ----> The above **Screenshot** represent that how to view the Submission form through **Audit.** +> The above **Screenshot** represent that how to view the Submission form through **Audit.** + +--- **Demo Video:** @@ -102,13 +117,15 @@
-
----> The above **Video** represent that how to **Create form, Send form, Recipient Submission, Review Submissions.** \ No newline at end of file +> The above **Video** represent that how to **Create form, Send form, Recipient Submission, Review Submissions.** + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Forms/Form_Document_Storage.md b/docs/Forms/Form_Document_Storage.md index ac59745..818319b 100644 --- a/docs/Forms/Form_Document_Storage.md +++ b/docs/Forms/Form_Document_Storage.md @@ -1,53 +1,60 @@ -# **Navigate to view Submitted Form with Attachments** +# How do view Submitted Form with attachments? -## **Step1: Navigate to view Single Submitted Form with Attachment** +This guide explains **how to access single submissions, overall form responses, and specific recipient details**. You can quickly view, download, and manage all attachments stored securely in Doculan Storage. + +--- + +## **Step 1: Navigate to view Single Submitted Form with Attachment** - All forms and files are stored in the **Doculan Storage** - You can **view, download, and print** submissions(Forms) & attachments(pdf, word, etc...) -- Go to **Dashboard → Forms** -- Click **Action → Details** -- We can see the Submitted Form with their Attachment +- Navigate to the **Doculan Dashboard** and click **Forms.** +- Locate the required form and click the **⋮ (three-dot) icon** under the **Actions column.** +- We have to click **Details**, then +- We can see the **Submitted Form with their Attachment.** -**Screenshot1:** +**Screenshot 1:** Step 1 — view all Docs -**Screenshot2:** +**Screenshot 2:** Step 1 — view all Docs ----> The above **Screenshots** represent that how to **View Single Submitted Form with Attachment.** +> The above **Screenshots** represent that how to **View Single Submitted Form with Attachment.** -## **Step2: Navigate to view Overall Submitted Form with Attachments** +## **Step 2: Navigate to view Overall Submitted Form with Attachments** -- Go to **Dashboard → Forms** -- Click **Action → Details** -- We can see the Submitted Forms with their Attachments +- Navigate to the **Doculan Dashboard** and **click Forms.** +- Locate the required **Primary form** and click the **⋮ (three-dot) icon** under the Actions column. +- We have to click **Details**, then +- We can see the **Submitted Forms with their Attachments.** -**Screenshot1:** +**Screenshot 1:** Step 2 — view all Docs -**Screenshot2:** +**Screenshot 2:** -Step 2 — view all Docs +Step 2 — view all Docs ----> The above **Screenshot** represent that how to **View all Overall Submitted Forms with Attachments.** +> The above **Screenshot** represent that how to **View all Overall Submitted Forms with Attachments.** -## **Step3: Navigate to view Specific Recipient in Overall Submitted Forms with Attachments** +## **Step 3: Navigate to view Specific Recipient in Overall Submitted Forms with Attachments** -- Go to **Dashboard → Forms** -- In **Specific Recipient** Form, then Click **Action → Details** +- Navigate to the **Doculan Dashboard and click Forms.** +- Locate the **Specific Recipient form** and click the **⋮ (three-dot) icon** under the **Actions column.** +- We have to click **Details**, then - We can see the **Specific Recipient's Submitted Form with their Attachment** -**Screenshot1:** +**Screenshot 1:** Step 2 — view all Docs -**Screenshot2:** +**Screenshot 2:** Step 2 — view all Docs ----> The above **Screenshot** represent that how to **View Specific Recipient in Overall Submitted Forms with Attachments.** \ No newline at end of file +> The above **Screenshot** represent that how to **View Specific Recipient in Overall Submitted Forms with Attachments.** \ No newline at end of file diff --git a/docs/Forms/Form_Resend.md b/docs/Forms/Form_Resend.md index cf48866..e676a6c 100644 --- a/docs/Forms/Form_Resend.md +++ b/docs/Forms/Form_Resend.md @@ -1,24 +1,33 @@ -## **Step1: Navigate Resend the Form** +# How to Resend Form? -- Go to **Dashboard → Forms** -- Click **Action → Resend** +This guide helps to **resending a form** allows you to issue a fresh access link to recipients, especially useful when the previous form has expired or not been completed. From the Forms dashboard, selcting resend to trigger a new notification email. You can also review the complete resend history through the Audit Trail for transparency and tracking. This ensures the form reaches recipients again without creating a new submission. + +--- + +## **Step 1: Navigate to Resend the Form** + +- Navigate to the **Doculan Dashboard** and click **Forms.** +- Locate the **form** and click the **⋮ (three-dot) icon** under the Actions column. +- Click **Resend**, then - Recipient receives a new access email -> Useful for **expired forms** +- Useful for **expired forms** -**Screenshot1:** +**Screenshot 1:** Step 1 — view all Docs ----> The above **Screenshot** represent that how to **Resend Form.** +> The above **Screenshot** represent that how to **Resend Form.** # **Step 2: Audit Trail** -- Click **Audit Button** -- Check the timesheet from the audit trail. +- Navigate to the **Doculan Dashboard and click Forms.** +- Locate the required **form** and click the **⋮ (three-dot) icon** under the **Actions column.** +- From the Actions menu, you can perform the below operations: +- **Audit** – We can check the timesheet from the audit trail. -**Screenshot2:** +**Screenshot 2:** Step 2 — view all Docs - The above **Screenshot** represent that **Audit Workflow of Resend Form.** +> The above **Screenshot** represent that **Audit Workflow of Resend Form.** diff --git a/docs/Library_Management/Library.md b/docs/Library_Management/Library.md new file mode 100644 index 0000000..207f768 --- /dev/null +++ b/docs/Library_Management/Library.md @@ -0,0 +1,139 @@ +## Doculan Library + +The **Doculan Library** serves as a centralized and well-structured repository where all **Document templates** and **Form templates** are securely stored, organized, and managed within the Doculan platform. It serves as a unified source of truth for your organization, promoting consistency, standardization, and operational efficiency across all document and form workflows. + +By utilizing the Library, users can efficiently locate and reuse templates, reduce duplication, and ensure consistency across document creation and form-driven workflows. This structured approach enhances productivity while maintaining standardized formats throughout the organization. + +--- + +## Step 1: Access the Library + +1. Navigate to the **Doculan Dashboard**. +2. From the main menu, click **Library** to access the centralized repository of templates and resources. + +**Screenshot 1** + +PDF Scrolling + +**Screenshot 2** + +PDF Scrolling + +> The above **screenshots** represent that **Access the Library** within the platform. + +--- + +## Step 2: View and Copy Library Documents + +3. The **Library – Documents** page is displayed, listing all available documents. +4. In the **Actions** column, click the **⋮ (three-dot)** icon next to the required document. +5. Select **Copy** to create a duplicate of the selected Library document. + +**Screenshot 2** + +PDF Scrolling + +> The above **Screenshot** represent that **Copy the Document**, showing how the selected document is duplicated from the Library for further use. + + +6. A Document & Template Viewing pop-up is displayed, allowing you to carefully review the document and template details before proceeding. + +PDF Scrolling + +> The above **screenshot** represent the **Viewing the Document** step, how to open and review the document to ensure all content, fields, and details are clear and accurate. + +--- + +## Step 3: Confirm Disclaimer + +7. An **Important Disclaimer** popup window will appears: + - Click **I Understand** to acknowledge the notice and proceed with the action. + +PDF Scrolling + +> The above **screenshot** illustrates the **Important Disclaimer** pop-up, prompting the user to acknowledge the notice before proceeding with the action. + +--- + +## Step 4: Select Storage Location + +8. Select the appropriate folder location in **Doculan Storage** where the copied document should be saved, ensuring it is stored in the correct directory for future access and workflow management. + +**Screenshot 3** + +PDF Scrolling + +> The above **Screenshot** represent that **Select Destination Location**, where you choose the appropriate folder in **Doculan Storage** to save the copied document. + +--- + +## Step 5: Provide Document Details + +9. Enter the **Document Name** and **Template Name**, then click **Copy** to complete the duplication process and save the document to the selected location. + + +**Screenshot 4** + +PDF Scrolling + +> The above **Screenshot** represent that the **Document and Template Details**, providing a clear view of the document information, associated template settings, and related configuration data. + +--- + +## Step 6: Document Saved Successfully + +10. The copied Library document is successfully saved in the following locations: + +- **Document Storage** +- **My Templates Storage** + +You can now access, edit, and use the duplicated document from these locations as needed for your workflows. + +**Screenshot 5** +PDF Scrolling + +> The above **Screenshot** represent that the document has been successfully saved in **Document Storage**, where it can be accessed, managed, and used for future workflows. + + + + +**Screenshot 6** + +PDF Scrolling + +> The above **Screenshot** represent that the template has been successfully saved in **Template saved in My Templates Storage**, confirming that it is now available for future use. + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **access the library documents and templates** within the platform, guiding you through the steps to locate and use them efficiently.. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Notes_Taker/notes_taker.md b/docs/Notes_Taker/notes_taker.md new file mode 100644 index 0000000..24446da --- /dev/null +++ b/docs/Notes_Taker/notes_taker.md @@ -0,0 +1,145 @@ +# How to Use the Note Taker Option? + +The **Note Taker** feature allows you to record a session and automatically generate note and a detailed summary. It helps capture discussions, meetings, or spoken content and converts them into structured note for easy review and sharing. + +Using the **Note Taker**, you can: + +- Record a **session in real time**. +- Automatically generate note from spoken content. +- Edit note during the session. +- Generate a detailed session summary. +- Download the summary as a **PDF**. +- Send the summary for **E-Sign**. + +--- + +## Step 1: Open Note Taker + +1. Navigate to the **Menu**. +2. Click **Note Taker → Recorder**. + +Screenshot for Document + +--- + +## Step 2: Start a Recording Session + +1. Click Ready to **Record**. + +Screenshot for Document + +2. Enter the **Session Name**. + +Screenshot for Document + +3. Click **Start Recording**. + +Screenshot for Document + +> The recording session will begin. + +--- + +## Step 3: Capture Note + +- The **Note Taker** records the content **one sentence at a time**. +- Note are automatically generated as you speak. +- The Taker Note are **editable during the session**. +- You can **pause the session** to make edits if needed. + +Screenshot for Document + +--- + +## Step 4: Stop and Generate Summary + +1. Once the session is complete, click **Stop & Generate Summary**. +2. The system will automatically generate a **detailed summary** of the session. + +Screenshot for Document + +> The generated summary is also **editable**. + +--- + +## Step 5: Download the Summary + +1. Go to the **top-right corner**. +2. Click the **PDF icon**. + +> The summary will be generated and downloaded to your device. + +--- + +## Step 6: Send the Summary for E-Sign + +1. Return to the Summary page. + +Screenshot for Document + +2. Click the **E-Sign icon**. +3. Enter the file name and **click Continue**. + +Screenshot for Document + +4. Select the folder to **upload the file**. + +Screenshot for Document + +Screenshot for Document + +> You will then be **redirected to the E-Sign process** where you can add fields and send the document to recipients. + +--- + +## Step 7: View Session History + +1. Go to the **Menu**. +2. Select **Note Taker → History**. + +Here you can: + +- View the session status. +- Click the Resume icon to continue a pending session. +- Click the Delete icon to remove unwanted sessions. + +Screenshot for Document + +You have successfully created the document using the **Note Taker**. + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **video** demonstrates how to **using the Note Taker option in the Doculan AI**. + + +© Doculan by [Virtualan Software](https://www.virtualan.io) + diff --git a/docs/README.md b/docs/README.md index 005d361..b811730 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,104 +1,118 @@ -# Doculan — Document Management & E-Signature +# Doculan — Smart Document Management & E-Signature Platform -> Smart, secure document management with e-signing and AI-powered document tools. -> 14-day free trial available for all plans. ([doculan.ai][1]) +> Secure, AI-powered document management, form automation, and legally compliant e-signatures — all in one platform. +> ✅ 30-day free trial available for all plans — https://www.doculan.ai --- -## Hero +## 🚀 Product Overview -**Doculan** — Streamline document workflows, search smarter with OCR and AI, and collect legally binding e-signatures — all in one secure platform. +**Doculan** helps individuals and teams to securely manage documents, streamline workflows, design intelligent forms, and capture legally binding e-signatures—complete with comprehensive audit trails for full transparency and compliance. -* Fast document upload (PDF, DOCX, images) -* Built-in e-signature flow for approvals and signatures -* AI / OCR search and metadata auto-fill to find documents instantly -* Role & access controls, versioning, secure cloud storage. ([doculan.ai][1]) - -**Get started** — 14-day free trial, no hidden fees. ([app.doculan.ai][2]) +From seamless document uploads to AI-powered form detection and advanced PDF comparison, Doculan delivers exceptional speed, precision, and compliance—all within a secure, enterprise-grade cloud environment. --- -## Key Features +## ✨ Key Capabilities + +### 📁 Document Management +- Upload, organize, tag, and manage version-controlled documents with ease. +- Store files securely in the cloud with role-based access control. +- Maintain complete document history with detailed version tracking and audit visibility. -### Document Management +### ✍️ E-Signature & Audit Trails +- Create signable documents and send them for signature with ease. +- Capture legally binding digital signatures with secure timestamps. +- Maintain complete audit logs for compliance, transparency, and verification. -* Upload, organize, tag, and version documents. -* Role-based access control and secure cloud storage. ([doculan.ai][1]) +### 🤖 AI & OCR Intelligence +- OCR-enabled full-text search within scanned PDFs for quick and accurate document retrieval. +- AI-powered metadata extraction and smart tagging to automatically organize and categorize documents. +- Automatic form field detection for supported AcroForms (such as I-9, tax forms, and onboarding documents) to streamline data capture and processing. -### E-Signature +### 🧠 AI Form Generation +- Generate dynamic forms instantly using simple natural-language prompts. +- Eliminate the need for manual field creation, saving time and effort. -* Create signable documents, route for signature, and audit trails for compliance. ([doculan.ai][1]) +### 📄 PDF Form Comparison +- Compare previously submitted PDF forms with new submissions for accurate review. +- Instantly detect and highlight changes in populated fields for quick verification. -### AI & OCR +### ᝰ✍🏻 Smart Signing Experience +- Tab-based field navigation for faster and smoother signing. +- Auto-save functionality while filling out forms to prevent data loss. +- Auto-focus on the next required field to streamline completion. -* OCR-enabled full-text search for scanned PDFs and images. -* AI-assisted metadata extraction and smart tagging for fast retrieval. ([doculan.ai][1]) +[//]: # (### ⚙️ Workflow & Automation) -### Workflow & Automation +[//]: # (- Custom approval and review workflows.) -* Custom workflows for approvals and reviews. -* Notifications and activity logs to track changes. ([doculan.ai][1]) +[//]: # (- Notifications, activity logs, and task tracking.) -### Security & Compliance +[//]: # (- Multi-user collaboration on supported plans.) -* Encrypted storage, access controls, and downloadable records. -* Paper-copy request policy and hardware/software guidance in T&Cs. ([app.doculan.ai][3]) +### 🔐 Security & Compliance +- Encrypted document storage to protect sensitive data. +- Access controls and permission-based sharing for secure collaboration. +- Downloadable audit records for transparency and compliance. +- Paper copy request support in accordance with the Terms & Conditions. --- -## How It Works +## 🔁 How It Works -1. **Sign up** — Create an account and choose a plan. ([app.doculan.ai][4]) -2. **Upload documents** — Drag & drop PDF, DOCX, and images. ([doculan.ai][1]) -3. **AI & OCR processing** — Documents are OCR’d and indexed so you can search inside scanned content. ([doculan.ai][1]) -4. **Setup workflow & signatures** — Add approvers, send for e-signature, and get audit logs. ([doculan.ai][1]) -5. **Manage & Export** — Version control, metadata, and export or request paper copies if needed. ([app.doculan.ai][3]) +1. **Sign Up** — Create your account. +2. **Upload Documents** — Drag & drop PDFs instantly. +3. **AI & OCR Processing** — Search inside scanned documents. +4. **Create Forms / Enable AI Detection** — Auto-detect fields or generate forms using AI. +5. **Send for Signature** — Add recipients and track signing status. +6. **Compare & Store** — Compare submissions and store securely with version history. --- -## Pricing (Summary) +## 💰 Pricing (Overview) -**Simple, transparent tiers — all plans include a 14-day free trial.** ([app.doculan.ai][2]) +All plans come with a **30-day free trial**: -* **Free** — Basic testing & limited usage. ([app.doculan.ai][2]) -* **Starter** — For small teams; more storage & features. ([app.doculan.ai][2]) -* **Professional** — Advanced features for growing orgs; automation & higher limits. ([app.doculan.ai][2]) -* **Enterprise** — Custom pricing, SLAs, dedicated support and integrations. ([app.doculan.ai][2]) +- **Free** — Basic testing & limited usage +- **Starter** — Best for individuals and small teams +- **Professional** — Advanced automation & integrations +- **Enterprise** — Custom pricing, SLAs & dedicated support -> Note: The site advertises “14-day free trial” and “simple, transparent pricing” on the subscription/plan page. Exact monthly / annual figures and limits are published on the plan page. ([app.doculan.ai][2]) +👉 Full pricing details: https://app.doculan.ai/subscription-plans --- -## Frequently Asked Questions +## ❓ Frequently Asked Questions -**Is there a free trial?** -Yes — all plans include a 14-day free trial. ([app.doculan.ai][2]) +**Is there a free trial?** +Yes, all plans include a 30-day free trial. -**What file types are supported?** -PDF, DOCX, images (scannable formats) and common document types; OCR processes scanned documents. ([doculan.ai][1]) +**What file formats are supported?** +Primarily PDF and common document formats with OCR support. -**Can I request paper copies of electronic records?** -Yes — you may request a paper copy at no additional cost within a reasonable timeframe; see Terms & Conditions for details. ([app.doculan.ai][3]) +**Does Doculan support AI form detection?** +Yes, supported for compatible AcroForms such as onboarding and tax forms. -**Where do I sign up?** -Create an account on the signup page. ([app.doculan.ai][4]) +**Can I compare two filled PDFs?** +Yes, Doculan supports field-level comparison of populated PDF forms. + +**Can I request physical (paper) copies?** +Yes, as per the Terms & Conditions. --- -## Legal & Links +## 🔗 Useful Links -* **Terms & Conditions (PDF)** — Contains record access, paper-copy policy, and system requirements. ([app.doculan.ai][3]) -* **Sign in / App** — The application portal and login are at the app subdomain. ([app.doculan.ai][5]) +- 🌐 Website: https://www.doculan.ai +- 🔐 App Portal: https://app.doculan.ai +- 📝 Sign Up: https://app.doculan.ai/register +- 💵 Pricing: https://app.doculan.ai/subscription-plans +- 📄 Terms & Conditions (PDF): https://www.doculan.ai/#/electronic-sign-disclosure --- -## Footer - -**Doculan** • Secure Document Management & E-Signing -Links: Home • Features • Pricing • Sign up • Login • Terms & Conditions • Privacy Policy. ([doculan.ai][1]) +## 🏁 Footer -[1]: https://www.doculan.ai/?utm_source=chatgpt.com "Doculan | Document Management & E-Signature Solution" -[2]: https://app.doculan.ai/subscription-plans?utm_source=chatgpt.com "Choose Your Plan - Doculan" -[3]: https://app.doculan.ai/docs/Terms_%26_Conditions.pdf?utm_source=chatgpt.com "Terms & Conditions - Doculan" -[4]: https://app.doculan.ai/register?utm_source=chatgpt.com "Create an account - Doculan" -[5]: https://app.doculan.ai/?utm_source=chatgpt.com "Doculan" \ No newline at end of file +**Doculan** — Secure Document Management • AI Forms • PDF Comparison • E-Signatures +Home • Features • Pricing • Sign Up • Login • Privacy Policy • Terms & Conditions \ No newline at end of file diff --git a/docs/Security/Security.md b/docs/Security/Security.md new file mode 100644 index 0000000..490e144 --- /dev/null +++ b/docs/Security/Security.md @@ -0,0 +1,118 @@ +# Two-Factor Authentication (2FA) +**Two-Factor Authentication (2FA)** is an advanced security measure designed to enhance account protection by requiring users to verify their identity using two independent authentication factors.
+In addition to entering a standard password, users must provide a second form of verification — such as a **one-time passcode (OTP)**, an authenticator app token, or a hardware security key.
+This dual-layer authentication framework significantly reduces the risk of unauthorized access, mitigates credential-based attacks, and strengthens the overall security posture of the system. + +--- + +## Steps to Enable Two-Factor Authentication (2FA) +Follow the steps below to securely enable **Two-Factor Authentication (2FA)** in **Doculan**, ensuring enhanced protection for your account and sensitive data. +** + +1. Navigate to the **Doculan Dashboard**. +2. Click the **Profile** icon located at the top right corner. +3. Select **Settings** from the dropdown menu. +4. Click on **Two-Factor Authentication (2FA)**. + +Before proceeding, ensure you have an authenticator app installed on your device. +Common options include: + +- **Google Authenticator** +- **Microsoft Authenticator** +- **Duo Mobile** +- **Okta Verify** +- **Authy** +- You may also use **any TOTP-based authenticator app**. + +5. Click the **Generate QR Code** button to create a unique QR code for setting up **Two-Factor Authentication (2FA)**. + +**Screenshot 1** + +PDF Scrolling + + +**Screenshot 2** + +PDF Scrolling + +> The above **Screenshots** represent that **Enable Two-Factor Authentication (2FA)**, enhancing account security by adding an extra layer of protection. + +### Steps to Complete Two-Factor Authentication (2FA) + +1. **Generate 2FA Setup:** A unique QR Code and Secret Key will be provided. +2. **Add to Authenticator App:** + - Scan the **QR Code** with your authenticator app, or + - Manually enter the **Secret Key** into the app. +3. **Generate Verification Code:** Your authenticator app will generate a 6-digit time-based code. +4. **Verify on Doculan:** Enter the current 6-digit code on the Doculan website. +5. **Complete Setup:** Upon successful verification, 2FA will be enabled for your account, adding an extra layer of security. + +> Once scanned, your authenticator app will generate **6-digit time-based verification codes** that refresh periodically for secure login verification. + + + + +## Backup Codes + +After successful verification, **Two-Factor Authentication (2FA)** will be enabled. + +Once 2FA is activated, Doculan automatically generates **10 backup codes**. + +- Each backup code can be used **once** for login when you don’t have access to your authenticator app. +- Click the **Download** button to save your backup codes. +- The file will be downloaded in **.txt** format. +- Store this file **securely** in your local system. + +**Screenshot 3** + +PDF Scrolling + +> The above **Screenshot** represent the how to step for **Downloading backup codes** to securely access your account in case your primary 2FA method is unavailable. + + +## Code Expiration + +- Each 2FA code generated by the authenticator app becomes **invalid after logout** and must be regenerated for the **next login session**. +- Once a code expires, open your authenticator app to obtain a **fresh 6-digit code**. +- As an alternative, you can use one of your **backup codes** to access your account. + +**Screenshot 4** + +PDF Scrolling + +> The above **Screenshot** represent the process for **Handling or overcoming code expiration** when using Two-Factor Authentication (2FA) in Doculan. + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **Enable Two-Factor Authentication (2FA)** in Doculan. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Video_Enabled-Esign/VideoEsign.md b/docs/Video_Enabled-Esign/VideoEsign.md new file mode 100644 index 0000000..720d6fc --- /dev/null +++ b/docs/Video_Enabled-Esign/VideoEsign.md @@ -0,0 +1,169 @@ +# How to use Video Enabled Esign? + +**Video-Enabled E-Sign** allows you to capture secure, **video-recorded electronic signatures** with **automatic timestamping**. This feature enhances compliance, transparency, and auditability by recording visual consent during document execution. + +The process enables organizations to verify: +- Signer identity. +- Signature date and time. +- Complete signing activity with video evidence. + +--- + +### Step 1: Initiating E-Sign Record + +1. Navigate to the **Doculan Dashboard**. +2. Click **Documents**. +3. Open the required document. +4. Click the **⋮ (three-dot)** icon under the **Actions** column. +5. Click **E-Sign**. +6. Place all required fields in the document. +7. Select the **Signature Field**, click the **Settings** menu, and enable: + - **Record** + - **Timestamp** + +**Screenshot 1** + +PDF Scrolling + +> The above **Screenshot** represent that **Initiating E-Sign Record** + + +8. Click **Send Mail**. +9. Add the recipient’s **Email ID** and **Name**. +10. Set the **Validity Date** and **Reminder**. + +Under **Security Settings**, configure the following options: + - **OTP Verification** + - **Wet Signature** + +> **Note:** You may disable OTP Verification if required. +> Enable **Wet Signature only** when additional security is needed. + + +### Step 2: Sending the Document + +1. Enter the **Email Subject** and **Email Body**, ensuring the message clearly communicates the purpose of the document. +2. Click **Send** to deliver the email to the recipient. + +The recipient will receive the notification and can access the document directly to review and complete the signing process. + +--- + +### Step 3: Disclosure and OTP Verification + +1. A **Disclosure Popup** will appear. +2. Read the disclosure statement carefully. +3. Select the consent checkbox. +4. Click **Continue**. + +**Screenshot 2** + +PDF Scrolling + +> The above **Screenshot** represent that **Disclosure and OTP Verification** + + +5. Complete **OTP Verification**. +6. Open the document. + + +### Step 4: Video-Based E-Sign Process + +1. Click the **Signature Field**. +2. A **Video-Enabled E-Sign popup** will appear. +3. Read the statement. +4. Check the consent checkbox. +5. Click **Start**. + +**Screenshot 3** + +PDF Scrolling + +> The above **Screenshot** represent that **Video-Based E-Sign Process** + + +- The **video recording** window will appear in the **top-left corner** of the screen. +- The **Signature popup** will appear in the **center** of the screen. +- Complete the signature process as instructed. + +**Screenshot 4** + +PDF Scrolling + +> The above **Screenshot** represent that **Video-Based E-Sign Process** + + +6. Fill in the remaining required fields. +7. Click **Submit** to complete the signing process. + +The document will be submitted successfully. + +--- + +### Step 5: Viewing Signed Document and Evidence + +1. Navigate to the **Doculan Dashboard**. +2. Click **Documents**. +3. Open the signed document. +4. Click the **⋮ (three-dot)** icon under the **Actions** column. +5. Click **View**. +6. Select **Document**. + +The signed document will appear. +Verify the **signature**, **timestamp (date and time)**. + +**Screenshot 5** + +PDF Scrolling + +> The above **Screenshot** represent that **Viewing Signed Document and Evidence** + + +--- + +### Step 6: Viewing Video Evidence + +1. Click **Evidence**. +2. Select the specified **Party**. +3. View the **video evidence** associated with the signed document. + +**Screenshot 6** + +PDF Scrolling + +> The above **Screenshot** represent that **Viewing Video Evidence** + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **use video-enabled e-sign features within an e-sign document**. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/Wet-Signature/WetSign.md b/docs/Wet-Signature/WetSign.md new file mode 100644 index 0000000..ebe7639 --- /dev/null +++ b/docs/Wet-Signature/WetSign.md @@ -0,0 +1,114 @@ +# How to use Wet Signature? +The **Wet Signature** feature allows recipients to physically sign printed documents as part of the **E-Sign workflow**. After signing, the document is **uploaded in PDF format** for verification and submission.
+This process ensures compliance with scenarios that require **handwritten signatures** while maintaining a secure digital audit trail. This section explains how to complete a **Wet Signature** process in Doculan using the E-Sign workflow. + +--- + +### Step 1: Initiating Wet Signature + +1. Navigate to the **Doculan Dashboard**. +2. Click **Documents**. +3. Open the required document. +4. Click the **⋮ (three-dot)** icon under the **Actions** column. +5. Click **E-Sign**. +6. Place the required fields in the document and click **Send Mail**. +7. Add the recipient’s **Email ID** and **Name**. +8. Set the **Validity Date** and **Reminder**. + +Under **Security Settings**, you can configure the following options: +- **OTP Verification** +- **Certificate** +- **Wet Signature** + +**Screenshot 1** + +PDF Scrolling + +> The above **Screenshot** represent how to **initiate a Wet Signature** request within the **E-Sign workflow**. + +--- + +### Step 2: Sending the Document + +1. Enter the **Email Subject** and **Email Body**. +2. Click **Send** to deliver the document to the recipient. + +The recipient will receive the email and open the document using **OTP Verification**.
+A **“Wet Signature Required”** popup will appear. The recipient must click **“I Understand”** to proceed.
+After reviewing the document, the recipient should click the **Print** button to print the document for **physical signing**. + +**Screenshot 2** + +PDF Scrolling + +> The above **Screenshot** represent that **how to send and print the Document**. + +--- + +### Step 3: Uploading the Wet-Signed Document + +After printing the document: + +1. Fill in the required fields. +2. Affix a **physical (wet) signature**. +3. Convert the document into **PDF format**. +4. Click the **Upload** button. +5. Attach the PDF file. + - **Note:** Only **PDF format** files are accepted. +6. **Review** the uploaded document. +7. Click the **Confirm** button. + +**Screenshot 3** + +PDF Scrolling + +> The above **Screenshot** represent that **Uploading the Wet-Signed Document**. + +--- + +### Step 4: Submission and Download + +- After clicking **Confirm**, The uploaded document is **automatically** submitted. +- The sender and recipient can view the submitted document. +- The document can be downloaded as a **ZIP file** for record-keeping or sharing purposes. + +**Screenshot 4** + +PDF Scrolling + +> The above **Screenshot** represent that **how to Submit and Download the Document** + +--- + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent that how to **Create a wet-sign document and send it to a recipient**. + +© Doculan by [Virtualan Software](https://www.virtualan.io) \ No newline at end of file diff --git a/docs/_clients/image-1.png b/docs/_clients/image-1.png new file mode 100644 index 0000000..cd75b26 Binary files /dev/null and b/docs/_clients/image-1.png differ diff --git a/docs/_clients/image-2.png b/docs/_clients/image-2.png new file mode 100644 index 0000000..d73210f Binary files /dev/null and b/docs/_clients/image-2.png differ diff --git a/docs/_clients/image-3.png b/docs/_clients/image-3.png new file mode 100644 index 0000000..fada4d9 Binary files /dev/null and b/docs/_clients/image-3.png differ diff --git a/docs/_coverpage.md b/docs/_coverpage.md index 9a2bf20..8f223f9 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -1,16 +1,45 @@ -![logo](_media\docu-mini-logo.png ':size=8%') + +

+ +

-![Doculan](_media\doculan-mini.png ':size=10%') + +

+ +

+ ->Doculan is an all-in-one platform to create documents and forms, manage contacts, and securely E-sign files with ease. + -- Simple and lightweight +> **Doculan** is an all-in-one platform to create documents and forms, manage contacts, and securely **E-Sign** files with ease. -> Clients +

+ Fast • Simple • Lightweight Platform +

-![autismcaretherapy](_clients\AutismCareTherapy.png ':size=10%')       ![marykennedy](_clients\MaryKennedy.png ':size=10%')      ![americangreensolutions](_clients\AmericanGreenSolutions.png ':size=10%') +
+ -[Getting Started](README.md) + + + +

+ + + +

+ diff --git a/docs/_media/cover-bg.jpg b/docs/_media/cover-bg.jpg new file mode 100644 index 0000000..53b8c7f Binary files /dev/null and b/docs/_media/cover-bg.jpg differ diff --git a/docs/_media/doculan-mini.png b/docs/_media/doculan-mini.png index e4333b2..2dcffee 100644 Binary files a/docs/_media/doculan-mini.png and b/docs/_media/doculan-mini.png differ diff --git a/docs/_sidebar.md b/docs/_sidebar.md index dc99c08..e37d62d 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,56 +1,103 @@ -- [Getting started](README.md) + [Getting started](README.md) + + --- - ---- +- **E-Signature** + - [How to send single party document?](E_Sign/single-party-document.md) + - [How to send multiple party document?](E_Sign/multiple-party-document.md) + - [How to send Bulk mail?](E_Sign/bulk-mail.md) + - [How to cancel eSign document?](E_Sign/cancel-esign-document.md) + - [How to decline eSign document?](E_Sign/decline-esign-document.md) + - [How to resend eSign document?](E_Sign/resend-esign-document.md) + - [How to use the default E-Sign Document?](E_Sign/default_e-sign-document.md) + - [How to use self sign feature?](E_Sign/self-sign-document.md) + - [How to use Variable field?](E_Sign/variable-fields.md) + - [How to use Delegate Email?](E_Sign/delegate-email.md) + - [How to Schedule an Email?](E_Sign/schedule-email.md) + - [How to Rename the File?](E_Sign/rename-file.md) + - [How to Use the Co-Signer Option?](E_Sign/Co-Signer.md) + +- **Wet Signature** + - [How to use Wet-Signature?](Wet-Signature/WetSign.md) -- **E-Sign** - - [How to send single party document?](E_Sign\single-party-document.md) - - [How to send multiple party document?](E_Sign\multiple-party-document.md) - - [How to send Bulk mail?](E_Sign\bulk-mail.md) - - [How to cancel eSign document?](E_Sign\cancel-esign-document.md) - - [How to decline eSign document?](E_Sign\decline-esign-document.md) - - [How to resend eSign document?](E_Sign\resend-esign-document.md) +- **Video Enabled Esign** + - [How to use Video Enabled Esign?](Video_Enabled-Esign/VideoEsign.md) --- -- **E-Sign Template** - - [What is Myself / Team template?](E_Sign\myself-or-team-template.md) - - [How to create template?](E_Sign\create-template.md) - - [How to update template?](E_Sign\update-template.md) - - [How to delete template?](E_Sign\delete-template.md) +- **E-Signature Template** + - [What is Myself / Team template?](E_Sign/myself-or-team-template.md) + - [How to create template?](E_Sign/create-template.md) + - [How to update template?](E_Sign/update-template.md) + - [How to delete template?](E_Sign/delete-template.md) --- - **Share Document** - - [How to share document?](E_Sign\share-document.md) - - [How to resend shared document?](E_Sign\resend-shared-document.md) - - [How to cancel shared document?](E_Sign\cancel-shared-document.md) + - [How to share document?](E_Sign/share-document.md) + - [How to resend shared document?](E_Sign/resend-shared-document.md) + - [How to cancel shared document?](E_Sign/cancel-shared-document.md) --- - - **Form Management** - - [How to Create and Send Forms ](Forms/Form_Create.md) - - - [How do view Submitted Form with attachments](Forms/Form_Document_Storage.md) - - [How to Clone Form](Forms/Form_Clone.md) - - [How to Cancel Form](Forms/Form_Cancel.md) - - [How to Delete Form](Forms/Form-Delete.md) - - [How to Resend Form](Forms/Form_Resend.md) + - [How to Create and Send Forms?](Forms/Form_Create.md) + - [How do view Submitted Form with attachments?](Forms/Form_Document_Storage.md) + - [How to Clone Form?](Forms/Form_Clone.md) + - [How to Cancel Form?](Forms/Form_Cancel.md) + - [How to Delete Form?](Forms/Form-Delete.md) + - [How to Resend Form?](Forms/Form_Resend.md) + +- **Embedded Esign** + - [How to use Embedded Esign?](Embedded-Esign/EmbdedEsign.md) --- - **Contact Management** - - [Create Contact](Contacts/Contact_Create.md) - - [Update Contact](Contacts/Contact-Update.md) - - [Delete Contact](Contacts/Contact-Delete.md) + - [How to Create Contact?](Contacts/Contact_Create.md) + - [How to Update Contact?](Contacts/Contact-Update.md) + - [How to Delete Contact?](Contacts/Contact-Delete.md) --- -- **Document Management** - - [Create Document](Document/Documents_Create.md) - - [upload Document](Document/Documents_Upload.md) +- **Document Editor** + - [How to Create Document?](Document/Documents_Create.md) + - [How to Save Document?](Document/Documents_Upload.md) + - [How to Versioning & Comparison Document?](Document/Documents_Compare.md) + - [How to use E-Sign in the Document Editor?](Document/Documents_E-sign.md) --- +- **Note Taker** + - [How to Use the Note Taker Option?](Notes_Taker/notes_taker.md) + +--- + +- **Library Management** + - [Library – Documents](Library_Management/Library.md) + +--- + +- **Security** + - [Two-Factor Authentication[2FA]](Security/Security.md) + +--- + +- **API Documentation** + - [E-Signature](API-Documentation/E-Sign.md) + +--- + - **Release Notes** - - [Newly Released Features](releaseNotes.md) \ No newline at end of file + + **2025** + - [Version 0.3.0](releaseNotes/version_0.3.0.md) + - [Version 0.4.0](releaseNotes/version_0.4.0.md) + - [Version 0.5.0](releaseNotes/version_0.5.0.md) + + **2026** + - [Version 0.6.0](releaseNotes/version_0.6.0.md) + - [Version 0.7.0](releaseNotes/version_0.7.0.md) + - [Version 0.8.0](releaseNotes/version_0.8.0.md) + - [Version 0.9.0](releaseNotes/version_0.9.0.md) + - [Version 0.9.1](releaseNotes/version_0.9.1.md) +--- \ No newline at end of file diff --git a/docs/css/cookie.css b/docs/css/cookie.css index 1ce1a30..52c27f3 100644 --- a/docs/css/cookie.css +++ b/docs/css/cookie.css @@ -1,11 +1,10 @@ - /*Cookie Consent Begin*/ #myCookieConsent { z-index: 999; min-height: 20px; font-family: OpenSans, arial, "sans-serif"; padding: 10px 20px; - background: rgba(0,0,0,0.6); + background: rgba(0, 0, 0, 0.6); overflow: hidden; position: fixed; color: #FFF; @@ -17,84 +16,104 @@ font-size: 15px; font-weight: bold; } + #myCookieConsent div { padding: 5px 0 0; } + #myCookieConsent a { - color: hsl(36,75%, 57%); + color: hsl(36, 75%, 57%); display: inline-block; padding: 0 10px; } + #myCookieConsent a:hover { - color: hsl(50, 100%, 57%); + color: hsl(50, 100%, 57%); } + #myCookieConsent a#cookieButton { display: inline-block; color: #FFF; font-size: 1.1em; - background: rgba(0,0,0,0.6); + background: rgba(0, 0, 0, 0.6); text-decoration: none; cursor: pointer; padding: 2px 20px; float: right; border-radius: 20px; } + #myCookieConsent a#cookieButton:hover { background: #FFF; - color: #000; + color: #000; } .overlay { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - background: rgba(0, 0, 0, 0.7); - transition: opacity 500ms; - visibility: hidden; - opacity: 0; - } - .overlay:target { - visibility: visible; - opacity: 1; - } - - .popup { - margin: 70px auto; - padding: 20px; - background: #fff; - border-radius: 5px; - width: 60%; - height: 80%; - position: relative; - transition: all 5s ease-in-out; - } - - .popup h2 { - margin-top: 0; - color: #333; - font-family: Tahoma, Arial, sans-serif; - } - .popup .close { - position: absolute; - top: 20px; - right: 30px; - transition: all 200ms; - font-size: 30px; - font-weight: bold; - text-decoration: none; - color: #333; - } - .popup .close:hover { - color: #06D85F; - } - .popup .content { - height: 95%; - overflow: auto; - } - - -/*Cookie Consent End*/ + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.7); + transition: opacity 500ms; + visibility: hidden; + opacity: 0; +} + +.overlay:target { + visibility: visible; + opacity: 1; +} + +.popup { + margin: 70px auto; + padding: 20px; + background: #fff; + border-radius: 5px; + width: 60%; + height: 80%; + position: relative; + transition: all 5s ease-in-out; +} + +.popup h2 { + margin-top: 0; + color: #333; + font-family: Tahoma, Arial, sans-serif; +} + +.popup .close { + position: absolute; + top: 20px; + right: 30px; + transition: all 200ms; + font-size: 30px; + font-weight: bold; + text-decoration: none; + color: #333; +} + +.popup .close:hover { + color: #06D85F; +} + +.popup .content { + height: 95%; + overflow: auto; +} + +section.cover h1, +section.cover blockquote, +section.cover p { + color: #ffffff; + text-shadow: 0 2px 10px rgba(0, 0, 0, 0.6); +} + +section.cover blockquote { + border-left: none; +} + + +/*Cookie Consent End*/ \ No newline at end of file diff --git a/docs/files/Sample Two-Party Agreement-Authorized.pdf b/docs/files/Sample Two-Party Agreement-Authorized.pdf new file mode 100644 index 0000000..becdcfd Binary files /dev/null and b/docs/files/Sample Two-Party Agreement-Authorized.pdf differ diff --git a/docs/files/Sample-Certificate.pdf b/docs/files/Sample-Certificate.pdf new file mode 100644 index 0000000..c89a35c Binary files /dev/null and b/docs/files/Sample-Certificate.pdf differ diff --git a/docs/index.html b/docs/index.html index 21965d8..3930513 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,220 +1,264 @@ + - - Virtualan Software - - - - - - - - - - - - - - - - - - - - - - - - - + + + - .right { - position: absolute; - right: 0px; - width: 300px; - /* border: 3px solid #73AD21; */ - padding: 10px; - } - + + + + + + -
- - - - - - - - - - - - - - - - +
+ + + + + + + + + + + + + + + + - + + \ No newline at end of file diff --git a/docs/releaseNotes.md b/docs/releaseNotes.md deleted file mode 100644 index c413a7a..0000000 --- a/docs/releaseNotes.md +++ /dev/null @@ -1,56 +0,0 @@ -# Release Notes – New Enhancements - -#### *Overview* -1. *PDF Scrolling: You can now scroll to the next page in the PDF (from the recipient's pdf viewer page, pdf esign page, signing page, shared document page)* -2. *Tab Navigation: Pressing the Tab key will move the focus to the next field. (recipient's signing page)* -3. *Auto-Resize Fields: When entering values in Text, Email, Number, or Initial fields, the input box will automatically expand to the right. (signing page)* - ---- - -## Features - -### 1. **PDF Scrolling Improvements** - -Users can now smoothly scroll to the next page within PDFs across all relevant modules. -This enhancement improves the reading and signing experience, especially for multi-page documents. - -Screenshot for Document - -#### Available in: -- PDF Viewer Page -- PDF eSign Page -- Signing Page -- Shared Document Page(Only View and Downloadable PDF file) - ---- - -### 2. **Enhanced Tab Navigation** - -Pressing the Tab key now correctly shifts the focus to the next input field while signing documents. -This improves accessibility and speeds up the form-filling process. - -Screenshot for Document - -#### Available in: -- PDF Viewer Page -- PDF e-Sign Page -- Signing Page - ---- - -### 3. **Auto-Resizing Input Fields** - -Text-based input fields now automatically expand horizontally as users type, ensuring the entered value is always visible without manual resizing. - -Screenshot for Document - -#### Applies to: - -- Text Fields -- Email Fields -- Number Fields -- Initial Fields - - \ No newline at end of file diff --git a/docs/releaseNotes/version_0.3.0.md b/docs/releaseNotes/version_0.3.0.md new file mode 100644 index 0000000..5cd06b9 --- /dev/null +++ b/docs/releaseNotes/version_0.3.0.md @@ -0,0 +1,50 @@ +# 🚀 Version 0.3.0 – New Enhancements + +1. **PDF Scrolling** – Users can now seamlessly scroll through multi-page PDFs across various modules, ensuring smooth navigation and readability. +2. **Tab Navigation** – Pressing the Tab key moves the focus sequentially to the next input field while signing, streamlining data entry. +3. **Auto-Resize Fields** – Input fields automatically expand as you type, providing enhanced visibility and a more user-friendly experience. + +--- + +## 1️⃣ PDF Scrolling Improvements + +Users can now seamlessly scroll to the next page within PDF documents across all supported modules. +This enhancement significantly improves the viewing and signing experience, especially for multi-page files, by providing smoother navigation and better readability. + +PDF Scrolling + +### The Feature are Available In: +- PDF Viewer Page +- PDF eSign Page +- Signing Page +- Shared Document Page (View & Download only) + +--- + +## 2️⃣ Enhanced Tab Navigation + +You can now use the `Tab` key to move automatically to the next input field while filling out or signing documents. +This enhancement improves accessibility and helps speed up the overall signing process. + +Tab Navigation + +### The Feature are Available In: +- PDF Viewer Page +- PDF eSign Page +- Signing Page + +--- + +## 3️⃣ Auto-Resizing Input Fields + +Text-based input fields now dynamically expand as users type, ensuring that the entire content remains visible without the need for manual resizing. + +Auto Resizing Fields + +### This functionality applies to the following field types: +- Text Fields +- Email Fields +- Number Fields +- Initial Fields + +--- diff --git a/docs/releaseNotes/version_0.4.0.md b/docs/releaseNotes/version_0.4.0.md new file mode 100644 index 0000000..d18a277 --- /dev/null +++ b/docs/releaseNotes/version_0.4.0.md @@ -0,0 +1,173 @@ +# 🚀 Version 0.4.0 – New Enhancements + +1. **Special Features Tab** – A centralized settings tab to manage and configure advanced AI features. +2. **AI Field Detection** – Automatically identifies fields in supported PDF AcroForms. +3. **AI Form Generation** – Instantly generate complete forms using simple text prompts. +4. **PDF Form Comparison** – Compare previous and current form submissions for precise auditing and verification. + +--- + +## 1️⃣ Special Features Tab + +A new **Special Features** tab is now available in the **Settings** section. +This tab provides a centralized location to easily enable or disable advanced AI-powered features, giving you better control over your workflow. + +Special Features Tab + +### Available In: +- Settings Page + +--- + +## 2️⃣ AI Field Detection + +Doculan now automatically detects form fields in supported **PDF AcroForms**, including: + +- I-9 Forms +- Onboarding Forms +- Government & Compliance Forms + +This significantly reduces manual field configuration and speeds up document preparation. + +AI Field Detection Button + +AI Field Detection Popup + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent how to use the **AI Field Detection** feature in Doculan. + +--- + +## 3️⃣ AI Form Generation + +Users can now generate fully structured forms instantly by entering a simple **text prompt**. +Doculan’s AI automatically builds the complete form layout with all required fields. + +AI Form Button + +AI Form Popup + +### Key Benefits: +- No manual form creation +- Faster form setup +- Reduced human errors + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent how to use **AI Form Generation** feature in Doculan. + +--- + +## 4️⃣ PDF Form Comparison + +You can now compare **previously submitted form values** with **current submissions** in a single view. +This feature is especially useful for ensuring data accuracy and compliance. + +Field Comparison + +**While Signing (Self-Sign Only):** +During the signing process, users performing a **self-sign** can view and compare their **previously submitted values** alongside the current form fields. + +--- + +Multi-Party Comparison + +**After Signing (All Parties):** +Once the document is fully signed, users can compare **all parties’ submitted values** against previous records for complete audit visibility. + + +**Demo Video:** + + + +
+ + +
+ +> The above **Video** represent the how to use the **PDF Form Comparison** feature in Doculan. + +--- + +### Use Cases: +- Audit verification +- Change tracking +- Discrepancy detection +- Compliance validation + +--- \ No newline at end of file diff --git a/docs/releaseNotes/version_0.5.0.md b/docs/releaseNotes/version_0.5.0.md new file mode 100644 index 0000000..ff73be7 --- /dev/null +++ b/docs/releaseNotes/version_0.5.0.md @@ -0,0 +1,67 @@ +# 🚀 Version 0.5.0 – New Enhancements + +1. **Generate QR Code for E-Sign Documents** – QR Code generation provides quick, direct access to E-Sign documents by embedding party details, allowing recipients to open and sign the document instantly using a simple device scan. +2. **Generate QR Code for Forms** – QR Codes enable seamless access to forms by embedding essential participant information, allowing recipients to retrieve and submit the form instantly via a device scan. + +--- +## 1️⃣ Generate QR Code for E-Sign Documents +QR Code generation enables streamlined, **direct access to E-Sign documents** without requiring manual navigation. The generated code includes essential party details and can be scanned from any compatible device to immediately open and complete the document. +### Steps to Generate a QR Code +1. Open the required **E-Sign Document** from the list. +2. Click the **⋮ (three-dot)** icon under the **Actions** column. +3. Select **QR Code** to generate the code. + +**Screenshot 1:** + +PDF Scrolling + +**Screenshot 2:** + +PDF Scrolling + +> The above **Screenshots** represent that **QR Code Generation for E-Sign Documents.** + +4. The generated QR Code contains the following **party information:** + +- **Party ID** +- **Name** +- **Email** + +5. You can **download** the QR Code for sharing or offline use. + +6. Scanning the QR code from any device allows users to instantly **access, complete, and submit the E-Sign document.** + +> **Note:** QR Code generation is available **only when the E-Sign document status is _Pending_ and _Shared_** + +--- + +## 2️⃣ Generate QR Code for Forms +QR Codes provide an efficient method for participants to **access and submit forms with minimal effort**. The generated code contains the required participant information and allows instant form retrieval through a simple device scan. +### Steps to Generate a QR Code + +1. Open the required **Form** from the list. +2. Click the **⋮ (three-dot)** icon under the **Actions** column. +3. Select **QR Code** to create the code. + +**Screenshot 1:** + +PDF Scrolling + +**Screenshot 2:** + +PDF Scrolling + +> The above **Screenshots** represent that **QR Code Generation for Forms.** + +4. The generated QR Code includes the following **participant details:** + +- **Name** +- **Email** + +5. You can **download** the QR Code for easy distribution. + +6. Users can scan the QR Code on any device to quickly **open, complete, and submit the form.** + +> **Note:** QR Codes for Forms can be generated only when the form status is **Opened**, **Sent**, or **Resent**. + +--- diff --git a/docs/releaseNotes/version_0.6.0.md b/docs/releaseNotes/version_0.6.0.md new file mode 100644 index 0000000..c00a41d --- /dev/null +++ b/docs/releaseNotes/version_0.6.0.md @@ -0,0 +1,23 @@ +# 🚀 Version 0.6.0 – New Enhancements + +## 1️⃣ Wet Signature + +The **Wet Signature** feature enables recipients to print documents, apply handwritten signatures, and securely upload the signed PDF back into the Doculan E-Sign workflow. This ensures regulatory compliance in scenarios requiring physical signatures while maintaining a complete digital audit trail. + +🔗 **Learn more:** [Wet Signature in Doculan](Wet-Signature/WetSign.md) + +--- + +## 2️⃣ E-Sign Embedded + +**E-Sign Embedded** allows organizations to seamlessly integrate the electronic signing experience directly within forms. Recipients can review and sign documents without navigating away from the form interface, ensuring a smooth, efficient, and uninterrupted signing workflow. + +🔗 **Learn more:** [E-Sign Embedded in Doculan](Embedded-Esign/EmbdedEsign.md) + +--- + +## 3️⃣ Video Enabled Esign + +The **E-Sign Record** feature captures video evidence along with timestamped signatures during the signing process, delivering enhanced security, traceability, and audit compliance. This functionality provides strong verification of signer intent and signature authenticity. + +🔗 **Learn more:** [E-Sign Record in Doculan](Video_Enabled-Esign/VideoEsign.md) diff --git a/docs/releaseNotes/version_0.7.0.md b/docs/releaseNotes/version_0.7.0.md new file mode 100644 index 0000000..4f981ce --- /dev/null +++ b/docs/releaseNotes/version_0.7.0.md @@ -0,0 +1,55 @@ +# 🚀 Version 0.7.0 – Feature Updates & Improvements + +## 1️⃣ Copy Link & Email Content in QR Popup + +The QR popup now supports copying both the document link and pre-filled email content. This enhancement simplifies sharing documents with parties through external channels while maintaining consistency in communication. + +PDF Scrolling + +--- + +## 2️⃣ Configurable Certificate Generation + +Certificate generation for eSign completion is now configurable. Organizations can enable or disable certificate creation based on workflow or compliance requirements. + +PDF Scrolling + +--- + +## 3️⃣ Labels for All eSign Fields and Parties + +Label support has been added across all eSign fields and parties. Labels can be assigned by double-clicking fields, improving document clarity and signer identification. + +PDF Scrolling + +--- + +## 4️⃣ Date Format Support for eSign Date Fields + +Custom date formats are now supported for eSign date fields. The selected format is applied consistently across all date inputs within a document. + +**Screenshot 1:** +PDF Scrolling + +**Screenshot 2:** +PDF Scrolling + +--- + +## 5️⃣ File Copy Option Between Folders + +A new copy button allows files to be duplicated from one folder to another. This improves file management without impacting the original document. + +**Screenshot 1:** +PDF Scrolling + +**Screenshot 2:** +PDF Scrolling + +--- + +## 6️⃣ Document Editor Versioning & Comparison + +The document editor now includes versioning support. Users can compare different versions of Word documents to track changes and revisions effectively. + +PDF Scrolling \ No newline at end of file diff --git a/docs/releaseNotes/version_0.8.0.md b/docs/releaseNotes/version_0.8.0.md new file mode 100644 index 0000000..50e5d90 --- /dev/null +++ b/docs/releaseNotes/version_0.8.0.md @@ -0,0 +1,20 @@ +# 🚀 Version 0.8.0 – New Enhancements + +## 1️⃣ Variable field + +The **Variable Field** feature allows you to create reusable dynamic placeholders within a document. These placeholders automatically populate the same value wherever they appear, eliminating the need to enter repetitive information multiple times. +Variable fields improve efficiency, accuracy, and consistency—especially in contracts, agreements, and form-based documents. + +🔗 **Learn more:** [How to use Variable field?](E_Sign/variable-fields.md) + +Screenshot for Document + +--- + +## 2️⃣ Rename the File + +The **Rename File** feature allows you to update the name of an existing document without changing its content, structure, or workflow. This helps improve document organization, clarity, and version control within your workspace. The rename action does not affect the document’s content, recipients, audit trail, or signing status. It simply updates the display name for better management and tracking. + +🔗 **Learn more:** [How to Rename the File?](E_Sign/rename-file.md) + +Screenshot for Document \ No newline at end of file diff --git a/docs/releaseNotes/version_0.9.0.md b/docs/releaseNotes/version_0.9.0.md new file mode 100644 index 0000000..1862c74 --- /dev/null +++ b/docs/releaseNotes/version_0.9.0.md @@ -0,0 +1,23 @@ +# 🚀 Version 0.9.0 – New Enhancements + +## 1️⃣ Co-Signer + +The **Co-Signer** feature allows multiple recipients to sign a document at the same stage of the signing process. When recipients are set as co-signers, they receive the **E-Sign email simultaneously** and can sign the document independently. + +This helps speed up the signing workflow by allowing multiple parties to complete their signatures **in parallel** instead of waiting for a sequential signing order. + +🔗 **Learn more:** [How to Use the Co-Signer Option?](E_Sign/Co-Signer.md) + +Screenshot for Document + +--- + +## 2️⃣ Note Taker + +The **Note Taker** feature allows users to record sessions and automatically convert spoken content into structured notes. It captures content sentence by sentence and generates notes in real time, which can be edited during the session. + +After the session is completed, the system generates a **detailed** summary that can be **edited**, downloaded as a **PDF**, or sent for **E-Sign**. The **History** section allows users to view, resume, or delete previous sessions. + +🔗 **Learn more:** [How to Use the Note Taker Option?](Notes_Taker/notes_taker.md) + +Screenshot for Document diff --git a/docs/releaseNotes/version_0.9.1.md b/docs/releaseNotes/version_0.9.1.md new file mode 100644 index 0000000..a8ab7f9 --- /dev/null +++ b/docs/releaseNotes/version_0.9.1.md @@ -0,0 +1,35 @@ +# 🚀 Version 0.9.1 – New Enhancements + +## 1️⃣ Default Date Auto-Fill + +**Date fields** are automatically populated with the current date based on your configured settings. sender can set a default date for date fields before sending documents and choose whether to use the current date or leave the field blank. + +**Screenshot 1:** +Date Preference + +**Screenshot 2:** +Date Selection + +--- + +## 2️⃣ Apply Initials to All Fields + +Users can now quickly populate all **initial fields** across a document using the **“Apply All”** option. A confirmation popup is displayed before applying, ensuring consistency and preventing accidental updates. + +**Screenshot 1:** +Initial Apply All + +**Screenshot 2:** +Initial Confirmation + +--- + +## 3️⃣ Enhanced Download Options (Merge or Separate Files) + +Download **signed documents** with improved flexibility—choose to **merge the signed document** and completion certificate into a **single PDF** or download them as **separate files**. + +**Screenshot 1:** +Download Options + +**Screenshot 2:** +Merged Download \ No newline at end of file diff --git a/docs/screenshots/Contacts/Contact-Create1.png b/docs/screenshots/Contacts/Contact-Create1.png index 10aeed9..caf622d 100644 Binary files a/docs/screenshots/Contacts/Contact-Create1.png and b/docs/screenshots/Contacts/Contact-Create1.png differ diff --git a/docs/screenshots/Contacts/Contact-Delete1.png b/docs/screenshots/Contacts/Contact-Delete1.png deleted file mode 100644 index 7dedee9..0000000 Binary files a/docs/screenshots/Contacts/Contact-Delete1.png and /dev/null differ diff --git a/docs/screenshots/Contacts/Contact-Delete2.png b/docs/screenshots/Contacts/Contact-Delete2.png index 4c2cf2e..9f47515 100644 Binary files a/docs/screenshots/Contacts/Contact-Delete2.png and b/docs/screenshots/Contacts/Contact-Delete2.png differ diff --git a/docs/screenshots/Contacts/Contact-Update1.png b/docs/screenshots/Contacts/Contact-Update1.png deleted file mode 100644 index 9fc617a..0000000 Binary files a/docs/screenshots/Contacts/Contact-Update1.png and /dev/null differ diff --git a/docs/screenshots/Contacts/Contact-Update2.png b/docs/screenshots/Contacts/Contact-Update2.png index e83c079..30767ca 100644 Binary files a/docs/screenshots/Contacts/Contact-Update2.png and b/docs/screenshots/Contacts/Contact-Update2.png differ diff --git a/docs/screenshots/Contacts/Contact.png b/docs/screenshots/Contacts/Contact.png new file mode 100644 index 0000000..c59567b Binary files /dev/null and b/docs/screenshots/Contacts/Contact.png differ diff --git a/docs/screenshots/Delegate-email/delegate-email1.png b/docs/screenshots/Delegate-email/delegate-email1.png new file mode 100644 index 0000000..552af08 Binary files /dev/null and b/docs/screenshots/Delegate-email/delegate-email1.png differ diff --git a/docs/screenshots/Delegate-email/delegate-email2.png b/docs/screenshots/Delegate-email/delegate-email2.png new file mode 100644 index 0000000..a5d8256 Binary files /dev/null and b/docs/screenshots/Delegate-email/delegate-email2.png differ diff --git a/docs/screenshots/Delegate-email/delegate-email3.png b/docs/screenshots/Delegate-email/delegate-email3.png new file mode 100644 index 0000000..006a8bc Binary files /dev/null and b/docs/screenshots/Delegate-email/delegate-email3.png differ diff --git a/docs/screenshots/Delegate-email/delegate-email4.png b/docs/screenshots/Delegate-email/delegate-email4.png new file mode 100644 index 0000000..55945e0 Binary files /dev/null and b/docs/screenshots/Delegate-email/delegate-email4.png differ diff --git a/docs/screenshots/Document/Document-Compare2.png b/docs/screenshots/Document/Document-Compare2.png new file mode 100644 index 0000000..6b5f247 Binary files /dev/null and b/docs/screenshots/Document/Document-Compare2.png differ diff --git a/docs/screenshots/Document/Document-Compare3.png b/docs/screenshots/Document/Document-Compare3.png new file mode 100644 index 0000000..ab6ddb8 Binary files /dev/null and b/docs/screenshots/Document/Document-Compare3.png differ diff --git a/docs/screenshots/Document/Document-Compare4.png b/docs/screenshots/Document/Document-Compare4.png new file mode 100644 index 0000000..25b1aba Binary files /dev/null and b/docs/screenshots/Document/Document-Compare4.png differ diff --git a/docs/screenshots/Document/Document-Create.png b/docs/screenshots/Document/Document-Create.png deleted file mode 100644 index b62f33b..0000000 Binary files a/docs/screenshots/Document/Document-Create.png and /dev/null differ diff --git a/docs/screenshots/Document/Document-Create1.png b/docs/screenshots/Document/Document-Create1.png new file mode 100644 index 0000000..9c60a97 Binary files /dev/null and b/docs/screenshots/Document/Document-Create1.png differ diff --git a/docs/screenshots/Document/Document-Create2.png b/docs/screenshots/Document/Document-Create2.png index 414064f..4077cd8 100644 Binary files a/docs/screenshots/Document/Document-Create2.png and b/docs/screenshots/Document/Document-Create2.png differ diff --git a/docs/screenshots/Document/Document-Create3.png b/docs/screenshots/Document/Document-Create3.png new file mode 100644 index 0000000..141f37d Binary files /dev/null and b/docs/screenshots/Document/Document-Create3.png differ diff --git a/docs/screenshots/Document/Document-Create4.png b/docs/screenshots/Document/Document-Create4.png new file mode 100644 index 0000000..8d32e2c Binary files /dev/null and b/docs/screenshots/Document/Document-Create4.png differ diff --git a/docs/screenshots/Document/Document-Save2.png b/docs/screenshots/Document/Document-Save2.png new file mode 100644 index 0000000..8430285 Binary files /dev/null and b/docs/screenshots/Document/Document-Save2.png differ diff --git a/docs/screenshots/Document/Document-Save3.png b/docs/screenshots/Document/Document-Save3.png new file mode 100644 index 0000000..e91c5ac Binary files /dev/null and b/docs/screenshots/Document/Document-Save3.png differ diff --git a/docs/screenshots/Document/Document-Save4.png b/docs/screenshots/Document/Document-Save4.png new file mode 100644 index 0000000..9b18365 Binary files /dev/null and b/docs/screenshots/Document/Document-Save4.png differ diff --git a/docs/screenshots/Document/Document-Upload1.png b/docs/screenshots/Document/Document-Upload1.png deleted file mode 100644 index 140d391..0000000 Binary files a/docs/screenshots/Document/Document-Upload1.png and /dev/null differ diff --git a/docs/screenshots/Document/Document-Upload2.png b/docs/screenshots/Document/Document-Upload2.png deleted file mode 100644 index b582006..0000000 Binary files a/docs/screenshots/Document/Document-Upload2.png and /dev/null differ diff --git a/docs/screenshots/Document/Document-esign1.png b/docs/screenshots/Document/Document-esign1.png new file mode 100644 index 0000000..5242a54 Binary files /dev/null and b/docs/screenshots/Document/Document-esign1.png differ diff --git a/docs/screenshots/Document/Document-esign2.png b/docs/screenshots/Document/Document-esign2.png new file mode 100644 index 0000000..45791a3 Binary files /dev/null and b/docs/screenshots/Document/Document-esign2.png differ diff --git a/docs/screenshots/Document/Document-esign3.png b/docs/screenshots/Document/Document-esign3.png new file mode 100644 index 0000000..09766e2 Binary files /dev/null and b/docs/screenshots/Document/Document-esign3.png differ diff --git a/docs/screenshots/Document/Document-esign4.png b/docs/screenshots/Document/Document-esign4.png new file mode 100644 index 0000000..94cd00a Binary files /dev/null and b/docs/screenshots/Document/Document-esign4.png differ diff --git a/docs/screenshots/E-Sign_Images/AI_Assist.png b/docs/screenshots/E-Sign_Images/AI_Assist.png new file mode 100644 index 0000000..e7a72c8 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/AI_Assist.png differ diff --git a/docs/screenshots/E-Sign_Images/Actions_available.png b/docs/screenshots/E-Sign_Images/Actions_available.png index 3126638..284b5c3 100644 Binary files a/docs/screenshots/E-Sign_Images/Actions_available.png and b/docs/screenshots/E-Sign_Images/Actions_available.png differ diff --git a/docs/screenshots/E-Sign_Images/Actions_available1.png b/docs/screenshots/E-Sign_Images/Actions_available1.png new file mode 100644 index 0000000..0b022cc Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Actions_available1.png differ diff --git a/docs/screenshots/E-Sign_Images/Add_Party.png b/docs/screenshots/E-Sign_Images/Add_Party.png index c26bb57..acaa036 100644 Binary files a/docs/screenshots/E-Sign_Images/Add_Party.png and b/docs/screenshots/E-Sign_Images/Add_Party.png differ diff --git a/docs/screenshots/E-Sign_Images/Audit_Party1.png b/docs/screenshots/E-Sign_Images/Audit_Party1.png index 4da9b13..bb18e8d 100644 Binary files a/docs/screenshots/E-Sign_Images/Audit_Party1.png and b/docs/screenshots/E-Sign_Images/Audit_Party1.png differ diff --git a/docs/screenshots/E-Sign_Images/Audit_Party2.png b/docs/screenshots/E-Sign_Images/Audit_Party2.png index f979734..fdd5328 100644 Binary files a/docs/screenshots/E-Sign_Images/Audit_Party2.png and b/docs/screenshots/E-Sign_Images/Audit_Party2.png differ diff --git a/docs/screenshots/E-Sign_Images/Audit_after_Decline.png b/docs/screenshots/E-Sign_Images/Audit_after_Decline.png index dea5f78..f8c566a 100644 Binary files a/docs/screenshots/E-Sign_Images/Audit_after_Decline.png and b/docs/screenshots/E-Sign_Images/Audit_after_Decline.png differ diff --git a/docs/screenshots/E-Sign_Images/Audit_and_Verification.png b/docs/screenshots/E-Sign_Images/Audit_and_Verification.png index 8df0301..97942bf 100644 Binary files a/docs/screenshots/E-Sign_Images/Audit_and_Verification.png and b/docs/screenshots/E-Sign_Images/Audit_and_Verification.png differ diff --git a/docs/screenshots/E-Sign_Images/Bulk_Mail_Manual_CSV.png b/docs/screenshots/E-Sign_Images/Bulk_Mail_Manual_CSV.png index 2b2c377..88c8df0 100644 Binary files a/docs/screenshots/E-Sign_Images/Bulk_Mail_Manual_CSV.png and b/docs/screenshots/E-Sign_Images/Bulk_Mail_Manual_CSV.png differ diff --git a/docs/screenshots/E-Sign_Images/Cancel_Audit.png b/docs/screenshots/E-Sign_Images/Cancel_Audit.png index aae32e4..53a1544 100644 Binary files a/docs/screenshots/E-Sign_Images/Cancel_Audit.png and b/docs/screenshots/E-Sign_Images/Cancel_Audit.png differ diff --git a/docs/screenshots/E-Sign_Images/Cancel_Audit1.png b/docs/screenshots/E-Sign_Images/Cancel_Audit1.png new file mode 100644 index 0000000..1dc7d79 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Cancel_Audit1.png differ diff --git a/docs/screenshots/E-Sign_Images/Cancel_Esign_Document.png b/docs/screenshots/E-Sign_Images/Cancel_Esign_Document.png index 7e65abe..f3e433d 100644 Binary files a/docs/screenshots/E-Sign_Images/Cancel_Esign_Document.png and b/docs/screenshots/E-Sign_Images/Cancel_Esign_Document.png differ diff --git a/docs/screenshots/E-Sign_Images/Cancel_Esign_Document1.png b/docs/screenshots/E-Sign_Images/Cancel_Esign_Document1.png new file mode 100644 index 0000000..2c11e3b Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Cancel_Esign_Document1.png differ diff --git a/docs/screenshots/E-Sign_Images/Co-signer1.png b/docs/screenshots/E-Sign_Images/Co-signer1.png new file mode 100644 index 0000000..2dc3c90 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Co-signer1.png differ diff --git a/docs/screenshots/E-Sign_Images/Co-signer2.png b/docs/screenshots/E-Sign_Images/Co-signer2.png new file mode 100644 index 0000000..7a4f73e Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Co-signer2.png differ diff --git a/docs/screenshots/E-Sign_Images/Co-signer3.png b/docs/screenshots/E-Sign_Images/Co-signer3.png new file mode 100644 index 0000000..8ccbabd Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Co-signer3.png differ diff --git a/docs/screenshots/E-Sign_Images/Co-signer4.png b/docs/screenshots/E-Sign_Images/Co-signer4.png new file mode 100644 index 0000000..24a0400 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Co-signer4.png differ diff --git a/docs/screenshots/E-Sign_Images/Co-signer5.png b/docs/screenshots/E-Sign_Images/Co-signer5.png new file mode 100644 index 0000000..b65211a Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Co-signer5.png differ diff --git a/docs/screenshots/E-Sign_Images/Co-signer6.png b/docs/screenshots/E-Sign_Images/Co-signer6.png new file mode 100644 index 0000000..1c20f36 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Co-signer6.png differ diff --git a/docs/screenshots/E-Sign_Images/Configure_Field.png b/docs/screenshots/E-Sign_Images/Configure_Field.png new file mode 100644 index 0000000..669293d Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Configure_Field.png differ diff --git a/docs/screenshots/E-Sign_Images/Configure_Fields.png b/docs/screenshots/E-Sign_Images/Configure_Fields.png index ed229f3..020fc95 100644 Binary files a/docs/screenshots/E-Sign_Images/Configure_Fields.png and b/docs/screenshots/E-Sign_Images/Configure_Fields.png differ diff --git a/docs/screenshots/E-Sign_Images/Create_and_Upload_Document1.png b/docs/screenshots/E-Sign_Images/Create_and_Upload_Document1.png index 06e7706..2aa2d83 100644 Binary files a/docs/screenshots/E-Sign_Images/Create_and_Upload_Document1.png and b/docs/screenshots/E-Sign_Images/Create_and_Upload_Document1.png differ diff --git a/docs/screenshots/E-Sign_Images/Create_and_Upload_Document2.png b/docs/screenshots/E-Sign_Images/Create_and_Upload_Document2.png index 8ba575c..0580391 100644 Binary files a/docs/screenshots/E-Sign_Images/Create_and_Upload_Document2.png and b/docs/screenshots/E-Sign_Images/Create_and_Upload_Document2.png differ diff --git a/docs/screenshots/E-Sign_Images/Decline Document.png b/docs/screenshots/E-Sign_Images/Decline Document.png index a82bfe9..9c12ea0 100644 Binary files a/docs/screenshots/E-Sign_Images/Decline Document.png and b/docs/screenshots/E-Sign_Images/Decline Document.png differ diff --git a/docs/screenshots/E-Sign_Images/Delete_Template.png b/docs/screenshots/E-Sign_Images/Delete_Template.png index eb549b4..6a62fe6 100644 Binary files a/docs/screenshots/E-Sign_Images/Delete_Template.png and b/docs/screenshots/E-Sign_Images/Delete_Template.png differ diff --git a/docs/screenshots/E-Sign_Images/E-Sign Configuration.png b/docs/screenshots/E-Sign_Images/E-Sign Configuration.png index 37238a8..70f90e4 100644 Binary files a/docs/screenshots/E-Sign_Images/E-Sign Configuration.png and b/docs/screenshots/E-Sign_Images/E-Sign Configuration.png differ diff --git a/docs/screenshots/E-Sign_Images/E-Sign-Configuration.png b/docs/screenshots/E-Sign_Images/E-Sign-Configuration.png new file mode 100644 index 0000000..6dccbef Binary files /dev/null and b/docs/screenshots/E-Sign_Images/E-Sign-Configuration.png differ diff --git a/docs/screenshots/E-Sign_Images/Multiple_party_added.png b/docs/screenshots/E-Sign_Images/Multiple_party_added.png index 5361dc2..ac36e88 100644 Binary files a/docs/screenshots/E-Sign_Images/Multiple_party_added.png and b/docs/screenshots/E-Sign_Images/Multiple_party_added.png differ diff --git a/docs/screenshots/E-Sign_Images/Multiple_party_mail.png b/docs/screenshots/E-Sign_Images/Multiple_party_mail.png index e357b47..70c9bf7 100644 Binary files a/docs/screenshots/E-Sign_Images/Multiple_party_mail.png and b/docs/screenshots/E-Sign_Images/Multiple_party_mail.png differ diff --git a/docs/screenshots/E-Sign_Images/Multiple_party_mail1.png b/docs/screenshots/E-Sign_Images/Multiple_party_mail1.png new file mode 100644 index 0000000..23cac55 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Multiple_party_mail1.png differ diff --git a/docs/screenshots/E-Sign_Images/Party1_Document_Editing_Done.png b/docs/screenshots/E-Sign_Images/Party1_Document_Editing_Done.png index 7ba66df..2b70948 100644 Binary files a/docs/screenshots/E-Sign_Images/Party1_Document_Editing_Done.png and b/docs/screenshots/E-Sign_Images/Party1_Document_Editing_Done.png differ diff --git a/docs/screenshots/E-Sign_Images/Party1_Recipient_Mail.png b/docs/screenshots/E-Sign_Images/Party1_Recipient_Mail.png index a61b9d1..a655e4e 100644 Binary files a/docs/screenshots/E-Sign_Images/Party1_Recipient_Mail.png and b/docs/screenshots/E-Sign_Images/Party1_Recipient_Mail.png differ diff --git a/docs/screenshots/E-Sign_Images/Party2_Document_Editing_Done.png b/docs/screenshots/E-Sign_Images/Party2_Document_Editing_Done.png index 1371718..987a63f 100644 Binary files a/docs/screenshots/E-Sign_Images/Party2_Document_Editing_Done.png and b/docs/screenshots/E-Sign_Images/Party2_Document_Editing_Done.png differ diff --git a/docs/screenshots/E-Sign_Images/Party2_Recipient_Mail.png b/docs/screenshots/E-Sign_Images/Party2_Recipient_Mail.png index ffbaaf9..11334cb 100644 Binary files a/docs/screenshots/E-Sign_Images/Party2_Recipient_Mail.png and b/docs/screenshots/E-Sign_Images/Party2_Recipient_Mail.png differ diff --git a/docs/screenshots/E-Sign_Images/Recipient_Contract_Editing.png b/docs/screenshots/E-Sign_Images/Recipient_Contract_Editing.png index 96893db..888660d 100644 Binary files a/docs/screenshots/E-Sign_Images/Recipient_Contract_Editing.png and b/docs/screenshots/E-Sign_Images/Recipient_Contract_Editing.png differ diff --git a/docs/screenshots/E-Sign_Images/Recipient_declining.png b/docs/screenshots/E-Sign_Images/Recipient_declining.png index b3ad537..44cec0d 100644 Binary files a/docs/screenshots/E-Sign_Images/Recipient_declining.png and b/docs/screenshots/E-Sign_Images/Recipient_declining.png differ diff --git a/docs/screenshots/E-Sign_Images/Rename-file.png b/docs/screenshots/E-Sign_Images/Rename-file.png new file mode 100644 index 0000000..fbac9fb Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Rename-file.png differ diff --git a/docs/screenshots/E-Sign_Images/Rename-file1.png b/docs/screenshots/E-Sign_Images/Rename-file1.png new file mode 100644 index 0000000..36707d4 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Rename-file1.png differ diff --git a/docs/screenshots/E-Sign_Images/Resend_Popup.png b/docs/screenshots/E-Sign_Images/Resend_Popup.png index 8c4acd6..4e577bc 100644 Binary files a/docs/screenshots/E-Sign_Images/Resend_Popup.png and b/docs/screenshots/E-Sign_Images/Resend_Popup.png differ diff --git a/docs/screenshots/E-Sign_Images/Resend_Popup1.png b/docs/screenshots/E-Sign_Images/Resend_Popup1.png new file mode 100644 index 0000000..17221e4 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Resend_Popup1.png differ diff --git a/docs/screenshots/E-Sign_Images/Resend_pending_status.png b/docs/screenshots/E-Sign_Images/Resend_pending_status.png index 2402ead..6fa08e8 100644 Binary files a/docs/screenshots/E-Sign_Images/Resend_pending_status.png and b/docs/screenshots/E-Sign_Images/Resend_pending_status.png differ diff --git a/docs/screenshots/E-Sign_Images/Resend_pending_status1.png b/docs/screenshots/E-Sign_Images/Resend_pending_status1.png new file mode 100644 index 0000000..4781929 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Resend_pending_status1.png differ diff --git a/docs/screenshots/E-Sign_Images/SSL_Certificate.png b/docs/screenshots/E-Sign_Images/SSL_Certificate.png index e07b104..c17dd8a 100644 Binary files a/docs/screenshots/E-Sign_Images/SSL_Certificate.png and b/docs/screenshots/E-Sign_Images/SSL_Certificate.png differ diff --git a/docs/screenshots/E-Sign_Images/Save_Template.png b/docs/screenshots/E-Sign_Images/Save_Template.png index 9a94b0c..f865675 100644 Binary files a/docs/screenshots/E-Sign_Images/Save_Template.png and b/docs/screenshots/E-Sign_Images/Save_Template.png differ diff --git a/docs/screenshots/E-Sign_Images/Sec_SS.png b/docs/screenshots/E-Sign_Images/Sec_SS.png new file mode 100644 index 0000000..ecabfc0 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Sec_SS.png differ diff --git a/docs/screenshots/E-Sign_Images/Send_mail.png b/docs/screenshots/E-Sign_Images/Send_mail.png index 793abec..c79e914 100644 Binary files a/docs/screenshots/E-Sign_Images/Send_mail.png and b/docs/screenshots/E-Sign_Images/Send_mail.png differ diff --git a/docs/screenshots/E-Sign_Images/Set_Reminder.png b/docs/screenshots/E-Sign_Images/Set_Reminder.png index 21364ff..adb8d7d 100644 Binary files a/docs/screenshots/E-Sign_Images/Set_Reminder.png and b/docs/screenshots/E-Sign_Images/Set_Reminder.png differ diff --git a/docs/screenshots/E-Sign_Images/ShareDocument_Add_Recipient.png b/docs/screenshots/E-Sign_Images/ShareDocument_Add_Recipient.png index 7e1d425..9224682 100644 Binary files a/docs/screenshots/E-Sign_Images/ShareDocument_Add_Recipient.png and b/docs/screenshots/E-Sign_Images/ShareDocument_Add_Recipient.png differ diff --git a/docs/screenshots/E-Sign_Images/ShareDocument_Schedule_Mail.png b/docs/screenshots/E-Sign_Images/ShareDocument_Schedule_Mail.png index a7d21d4..e9f51d1 100644 Binary files a/docs/screenshots/E-Sign_Images/ShareDocument_Schedule_Mail.png and b/docs/screenshots/E-Sign_Images/ShareDocument_Schedule_Mail.png differ diff --git a/docs/screenshots/E-Sign_Images/ShareDocument_Send_Mail.png b/docs/screenshots/E-Sign_Images/ShareDocument_Send_Mail.png index 4f8dea6..962aa76 100644 Binary files a/docs/screenshots/E-Sign_Images/ShareDocument_Send_Mail.png and b/docs/screenshots/E-Sign_Images/ShareDocument_Send_Mail.png differ diff --git a/docs/screenshots/E-Sign_Images/ShareDocument_Set_Reminder.png b/docs/screenshots/E-Sign_Images/ShareDocument_Set_Reminder.png index 739a43c..5fec548 100644 Binary files a/docs/screenshots/E-Sign_Images/ShareDocument_Set_Reminder.png and b/docs/screenshots/E-Sign_Images/ShareDocument_Set_Reminder.png differ diff --git a/docs/screenshots/E-Sign_Images/SharedDocument_Audit.png b/docs/screenshots/E-Sign_Images/SharedDocument_Audit.png index 14baa39..e4766f7 100644 Binary files a/docs/screenshots/E-Sign_Images/SharedDocument_Audit.png and b/docs/screenshots/E-Sign_Images/SharedDocument_Audit.png differ diff --git a/docs/screenshots/E-Sign_Images/SharedDocument_Resend_Or_Cancel.png b/docs/screenshots/E-Sign_Images/SharedDocument_Resend_Or_Cancel.png index c3afbf5..e1098be 100644 Binary files a/docs/screenshots/E-Sign_Images/SharedDocument_Resend_Or_Cancel.png and b/docs/screenshots/E-Sign_Images/SharedDocument_Resend_Or_Cancel.png differ diff --git a/docs/screenshots/E-Sign_Images/SharedDocument_Status.png b/docs/screenshots/E-Sign_Images/SharedDocument_Status.png index d9a557a..1b30ec0 100644 Binary files a/docs/screenshots/E-Sign_Images/SharedDocument_Status.png and b/docs/screenshots/E-Sign_Images/SharedDocument_Status.png differ diff --git a/docs/screenshots/E-Sign_Images/Signing_the _document.png b/docs/screenshots/E-Sign_Images/Signing_the _document.png index d712255..69fda0b 100644 Binary files a/docs/screenshots/E-Sign_Images/Signing_the _document.png and b/docs/screenshots/E-Sign_Images/Signing_the _document.png differ diff --git a/docs/screenshots/E-Sign_Images/Single_mail.png b/docs/screenshots/E-Sign_Images/Single_mail.png index ebd267e..30dcca7 100644 Binary files a/docs/screenshots/E-Sign_Images/Single_mail.png and b/docs/screenshots/E-Sign_Images/Single_mail.png differ diff --git a/docs/screenshots/E-Sign_Images/Single_mail1.png b/docs/screenshots/E-Sign_Images/Single_mail1.png new file mode 100644 index 0000000..787f609 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/Single_mail1.png differ diff --git a/docs/screenshots/E-Sign_Images/Submitted_successfully.png b/docs/screenshots/E-Sign_Images/Submitted_successfully.png index 7573e2d..f836e34 100644 Binary files a/docs/screenshots/E-Sign_Images/Submitted_successfully.png and b/docs/screenshots/E-Sign_Images/Submitted_successfully.png differ diff --git a/docs/screenshots/E-Sign_Images/Template_Navigation1.png b/docs/screenshots/E-Sign_Images/Template_Navigation1.png index ec58904..8d0d9b8 100644 Binary files a/docs/screenshots/E-Sign_Images/Template_Navigation1.png and b/docs/screenshots/E-Sign_Images/Template_Navigation1.png differ diff --git a/docs/screenshots/E-Sign_Images/Template_Navigation2.png b/docs/screenshots/E-Sign_Images/Template_Navigation2.png index 072f088..29e01ca 100644 Binary files a/docs/screenshots/E-Sign_Images/Template_Navigation2.png and b/docs/screenshots/E-Sign_Images/Template_Navigation2.png differ diff --git a/docs/screenshots/E-Sign_Images/Update_Template1.png b/docs/screenshots/E-Sign_Images/Update_Template1.png index be582ee..51b143d 100644 Binary files a/docs/screenshots/E-Sign_Images/Update_Template1.png and b/docs/screenshots/E-Sign_Images/Update_Template1.png differ diff --git a/docs/screenshots/E-Sign_Images/Update_Template2.png b/docs/screenshots/E-Sign_Images/Update_Template2.png index fd40e12..035e941 100644 Binary files a/docs/screenshots/E-Sign_Images/Update_Template2.png and b/docs/screenshots/E-Sign_Images/Update_Template2.png differ diff --git a/docs/screenshots/E-Sign_Images/Update_Template3.png b/docs/screenshots/E-Sign_Images/Update_Template3.png index 500faa8..1a9a16f 100644 Binary files a/docs/screenshots/E-Sign_Images/Update_Template3.png and b/docs/screenshots/E-Sign_Images/Update_Template3.png differ diff --git a/docs/screenshots/E-Sign_Images/receiving email.png b/docs/screenshots/E-Sign_Images/receiving email.png index 6092f83..7cd08d8 100644 Binary files a/docs/screenshots/E-Sign_Images/receiving email.png and b/docs/screenshots/E-Sign_Images/receiving email.png differ diff --git a/docs/screenshots/E-Sign_Images/self-sign1.png b/docs/screenshots/E-Sign_Images/self-sign1.png new file mode 100644 index 0000000..0cbbe74 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/self-sign1.png differ diff --git a/docs/screenshots/E-Sign_Images/self-sign2.png b/docs/screenshots/E-Sign_Images/self-sign2.png new file mode 100644 index 0000000..b31aa8c Binary files /dev/null and b/docs/screenshots/E-Sign_Images/self-sign2.png differ diff --git a/docs/screenshots/E-Sign_Images/self-sign3.png b/docs/screenshots/E-Sign_Images/self-sign3.png new file mode 100644 index 0000000..9e45398 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/self-sign3.png differ diff --git a/docs/screenshots/E-Sign_Images/self-sign4.png b/docs/screenshots/E-Sign_Images/self-sign4.png new file mode 100644 index 0000000..cfcb089 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/self-sign4.png differ diff --git a/docs/screenshots/E-Sign_Images/self-sign5.png b/docs/screenshots/E-Sign_Images/self-sign5.png new file mode 100644 index 0000000..7945a69 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/self-sign5.png differ diff --git a/docs/screenshots/E-Sign_Images/self-sign6.png b/docs/screenshots/E-Sign_Images/self-sign6.png new file mode 100644 index 0000000..c5c7cb8 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/self-sign6.png differ diff --git a/docs/screenshots/E-Sign_Images/self-sign7.png b/docs/screenshots/E-Sign_Images/self-sign7.png new file mode 100644 index 0000000..0162df9 Binary files /dev/null and b/docs/screenshots/E-Sign_Images/self-sign7.png differ diff --git a/docs/screenshots/Forms/AllDoc1.png b/docs/screenshots/Forms/AllDoc1.png index cdbfd07..30b1386 100644 Binary files a/docs/screenshots/Forms/AllDoc1.png and b/docs/screenshots/Forms/AllDoc1.png differ diff --git a/docs/screenshots/Forms/CloneForm-Audit.png b/docs/screenshots/Forms/CloneForm-Audit.png deleted file mode 100644 index 8d9075a..0000000 Binary files a/docs/screenshots/Forms/CloneForm-Audit.png and /dev/null differ diff --git a/docs/screenshots/Forms/CreateForm1.png b/docs/screenshots/Forms/CreateForm1.png index 65fc632..55e5360 100644 Binary files a/docs/screenshots/Forms/CreateForm1.png and b/docs/screenshots/Forms/CreateForm1.png differ diff --git a/docs/screenshots/Forms/CreateForm2.png b/docs/screenshots/Forms/CreateForm2.png index 1085a0a..7932406 100644 Binary files a/docs/screenshots/Forms/CreateForm2.png and b/docs/screenshots/Forms/CreateForm2.png differ diff --git a/docs/screenshots/Forms/Form-Cancel.png b/docs/screenshots/Forms/Form-Cancel.png index 6db350d..a5d3779 100644 Binary files a/docs/screenshots/Forms/Form-Cancel.png and b/docs/screenshots/Forms/Form-Cancel.png differ diff --git a/docs/screenshots/Forms/Form-Cancel2.png b/docs/screenshots/Forms/Form-Cancel2.png index 4d75909..27cb1f9 100644 Binary files a/docs/screenshots/Forms/Form-Cancel2.png and b/docs/screenshots/Forms/Form-Cancel2.png differ diff --git a/docs/screenshots/Forms/Form-Cancel3.png b/docs/screenshots/Forms/Form-Cancel3.png index 2617028..8bd2d90 100644 Binary files a/docs/screenshots/Forms/Form-Cancel3.png and b/docs/screenshots/Forms/Form-Cancel3.png differ diff --git a/docs/screenshots/Forms/Form-Cancel4.png b/docs/screenshots/Forms/Form-Cancel4.png index 27e5051..31c1317 100644 Binary files a/docs/screenshots/Forms/Form-Cancel4.png and b/docs/screenshots/Forms/Form-Cancel4.png differ diff --git a/docs/screenshots/Forms/Form-Clone.png b/docs/screenshots/Forms/Form-Clone.png index 2e40f4f..696d0d4 100644 Binary files a/docs/screenshots/Forms/Form-Clone.png and b/docs/screenshots/Forms/Form-Clone.png differ diff --git a/docs/screenshots/Forms/Form-Clone1.png b/docs/screenshots/Forms/Form-Clone1.png new file mode 100644 index 0000000..edd8b69 Binary files /dev/null and b/docs/screenshots/Forms/Form-Clone1.png differ diff --git a/docs/screenshots/Forms/Form-Delete.png b/docs/screenshots/Forms/Form-Delete.png index 4b3f294..30ed611 100644 Binary files a/docs/screenshots/Forms/Form-Delete.png and b/docs/screenshots/Forms/Form-Delete.png differ diff --git a/docs/screenshots/Forms/Form-Delete2.png b/docs/screenshots/Forms/Form-Delete2.png index 0d94bd0..1c9b05d 100644 Binary files a/docs/screenshots/Forms/Form-Delete2.png and b/docs/screenshots/Forms/Form-Delete2.png differ diff --git a/docs/screenshots/Forms/Form-OverAllSub2.png b/docs/screenshots/Forms/Form-OverAllSub2.png index 3b6b75b..9239126 100644 Binary files a/docs/screenshots/Forms/Form-OverAllSub2.png and b/docs/screenshots/Forms/Form-OverAllSub2.png differ diff --git a/docs/screenshots/Forms/Form-Resend.png b/docs/screenshots/Forms/Form-Resend.png index d0902ac..6c821bd 100644 Binary files a/docs/screenshots/Forms/Form-Resend.png and b/docs/screenshots/Forms/Form-Resend.png differ diff --git a/docs/screenshots/Forms/Form-Resend2.png b/docs/screenshots/Forms/Form-Resend2.png index dc5d5ee..6e13b8d 100644 Binary files a/docs/screenshots/Forms/Form-Resend2.png and b/docs/screenshots/Forms/Form-Resend2.png differ diff --git a/docs/screenshots/Forms/FormOverAllSub2.png b/docs/screenshots/Forms/FormOverAllSub2.png new file mode 100644 index 0000000..a054fe6 Binary files /dev/null and b/docs/screenshots/Forms/FormOverAllSub2.png differ diff --git a/docs/screenshots/Forms/OverallForm.png b/docs/screenshots/Forms/OverallForm.png index 3c707a1..38dc4e9 100644 Binary files a/docs/screenshots/Forms/OverallForm.png and b/docs/screenshots/Forms/OverallForm.png differ diff --git a/docs/screenshots/Forms/RepSub1.png b/docs/screenshots/Forms/RepSub1.png index 461c491..7e2ea0f 100644 Binary files a/docs/screenshots/Forms/RepSub1.png and b/docs/screenshots/Forms/RepSub1.png differ diff --git a/docs/screenshots/Forms/RepSub2.png b/docs/screenshots/Forms/RepSub2.png index 7f13a58..5aa1a37 100644 Binary files a/docs/screenshots/Forms/RepSub2.png and b/docs/screenshots/Forms/RepSub2.png differ diff --git a/docs/screenshots/Forms/RepSub3.png b/docs/screenshots/Forms/RepSub3.png new file mode 100644 index 0000000..73b0529 Binary files /dev/null and b/docs/screenshots/Forms/RepSub3.png differ diff --git a/docs/screenshots/Forms/RevSub1.png b/docs/screenshots/Forms/RevSub1.png index e3eb2ec..1fb458e 100644 Binary files a/docs/screenshots/Forms/RevSub1.png and b/docs/screenshots/Forms/RevSub1.png differ diff --git a/docs/screenshots/Forms/SendForm1.png b/docs/screenshots/Forms/SendForm1.png index 840143d..c44bd88 100644 Binary files a/docs/screenshots/Forms/SendForm1.png and b/docs/screenshots/Forms/SendForm1.png differ diff --git a/docs/screenshots/Forms/SendForm2.png b/docs/screenshots/Forms/SendForm2.png index 9a722f8..7cc684b 100644 Binary files a/docs/screenshots/Forms/SendForm2.png and b/docs/screenshots/Forms/SendForm2.png differ diff --git a/docs/screenshots/Forms/SpecRecpt-Form.png b/docs/screenshots/Forms/SpecRecpt-Form.png index 678792b..7419ce1 100644 Binary files a/docs/screenshots/Forms/SpecRecpt-Form.png and b/docs/screenshots/Forms/SpecRecpt-Form.png differ diff --git a/docs/screenshots/Forms/SpecRecptDetail-Form.png b/docs/screenshots/Forms/SpecRecptDetail-Form.png index 0642cf9..38046f7 100644 Binary files a/docs/screenshots/Forms/SpecRecptDetail-Form.png and b/docs/screenshots/Forms/SpecRecptDetail-Form.png differ diff --git a/docs/screenshots/Forms/ViewSingleForm.png b/docs/screenshots/Forms/ViewSingleForm.png index a9d9f41..d6b65ad 100644 Binary files a/docs/screenshots/Forms/ViewSingleForm.png and b/docs/screenshots/Forms/ViewSingleForm.png differ diff --git a/docs/screenshots/Library_Management_Images/Lib-Doc1.png b/docs/screenshots/Library_Management_Images/Lib-Doc1.png new file mode 100644 index 0000000..9953b7d Binary files /dev/null and b/docs/screenshots/Library_Management_Images/Lib-Doc1.png differ diff --git a/docs/screenshots/Library_Management_Images/Lib-Doc2.png b/docs/screenshots/Library_Management_Images/Lib-Doc2.png new file mode 100644 index 0000000..0704cf8 Binary files /dev/null and b/docs/screenshots/Library_Management_Images/Lib-Doc2.png differ diff --git a/docs/screenshots/Library_Management_Images/Lib-Doc3.png b/docs/screenshots/Library_Management_Images/Lib-Doc3.png new file mode 100644 index 0000000..b71e91f Binary files /dev/null and b/docs/screenshots/Library_Management_Images/Lib-Doc3.png differ diff --git a/docs/screenshots/Library_Management_Images/Lib-Doc4.png b/docs/screenshots/Library_Management_Images/Lib-Doc4.png new file mode 100644 index 0000000..c9bbe8a Binary files /dev/null and b/docs/screenshots/Library_Management_Images/Lib-Doc4.png differ diff --git a/docs/screenshots/Library_Management_Images/Lib-Doc5.png b/docs/screenshots/Library_Management_Images/Lib-Doc5.png new file mode 100644 index 0000000..5b0772a Binary files /dev/null and b/docs/screenshots/Library_Management_Images/Lib-Doc5.png differ diff --git a/docs/screenshots/Library_Management_Images/Lib-Doc6.png b/docs/screenshots/Library_Management_Images/Lib-Doc6.png new file mode 100644 index 0000000..8e3588a Binary files /dev/null and b/docs/screenshots/Library_Management_Images/Lib-Doc6.png differ diff --git a/docs/screenshots/Library_Management_Images/Lib-Doc7.png b/docs/screenshots/Library_Management_Images/Lib-Doc7.png new file mode 100644 index 0000000..12a6581 Binary files /dev/null and b/docs/screenshots/Library_Management_Images/Lib-Doc7.png differ diff --git a/docs/screenshots/Library_Management_Images/Lib-Doc8.png b/docs/screenshots/Library_Management_Images/Lib-Doc8.png new file mode 100644 index 0000000..ed55dfd Binary files /dev/null and b/docs/screenshots/Library_Management_Images/Lib-Doc8.png differ diff --git a/docs/screenshots/Library_Management_Images/Lib-Doc9.png b/docs/screenshots/Library_Management_Images/Lib-Doc9.png new file mode 100644 index 0000000..a8239f4 Binary files /dev/null and b/docs/screenshots/Library_Management_Images/Lib-Doc9.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker1.png b/docs/screenshots/Notes_Taker/Notes_Taker1.png new file mode 100644 index 0000000..ab359dd Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker1.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker10.png b/docs/screenshots/Notes_Taker/Notes_Taker10.png new file mode 100644 index 0000000..957c0a8 Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker10.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker2.png b/docs/screenshots/Notes_Taker/Notes_Taker2.png new file mode 100644 index 0000000..ccc1c0f Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker2.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker3.png b/docs/screenshots/Notes_Taker/Notes_Taker3.png new file mode 100644 index 0000000..79f41b6 Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker3.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker4.png b/docs/screenshots/Notes_Taker/Notes_Taker4.png new file mode 100644 index 0000000..d5a2005 Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker4.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker5.png b/docs/screenshots/Notes_Taker/Notes_Taker5.png new file mode 100644 index 0000000..9490a65 Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker5.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker6.png b/docs/screenshots/Notes_Taker/Notes_Taker6.png new file mode 100644 index 0000000..fd4731c Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker6.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker7.png b/docs/screenshots/Notes_Taker/Notes_Taker7.png new file mode 100644 index 0000000..30db058 Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker7.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker8.png b/docs/screenshots/Notes_Taker/Notes_Taker8.png new file mode 100644 index 0000000..43e516b Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker8.png differ diff --git a/docs/screenshots/Notes_Taker/Notes_Taker9.png b/docs/screenshots/Notes_Taker/Notes_Taker9.png new file mode 100644 index 0000000..44ecaf1 Binary files /dev/null and b/docs/screenshots/Notes_Taker/Notes_Taker9.png differ diff --git a/docs/screenshots/Schedule-email/schedule-email1.png b/docs/screenshots/Schedule-email/schedule-email1.png new file mode 100644 index 0000000..93ad4a0 Binary files /dev/null and b/docs/screenshots/Schedule-email/schedule-email1.png differ diff --git a/docs/screenshots/Schedule-email/schedule-email2.png b/docs/screenshots/Schedule-email/schedule-email2.png new file mode 100644 index 0000000..8fb4d00 Binary files /dev/null and b/docs/screenshots/Schedule-email/schedule-email2.png differ diff --git a/docs/screenshots/Schedule-email/schedule-email3.png b/docs/screenshots/Schedule-email/schedule-email3.png new file mode 100644 index 0000000..4b1d56b Binary files /dev/null and b/docs/screenshots/Schedule-email/schedule-email3.png differ diff --git a/docs/screenshots/Schedule-email/schedule-email4.png b/docs/screenshots/Schedule-email/schedule-email4.png new file mode 100644 index 0000000..557cf61 Binary files /dev/null and b/docs/screenshots/Schedule-email/schedule-email4.png differ diff --git a/docs/screenshots/Schedule-email/schedule-email5.png b/docs/screenshots/Schedule-email/schedule-email5.png new file mode 100644 index 0000000..dfb1908 Binary files /dev/null and b/docs/screenshots/Schedule-email/schedule-email5.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign10.png b/docs/screenshots/Self_E-sign/Self_Sign10.png new file mode 100644 index 0000000..0bcbc36 Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign10.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign_1.png b/docs/screenshots/Self_E-sign/Self_Sign_1.png new file mode 100644 index 0000000..317c410 Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign_1.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign_2.png b/docs/screenshots/Self_E-sign/Self_Sign_2.png new file mode 100644 index 0000000..3df5a0b Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign_2.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign_3.png b/docs/screenshots/Self_E-sign/Self_Sign_3.png new file mode 100644 index 0000000..6488b25 Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign_3.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign_4.png b/docs/screenshots/Self_E-sign/Self_Sign_4.png new file mode 100644 index 0000000..28ec62d Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign_4.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign_5.png b/docs/screenshots/Self_E-sign/Self_Sign_5.png new file mode 100644 index 0000000..5f04e21 Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign_5.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign_6.png b/docs/screenshots/Self_E-sign/Self_Sign_6.png new file mode 100644 index 0000000..5d61926 Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign_6.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign_7.png b/docs/screenshots/Self_E-sign/Self_Sign_7.png new file mode 100644 index 0000000..743f8e3 Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign_7.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign_8.png b/docs/screenshots/Self_E-sign/Self_Sign_8.png new file mode 100644 index 0000000..8527616 Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign_8.png differ diff --git a/docs/screenshots/Self_E-sign/Self_Sign_9.png b/docs/screenshots/Self_E-sign/Self_Sign_9.png new file mode 100644 index 0000000..7becef9 Binary files /dev/null and b/docs/screenshots/Self_E-sign/Self_Sign_9.png differ diff --git a/docs/screenshots/Thumbnail/DemoPics.png b/docs/screenshots/Thumbnail/DemoPics.png deleted file mode 100644 index 0dbd53c..0000000 Binary files a/docs/screenshots/Thumbnail/DemoPics.png and /dev/null differ diff --git a/docs/screenshots/Thumbnail/E-Sign.png b/docs/screenshots/Thumbnail/E-Sign.png new file mode 100644 index 0000000..5b994f9 Binary files /dev/null and b/docs/screenshots/Thumbnail/E-Sign.png differ diff --git a/docs/screenshots/Thumbnail/Forms.png b/docs/screenshots/Thumbnail/Forms.png new file mode 100644 index 0000000..70d0aef Binary files /dev/null and b/docs/screenshots/Thumbnail/Forms.png differ diff --git a/docs/screenshots/Two-Factor_Authentication/2FA-1.png b/docs/screenshots/Two-Factor_Authentication/2FA-1.png new file mode 100644 index 0000000..efc6154 Binary files /dev/null and b/docs/screenshots/Two-Factor_Authentication/2FA-1.png differ diff --git a/docs/screenshots/Two-Factor_Authentication/2FA-2.png b/docs/screenshots/Two-Factor_Authentication/2FA-2.png new file mode 100644 index 0000000..a0c765b Binary files /dev/null and b/docs/screenshots/Two-Factor_Authentication/2FA-2.png differ diff --git a/docs/screenshots/Two-Factor_Authentication/2FA-3.png b/docs/screenshots/Two-Factor_Authentication/2FA-3.png new file mode 100644 index 0000000..c76b7d8 Binary files /dev/null and b/docs/screenshots/Two-Factor_Authentication/2FA-3.png differ diff --git a/docs/screenshots/Two-Factor_Authentication/2FA-4.png b/docs/screenshots/Two-Factor_Authentication/2FA-4.png new file mode 100644 index 0000000..46f78ef Binary files /dev/null and b/docs/screenshots/Two-Factor_Authentication/2FA-4.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field1.png b/docs/screenshots/Variable-Fields/variable-field1.png new file mode 100644 index 0000000..717cd33 Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field1.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field10.png b/docs/screenshots/Variable-Fields/variable-field10.png new file mode 100644 index 0000000..c61b874 Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field10.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field11.png b/docs/screenshots/Variable-Fields/variable-field11.png new file mode 100644 index 0000000..3a0fd8f Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field11.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field13.png b/docs/screenshots/Variable-Fields/variable-field13.png new file mode 100644 index 0000000..b863e0c Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field13.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field15.png b/docs/screenshots/Variable-Fields/variable-field15.png new file mode 100644 index 0000000..6ba7c0c Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field15.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field2.png b/docs/screenshots/Variable-Fields/variable-field2.png new file mode 100644 index 0000000..8ede9ac Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field2.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field3.png b/docs/screenshots/Variable-Fields/variable-field3.png new file mode 100644 index 0000000..1494f37 Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field3.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field4.png b/docs/screenshots/Variable-Fields/variable-field4.png new file mode 100644 index 0000000..bd527c9 Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field4.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field5.png b/docs/screenshots/Variable-Fields/variable-field5.png new file mode 100644 index 0000000..be3cf3f Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field5.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field6.png b/docs/screenshots/Variable-Fields/variable-field6.png new file mode 100644 index 0000000..fa7b304 Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field6.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field7.png b/docs/screenshots/Variable-Fields/variable-field7.png new file mode 100644 index 0000000..8a85ee7 Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field7.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field8.png b/docs/screenshots/Variable-Fields/variable-field8.png new file mode 100644 index 0000000..23b5351 Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field8.png differ diff --git a/docs/screenshots/Variable-Fields/variable-field9.png b/docs/screenshots/Variable-Fields/variable-field9.png new file mode 100644 index 0000000..66bdba2 Binary files /dev/null and b/docs/screenshots/Variable-Fields/variable-field9.png differ diff --git a/docs/screenshots/releaseNotes/AI_Field_Detection_Button.png b/docs/screenshots/releaseNotes/AI_Field_Detection_Button.png new file mode 100644 index 0000000..3b531d7 Binary files /dev/null and b/docs/screenshots/releaseNotes/AI_Field_Detection_Button.png differ diff --git a/docs/screenshots/releaseNotes/AI_Field_Detection_Popup.png b/docs/screenshots/releaseNotes/AI_Field_Detection_Popup.png new file mode 100644 index 0000000..11cb998 Binary files /dev/null and b/docs/screenshots/releaseNotes/AI_Field_Detection_Popup.png differ diff --git a/docs/screenshots/releaseNotes/AI_Form_Button.png b/docs/screenshots/releaseNotes/AI_Form_Button.png new file mode 100644 index 0000000..ee39cb3 Binary files /dev/null and b/docs/screenshots/releaseNotes/AI_Form_Button.png differ diff --git a/docs/screenshots/releaseNotes/AI_Form_Popup.png b/docs/screenshots/releaseNotes/AI_Form_Popup.png new file mode 100644 index 0000000..42d3d3e Binary files /dev/null and b/docs/screenshots/releaseNotes/AI_Form_Popup.png differ diff --git a/docs/screenshots/releaseNotes/Certificate_enabled.png b/docs/screenshots/releaseNotes/Certificate_enabled.png new file mode 100644 index 0000000..f7f4d3a Binary files /dev/null and b/docs/screenshots/releaseNotes/Certificate_enabled.png differ diff --git a/docs/screenshots/releaseNotes/Copy_file_1.png b/docs/screenshots/releaseNotes/Copy_file_1.png new file mode 100644 index 0000000..402eead Binary files /dev/null and b/docs/screenshots/releaseNotes/Copy_file_1.png differ diff --git a/docs/screenshots/releaseNotes/Copy_file_2.png b/docs/screenshots/releaseNotes/Copy_file_2.png new file mode 100644 index 0000000..071f007 Binary files /dev/null and b/docs/screenshots/releaseNotes/Copy_file_2.png differ diff --git a/docs/screenshots/releaseNotes/Copy_link.png b/docs/screenshots/releaseNotes/Copy_link.png new file mode 100644 index 0000000..fefde0c Binary files /dev/null and b/docs/screenshots/releaseNotes/Copy_link.png differ diff --git a/docs/screenshots/releaseNotes/Date_format_1.png b/docs/screenshots/releaseNotes/Date_format_1.png new file mode 100644 index 0000000..1ad9eee Binary files /dev/null and b/docs/screenshots/releaseNotes/Date_format_1.png differ diff --git a/docs/screenshots/releaseNotes/Date_format_2.png b/docs/screenshots/releaseNotes/Date_format_2.png new file mode 100644 index 0000000..72a3116 Binary files /dev/null and b/docs/screenshots/releaseNotes/Date_format_2.png differ diff --git a/docs/screenshots/releaseNotes/Document_Editor.png b/docs/screenshots/releaseNotes/Document_Editor.png new file mode 100644 index 0000000..4ab28e7 Binary files /dev/null and b/docs/screenshots/releaseNotes/Document_Editor.png differ diff --git a/docs/screenshots/releaseNotes/Download-1.png b/docs/screenshots/releaseNotes/Download-1.png new file mode 100644 index 0000000..afaa970 Binary files /dev/null and b/docs/screenshots/releaseNotes/Download-1.png differ diff --git a/docs/screenshots/releaseNotes/Download-2.png b/docs/screenshots/releaseNotes/Download-2.png new file mode 100644 index 0000000..1142fd4 Binary files /dev/null and b/docs/screenshots/releaseNotes/Download-2.png differ diff --git a/docs/screenshots/releaseNotes/E-SIGN_RECORD-1.png b/docs/screenshots/releaseNotes/E-SIGN_RECORD-1.png new file mode 100644 index 0000000..23a044b Binary files /dev/null and b/docs/screenshots/releaseNotes/E-SIGN_RECORD-1.png differ diff --git a/docs/screenshots/releaseNotes/E-SIGN_RECORD-2.png b/docs/screenshots/releaseNotes/E-SIGN_RECORD-2.png new file mode 100644 index 0000000..62e3d23 Binary files /dev/null and b/docs/screenshots/releaseNotes/E-SIGN_RECORD-2.png differ diff --git a/docs/screenshots/releaseNotes/E-SIGN_RECORD-3.png b/docs/screenshots/releaseNotes/E-SIGN_RECORD-3.png new file mode 100644 index 0000000..aa94a1c Binary files /dev/null and b/docs/screenshots/releaseNotes/E-SIGN_RECORD-3.png differ diff --git a/docs/screenshots/releaseNotes/E-SIGN_RECORD-4.png b/docs/screenshots/releaseNotes/E-SIGN_RECORD-4.png new file mode 100644 index 0000000..e683cdb Binary files /dev/null and b/docs/screenshots/releaseNotes/E-SIGN_RECORD-4.png differ diff --git a/docs/screenshots/releaseNotes/E-SIGN_RECORD-5.png b/docs/screenshots/releaseNotes/E-SIGN_RECORD-5.png new file mode 100644 index 0000000..b7887a0 Binary files /dev/null and b/docs/screenshots/releaseNotes/E-SIGN_RECORD-5.png differ diff --git a/docs/screenshots/releaseNotes/E-SIGN_RECORD-6.png b/docs/screenshots/releaseNotes/E-SIGN_RECORD-6.png new file mode 100644 index 0000000..f814731 Binary files /dev/null and b/docs/screenshots/releaseNotes/E-SIGN_RECORD-6.png differ diff --git a/docs/screenshots/releaseNotes/ESIGN-EMB1.png b/docs/screenshots/releaseNotes/ESIGN-EMB1.png new file mode 100644 index 0000000..a724c41 Binary files /dev/null and b/docs/screenshots/releaseNotes/ESIGN-EMB1.png differ diff --git a/docs/screenshots/releaseNotes/ESIGN-EMB2.png b/docs/screenshots/releaseNotes/ESIGN-EMB2.png new file mode 100644 index 0000000..f2cf99e Binary files /dev/null and b/docs/screenshots/releaseNotes/ESIGN-EMB2.png differ diff --git a/docs/screenshots/releaseNotes/ESIGN-EMB3.png b/docs/screenshots/releaseNotes/ESIGN-EMB3.png new file mode 100644 index 0000000..513b703 Binary files /dev/null and b/docs/screenshots/releaseNotes/ESIGN-EMB3.png differ diff --git a/docs/screenshots/releaseNotes/ESIGN-EMB4.png b/docs/screenshots/releaseNotes/ESIGN-EMB4.png new file mode 100644 index 0000000..9b2f15d Binary files /dev/null and b/docs/screenshots/releaseNotes/ESIGN-EMB4.png differ diff --git a/docs/screenshots/releaseNotes/Field_Label.png b/docs/screenshots/releaseNotes/Field_Label.png new file mode 100644 index 0000000..14032ec Binary files /dev/null and b/docs/screenshots/releaseNotes/Field_Label.png differ diff --git a/docs/screenshots/releaseNotes/Initial-1.png b/docs/screenshots/releaseNotes/Initial-1.png new file mode 100644 index 0000000..1853c52 Binary files /dev/null and b/docs/screenshots/releaseNotes/Initial-1.png differ diff --git a/docs/screenshots/releaseNotes/Initial-2.png b/docs/screenshots/releaseNotes/Initial-2.png new file mode 100644 index 0000000..c7a6fe7 Binary files /dev/null and b/docs/screenshots/releaseNotes/Initial-2.png differ diff --git a/docs/screenshots/releaseNotes/Multi_Party_Comparison.png b/docs/screenshots/releaseNotes/Multi_Party_Comparison.png new file mode 100644 index 0000000..845cad6 Binary files /dev/null and b/docs/screenshots/releaseNotes/Multi_Party_Comparison.png differ diff --git a/docs/screenshots/releaseNotes/PDF_Form_Comparison.png b/docs/screenshots/releaseNotes/PDF_Form_Comparison.png new file mode 100644 index 0000000..5791ebf Binary files /dev/null and b/docs/screenshots/releaseNotes/PDF_Form_Comparison.png differ diff --git a/docs/screenshots/releaseNotes/Preference-1.png b/docs/screenshots/releaseNotes/Preference-1.png new file mode 100644 index 0000000..c5346d4 Binary files /dev/null and b/docs/screenshots/releaseNotes/Preference-1.png differ diff --git a/docs/screenshots/releaseNotes/Preference-2.png b/docs/screenshots/releaseNotes/Preference-2.png new file mode 100644 index 0000000..dbf4acb Binary files /dev/null and b/docs/screenshots/releaseNotes/Preference-2.png differ diff --git a/docs/screenshots/releaseNotes/QR_Code1_Esign.png b/docs/screenshots/releaseNotes/QR_Code1_Esign.png new file mode 100644 index 0000000..4154249 Binary files /dev/null and b/docs/screenshots/releaseNotes/QR_Code1_Esign.png differ diff --git a/docs/screenshots/releaseNotes/QR_Code1_Form.png b/docs/screenshots/releaseNotes/QR_Code1_Form.png new file mode 100644 index 0000000..d3437dc Binary files /dev/null and b/docs/screenshots/releaseNotes/QR_Code1_Form.png differ diff --git a/docs/screenshots/releaseNotes/QR_Code2_Esign.png b/docs/screenshots/releaseNotes/QR_Code2_Esign.png new file mode 100644 index 0000000..e63dfc6 Binary files /dev/null and b/docs/screenshots/releaseNotes/QR_Code2_Esign.png differ diff --git a/docs/screenshots/releaseNotes/QR_Code2_Form.png b/docs/screenshots/releaseNotes/QR_Code2_Form.png new file mode 100644 index 0000000..a4b12c1 Binary files /dev/null and b/docs/screenshots/releaseNotes/QR_Code2_Form.png differ diff --git a/docs/screenshots/releaseNotes/Special_Features.png b/docs/screenshots/releaseNotes/Special_Features.png new file mode 100644 index 0000000..75bc069 Binary files /dev/null and b/docs/screenshots/releaseNotes/Special_Features.png differ diff --git a/docs/screenshots/releaseNotes/Wet-Sign1.png b/docs/screenshots/releaseNotes/Wet-Sign1.png new file mode 100644 index 0000000..f45e899 Binary files /dev/null and b/docs/screenshots/releaseNotes/Wet-Sign1.png differ diff --git a/docs/screenshots/releaseNotes/Wet-Sign2.png b/docs/screenshots/releaseNotes/Wet-Sign2.png new file mode 100644 index 0000000..fc7b900 Binary files /dev/null and b/docs/screenshots/releaseNotes/Wet-Sign2.png differ diff --git a/docs/screenshots/releaseNotes/Wet-Sign3.png b/docs/screenshots/releaseNotes/Wet-Sign3.png new file mode 100644 index 0000000..244130c Binary files /dev/null and b/docs/screenshots/releaseNotes/Wet-Sign3.png differ diff --git a/docs/screenshots/releaseNotes/Wet-Sign4.png b/docs/screenshots/releaseNotes/Wet-Sign4.png new file mode 100644 index 0000000..1b2973c Binary files /dev/null and b/docs/screenshots/releaseNotes/Wet-Sign4.png differ diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 0000000..93d0afd --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,25 @@ +{ + "name": "tutorials", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/node_modules/@types/react/LICENSE b/node_modules/@types/react/LICENSE new file mode 100644 index 0000000..9e841e7 --- /dev/null +++ b/node_modules/@types/react/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/node_modules/@types/react/README.md b/node_modules/@types/react/README.md new file mode 100644 index 0000000..4f6680b --- /dev/null +++ b/node_modules/@types/react/README.md @@ -0,0 +1,15 @@ +# Installation +> `npm install --save @types/react` + +# Summary +This package contains type definitions for react (https://react.dev/). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react. + +### Additional Details + * Last updated: Wed, 11 Feb 2026 11:44:57 GMT + * Dependencies: [csstype](https://npmjs.com/package/csstype) + +# Credits +These definitions were written by [Asana](https://asana.com), [AssureSign](http://www.assuresign.com), [Microsoft](https://microsoft.com), [John Reilly](https://github.com/johnnyreilly), [Benoit Benezech](https://github.com/bbenezech), [Patricio Zavolinsky](https://github.com/pzavolinsky), [Eric Anderson](https://github.com/ericanderson), [Dovydas Navickas](https://github.com/DovydasNavickas), [Josh Rutherford](https://github.com/theruther4d), [Guilherme Hübner](https://github.com/guilhermehubner), [Ferdy Budhidharma](https://github.com/ferdaber), [Johann Rakotoharisoa](https://github.com/jrakotoharisoa), [Olivier Pascal](https://github.com/pascaloliv), [Martin Hochel](https://github.com/hotell), [Frank Li](https://github.com/franklixuefei), [Jessica Franco](https://github.com/Jessidhia), [Saransh Kataria](https://github.com/saranshkataria), [Kanitkorn Sujautra](https://github.com/lukyth), [Sebastian Silbermann](https://github.com/eps1lon), [Kyle Scully](https://github.com/zieka), [Cong Zhang](https://github.com/dancerphil), [Dimitri Mitropoulos](https://github.com/dimitropoulos), [JongChan Choi](https://github.com/disjukr), [Victor Magalhães](https://github.com/vhfmag), [Priyanshu Rav](https://github.com/priyanshurav), [Dmitry Semigradsky](https://github.com/Semigradsky), and [Matt Pocock](https://github.com/mattpocock). diff --git a/node_modules/@types/react/canary.d.ts b/node_modules/@types/react/canary.d.ts new file mode 100644 index 0000000..e9a4312 --- /dev/null +++ b/node_modules/@types/react/canary.d.ts @@ -0,0 +1,129 @@ +/** + * These are types for things that are present in the React `canary` release channel. + * + * To load the types declared here in an actual project, there are three ways. The easiest one, + * if your `tsconfig.json` already has a `"types"` array in the `"compilerOptions"` section, + * is to add `"react/canary"` to the `"types"` array. + * + * Alternatively, a specific import syntax can to be used from a typescript file. + * This module does not exist in reality, which is why the {} is important: + * + * ```ts + * import {} from 'react/canary' + * ``` + * + * It is also possible to include it through a triple-slash reference: + * + * ```ts + * /// + * ``` + * + * Either the import or the reference only needs to appear once, anywhere in the project. + */ + +// See https://github.com/facebook/react/blob/main/packages/react/src/React.js to see how the exports are declared, + +import React = require("."); + +export {}; + +declare const UNDEFINED_VOID_ONLY: unique symbol; +type VoidOrUndefinedOnly = void | { [UNDEFINED_VOID_ONLY]: never }; + +type NativeSubmitEvent = SubmitEvent; + +declare module "." { + export function unstable_useCacheRefresh(): () => void; + + // @enableViewTransition + export interface ViewTransitionInstance { + /** + * The {@link ViewTransitionProps name} that was used in the corresponding {@link ViewTransition} component or `"auto"` if the `name` prop was omitted. + */ + name: string; + } + + export type ViewTransitionClassPerType = Record<"default" | (string & {}), "none" | "auto" | (string & {})>; + export type ViewTransitionClass = ViewTransitionClassPerType | ViewTransitionClassPerType[string]; + + export interface ViewTransitionProps { + children?: ReactNode | undefined; + /** + * Assigns the {@link https://developer.chrome.com/blog/view-transitions-update-io24#view-transition-class `view-transition-class`} class to the underlying DOM node. + */ + default?: ViewTransitionClass | undefined; + /** + * Combined with {@link className} if this `` or its parent Component is mounted and there's no other with the same name being deleted. + * `"none"` is a special value that deactivates the view transition name under that condition. + */ + enter?: ViewTransitionClass | undefined; + /** + * Combined with {@link className} if this `` or its parent Component is unmounted and there's no other with the same name being deleted. + * `"none"` is a special value that deactivates the view transition name under that condition. + */ + exit?: ViewTransitionClass | undefined; + /** + * "auto" will automatically assign a view-transition-name to the inner DOM node. + * That way you can add a View Transition to a Component without controlling its DOM nodes styling otherwise. + * + * A difference between this and the browser's built-in view-transition-name: auto is that switching the DOM nodes within the `` component preserves the same name so this example cross-fades between the DOM nodes instead of causing an exit and enter. + * @default "auto" + */ + name?: "auto" | (string & {}) | undefined; + /** + * The `` or its parent Component is mounted and there's no other `` with the same name being deleted. + */ + onEnter?: (instance: ViewTransitionInstance, types: Array) => void | (() => void); + /** + * The `` or its parent Component is unmounted and there's no other `` with the same name being deleted. + */ + onExit?: (instance: ViewTransitionInstance, types: Array) => void | (() => void); + /** + * This `` is being mounted and another `` instance with the same name is being unmounted elsewhere. + */ + onShare?: (instance: ViewTransitionInstance, types: Array) => void | (() => void); + /** + * The content of `` has changed either due to DOM mutations or because an inner child `` has resized. + */ + onUpdate?: (instance: ViewTransitionInstance, types: Array) => void | (() => void); + ref?: Ref | undefined; + /** + * Combined with {@link className} if this `` is being mounted and another instance with the same name is being unmounted elsewhere. + * `"none"` is a special value that deactivates the view transition name under that condition. + */ + share?: ViewTransitionClass | undefined; + /** + * Combined with {@link className} if the content of this `` has changed either due to DOM mutations or because an inner child has resized. + * `"none"` is a special value that deactivates the view transition name under that condition. + */ + update?: ViewTransitionClass | undefined; + } + + /** + * Opt-in for using {@link https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API View Transitions} in React. + * View Transitions only trigger for async updates like {@link startTransition}, {@link useDeferredValue}, Actions or <{@link Suspense}> revealing from fallback to content. + * Synchronous updates provide an opt-out but also guarantee that they commit immediately which View Transitions can't. + * + * @see {@link https://react.dev/reference/react/ViewTransition `` reference documentation} + */ + export const ViewTransition: ExoticComponent; + + /** + * @see {@link https://react.dev/reference/react/addTransitionType `addTransitionType` reference documentation} + */ + export function addTransitionType(type: string): void; + + // @enableFragmentRefs + export interface FragmentInstance {} + + export interface FragmentProps { + ref?: Ref | undefined; + } + + interface SubmitEvent extends SyntheticEvent { + /** + * Only available in react@canary + */ + submitter: HTMLElement | null; + } +} diff --git a/node_modules/@types/react/compiler-runtime.d.ts b/node_modules/@types/react/compiler-runtime.d.ts new file mode 100644 index 0000000..a98a26e --- /dev/null +++ b/node_modules/@types/react/compiler-runtime.d.ts @@ -0,0 +1,4 @@ +// Not meant to be used directly +// Omitting all exports so that they don't appear in IDE autocomplete. + +export {}; diff --git a/node_modules/@types/react/experimental.d.ts b/node_modules/@types/react/experimental.d.ts new file mode 100644 index 0000000..79ba1e0 --- /dev/null +++ b/node_modules/@types/react/experimental.d.ts @@ -0,0 +1,184 @@ +/** + * These are types for things that are present in the `experimental` builds of React but not yet + * on a stable build. + * + * Once they are promoted to stable they can just be moved to the main index file. + * + * To load the types declared here in an actual project, there are three ways. The easiest one, + * if your `tsconfig.json` already has a `"types"` array in the `"compilerOptions"` section, + * is to add `"react/experimental"` to the `"types"` array. + * + * Alternatively, a specific import syntax can to be used from a typescript file. + * This module does not exist in reality, which is why the {} is important: + * + * ```ts + * import {} from 'react/experimental' + * ``` + * + * It is also possible to include it through a triple-slash reference: + * + * ```ts + * /// + * ``` + * + * Either the import or the reference only needs to appear once, anywhere in the project. + */ + +// See https://github.com/facebook/react/blob/master/packages/react/src/React.js to see how the exports are declared, +// and https://github.com/facebook/react/blob/master/packages/shared/ReactFeatureFlags.js to verify which APIs are +// flagged experimental or not. Experimental APIs will be tagged with `__EXPERIMENTAL__`. +// +// For the inputs of types exported as simply a fiber tag, the `beginWork` function of ReactFiberBeginWork.js +// is a good place to start looking for details; it generally calls prop validation functions or delegates +// all tasks done as part of the render phase (the concurrent part of the React update cycle). +// +// Suspense-related handling can be found in ReactFiberThrow.js. + +import React = require("./canary"); + +export {}; + +declare const UNDEFINED_VOID_ONLY: unique symbol; +type VoidOrUndefinedOnly = void | { [UNDEFINED_VOID_ONLY]: never }; + +declare module "." { + export interface SuspenseProps { + // @enableCPUSuspense + /** + * The presence of this prop indicates that the content is computationally expensive to render. + * In other words, the tree is CPU bound and not I/O bound (e.g. due to fetching data). + * @see {@link https://github.com/facebook/react/pull/19936} + */ + defer?: boolean | undefined; + } + + export type SuspenseListRevealOrder = "forwards" | "backwards" | "together" | "independent"; + export type SuspenseListTailMode = "collapsed" | "hidden" | "visible"; + + export interface SuspenseListCommonProps { + } + + interface DirectionalSuspenseListProps extends SuspenseListCommonProps { + /** + * Note that SuspenseList require more than one child; + * it is a runtime warning to provide only a single child. + * + * It does, however, allow those children to be wrapped inside a single + * level of ``. + */ + children: Iterable | AsyncIterable; + /** + * Defines the order in which the `SuspenseList` children should be revealed. + * @default "forwards" + */ + revealOrder?: "forwards" | "backwards" | "unstable_legacy-backwards" | undefined; + /** + * Dictates how unloaded items in a SuspenseList is shown. + * + * - `collapsed` shows only the next fallback in the list. + * - `hidden` doesn't show any unloaded items. + * - `visible` shows all fallbacks in the list. + * + * @default "hidden" + */ + tail?: SuspenseListTailMode | undefined; + } + + interface NonDirectionalSuspenseListProps extends SuspenseListCommonProps { + children: ReactNode; + /** + * Defines the order in which the `SuspenseList` children should be revealed. + */ + revealOrder: Exclude; + /** + * The tail property is invalid when not using the `forwards` or `backwards` reveal orders. + */ + tail?: never; + } + + export type SuspenseListProps = DirectionalSuspenseListProps | NonDirectionalSuspenseListProps; + + /** + * `SuspenseList` helps coordinate many components that can suspend by orchestrating the order + * in which these components are revealed to the user. + * + * When multiple components need to fetch data, this data may arrive in an unpredictable order. + * However, if you wrap these items in a `SuspenseList`, React will not show an item in the list + * until previous items have been displayed (this behavior is adjustable). + * + * @see {@link https://reactjs.org/docs/concurrent-mode-reference.html#suspenselist} + * @see {@link https://reactjs.org/docs/concurrent-mode-patterns.html#suspenselist} + */ + export const unstable_SuspenseList: ExoticComponent; + + type Reference = object; + type TaintableUniqueValue = string | bigint | ArrayBufferView; + function experimental_taintUniqueValue( + message: string | undefined, + lifetime: Reference, + value: TaintableUniqueValue, + ): void; + function experimental_taintObjectReference(message: string | undefined, object: Reference): void; + + // @enableGestureTransition + // Implemented by the specific renderer e.g. `react-dom`. + // Keep in mind that augmented interfaces merge their JSDoc so if you put + // JSDoc here and in the renderer, the IDE will display both. + export interface GestureProvider {} + export interface GestureOptions { + rangeStart?: number | undefined; + rangeEnd?: number | undefined; + } + export type GestureOptionsRequired = { + [P in keyof GestureOptions]-?: NonNullable; + }; + /** */ + export function unstable_startGestureTransition( + provider: GestureProvider, + scope: () => void, + options?: GestureOptions, + ): () => void; + + interface ViewTransitionProps { + onGestureEnter?: ( + timeline: GestureProvider, + options: GestureOptionsRequired, + instance: ViewTransitionInstance, + types: Array, + ) => void | (() => void); + onGestureExit?: ( + timeline: GestureProvider, + options: GestureOptionsRequired, + instance: ViewTransitionInstance, + types: Array, + ) => void | (() => void); + onGestureShare?: ( + timeline: GestureProvider, + options: GestureOptionsRequired, + instance: ViewTransitionInstance, + types: Array, + ) => void | (() => void); + onGestureUpdate?: ( + timeline: GestureProvider, + options: GestureOptionsRequired, + instance: ViewTransitionInstance, + types: Array, + ) => void | (() => void); + } + + // @enableSrcObject + interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_IMG_SRC_TYPES { + srcObject: Blob; + } + + interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_MEDIA_SRC_TYPES { + srcObject: Blob | MediaSource | MediaStream; + } + + // @enableOptimisticKey + export const optimisticKey: unique symbol; + + interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES { + optimisticKey: typeof optimisticKey; + } +} diff --git a/node_modules/@types/react/global.d.ts b/node_modules/@types/react/global.d.ts new file mode 100644 index 0000000..61862a3 --- /dev/null +++ b/node_modules/@types/react/global.d.ts @@ -0,0 +1,166 @@ +/* +React projects that don't include the DOM library need these interfaces to compile. +React Native applications use React, but there is no DOM available. The JavaScript runtime +is ES6/ES2015 only. These definitions allow such projects to compile with only `--lib ES6`. + +Warning: all of these interfaces are empty. If you want type definitions for various properties +(such as HTMLInputElement.prototype.value), you need to add `--lib DOM` (via command line or tsconfig.json). +*/ + +interface Event {} +interface AnimationEvent extends Event {} +interface ClipboardEvent extends Event {} +interface CompositionEvent extends Event {} +interface DragEvent extends Event {} +interface FocusEvent extends Event {} +interface InputEvent extends Event {} +interface KeyboardEvent extends Event {} +interface MouseEvent extends Event {} +interface TouchEvent extends Event {} +interface PointerEvent extends Event {} +interface SubmitEvent extends Event {} +interface ToggleEvent extends Event {} +interface TransitionEvent extends Event {} +interface UIEvent extends Event {} +interface WheelEvent extends Event {} + +interface EventTarget {} +interface Document {} +interface DataTransfer {} +interface StyleMedia {} + +interface Element {} +interface DocumentFragment {} + +interface HTMLElement extends Element {} +interface HTMLAnchorElement extends HTMLElement {} +interface HTMLAreaElement extends HTMLElement {} +interface HTMLAudioElement extends HTMLElement {} +interface HTMLBaseElement extends HTMLElement {} +interface HTMLBodyElement extends HTMLElement {} +interface HTMLBRElement extends HTMLElement {} +interface HTMLButtonElement extends HTMLElement {} +interface HTMLCanvasElement extends HTMLElement {} +interface HTMLDataElement extends HTMLElement {} +interface HTMLDataListElement extends HTMLElement {} +interface HTMLDetailsElement extends HTMLElement {} +interface HTMLDialogElement extends HTMLElement {} +interface HTMLDivElement extends HTMLElement {} +interface HTMLDListElement extends HTMLElement {} +interface HTMLEmbedElement extends HTMLElement {} +interface HTMLFieldSetElement extends HTMLElement {} +interface HTMLFormElement extends HTMLElement {} +interface HTMLHeadingElement extends HTMLElement {} +interface HTMLHeadElement extends HTMLElement {} +interface HTMLHRElement extends HTMLElement {} +interface HTMLHtmlElement extends HTMLElement {} +interface HTMLIFrameElement extends HTMLElement {} +interface HTMLImageElement extends HTMLElement {} +interface HTMLInputElement extends HTMLElement {} +interface HTMLModElement extends HTMLElement {} +interface HTMLLabelElement extends HTMLElement {} +interface HTMLLegendElement extends HTMLElement {} +interface HTMLLIElement extends HTMLElement {} +interface HTMLLinkElement extends HTMLElement {} +interface HTMLMapElement extends HTMLElement {} +interface HTMLMetaElement extends HTMLElement {} +interface HTMLMeterElement extends HTMLElement {} +interface HTMLObjectElement extends HTMLElement {} +interface HTMLOListElement extends HTMLElement {} +interface HTMLOptGroupElement extends HTMLElement {} +interface HTMLOptionElement extends HTMLElement {} +interface HTMLOutputElement extends HTMLElement {} +interface HTMLParagraphElement extends HTMLElement {} +interface HTMLParamElement extends HTMLElement {} +interface HTMLPreElement extends HTMLElement {} +interface HTMLProgressElement extends HTMLElement {} +interface HTMLQuoteElement extends HTMLElement {} +interface HTMLSlotElement extends HTMLElement {} +interface HTMLScriptElement extends HTMLElement {} +interface HTMLSelectElement extends HTMLElement {} +interface HTMLSourceElement extends HTMLElement {} +interface HTMLSpanElement extends HTMLElement {} +interface HTMLStyleElement extends HTMLElement {} +interface HTMLTableElement extends HTMLElement {} +interface HTMLTableColElement extends HTMLElement {} +interface HTMLTableDataCellElement extends HTMLElement {} +interface HTMLTableHeaderCellElement extends HTMLElement {} +interface HTMLTableRowElement extends HTMLElement {} +interface HTMLTableSectionElement extends HTMLElement {} +interface HTMLTemplateElement extends HTMLElement {} +interface HTMLTextAreaElement extends HTMLElement {} +interface HTMLTimeElement extends HTMLElement {} +interface HTMLTitleElement extends HTMLElement {} +interface HTMLTrackElement extends HTMLElement {} +interface HTMLUListElement extends HTMLElement {} +interface HTMLVideoElement extends HTMLElement {} +interface HTMLWebViewElement extends HTMLElement {} + +interface SVGElement extends Element {} +interface SVGSVGElement extends SVGElement {} +interface SVGCircleElement extends SVGElement {} +interface SVGClipPathElement extends SVGElement {} +interface SVGDefsElement extends SVGElement {} +interface SVGDescElement extends SVGElement {} +interface SVGEllipseElement extends SVGElement {} +interface SVGFEBlendElement extends SVGElement {} +interface SVGFEColorMatrixElement extends SVGElement {} +interface SVGFEComponentTransferElement extends SVGElement {} +interface SVGFECompositeElement extends SVGElement {} +interface SVGFEConvolveMatrixElement extends SVGElement {} +interface SVGFEDiffuseLightingElement extends SVGElement {} +interface SVGFEDisplacementMapElement extends SVGElement {} +interface SVGFEDistantLightElement extends SVGElement {} +interface SVGFEDropShadowElement extends SVGElement {} +interface SVGFEFloodElement extends SVGElement {} +interface SVGFEFuncAElement extends SVGElement {} +interface SVGFEFuncBElement extends SVGElement {} +interface SVGFEFuncGElement extends SVGElement {} +interface SVGFEFuncRElement extends SVGElement {} +interface SVGFEGaussianBlurElement extends SVGElement {} +interface SVGFEImageElement extends SVGElement {} +interface SVGFEMergeElement extends SVGElement {} +interface SVGFEMergeNodeElement extends SVGElement {} +interface SVGFEMorphologyElement extends SVGElement {} +interface SVGFEOffsetElement extends SVGElement {} +interface SVGFEPointLightElement extends SVGElement {} +interface SVGFESpecularLightingElement extends SVGElement {} +interface SVGFESpotLightElement extends SVGElement {} +interface SVGFETileElement extends SVGElement {} +interface SVGFETurbulenceElement extends SVGElement {} +interface SVGFilterElement extends SVGElement {} +interface SVGForeignObjectElement extends SVGElement {} +interface SVGGElement extends SVGElement {} +interface SVGImageElement extends SVGElement {} +interface SVGLineElement extends SVGElement {} +interface SVGLinearGradientElement extends SVGElement {} +interface SVGMarkerElement extends SVGElement {} +interface SVGMaskElement extends SVGElement {} +interface SVGMetadataElement extends SVGElement {} +interface SVGPathElement extends SVGElement {} +interface SVGPatternElement extends SVGElement {} +interface SVGPolygonElement extends SVGElement {} +interface SVGPolylineElement extends SVGElement {} +interface SVGRadialGradientElement extends SVGElement {} +interface SVGRectElement extends SVGElement {} +interface SVGSetElement extends SVGElement {} +interface SVGStopElement extends SVGElement {} +interface SVGSwitchElement extends SVGElement {} +interface SVGSymbolElement extends SVGElement {} +interface SVGTextElement extends SVGElement {} +interface SVGTextPathElement extends SVGElement {} +interface SVGTSpanElement extends SVGElement {} +interface SVGUseElement extends SVGElement {} +interface SVGViewElement extends SVGElement {} + +interface FormData {} +interface Text {} +interface TouchList {} +interface WebGLRenderingContext {} +interface WebGL2RenderingContext {} + +interface TrustedHTML {} + +interface Blob {} +interface MediaStream {} +interface MediaSource {} diff --git a/node_modules/@types/react/index.d.ts b/node_modules/@types/react/index.d.ts new file mode 100644 index 0000000..750b493 --- /dev/null +++ b/node_modules/@types/react/index.d.ts @@ -0,0 +1,4370 @@ +// NOTE: Users of the `experimental` builds of React should add a reference +// to 'react/experimental' in their project. See experimental.d.ts's top comment +// for reference and documentation on how exactly to do it. + +/// + +import * as CSS from "csstype"; + +type NativeAnimationEvent = AnimationEvent; +type NativeClipboardEvent = ClipboardEvent; +type NativeCompositionEvent = CompositionEvent; +type NativeDragEvent = DragEvent; +type NativeFocusEvent = FocusEvent; +type NativeInputEvent = InputEvent; +type NativeKeyboardEvent = KeyboardEvent; +type NativeMouseEvent = MouseEvent; +type NativeTouchEvent = TouchEvent; +type NativePointerEvent = PointerEvent; +type NativeSubmitEvent = SubmitEvent; +type NativeToggleEvent = ToggleEvent; +type NativeTransitionEvent = TransitionEvent; +type NativeUIEvent = UIEvent; +type NativeWheelEvent = WheelEvent; + +/** + * Used to represent DOM API's where users can either pass + * true or false as a boolean or as its equivalent strings. + */ +type Booleanish = boolean | "true" | "false"; + +/** + * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin MDN} + */ +type CrossOrigin = "anonymous" | "use-credentials" | "" | undefined; + +declare const UNDEFINED_VOID_ONLY: unique symbol; + +/** + * @internal Use `Awaited` instead + */ +// Helper type to enable `Awaited`. +// Must be a copy of the non-thenables of `ReactNode`. +type AwaitedReactNode = + | React.ReactElement + | string + | number + | bigint + | Iterable + | React.ReactPortal + | boolean + | null + | undefined + | React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES[ + keyof React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES + ]; + +/** + * The function returned from an effect passed to {@link React.useEffect useEffect}, + * which can be used to clean up the effect when the component unmounts. + * + * @see {@link https://react.dev/reference/react/useEffect React Docs} + */ +type Destructor = () => void | { [UNDEFINED_VOID_ONLY]: never }; +type VoidOrUndefinedOnly = void | { [UNDEFINED_VOID_ONLY]: never }; + +// eslint-disable-next-line @definitelytyped/export-just-namespace +export = React; +export as namespace React; + +declare namespace React { + // + // React Elements + // ---------------------------------------------------------------------- + + /** + * Used to retrieve the possible components which accept a given set of props. + * + * Can be passed no type parameters to get a union of all possible components + * and tags. + * + * Is a superset of {@link ComponentType}. + * + * @template P The props to match against. If not passed, defaults to any. + * @template Tag An optional tag to match against. If not passed, attempts to match against all possible tags. + * + * @example + * + * ```tsx + * // All components and tags (img, embed etc.) + * // which accept `src` + * type SrcComponents = ElementType<{ src: any }>; + * ``` + * + * @example + * + * ```tsx + * // All components + * type AllComponents = ElementType; + * ``` + * + * @example + * + * ```tsx + * // All custom components which match `src`, and tags which + * // match `src`, narrowed down to just `audio` and `embed` + * type SrcComponents = ElementType<{ src: any }, 'audio' | 'embed'>; + * ``` + */ + type ElementType

= + | { [K in Tag]: P extends JSX.IntrinsicElements[K] ? K : never }[Tag] + | ComponentType

; + + /** + * Represents any user-defined component, either as a function or a class. + * + * Similar to {@link JSXElementConstructor}, but with extra properties like + * {@link FunctionComponent.defaultProps defaultProps }. + * + * @template P The props the component accepts. + * + * @see {@link ComponentClass} + * @see {@link FunctionComponent} + */ + type ComponentType

= ComponentClass

| FunctionComponent

; + + /** + * Represents any user-defined component, either as a function or a class. + * + * Similar to {@link ComponentType}, but without extra properties like + * {@link FunctionComponent.defaultProps defaultProps }. + * + * @template P The props the component accepts. + */ + type JSXElementConstructor

= + | (( + props: P, + ) => ReactNode | Promise) + // constructor signature must match React.Component + | (new(props: P, context: any) => Component); + + /** + * Created by {@link createRef}, or {@link useRef} when passed `null`. + * + * @template T The type of the ref's value. + * + * @example + * + * ```tsx + * const ref = createRef(); + * + * ref.current = document.createElement('div'); // Error + * ``` + */ + interface RefObject { + /** + * The current value of the ref. + */ + current: T; + } + + interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES { + } + /** + * A callback fired whenever the ref's value changes. + * + * @template T The type of the ref's value. + * + * @see {@link https://react.dev/reference/react-dom/components/common#ref-callback React Docs} + * + * @example + * + * ```tsx + *

console.log(node)} /> + * ``` + */ + type RefCallback = { + bivarianceHack( + instance: T | null, + ): + | void + | (() => VoidOrUndefinedOnly) + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES + ]; + }["bivarianceHack"]; + + /** + * A union type of all possible shapes for React refs. + * + * @see {@link RefCallback} + * @see {@link RefObject} + */ + + type Ref = RefCallback | RefObject | null; + /** + * @deprecated Use `Ref` instead. String refs are no longer supported. + * If you're typing a library with support for React versions with string refs, use `RefAttributes['ref']` instead. + */ + type LegacyRef = Ref; + /** + * @deprecated Use `ComponentRef` instead + * + * Retrieves the type of the 'ref' prop for a given component type or tag name. + * + * @template C The component type. + * + * @example + * + * ```tsx + * type MyComponentRef = React.ElementRef; + * ``` + * + * @example + * + * ```tsx + * type DivRef = React.ElementRef<'div'>; + * ``` + */ + type ElementRef< + C extends + | ForwardRefExoticComponent + | { new(props: any, context: any): Component } + | ((props: any) => ReactNode) + | keyof JSX.IntrinsicElements, + > = ComponentRef; + + type ComponentState = any; + + interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES {} + + /** + * A value which uniquely identifies a node among items in an array. + * + * @see {@link https://react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key React Docs} + */ + type Key = + | string + | number + | bigint + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_KEY_TYPES + ]; + + /** + * @internal The props any component can receive. + * You don't have to add this type. All components automatically accept these props. + * ```tsx + * const Component = () =>
; + * + * ``` + * + * WARNING: The implementation of a component will never have access to these attributes. + * The following example would be incorrect usage because {@link Component} would never have access to `key`: + * ```tsx + * const Component = (props: React.Attributes) => props.key; + * ``` + */ + interface Attributes { + key?: Key | null | undefined; + } + /** + * The props any component accepting refs can receive. + * Class components, built-in browser components (e.g. `div`) and forwardRef components can receive refs and automatically accept these props. + * ```tsx + * const Component = forwardRef(() =>
); + * console.log(current)} /> + * ``` + * + * You only need this type if you manually author the types of props that need to be compatible with legacy refs. + * ```tsx + * interface Props extends React.RefAttributes {} + * declare const Component: React.FunctionComponent; + * ``` + * + * Otherwise it's simpler to directly use {@link Ref} since you can safely use the + * props type to describe to props that a consumer can pass to the component + * as well as describing the props the implementation of a component "sees". + * {@link RefAttributes} is generally not safe to describe both consumer and seen props. + * + * ```tsx + * interface Props extends { + * ref?: React.Ref | undefined; + * } + * declare const Component: React.FunctionComponent; + * ``` + * + * WARNING: The implementation of a component will not have access to the same type in versions of React supporting string refs. + * The following example would be incorrect usage because {@link Component} would never have access to a `ref` with type `string` + * ```tsx + * const Component = (props: React.RefAttributes) => props.ref; + * ``` + */ + interface RefAttributes extends Attributes { + /** + * Allows getting a ref to the component instance. + * Once the component unmounts, React will set `ref.current` to `null` + * (or call the ref with `null` if you passed a callback ref). + * + * @see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs} + */ + ref?: Ref | undefined; + } + + /** + * Represents the built-in attributes available to class components. + */ + interface ClassAttributes extends RefAttributes { + } + + /** + * Represents a JSX element. + * + * Where {@link ReactNode} represents everything that can be rendered, `ReactElement` + * only represents JSX. + * + * @template P The type of the props object + * @template T The type of the component or tag + * + * @example + * + * ```tsx + * const element: ReactElement =
; + * ``` + */ + interface ReactElement< + P = unknown, + T extends string | JSXElementConstructor = string | JSXElementConstructor, + > { + type: T; + props: P; + key: string | null; + } + + /** + * @deprecated + */ + interface ReactComponentElement< + T extends keyof JSX.IntrinsicElements | JSXElementConstructor, + P = Pick, Exclude, "key" | "ref">>, + > extends ReactElement> {} + + /** + * @deprecated Use `ReactElement>` + */ + interface FunctionComponentElement

extends ReactElement> { + /** + * @deprecated Use `element.props.ref` instead. + */ + ref?: ("ref" extends keyof P ? P extends { ref?: infer R | undefined } ? R : never : never) | undefined; + } + + /** + * @deprecated Use `ReactElement>` + */ + type CElement> = ComponentElement; + /** + * @deprecated Use `ReactElement>` + */ + interface ComponentElement> extends ReactElement> { + /** + * @deprecated Use `element.props.ref` instead. + */ + ref?: Ref | undefined; + } + + /** + * @deprecated Use {@link ComponentElement} instead. + */ + type ClassicElement

= CElement>; + + // string fallback for custom web-components + /** + * @deprecated Use `ReactElement` + */ + interface DOMElement

| SVGAttributes, T extends Element> + extends ReactElement + { + /** + * @deprecated Use `element.props.ref` instead. + */ + ref: Ref; + } + + // ReactHTML for ReactHTMLElement + interface ReactHTMLElement extends DetailedReactHTMLElement, T> {} + + interface DetailedReactHTMLElement

, T extends HTMLElement> extends DOMElement { + type: HTMLElementType; + } + + // ReactSVG for ReactSVGElement + interface ReactSVGElement extends DOMElement, SVGElement> { + type: SVGElementType; + } + + interface ReactPortal extends ReactElement { + children: ReactNode; + } + + /** + * Different release channels declare additional types of ReactNode this particular release channel accepts. + * App or library types should never augment this interface. + */ + interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES {} + + /** + * Represents all of the things React can render. + * + * Where {@link ReactElement} only represents JSX, `ReactNode` represents everything that can be rendered. + * + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/react-types/reactnode/ React TypeScript Cheatsheet} + * + * @example + * + * ```tsx + * // Typing children + * type Props = { children: ReactNode } + * + * const Component = ({ children }: Props) =>

{children}
+ * + * hello + * ``` + * + * @example + * + * ```tsx + * // Typing a custom element + * type Props = { customElement: ReactNode } + * + * const Component = ({ customElement }: Props) =>
{customElement}
+ * + * hello
} /> + * ``` + */ + // non-thenables need to be kept in sync with AwaitedReactNode + type ReactNode = + | ReactElement + | string + | number + | bigint + | Iterable + | ReactPortal + | boolean + | null + | undefined + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_REACT_NODES + ] + | Promise; + + // + // Top Level API + // ---------------------------------------------------------------------- + + // DOM Elements + // TODO: generalize this to everything in `keyof ReactHTML`, not just "input" + function createElement( + type: "input", + props?: InputHTMLAttributes & ClassAttributes | null, + ...children: ReactNode[] + ): DetailedReactHTMLElement, HTMLInputElement>; + function createElement

, T extends HTMLElement>( + type: HTMLElementType, + props?: ClassAttributes & P | null, + ...children: ReactNode[] + ): DetailedReactHTMLElement; + function createElement

, T extends SVGElement>( + type: SVGElementType, + props?: ClassAttributes & P | null, + ...children: ReactNode[] + ): ReactSVGElement; + function createElement

, T extends Element>( + type: string, + props?: ClassAttributes & P | null, + ...children: ReactNode[] + ): DOMElement; + + // Custom components + + function createElement

( + type: FunctionComponent

, + props?: Attributes & P | null, + ...children: ReactNode[] + ): FunctionComponentElement

; + function createElement

, C extends ComponentClass

>( + type: ClassType, + props?: ClassAttributes & P | null, + ...children: ReactNode[] + ): CElement; + function createElement

( + type: FunctionComponent

| ComponentClass

| string, + props?: Attributes & P | null, + ...children: ReactNode[] + ): ReactElement

; + + // DOM Elements + // ReactHTMLElement + function cloneElement

, T extends HTMLElement>( + element: DetailedReactHTMLElement, + props?: P, + ...children: ReactNode[] + ): DetailedReactHTMLElement; + // ReactHTMLElement, less specific + function cloneElement

, T extends HTMLElement>( + element: ReactHTMLElement, + props?: P, + ...children: ReactNode[] + ): ReactHTMLElement; + // SVGElement + function cloneElement

, T extends SVGElement>( + element: ReactSVGElement, + props?: P, + ...children: ReactNode[] + ): ReactSVGElement; + // DOM Element (has to be the last, because type checking stops at first overload that fits) + function cloneElement

, T extends Element>( + element: DOMElement, + props?: DOMAttributes & P, + ...children: ReactNode[] + ): DOMElement; + + // Custom components + function cloneElement

( + element: FunctionComponentElement

, + props?: Partial

& Attributes, + ...children: ReactNode[] + ): FunctionComponentElement

; + function cloneElement>( + element: CElement, + props?: Partial

& ClassAttributes, + ...children: ReactNode[] + ): CElement; + function cloneElement

( + element: ReactElement

, + props?: Partial

& Attributes, + ...children: ReactNode[] + ): ReactElement

; + + /** + * Describes the props accepted by a Context {@link Provider}. + * + * @template T The type of the value the context provides. + */ + interface ProviderProps { + value: T; + children?: ReactNode | undefined; + } + + /** + * Describes the props accepted by a Context {@link Consumer}. + * + * @template T The type of the value the context provides. + */ + interface ConsumerProps { + children: (value: T) => ReactNode; + } + + /** + * An object masquerading as a component. These are created by functions + * like {@link forwardRef}, {@link memo}, and {@link createContext}. + * + * In order to make TypeScript work, we pretend that they are normal + * components. + * + * But they are, in fact, not callable - instead, they are objects which + * are treated specially by the renderer. + * + * @template P The props the component accepts. + */ + interface ExoticComponent

{ + (props: P): ReactNode; + readonly $$typeof: symbol; + } + + /** + * An {@link ExoticComponent} with a `displayName` property applied to it. + * + * @template P The props the component accepts. + */ + interface NamedExoticComponent

extends ExoticComponent

{ + /** + * Used in debugging messages. You might want to set it + * explicitly if you want to display a different name for + * debugging purposes. + * + * @see {@link https://legacy.reactjs.org/docs/react-component.html#displayname Legacy React Docs} + */ + displayName?: string | undefined; + } + + /** + * An {@link ExoticComponent} with a `propTypes` property applied to it. + * + * @template P The props the component accepts. + */ + interface ProviderExoticComponent

extends ExoticComponent

{ + } + + /** + * Used to retrieve the type of a context object from a {@link Context}. + * + * @template C The context object. + * + * @example + * + * ```tsx + * import { createContext } from 'react'; + * + * const MyContext = createContext({ foo: 'bar' }); + * + * type ContextType = ContextType; + * // ContextType = { foo: string } + * ``` + */ + type ContextType> = C extends Context ? T : never; + + /** + * Wraps your components to specify the value of this context for all components inside. + * + * @see {@link https://react.dev/reference/react/createContext#provider React Docs} + * + * @example + * + * ```tsx + * import { createContext } from 'react'; + * + * const ThemeContext = createContext('light'); + * + * function App() { + * return ( + * + * + * + * ); + * } + * ``` + */ + type Provider = ProviderExoticComponent>; + + /** + * The old way to read context, before {@link useContext} existed. + * + * @see {@link https://react.dev/reference/react/createContext#consumer React Docs} + * + * @example + * + * ```tsx + * import { UserContext } from './user-context'; + * + * function Avatar() { + * return ( + * + * {user => {user.name}} + * + * ); + * } + * ``` + */ + type Consumer = ExoticComponent>; + + /** + * Context lets components pass information deep down without explicitly + * passing props. + * + * Created from {@link createContext} + * + * @see {@link https://react.dev/learn/passing-data-deeply-with-context React Docs} + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/context/ React TypeScript Cheatsheet} + * + * @example + * + * ```tsx + * import { createContext } from 'react'; + * + * const ThemeContext = createContext('light'); + * ``` + */ + interface Context extends Provider { + Provider: Provider; + Consumer: Consumer; + /** + * Used in debugging messages. You might want to set it + * explicitly if you want to display a different name for + * debugging purposes. + * + * @see {@link https://legacy.reactjs.org/docs/react-component.html#displayname Legacy React Docs} + */ + displayName?: string | undefined; + } + + /** + * Lets you create a {@link Context} that components can provide or read. + * + * @param defaultValue The value you want the context to have when there is no matching + * {@link Provider} in the tree above the component reading the context. This is meant + * as a "last resort" fallback. + * + * @see {@link https://react.dev/reference/react/createContext#reference React Docs} + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/context/ React TypeScript Cheatsheet} + * + * @example + * + * ```tsx + * import { createContext } from 'react'; + * + * const ThemeContext = createContext('light'); + * function App() { + * return ( + * + * + * + * ); + * } + * ``` + */ + function createContext( + // If you thought this should be optional, see + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/24509#issuecomment-382213106 + defaultValue: T, + ): Context; + + function isValidElement

(object: {} | null | undefined): object is ReactElement

; + + const Children: { + map( + children: C | readonly C[], + fn: (child: C, index: number) => T, + ): C extends null | undefined ? C : Array>; + forEach(children: C | readonly C[], fn: (child: C, index: number) => void): void; + count(children: any): number; + only(children: C): C extends any[] ? never : C; + toArray(children: ReactNode | ReactNode[]): Array>; + }; + + export interface FragmentProps { + children?: React.ReactNode; + } + /** + * Lets you group elements without a wrapper node. + * + * @see {@link https://react.dev/reference/react/Fragment React Docs} + * + * @example + * + * ```tsx + * import { Fragment } from 'react'; + * + * + * Hello + * World + * + * ``` + * + * @example + * + * ```tsx + * // Using the <> shorthand syntax: + * + * <> + * Hello + * World + * + * ``` + */ + const Fragment: ExoticComponent; + + /** + * Lets you find common bugs in your components early during development. + * + * @see {@link https://react.dev/reference/react/StrictMode React Docs} + * + * @example + * + * ```tsx + * import { StrictMode } from 'react'; + * + * + * + * + * ``` + */ + const StrictMode: ExoticComponent<{ children?: ReactNode | undefined }>; + + /** + * The props accepted by {@link Suspense}. + * + * @see {@link https://react.dev/reference/react/Suspense React Docs} + */ + interface SuspenseProps { + children?: ReactNode | undefined; + + /** A fallback react tree to show when a Suspense child (like React.lazy) suspends */ + fallback?: ReactNode; + + /** + * A name for this Suspense boundary for instrumentation purposes. + * The name will help identify this boundary in React DevTools. + */ + name?: string | undefined; + } + + /** + * Lets you display a fallback until its children have finished loading. + * + * @see {@link https://react.dev/reference/react/Suspense React Docs} + * + * @example + * + * ```tsx + * import { Suspense } from 'react'; + * + * }> + * + * + * ``` + */ + const Suspense: ExoticComponent; + const version: string; + + /** + * The callback passed to {@link ProfilerProps.onRender}. + * + * @see {@link https://react.dev/reference/react/Profiler#onrender-callback React Docs} + */ + type ProfilerOnRenderCallback = ( + /** + * The string id prop of the {@link Profiler} tree that has just committed. This lets + * you identify which part of the tree was committed if you are using multiple + * profilers. + * + * @see {@link https://react.dev/reference/react/Profiler#onrender-callback React Docs} + */ + id: string, + /** + * This lets you know whether the tree has just been mounted for the first time + * or re-rendered due to a change in props, state, or hooks. + * + * @see {@link https://react.dev/reference/react/Profiler#onrender-callback React Docs} + */ + phase: "mount" | "update" | "nested-update", + /** + * The number of milliseconds spent rendering the {@link Profiler} and its descendants + * for the current update. This indicates how well the subtree makes use of + * memoization (e.g. {@link memo} and {@link useMemo}). Ideally this value should decrease + * significantly after the initial mount as many of the descendants will only need to + * re-render if their specific props change. + * + * @see {@link https://react.dev/reference/react/Profiler#onrender-callback React Docs} + */ + actualDuration: number, + /** + * The number of milliseconds estimating how much time it would take to re-render the entire + * {@link Profiler} subtree without any optimizations. It is calculated by summing up the most + * recent render durations of each component in the tree. This value estimates a worst-case + * cost of rendering (e.g. the initial mount or a tree with no memoization). Compare + * {@link actualDuration} against it to see if memoization is working. + * + * @see {@link https://react.dev/reference/react/Profiler#onrender-callback React Docs} + */ + baseDuration: number, + /** + * A numeric timestamp for when React began rendering the current update. + * + * @see {@link https://react.dev/reference/react/Profiler#onrender-callback React Docs} + */ + startTime: number, + /** + * A numeric timestamp for when React committed the current update. This value is shared + * between all profilers in a commit, enabling them to be grouped if desirable. + * + * @see {@link https://react.dev/reference/react/Profiler#onrender-callback React Docs} + */ + commitTime: number, + ) => void; + + /** + * The props accepted by {@link Profiler}. + * + * @see {@link https://react.dev/reference/react/Profiler React Docs} + */ + interface ProfilerProps { + children?: ReactNode | undefined; + id: string; + onRender: ProfilerOnRenderCallback; + } + + /** + * Lets you measure rendering performance of a React tree programmatically. + * + * @see {@link https://react.dev/reference/react/Profiler#onrender-callback React Docs} + * + * @example + * + * ```tsx + * + * + * + * ``` + */ + const Profiler: ExoticComponent; + + // + // Component API + // ---------------------------------------------------------------------- + + type ReactInstance = Component | Element; + + // Base component for plain JS classes + interface Component

extends ComponentLifecycle {} + class Component { + /** + * If set, `this.context` will be set at runtime to the current value of the given Context. + * + * @example + * + * ```ts + * type MyContext = number + * const Ctx = React.createContext(0) + * + * class Foo extends React.Component { + * static contextType = Ctx + * context!: React.ContextType + * render () { + * return <>My context's value: {this.context}; + * } + * } + * ``` + * + * @see {@link https://react.dev/reference/react/Component#static-contexttype} + */ + static contextType?: Context | undefined; + + /** + * Ignored by React. + * @deprecated Only kept in types for backwards compatibility. Will be removed in a future major release. + */ + static propTypes?: any; + + /** + * If using React Context, re-declare this in your class to be the + * `React.ContextType` of your `static contextType`. + * Should be used with type annotation or static contextType. + * + * @example + * ```ts + * static contextType = MyContext + * // For TS pre-3.7: + * context!: React.ContextType + * // For TS 3.7 and above: + * declare context: React.ContextType + * ``` + * + * @see {@link https://react.dev/reference/react/Component#context React Docs} + */ + context: unknown; + + // Keep in sync with constructor signature of JSXElementConstructor and ComponentClass. + constructor(props: P); + /** + * @param props + * @param context value of the parent {@link https://react.dev/reference/react/Component#context Context} specified + * in `contextType`. + */ + // TODO: Ideally we'd infer the constructor signatur from `contextType`. + // Might be hard to ship without breaking existing code. + constructor(props: P, context: any); + + // We MUST keep setState() as a unified signature because it allows proper checking of the method return type. + // See: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/18365#issuecomment-351013257 + // Also, the ` | S` allows intellisense to not be dumbisense + setState( + state: ((prevState: Readonly, props: Readonly

) => Pick | S | null) | (Pick | S | null), + callback?: () => void, + ): void; + + forceUpdate(callback?: () => void): void; + render(): ReactNode; + + readonly props: Readonly

; + state: Readonly; + } + + class PureComponent

extends Component {} + + /** + * @deprecated Use `ClassicComponent` from `create-react-class` + * + * @see {@link https://legacy.reactjs.org/docs/react-without-es6.html Legacy React Docs} + * @see {@link https://www.npmjs.com/package/create-react-class `create-react-class` on npm} + */ + interface ClassicComponent

extends Component { + replaceState(nextState: S, callback?: () => void): void; + isMounted(): boolean; + getInitialState?(): S; + } + + // + // Class Interfaces + // ---------------------------------------------------------------------- + + /** + * Represents the type of a function component. Can optionally + * receive a type argument that represents the props the component + * receives. + * + * @template P The props the component accepts. + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/function_components React TypeScript Cheatsheet} + * @alias for {@link FunctionComponent} + * + * @example + * + * ```tsx + * // With props: + * type Props = { name: string } + * + * const MyComponent: FC = (props) => { + * return

{props.name}
+ * } + * ``` + * + * @example + * + * ```tsx + * // Without props: + * const MyComponentWithoutProps: FC = () => { + * return
MyComponentWithoutProps
+ * } + * ``` + */ + type FC

= FunctionComponent

; + + /** + * Represents the type of a function component. Can optionally + * receive a type argument that represents the props the component + * accepts. + * + * @template P The props the component accepts. + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/function_components React TypeScript Cheatsheet} + * + * @example + * + * ```tsx + * // With props: + * type Props = { name: string } + * + * const MyComponent: FunctionComponent = (props) => { + * return

{props.name}
+ * } + * ``` + * + * @example + * + * ```tsx + * // Without props: + * const MyComponentWithoutProps: FunctionComponent = () => { + * return
MyComponentWithoutProps
+ * } + * ``` + */ + interface FunctionComponent

{ + (props: P): ReactNode | Promise; + /** + * Ignored by React. + * @deprecated Only kept in types for backwards compatibility. Will be removed in a future major release. + */ + propTypes?: any; + /** + * Used in debugging messages. You might want to set it + * explicitly if you want to display a different name for + * debugging purposes. + * + * @see {@link https://legacy.reactjs.org/docs/react-component.html#displayname Legacy React Docs} + * + * @example + * + * ```tsx + * + * const MyComponent: FC = () => { + * return

Hello!
+ * } + * + * MyComponent.displayName = 'MyAwesomeComponent' + * ``` + */ + displayName?: string | undefined; + } + + /** + * The type of the ref received by a {@link ForwardRefRenderFunction}. + * + * @see {@link ForwardRefRenderFunction} + */ + // Making T nullable is assuming the refs will be managed by React or the component impl will write it somewhere else. + // But this isn't necessarily true. We haven't heard complains about it yet and hopefully `forwardRef` is removed from React before we do. + type ForwardedRef = ((instance: T | null) => void) | RefObject | null; + + /** + * The type of the function passed to {@link forwardRef}. This is considered different + * to a normal {@link FunctionComponent} because it receives an additional argument, + * + * @param props Props passed to the component, if any. + * @param ref A ref forwarded to the component of type {@link ForwardedRef}. + * + * @template T The type of the forwarded ref. + * @template P The type of the props the component accepts. + * + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/forward_and_create_ref/ React TypeScript Cheatsheet} + * @see {@link forwardRef} + */ + interface ForwardRefRenderFunction { + (props: P, ref: ForwardedRef): ReactNode; + /** + * Used in debugging messages. You might want to set it + * explicitly if you want to display a different name for + * debugging purposes. + * + * Will show `ForwardRef(${Component.displayName || Component.name})` + * in devtools by default, but can be given its own specific name. + * + * @see {@link https://legacy.reactjs.org/docs/react-component.html#displayname Legacy React Docs} + */ + displayName?: string | undefined; + /** + * Ignored by React. + * @deprecated Only kept in types for backwards compatibility. Will be removed in a future major release. + */ + propTypes?: any; + } + + /** + * Represents a component class in React. + * + * @template P The props the component accepts. + * @template S The internal state of the component. + */ + interface ComponentClass

extends StaticLifecycle { + // constructor signature must match React.Component + new( + props: P, + /** + * Value of the parent {@link https://react.dev/reference/react/Component#context Context} specified + * in `contextType`. + */ + context?: any, + ): Component; + /** + * Ignored by React. + * @deprecated Only kept in types for backwards compatibility. Will be removed in a future major release. + */ + propTypes?: any; + contextType?: Context | undefined; + defaultProps?: Partial

| undefined; + /** + * Used in debugging messages. You might want to set it + * explicitly if you want to display a different name for + * debugging purposes. + * + * @see {@link https://legacy.reactjs.org/docs/react-component.html#displayname Legacy React Docs} + */ + displayName?: string | undefined; + } + + /** + * @deprecated Use `ClassicComponentClass` from `create-react-class` + * + * @see {@link https://legacy.reactjs.org/docs/react-without-es6.html Legacy React Docs} + * @see {@link https://www.npmjs.com/package/create-react-class `create-react-class` on npm} + */ + interface ClassicComponentClass

extends ComponentClass

{ + new(props: P): ClassicComponent; + getDefaultProps?(): P; + } + + /** + * Used in {@link createElement} and {@link createFactory} to represent + * a class. + * + * An intersection type is used to infer multiple type parameters from + * a single argument, which is useful for many top-level API defs. + * See {@link https://github.com/Microsoft/TypeScript/issues/7234 this GitHub issue} + * for more info. + */ + type ClassType, C extends ComponentClass

> = + & C + & (new(props: P, context: any) => T); + + // + // Component Specs and Lifecycle + // ---------------------------------------------------------------------- + + // This should actually be something like `Lifecycle | DeprecatedLifecycle`, + // as React will _not_ call the deprecated lifecycle methods if any of the new lifecycle + // methods are present. + interface ComponentLifecycle extends NewLifecycle, DeprecatedLifecycle { + /** + * Called immediately after a component is mounted. Setting state here will trigger re-rendering. + */ + componentDidMount?(): void; + /** + * Called to determine whether the change in props and state should trigger a re-render. + * + * `Component` always returns true. + * `PureComponent` implements a shallow comparison on props and state and returns true if any + * props or states have changed. + * + * If false is returned, {@link Component.render}, `componentWillUpdate` + * and `componentDidUpdate` will not be called. + */ + shouldComponentUpdate?(nextProps: Readonly

, nextState: Readonly, nextContext: any): boolean; + /** + * Called immediately before a component is destroyed. Perform any necessary cleanup in this method, such as + * cancelled network requests, or cleaning up any DOM elements created in `componentDidMount`. + */ + componentWillUnmount?(): void; + /** + * Catches exceptions generated in descendant components. Unhandled exceptions will cause + * the entire component tree to unmount. + */ + componentDidCatch?(error: Error, errorInfo: ErrorInfo): void; + } + + // Unfortunately, we have no way of declaring that the component constructor must implement this + interface StaticLifecycle { + getDerivedStateFromProps?: GetDerivedStateFromProps | undefined; + getDerivedStateFromError?: GetDerivedStateFromError | undefined; + } + + type GetDerivedStateFromProps = + /** + * Returns an update to a component's state based on its new props and old state. + * + * Note: its presence prevents any of the deprecated lifecycle methods from being invoked + */ + (nextProps: Readonly

, prevState: S) => Partial | null; + + type GetDerivedStateFromError = + /** + * This lifecycle is invoked after an error has been thrown by a descendant component. + * It receives the error that was thrown as a parameter and should return a value to update state. + * + * Note: its presence prevents any of the deprecated lifecycle methods from being invoked + */ + (error: any) => Partial | null; + + // This should be "infer SS" but can't use it yet + interface NewLifecycle { + /** + * Runs before React applies the result of {@link Component.render render} to the document, and + * returns an object to be given to {@link componentDidUpdate}. Useful for saving + * things such as scroll position before {@link Component.render render} causes changes to it. + * + * Note: the presence of this method prevents any of the deprecated + * lifecycle events from running. + */ + getSnapshotBeforeUpdate?(prevProps: Readonly

, prevState: Readonly): SS | null; + /** + * Called immediately after updating occurs. Not called for the initial render. + * + * The snapshot is only present if {@link getSnapshotBeforeUpdate} is present and returns non-null. + */ + componentDidUpdate?(prevProps: Readonly

, prevState: Readonly, snapshot?: SS): void; + } + + interface DeprecatedLifecycle { + /** + * Called immediately before mounting occurs, and before {@link Component.render}. + * Avoid introducing any side-effects or subscriptions in this method. + * + * Note: the presence of {@link NewLifecycle.getSnapshotBeforeUpdate getSnapshotBeforeUpdate} + * or {@link StaticLifecycle.getDerivedStateFromProps getDerivedStateFromProps} prevents + * this from being invoked. + * + * @deprecated 16.3, use {@link ComponentLifecycle.componentDidMount componentDidMount} or the constructor instead; will stop working in React 17 + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#initializing-state} + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path} + */ + componentWillMount?(): void; + /** + * Called immediately before mounting occurs, and before {@link Component.render}. + * Avoid introducing any side-effects or subscriptions in this method. + * + * This method will not stop working in React 17. + * + * Note: the presence of {@link NewLifecycle.getSnapshotBeforeUpdate getSnapshotBeforeUpdate} + * or {@link StaticLifecycle.getDerivedStateFromProps getDerivedStateFromProps} prevents + * this from being invoked. + * + * @deprecated 16.3, use {@link ComponentLifecycle.componentDidMount componentDidMount} or the constructor instead + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#initializing-state} + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path} + */ + UNSAFE_componentWillMount?(): void; + /** + * Called when the component may be receiving new props. + * React may call this even if props have not changed, so be sure to compare new and existing + * props if you only want to handle changes. + * + * Calling {@link Component.setState} generally does not trigger this method. + * + * Note: the presence of {@link NewLifecycle.getSnapshotBeforeUpdate getSnapshotBeforeUpdate} + * or {@link StaticLifecycle.getDerivedStateFromProps getDerivedStateFromProps} prevents + * this from being invoked. + * + * @deprecated 16.3, use static {@link StaticLifecycle.getDerivedStateFromProps getDerivedStateFromProps} instead; will stop working in React 17 + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#updating-state-based-on-props} + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path} + */ + componentWillReceiveProps?(nextProps: Readonly

, nextContext: any): void; + /** + * Called when the component may be receiving new props. + * React may call this even if props have not changed, so be sure to compare new and existing + * props if you only want to handle changes. + * + * Calling {@link Component.setState} generally does not trigger this method. + * + * This method will not stop working in React 17. + * + * Note: the presence of {@link NewLifecycle.getSnapshotBeforeUpdate getSnapshotBeforeUpdate} + * or {@link StaticLifecycle.getDerivedStateFromProps getDerivedStateFromProps} prevents + * this from being invoked. + * + * @deprecated 16.3, use static {@link StaticLifecycle.getDerivedStateFromProps getDerivedStateFromProps} instead + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#updating-state-based-on-props} + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path} + */ + UNSAFE_componentWillReceiveProps?(nextProps: Readonly

, nextContext: any): void; + /** + * Called immediately before rendering when new props or state is received. Not called for the initial render. + * + * Note: You cannot call {@link Component.setState} here. + * + * Note: the presence of {@link NewLifecycle.getSnapshotBeforeUpdate getSnapshotBeforeUpdate} + * or {@link StaticLifecycle.getDerivedStateFromProps getDerivedStateFromProps} prevents + * this from being invoked. + * + * @deprecated 16.3, use getSnapshotBeforeUpdate instead; will stop working in React 17 + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#reading-dom-properties-before-an-update} + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path} + */ + componentWillUpdate?(nextProps: Readonly

, nextState: Readonly, nextContext: any): void; + /** + * Called immediately before rendering when new props or state is received. Not called for the initial render. + * + * Note: You cannot call {@link Component.setState} here. + * + * This method will not stop working in React 17. + * + * Note: the presence of {@link NewLifecycle.getSnapshotBeforeUpdate getSnapshotBeforeUpdate} + * or {@link StaticLifecycle.getDerivedStateFromProps getDerivedStateFromProps} prevents + * this from being invoked. + * + * @deprecated 16.3, use getSnapshotBeforeUpdate instead + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#reading-dom-properties-before-an-update} + * @see {@link https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path} + */ + UNSAFE_componentWillUpdate?(nextProps: Readonly

, nextState: Readonly, nextContext: any): void; + } + + function createRef(): RefObject; + + /** + * The type of the component returned from {@link forwardRef}. + * + * @template P The props the component accepts, if any. + * + * @see {@link ExoticComponent} + */ + interface ForwardRefExoticComponent

extends NamedExoticComponent

{ + /** + * Ignored by React. + * @deprecated Only kept in types for backwards compatibility. Will be removed in a future major release. + */ + propTypes?: any; + } + + /** + * Lets your component expose a DOM node to a parent component + * using a ref. + * + * @see {@link https://react.dev/reference/react/forwardRef React Docs} + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/forward_and_create_ref/ React TypeScript Cheatsheet} + * + * @param render See the {@link ForwardRefRenderFunction}. + * + * @template T The type of the DOM node. + * @template P The props the component accepts, if any. + * + * @example + * + * ```tsx + * interface Props { + * children?: ReactNode; + * type: "submit" | "button"; + * } + * + * export const FancyButton = forwardRef((props, ref) => ( + * + * )); + * ``` + */ + function forwardRef( + render: ForwardRefRenderFunction>, + ): ForwardRefExoticComponent & RefAttributes>; + + /** + * Omits the 'ref' attribute from the given props object. + * + * @template Props The props object type. + */ + type PropsWithoutRef = + // Omit would not be sufficient for this. We'd like to avoid unnecessary mapping and need a distributive conditional to support unions. + // see: https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types + // https://github.com/Microsoft/TypeScript/issues/28339 + Props extends any ? ("ref" extends keyof Props ? Omit : Props) : Props; + /** + * Ensures that the props do not include string ref, which cannot be forwarded + * @deprecated Use `Props` directly. `PropsWithRef` is just an alias for `Props` + */ + type PropsWithRef = Props; + + type PropsWithChildren

= P & { children?: ReactNode | undefined }; + + /** + * Used to retrieve the props a component accepts. Can either be passed a string, + * indicating a DOM element (e.g. 'div', 'span', etc.) or the type of a React + * component. + * + * It's usually better to use {@link ComponentPropsWithRef} or {@link ComponentPropsWithoutRef} + * instead of this type, as they let you be explicit about whether or not to include + * the `ref` prop. + * + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/react-types/componentprops/ React TypeScript Cheatsheet} + * + * @example + * + * ```tsx + * // Retrieves the props an 'input' element accepts + * type InputProps = React.ComponentProps<'input'>; + * ``` + * + * @example + * + * ```tsx + * const MyComponent = (props: { foo: number, bar: string }) =>

; + * + * // Retrieves the props 'MyComponent' accepts + * type MyComponentProps = React.ComponentProps; + * ``` + */ + type ComponentProps> = T extends + JSXElementConstructor ? Props + : T extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[T] + : {}; + + /** + * Used to retrieve the props a component accepts with its ref. Can either be + * passed a string, indicating a DOM element (e.g. 'div', 'span', etc.) or the + * type of a React component. + * + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/react-types/componentprops/ React TypeScript Cheatsheet} + * + * @example + * + * ```tsx + * // Retrieves the props an 'input' element accepts + * type InputProps = React.ComponentPropsWithRef<'input'>; + * ``` + * + * @example + * + * ```tsx + * const MyComponent = (props: { foo: number, bar: string }) =>
; + * + * // Retrieves the props 'MyComponent' accepts + * type MyComponentPropsWithRef = React.ComponentPropsWithRef; + * ``` + */ + type ComponentPropsWithRef = T extends JSXElementConstructor + // If it's a class i.e. newable we're dealing with a class component + ? T extends abstract new(args: any) => any ? PropsWithoutRef & RefAttributes> + : Props + : ComponentProps; + /** + * Used to retrieve the props a custom component accepts with its ref. + * + * Unlike {@link ComponentPropsWithRef}, this only works with custom + * components, i.e. components you define yourself. This is to improve + * type-checking performance. + * + * @example + * + * ```tsx + * const MyComponent = (props: { foo: number, bar: string }) =>
; + * + * // Retrieves the props 'MyComponent' accepts + * type MyComponentPropsWithRef = React.CustomComponentPropsWithRef; + * ``` + */ + type CustomComponentPropsWithRef = T extends JSXElementConstructor + // If it's a class i.e. newable we're dealing with a class component + ? T extends abstract new(args: any) => any ? PropsWithoutRef & RefAttributes> + : Props + : never; + + /** + * Used to retrieve the props a component accepts without its ref. Can either be + * passed a string, indicating a DOM element (e.g. 'div', 'span', etc.) or the + * type of a React component. + * + * @see {@link https://react-typescript-cheatsheet.netlify.app/docs/react-types/componentprops/ React TypeScript Cheatsheet} + * + * @example + * + * ```tsx + * // Retrieves the props an 'input' element accepts + * type InputProps = React.ComponentPropsWithoutRef<'input'>; + * ``` + * + * @example + * + * ```tsx + * const MyComponent = (props: { foo: number, bar: string }) =>
; + * + * // Retrieves the props 'MyComponent' accepts + * type MyComponentPropsWithoutRef = React.ComponentPropsWithoutRef; + * ``` + */ + type ComponentPropsWithoutRef = PropsWithoutRef>; + + /** + * Retrieves the type of the 'ref' prop for a given component type or tag name. + * + * @template C The component type. + * + * @example + * + * ```tsx + * type MyComponentRef = React.ComponentRef; + * ``` + * + * @example + * + * ```tsx + * type DivRef = React.ComponentRef<'div'>; + * ``` + */ + type ComponentRef = ComponentPropsWithRef extends RefAttributes ? Method + : never; + + // will show `Memo(${Component.displayName || Component.name})` in devtools by default, + // but can be given its own specific name + type MemoExoticComponent> = NamedExoticComponent> & { + readonly type: T; + }; + + /** + * Lets you skip re-rendering a component when its props are unchanged. + * + * @see {@link https://react.dev/reference/react/memo React Docs} + * + * @param Component The component to memoize. + * @param propsAreEqual A function that will be used to determine if the props have changed. + * + * @example + * + * ```tsx + * import { memo } from 'react'; + * + * const SomeComponent = memo(function SomeComponent(props: { foo: string }) { + * // ... + * }); + * ``` + */ + function memo

( + Component: FunctionComponent

, + propsAreEqual?: (prevProps: Readonly

, nextProps: Readonly

) => boolean, + ): NamedExoticComponent

; + function memo>( + Component: T, + propsAreEqual?: (prevProps: Readonly>, nextProps: Readonly>) => boolean, + ): MemoExoticComponent; + + interface LazyExoticComponent> + extends ExoticComponent> + { + readonly _result: T; + } + + /** + * Lets you defer loading a component’s code until it is rendered for the first time. + * + * @see {@link https://react.dev/reference/react/lazy React Docs} + * + * @param load A function that returns a `Promise` or another thenable (a `Promise`-like object with a + * then method). React will not call `load` until the first time you attempt to render the returned + * component. After React first calls load, it will wait for it to resolve, and then render the + * resolved value’s `.default` as a React component. Both the returned `Promise` and the `Promise`’s + * resolved value will be cached, so React will not call load more than once. If the `Promise` rejects, + * React will throw the rejection reason for the nearest Error Boundary to handle. + * + * @example + * + * ```tsx + * import { lazy } from 'react'; + * + * const MarkdownPreview = lazy(() => import('./MarkdownPreview.js')); + * ``` + */ + function lazy>( + load: () => Promise<{ default: T }>, + ): LazyExoticComponent; + + // + // React Hooks + // ---------------------------------------------------------------------- + + /** + * The instruction passed to a {@link Dispatch} function in {@link useState} + * to tell React what the next value of the {@link useState} should be. + * + * Often found wrapped in {@link Dispatch}. + * + * @template S The type of the state. + * + * @example + * + * ```tsx + * // This return type correctly represents the type of + * // `setCount` in the example below. + * const useCustomState = (): Dispatch> => { + * const [count, setCount] = useState(0); + * + * return setCount; + * } + * ``` + */ + type SetStateAction = S | ((prevState: S) => S); + + /** + * A function that can be used to update the state of a {@link useState} + * or {@link useReducer} hook. + */ + type Dispatch = (value: A) => void; + /** + * A {@link Dispatch} function can sometimes be called without any arguments. + */ + type DispatchWithoutAction = () => void; + // Limit the reducer to accept only 0 or 1 action arguments + // eslint-disable-next-line @definitelytyped/no-single-element-tuple-type + type AnyActionArg = [] | [any]; + // Get the dispatch type from the reducer arguments (captures optional action argument correctly) + type ActionDispatch = (...args: ActionArg) => void; + // Unlike redux, the actions _can_ be anything + type Reducer = (prevState: S, action: A) => S; + // If useReducer accepts a reducer without action, dispatch may be called without any parameters. + type ReducerWithoutAction = (prevState: S) => S; + // types used to try and prevent the compiler from reducing S + // to a supertype common with the second argument to useReducer() + type ReducerState> = R extends Reducer ? S : never; + type DependencyList = readonly unknown[]; + + // NOTE: callbacks are _only_ allowed to return either void, or a destructor. + type EffectCallback = () => void | Destructor; + + /** + * @deprecated Use `RefObject` instead. + */ + interface MutableRefObject { + current: T; + } + + // This will technically work if you give a Consumer or Provider but it's deprecated and warns + /** + * Accepts a context object (the value returned from `React.createContext`) and returns the current + * context value, as given by the nearest context provider for the given context. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useContext} + */ + function useContext(context: Context /*, (not public API) observedBits?: number|boolean */): T; + /** + * Returns a stateful value, and a function to update it. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useState} + */ + function useState(initialState: S | (() => S)): [S, Dispatch>]; + // convenience overload when first argument is omitted + /** + * Returns a stateful value, and a function to update it. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useState} + */ + function useState(): [S | undefined, Dispatch>]; + /** + * An alternative to `useState`. + * + * `useReducer` is usually preferable to `useState` when you have complex state logic that involves + * multiple sub-values. It also lets you optimize performance for components that trigger deep + * updates because you can pass `dispatch` down instead of callbacks. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useReducer} + */ + function useReducer( + reducer: (prevState: S, ...args: A) => S, + initialState: S, + ): [S, ActionDispatch]; + /** + * An alternative to `useState`. + * + * `useReducer` is usually preferable to `useState` when you have complex state logic that involves + * multiple sub-values. It also lets you optimize performance for components that trigger deep + * updates because you can pass `dispatch` down instead of callbacks. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useReducer} + */ + function useReducer( + reducer: (prevState: S, ...args: A) => S, + initialArg: I, + init: (i: I) => S, + ): [S, ActionDispatch]; + /** + * `useRef` returns a mutable ref object whose `.current` property is initialized to the passed argument + * (`initialValue`). The returned object will persist for the full lifetime of the component. + * + * Note that `useRef()` is useful for more than the `ref` attribute. It’s handy for keeping any mutable + * value around similar to how you’d use instance fields in classes. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useRef} + */ + function useRef(initialValue: T): RefObject; + // convenience overload for refs given as a ref prop as they typically start with a null value + /** + * `useRef` returns a mutable ref object whose `.current` property is initialized to the passed argument + * (`initialValue`). The returned object will persist for the full lifetime of the component. + * + * Note that `useRef()` is useful for more than the `ref` attribute. It’s handy for keeping any mutable + * value around similar to how you’d use instance fields in classes. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useRef} + */ + function useRef(initialValue: T | null): RefObject; + // convenience overload for undefined initialValue + /** + * `useRef` returns a mutable ref object whose `.current` property is initialized to the passed argument + * (`initialValue`). The returned object will persist for the full lifetime of the component. + * + * Note that `useRef()` is useful for more than the `ref` attribute. It’s handy for keeping any mutable + * value around similar to how you’d use instance fields in classes. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useRef} + */ + function useRef(initialValue: T | undefined): RefObject; + /** + * The signature is identical to `useEffect`, but it fires synchronously after all DOM mutations. + * Use this to read layout from the DOM and synchronously re-render. Updates scheduled inside + * `useLayoutEffect` will be flushed synchronously, before the browser has a chance to paint. + * + * Prefer the standard `useEffect` when possible to avoid blocking visual updates. + * + * If you’re migrating code from a class component, `useLayoutEffect` fires in the same phase as + * `componentDidMount` and `componentDidUpdate`. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useLayoutEffect} + */ + function useLayoutEffect(effect: EffectCallback, deps?: DependencyList): void; + /** + * Accepts a function that contains imperative, possibly effectful code. + * + * @param effect Imperative function that can return a cleanup function + * @param deps If present, effect will only activate if the values in the list change. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useEffect} + */ + function useEffect(effect: EffectCallback, deps?: DependencyList): void; + /** + * @see {@link https://react.dev/reference/react/useEffectEvent `useEffectEvent()` documentation} + * @version 19.2.0 + */ + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + export function useEffectEvent(callback: T): T; + // NOTE: this does not accept strings, but this will have to be fixed by removing strings from type Ref + /** + * `useImperativeHandle` customizes the instance value that is exposed to parent components when using + * `ref`. As always, imperative code using refs should be avoided in most cases. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useImperativeHandle} + */ + function useImperativeHandle(ref: Ref | undefined, init: () => R, deps?: DependencyList): void; + // I made 'inputs' required here and in useMemo as there's no point to memoizing without the memoization key + // useCallback(X) is identical to just using X, useMemo(() => Y) is identical to just using Y. + /** + * `useCallback` will return a memoized version of the callback that only changes if one of the `inputs` + * has changed. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useCallback} + */ + // A specific function type would not trigger implicit any. + // See https://github.com/DefinitelyTyped/DefinitelyTyped/issues/52873#issuecomment-845806435 for a comparison between `Function` and more specific types. + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + function useCallback(callback: T, deps: DependencyList): T; + /** + * `useMemo` will only recompute the memoized value when one of the `deps` has changed. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useMemo} + */ + // allow undefined, but don't make it optional as that is very likely a mistake + function useMemo(factory: () => T, deps: DependencyList): T; + /** + * `useDebugValue` can be used to display a label for custom hooks in React DevTools. + * + * NOTE: We don’t recommend adding debug values to every custom hook. + * It’s most valuable for custom hooks that are part of shared libraries. + * + * @version 16.8.0 + * @see {@link https://react.dev/reference/react/useDebugValue} + */ + // the name of the custom hook is itself derived from the function name at runtime: + // it's just the function name without the "use" prefix. + function useDebugValue(value: T, format?: (value: T) => any): void; + + export type TransitionFunction = () => VoidOrUndefinedOnly | Promise; + // strange definition to allow vscode to show documentation on the invocation + export interface TransitionStartFunction { + /** + * State updates caused inside the callback are allowed to be deferred. + * + * **If some state update causes a component to suspend, that state update should be wrapped in a transition.** + * + * @param callback A function which causes state updates that can be deferred. + */ + (callback: TransitionFunction): void; + } + + /** + * Returns a deferred version of the value that may “lag behind” it. + * + * This is commonly used to keep the interface responsive when you have something that renders immediately + * based on user input and something that needs to wait for a data fetch. + * + * A good example of this is a text input. + * + * @param value The value that is going to be deferred + * @param initialValue A value to use during the initial render of a component. If this option is omitted, `useDeferredValue` will not defer during the initial render, because there’s no previous version of `value` that it can render instead. + * + * @see {@link https://react.dev/reference/react/useDeferredValue} + */ + export function useDeferredValue(value: T, initialValue?: T): T; + + /** + * Allows components to avoid undesirable loading states by waiting for content to load + * before transitioning to the next screen. It also allows components to defer slower, + * data fetching updates until subsequent renders so that more crucial updates can be + * rendered immediately. + * + * The `useTransition` hook returns two values in an array. + * + * The first is a boolean, React’s way of informing us whether we’re waiting for the transition to finish. + * The second is a function that takes a callback. We can use it to tell React which state we want to defer. + * + * **If some state update causes a component to suspend, that state update should be wrapped in a transition.** + * + * @see {@link https://react.dev/reference/react/useTransition} + */ + export function useTransition(): [boolean, TransitionStartFunction]; + + /** + * Similar to `useTransition` but allows uses where hooks are not available. + * + * @param callback A function which causes state updates that can be deferred. + */ + export function startTransition(scope: TransitionFunction): void; + + /** + * Wrap any code rendering and triggering updates to your components into `act()` calls. + * + * Ensures that the behavior in your tests matches what happens in the browser + * more closely by executing pending `useEffect`s before returning. This also + * reduces the amount of re-renders done. + * + * @param callback A synchronous, void callback that will execute as a single, complete React commit. + * + * @see {@link https://reactjs.org/blog/2019/02/06/react-v16.8.0.html#testing-hooks} + */ + // NOTES + // - the order of these signatures matters - typescript will check the signatures in source order. + // If the `() => VoidOrUndefinedOnly` signature is first, it'll erroneously match a Promise returning function for users with + // `strictNullChecks: false`. + // - VoidOrUndefinedOnly is there to forbid any non-void return values for users with `strictNullChecks: true` + // While act does always return Thenable, if a void function is passed, we pretend the return value is also void to not trigger dangling Promise lint rules. + export function act(callback: () => VoidOrUndefinedOnly): void; + export function act(callback: () => T | Promise): Promise; + + export function useId(): string; + + /** + * @param effect Imperative function that can return a cleanup function + * @param deps If present, effect will only activate if the values in the list change. + * + * @see {@link https://github.com/facebook/react/pull/21913} + */ + export function useInsertionEffect(effect: EffectCallback, deps?: DependencyList): void; + + /** + * @param subscribe + * @param getSnapshot + * + * @see {@link https://github.com/reactwg/react-18/discussions/86} + */ + // keep in sync with `useSyncExternalStore` from `use-sync-external-store` + export function useSyncExternalStore( + subscribe: (onStoreChange: () => void) => () => void, + getSnapshot: () => Snapshot, + getServerSnapshot?: () => Snapshot, + ): Snapshot; + + export function useOptimistic( + passthrough: State, + ): [State, (action: State | ((pendingState: State) => State)) => void]; + export function useOptimistic( + passthrough: State, + reducer: (state: State, action: Action) => State, + ): [State, (action: Action) => void]; + + interface UntrackedReactPromise extends PromiseLike { + status?: void; + } + + export interface PendingReactPromise extends PromiseLike { + status: "pending"; + } + + export interface FulfilledReactPromise extends PromiseLike { + status: "fulfilled"; + value: T; + } + + export interface RejectedReactPromise extends PromiseLike { + status: "rejected"; + reason: unknown; + } + + export type ReactPromise = + | UntrackedReactPromise + | PendingReactPromise + | FulfilledReactPromise + | RejectedReactPromise; + + export type Usable = ReactPromise | Context; + + export function use(usable: Usable): T; + + export function useActionState( + action: (state: Awaited) => State | Promise, + initialState: Awaited, + permalink?: string, + ): [state: Awaited, dispatch: () => void, isPending: boolean]; + export function useActionState( + action: (state: Awaited, payload: Payload) => State | Promise, + initialState: Awaited, + permalink?: string, + ): [state: Awaited, dispatch: (payload: Payload) => void, isPending: boolean]; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + export function cache(fn: CachedFunction): CachedFunction; + + export interface CacheSignal {} + /** + * @version 19.2.0 + */ + export function cacheSignal(): null | CacheSignal; + + export interface ActivityProps { + /** + * @default "visible" + */ + mode?: + | "hidden" + | "visible" + | undefined; + /** + * A name for this Activity boundary for instrumentation purposes. + * The name will help identify this boundary in React DevTools. + */ + name?: string | undefined; + children: ReactNode; + } + + /** + * @see {@link https://react.dev/reference/react/Activity `` documentation} + * @version 19.2.0 + */ + export const Activity: ExoticComponent; + + /** + * Warning: Only available in development builds. + * + * @see {@link https://react.dev/reference/react/captureOwnerStack Reference docs} + * @version 19.1.0 + */ + function captureOwnerStack(): string | null; + + // + // Event System + // ---------------------------------------------------------------------- + // TODO: change any to unknown when moving to TS v3 + interface BaseSyntheticEvent { + nativeEvent: E; + currentTarget: C; + target: T; + bubbles: boolean; + cancelable: boolean; + defaultPrevented: boolean; + eventPhase: number; + isTrusted: boolean; + preventDefault(): void; + isDefaultPrevented(): boolean; + stopPropagation(): void; + isPropagationStopped(): boolean; + persist(): void; + timeStamp: number; + type: string; + } + + /** + * currentTarget - a reference to the element on which the event listener is registered. + * + * target - a reference to the element from which the event was originally dispatched. + * This might be a child element to the element on which the event listener is registered. + * If you thought this should be `EventTarget & T`, see https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11508#issuecomment-256045682 + */ + interface SyntheticEvent extends BaseSyntheticEvent {} + + interface ClipboardEvent extends SyntheticEvent { + clipboardData: DataTransfer; + } + + interface CompositionEvent extends SyntheticEvent { + data: string; + } + + interface DragEvent extends MouseEvent { + dataTransfer: DataTransfer; + } + + interface PointerEvent extends MouseEvent { + pointerId: number; + pressure: number; + tangentialPressure: number; + tiltX: number; + tiltY: number; + twist: number; + width: number; + height: number; + pointerType: "mouse" | "pen" | "touch"; + isPrimary: boolean; + } + + interface FocusEvent extends SyntheticEvent { + relatedTarget: (EventTarget & RelatedTarget) | null; + target: EventTarget & Target; + } + + /** + * @deprecated FormEvent doesn't actually exist. + * You probably meant to use {@link ChangeEvent}, {@link InputEvent}, {@link SubmitEvent}, or just {@link SyntheticEvent} instead + * depending on the event type. + */ + interface FormEvent extends SyntheticEvent { + } + + interface InvalidEvent extends SyntheticEvent { + } + + /** + * change events bubble in React so their target is generally unknown. + * Only for form elements we know their target type because form events can't + * be nested. + * This type exists purely to narrow `target` for form elements. It doesn't + * reflect a DOM event. Change events are just fired as standard {@link SyntheticEvent}. + */ + interface ChangeEvent extends SyntheticEvent { + // TODO: This is wrong for change event handlers on arbitrary. Should + // be EventTarget & Target, but kept for backward compatibility until React 20. + target: EventTarget & CurrentTarget; + } + + interface InputEvent extends SyntheticEvent { + data: string; + } + + export type ModifierKey = + | "Alt" + | "AltGraph" + | "CapsLock" + | "Control" + | "Fn" + | "FnLock" + | "Hyper" + | "Meta" + | "NumLock" + | "ScrollLock" + | "Shift" + | "Super" + | "Symbol" + | "SymbolLock"; + + interface KeyboardEvent extends UIEvent { + altKey: boolean; + /** @deprecated */ + charCode: number; + ctrlKey: boolean; + code: string; + /** + * See [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#keys-modifier). for a list of valid (case-sensitive) arguments to this method. + */ + getModifierState(key: ModifierKey): boolean; + /** + * See the [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#named-key-attribute-values). for possible values + */ + key: string; + /** @deprecated */ + keyCode: number; + locale: string; + location: number; + metaKey: boolean; + repeat: boolean; + shiftKey: boolean; + /** @deprecated */ + which: number; + } + + interface MouseEvent extends UIEvent { + altKey: boolean; + button: number; + buttons: number; + clientX: number; + clientY: number; + ctrlKey: boolean; + /** + * See [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#keys-modifier). for a list of valid (case-sensitive) arguments to this method. + */ + getModifierState(key: ModifierKey): boolean; + metaKey: boolean; + movementX: number; + movementY: number; + pageX: number; + pageY: number; + relatedTarget: EventTarget | null; + screenX: number; + screenY: number; + shiftKey: boolean; + } + + interface SubmitEvent extends SyntheticEvent { + // `submitter` is available in react@canary + // submitter: HTMLElement | null; + // SubmitEvents are always targetted at HTMLFormElements. + target: EventTarget & HTMLFormElement; + } + + interface TouchEvent extends UIEvent { + altKey: boolean; + changedTouches: TouchList; + ctrlKey: boolean; + /** + * See [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#keys-modifier). for a list of valid (case-sensitive) arguments to this method. + */ + getModifierState(key: ModifierKey): boolean; + metaKey: boolean; + shiftKey: boolean; + targetTouches: TouchList; + touches: TouchList; + } + + interface UIEvent extends SyntheticEvent { + detail: number; + view: AbstractView; + } + + interface WheelEvent extends MouseEvent { + deltaMode: number; + deltaX: number; + deltaY: number; + deltaZ: number; + } + + interface AnimationEvent extends SyntheticEvent { + animationName: string; + elapsedTime: number; + pseudoElement: string; + } + + interface ToggleEvent extends SyntheticEvent { + oldState: "closed" | "open"; + newState: "closed" | "open"; + } + + interface TransitionEvent extends SyntheticEvent { + elapsedTime: number; + propertyName: string; + pseudoElement: string; + } + + // + // Event Handler Types + // ---------------------------------------------------------------------- + + type EventHandler> = { bivarianceHack(event: E): void }["bivarianceHack"]; + + type ReactEventHandler = EventHandler>; + + type ClipboardEventHandler = EventHandler>; + type CompositionEventHandler = EventHandler>; + type DragEventHandler = EventHandler>; + type FocusEventHandler = EventHandler>; + /** + * @deprecated FormEventHandler doesn't actually exist. + * You probably meant to use {@link ChangeEventHandler}, {@link InputEventHandler}, {@link SubmitEventHandler}, or just {@link EventHandler} instead + * depending on the event type. + */ + type FormEventHandler = EventHandler>; + type ChangeEventHandler = EventHandler< + ChangeEvent + >; + type InputEventHandler = EventHandler>; + type KeyboardEventHandler = EventHandler>; + type MouseEventHandler = EventHandler>; + type SubmitEventHandler = EventHandler>; + type TouchEventHandler = EventHandler>; + type PointerEventHandler = EventHandler>; + type UIEventHandler = EventHandler>; + type WheelEventHandler = EventHandler>; + type AnimationEventHandler = EventHandler>; + type ToggleEventHandler = EventHandler>; + type TransitionEventHandler = EventHandler>; + + // + // Props / DOM Attributes + // ---------------------------------------------------------------------- + + interface HTMLProps extends AllHTMLAttributes, ClassAttributes { + } + + type DetailedHTMLProps, T> = ClassAttributes & E; + + interface SVGProps extends SVGAttributes, ClassAttributes { + } + + interface SVGLineElementAttributes extends SVGProps {} + interface SVGTextElementAttributes extends SVGProps {} + + interface DOMAttributes { + children?: ReactNode | undefined; + dangerouslySetInnerHTML?: { + // Should be InnerHTML['innerHTML']. + // But unfortunately we're mixing renderer-specific type declarations. + __html: string | TrustedHTML; + } | undefined; + + // Clipboard Events + onCopy?: ClipboardEventHandler | undefined; + onCopyCapture?: ClipboardEventHandler | undefined; + onCut?: ClipboardEventHandler | undefined; + onCutCapture?: ClipboardEventHandler | undefined; + onPaste?: ClipboardEventHandler | undefined; + onPasteCapture?: ClipboardEventHandler | undefined; + + // Composition Events + onCompositionEnd?: CompositionEventHandler | undefined; + onCompositionEndCapture?: CompositionEventHandler | undefined; + onCompositionStart?: CompositionEventHandler | undefined; + onCompositionStartCapture?: CompositionEventHandler | undefined; + onCompositionUpdate?: CompositionEventHandler | undefined; + onCompositionUpdateCapture?: CompositionEventHandler | undefined; + + // Focus Events + onFocus?: FocusEventHandler | undefined; + onFocusCapture?: FocusEventHandler | undefined; + onBlur?: FocusEventHandler | undefined; + onBlurCapture?: FocusEventHandler | undefined; + + // form related Events + onChange?: ChangeEventHandler | undefined; + onChangeCapture?: ChangeEventHandler | undefined; + onBeforeInput?: InputEventHandler | undefined; + onBeforeInputCapture?: InputEventHandler | undefined; + onInput?: InputEventHandler | undefined; + onInputCapture?: InputEventHandler | undefined; + onReset?: ReactEventHandler | undefined; + onResetCapture?: ReactEventHandler | undefined; + onSubmit?: SubmitEventHandler | undefined; + onSubmitCapture?: SubmitEventHandler | undefined; + onInvalid?: ReactEventHandler | undefined; + onInvalidCapture?: ReactEventHandler | undefined; + + // Image Events + onLoad?: ReactEventHandler | undefined; + onLoadCapture?: ReactEventHandler | undefined; + onError?: ReactEventHandler | undefined; // also a Media Event + onErrorCapture?: ReactEventHandler | undefined; // also a Media Event + + // Keyboard Events + onKeyDown?: KeyboardEventHandler | undefined; + onKeyDownCapture?: KeyboardEventHandler | undefined; + /** @deprecated Use `onKeyUp` or `onKeyDown` instead */ + onKeyPress?: KeyboardEventHandler | undefined; + /** @deprecated Use `onKeyUpCapture` or `onKeyDownCapture` instead */ + onKeyPressCapture?: KeyboardEventHandler | undefined; + onKeyUp?: KeyboardEventHandler | undefined; + onKeyUpCapture?: KeyboardEventHandler | undefined; + + // Media Events + onAbort?: ReactEventHandler | undefined; + onAbortCapture?: ReactEventHandler | undefined; + onCanPlay?: ReactEventHandler | undefined; + onCanPlayCapture?: ReactEventHandler | undefined; + onCanPlayThrough?: ReactEventHandler | undefined; + onCanPlayThroughCapture?: ReactEventHandler | undefined; + onDurationChange?: ReactEventHandler | undefined; + onDurationChangeCapture?: ReactEventHandler | undefined; + onEmptied?: ReactEventHandler | undefined; + onEmptiedCapture?: ReactEventHandler | undefined; + onEncrypted?: ReactEventHandler | undefined; + onEncryptedCapture?: ReactEventHandler | undefined; + onEnded?: ReactEventHandler | undefined; + onEndedCapture?: ReactEventHandler | undefined; + onLoadedData?: ReactEventHandler | undefined; + onLoadedDataCapture?: ReactEventHandler | undefined; + onLoadedMetadata?: ReactEventHandler | undefined; + onLoadedMetadataCapture?: ReactEventHandler | undefined; + onLoadStart?: ReactEventHandler | undefined; + onLoadStartCapture?: ReactEventHandler | undefined; + onPause?: ReactEventHandler | undefined; + onPauseCapture?: ReactEventHandler | undefined; + onPlay?: ReactEventHandler | undefined; + onPlayCapture?: ReactEventHandler | undefined; + onPlaying?: ReactEventHandler | undefined; + onPlayingCapture?: ReactEventHandler | undefined; + onProgress?: ReactEventHandler | undefined; + onProgressCapture?: ReactEventHandler | undefined; + onRateChange?: ReactEventHandler | undefined; + onRateChangeCapture?: ReactEventHandler | undefined; + onSeeked?: ReactEventHandler | undefined; + onSeekedCapture?: ReactEventHandler | undefined; + onSeeking?: ReactEventHandler | undefined; + onSeekingCapture?: ReactEventHandler | undefined; + onStalled?: ReactEventHandler | undefined; + onStalledCapture?: ReactEventHandler | undefined; + onSuspend?: ReactEventHandler | undefined; + onSuspendCapture?: ReactEventHandler | undefined; + onTimeUpdate?: ReactEventHandler | undefined; + onTimeUpdateCapture?: ReactEventHandler | undefined; + onVolumeChange?: ReactEventHandler | undefined; + onVolumeChangeCapture?: ReactEventHandler | undefined; + onWaiting?: ReactEventHandler | undefined; + onWaitingCapture?: ReactEventHandler | undefined; + + // MouseEvents + onAuxClick?: MouseEventHandler | undefined; + onAuxClickCapture?: MouseEventHandler | undefined; + onClick?: MouseEventHandler | undefined; + onClickCapture?: MouseEventHandler | undefined; + onContextMenu?: MouseEventHandler | undefined; + onContextMenuCapture?: MouseEventHandler | undefined; + onDoubleClick?: MouseEventHandler | undefined; + onDoubleClickCapture?: MouseEventHandler | undefined; + onDrag?: DragEventHandler | undefined; + onDragCapture?: DragEventHandler | undefined; + onDragEnd?: DragEventHandler | undefined; + onDragEndCapture?: DragEventHandler | undefined; + onDragEnter?: DragEventHandler | undefined; + onDragEnterCapture?: DragEventHandler | undefined; + onDragExit?: DragEventHandler | undefined; + onDragExitCapture?: DragEventHandler | undefined; + onDragLeave?: DragEventHandler | undefined; + onDragLeaveCapture?: DragEventHandler | undefined; + onDragOver?: DragEventHandler | undefined; + onDragOverCapture?: DragEventHandler | undefined; + onDragStart?: DragEventHandler | undefined; + onDragStartCapture?: DragEventHandler | undefined; + onDrop?: DragEventHandler | undefined; + onDropCapture?: DragEventHandler | undefined; + onMouseDown?: MouseEventHandler | undefined; + onMouseDownCapture?: MouseEventHandler | undefined; + onMouseEnter?: MouseEventHandler | undefined; + onMouseLeave?: MouseEventHandler | undefined; + onMouseMove?: MouseEventHandler | undefined; + onMouseMoveCapture?: MouseEventHandler | undefined; + onMouseOut?: MouseEventHandler | undefined; + onMouseOutCapture?: MouseEventHandler | undefined; + onMouseOver?: MouseEventHandler | undefined; + onMouseOverCapture?: MouseEventHandler | undefined; + onMouseUp?: MouseEventHandler | undefined; + onMouseUpCapture?: MouseEventHandler | undefined; + + // Selection Events + onSelect?: ReactEventHandler | undefined; + onSelectCapture?: ReactEventHandler | undefined; + + // Touch Events + onTouchCancel?: TouchEventHandler | undefined; + onTouchCancelCapture?: TouchEventHandler | undefined; + onTouchEnd?: TouchEventHandler | undefined; + onTouchEndCapture?: TouchEventHandler | undefined; + onTouchMove?: TouchEventHandler | undefined; + onTouchMoveCapture?: TouchEventHandler | undefined; + onTouchStart?: TouchEventHandler | undefined; + onTouchStartCapture?: TouchEventHandler | undefined; + + // Pointer Events + onPointerDown?: PointerEventHandler | undefined; + onPointerDownCapture?: PointerEventHandler | undefined; + onPointerMove?: PointerEventHandler | undefined; + onPointerMoveCapture?: PointerEventHandler | undefined; + onPointerUp?: PointerEventHandler | undefined; + onPointerUpCapture?: PointerEventHandler | undefined; + onPointerCancel?: PointerEventHandler | undefined; + onPointerCancelCapture?: PointerEventHandler | undefined; + onPointerEnter?: PointerEventHandler | undefined; + onPointerLeave?: PointerEventHandler | undefined; + onPointerOver?: PointerEventHandler | undefined; + onPointerOverCapture?: PointerEventHandler | undefined; + onPointerOut?: PointerEventHandler | undefined; + onPointerOutCapture?: PointerEventHandler | undefined; + onGotPointerCapture?: PointerEventHandler | undefined; + onGotPointerCaptureCapture?: PointerEventHandler | undefined; + onLostPointerCapture?: PointerEventHandler | undefined; + onLostPointerCaptureCapture?: PointerEventHandler | undefined; + + // UI Events + onScroll?: UIEventHandler | undefined; + onScrollCapture?: UIEventHandler | undefined; + onScrollEnd?: UIEventHandler | undefined; + onScrollEndCapture?: UIEventHandler | undefined; + + // Wheel Events + onWheel?: WheelEventHandler | undefined; + onWheelCapture?: WheelEventHandler | undefined; + + // Animation Events + onAnimationStart?: AnimationEventHandler | undefined; + onAnimationStartCapture?: AnimationEventHandler | undefined; + onAnimationEnd?: AnimationEventHandler | undefined; + onAnimationEndCapture?: AnimationEventHandler | undefined; + onAnimationIteration?: AnimationEventHandler | undefined; + onAnimationIterationCapture?: AnimationEventHandler | undefined; + + // Toggle Events + onToggle?: ToggleEventHandler | undefined; + onBeforeToggle?: ToggleEventHandler | undefined; + + // Transition Events + onTransitionCancel?: TransitionEventHandler | undefined; + onTransitionCancelCapture?: TransitionEventHandler | undefined; + onTransitionEnd?: TransitionEventHandler | undefined; + onTransitionEndCapture?: TransitionEventHandler | undefined; + onTransitionRun?: TransitionEventHandler | undefined; + onTransitionRunCapture?: TransitionEventHandler | undefined; + onTransitionStart?: TransitionEventHandler | undefined; + onTransitionStartCapture?: TransitionEventHandler | undefined; + } + + export interface CSSProperties extends CSS.Properties { + /** + * The index signature was removed to enable closed typing for style + * using CSSType. You're able to use type assertion or module augmentation + * to add properties or an index signature of your own. + * + * For examples and more information, visit: + * https://github.com/frenic/csstype#what-should-i-do-when-i-get-type-errors + */ + } + + // All the WAI-ARIA 1.1 attributes from https://www.w3.org/TR/wai-aria-1.1/ + interface AriaAttributes { + /** Identifies the currently active element when DOM focus is on a composite widget, textbox, group, or application. */ + "aria-activedescendant"?: string | undefined; + /** Indicates whether assistive technologies will present all, or only parts of, the changed region based on the change notifications defined by the aria-relevant attribute. */ + "aria-atomic"?: Booleanish | undefined; + /** + * Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be + * presented if they are made. + */ + "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined; + /** Indicates an element is being modified and that assistive technologies MAY want to wait until the modifications are complete before exposing them to the user. */ + /** + * Defines a string value that labels the current element, which is intended to be converted into Braille. + * @see aria-label. + */ + "aria-braillelabel"?: string | undefined; + /** + * Defines a human-readable, author-localized abbreviated description for the role of an element, which is intended to be converted into Braille. + * @see aria-roledescription. + */ + "aria-brailleroledescription"?: string | undefined; + "aria-busy"?: Booleanish | undefined; + /** + * Indicates the current "checked" state of checkboxes, radio buttons, and other widgets. + * @see aria-pressed @see aria-selected. + */ + "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined; + /** + * Defines the total number of columns in a table, grid, or treegrid. + * @see aria-colindex. + */ + "aria-colcount"?: number | undefined; + /** + * Defines an element's column index or position with respect to the total number of columns within a table, grid, or treegrid. + * @see aria-colcount @see aria-colspan. + */ + "aria-colindex"?: number | undefined; + /** + * Defines a human readable text alternative of aria-colindex. + * @see aria-rowindextext. + */ + "aria-colindextext"?: string | undefined; + /** + * Defines the number of columns spanned by a cell or gridcell within a table, grid, or treegrid. + * @see aria-colindex @see aria-rowspan. + */ + "aria-colspan"?: number | undefined; + /** + * Identifies the element (or elements) whose contents or presence are controlled by the current element. + * @see aria-owns. + */ + "aria-controls"?: string | undefined; + /** Indicates the element that represents the current item within a container or set of related elements. */ + "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined; + /** + * Identifies the element (or elements) that describes the object. + * @see aria-labelledby + */ + "aria-describedby"?: string | undefined; + /** + * Defines a string value that describes or annotates the current element. + * @see related aria-describedby. + */ + "aria-description"?: string | undefined; + /** + * Identifies the element that provides a detailed, extended description for the object. + * @see aria-describedby. + */ + "aria-details"?: string | undefined; + /** + * Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable. + * @see aria-hidden @see aria-readonly. + */ + "aria-disabled"?: Booleanish | undefined; + /** + * Indicates what functions can be performed when a dragged object is released on the drop target. + * @deprecated in ARIA 1.1 + */ + "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined; + /** + * Identifies the element that provides an error message for the object. + * @see aria-invalid @see aria-describedby. + */ + "aria-errormessage"?: string | undefined; + /** Indicates whether the element, or another grouping element it controls, is currently expanded or collapsed. */ + "aria-expanded"?: Booleanish | undefined; + /** + * Identifies the next element (or elements) in an alternate reading order of content which, at the user's discretion, + * allows assistive technology to override the general default of reading in document source order. + */ + "aria-flowto"?: string | undefined; + /** + * Indicates an element's "grabbed" state in a drag-and-drop operation. + * @deprecated in ARIA 1.1 + */ + "aria-grabbed"?: Booleanish | undefined; + /** Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an element. */ + "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined; + /** + * Indicates whether the element is exposed to an accessibility API. + * @see aria-disabled. + */ + "aria-hidden"?: Booleanish | undefined; + /** + * Indicates the entered value does not conform to the format expected by the application. + * @see aria-errormessage. + */ + "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined; + /** Indicates keyboard shortcuts that an author has implemented to activate or give focus to an element. */ + "aria-keyshortcuts"?: string | undefined; + /** + * Defines a string value that labels the current element. + * @see aria-labelledby. + */ + "aria-label"?: string | undefined; + /** + * Identifies the element (or elements) that labels the current element. + * @see aria-describedby. + */ + "aria-labelledby"?: string | undefined; + /** Defines the hierarchical level of an element within a structure. */ + "aria-level"?: number | undefined; + /** Indicates that an element will be updated, and describes the types of updates the user agents, assistive technologies, and user can expect from the live region. */ + "aria-live"?: "off" | "assertive" | "polite" | undefined; + /** Indicates whether an element is modal when displayed. */ + "aria-modal"?: Booleanish | undefined; + /** Indicates whether a text box accepts multiple lines of input or only a single line. */ + "aria-multiline"?: Booleanish | undefined; + /** Indicates that the user may select more than one item from the current selectable descendants. */ + "aria-multiselectable"?: Booleanish | undefined; + /** Indicates whether the element's orientation is horizontal, vertical, or unknown/ambiguous. */ + "aria-orientation"?: "horizontal" | "vertical" | undefined; + /** + * Identifies an element (or elements) in order to define a visual, functional, or contextual parent/child relationship + * between DOM elements where the DOM hierarchy cannot be used to represent the relationship. + * @see aria-controls. + */ + "aria-owns"?: string | undefined; + /** + * Defines a short hint (a word or short phrase) intended to aid the user with data entry when the control has no value. + * A hint could be a sample value or a brief description of the expected format. + */ + "aria-placeholder"?: string | undefined; + /** + * Defines an element's number or position in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. + * @see aria-setsize. + */ + "aria-posinset"?: number | undefined; + /** + * Indicates the current "pressed" state of toggle buttons. + * @see aria-checked @see aria-selected. + */ + "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined; + /** + * Indicates that the element is not editable, but is otherwise operable. + * @see aria-disabled. + */ + "aria-readonly"?: Booleanish | undefined; + /** + * Indicates what notifications the user agent will trigger when the accessibility tree within a live region is modified. + * @see aria-atomic. + */ + "aria-relevant"?: + | "additions" + | "additions removals" + | "additions text" + | "all" + | "removals" + | "removals additions" + | "removals text" + | "text" + | "text additions" + | "text removals" + | undefined; + /** Indicates that user input is required on the element before a form may be submitted. */ + "aria-required"?: Booleanish | undefined; + /** Defines a human-readable, author-localized description for the role of an element. */ + "aria-roledescription"?: string | undefined; + /** + * Defines the total number of rows in a table, grid, or treegrid. + * @see aria-rowindex. + */ + "aria-rowcount"?: number | undefined; + /** + * Defines an element's row index or position with respect to the total number of rows within a table, grid, or treegrid. + * @see aria-rowcount @see aria-rowspan. + */ + "aria-rowindex"?: number | undefined; + /** + * Defines a human readable text alternative of aria-rowindex. + * @see aria-colindextext. + */ + "aria-rowindextext"?: string | undefined; + /** + * Defines the number of rows spanned by a cell or gridcell within a table, grid, or treegrid. + * @see aria-rowindex @see aria-colspan. + */ + "aria-rowspan"?: number | undefined; + /** + * Indicates the current "selected" state of various widgets. + * @see aria-checked @see aria-pressed. + */ + "aria-selected"?: Booleanish | undefined; + /** + * Defines the number of items in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. + * @see aria-posinset. + */ + "aria-setsize"?: number | undefined; + /** Indicates if items in a table or grid are sorted in ascending or descending order. */ + "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined; + /** Defines the maximum allowed value for a range widget. */ + "aria-valuemax"?: number | undefined; + /** Defines the minimum allowed value for a range widget. */ + "aria-valuemin"?: number | undefined; + /** + * Defines the current value for a range widget. + * @see aria-valuetext. + */ + "aria-valuenow"?: number | undefined; + /** Defines the human readable text alternative of aria-valuenow for a range widget. */ + "aria-valuetext"?: string | undefined; + } + + // All the WAI-ARIA 1.1 role attribute values from https://www.w3.org/TR/wai-aria-1.1/#role_definitions + type AriaRole = + | "alert" + | "alertdialog" + | "application" + | "article" + | "banner" + | "button" + | "cell" + | "checkbox" + | "columnheader" + | "combobox" + | "complementary" + | "contentinfo" + | "definition" + | "dialog" + | "directory" + | "document" + | "feed" + | "figure" + | "form" + | "grid" + | "gridcell" + | "group" + | "heading" + | "img" + | "link" + | "list" + | "listbox" + | "listitem" + | "log" + | "main" + | "marquee" + | "math" + | "menu" + | "menubar" + | "menuitem" + | "menuitemcheckbox" + | "menuitemradio" + | "navigation" + | "none" + | "note" + | "option" + | "presentation" + | "progressbar" + | "radio" + | "radiogroup" + | "region" + | "row" + | "rowgroup" + | "rowheader" + | "scrollbar" + | "search" + | "searchbox" + | "separator" + | "slider" + | "spinbutton" + | "status" + | "switch" + | "tab" + | "table" + | "tablist" + | "tabpanel" + | "term" + | "textbox" + | "timer" + | "toolbar" + | "tooltip" + | "tree" + | "treegrid" + | "treeitem" + | (string & {}); + + interface HTMLAttributes extends AriaAttributes, DOMAttributes { + // React-specific Attributes + defaultChecked?: boolean | undefined; + defaultValue?: string | number | readonly string[] | undefined; + suppressContentEditableWarning?: boolean | undefined; + suppressHydrationWarning?: boolean | undefined; + + // Standard HTML Attributes + accessKey?: string | undefined; + autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}); + autoFocus?: boolean | undefined; + className?: string | undefined; + contentEditable?: Booleanish | "inherit" | "plaintext-only" | undefined; + contextMenu?: string | undefined; + dir?: string | undefined; + draggable?: Booleanish | undefined; + enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined; + hidden?: boolean | undefined; + id?: string | undefined; + lang?: string | undefined; + nonce?: string | undefined; + slot?: string | undefined; + spellCheck?: Booleanish | undefined; + style?: CSSProperties | undefined; + tabIndex?: number | undefined; + title?: string | undefined; + translate?: "yes" | "no" | undefined; + + // Unknown + radioGroup?: string | undefined; // , + + // WAI-ARIA + role?: AriaRole | undefined; + + // RDFa Attributes + about?: string | undefined; + content?: string | undefined; + datatype?: string | undefined; + inlist?: any; + prefix?: string | undefined; + property?: string | undefined; + rel?: string | undefined; + resource?: string | undefined; + rev?: string | undefined; + typeof?: string | undefined; + vocab?: string | undefined; + + // Non-standard Attributes + autoCorrect?: string | undefined; + autoSave?: string | undefined; + color?: string | undefined; + itemProp?: string | undefined; + itemScope?: boolean | undefined; + itemType?: string | undefined; + itemID?: string | undefined; + itemRef?: string | undefined; + results?: number | undefined; + security?: string | undefined; + unselectable?: "on" | "off" | undefined; + + // Popover API + popover?: "" | "auto" | "manual" | "hint" | undefined; + popoverTargetAction?: "toggle" | "show" | "hide" | undefined; + popoverTarget?: string | undefined; + + // Living Standard + /** + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/inert} + */ + inert?: boolean | undefined; + /** + * Hints at the type of data that might be entered by the user while editing the element or its contents + * @see {@link https://html.spec.whatwg.org/multipage/interaction.html#input-modalities:-the-inputmode-attribute} + */ + inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined; + /** + * Specify that a standard HTML element should behave like a defined custom built-in element + * @see {@link https://html.spec.whatwg.org/multipage/custom-elements.html#attr-is} + */ + is?: string | undefined; + /** + * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/exportparts} + */ + exportparts?: string | undefined; + /** + * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/part} + */ + part?: string | undefined; + } + + /** + * For internal usage only. + * Different release channels declare additional types of ReactNode this particular release channel accepts. + * App or library types should never augment this interface. + */ + interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS {} + + interface AllHTMLAttributes extends HTMLAttributes { + // Standard HTML Attributes + accept?: string | undefined; + acceptCharset?: string | undefined; + action?: + | string + | undefined + | ((formData: FormData) => void | Promise) + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS + ]; + allowFullScreen?: boolean | undefined; + allowTransparency?: boolean | undefined; + alt?: string | undefined; + as?: string | undefined; + async?: boolean | undefined; + autoComplete?: string | undefined; + autoPlay?: boolean | undefined; + capture?: boolean | "user" | "environment" | undefined; + cellPadding?: number | string | undefined; + cellSpacing?: number | string | undefined; + charSet?: string | undefined; + challenge?: string | undefined; + checked?: boolean | undefined; + cite?: string | undefined; + classID?: string | undefined; + cols?: number | undefined; + colSpan?: number | undefined; + controls?: boolean | undefined; + coords?: string | undefined; + crossOrigin?: CrossOrigin; + data?: string | undefined; + dateTime?: string | undefined; + default?: boolean | undefined; + defer?: boolean | undefined; + disabled?: boolean | undefined; + download?: any; + encType?: string | undefined; + form?: string | undefined; + formAction?: + | string + | undefined + | ((formData: FormData) => void | Promise) + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS + ]; + formEncType?: string | undefined; + formMethod?: string | undefined; + formNoValidate?: boolean | undefined; + formTarget?: string | undefined; + frameBorder?: number | string | undefined; + headers?: string | undefined; + height?: number | string | undefined; + high?: number | undefined; + href?: string | undefined; + hrefLang?: string | undefined; + htmlFor?: string | undefined; + httpEquiv?: string | undefined; + integrity?: string | undefined; + keyParams?: string | undefined; + keyType?: string | undefined; + kind?: string | undefined; + label?: string | undefined; + list?: string | undefined; + loop?: boolean | undefined; + low?: number | undefined; + manifest?: string | undefined; + marginHeight?: number | undefined; + marginWidth?: number | undefined; + max?: number | string | undefined; + maxLength?: number | undefined; + media?: string | undefined; + mediaGroup?: string | undefined; + method?: string | undefined; + min?: number | string | undefined; + minLength?: number | undefined; + multiple?: boolean | undefined; + muted?: boolean | undefined; + name?: string | undefined; + noValidate?: boolean | undefined; + open?: boolean | undefined; + optimum?: number | undefined; + pattern?: string | undefined; + placeholder?: string | undefined; + playsInline?: boolean | undefined; + poster?: string | undefined; + preload?: string | undefined; + readOnly?: boolean | undefined; + required?: boolean | undefined; + reversed?: boolean | undefined; + rows?: number | undefined; + rowSpan?: number | undefined; + sandbox?: string | undefined; + scope?: string | undefined; + scoped?: boolean | undefined; + scrolling?: string | undefined; + seamless?: boolean | undefined; + selected?: boolean | undefined; + shape?: string | undefined; + size?: number | undefined; + sizes?: string | undefined; + span?: number | undefined; + src?: string | undefined; + srcDoc?: string | undefined; + srcLang?: string | undefined; + srcSet?: string | undefined; + start?: number | undefined; + step?: number | string | undefined; + summary?: string | undefined; + target?: string | undefined; + type?: string | undefined; + useMap?: string | undefined; + value?: string | readonly string[] | number | undefined; + width?: number | string | undefined; + wmode?: string | undefined; + wrap?: string | undefined; + } + + type HTMLAttributeReferrerPolicy = + | "" + | "no-referrer" + | "no-referrer-when-downgrade" + | "origin" + | "origin-when-cross-origin" + | "same-origin" + | "strict-origin" + | "strict-origin-when-cross-origin" + | "unsafe-url"; + + type HTMLAttributeAnchorTarget = + | "_self" + | "_blank" + | "_parent" + | "_top" + | (string & {}); + + interface AnchorHTMLAttributes extends HTMLAttributes { + download?: any; + href?: string | undefined; + hrefLang?: string | undefined; + media?: string | undefined; + ping?: string | undefined; + target?: HTMLAttributeAnchorTarget | undefined; + type?: string | undefined; + referrerPolicy?: HTMLAttributeReferrerPolicy | undefined; + } + + interface AudioHTMLAttributes extends MediaHTMLAttributes {} + + interface AreaHTMLAttributes extends HTMLAttributes { + alt?: string | undefined; + coords?: string | undefined; + download?: any; + href?: string | undefined; + hrefLang?: string | undefined; + media?: string | undefined; + referrerPolicy?: HTMLAttributeReferrerPolicy | undefined; + shape?: string | undefined; + target?: string | undefined; + } + + interface BaseHTMLAttributes extends HTMLAttributes { + href?: string | undefined; + target?: string | undefined; + } + + interface BlockquoteHTMLAttributes extends HTMLAttributes { + cite?: string | undefined; + } + + interface ButtonHTMLAttributes extends HTMLAttributes { + disabled?: boolean | undefined; + form?: string | undefined; + formAction?: + | string + | ((formData: FormData) => void | Promise) + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS + ] + | undefined; + formEncType?: string | undefined; + formMethod?: string | undefined; + formNoValidate?: boolean | undefined; + formTarget?: string | undefined; + name?: string | undefined; + type?: "submit" | "reset" | "button" | undefined; + value?: string | readonly string[] | number | undefined; + } + + interface CanvasHTMLAttributes extends HTMLAttributes { + height?: number | string | undefined; + width?: number | string | undefined; + } + + interface ColHTMLAttributes extends HTMLAttributes { + span?: number | undefined; + width?: number | string | undefined; + } + + interface ColgroupHTMLAttributes extends HTMLAttributes { + span?: number | undefined; + } + + interface DataHTMLAttributes extends HTMLAttributes { + value?: string | readonly string[] | number | undefined; + } + + interface DetailsHTMLAttributes extends HTMLAttributes { + open?: boolean | undefined; + name?: string | undefined; + } + + interface DelHTMLAttributes extends HTMLAttributes { + cite?: string | undefined; + dateTime?: string | undefined; + } + + interface DialogHTMLAttributes extends HTMLAttributes { + closedby?: "any" | "closerequest" | "none" | undefined; + onCancel?: ReactEventHandler | undefined; + onClose?: ReactEventHandler | undefined; + open?: boolean | undefined; + } + + interface EmbedHTMLAttributes extends HTMLAttributes { + height?: number | string | undefined; + src?: string | undefined; + type?: string | undefined; + width?: number | string | undefined; + } + + interface FieldsetHTMLAttributes extends HTMLAttributes { + disabled?: boolean | undefined; + form?: string | undefined; + name?: string | undefined; + } + + interface FormHTMLAttributes extends HTMLAttributes { + acceptCharset?: string | undefined; + action?: + | string + | undefined + | ((formData: FormData) => void | Promise) + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS + ]; + autoComplete?: string | undefined; + encType?: string | undefined; + method?: string | undefined; + name?: string | undefined; + noValidate?: boolean | undefined; + target?: string | undefined; + } + + interface HtmlHTMLAttributes extends HTMLAttributes { + manifest?: string | undefined; + } + + interface IframeHTMLAttributes extends HTMLAttributes { + allow?: string | undefined; + allowFullScreen?: boolean | undefined; + allowTransparency?: boolean | undefined; + /** @deprecated */ + frameBorder?: number | string | undefined; + height?: number | string | undefined; + loading?: "eager" | "lazy" | undefined; + /** @deprecated */ + marginHeight?: number | undefined; + /** @deprecated */ + marginWidth?: number | undefined; + name?: string | undefined; + referrerPolicy?: HTMLAttributeReferrerPolicy | undefined; + sandbox?: string | undefined; + /** @deprecated */ + scrolling?: string | undefined; + seamless?: boolean | undefined; + src?: string | undefined; + srcDoc?: string | undefined; + width?: number | string | undefined; + } + + interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_IMG_SRC_TYPES {} + + interface ImgHTMLAttributes extends HTMLAttributes { + alt?: string | undefined; + crossOrigin?: CrossOrigin; + decoding?: "async" | "auto" | "sync" | undefined; + fetchPriority?: "high" | "low" | "auto"; + height?: number | string | undefined; + loading?: "eager" | "lazy" | undefined; + referrerPolicy?: HTMLAttributeReferrerPolicy | undefined; + sizes?: string | undefined; + src?: + | string + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_IMG_SRC_TYPES[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_IMG_SRC_TYPES + ] + | undefined; + srcSet?: string | undefined; + useMap?: string | undefined; + width?: number | string | undefined; + } + + interface InsHTMLAttributes extends HTMLAttributes { + cite?: string | undefined; + dateTime?: string | undefined; + } + + type HTMLInputTypeAttribute = + | "button" + | "checkbox" + | "color" + | "date" + | "datetime-local" + | "email" + | "file" + | "hidden" + | "image" + | "month" + | "number" + | "password" + | "radio" + | "range" + | "reset" + | "search" + | "submit" + | "tel" + | "text" + | "time" + | "url" + | "week" + | (string & {}); + + type AutoFillAddressKind = "billing" | "shipping"; + type AutoFillBase = "" | "off" | "on"; + type AutoFillContactField = + | "email" + | "tel" + | "tel-area-code" + | "tel-country-code" + | "tel-extension" + | "tel-local" + | "tel-local-prefix" + | "tel-local-suffix" + | "tel-national"; + type AutoFillContactKind = "home" | "mobile" | "work"; + type AutoFillCredentialField = "webauthn"; + type AutoFillNormalField = + | "additional-name" + | "address-level1" + | "address-level2" + | "address-level3" + | "address-level4" + | "address-line1" + | "address-line2" + | "address-line3" + | "bday-day" + | "bday-month" + | "bday-year" + | "cc-csc" + | "cc-exp" + | "cc-exp-month" + | "cc-exp-year" + | "cc-family-name" + | "cc-given-name" + | "cc-name" + | "cc-number" + | "cc-type" + | "country" + | "country-name" + | "current-password" + | "family-name" + | "given-name" + | "honorific-prefix" + | "honorific-suffix" + | "name" + | "new-password" + | "one-time-code" + | "organization" + | "postal-code" + | "street-address" + | "transaction-amount" + | "transaction-currency" + | "username"; + type OptionalPrefixToken = `${T} ` | ""; + type OptionalPostfixToken = ` ${T}` | ""; + type AutoFillField = AutoFillNormalField | `${OptionalPrefixToken}${AutoFillContactField}`; + type AutoFillSection = `section-${string}`; + type AutoFill = + | AutoFillBase + | `${OptionalPrefixToken}${OptionalPrefixToken< + AutoFillAddressKind + >}${AutoFillField}${OptionalPostfixToken}`; + type HTMLInputAutoCompleteAttribute = AutoFill | (string & {}); + + interface InputHTMLAttributes extends HTMLAttributes { + accept?: string | undefined; + alt?: string | undefined; + autoComplete?: HTMLInputAutoCompleteAttribute | undefined; + capture?: boolean | "user" | "environment" | undefined; // https://www.w3.org/TR/html-media-capture/#the-capture-attribute + checked?: boolean | undefined; + disabled?: boolean | undefined; + form?: string | undefined; + formAction?: + | string + | ((formData: FormData) => void | Promise) + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_FORM_ACTIONS + ] + | undefined; + formEncType?: string | undefined; + formMethod?: string | undefined; + formNoValidate?: boolean | undefined; + formTarget?: string | undefined; + height?: number | string | undefined; + list?: string | undefined; + max?: number | string | undefined; + maxLength?: number | undefined; + min?: number | string | undefined; + minLength?: number | undefined; + multiple?: boolean | undefined; + name?: string | undefined; + pattern?: string | undefined; + placeholder?: string | undefined; + readOnly?: boolean | undefined; + required?: boolean | undefined; + size?: number | undefined; + src?: string | undefined; + step?: number | string | undefined; + type?: HTMLInputTypeAttribute | undefined; + value?: string | readonly string[] | number | undefined; + width?: number | string | undefined; + + // No other element dispatching change events can be nested in a + // so we know the target will be a HTMLInputElement. + onChange?: ChangeEventHandler | undefined; + } + + interface KeygenHTMLAttributes extends HTMLAttributes { + challenge?: string | undefined; + disabled?: boolean | undefined; + form?: string | undefined; + keyType?: string | undefined; + keyParams?: string | undefined; + name?: string | undefined; + } + + interface LabelHTMLAttributes extends HTMLAttributes { + form?: string | undefined; + htmlFor?: string | undefined; + } + + interface LiHTMLAttributes extends HTMLAttributes { + value?: string | readonly string[] | number | undefined; + } + + interface LinkHTMLAttributes extends HTMLAttributes { + as?: string | undefined; + blocking?: "render" | (string & {}) | undefined; + crossOrigin?: CrossOrigin; + fetchPriority?: "high" | "low" | "auto"; + href?: string | undefined; + hrefLang?: string | undefined; + integrity?: string | undefined; + media?: string | undefined; + imageSrcSet?: string | undefined; + imageSizes?: string | undefined; + referrerPolicy?: HTMLAttributeReferrerPolicy | undefined; + sizes?: string | undefined; + type?: string | undefined; + charSet?: string | undefined; + + // React props + precedence?: string | undefined; + } + + interface MapHTMLAttributes extends HTMLAttributes { + name?: string | undefined; + } + + interface MenuHTMLAttributes extends HTMLAttributes { + type?: string | undefined; + } + + interface DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_MEDIA_SRC_TYPES {} + + interface MediaHTMLAttributes extends HTMLAttributes { + autoPlay?: boolean | undefined; + controls?: boolean | undefined; + controlsList?: string | undefined; + crossOrigin?: CrossOrigin; + loop?: boolean | undefined; + mediaGroup?: string | undefined; + muted?: boolean | undefined; + playsInline?: boolean | undefined; + preload?: string | undefined; + src?: + | string + | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_MEDIA_SRC_TYPES[ + keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_EXPERIMENTAL_MEDIA_SRC_TYPES + ] + | undefined; + } + + interface MetaHTMLAttributes extends HTMLAttributes { + charSet?: string | undefined; + content?: string | undefined; + httpEquiv?: string | undefined; + media?: string | undefined; + name?: string | undefined; + } + + interface MeterHTMLAttributes extends HTMLAttributes { + form?: string | undefined; + high?: number | undefined; + low?: number | undefined; + max?: number | string | undefined; + min?: number | string | undefined; + optimum?: number | undefined; + value?: string | readonly string[] | number | undefined; + } + + interface QuoteHTMLAttributes extends HTMLAttributes { + cite?: string | undefined; + } + + interface ObjectHTMLAttributes extends HTMLAttributes { + classID?: string | undefined; + data?: string | undefined; + form?: string | undefined; + height?: number | string | undefined; + name?: string | undefined; + type?: string | undefined; + useMap?: string | undefined; + width?: number | string | undefined; + wmode?: string | undefined; + } + + interface OlHTMLAttributes extends HTMLAttributes { + reversed?: boolean | undefined; + start?: number | undefined; + type?: "1" | "a" | "A" | "i" | "I" | undefined; + } + + interface OptgroupHTMLAttributes extends HTMLAttributes { + disabled?: boolean | undefined; + label?: string | undefined; + } + + interface OptionHTMLAttributes extends HTMLAttributes { + disabled?: boolean | undefined; + label?: string | undefined; + selected?: boolean | undefined; + value?: string | readonly string[] | number | undefined; + } + + interface OutputHTMLAttributes extends HTMLAttributes { + form?: string | undefined; + htmlFor?: string | undefined; + name?: string | undefined; + } + + interface ParamHTMLAttributes extends HTMLAttributes { + name?: string | undefined; + value?: string | readonly string[] | number | undefined; + } + + interface ProgressHTMLAttributes extends HTMLAttributes { + max?: number | string | undefined; + value?: string | readonly string[] | number | undefined; + } + + interface SlotHTMLAttributes extends HTMLAttributes { + name?: string | undefined; + } + + interface ScriptHTMLAttributes extends HTMLAttributes { + async?: boolean | undefined; + blocking?: "render" | (string & {}) | undefined; + /** @deprecated */ + charSet?: string | undefined; + crossOrigin?: CrossOrigin; + defer?: boolean | undefined; + fetchPriority?: "high" | "low" | "auto" | undefined; + integrity?: string | undefined; + noModule?: boolean | undefined; + referrerPolicy?: HTMLAttributeReferrerPolicy | undefined; + src?: string | undefined; + type?: string | undefined; + } + + interface SelectHTMLAttributes extends HTMLAttributes { + autoComplete?: string | undefined; + disabled?: boolean | undefined; + form?: string | undefined; + multiple?: boolean | undefined; + name?: string | undefined; + required?: boolean | undefined; + size?: number | undefined; + value?: string | readonly string[] | number | undefined; + // No other element dispatching change events can be nested in a