godhosting commited on
Commit
34bcbf8
·
verified ·
1 Parent(s): 9e04745

Upload 5 files

Browse files
Files changed (5) hide show
  1. netlify.toml.txt +13 -0
  2. pdf-generator.js +138 -0
  3. pincodes_hindi.json +0 -0
  4. style.css +1334 -0
  5. theme-init.js +7 -0
netlify.toml.txt ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [build]
2
+ functions = "netlify/functions"
3
+
4
+ [[redirects]]
5
+ from = "/api/proxy/*"
6
+ to = "/.netlify/functions/proxy/:splat"
7
+ status = 200
8
+
9
+ [[redirects]]
10
+ from = "/*"
11
+ to = "/index.html"
12
+ status = 200
13
+ force = false
pdf-generator.js ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * pdf-generator.js
3
+ * Generates High-Resolution Image PDF using html2canvas
4
+ * to preserve exact Devanagari ligatures and fonts,
5
+ * optimized for 2-5MB file sizes via JPEG compression.
6
+ */
7
+
8
+ function generateAadhaarPDF() {
9
+ return new Promise((resolve, reject) => {
10
+ const { jsPDF } = window.jspdf;
11
+
12
+ const now = new Date();
13
+ const timeStamp = `${String(now.getHours()).padStart(2, '0')}${String(now.getMinutes()).padStart(2, '0')}${String(now.getSeconds()).padStart(2, '0')}`;
14
+
15
+ const nameInput = document.getElementById('in-name-en');
16
+ const nameVal = nameInput && nameInput.value ? nameInput.value.trim().replace(/\s+/g, '_') : 'Applicant';
17
+ const fileName = `${nameVal}_Aadhaar_${timeStamp}.pdf`;
18
+
19
+ const ws = document.getElementById('workspace');
20
+ const previewArea = document.querySelector('.preview-area');
21
+
22
+ // Show preview area off-screen so html2canvas can capture it
23
+ const originalPreviewDisplay = previewArea ? previewArea.style.display : '';
24
+ const originalPreviewPosition = previewArea ? previewArea.style.position : '';
25
+ const originalPreviewLeft = previewArea ? previewArea.style.left : '';
26
+ if (previewArea) {
27
+ previewArea.style.setProperty('display', 'flex', 'important');
28
+ previewArea.style.position = 'fixed';
29
+ previewArea.style.left = '-9999px';
30
+ previewArea.style.top = '0';
31
+ }
32
+
33
+ // Temporarily remove scale transforms so html2canvas captures full A4 layout
34
+ const originalTransform = ws.style.transform;
35
+ const originalShadow = ws.style.boxShadow;
36
+ ws.style.transform = 'none';
37
+ ws.style.boxShadow = 'none';
38
+
39
+ // FIX: html2canvas blurs "background-size: cover" CSS images and misaligns them
40
+ // Calculate precise mathematical dimensions mirroring 'cover' logic in mm natively
41
+ const bgImgNative = new Image();
42
+
43
+ bgImgNative.onload = () => {
44
+ const pageRatio = 210 / 297;
45
+ const imgRatio = bgImgNative.naturalWidth / bgImgNative.naturalHeight;
46
+ let drawW, drawH, drawX, drawY;
47
+
48
+ if (imgRatio > pageRatio) {
49
+ drawH = 297;
50
+ drawW = (297 / bgImgNative.naturalHeight) * bgImgNative.naturalWidth;
51
+ drawX = (210 - drawW) / 2;
52
+ drawY = 0;
53
+ } else {
54
+ drawW = 210;
55
+ drawH = (210 / bgImgNative.naturalWidth) * bgImgNative.naturalHeight;
56
+ drawX = 0;
57
+ drawY = (297 - drawH) / 2;
58
+ }
59
+
60
+ bgImgNative.style.position = 'absolute';
61
+ bgImgNative.style.width = drawW + 'mm';
62
+ bgImgNative.style.height = drawH + 'mm';
63
+ bgImgNative.style.left = drawX + 'mm';
64
+ bgImgNative.style.top = drawY + 'mm';
65
+ bgImgNative.style.objectFit = 'fill';
66
+ bgImgNative.style.zIndex = '0';
67
+ bgImgNative.id = 'temp-bg-native';
68
+
69
+ const originalBgLayer = document.querySelector('.bg-layer');
70
+ const oldDisplay = originalBgLayer ? originalBgLayer.style.display : '';
71
+ if (originalBgLayer) originalBgLayer.style.display = 'none';
72
+ ws.prepend(bgImgNative);
73
+
74
+ // Timeout ensures DOM repaints before capture
75
+ setTimeout(() => {
76
+ html2canvas(ws, {
77
+ scale: 4, // 7x scale increases Sharpness dramatically and lands around ~5-8MB resulting JPEG size
78
+ useCORS: true,
79
+ allowTaint: true,
80
+ backgroundColor: '#ffffff',
81
+ logging: false,
82
+ onclone: (clonedDoc) => {
83
+ const clonedWs = clonedDoc.getElementById('workspace');
84
+ if (clonedWs) {
85
+ clonedWs.style.transform = 'none';
86
+ clonedWs.style.boxShadow = 'none';
87
+ }
88
+
89
+ // Force exact 6.3pt (8.4px) on requested text elements inside the cloned capturing DOM!
90
+ const exactEls = clonedDoc.querySelectorAll('.inroltext, .hindi-name, .english-name, .dob-text, .gender-text, .address-hi-text, .address-en-text, .address-hi-label, .address-en-label');
91
+ exactEls.forEach(el => {
92
+ el.style.fontSize = '8.4px';
93
+ });
94
+ }
95
+ }).then(canvas => {
96
+ // Restore UI immediately
97
+ ws.style.transform = originalTransform;
98
+ ws.style.boxShadow = originalShadow;
99
+ if (originalBgLayer) originalBgLayer.style.display = oldDisplay;
100
+ const tempBg = document.getElementById('temp-bg-native');
101
+ if (tempBg) tempBg.remove();
102
+
103
+ // Restore preview area state
104
+ if (previewArea) {
105
+ previewArea.style.removeProperty('display');
106
+ previewArea.style.position = originalPreviewPosition;
107
+ previewArea.style.left = originalPreviewLeft;
108
+ previewArea.style.top = '';
109
+ }
110
+
111
+ // JPEG encoding at 1.0 provides the absolute maximum fidelity
112
+ const imgData = canvas.toDataURL('image/jpeg', 1.0);
113
+ const doc = new jsPDF('portrait', 'mm', 'a4');
114
+ doc.addImage(imgData, 'JPEG', 0, 0, 210, 297);
115
+ doc.save(fileName);
116
+ resolve(fileName);
117
+
118
+ }).catch(err => {
119
+ console.error("PDF Generation Error:", err);
120
+ ws.style.transform = originalTransform;
121
+ ws.style.boxShadow = originalShadow;
122
+ if (originalBgLayer) originalBgLayer.style.display = oldDisplay;
123
+ const tempBg = document.getElementById('temp-bg-native');
124
+ if (tempBg) tempBg.remove();
125
+
126
+ if (previewArea) {
127
+ previewArea.style.removeProperty('display');
128
+ previewArea.style.position = originalPreviewPosition;
129
+ previewArea.style.left = originalPreviewLeft;
130
+ previewArea.style.top = '';
131
+ }
132
+ reject(err);
133
+ });
134
+ }, 150);
135
+ };
136
+ bgImgNative.src = EMBEDDED_BG;
137
+ });
138
+ }
pincodes_hindi.json ADDED
The diff for this file is too large to render. See raw diff
 
style.css ADDED
@@ -0,0 +1,1334 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *, *::before, *::after {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ @font-face {
6
+ font-family: 'AadhaarEnglish';
7
+ src: url('font/font-0020.ttf') format('truetype');
8
+ font-weight: 400;
9
+ font-style: normal;
10
+ font-display: block;
11
+ }
12
+
13
+ @font-face {
14
+ font-family: 'AadhaarHindi';
15
+ src: url('font/Noto-Sans-Devanagari-400.ttf') format('truetype');
16
+ font-weight: 400;
17
+ font-style: normal;
18
+ font-display: block;
19
+ -webkit-font-smoothing: antialiased;
20
+ }
21
+
22
+ @font-face {
23
+ font-family: 'AadhaarDigits';
24
+ src: url('font/font-0052.ttf') format('truetype');
25
+ font-weight: 400;
26
+ font-style: normal;
27
+ font-display: block;
28
+ }
29
+
30
+ body {
31
+ font-family: 'Poppins', 'FontDigit', 'FontHindi', 'FontEnglish', Arial, sans-serif;
32
+ background-color: var(--bg-color);
33
+ background-image: var(--surface-gradient);
34
+ background-attachment: fixed;
35
+ margin: 0;
36
+ color: var(--text-color);
37
+ transition: background-color 0.3s ease, color 0.3s ease;
38
+ min-height: 100vh;
39
+ overflow-x: hidden;
40
+ width: 100%;
41
+ }
42
+
43
+ /* Global Header Styles */
44
+ .main-header {
45
+ background: var(--glass-bg);
46
+ backdrop-filter: blur(12px);
47
+ -webkit-backdrop-filter: blur(12px);
48
+ border-bottom: 1px solid var(--glass-border);
49
+ box-shadow: var(--glass-shadow);
50
+ padding: 15px 40px;
51
+ position: sticky;
52
+ top: 0;
53
+ z-index: 1000;
54
+ }
55
+
56
+ .header-content {
57
+ max-width: 1400px;
58
+ margin: 0 auto;
59
+ display: flex;
60
+ justify-content: space-between;
61
+ align-items: center;
62
+ }
63
+
64
+ .header-right {
65
+ display: flex;
66
+ align-items: center;
67
+ gap: 30px;
68
+ }
69
+
70
+ .logo {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 12px;
74
+ }
75
+
76
+ .logo-icon {
77
+ font-size: 24px;
78
+ }
79
+
80
+ .logo h1 {
81
+ font-size: 20px;
82
+ font-weight: 700;
83
+ margin: 0;
84
+ background: var(--primary-gradient);
85
+ -webkit-background-clip: text;
86
+ background-clip: text;
87
+ -webkit-text-fill-color: transparent;
88
+ letter-spacing: -0.5px;
89
+ }
90
+
91
+ .main-nav {
92
+ display: flex;
93
+ gap: 10px;
94
+ background: rgba(0, 0, 0, 0.03);
95
+ padding: 6px;
96
+ border-radius: 14px;
97
+ border: 1px solid var(--border-color);
98
+ }
99
+
100
+ .dark-theme .main-nav {
101
+ background: rgba(255, 255, 255, 0.05);
102
+ }
103
+
104
+ .nav-btn {
105
+ padding: 10px 20px;
106
+ border-radius: 10px;
107
+ text-decoration: none;
108
+ color: var(--text-muted);
109
+ font-size: 14px;
110
+ font-weight: 600;
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 8px;
114
+ transition: all 0.3s ease;
115
+ border: none;
116
+ background: transparent;
117
+ cursor: pointer;
118
+ }
119
+
120
+ .nav-btn:hover {
121
+ color: var(--text-color);
122
+ background: rgba(0, 0, 0, 0.05);
123
+ }
124
+
125
+ .dark-theme .nav-btn:hover {
126
+ background: rgba(255, 255, 255, 0.08);
127
+ }
128
+
129
+ .nav-btn.active {
130
+ background: var(--primary-gradient) !important;
131
+ color: white !important;
132
+ box-shadow: 0 4px 12px rgba(118, 75, 162, 0.3);
133
+ }
134
+
135
+ .app-container {
136
+ display: flex;
137
+ justify-content: center;
138
+ align-items: flex-start;
139
+ padding: 40px 20px;
140
+ box-sizing: border-box;
141
+ /* min-height calculation to account for header */
142
+ min-height: calc(100vh - 80px);
143
+ }
144
+
145
+ /* Form Styles with Glassmorphism */
146
+ .sidebar-form {
147
+ width: 100%;
148
+ max-width: 850px;
149
+ background: var(--glass-bg);
150
+ backdrop-filter: blur(16px);
151
+ -webkit-backdrop-filter: blur(16px);
152
+ box-shadow: var(--glass-shadow);
153
+ border-radius: 24px;
154
+ padding: 40px;
155
+ z-index: 10;
156
+ border: 1px solid var(--glass-border);
157
+ animation: slideUp 0.6s cubic-bezier(0.16, 1, 0.3, 1);
158
+ }
159
+
160
+ /* Mobile Navigation Toggle */
161
+ .mobile-nav-toggle {
162
+ display: none;
163
+ flex-direction: column;
164
+ justify-content: space-between;
165
+ width: 30px;
166
+ height: 20px;
167
+ background: transparent;
168
+ border: none;
169
+ cursor: pointer;
170
+ padding: 0;
171
+ z-index: 1100;
172
+ }
173
+
174
+ .hamburger-line {
175
+ width: 100%;
176
+ height: 3px;
177
+ background-color: var(--text-color);
178
+ border-radius: 10px;
179
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
180
+ transform-origin: left center;
181
+ }
182
+
183
+ .mobile-nav-toggle.active .hamburger-line:nth-child(1) {
184
+ transform: rotate(45deg);
185
+ }
186
+
187
+ .mobile-nav-toggle.active .hamburger-line:nth-child(2) {
188
+ opacity: 0;
189
+ transform: translateX(20px);
190
+ }
191
+
192
+ .mobile-nav-toggle.active .hamburger-line:nth-child(3) {
193
+ transform: rotate(-45deg);
194
+ }
195
+
196
+ /* Error Container Styles */
197
+ .error-container {
198
+ background: rgba(239, 68, 68, 0.1);
199
+ border-left: 4px solid #ef4444;
200
+ padding: 12px 16px;
201
+ border-radius: 8px;
202
+ color: #ef4444;
203
+ font-size: 14px;
204
+ font-weight: 500;
205
+ display: flex;
206
+ align-items: center;
207
+ gap: 10px;
208
+ animation: shake 0.5s cubic-bezier(.36,.07,.19,.97) both;
209
+ }
210
+
211
+ .error-container::before {
212
+ content: '⚠️';
213
+ }
214
+
215
+ @keyframes shake {
216
+ 10%, 90% { transform: translate3d(-1px, 0, 0); }
217
+ 20%, 80% { transform: translate3d(2px, 0, 0); }
218
+ 30%, 50%, 70% { transform: translate3d(-4px, 0, 0); }
219
+ 40%, 60% { transform: translate3d(4px, 0, 0); }
220
+ }
221
+
222
+ @media screen and (max-width: 768px) {
223
+ .main-header {
224
+ padding: 12px 20px;
225
+ }
226
+
227
+ .mobile-nav-toggle {
228
+ display: flex;
229
+ }
230
+
231
+ .main-nav {
232
+ position: fixed;
233
+ top: 0;
234
+ right: -100%;
235
+ width: 280px;
236
+ height: 100vh;
237
+ background: var(--glass-bg);
238
+ backdrop-filter: blur(24px);
239
+ -webkit-backdrop-filter: blur(24px);
240
+ flex-direction: column;
241
+ padding: 80px 20px 20px;
242
+ transition: right 0.4s cubic-bezier(0.4, 0, 0.2, 1);
243
+ z-index: 1050;
244
+ box-shadow: -10px 0 30px rgba(0, 0, 0, 0.1);
245
+ display: flex;
246
+ gap: 15px;
247
+ border-radius: 0;
248
+ border-right: none;
249
+ }
250
+
251
+ .main-nav.active {
252
+ right: 0;
253
+ }
254
+
255
+ .nav-btn {
256
+ width: 100%;
257
+ padding: 14px 20px;
258
+ font-size: 16px;
259
+ }
260
+
261
+ }
262
+
263
+ .header-content {
264
+ justify-content: space-between;
265
+ }
266
+
267
+ .header-actions {
268
+ order: 1; /* Moves theme toggle to the right */
269
+ margin-left: auto;
270
+ margin-right: 15px;
271
+ }
272
+
273
+ .mobile-nav-toggle {
274
+ order: 2; /* Hamburger stays on the far right */
275
+ }
276
+ }
277
+
278
+ @keyframes slideUp {
279
+ from { transform: translateY(30px); opacity: 0; }
280
+ to { transform: translateY(0); opacity: 1; }
281
+ }
282
+
283
+ .sidebar-header {
284
+ text-align: center;
285
+ margin-bottom: 35px;
286
+ }
287
+
288
+ .sidebar-form h2 {
289
+ margin: 0;
290
+ color: var(--text-color);
291
+ font-size: 28px;
292
+ font-weight: 800;
293
+ letter-spacing: -1px;
294
+ }
295
+
296
+ .sidebar-subtitle {
297
+ color: var(--text-muted);
298
+ font-size: 14px;
299
+ margin-top: 5px;
300
+ }
301
+
302
+ .form-group {
303
+ margin-bottom: 20px;
304
+ }
305
+
306
+ .form-row {
307
+ display: flex;
308
+ gap: 15px;
309
+ }
310
+
311
+ .form-row .form-group {
312
+ flex: 1;
313
+ }
314
+
315
+ .form-group label {
316
+ display: block;
317
+ font-size: 12px;
318
+ color: var(--text-muted);
319
+ margin-bottom: 10px;
320
+ font-weight: 700;
321
+ text-transform: uppercase;
322
+ letter-spacing: 1px;
323
+ }
324
+
325
+ .form-group input,
326
+ .form-group textarea {
327
+ width: 100%;
328
+ padding: 14px 18px;
329
+ background-color: var(--input-bg);
330
+ border: 1.5px solid var(--border-color);
331
+ border-radius: 12px;
332
+ color: var(--text-color);
333
+ font-size: 16px;
334
+ font-family: 'Poppins', 'FontHindi', sans-serif;
335
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
336
+ box-sizing: border-box;
337
+ }
338
+
339
+ /* Base input appearance for text-like inputs */
340
+ input[type="text"],
341
+ input[type="date"],
342
+ input[type="email"],
343
+ input[type="number"],
344
+ input[type="tel"],
345
+ textarea {
346
+ -webkit-appearance: none;
347
+ -moz-appearance: none;
348
+ appearance: none;
349
+ }
350
+
351
+ /* Ensure Radios and Checkboxes remain functional */
352
+ input[type="radio"],
353
+ input[type="checkbox"] {
354
+ -webkit-appearance: auto;
355
+ -moz-appearance: auto;
356
+ appearance: auto;
357
+ width: auto;
358
+ height: auto;
359
+ cursor: pointer;
360
+ }
361
+
362
+ input[type="date"] {
363
+ min-height: 52px; /* Consistency on mobile */
364
+ position: relative;
365
+ }
366
+
367
+ /* Remove native iOS date indicator pop-ups */
368
+ input[type="date"]::-webkit-inner-spin-button,
369
+ input[type="date"]::-webkit-calendar-picker-indicator {
370
+ padding: 0;
371
+ margin: 0;
372
+ }
373
+
374
+ .form-group input:focus,
375
+ .form-group textarea:focus {
376
+ border-color: var(--accent-color);
377
+ box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.1);
378
+ outline: none;
379
+ transform: translateY(-1px);
380
+ }
381
+
382
+ /* Photo Preview */
383
+ .photo-preview-container {
384
+ width: 70px;
385
+ height: 90px;
386
+ border: 2px solid var(--border-color);
387
+ border-radius: 12px;
388
+ overflow: hidden;
389
+ background: var(--input-bg);
390
+ display: flex;
391
+ justify-content: center;
392
+ align-items: center;
393
+ box-shadow: var(--shadow-sm);
394
+ transition: all 0.3s ease;
395
+ }
396
+
397
+ .photo-preview-container:hover {
398
+ border-color: var(--accent-color);
399
+ transform: scale(1.05);
400
+ }
401
+
402
+ .photo-preview-container img {
403
+ width: 100%;
404
+ height: 100%;
405
+ object-fit: cover;
406
+ }
407
+
408
+ .btn-print {
409
+ width: 100%;
410
+ padding: 18px;
411
+ background: var(--primary-gradient);
412
+ color: white;
413
+ border: none;
414
+ border-radius: 16px;
415
+ font-size: 18px;
416
+ font-weight: 700;
417
+ cursor: pointer;
418
+ margin-top: 25px;
419
+ transition: all 0.3s ease;
420
+ box-shadow: 0 10px 20px -5px rgba(118, 75, 162, 0.3);
421
+ display: flex;
422
+ justify-content: center;
423
+ align-items: center;
424
+ gap: 12px;
425
+ }
426
+
427
+ .btn-print:hover {
428
+ transform: translateY(-3px);
429
+ box-shadow: 0 15px 30px -5px rgba(118, 75, 162, 0.4);
430
+ filter: brightness(1.1);
431
+ }
432
+
433
+ .btn-print:active {
434
+ transform: translateY(0);
435
+ }
436
+
437
+ .theme-toggle-btn {
438
+ width: 44px;
439
+ height: 44px;
440
+ border-radius: 12px;
441
+ border: 1px solid var(--glass-border);
442
+ cursor: pointer;
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: center;
446
+ background: var(--glass-bg);
447
+ color: var(--text-color);
448
+ transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
449
+ }
450
+
451
+ .theme-toggle-btn:hover {
452
+ transform: rotate(15deg) scale(1.1);
453
+ background: var(--accent-color);
454
+ color: white;
455
+ box-shadow: 0 8px 20px rgba(59, 130, 246, 0.3);
456
+ }
457
+
458
+ .theme-toggle-btn:hover {
459
+ transform: scale(1.1);
460
+ box-shadow: var(--shadow-md);
461
+ background: var(--border-color);
462
+ }
463
+
464
+ .dark-theme .theme-toggle-btn:hover {
465
+ background: var(--accent-color);
466
+ color: white;
467
+ }
468
+
469
+ .theme-icon {
470
+ position: absolute;
471
+ font-size: 18px;
472
+ line-height: 1;
473
+ display: flex;
474
+ align-items: center;
475
+ justify-content: center;
476
+ transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
477
+ }
478
+
479
+ .sun-icon {
480
+ opacity: 1;
481
+ transform: rotate(0deg);
482
+ }
483
+
484
+ .moon-icon {
485
+ opacity: 0;
486
+ transform: rotate(-180deg);
487
+ }
488
+
489
+ .dark-theme .sun-icon {
490
+ opacity: 0;
491
+ transform: rotate(180deg);
492
+ }
493
+
494
+ .dark-theme .moon-icon {
495
+ opacity: 1;
496
+ transform: rotate(0deg);
497
+ }
498
+
499
+ /* Preview Area Styles */
500
+ .preview-area {
501
+ display: none !important;
502
+ /* Forces it to stay hidden override inline */
503
+ justify-content: center;
504
+ align-items: flex-start;
505
+ padding: 20px;
506
+ margin-left: 40px;
507
+ }
508
+
509
+ /* The blank background */
510
+ .bg-layer {
511
+ position: absolute;
512
+ top: 0;
513
+ left: 0;
514
+ width: 100%;
515
+ height: 100%;
516
+ background-size: cover !important;
517
+ background-position: center !important;
518
+ background-repeat: no-repeat !important;
519
+ z-index: 1;
520
+ -webkit-print-color-adjust: exact !important;
521
+ print-color-adjust: exact !important;
522
+ }
523
+
524
+ /* Workspace Styles */
525
+ .workspace {
526
+ position: relative;
527
+ width: 210mm;
528
+ height: 297mm;
529
+ background-color: white;
530
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
531
+ overflow: hidden;
532
+ }
533
+
534
+ /* Fixed text fields base */
535
+ .text-element {
536
+ position: absolute;
537
+ z-index: 10;
538
+ color: black;
539
+ line-height: 1;
540
+ letter-spacing: -0.21px;
541
+ white-space: normal;
542
+ /* Allow automatic text wrapping */
543
+ word-wrap: break-word;
544
+ /* Break long words if necessary */
545
+ font-family: 'AadhaarEnglish', Arial, sans-serif;
546
+ }
547
+
548
+ /* Container sections (Relative positioning contexts) */
549
+ .inrol-section {
550
+ position: absolute;
551
+ top: 385px;
552
+ left: 90px;
553
+ width: 400px;
554
+ height: auto;
555
+ /* Let it grow with content */
556
+ min-height: 15px;
557
+ z-index: 10;
558
+ }
559
+
560
+ .inroltext {
561
+ position: relative;
562
+ /* Change from absolute to relative to stay within flow */
563
+ font-size: 8px;
564
+ line-height: 1.55;
565
+ margin-top: 23px;
566
+ /* Replaced top with margin-top */
567
+ margin-left: 5px;
568
+ /* Replaced left with margin-left */
569
+ color: black;
570
+ font-family: 'AadhaarEnglish', Arial, sans-serif;
571
+ }
572
+
573
+ .left-panel {
574
+ position: absolute;
575
+ top: 741px;
576
+ left: 68px;
577
+ width: 250px;
578
+ height: auto;
579
+ /* Let it grow */
580
+ min-height: 300px;
581
+ z-index: 10;
582
+ }
583
+
584
+ .name-section {
585
+ position: absolute;
586
+ top: 121px;
587
+ /* Relative to left-panel */
588
+ left: 80px;
589
+ /* Relative to left-panel */
590
+ width: 150px;
591
+ height: auto;
592
+ /* Let it grow */
593
+ min-height: 50px;
594
+ }
595
+
596
+ .qr-code,
597
+ .signature-section {
598
+ position: absolute;
599
+ z-index: 10;
600
+ }
601
+
602
+ .qr-code-image,
603
+ .qr-code-image-2,
604
+ .signature,
605
+ .signature-text {
606
+ position: relative;
607
+ }
608
+
609
+ .qr-code-image {
610
+ top: 580px;
611
+ left: 273px;
612
+ width: 105px;
613
+ height: auto;
614
+ }
615
+
616
+ .qr-code-image-2 {
617
+ top: 860px;
618
+ left: 530px;
619
+ width: 110px;
620
+ }
621
+
622
+ .signature-section {
623
+ margin: 2px;
624
+ font-size: 10px;
625
+ width: 80px;
626
+ height: 40px;
627
+ top: 585px;
628
+ left: 75px;
629
+ }
630
+
631
+ .signature {
632
+ font-size: 6.7px;
633
+ letter-spacing: -0.15px;
634
+ }
635
+
636
+ .signature-text {
637
+ top: 5.2px;
638
+ font-size: 5px;
639
+ line-height: 0.9;
640
+ }
641
+
642
+ .address-section {
643
+ position: absolute;
644
+ top: 852px;
645
+ left: 415px;
646
+ width: 180px;
647
+ height: auto;
648
+ /* Let it grow */
649
+ min-height: 110px;
650
+ z-index: 10;
651
+ }
652
+
653
+ /* Specific elements positioning and styling */
654
+ /* Grouped common properties */
655
+ .hindi-name,
656
+ .english-name,
657
+ .dob-text,
658
+ .gender-text {
659
+ left: 3px;
660
+ /* Relative to name-section */
661
+ font-size: 8px;
662
+ }
663
+
664
+ .address-hi-label,
665
+ .address-en-label,
666
+ .address-en-text {
667
+ left: 0px;
668
+ /* Relative to address-section */
669
+ }
670
+
671
+ .address-hi-label,
672
+ .address-en-label {
673
+ font-size: 8px;
674
+ }
675
+
676
+ .address-hi-text,
677
+ .address-en-text {
678
+ font-size: 7.65px;
679
+ width: 100%;
680
+ /* Automatically adjust to the container's width */
681
+ max-width: 190px;
682
+ /* Ensures it doesn't exceed the parent width */
683
+ white-space: normal;
684
+ word-wrap: break-word;
685
+ }
686
+
687
+ .aadhar-no-middle,
688
+ .aadhar-no-bottom,
689
+ .aadhar-no-top {
690
+ font-weight: bold;
691
+ font-size: 15px;
692
+ letter-spacing: 0px;
693
+ font-family: 'AadhaarDigits', Arial, sans-serif;
694
+ }
695
+
696
+ /* Individual properties */
697
+ .enrolment-no {
698
+ top: 0px;
699
+ /* Relative to inrol-section */
700
+ left: 0px;
701
+ /* Relative to inrol-section */
702
+ letter-spacing: -0.px;
703
+ font-size: 12px;
704
+ font-family: 'AadhaarDigits', 'AadhaarHindi', 'AadhaarEnglish', Arial, sans-serif;
705
+ white-space: nowrap !important;
706
+ }
707
+
708
+ .inrol-date {
709
+ position: absolute;
710
+ transform: rotate(-90deg);
711
+ transform-origin: center center;
712
+ font-size: 6.98px;
713
+ left: -65px;
714
+ top: 159px;
715
+ /* Relative to inrol-section */
716
+ letter-spacing: 0px;
717
+ }
718
+
719
+ .download-date {
720
+ position: absolute;
721
+ transform: rotate(-90deg);
722
+ transform-origin: center center;
723
+ font-size: 6.98px;
724
+ left: -47px;
725
+ top: 50px;
726
+ /* Relative to inrol-section */
727
+ letter-spacing: 0px;
728
+ }
729
+
730
+ .hindi-name,
731
+ .address-hi-label,
732
+ .address-hi-text,
733
+ .gender-text {
734
+ font-family: 'AadhaarHindi', 'Mangal', 'Nirmala UI', Arial, sans-serif;
735
+ font-weight: 400;
736
+ -webkit-font-smoothing: antialiased;
737
+ -moz-osx-font-smoothing: grayscale;
738
+ text-rendering: geometricPrecision;
739
+ font-feature-settings: 'kern' 1, 'liga' 1;
740
+ font-variant-ligatures: common-ligatures;
741
+ }
742
+
743
+ .hindi-name {
744
+ top: 0px;
745
+ /* Relative to name-section */
746
+ letter-spacing: 0px;
747
+ }
748
+
749
+ .english-name {
750
+ top: 13px;
751
+ /* Relative to name-section */
752
+ letter-spacing: 0.2px;
753
+ }
754
+
755
+ .dob-text {
756
+ top: 26px;
757
+ /* Relative to name-section */
758
+ font-family: 'AadhaarDigits', 'AadhaarHindi', 'AadhaarEnglish', Arial, sans-serif;
759
+ }
760
+
761
+ .gender-text {
762
+ top: 40px;
763
+ /* Relative to name-section */
764
+ }
765
+
766
+ .aadhar-no-top {
767
+ position: absolute;
768
+ z-index: 10;
769
+ font-weight: 100;
770
+ top: 738px;
771
+ /* This one seems independent, but if you want it in left-panel, move it. Keeping it global for now based on HTML structure */
772
+ left: 140px;
773
+ font-size: 18px;
774
+ letter-spacing: -0.3px;
775
+ color: black;
776
+
777
+ }
778
+
779
+ .address-hi-label {
780
+ top: 3px;
781
+ }
782
+
783
+ .address-hi-text {
784
+ top: 10.5px;
785
+ /* Relative to address-section */
786
+ line-height: 1.06;
787
+ letter-spacing: 0.05px;
788
+ }
789
+
790
+ .address-en-label {
791
+ top: 42px;
792
+ /* Relative to address-section */
793
+ }
794
+
795
+ .address-en-text {
796
+ top: 50px;
797
+ /* Relative to address-section */
798
+ line-height: 1.09;
799
+ letter-spacing: 0.3px;
800
+ }
801
+
802
+ .aadhar-no-middle {
803
+ letter-spacing: -0.15px;
804
+ top: 258px;
805
+ /* Relative to left-panel */
806
+ left: 78px;
807
+ /* Relative to left-panel */
808
+
809
+ }
810
+
811
+ .aadhar-no-bottom {
812
+ position: absolute;
813
+ letter-spacing: -0.15px;
814
+ width: 119px;
815
+ top: 149px;
816
+ /* Relative to address-section */
817
+ left: 98px;
818
+ /* Relative to address-section */
819
+
820
+ }
821
+
822
+ /* Fixed Image */
823
+ .fixed-image {
824
+ position: absolute;
825
+ z-index: 10;
826
+ object-fit: cover;
827
+ top: 120px;
828
+ /* Relative to left-panel */
829
+ left: 0px;
830
+ /* Relative to left-panel */
831
+ width: 69px;
832
+ height: 83px;
833
+ }
834
+
835
+ /* Reference Overlay for Alignment */
836
+ .ref-layer {
837
+ display: none !important;
838
+ }
839
+
840
+ /* Premium Popup Styles */
841
+ .popup-overlay {
842
+ position: fixed;
843
+ top: 0;
844
+ left: 0;
845
+ width: 100%;
846
+ height: 100%;
847
+ background: rgba(0, 0, 0, 0.5);
848
+ backdrop-filter: blur(4px);
849
+ display: flex;
850
+ justify-content: center;
851
+ align-items: center;
852
+ z-index: 9999;
853
+ opacity: 0;
854
+ visibility: hidden;
855
+ transition: all 0.3s ease;
856
+ }
857
+
858
+ .popup-overlay.active {
859
+ opacity: 1;
860
+ visibility: visible;
861
+ }
862
+
863
+ .popup-content {
864
+ background: var(--card-bg);
865
+ width: 90%;
866
+ max-width: 400px;
867
+ border-radius: 20px;
868
+ padding: 35px;
869
+ text-align: center;
870
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
871
+ transform: translateY(20px) scale(0.95);
872
+ transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
873
+ border: 1px solid var(--border-color);
874
+ }
875
+
876
+ .popup-overlay.active .popup-content {
877
+ transform: translateY(0) scale(1);
878
+ }
879
+
880
+ .popup-icon svg.spinner-animation {
881
+ animation: popup-spin 1.5s linear infinite;
882
+ }
883
+
884
+ @keyframes popup-spin {
885
+ from {
886
+ transform: rotate(0deg);
887
+ }
888
+
889
+ to {
890
+ transform: rotate(360deg);
891
+ }
892
+ }
893
+
894
+ .popup-icon {
895
+ width: 70px;
896
+ height: 70px;
897
+ background: var(--border-color);
898
+ color: var(--accent-color);
899
+ border-radius: 50%;
900
+ display: flex;
901
+ justify-content: center;
902
+ align-items: center;
903
+ margin: 0 auto 20px;
904
+ box-shadow: 0 0 0 10px rgba(0, 123, 255, 0.05);
905
+ }
906
+
907
+ .popup-title {
908
+ font-family: 'Poppins', sans-serif;
909
+ font-size: 24px;
910
+ font-weight: 700;
911
+ color: var(--text-color);
912
+ margin-bottom: 12px;
913
+ }
914
+
915
+ .popup-message {
916
+ font-family: 'Poppins', sans-serif;
917
+ font-size: 15px;
918
+ color: var(--label-color);
919
+ margin-bottom: 30px;
920
+ line-height: 1.6;
921
+ }
922
+
923
+ .popup-btn {
924
+ background: #ff4757;
925
+ color: white;
926
+ border: none;
927
+ padding: 12px 30px;
928
+ border-radius: 8px;
929
+ font-size: 16px;
930
+ font-weight: 500;
931
+ font-family: 'Poppins', sans-serif;
932
+ cursor: pointer;
933
+ transition: all 0.2s ease;
934
+ width: 100%;
935
+ box-shadow: 0 4px 10px rgba(255, 71, 87, 0.3);
936
+ }
937
+
938
+ .popup-btn:hover {
939
+ background: #ff6b81;
940
+ transform: translateY(-2px);
941
+ box-shadow: 0 6px 15px rgba(255, 71, 87, 0.4);
942
+ }
943
+
944
+ .popup-btn:active {
945
+ transform: translateY(0);
946
+ }
947
+
948
+ /* .hindi-name,
949
+ .english-name,
950
+ .dob-text,
951
+ .gender-text,
952
+ #out-inroltext,
953
+ .address-section,
954
+ .address-en-label,
955
+ .address-en-text ,
956
+ .address-hi-label,
957
+ .address-hi-text{
958
+ font-size:9px
959
+ } */
960
+
961
+ @media print {
962
+ @page {
963
+ size: A4;
964
+ margin: 0;
965
+ }
966
+
967
+
968
+ body {
969
+ margin: 0;
970
+ padding: 0;
971
+ background-color: white !important;
972
+ color: black !important;
973
+ -webkit-print-color-adjust: exact !important;
974
+ print-color-adjust: exact !important;
975
+ height: 297mm !important;
976
+ overflow: hidden !important;
977
+ }
978
+
979
+ /* Force all text elements to black in print */
980
+ .text-element,
981
+ .inroltext,
982
+ .signature,
983
+ .signature-text,
984
+ .inrol-date,
985
+ .download-date,
986
+ .enrolment-no,
987
+ .hindi-name,
988
+ .english-name,
989
+ .dob-text,
990
+ .gender-text,
991
+ .address-hi-label,
992
+ .address-hi-text,
993
+ .address-en-label,
994
+ .address-en-text,
995
+ .aadhar-no-top,
996
+ .aadhar-no-middle,
997
+ .aadhar-no-bottom {
998
+ color: black !important;
999
+ }
1000
+
1001
+ /* Hindi font smoothing in print */
1002
+ .hindi-name,
1003
+ .address-hi-label,
1004
+ .address-hi-text,
1005
+ .gender-text {
1006
+ font-family: 'AadhaarHindi', 'Noto Sans Devanagari', 'Mangal', 'Nirmala UI', Arial, sans-serif !important;
1007
+ font-weight: 400 !important;
1008
+ font-style: normal !important;
1009
+ -webkit-font-smoothing: antialiased !important;
1010
+ -moz-osx-font-smoothing: grayscale !important;
1011
+ text-rendering: geometricPrecision !important;
1012
+ font-smooth: always !important;
1013
+ font-feature-settings: 'kern' 1, 'liga' 1 !important;
1014
+ font-variant-ligatures: common-ligatures !important;
1015
+ shape-rendering: geometricPrecision !important;
1016
+ }
1017
+
1018
+ .download-date {
1019
+
1020
+ left: -50px !important;
1021
+
1022
+ }
1023
+
1024
+ .left-panel,
1025
+ .address-section,
1026
+ .qr-code-image,
1027
+ .qr-code-image-2,
1028
+ .signature-section,
1029
+ .inrol-section,
1030
+ .aadhar-no-top,
1031
+ .aadhar-no-bottom,
1032
+ .aadhar-no-middle {
1033
+ margin-left: -15px;
1034
+ }
1035
+
1036
+
1037
+ .app-container {
1038
+ display: flex !important;
1039
+ height: 297mm !important;
1040
+ max-height: 297mm !important;
1041
+ overflow: hidden !important;
1042
+ justify-content: center !important;
1043
+ align-items: flex-start !important;
1044
+ padding: 0 !important;
1045
+ box-sizing: border-box !important;
1046
+ }
1047
+
1048
+ .sidebar-form {
1049
+ display: none !important;
1050
+ }
1051
+
1052
+ .preview-area {
1053
+ display: flex !important;
1054
+ margin-left: 0 !important;
1055
+ height: 297mm !important;
1056
+ max-height: 297mm !important;
1057
+ overflow: hidden !important;
1058
+ }
1059
+
1060
+ .workspace {
1061
+ position: relative !important;
1062
+ width: 210mm !important;
1063
+ height: 297mm !important;
1064
+ max-height: 297mm !important;
1065
+ background-color: white !important;
1066
+ box-shadow: none !important;
1067
+ overflow: hidden !important;
1068
+ transform: none !important;
1069
+ margin: 0 !important;
1070
+ top: auto !important;
1071
+ left: auto !important;
1072
+ page-break-after: avoid !important;
1073
+ page-break-inside: avoid !important;
1074
+ }
1075
+
1076
+ .popup-overlay {
1077
+ display: none !important;
1078
+ }
1079
+
1080
+ .print-button {
1081
+ display: none;
1082
+ }
1083
+
1084
+ .ref-layer {
1085
+ display: none !important;
1086
+ }
1087
+ }
1088
+
1089
+ .popup-overlay.active,
1090
+ #history-modal.active {
1091
+ display: flex !important;
1092
+ }
1093
+
1094
+ /* History Item Styles */
1095
+ .history-item {
1096
+ display: flex;
1097
+ justify-content: space-between;
1098
+ align-items: center;
1099
+ padding: 15px;
1100
+ border: 1px solid var(--border-color);
1101
+ border-radius: 8px;
1102
+ margin-bottom: 10px;
1103
+ background: var(--input-bg);
1104
+ gap: 15px;
1105
+ }
1106
+
1107
+ .history-actions {
1108
+ display: flex;
1109
+ gap: 10px;
1110
+ flex-shrink: 0;
1111
+ }
1112
+
1113
+ @media (max-width: 500px) {
1114
+ .history-item {
1115
+ flex-direction: column;
1116
+ align-items: stretch;
1117
+ text-align: center;
1118
+ }
1119
+
1120
+ .history-actions {
1121
+ justify-content: center;
1122
+ flex-wrap: wrap;
1123
+ }
1124
+ }
1125
+
1126
+ .history-details {
1127
+ flex: 1;
1128
+ }
1129
+
1130
+ .history-details h4 {
1131
+ margin: 0 0 5px 0;
1132
+ color: var(--text-color);
1133
+ }
1134
+
1135
+ .history-details p {
1136
+ margin: 0;
1137
+ font-size: 12px;
1138
+ color: var(--label-color);
1139
+ }
1140
+
1141
+ .history-actions {
1142
+ display: flex;
1143
+ gap: 10px;
1144
+ }
1145
+
1146
+ .btn-history {
1147
+ padding: 6px 12px;
1148
+ border: none;
1149
+ border-radius: 8px;
1150
+ cursor: pointer;
1151
+ font-size: 13px;
1152
+ font-weight: 500;
1153
+ transition: all 0.2s;
1154
+ display: flex;
1155
+ align-items: center;
1156
+ gap: 6px;
1157
+ }
1158
+
1159
+ .btn-preview {
1160
+ background: var(--primary-gradient);
1161
+ color: white;
1162
+ }
1163
+
1164
+ .btn-print-hist {
1165
+ background: #10b981; /* High-contrast green */
1166
+ color: white !important;
1167
+ }
1168
+
1169
+ .btn-delete {
1170
+ background: #ef4444; /* High-contrast red */
1171
+ color: white !important;
1172
+ }
1173
+
1174
+ .btn-history:hover {
1175
+ filter: brightness(1.1);
1176
+ transform: translateY(-1px);
1177
+ }
1178
+
1179
+ /* History Modal Responsive Styles */
1180
+ .history-popup-content {
1181
+ max-width: 600px;
1182
+ width: min(600px, 95%);
1183
+ max-height: 85vh;
1184
+ overflow-y: auto;
1185
+ overflow-x: hidden;
1186
+ background: var(--glass-bg);
1187
+ backdrop-filter: blur(24px);
1188
+ -webkit-backdrop-filter: blur(24px);
1189
+ border: 1px solid var(--glass-border);
1190
+ border-radius: 20px;
1191
+ padding: 24px;
1192
+ box-shadow: var(--glass-shadow);
1193
+ color: var(--text-color);
1194
+ position: relative;
1195
+ box-sizing: border-box;
1196
+ }
1197
+
1198
+ .history-modal-header {
1199
+ display: flex;
1200
+ justify-content: space-between;
1201
+ align-items: center;
1202
+ border-bottom: 1px solid var(--glass-border);
1203
+ padding-bottom: 15px;
1204
+ margin-bottom: 20px;
1205
+ }
1206
+
1207
+ .history-modal-header h3 {
1208
+ margin: 0;
1209
+ font-size: 1.25rem;
1210
+ background: var(--primary-gradient);
1211
+ -webkit-background-clip: text;
1212
+ background-clip: text;
1213
+ -webkit-text-fill-color: transparent;
1214
+ }
1215
+
1216
+ .close-modal-btn {
1217
+ background: transparent;
1218
+ border: none;
1219
+ font-size: 28px;
1220
+ cursor: pointer;
1221
+ color: var(--text-muted);
1222
+ transition: all 0.2s;
1223
+ line-height: 1;
1224
+ padding: 5px;
1225
+ }
1226
+
1227
+ .close-modal-btn:hover {
1228
+ color: var(--text-color);
1229
+ transform: scale(1.1);
1230
+ }
1231
+
1232
+ @media screen and (max-width: 600px) {
1233
+ .popup-overlay {
1234
+ padding: 0;
1235
+ align-items: stretch;
1236
+ justify-content: stretch;
1237
+ }
1238
+
1239
+ .history-popup-content {
1240
+ padding: 20px 12px;
1241
+ width: 100% !important;
1242
+ height: 100vh;
1243
+ max-height: 100vh;
1244
+ border-radius: 0;
1245
+ border: none;
1246
+ max-width: none;
1247
+ }
1248
+
1249
+ .history-item {
1250
+ flex-direction: column;
1251
+ align-items: flex-start;
1252
+ padding: 14px;
1253
+ gap: 12px;
1254
+ width: 100%;
1255
+ box-sizing: border-box;
1256
+ }
1257
+
1258
+ .history-details {
1259
+ width: 100%;
1260
+ overflow-wrap: break-word;
1261
+ word-break: break-word;
1262
+ }
1263
+
1264
+ .history-details p {
1265
+ font-size: 13px;
1266
+ }
1267
+
1268
+ .history-actions {
1269
+ width: 100%;
1270
+ display: grid;
1271
+ grid-template-columns: 1fr 1fr;
1272
+ gap: 8px;
1273
+ }
1274
+
1275
+ .btn-history {
1276
+ padding: 12px 10px;
1277
+ text-align: center;
1278
+ justify-content: center;
1279
+ font-size: 14px;
1280
+ }
1281
+
1282
+ .btn-delete {
1283
+ grid-column: span 2;
1284
+ }
1285
+ }
1286
+
1287
+ /* Responsive Fixes for Mobile - Robust version */
1288
+ @media screen and (max-width: 768px) {
1289
+ .app-container {
1290
+ padding: 15px 5px !important;
1291
+ }
1292
+
1293
+ .sidebar-form {
1294
+ padding: 15px !important;
1295
+ border-radius: 8px !important;
1296
+ width: 100% !important;
1297
+ max-width: 100% !important;
1298
+ }
1299
+
1300
+ .form-row {
1301
+ flex-direction: column !important;
1302
+ gap: 0 !important;
1303
+ }
1304
+
1305
+ .form-row .form-group {
1306
+ width: 100% !important;
1307
+ flex: none !important;
1308
+ margin-bottom: 20px !important;
1309
+ }
1310
+
1311
+ /* Stack name and other En/Hi pairs that use inline flex */
1312
+ .form-group>div[style*="display:flex"],
1313
+ .form-group>div[style*="display: flex"] {
1314
+ flex-direction: column !important;
1315
+ gap: 8px !important;
1316
+ }
1317
+
1318
+ .form-group>div[style*="display:flex"]>input,
1319
+ .form-group>div[style*="display: flex"]>input {
1320
+ width: 100% !important;
1321
+ }
1322
+
1323
+ /* Keep Gender radio buttons side-by-side but allows wrap if needed */
1324
+ .form-group div[style*="gap:15px"] {
1325
+ flex-direction: row !important;
1326
+ flex-wrap: wrap !important;
1327
+ gap: 15px !important;
1328
+ }
1329
+
1330
+ .btn-print {
1331
+ font-size: 16px !important;
1332
+ padding: 15px 12px !important;
1333
+ }
1334
+ }
theme-init.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ // Theme initialization to prevent flash
2
+ (function() {
3
+ const savedTheme = localStorage.getItem('theme');
4
+ if (savedTheme !== 'light') {
5
+ document.documentElement.classList.add('dark-theme');
6
+ }
7
+ })();