nova64 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +786 -0
  3. package/index.html +651 -0
  4. package/package.json +255 -0
  5. package/public/os9-shell/assets/index-B1Uvacma.js +32825 -0
  6. package/public/os9-shell/assets/index-B1Uvacma.js.map +1 -0
  7. package/public/os9-shell/assets/index-DIHfrTaW.css +1 -0
  8. package/public/os9-shell/index.html +14 -0
  9. package/public/os9-shell/nova-icon.svg +12 -0
  10. package/runtime/api-2d.js +878 -0
  11. package/runtime/api-3d/camera.js +73 -0
  12. package/runtime/api-3d/instancing.js +180 -0
  13. package/runtime/api-3d/lights.js +51 -0
  14. package/runtime/api-3d/materials.js +47 -0
  15. package/runtime/api-3d/models.js +84 -0
  16. package/runtime/api-3d/pbr.js +69 -0
  17. package/runtime/api-3d/primitives.js +304 -0
  18. package/runtime/api-3d/scene.js +169 -0
  19. package/runtime/api-3d/transforms.js +161 -0
  20. package/runtime/api-3d.js +154 -0
  21. package/runtime/api-effects.js +753 -0
  22. package/runtime/api-presets.js +85 -0
  23. package/runtime/api-skybox.js +178 -0
  24. package/runtime/api-sprites.js +100 -0
  25. package/runtime/api-voxel.js +601 -0
  26. package/runtime/api.js +201 -0
  27. package/runtime/assets.js +27 -0
  28. package/runtime/audio.js +114 -0
  29. package/runtime/collision.js +47 -0
  30. package/runtime/console.js +101 -0
  31. package/runtime/editor.js +233 -0
  32. package/runtime/font.js +233 -0
  33. package/runtime/framebuffer.js +28 -0
  34. package/runtime/fullscreen-button.js +185 -0
  35. package/runtime/gpu-canvas2d.js +47 -0
  36. package/runtime/gpu-threejs.js +639 -0
  37. package/runtime/gpu-webgl2.js +310 -0
  38. package/runtime/index.js +22 -0
  39. package/runtime/input.js +225 -0
  40. package/runtime/logger.js +60 -0
  41. package/runtime/physics.js +101 -0
  42. package/runtime/screens.js +213 -0
  43. package/runtime/storage.js +38 -0
  44. package/runtime/store.js +151 -0
  45. package/runtime/textinput.js +68 -0
  46. package/runtime/ui/buttons.js +124 -0
  47. package/runtime/ui/panels.js +105 -0
  48. package/runtime/ui/text.js +86 -0
  49. package/runtime/ui/widgets.js +141 -0
  50. package/runtime/ui.js +111 -0
  51. package/src/main.js +474 -0
  52. package/vite.config.js +63 -0
@@ -0,0 +1 @@
1
+ :root{--gnome-dark: #1c1c1c;--gnome-darker: #141414;--gnome-panel: #2c2c2c;--gnome-bg: #242424;--gnome-card: #303030;--gnome-hover: #383838;--gnome-active: #404040;--gnome-border: #3c3c3c;--gnome-blue: #3584e4;--gnome-blue-hover: #4a9af5;--gnome-blue-dark: #1c71d8;--gnome-blue-light: #78aeed;--gnome-text: #ffffff;--gnome-text-secondary: #c0c0c0;--gnome-text-disabled: #6e6e6e;--window-title-active: linear-gradient(to bottom, #2c2c2c 0%, #242424 100%);--window-title-inactive: #2c2c2c;--window-border: #1c1c1c;--window-border-light: #3c3c3c;--window-content-bg: #242424;--window-shadow: 0 20px 60px rgba(0, 0, 0, .8), 0 0 0 1px rgba(255, 255, 255, .05), 0 0 100px rgba(53, 132, 228, .1);--menu-bg: #2c2c2c;--menu-border: #1c1c1c;--menu-highlight: #3584e4;--menu-text: #ffffff;--menu-text-disabled: #6e6e6e;--desktop-bg: linear-gradient(135deg, #0a0e27 0%, #16213e 20%, #1a2645 40%, #0f3460 60%, #16213e 80%, #0a0e27 100%);--desktop-pattern: radial-gradient(circle at 20% 20%, rgba(255, 0, 255, .15) 0%, transparent 30%), radial-gradient(circle at 80% 30%, rgba(0, 255, 255, .12) 0%, transparent 35%), radial-gradient(circle at 50% 80%, rgba(138, 43, 226, .15) 0%, transparent 40%), radial-gradient(circle at 15% 75%, rgba(0, 191, 255, .1) 0%, transparent 35%), radial-gradient(circle at 85% 85%, rgba(255, 20, 147, .12) 0%, transparent 30%), repeating-linear-gradient(0deg, transparent, transparent 49px, rgba(0, 255, 255, .03) 49px, rgba(0, 255, 255, .03) 50px), repeating-linear-gradient(90deg, transparent, transparent 49px, rgba(255, 0, 255, .03) 49px, rgba(255, 0, 255, .03) 50px), radial-gradient(circle at center, rgba(53, 132, 228, .08) 0%, transparent 60%);--desktop-animated-bg: radial-gradient(circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(0, 255, 255, .05) 0%, transparent 50%);--scroll-bg: #2c2c2c;--scroll-track: #242424;--scroll-thumb: #505050;--scroll-thumb-hover: #606060;--button-bg: #303030;--button-border: #3c3c3c;--button-hover: #383838;--button-active: #3584e4;--button-text: #ffffff;--font-system: "Cantarell", "Ubuntu", "Inter", "Segoe UI", system-ui, -apple-system, sans-serif;--font-size-system: 13px;--font-size-menu: 13px;--font-size-title: 13px;--font-size-large: 16px;--font-size-small: 11px;--spacing-xs: 2px;--spacing-sm: 4px;--spacing-md: 8px;--spacing-lg: 12px;--spacing-xl: 16px;--z-desktop: 0;--z-window-base: 100;--z-menu: 9000;--z-menubar: 10000;--z-modal: 15000;--z-control-strip: 8000;--transition-fast: .1s;--transition-normal: .2s;--transition-slow: .3s}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{width:100%;height:100%;overflow:hidden}body{font-family:var(--font-system);font-size:var(--font-size-system);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;cursor:default;-webkit-user-select:none;user-select:none;background:var(--gnome-dark);color:var(--gnome-text)}.desktop{position:fixed;top:28px;left:0;right:0;bottom:0;background:var(--desktop-bg);background-image:var(--desktop-pattern);z-index:var(--z-desktop);overflow:hidden;animation:desktopFadeIn .8s ease-out,gradientShift 20s ease-in-out infinite}@keyframes desktopFadeIn{0%{opacity:0;transform:scale(1.02);filter:blur(10px)}to{opacity:1;transform:scale(1);filter:blur(0)}}@keyframes gradientShift{0%,to{background-position:0% 50%}50%{background-position:100% 50%}}.desktop:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:radial-gradient(circle at 20% 80%,rgba(255,0,255,.1) 0%,transparent 25%),radial-gradient(circle at 80% 20%,rgba(0,255,255,.1) 0%,transparent 25%),radial-gradient(circle at 40% 40%,rgba(138,43,226,.08) 0%,transparent 30%);animation:particleFloat 15s ease-in-out infinite;pointer-events:none}@keyframes particleFloat{0%,to{transform:translate(0) scale(1);opacity:.6}33%{transform:translate(30px,-30px) scale(1.1);opacity:.8}66%{transform:translate(-20px,20px) scale(.9);opacity:.7}}.desktop-icon{position:absolute;width:80px;text-align:center;cursor:pointer;padding:8px;border-radius:12px;transition:all .2s cubic-bezier(.4,0,.2,1)}.desktop-icon:hover{background-color:#3584e426;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transform:translateY(-2px)}.desktop-icon.selected{background-color:#3584e44d;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:0 0 0 2px #3584e480}.desktop-icon-image{width:48px;height:48px;margin:0 auto 8px;font-size:48px;line-height:48px;filter:drop-shadow(0 2px 4px rgba(0,0,0,.5))}.desktop-icon-label{font-size:12px;color:var(--gnome-text);text-shadow:0 1px 3px rgba(0,0,0,.8);word-wrap:break-word;line-height:1.3;font-weight:500}.window{position:absolute;display:flex;flex-direction:column;background-color:var(--window-content-bg);border:1px solid var(--window-border);border-radius:12px;box-shadow:var(--window-shadow);min-width:200px;min-height:100px;overflow:hidden;animation:windowSlideIn .2s cubic-bezier(.4,0,.2,1)}@keyframes windowSlideIn{0%{opacity:0;transform:scale(.95) translateY(-10px)}to{opacity:1;transform:scale(1) translateY(0)}}.window.active .window-title{background:var(--window-title-active)}.window-title{height:40px;background:var(--window-title-inactive);display:flex;align-items:center;justify-content:space-between;padding:0 12px;cursor:move;position:relative;border-bottom:1px solid var(--window-border-light)}.window-title-text{flex:1;text-align:center;font-size:var(--font-size-title);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 20px;color:var(--gnome-text)}.window-controls{display:flex;gap:8px;position:absolute;right:12px}.window-button{width:24px;height:24px;border-radius:50%;background:var(--gnome-card);border:1px solid var(--gnome-border);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;line-height:1;color:var(--gnome-text-secondary);transition:all .15s ease}.window-button:hover{background:var(--gnome-hover);transform:scale(1.1)}.window-button:active{background:var(--gnome-active);transform:scale(.95)}.window-close:hover{background:#e74c3c;color:#fff}.window-zoom{position:absolute;right:44px}.window-zoom:hover{background:var(--gnome-blue);color:#fff}.window-content{flex:1;background:var(--window-content-bg);overflow:auto;position:relative;color:var(--gnome-text)}.window-resize-handle{position:absolute;bottom:2px;right:2px;width:16px;height:16px;cursor:nwse-resize;opacity:.3;transition:opacity .2s}.window-resize-handle:hover{opacity:.6}.window.shaded .window-content,.window.shaded .window-resize-handle{display:none}.menubar{position:fixed;top:0;left:0;right:0;height:28px;background:var(--gnome-panel);border-bottom:1px solid var(--gnome-dark);display:flex;align-items:center;z-index:var(--z-menubar);font-size:var(--font-size-menu);box-shadow:0 2px 8px #0006;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.menubar-left{display:flex;align-items:stretch;flex:1}.menubar-right{display:flex;align-items:center;gap:8px;padding:0 8px}.menu-item{padding:0 16px;height:28px;display:flex;align-items:center;cursor:pointer;position:relative;color:var(--gnome-text);border-radius:6px;margin:0 2px;transition:all .15s ease;font-weight:500}.menu-item:hover,.menu-item.active{background:var(--gnome-hover)}.menu-logo{font-size:16px;padding:0 12px;font-weight:600;color:var(--gnome-text)}.menu-dropdown{position:absolute;top:100%;left:0;min-width:220px;background:var(--gnome-panel);border:1px solid var(--gnome-border);border-radius:8px;box-shadow:0 4px 16px #0009;z-index:var(--z-menu);margin-top:4px;overflow:hidden;animation:menuSlideIn .15s ease-out}@keyframes menuSlideIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.menu-dropdown-item{padding:10px 20px;cursor:pointer;display:flex;align-items:center;justify-content:space-between;position:relative;color:var(--gnome-text);transition:background .1s ease}.menu-dropdown-item:hover:not(.disabled){background:var(--gnome-blue)}.menu-dropdown-item.disabled{color:var(--gnome-text-disabled);cursor:default;opacity:.5}.menu-dropdown-item.separator{height:1px;background:var(--gnome-border);margin:6px 12px;padding:0;cursor:default}.menu-dropdown-item.separator:hover{background:var(--gnome-border)}.menu-accelerator{font-size:var(--font-size-small);margin-left:20px;opacity:.7;color:var(--gnome-text-secondary)}.menu-checkmark{position:absolute;left:6px}.control-strip{position:fixed;bottom:0;left:0;right:0;height:30px;background:var(--platinum-gray);border-top:1px solid var(--window-border);display:flex;align-items:center;padding:0 8px;gap:12px;z-index:var(--z-control-strip);transition:transform var(--transition-normal)}.control-strip.collapsed{transform:translateY(100%)}.control-strip-toggle{width:16px;height:16px;border:1px solid var(--platinum-black);background:var(--button-bg);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:10px}.control-strip-item{display:flex;align-items:center;gap:4px;cursor:pointer;padding:2px 6px}.control-strip-item:hover{background:var(--platinum-gray-light)}.control-strip-icon{font-size:16px;line-height:1}.control-strip-label{font-size:11px}.button{padding:4px 16px;background:var(--button-bg);border:none;border-top:1px solid var(--button-border-top);border-left:1px solid var(--button-border-top);border-right:1px solid var(--button-border-bottom);border-bottom:1px solid var(--button-border-bottom);cursor:pointer;font-family:var(--font-system);font-size:var(--font-size-system);min-width:70px}.button:hover{background:var(--platinum-gray-light)}.button:active,.button.pressed{background:var(--button-pressed-bg);border-top:1px solid var(--button-border-bottom);border-left:1px solid var(--button-border-bottom);border-right:1px solid var(--button-border-top);border-bottom:1px solid var(--button-border-top)}.button.default{border:2px solid var(--platinum-black);font-weight:700}.button:disabled{color:var(--menu-text-disabled);cursor:default}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#0000004d;display:flex;align-items:center;justify-content:center;z-index:var(--z-modal)}.alert-dialog{background:var(--platinum-gray);border:2px solid var(--window-border);box-shadow:4px 4px 8px #00000080;min-width:300px;max-width:500px;padding:16px}.alert-content{display:flex;gap:16px;margin-bottom:16px}.alert-icon{font-size:32px;line-height:1}.alert-text{flex:1}.alert-title{font-weight:700;margin-bottom:8px}.alert-message{line-height:1.4}.alert-buttons{display:flex;gap:8px;justify-content:flex-end}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--scroll-track)}::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:6px;border:2px solid var(--scroll-track)}::-webkit-scrollbar-thumb:hover{background:var(--scroll-thumb-hover)}.activities-button{padding:0 20px;height:28px;background:transparent;border:none;color:var(--gnome-text);font-family:var(--font-system);font-size:var(--font-size-menu);font-weight:600;cursor:pointer;border-radius:6px;margin:0 4px;transition:all .15s ease}.activities-button:hover{background:var(--gnome-hover)}.activities-button:active{background:var(--gnome-active)}.app-launcher-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000d9;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:var(--z-modal);display:flex;align-items:center;justify-content:center;animation:overlayFadeIn .2s ease-out}@keyframes overlayFadeIn{0%{opacity:0}to{opacity:1}}.app-launcher{background:var(--gnome-panel);border-radius:16px;box-shadow:0 16px 48px #000c;width:90%;max-width:800px;max-height:80vh;display:flex;flex-direction:column;animation:launcherSlideIn .3s cubic-bezier(.4,0,.2,1)}@keyframes launcherSlideIn{0%{opacity:0;transform:scale(.9) translateY(20px)}to{opacity:1;transform:scale(1) translateY(0)}}.app-launcher-header{padding:24px;border-bottom:1px solid var(--gnome-border)}.app-launcher-search{width:100%;padding:12px 16px;background:var(--gnome-card);border:2px solid var(--gnome-border);border-radius:8px;color:var(--gnome-text);font-family:var(--font-system);font-size:var(--font-size-large);outline:none;transition:border-color .2s ease}.app-launcher-search:focus{border-color:var(--gnome-blue);box-shadow:0 0 0 3px #3584e433}.app-launcher-search::placeholder{color:var(--gnome-text-disabled)}.app-launcher-content{flex:1;overflow-y:auto;padding:24px}.app-launcher-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:20px}.app-launcher-item{display:flex;flex-direction:column;align-items:center;padding:20px;border-radius:12px;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);background:var(--gnome-card);border:2px solid transparent}.app-launcher-item:hover{background:var(--gnome-hover);border-color:var(--gnome-blue);transform:translateY(-4px);box-shadow:0 8px 20px #3584e44d}.app-launcher-item:active{transform:translateY(-2px)}.app-launcher-icon{font-size:64px;margin-bottom:12px;filter:drop-shadow(0 4px 8px rgba(0,0,0,.5))}.app-launcher-name{font-size:var(--font-size-system);font-weight:600;color:var(--gnome-text);text-align:center;margin-bottom:4px}.app-launcher-description{font-size:var(--font-size-small);color:var(--gnome-text-secondary);text-align:center;line-height:1.3}.app-launcher-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;color:var(--gnome-text-secondary)}.app-launcher-footer{padding:16px 24px;border-top:1px solid var(--gnome-border);display:flex;justify-content:flex-end}.app-launcher-close{padding:10px 24px;background:var(--gnome-blue);border:none;border-radius:6px;color:#fff;font-family:var(--font-system);font-size:var(--font-size-system);font-weight:600;cursor:pointer;transition:all .15s ease}.app-launcher-close:hover{background:var(--gnome-blue-hover);transform:translateY(-1px);box-shadow:0 4px 12px #3584e466}.app-launcher-close:active{transform:translateY(0)}.dragging{opacity:.7;cursor:move!important}.no-select{-webkit-user-select:none;user-select:none}.scanlines:before{content:"";position:fixed;top:0;left:0;right:0;bottom:0;background:repeating-linear-gradient(to bottom,transparent 0px,transparent 1px,rgba(0,0,0,.1) 1px,rgba(0,0,0,.1) 2px);pointer-events:none;z-index:20000}.fps-counter{position:fixed;top:24px;right:8px;background:#000000b3;color:var(--platinum-white);padding:4px 8px;font-size:11px;font-family:monospace;z-index:19000;border-radius:2px}*:focus-visible{outline:1px dotted var(--platinum-black);outline-offset:2px}button:focus-visible{outline:2px solid var(--platinum-blue);outline-offset:1px}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-10px)}}@keyframes pulse{0%,to{opacity:.5}50%{opacity:1}}@keyframes slideIn{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-5px)}20%,40%,60%,80%{transform:translate(5px)}}@keyframes glow{0%,to{box-shadow:0 0 5px #0066ff80}50%{box-shadow:0 0 20px #06fc}}.tok-comment{color:#6a9955;font-style:italic}.tok-string{color:#ce9178}.tok-number{color:#b5cea8}.tok-keyword{color:#569cd6;font-weight:500}
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="./nova-icon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>nova64 OS</title>
8
+ <script type="module" crossorigin src="./assets/index-B1Uvacma.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-DIHfrTaW.css">
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ </body>
14
+ </html>
@@ -0,0 +1,12 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <linearGradient id="starGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#FFD700;stop-opacity:1" />
5
+ <stop offset="100%" style="stop-color:#FFA500;stop-opacity:1" />
6
+ </linearGradient>
7
+ </defs>
8
+ <circle cx="32" cy="32" r="30" fill="#008080" stroke="#CCCCCC" stroke-width="2"/>
9
+ <polygon points="32,12 36,26 50,26 38,35 42,49 32,40 22,49 26,35 14,26 28,26"
10
+ fill="url(#starGrad)" stroke="#CC8800" stroke-width="1"/>
11
+ <text x="32" y="58" font-family="Arial, sans-serif" font-size="8" fill="#FFFFFF" text-anchor="middle">nova64</text>
12
+ </svg>