demystify-web 0.1.4

A web front end to demystify, a constraint solving tool for explaining puzzles
Documentation
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Demystify Puzzle Solver</title>
    <link href="/ext/bootstrap.min.css" rel="stylesheet">
    <link href="/base/base.css" rel="stylesheet">
    <script src="/ext/htmx.js"></script>
    <script src="/ext/bootstrap.bundle.min.js"></script>
    <script src="/ext/response-targets.js"></script>
    <script src="/base/base.js"></script>
    <script>
    window.addEventListener('load', function() {
        htmx.onLoad(x => {doJavascript()});
    });
    </script>

</head>
<body class="container mt-4">

        <div id="puzzleControls" class="mb-3" style="display: none;">
        <div class="btn-group">
            <button class="btn btn-outline-primary" hx-post="/refresh" hx-target="#mainSpace" hx-indicator="#indicator">
                Refresh
            </button>
            <button class="btn btn-outline-primary" hx-post="/bestNextStep" hx-target="#mainSpace" hx-indicator="#indicator">
                Best Next Step
            </button>
            <button class="btn btn-outline-primary" hx-post="/getDifficulties" hx-target="#mainSpace" hx-indicator="#indicator">
                Get Difficulties
            </button>
        </div>
    </div>

    <div id="mainSpace" class="card">
        <div class="card-body">
            <div class="text-center text-muted">
                <p>Please upload a puzzle or select an example to begin.</p>
            </div>
        </div>
    </div>

    <div class="my-4"></div>

    <div class="row mb-4">
        <div class="col-md-6">
            <div class="card">
                <div class="card-header">
                    <h4>Upload Puzzle</h4>
                </div>
                <div class="card-body">
                    <form id="uploadForm" hx-post="/uploadPuzzle" hx-encoding="multipart/form-data" hx-target="#mainSpace">
                        <div class="row">
                            <div class="col-md-6">
                                <label for="model" class="form-label">Model File (.eprime/.essence)</label>
                                <input type="file" class="form-control" id="model" name="model" accept=".eprime,.essence" required>
                            </div>
                            <div class="col-md-6">
                                <label for="parameter" class="form-label">Parameter File (.param/.json)</label>
                                <input type="file" class="form-control" id="parameter" name="parameter" accept=".param,.json" required>
                            </div>
                        </div>
                        <button type="submit" class="btn btn-primary mt-3" hx-indicator="#indicator">
                            Upload and Solve
                        </button>
                    </form>
                </div>
            </div>
        </div>
        <div class="col-md-6">
            <div class="card">
                <div class="card-header">
                    <h4>Load Example</h4>
                </div>
                <div class="card-body">
                    <div hx-get="/getExampleNames" hx-trigger="load" hx-swap="outerHTML"></div>
                    <div id="exampleParams" class="mt-3"></div>
                </div>
            </div>
        </div>
    </div>

    <div id="indicator" class="htmx-indicator text-center my-4">
        <div class="spinner-border text-primary" role="status">
            <span class="visually-hidden">Loading...</span>
        </div>
    </div>

    <script>
        document.body.addEventListener('htmx:afterSwap', function(evt) {
            // Show controls if we get puzzle content
            if (evt.detail.target.id === 'mainSpace' && 
                !evt.detail.target.innerHTML.includes('Please upload')) {
                document.getElementById('puzzleControls').style.display = 'block';
            }
        });
    </script>
</body>
</html>