{
"$schema": "../schemas/code-crispies-module-schema.json",
"id": "html-dialog",
"title": "Native Dialog Element",
"description": "Create modal dialogs without JavaScript libraries",
"mode": "html",
"difficulty": "beginner",
"lessons": [
{
"id": "dialog-basic",
"title": "Open Dialog",
"description": "The <dialog> element creates a native modal. Add the open attribute to show it.
Use <form method=\"dialog\"> inside to close it when the form submits - no JavaScript needed!",
"task": "Create a dialog with: 1. The open attribute to show it 2. An <h2> saying 'Welcome!' 3. A <p> with a greeting message 4. A <form method=\"dialog\"> with a close button",
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; min-height: 200px; background: #f5f5f5; } dialog { border: none; border-radius: 12px; box-shadow: 0 10px 40px rgba(0,0,0,0.2); padding: 25px; max-width: 400px; } dialog::backdrop { background: rgba(0,0,0,0.5); } dialog h2 { margin: 0 0 15px 0; color: #1976d2; } dialog p { color: #666; margin: 0 0 20px 0; } dialog button { background: #1976d2; color: white; border: none; padding: 10px 25px; border-radius: 6px; cursor: pointer; font-size: 16px; } dialog button:hover { background: #1565c0; }",
"sandboxCSS": "",
"initialCode": "",
"solution": "",
"previewContainer": "preview-area",
"validations": [
{
"type": "element_exists",
"value": "dialog",
"message": "Add a <dialog> element"
},
{
"type": "attribute_value",
"value": { "selector": "dialog", "attr": "open", "value": true },
"message": "Add the open attribute to show the dialog"
},
{
"type": "element_exists",
"value": "dialog h2",
"message": "Add an <h2> heading inside the dialog"
},
{
"type": "element_exists",
"value": "form[method='dialog']",
"message": "Add a <form method=\"dialog\"> for closing"
},
{
"type": "element_exists",
"value": "dialog button",
"message": "Add a close button inside the form"
}
]
},
{
"id": "dialog-form",
"title": "Dialog with Form",
"description": "Dialogs can contain full forms. The method=\"dialog\" makes the form close the dialog on submit instead of sending data.
This pattern is perfect for confirmation dialogs, quick inputs, or settings panels.",
"task": "Create a confirmation dialog: 1. Add open to show it 2. An <h2> saying 'Confirm Delete' 3. A <p> asking 'Are you sure?' 4. A <form method=\"dialog\"> with Cancel and Delete buttons",
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; min-height: 200px; background: linear-gradient(135deg, #fce4ec 0%, #f8bbd9 100%); } dialog { border: none; border-radius: 12px; box-shadow: 0 10px 40px rgba(0,0,0,0.2); padding: 25px; max-width: 350px; text-align: center; } dialog h2 { margin: 0 0 10px 0; color: #c62828; } dialog p { color: #666; margin: 0 0 20px 0; } dialog form { display: flex; gap: 10px; justify-content: center; } dialog button { padding: 10px 20px; border-radius: 6px; cursor: pointer; font-size: 14px; border: none; } dialog button:first-child { background: #e0e0e0; color: #333; } dialog button:last-child { background: #c62828; color: white; } dialog button:hover { opacity: 0.9; }",
"sandboxCSS": "",
"initialCode": "",
"solution": "",
"previewContainer": "preview-area",
"validations": [
{
"type": "element_exists",
"value": "dialog[open]",
"message": "Add a <dialog> with the open attribute"
},
{
"type": "element_exists",
"value": "dialog h2",
"message": "Add a heading to the dialog"
},
{
"type": "element_exists",
"value": "form[method='dialog']",
"message": "Add a <form method=\"dialog\"> for the buttons"
},
{
"type": "element_count",
"value": { "selector": "dialog button", "min": 2 },
"message": "Add at least 2 buttons (Cancel and Confirm)"
}
]
}
]
}