bimifc-bevy 0.3.0

Bevy-based 3D viewer for IFC models with WebGPU/WebGL2 rendering
Documentation
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IFC-Lite Viewer</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        html, body { width: 100%; height: 100%; overflow: hidden; background: #1a1a1a; }
        #bevy-canvas { width: 100%; height: 100%; display: block; }
        #loading {
            position: fixed; top: 0; left: 0; width: 100%; height: 100%;
            background: #1a1a1a; display: flex; flex-direction: column;
            justify-content: center; align-items: center; color: #fff;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
            z-index: 1000;
        }
        #loading.hidden { display: none; }
        .spinner {
            width: 40px; height: 40px; border: 3px solid #333;
            border-top-color: #4a9eff; border-radius: 50%;
            animation: spin 1s linear infinite; margin-bottom: 16px;
        }
        @keyframes spin { to { transform: rotate(360deg); } }
        .loading-text { font-size: 14px; color: #888; }
    </style>
</head>
<body>
    <div id="loading">
        <div class="spinner"></div>
        <div class="loading-text">Loading IFC-Lite Viewer...</div>
    </div>
    <canvas id="bevy-canvas"></canvas>
    <script type="module">
        import init, { run_on_canvas } from './pkg/ifc_lite_bevy.js';
        async function start() {
            try {
                await init();
                document.getElementById('loading').classList.add('hidden');
                run_on_canvas('#bevy-canvas');
            } catch (e) {
                console.error('Failed to load:', e);
                document.querySelector('.loading-text').textContent = 'Failed: ' + e.message;
            }
        }
        start();
    </script>
</body>
</html>