nova64 0.2.5 → 0.2.6

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 (140) hide show
  1. package/README.md +25 -8
  2. package/bin/nova64.js +165 -0
  3. package/dist/assets/console-CY_kygm3.js +14 -0
  4. package/dist/assets/console-CY_kygm3.js.map +1 -0
  5. package/dist/assets/main-l0sNRNKZ.js.map +1 -0
  6. package/dist/assets/sky/studio/nx.png +0 -0
  7. package/dist/assets/sky/studio/ny.png +0 -0
  8. package/dist/assets/sky/studio/nz.png +0 -0
  9. package/dist/assets/sky/studio/px.png +0 -0
  10. package/dist/assets/sky/studio/py.png +0 -0
  11. package/dist/assets/sky/studio/pz.png +0 -0
  12. package/dist/assets/vanilla-Dcuy32gi.js +2 -0
  13. package/dist/assets/vanilla-Dcuy32gi.js.map +1 -0
  14. package/dist/console.html +899 -0
  15. package/dist/docs/BENCHMARK.md +77 -0
  16. package/dist/docs/CHEATSHEET.md +255 -0
  17. package/dist/docs/EFFECTS_API_GUIDE.md +577 -0
  18. package/dist/docs/EFFECTS_QUICK_REFERENCE.md +331 -0
  19. package/dist/docs/FONT_CHARACTER_REFERENCE.md +219 -0
  20. package/dist/docs/FREE_GLB_ASSETS.md +330 -0
  21. package/dist/docs/FULLSCREEN_BUTTON_FEATURE.md +296 -0
  22. package/dist/docs/GAMEPAD_SUPPORT.md +348 -0
  23. package/dist/docs/GAME_IMPROVEMENTS.md +278 -0
  24. package/dist/docs/GAME_QUALITY_STATUS.md +300 -0
  25. package/dist/docs/MIGRATION_GUIDE.md +553 -0
  26. package/dist/docs/NOVA64_3D_API.md +356 -0
  27. package/dist/docs/NOVA64_API_REFERENCE.md +1406 -0
  28. package/dist/docs/NOVA64_UI_API.md +503 -0
  29. package/dist/docs/UI_SYSTEM_SUMMARY.md +445 -0
  30. package/dist/docs/VOXEL_ENGINE_GUIDE.md +662 -0
  31. package/dist/docs/VOXEL_QUICK_REFERENCE.md +386 -0
  32. package/dist/docs/api-3d.html +750 -0
  33. package/dist/docs/api-effects.html +385 -0
  34. package/dist/docs/api-improvements.md +121 -0
  35. package/dist/docs/api-skybox.html +407 -0
  36. package/dist/docs/api-sprites.html +321 -0
  37. package/dist/docs/api-voxel.html +337 -0
  38. package/dist/docs/api.html +543 -0
  39. package/dist/docs/assets.html +306 -0
  40. package/dist/docs/audio.html +340 -0
  41. package/dist/docs/blogs.html +286 -0
  42. package/dist/docs/collision.html +316 -0
  43. package/dist/docs/console.html +247 -0
  44. package/dist/docs/editor.html +297 -0
  45. package/dist/docs/font.html +247 -0
  46. package/dist/docs/framebuffer.html +247 -0
  47. package/dist/docs/fullscreen-button.html +297 -0
  48. package/dist/docs/gpu-systems.html +247 -0
  49. package/dist/docs/index.html +580 -0
  50. package/dist/docs/input.html +491 -0
  51. package/dist/docs/physics.html +311 -0
  52. package/dist/docs/screens.html +311 -0
  53. package/dist/docs/storage.html +311 -0
  54. package/dist/docs/textinput.html +332 -0
  55. package/dist/docs/ui.html +488 -0
  56. package/dist/examples/3d-advanced/code.js +695 -0
  57. package/dist/examples/adventure-comic-3d/code.js +342 -0
  58. package/dist/examples/audio-lab/code.js +150 -0
  59. package/dist/examples/boids-flocking/code.js +270 -0
  60. package/dist/examples/crystal-cathedral-3d/code.js +706 -0
  61. package/dist/examples/cyberpunk-city-3d/code.js +1383 -0
  62. package/dist/examples/demoscene/README.md +192 -0
  63. package/dist/examples/demoscene/code.js +1081 -0
  64. package/dist/examples/demoscene/meta.json +21 -0
  65. package/dist/examples/dungeon-crawler-3d/code.js +1117 -0
  66. package/dist/examples/f-zero-nova-3d/code.js +865 -0
  67. package/dist/examples/f-zero-nova-3d/code_old.js +1555 -0
  68. package/dist/examples/fps-demo-3d/code.js +744 -0
  69. package/dist/examples/game-of-life-3d/code.js +338 -0
  70. package/dist/examples/generative-art/code.js +632 -0
  71. package/dist/examples/hello-3d/code.js +325 -0
  72. package/dist/examples/hello-skybox/code.js +183 -0
  73. package/dist/examples/hello-world/code.js +19 -0
  74. package/dist/examples/input-showcase/code.js +109 -0
  75. package/dist/examples/instancing-demo/code.js +315 -0
  76. package/dist/examples/minecraft-demo/code.js +387 -0
  77. package/dist/examples/model-viewer-3d/code.js +114 -0
  78. package/dist/examples/mystical-realm-3d/code.js +1203 -0
  79. package/dist/examples/nature-explorer-3d/code.js +1318 -0
  80. package/dist/examples/particles-demo/code.js +522 -0
  81. package/dist/examples/pbr-showcase/code.js +140 -0
  82. package/dist/examples/physics-demo-3d/code.js +948 -0
  83. package/dist/examples/screen-demo/code.js +267 -0
  84. package/dist/examples/shooter-demo-3d/code.js +1286 -0
  85. package/dist/examples/space-combat-3d/IMPLEMENTATION_SUMMARY.md +109 -0
  86. package/dist/examples/space-combat-3d/README.md +135 -0
  87. package/dist/examples/space-combat-3d/code.js +1332 -0
  88. package/dist/examples/space-harrier-3d/code.js +923 -0
  89. package/dist/examples/star-fox-nova-3d/code.js +1116 -0
  90. package/dist/examples/star-fox-nova-3d/code_backup.js +410 -0
  91. package/dist/examples/star-fox-nova-3d/code_broken.js +1821 -0
  92. package/dist/examples/storage-quest/code.js +209 -0
  93. package/dist/examples/strider-demo-3d/IMPROVEMENT_OPTIONS.md +285 -0
  94. package/dist/examples/strider-demo-3d/cache-test.html +132 -0
  95. package/dist/examples/strider-demo-3d/code-fixed.js +582 -0
  96. package/dist/examples/strider-demo-3d/code-old.js +1537 -0
  97. package/dist/examples/strider-demo-3d/code.js +1462 -0
  98. package/dist/examples/strider-demo-3d/code.js.bak2 +1169 -0
  99. package/dist/examples/strider-demo-3d/fix-game.sh +53 -0
  100. package/dist/examples/super-plumber-64/README.md +128 -0
  101. package/dist/examples/super-plumber-64/code.js +1185 -0
  102. package/dist/examples/super-plumber-64/index.html +88 -0
  103. package/dist/examples/test-2d-overlay/code.js +32 -0
  104. package/dist/examples/test-font/code.js +51 -0
  105. package/dist/examples/test-minimal/code.js +21 -0
  106. package/dist/examples/ui-demo/code.js +306 -0
  107. package/dist/examples/wing-commander-space/README.md +180 -0
  108. package/dist/examples/wing-commander-space/code.js +1285 -0
  109. package/dist/examples/wizardry-3d/CHANGELOG.md +366 -0
  110. package/dist/examples/wizardry-3d/code.js +3928 -0
  111. package/dist/index.html +666 -0
  112. package/dist/os9-shell/assets/index-DIHfrTaW.css +1 -0
  113. package/dist/os9-shell/assets/index-KchE_ngx.js +483 -0
  114. package/dist/os9-shell/assets/index-KchE_ngx.js.map +1 -0
  115. package/dist/os9-shell/index.html +23 -0
  116. package/dist/os9-shell/nova-icon.svg +12 -0
  117. package/index.html +6 -1
  118. package/package.json +37 -32
  119. package/public/assets/sky/studio/nx.png +0 -0
  120. package/public/assets/sky/studio/ny.png +0 -0
  121. package/public/assets/sky/studio/nz.png +0 -0
  122. package/public/assets/sky/studio/px.png +0 -0
  123. package/public/assets/sky/studio/py.png +0 -0
  124. package/public/assets/sky/studio/pz.png +0 -0
  125. package/public/os9-shell/assets/index-KchE_ngx.js +483 -0
  126. package/public/os9-shell/assets/index-KchE_ngx.js.map +1 -0
  127. package/public/os9-shell/index.html +10 -1
  128. package/runtime/api-2d.js +301 -21
  129. package/runtime/api-3d/pbr.js +45 -1
  130. package/runtime/api-3d.js +1 -0
  131. package/runtime/api-effects.js +90 -3
  132. package/runtime/api-gameutils.js +476 -0
  133. package/runtime/api-generative.js +610 -0
  134. package/runtime/api-skybox.js +54 -0
  135. package/runtime/api-voxel.js +139 -28
  136. package/runtime/gpu-threejs.js +13 -9
  137. package/runtime/ui.js +2 -2
  138. package/src/main.js +20 -0
  139. package/public/os9-shell/assets/index-B1Uvacma.js +0 -32825
  140. package/public/os9-shell/assets/index-B1Uvacma.js.map +0 -1
@@ -0,0 +1,488 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>UI System - Nova64 Documentation</title>
7
+ <style>
8
+ :root {
9
+ --bg-primary: #0f1115; --bg-secondary: #151822; --bg-tertiary: #1a1d2e;
10
+ --text-primary: #dcdfe4; --text-secondary: #99a1b3;
11
+ --accent-cyan: #00ffff; --accent-magenta: #ff0080; --accent-yellow: #ffff00;
12
+ --border: #2a324a; --code-bg: #1a1d2e;
13
+ }
14
+ * { margin: 0; padding: 0; box-sizing: border-box; }
15
+ body {
16
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
17
+ background: linear-gradient(135deg, var(--bg-primary) 0%, #1a1625 50%, var(--bg-primary) 100%);
18
+ background-attachment: fixed; color: var(--text-primary); line-height: 1.6;
19
+ }
20
+ .container { max-width: 1200px; margin: 0 auto; padding: 20px; }
21
+ header {
22
+ background: var(--bg-secondary); border: 2px solid var(--accent-cyan);
23
+ border-radius: 12px; padding: 30px; margin-bottom: 30px;
24
+ box-shadow: 0 0 30px rgba(0, 255, 255, 0.3);
25
+ }
26
+ h1 {
27
+ color: var(--accent-cyan); font-size: 2.5em;
28
+ text-shadow: 0 0 20px rgba(0, 255, 255, 0.6); margin-bottom: 10px;
29
+ }
30
+ .back-link {
31
+ display: inline-block; color: var(--accent-cyan); text-decoration: none;
32
+ margin-bottom: 15px; transition: color 0.3s ease;
33
+ }
34
+ .back-link:hover { color: #33ffff; text-decoration: underline; }
35
+ .subtitle { color: var(--text-secondary); font-size: 1.1em; }
36
+ section {
37
+ background: var(--bg-secondary); border-left: 4px solid var(--accent-cyan);
38
+ padding: 25px; margin-bottom: 30px; border-radius: 8px;
39
+ }
40
+ h2 {
41
+ color: var(--accent-magenta); font-size: 2em; margin-bottom: 15px;
42
+ text-shadow: 0 0 10px rgba(255, 0, 128, 0.5);
43
+ }
44
+ h3 { color: var(--accent-cyan); font-size: 1.4em; margin: 25px 0 15px 0; }
45
+ .function {
46
+ background: var(--bg-tertiary); border: 1px solid var(--border);
47
+ border-radius: 8px; padding: 20px; margin-bottom: 25px;
48
+ }
49
+ .function-sig {
50
+ font-family: 'Courier New', Courier, monospace; font-size: 1.2em;
51
+ color: var(--accent-yellow); margin-bottom: 15px; padding: 10px;
52
+ background: var(--code-bg); border-radius: 4px; border-left: 3px solid var(--accent-yellow);
53
+ }
54
+ .param-list, .return-info { margin: 15px 0; }
55
+ .param { padding: 8px 0; border-bottom: 1px solid var(--border); }
56
+ .param:last-child { border-bottom: none; }
57
+ .param-name {
58
+ color: var(--accent-cyan); font-weight: bold;
59
+ font-family: 'Courier New', Courier, monospace;
60
+ }
61
+ .param-type { color: var(--accent-magenta); font-style: italic; font-size: 0.9em; }
62
+ .example {
63
+ background: var(--code-bg); border: 1px solid var(--border);
64
+ border-radius: 8px; padding: 20px; margin: 15px 0; overflow-x: auto;
65
+ }
66
+ .example-title { color: var(--accent-yellow); font-weight: bold; margin-bottom: 10px; }
67
+ pre { margin: 0; font-family: 'Courier New', Courier, monospace; line-height: 1.5; }
68
+ code { color: var(--text-primary); }
69
+ .keyword { color: #ff79c6; }
70
+ .function-name { color: #50fa7b; }
71
+ .number { color: #f1fa8c; }
72
+ .string { color: #f1fa8c; }
73
+ .comment { color: #6272a4; font-style: italic; }
74
+ .note {
75
+ background: var(--bg-tertiary); border-left: 4px solid var(--accent-yellow);
76
+ padding: 15px; margin: 15px 0; border-radius: 4px;
77
+ }
78
+ .note-title { color: var(--accent-yellow); font-weight: bold; margin-bottom: 10px; }
79
+ table { width: 100%; border-collapse: collapse; margin: 15px 0; }
80
+ th, td { padding: 12px; text-align: left; border: 1px solid var(--border); }
81
+ th { background: var(--bg-tertiary); color: var(--accent-cyan); font-weight: bold; }
82
+ tr:nth-child(even) { background: var(--bg-tertiary); }
83
+ footer {
84
+ text-align: center; padding: 30px 20px; color: var(--text-secondary);
85
+ border-top: 1px solid var(--border); margin-top: 40px;
86
+ }
87
+ </style>
88
+ </head>
89
+ <body>
90
+ <div class="container">
91
+ <a href="index.html" class="back-link">← Back to Documentation Index</a>
92
+
93
+ <header>
94
+ <h1>🖼️ UI System</h1>
95
+ <p class="subtitle">Professional UI components: buttons, panels, text rendering, and layout helpers</p>
96
+ </header>
97
+
98
+ <section>
99
+ <h2>📋 Overview</h2>
100
+ <p>The UI System provides high-level components for building game interfaces. It includes interactive buttons with callbacks, decorative panels, advanced text rendering with shadows/outlines, progress bars, and layout utilities.</p>
101
+
102
+ <div class="note">
103
+ <div class="note-title">💡 Key Features</div>
104
+ <ul>
105
+ <li><strong>Button System</strong> - Interactive buttons with hover/press states and callbacks</li>
106
+ <li><strong>Panel System</strong> - Decorative windows with borders, gradients, and titles</li>
107
+ <li><strong>Text Rendering</strong> - Shadows, outlines, alignment, and font sizes</li>
108
+ <li><strong>Progress Bars</strong> - Health bars, loading indicators, etc.</li>
109
+ <li><strong>Layout Helpers</strong> - Centering, grid systems, responsive design</li>
110
+ </ul>
111
+ </div>
112
+ </section>
113
+
114
+ <section>
115
+ <h2>🔘 Button System</h2>
116
+
117
+ <div class="function">
118
+ <div class="function-sig">createButton(x, y, width, height, text, callback, options = {})</div>
119
+ <p>Creates an interactive button with hover effects and click callback.</p>
120
+
121
+ <div class="param-list">
122
+ <div class="param">
123
+ <span class="param-name">x, y</span> <span class="param-type">number</span> - Button position
124
+ </div>
125
+ <div class="param">
126
+ <span class="param-name">width, height</span> <span class="param-type">number</span> - Button size
127
+ </div>
128
+ <div class="param">
129
+ <span class="param-name">text</span> <span class="param-type">string</span> - Button label
130
+ </div>
131
+ <div class="param">
132
+ <span class="param-name">callback</span> <span class="param-type">function</span> - Called when button clicked
133
+ </div>
134
+ <div class="param">
135
+ <span class="param-name">options</span> <span class="param-type">object</span> - Optional: normalColor, hoverColor, textColor, enabled, visible, etc.
136
+ </div>
137
+ </div>
138
+
139
+ <div class="return-info">
140
+ <strong>Returns:</strong> <span class="param-type">object</span> - Button object (store to modify later)
141
+ </div>
142
+
143
+ <div class="example">
144
+ <div class="example-title">Example: Menu buttons</div>
145
+ <pre><code><span class="keyword">const</span> startBtn = <span class="function-name">createButton</span>(<span class="number">220</span>, <span class="number">150</span>, <span class="number">200</span>, <span class="number">40</span>, <span class="string">"START GAME"</span>, () => {
146
+ gameState = <span class="string">'playing'</span>;
147
+ });
148
+
149
+ <span class="keyword">const</span> quitBtn = <span class="function-name">createButton</span>(<span class="number">220</span>, <span class="number">200</span>, <span class="number">200</span>, <span class="number">40</span>, <span class="string">"QUIT"</span>, () => {
150
+ <span class="comment">// Quit game</span>
151
+ }, {
152
+ normalColor: <span class="function-name">rgba8</span>(<span class="number">200</span>, <span class="number">50</span>, <span class="number">50</span>),
153
+ hoverColor: <span class="function-name">rgba8</span>(<span class="number">255</span>, <span class="number">80</span>, <span class="number">80</span>)
154
+ });</code></pre>
155
+ </div>
156
+ </div>
157
+
158
+ <div class="function">
159
+ <div class="function-sig">updateAllButtons()</div>
160
+ <p>Updates all button states (hover, click detection). Call in update() function.</p>
161
+
162
+ <div class="return-info">
163
+ <strong>Returns:</strong> <span class="param-type">boolean</span> - true if any button was clicked
164
+ </div>
165
+
166
+ <div class="example">
167
+ <div class="example-title">Example: Update loop</div>
168
+ <pre><code><span class="keyword">function</span> <span class="function-name">update</span>() {
169
+ <span class="function-name">updateAllButtons</span>(); <span class="comment">// Check button interactions</span>
170
+ }</code></pre>
171
+ </div>
172
+ </div>
173
+
174
+ <div class="function">
175
+ <div class="function-sig">drawAllButtons()</div>
176
+ <p>Renders all created buttons. Call in draw() function.</p>
177
+
178
+ <div class="example">
179
+ <div class="example-title">Example: Draw loop</div>
180
+ <pre><code><span class="keyword">function</span> <span class="function-name">draw</span>() {
181
+ <span class="function-name">cls</span>(<span class="function-name">rgba8</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">20</span>));
182
+ <span class="function-name">drawAllButtons</span>(); <span class="comment">// Render buttons</span>
183
+ }</code></pre>
184
+ </div>
185
+ </div>
186
+
187
+ <div class="function">
188
+ <div class="function-sig">clearButtons()</div>
189
+ <p>Removes all buttons (useful for screen transitions).</p>
190
+ </div>
191
+
192
+ <div class="function">
193
+ <div class="function-sig">removeButton(button)</div>
194
+ <p>Removes a specific button.</p>
195
+ </div>
196
+ </section>
197
+
198
+ <section>
199
+ <h2>📦 Panel System</h2>
200
+
201
+ <div class="function">
202
+ <div class="function-sig">createPanel(x, y, width, height, options = {})</div>
203
+ <p>Creates a decorative panel/window with borders, gradients, and optional title bar.</p>
204
+
205
+ <div class="param-list">
206
+ <div class="param">
207
+ <span class="param-name">x, y, width, height</span> <span class="param-type">number</span> - Panel position and size
208
+ </div>
209
+ <div class="param">
210
+ <span class="param-name">options</span> <span class="param-type">object</span> - bgColor, borderColor, borderWidth, title, shadow, gradient, etc.
211
+ </div>
212
+ </div>
213
+
214
+ <div class="return-info">
215
+ <strong>Returns:</strong> <span class="param-type">object</span> - Panel object
216
+ </div>
217
+
218
+ <div class="example">
219
+ <div class="example-title">Example: Info panel</div>
220
+ <pre><code><span class="keyword">const</span> infoPanel = <span class="function-name">createPanel</span>(<span class="number">50</span>, <span class="number">50</span>, <span class="number">300</span>, <span class="number">200</span>, {
221
+ title: <span class="string">"Game Info"</span>,
222
+ bgColor: <span class="function-name">rgba8</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">50</span>, <span class="number">200</span>),
223
+ borderColor: uiColors.primary,
224
+ borderWidth: <span class="number">3</span>,
225
+ shadow: <span class="keyword">true</span>,
226
+ gradient: <span class="keyword">true</span>
227
+ });</code></pre>
228
+ </div>
229
+ </div>
230
+
231
+ <div class="function">
232
+ <div class="function-sig">drawAllPanels()</div>
233
+ <p>Renders all panels. Call before drawing panel contents.</p>
234
+ </div>
235
+
236
+ <div class="function">
237
+ <div class="function-sig">clearPanels()</div>
238
+ <p>Removes all panels.</p>
239
+ </div>
240
+ </section>
241
+
242
+ <section>
243
+ <h2>✍️ Text Rendering</h2>
244
+
245
+ <div class="function">
246
+ <div class="function-sig">drawText(text, x, y, color = uiColors.white, scale = 1)</div>
247
+ <p>Draws text with current alignment and font settings.</p>
248
+
249
+ <div class="param-list">
250
+ <div class="param">
251
+ <span class="param-name">text</span> <span class="param-type">string</span> - Text to display
252
+ </div>
253
+ <div class="param">
254
+ <span class="param-name">x, y</span> <span class="param-type">number</span> - Position (affected by alignment)
255
+ </div>
256
+ <div class="param">
257
+ <span class="param-name">color</span> <span class="param-type">BigInt</span> - Text color
258
+ </div>
259
+ <div class="param">
260
+ <span class="param-name">scale</span> <span class="param-type">number</span> - Size multiplier
261
+ </div>
262
+ </div>
263
+
264
+ <div class="example">
265
+ <div class="example-title">Example: Centered title</div>
266
+ <pre><code><span class="function-name">setTextAlign</span>(<span class="string">'center'</span>);
267
+ <span class="function-name">setTextBaseline</span>(<span class="string">'middle'</span>);
268
+ <span class="function-name">drawText</span>(<span class="string">"MY GAME"</span>, <span class="number">320</span>, <span class="number">50</span>, uiColors.primary, <span class="number">3</span>);</code></pre>
269
+ </div>
270
+ </div>
271
+
272
+ <div class="function">
273
+ <div class="function-sig">drawTextShadow(text, x, y, color, shadowColor, offset = 2, scale = 1)</div>
274
+ <p>Draws text with drop shadow effect.</p>
275
+
276
+ <div class="example">
277
+ <div class="example-title">Example: Title with shadow</div>
278
+ <pre><code><span class="function-name">drawTextShadow</span>(<span class="string">"LEVEL 1"</span>, <span class="number">320</span>, <span class="number">100</span>,
279
+ uiColors.white, uiColors.black, <span class="number">3</span>, <span class="number">2</span>);</code></pre>
280
+ </div>
281
+ </div>
282
+
283
+ <div class="function">
284
+ <div class="function-sig">drawTextOutline(text, x, y, color, outlineColor, scale = 1)</div>
285
+ <p>Draws text with outline (8-direction) for visibility on any background.</p>
286
+
287
+ <div class="example">
288
+ <div class="example-title">Example: Outlined score</div>
289
+ <pre><code><span class="function-name">drawTextOutline</span>(<span class="string">"SCORE: "</span> + score, <span class="number">10</span>, <span class="number">10</span>,
290
+ uiColors.white, uiColors.black, <span class="number">1</span>);</code></pre>
291
+ </div>
292
+ </div>
293
+
294
+ <div class="function">
295
+ <div class="function-sig">setTextAlign(align)</div>
296
+ <p>Sets text horizontal alignment: "left", "center", or "right".</p>
297
+ </div>
298
+
299
+ <div class="function">
300
+ <div class="function-sig">setTextBaseline(baseline)</div>
301
+ <p>Sets text vertical alignment: "top", "middle", or "bottom".</p>
302
+ </div>
303
+
304
+ <div class="function">
305
+ <div class="function-sig">setFont(fontName)</div>
306
+ <p>Sets current font: "tiny", "small", "normal", "large", or "huge".</p>
307
+ </div>
308
+
309
+ <div class="function">
310
+ <div class="function-sig">measureText(text, scale = 1)</div>
311
+ <p>Calculates text dimensions.</p>
312
+
313
+ <div class="return-info">
314
+ <strong>Returns:</strong> <span class="param-type">object</span> - {width, height}
315
+ </div>
316
+ </div>
317
+ </section>
318
+
319
+ <section>
320
+ <h2>📊 Progress Bars</h2>
321
+
322
+ <div class="function">
323
+ <div class="function-sig">drawProgressBar(x, y, width, height, value, maxValue, options = {})</div>
324
+ <p>Draws a progress bar (health, loading, etc.).</p>
325
+
326
+ <div class="param-list">
327
+ <div class="param">
328
+ <span class="param-name">value</span> <span class="param-type">number</span> - Current value
329
+ </div>
330
+ <div class="param">
331
+ <span class="param-name">maxValue</span> <span class="param-type">number</span> - Maximum value
332
+ </div>
333
+ <div class="param">
334
+ <span class="param-name">options</span> <span class="param-type">object</span> - fillColor, bgColor, borderColor, showText
335
+ </div>
336
+ </div>
337
+
338
+ <div class="example">
339
+ <div class="example-title">Example: Health bar</div>
340
+ <pre><code><span class="function-name">drawProgressBar</span>(<span class="number">10</span>, <span class="number">10</span>, <span class="number">200</span>, <span class="number">20</span>, player.hp, player.maxHp, {
341
+ fillColor: uiColors.success,
342
+ bgColor: <span class="function-name">rgba8</span>(<span class="number">50</span>, <span class="number">0</span>, <span class="number">0</span>),
343
+ showText: <span class="keyword">true</span>
344
+ });</code></pre>
345
+ </div>
346
+ </div>
347
+ </section>
348
+
349
+ <section>
350
+ <h2>📐 Layout Helpers</h2>
351
+
352
+ <div class="function">
353
+ <div class="function-sig">centerX(width, screenWidth = 640)</div>
354
+ <p>Calculates X coordinate to center an element horizontally.</p>
355
+
356
+ <div class="return-info">
357
+ <strong>Returns:</strong> <span class="param-type">number</span> - Centered X position
358
+ </div>
359
+
360
+ <div class="example">
361
+ <div class="example-title">Example: Center button</div>
362
+ <pre><code><span class="keyword">const</span> btnX = <span class="function-name">centerX</span>(<span class="number">200</span>); <span class="comment">// Center 200px wide button</span>
363
+ <span class="function-name">createButton</span>(btnX, <span class="number">150</span>, <span class="number">200</span>, <span class="number">40</span>, <span class="string">"START"</span>, startGame);</code></pre>
364
+ </div>
365
+ </div>
366
+
367
+ <div class="function">
368
+ <div class="function-sig">centerY(height, screenHeight = 360)</div>
369
+ <p>Calculates Y coordinate to center an element vertically.</p>
370
+ </div>
371
+
372
+ <div class="function">
373
+ <div class="function-sig">grid(cols, rows, cellWidth, cellHeight, paddingX = 0, paddingY = 0)</div>
374
+ <p>Creates a grid layout array for positioning elements.</p>
375
+
376
+ <div class="return-info">
377
+ <strong>Returns:</strong> <span class="param-type">array</span> - Array of {x, y, width, height, col, row} objects
378
+ </div>
379
+
380
+ <div class="example">
381
+ <div class="example-title">Example: Button grid</div>
382
+ <pre><code><span class="keyword">const</span> cells = <span class="function-name">grid</span>(<span class="number">3</span>, <span class="number">2</span>, <span class="number">100</span>, <span class="number">50</span>, <span class="number">10</span>, <span class="number">10</span>);
383
+ cells.<span class="function-name">forEach</span>((cell, i) => {
384
+ <span class="function-name">createButton</span>(cell.x + <span class="number">50</span>, cell.y + <span class="number">100</span>,
385
+ cell.width, cell.height, <span class="string">`BTN </span><span class="keyword">${</span>i<span class="keyword">}</span><span class="string">`</span>, () => {});
386
+ });</code></pre>
387
+ </div>
388
+ </div>
389
+ </section>
390
+
391
+ <section>
392
+ <h2>🎨 Color Palette</h2>
393
+ <p>The UI system provides a built-in color palette accessible via <code>uiColors</code>:</p>
394
+
395
+ <table>
396
+ <thead>
397
+ <tr>
398
+ <th>Color Name</th>
399
+ <th>Value (RGB)</th>
400
+ <th>Usage</th>
401
+ </tr>
402
+ </thead>
403
+ <tbody>
404
+ <tr><td>uiColors.primary</td><td>rgba8(0, 120, 255)</td><td>Primary buttons, borders</td></tr>
405
+ <tr><td>uiColors.secondary</td><td>rgba8(100, 100, 255)</td><td>Secondary elements</td></tr>
406
+ <tr><td>uiColors.success</td><td>rgba8(0, 255, 100)</td><td>Health bars, positive</td></tr>
407
+ <tr><td>uiColors.warning</td><td>rgba8(255, 200, 0)</td><td>Warnings, caution</td></tr>
408
+ <tr><td>uiColors.danger</td><td>rgba8(255, 50, 50)</td><td>Errors, critical</td></tr>
409
+ <tr><td>uiColors.white</td><td>rgba8(255, 255, 255)</td><td>Text, highlights</td></tr>
410
+ <tr><td>uiColors.black</td><td>rgba8(0, 0, 0)</td><td>Shadows, backgrounds</td></tr>
411
+ </tbody>
412
+ </table>
413
+ </section>
414
+
415
+ <section>
416
+ <h2>💡 Complete Example</h2>
417
+
418
+ <div class="example">
419
+ <div class="example-title">Full UI System Example</div>
420
+ <pre><code><span class="keyword">let</span> gameState = <span class="string">'menu'</span>;
421
+ <span class="keyword">let</span> menuButtons = [];
422
+
423
+ <span class="keyword">function</span> <span class="function-name">init</span>() {
424
+ <span class="comment">// Create menu panel</span>
425
+ <span class="function-name">createPanel</span>(<span class="number">170</span>, <span class="number">80</span>, <span class="number">300</span>, <span class="number">200</span>, {
426
+ title: <span class="string">"MAIN MENU"</span>,
427
+ bgColor: <span class="function-name">rgba8</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">50</span>, <span class="number">220</span>),
428
+ borderColor: uiColors.primary,
429
+ shadow: <span class="keyword">true</span>,
430
+ gradient: <span class="keyword">true</span>
431
+ });
432
+
433
+ <span class="comment">// Create buttons</span>
434
+ <span class="keyword">const</span> btnX = <span class="function-name">centerX</span>(<span class="number">200</span>);
435
+ <span class="function-name">createButton</span>(btnX, <span class="number">120</span>, <span class="number">200</span>, <span class="number">40</span>, <span class="string">"START GAME"</span>, () => {
436
+ gameState = <span class="string">'playing'</span>;
437
+ <span class="function-name">clearButtons</span>();
438
+ <span class="function-name">clearPanels</span>();
439
+ });
440
+
441
+ <span class="function-name">createButton</span>(btnX, <span class="number">170</span>, <span class="number">200</span>, <span class="number">40</span>, <span class="string">"OPTIONS"</span>, () => {
442
+ gameState = <span class="string">'options'</span>;
443
+ });
444
+
445
+ <span class="function-name">createButton</span>(btnX, <span class="number">220</span>, <span class="number">200</span>, <span class="number">40</span>, <span class="string">"QUIT"</span>, () => {
446
+ <span class="comment">// Quit</span>
447
+ }, { normalColor: uiColors.danger });
448
+ }
449
+
450
+ <span class="keyword">function</span> <span class="function-name">update</span>() {
451
+ <span class="keyword">if</span> (gameState === <span class="string">'menu'</span>) {
452
+ <span class="function-name">updateAllButtons</span>();
453
+ }
454
+ }
455
+
456
+ <span class="keyword">function</span> <span class="function-name">draw</span>() {
457
+ <span class="function-name">cls</span>(<span class="function-name">rgba8</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">20</span>));
458
+
459
+ <span class="keyword">if</span> (gameState === <span class="string">'menu'</span>) {
460
+ <span class="comment">// Draw title</span>
461
+ <span class="function-name">setTextAlign</span>(<span class="string">'center'</span>);
462
+ <span class="function-name">setFont</span>(<span class="string">'large'</span>);
463
+ <span class="function-name">drawTextShadow</span>(<span class="string">"MY AWESOME GAME"</span>, <span class="number">320</span>, <span class="number">40</span>,
464
+ uiColors.primary, uiColors.black, <span class="number">3</span>, <span class="number">2</span>);
465
+
466
+ <span class="comment">// Draw UI</span>
467
+ <span class="function-name">drawAllPanels</span>();
468
+ <span class="function-name">drawAllButtons</span>();
469
+ }
470
+ }</code></pre>
471
+ </div>
472
+ </section>
473
+
474
+ <section>
475
+ <h2>📚 Related APIs</h2>
476
+ <ul>
477
+ <li><a href="input.html" style="color: var(--accent-cyan);">Input System</a> - Mouse events for UI interaction</li>
478
+ <li><a href="api.html" style="color: var(--accent-cyan);">2D Drawing API</a> - Low-level drawing functions</li>
479
+ <li><a href="font.html" style="color: var(--accent-cyan);">Font System</a> - Bitmap font rendering</li>
480
+ </ul>
481
+ </section>
482
+
483
+ <footer>
484
+ <p>Nova64 Fantasy Console © 2025 | <a href="index.html" style="color: var(--accent-cyan);">Back to Documentation</a></p>
485
+ </footer>
486
+ </div>
487
+ </body>
488
+ </html>