<div class="container">
<h1>User Registration Form</h1>
<p class="subtitle">Fill out the form and save data as JSON</p>
<form id="userForm">
<div class="form-group">
<label for="fullName">Full Name *</label>
<input type="text" id="fullName" name="fullName" required>
</div>
<div class="form-group">
<label for="email">Email Address *</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="phone">Phone Number</label>
<input type="tel" id="phone" name="phone">
</div>
<div class="form-group">
<label for="country">Country *</label>
<select id="country" name="country" required>
<option value="">Select Country</option>
<option value="USA">United States</option>
<option value="UK">United Kingdom</option>
<option value="Canada">Canada</option>
<option value="Pakistan">Pakistan</option>
<option value="India">India</option>
<option value="Australia">Australia</option>
<option value="Germany">Germany</option>
<option value="France">France</option>
</select>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message"></textarea>
</div>
<div class="button-group">
<button type="submit" class="button">Save to JSON</button>
<button type="button" class="button button-secondary" id="downloadBtn">Download JSON</button>
</div>
</form>
<div class="success-message" id="successMessage">
✓ Form data saved successfully!
</div>
<div class="json-display" id="jsonDisplay">
<div class="json-header">
<span class="json-label">JSON Output</span>
<button class="copy-json-btn" id="copyJsonBtn">Copy JSON</button>
</div>
<pre id="jsonOutput"></pre>
</div>
<div class="saved-entries" id="savedEntries">
<div class="entries-header">
<h2 class="entries-title">Saved Entries</h2>
<button class="button button-secondary" id="clearBtn" style="flex: none; padding: 8px 16px; font-size: 14px;">Clear All</button>
</div>
<div id="entriesList">
<div class="no-entries">No entries saved yet</div>
</div>
</div>
</div>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 50%, #7e8ba3 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
}
.container {
background: white;
border-radius: 16px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
padding: 40px;
max-width: 600px;
width: 100%;
}
h1 {
font-size: 28px;
color: #1e3c72;
margin-bottom: 8px;
font-weight: 600;
}
.subtitle {
color: #666;
font-size: 14px;
margin-bottom: 32px;
}
.form-group {
margin-bottom: 24px;
}
label {
display: block;
font-size: 14px;
font-weight: 500;
color: #333;
margin-bottom: 8px;
}
input, select, textarea {
width: 100%;
padding: 12px 16px;
font-size: 15px;
border: 2px solid #e0e0e0;
border-radius: 8px;
transition: all 0.3s ease;
font-family: inherit;
}
input:focus, select:focus, textarea:focus {
outline: none;
border-color: #1e3c72;
box-shadow: 0 0 0 3px rgba(30, 60, 114, 0.1);
}
textarea {
resize: vertical;
min-height: 100px;
}
.button-group {
display: flex;
gap: 12px;
margin-top: 32px;
}
.button {
flex: 1;
padding: 14px 24px;
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
}
.button:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(30, 60, 114, 0.3);
}
.button:active {
transform: translateY(0);
}
.button-secondary {
background: linear-gradient(135deg, #6c757d 0%, #868e96 100%);
}
.json-display {
margin-top: 32px;
padding: 24px;
background: #1e1e1e;
border-radius: 12px;
display: none;
}
.json-display.active {
display: block;
}
.json-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.json-label {
color: #00d4ff;
font-size: 14px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.copy-json-btn {
padding: 6px 12px;
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
color: white;
border: none;
border-radius: 6px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s;
}
.copy-json-btn:hover {
background: linear-gradient(135deg, #2a5298 0%, #1e3c72 100%);
}
.copy-json-btn.copied {
background: linear-gradient(135deg, #00c853 0%, #00e676 100%);
}
pre {
margin: 0;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 13px;
line-height: 1.6;
color: #d4d4d4;
overflow-x: auto;
}
.success-message {
margin-top: 16px;
padding: 16px;
background: linear-gradient(135deg, #00c853 0%, #00e676 100%);
color: white;
border-radius: 8px;
text-align: center;
font-weight: 500;
display: none;
}
.success-message.active {
display: block;
animation: slideIn 0.3s ease;
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.saved-entries {
margin-top: 32px;
}
.entries-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.entries-title {
font-size: 18px;
font-weight: 600;
color: #1e3c72;
}
.entry-card {
padding: 16px;
background: #f8f9fa;
border-radius: 8px;
margin-bottom: 12px;
border-left: 4px solid #1e3c72;
}
.entry-row {
display: flex;
margin-bottom: 8px;
}
.entry-label {
font-weight: 600;
color: #333;
min-width: 100px;
}
.entry-value {
color: #666;
}
.no-entries {
text-align: center;
padding: 40px;
color: #999;
font-style: italic;
}
let savedData = [];
const form = document.getElementById('userForm');
const jsonDisplay = document.getElementById('jsonDisplay');
const jsonOutput = document.getElementById('jsonOutput');
const successMessage = document.getElementById('successMessage');
const copyJsonBtn = document.getElementById('copyJsonBtn');
const downloadBtn = document.getElementById('downloadBtn');
const clearBtn = document.getElementById('clearBtn');
const entriesList = document.getElementById('entriesList');
function formToJSON(formElement) {
const formData = new FormData(formElement);
const jsonObject = {};
formData.forEach((value, key) => {
jsonObject[key] = value;
});
jsonObject.timestamp = new Date().toISOString();
jsonObject.id = Date.now();
return jsonObject;
}
function displayJSON(data) {
const jsonString = JSON.stringify(data, null, 2);
jsonOutput.textContent = jsonString;
jsonDisplay.classList.add('active');
}
function showSuccessMessage() {
successMessage.classList.add('active');
setTimeout(() => {
successMessage.classList.remove('active');
}, 3000);
}
function updateEntriesList() {
if (savedData.length === 0) {
entriesList.innerHTML = '<div class="no-entries">No entries saved yet</div>';
return;
}
entriesList.innerHTML = savedData.map(entry => `
<div class="entry-card">
<div class="entry-row">
<span class="entry-label">Name:</span>
<span class="entry-value">${entry.fullName}</span>
</div>
<div class="entry-row">
<span class="entry-label">Email:</span>
<span class="entry-value">${entry.email}</span>
</div>
<div class="entry-row">
<span class="entry-label">Country:</span>
<span class="entry-value">${entry.country}</span>
</div>
<div class="entry-row">
<span class="entry-label">Saved:</span>
<span class="entry-value">${new Date(entry.timestamp).toLocaleString()}</span>
</div>
</div>
`).join('');
}
form.addEventListener('submit', (e) => {
e.preventDefault();
const jsonData = formToJSON(form);
savedData.push(jsonData);
displayJSON(jsonData);
showSuccessMessage();
updateEntriesList();
form.reset();
});
copyJsonBtn.addEventListener('click', async () => {
try {
await navigator.clipboard.writeText(jsonOutput.textContent);
copyJsonBtn.textContent = 'Copied!';
copyJsonBtn.classList.add('copied');
setTimeout(() => {
copyJsonBtn.textContent = 'Copy JSON';
copyJsonBtn.classList.remove('copied');
}, 2000);
} catch (err) {
console.error('Failed to copy:', err);
}
});
downloadBtn.addEventListener('click', () => {
if (savedData.length === 0) {
alert('No data to download. Please submit the form first.');
return;
}
const dataToDownload = savedData.length === 1 ? savedData[0] : savedData;
const jsonString = JSON.stringify(dataToDownload, null, 2);
const blob = new Blob([jsonString], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `form-data-${Date.now()}.json`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
});
clearBtn.addEventListener('click', () => {
if (confirm('Are you sure you want to clear all saved entries?')) {
savedData = [];
updateEntriesList();
jsonDisplay.classList.remove('active');
}
});
No comments yet. Be the first!