konpeito 0.1.0

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 (180) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -0
  3. data/CHANGELOG.md +75 -0
  4. data/CONTRIBUTING.md +123 -0
  5. data/LICENSE +21 -0
  6. data/README.md +257 -0
  7. data/Rakefile +11 -0
  8. data/bin/konpeito +6 -0
  9. data/konpeito.gemspec +43 -0
  10. data/lib/konpeito/ast/typed_ast.rb +620 -0
  11. data/lib/konpeito/ast/visitor.rb +78 -0
  12. data/lib/konpeito/cache/cache_manager.rb +230 -0
  13. data/lib/konpeito/cache/dependency_graph.rb +192 -0
  14. data/lib/konpeito/cache.rb +8 -0
  15. data/lib/konpeito/cli/base_command.rb +187 -0
  16. data/lib/konpeito/cli/build_command.rb +220 -0
  17. data/lib/konpeito/cli/check_command.rb +104 -0
  18. data/lib/konpeito/cli/config.rb +231 -0
  19. data/lib/konpeito/cli/deps_command.rb +128 -0
  20. data/lib/konpeito/cli/doctor_command.rb +340 -0
  21. data/lib/konpeito/cli/fmt_command.rb +199 -0
  22. data/lib/konpeito/cli/init_command.rb +312 -0
  23. data/lib/konpeito/cli/lsp_command.rb +40 -0
  24. data/lib/konpeito/cli/run_command.rb +150 -0
  25. data/lib/konpeito/cli/test_command.rb +248 -0
  26. data/lib/konpeito/cli/watch_command.rb +212 -0
  27. data/lib/konpeito/cli.rb +301 -0
  28. data/lib/konpeito/codegen/builtin_methods.rb +229 -0
  29. data/lib/konpeito/codegen/cruby_backend.rb +1090 -0
  30. data/lib/konpeito/codegen/debug_info.rb +352 -0
  31. data/lib/konpeito/codegen/inliner.rb +486 -0
  32. data/lib/konpeito/codegen/jvm_backend.rb +197 -0
  33. data/lib/konpeito/codegen/jvm_generator.rb +13412 -0
  34. data/lib/konpeito/codegen/llvm_generator.rb +13191 -0
  35. data/lib/konpeito/codegen/loop_optimizer.rb +363 -0
  36. data/lib/konpeito/codegen/monomorphizer.rb +359 -0
  37. data/lib/konpeito/codegen/profile_runtime.c +341 -0
  38. data/lib/konpeito/codegen/profiler.rb +99 -0
  39. data/lib/konpeito/compiler.rb +592 -0
  40. data/lib/konpeito/dependency_resolver.rb +296 -0
  41. data/lib/konpeito/diagnostics/collector.rb +127 -0
  42. data/lib/konpeito/diagnostics/diagnostic.rb +237 -0
  43. data/lib/konpeito/diagnostics/renderer.rb +144 -0
  44. data/lib/konpeito/formatter/formatter.rb +1214 -0
  45. data/lib/konpeito/hir/builder.rb +7167 -0
  46. data/lib/konpeito/hir/nodes.rb +2465 -0
  47. data/lib/konpeito/lsp/document_manager.rb +820 -0
  48. data/lib/konpeito/lsp/server.rb +183 -0
  49. data/lib/konpeito/lsp/transport.rb +38 -0
  50. data/lib/konpeito/parser/prism_adapter.rb +65 -0
  51. data/lib/konpeito/platform.rb +103 -0
  52. data/lib/konpeito/profile/report.rb +136 -0
  53. data/lib/konpeito/rbs_inline/preprocessor.rb +199 -0
  54. data/lib/konpeito/stdlib/compression/compression.rb +72 -0
  55. data/lib/konpeito/stdlib/compression/compression.rbs +60 -0
  56. data/lib/konpeito/stdlib/compression/compression_native.c +415 -0
  57. data/lib/konpeito/stdlib/compression/extconf.rb +19 -0
  58. data/lib/konpeito/stdlib/crypto/crypto.rb +85 -0
  59. data/lib/konpeito/stdlib/crypto/crypto.rbs +74 -0
  60. data/lib/konpeito/stdlib/crypto/crypto_native.c +312 -0
  61. data/lib/konpeito/stdlib/crypto/extconf.rb +40 -0
  62. data/lib/konpeito/stdlib/http/extconf.rb +19 -0
  63. data/lib/konpeito/stdlib/http/http.rb +125 -0
  64. data/lib/konpeito/stdlib/http/http.rbs +57 -0
  65. data/lib/konpeito/stdlib/http/http_native.c +440 -0
  66. data/lib/konpeito/stdlib/json/extconf.rb +17 -0
  67. data/lib/konpeito/stdlib/json/json.rb +44 -0
  68. data/lib/konpeito/stdlib/json/json.rbs +33 -0
  69. data/lib/konpeito/stdlib/json/json_native.c +286 -0
  70. data/lib/konpeito/stdlib/ui/extconf.rb +216 -0
  71. data/lib/konpeito/stdlib/ui/konpeito_ui_native.cpp +1625 -0
  72. data/lib/konpeito/stdlib/ui/konpeito_ui_native.h +162 -0
  73. data/lib/konpeito/stdlib/ui/ui.rb +318 -0
  74. data/lib/konpeito/stdlib/ui/ui.rbs +247 -0
  75. data/lib/konpeito/type_checker/annotation_parser.rb +67 -0
  76. data/lib/konpeito/type_checker/hm_inferrer.rb +2565 -0
  77. data/lib/konpeito/type_checker/inferrer.rb +565 -0
  78. data/lib/konpeito/type_checker/rbs_loader.rb +1621 -0
  79. data/lib/konpeito/type_checker/type_resolver.rb +276 -0
  80. data/lib/konpeito/type_checker/types.rb +1434 -0
  81. data/lib/konpeito/type_checker/unification.rb +323 -0
  82. data/lib/konpeito/ui/animation/animated_state.rb +80 -0
  83. data/lib/konpeito/ui/animation/easing.rb +59 -0
  84. data/lib/konpeito/ui/animation/value_tween.rb +66 -0
  85. data/lib/konpeito/ui/app.rb +379 -0
  86. data/lib/konpeito/ui/box.rb +38 -0
  87. data/lib/konpeito/ui/castella.rb +70 -0
  88. data/lib/konpeito/ui/castella_native.rb +76 -0
  89. data/lib/konpeito/ui/chart/area_chart.rb +305 -0
  90. data/lib/konpeito/ui/chart/bar_chart.rb +288 -0
  91. data/lib/konpeito/ui/chart/base_chart.rb +210 -0
  92. data/lib/konpeito/ui/chart/chart_helpers.rb +79 -0
  93. data/lib/konpeito/ui/chart/gauge_chart.rb +171 -0
  94. data/lib/konpeito/ui/chart/heatmap_chart.rb +222 -0
  95. data/lib/konpeito/ui/chart/line_chart.rb +289 -0
  96. data/lib/konpeito/ui/chart/pie_chart.rb +219 -0
  97. data/lib/konpeito/ui/chart/scales.rb +77 -0
  98. data/lib/konpeito/ui/chart/scatter_chart.rb +303 -0
  99. data/lib/konpeito/ui/chart/stacked_bar_chart.rb +276 -0
  100. data/lib/konpeito/ui/column.rb +271 -0
  101. data/lib/konpeito/ui/core.rb +2199 -0
  102. data/lib/konpeito/ui/dsl.rb +443 -0
  103. data/lib/konpeito/ui/frame.rb +171 -0
  104. data/lib/konpeito/ui/frame_native.rb +494 -0
  105. data/lib/konpeito/ui/markdown/ast.rb +124 -0
  106. data/lib/konpeito/ui/markdown/mermaid/layout.rb +387 -0
  107. data/lib/konpeito/ui/markdown/mermaid/models.rb +232 -0
  108. data/lib/konpeito/ui/markdown/mermaid/parser.rb +519 -0
  109. data/lib/konpeito/ui/markdown/mermaid/renderer.rb +336 -0
  110. data/lib/konpeito/ui/markdown/parser.rb +805 -0
  111. data/lib/konpeito/ui/markdown/renderer.rb +639 -0
  112. data/lib/konpeito/ui/markdown/theme.rb +165 -0
  113. data/lib/konpeito/ui/render_node.rb +260 -0
  114. data/lib/konpeito/ui/row.rb +207 -0
  115. data/lib/konpeito/ui/spacer.rb +18 -0
  116. data/lib/konpeito/ui/style.rb +799 -0
  117. data/lib/konpeito/ui/theme.rb +563 -0
  118. data/lib/konpeito/ui/themes/material.rb +35 -0
  119. data/lib/konpeito/ui/themes/tokyo_night.rb +6 -0
  120. data/lib/konpeito/ui/widgets/button.rb +103 -0
  121. data/lib/konpeito/ui/widgets/calendar.rb +1034 -0
  122. data/lib/konpeito/ui/widgets/checkbox.rb +119 -0
  123. data/lib/konpeito/ui/widgets/container.rb +91 -0
  124. data/lib/konpeito/ui/widgets/data_table.rb +667 -0
  125. data/lib/konpeito/ui/widgets/divider.rb +29 -0
  126. data/lib/konpeito/ui/widgets/image.rb +105 -0
  127. data/lib/konpeito/ui/widgets/input.rb +485 -0
  128. data/lib/konpeito/ui/widgets/markdown.rb +57 -0
  129. data/lib/konpeito/ui/widgets/modal.rb +163 -0
  130. data/lib/konpeito/ui/widgets/multiline_input.rb +968 -0
  131. data/lib/konpeito/ui/widgets/multiline_text.rb +180 -0
  132. data/lib/konpeito/ui/widgets/net_image.rb +100 -0
  133. data/lib/konpeito/ui/widgets/progress_bar.rb +70 -0
  134. data/lib/konpeito/ui/widgets/radio_buttons.rb +93 -0
  135. data/lib/konpeito/ui/widgets/slider.rb +133 -0
  136. data/lib/konpeito/ui/widgets/switch.rb +84 -0
  137. data/lib/konpeito/ui/widgets/tabs.rb +157 -0
  138. data/lib/konpeito/ui/widgets/text.rb +110 -0
  139. data/lib/konpeito/ui/widgets/tree.rb +426 -0
  140. data/lib/konpeito/version.rb +5 -0
  141. data/lib/konpeito.rb +109 -0
  142. data/test_native_array.rb +172 -0
  143. data/test_native_array_class.rb +197 -0
  144. data/test_native_class.rb +151 -0
  145. data/tools/konpeito-asm/build.sh +65 -0
  146. data/tools/konpeito-asm/lib/asm-9.7.1.jar +0 -0
  147. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KArray.class +0 -0
  148. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KCompression.class +0 -0
  149. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KConditionVariable.class +0 -0
  150. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KCrypto.class +0 -0
  151. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KFile.class +0 -0
  152. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KHTTP.class +0 -0
  153. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KHash.class +0 -0
  154. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KJSON$Parser.class +0 -0
  155. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KJSON.class +0 -0
  156. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KMath.class +0 -0
  157. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KRactor.class +0 -0
  158. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KRactorPort.class +0 -0
  159. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KSizedQueue.class +0 -0
  160. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KThread.class +0 -0
  161. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KTime.class +0 -0
  162. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/RubyDispatch.class +0 -0
  163. data/tools/konpeito-asm/src/ClassIntrospector.java +312 -0
  164. data/tools/konpeito-asm/src/KonpeitoAssembler.java +659 -0
  165. data/tools/konpeito-asm/src/konpeito/runtime/KArray.java +390 -0
  166. data/tools/konpeito-asm/src/konpeito/runtime/KCompression.java +168 -0
  167. data/tools/konpeito-asm/src/konpeito/runtime/KConditionVariable.java +48 -0
  168. data/tools/konpeito-asm/src/konpeito/runtime/KCrypto.java +151 -0
  169. data/tools/konpeito-asm/src/konpeito/runtime/KFile.java +100 -0
  170. data/tools/konpeito-asm/src/konpeito/runtime/KHTTP.java +113 -0
  171. data/tools/konpeito-asm/src/konpeito/runtime/KHash.java +228 -0
  172. data/tools/konpeito-asm/src/konpeito/runtime/KJSON.java +405 -0
  173. data/tools/konpeito-asm/src/konpeito/runtime/KMath.java +54 -0
  174. data/tools/konpeito-asm/src/konpeito/runtime/KRactor.java +244 -0
  175. data/tools/konpeito-asm/src/konpeito/runtime/KRactorPort.java +53 -0
  176. data/tools/konpeito-asm/src/konpeito/runtime/KSizedQueue.java +49 -0
  177. data/tools/konpeito-asm/src/konpeito/runtime/KThread.java +49 -0
  178. data/tools/konpeito-asm/src/konpeito/runtime/KTime.java +53 -0
  179. data/tools/konpeito-asm/src/konpeito/runtime/RubyDispatch.java +416 -0
  180. metadata +267 -0
@@ -0,0 +1,563 @@
1
+ # rbs_inline: enabled
2
+
3
+ # Theme system - design tokens for consistent styling
4
+ # Port of Castella Theme
5
+ #
6
+ # Kind constants for semantic widget styling
7
+ KIND_NORMAL = 0
8
+ KIND_INFO = 1
9
+ KIND_SUCCESS = 2
10
+ KIND_WARNING = 3
11
+ KIND_DANGER = 4
12
+
13
+ class Theme
14
+ def initialize
15
+ # Tokyo Night defaults
16
+ @bg_canvas = 0xFF1A1B26
17
+ @bg_primary = 0xFF24283B
18
+ @bg_secondary = 0xFF414868
19
+ @bg_overlay = 0xFF1A1B26
20
+ @text_primary = 0xFFC0CAF5
21
+ @text_secondary = 0xFF565F89
22
+ @accent = 0xFF7AA2F7
23
+ @info = 0xFF7AA2F7
24
+ @error = 0xFFF7768E
25
+ @success = 0xFF9ECE6A
26
+ @warning = 0xFFE0AF68
27
+ @border = 0xFF414868
28
+ @border_focus = 0xFF7AA2F7
29
+ @font_family = "default"
30
+ @font_size_sm = 12.0
31
+ @font_size_md = 14.0
32
+ @font_size_lg = 18.0
33
+ @font_size_xl = 24.0
34
+ @spacing_xs = 4.0
35
+ @spacing_sm = 8.0
36
+ @spacing_md = 12.0
37
+ @spacing_lg = 16.0
38
+ @border_radius = 4.0
39
+
40
+ # Kind-specific background colors
41
+ @bg_info = 0xFF7AA2F7
42
+ @bg_success = 0xFF9ECE6A
43
+ @bg_warning = 0xFFE0AF68
44
+ @bg_danger = 0xFFF7768E
45
+
46
+ # Kind-specific text colors (text on colored bg)
47
+ @text_on_info = 0xFF1A1B26
48
+ @text_on_success = 0xFF1A1B26
49
+ @text_on_warning = 0xFF1A1B26
50
+ @text_on_danger = 0xFF1A1B26
51
+
52
+ # Kind-specific hover colors
53
+ @hover_normal = 0xFF414868
54
+ @hover_info = 0xFF89B4FA
55
+ @hover_success = 0xFFB9F27C
56
+ @hover_warning = 0xFFFFD280
57
+ @hover_danger = 0xFFFF9E9E
58
+
59
+ # Scrollbar colors
60
+ @scrollbar_bg = 0xFF2A2D3D
61
+ @scrollbar_fg = 0xFF565F89
62
+
63
+ # Selection highlight (50% alpha blue)
64
+ @bg_selected = 0x807AA2F7
65
+ end
66
+
67
+ # --- Background colors ---
68
+ #: () -> Integer
69
+ def bg_canvas
70
+ @bg_canvas
71
+ end
72
+ #: (Integer v) -> Integer
73
+ def bg_canvas=(v)
74
+ @bg_canvas = v
75
+ end
76
+ #: () -> Integer
77
+ def bg_primary
78
+ @bg_primary
79
+ end
80
+ #: (Integer v) -> Integer
81
+ def bg_primary=(v)
82
+ @bg_primary = v
83
+ end
84
+ #: () -> Integer
85
+ def bg_secondary
86
+ @bg_secondary
87
+ end
88
+ #: (Integer v) -> Integer
89
+ def bg_secondary=(v)
90
+ @bg_secondary = v
91
+ end
92
+ #: () -> Integer
93
+ def bg_overlay
94
+ @bg_overlay
95
+ end
96
+ #: (Integer v) -> Integer
97
+ def bg_overlay=(v)
98
+ @bg_overlay = v
99
+ end
100
+
101
+ # --- Text colors ---
102
+ #: () -> Integer
103
+ def text_primary
104
+ @text_primary
105
+ end
106
+ #: (Integer v) -> Integer
107
+ def text_primary=(v)
108
+ @text_primary = v
109
+ end
110
+ #: () -> Integer
111
+ def text_secondary
112
+ @text_secondary
113
+ end
114
+ #: (Integer v) -> Integer
115
+ def text_secondary=(v)
116
+ @text_secondary = v
117
+ end
118
+
119
+ # --- Semantic colors ---
120
+ #: () -> Integer
121
+ def accent
122
+ @accent
123
+ end
124
+ #: (Integer v) -> Integer
125
+ def accent=(v)
126
+ @accent = v
127
+ end
128
+ #: () -> Integer
129
+ def info
130
+ @info
131
+ end
132
+ #: (Integer v) -> Integer
133
+ def info=(v)
134
+ @info = v
135
+ end
136
+ #: () -> Integer
137
+ def error
138
+ @error
139
+ end
140
+ #: (Integer v) -> Integer
141
+ def error=(v)
142
+ @error = v
143
+ end
144
+ #: () -> Integer
145
+ def success
146
+ @success
147
+ end
148
+ #: (Integer v) -> Integer
149
+ def success=(v)
150
+ @success = v
151
+ end
152
+ #: () -> Integer
153
+ def warning
154
+ @warning
155
+ end
156
+ #: (Integer v) -> Integer
157
+ def warning=(v)
158
+ @warning = v
159
+ end
160
+
161
+ # --- Border ---
162
+ #: () -> Integer
163
+ def border
164
+ @border
165
+ end
166
+ #: (Integer v) -> Integer
167
+ def border=(v)
168
+ @border = v
169
+ end
170
+ #: () -> Integer
171
+ def border_focus
172
+ @border_focus
173
+ end
174
+ #: (Integer v) -> Integer
175
+ def border_focus=(v)
176
+ @border_focus = v
177
+ end
178
+
179
+ # --- Typography ---
180
+ #: () -> String
181
+ def font_family
182
+ @font_family
183
+ end
184
+ #: (String v) -> String
185
+ def font_family=(v)
186
+ @font_family = v
187
+ end
188
+ #: () -> Float
189
+ def font_size_sm
190
+ @font_size_sm
191
+ end
192
+ #: () -> Float
193
+ def font_size_md
194
+ @font_size_md
195
+ end
196
+ #: () -> Float
197
+ def font_size_lg
198
+ @font_size_lg
199
+ end
200
+ #: () -> Float
201
+ def font_size_xl
202
+ @font_size_xl
203
+ end
204
+
205
+ # --- Spacing ---
206
+ #: () -> Float
207
+ def spacing_xs
208
+ @spacing_xs
209
+ end
210
+ #: () -> Float
211
+ def spacing_sm
212
+ @spacing_sm
213
+ end
214
+ #: () -> Float
215
+ def spacing_md
216
+ @spacing_md
217
+ end
218
+ #: () -> Float
219
+ def spacing_lg
220
+ @spacing_lg
221
+ end
222
+ #: () -> Float
223
+ def border_radius
224
+ @border_radius
225
+ end
226
+
227
+ # --- Scrollbar ---
228
+ #: () -> Integer
229
+ def scrollbar_bg
230
+ @scrollbar_bg
231
+ end
232
+ #: (Integer v) -> Integer
233
+ def scrollbar_bg=(v)
234
+ @scrollbar_bg = v
235
+ end
236
+ #: () -> Integer
237
+ def scrollbar_fg
238
+ @scrollbar_fg
239
+ end
240
+ #: (Integer v) -> Integer
241
+ def scrollbar_fg=(v)
242
+ @scrollbar_fg = v
243
+ end
244
+
245
+ # --- Selection ---
246
+ #: () -> Integer
247
+ def bg_selected
248
+ @bg_selected
249
+ end
250
+ #: (Integer v) -> Integer
251
+ def bg_selected=(v)
252
+ @bg_selected = v
253
+ end
254
+
255
+ # --- Kind backgrounds ---
256
+ #: () -> Integer
257
+ def bg_info
258
+ @bg_info
259
+ end
260
+ #: (Integer v) -> Integer
261
+ def bg_info=(v)
262
+ @bg_info = v
263
+ end
264
+ #: () -> Integer
265
+ def bg_success
266
+ @bg_success
267
+ end
268
+ #: (Integer v) -> Integer
269
+ def bg_success=(v)
270
+ @bg_success = v
271
+ end
272
+ #: () -> Integer
273
+ def bg_warning
274
+ @bg_warning
275
+ end
276
+ #: (Integer v) -> Integer
277
+ def bg_warning=(v)
278
+ @bg_warning = v
279
+ end
280
+ #: () -> Integer
281
+ def bg_danger
282
+ @bg_danger
283
+ end
284
+ #: (Integer v) -> Integer
285
+ def bg_danger=(v)
286
+ @bg_danger = v
287
+ end
288
+
289
+ # --- Kind text on bg ---
290
+ #: () -> Integer
291
+ def text_on_info
292
+ @text_on_info
293
+ end
294
+ #: (Integer v) -> Integer
295
+ def text_on_info=(v)
296
+ @text_on_info = v
297
+ end
298
+ #: () -> Integer
299
+ def text_on_success
300
+ @text_on_success
301
+ end
302
+ #: (Integer v) -> Integer
303
+ def text_on_success=(v)
304
+ @text_on_success = v
305
+ end
306
+ #: () -> Integer
307
+ def text_on_warning
308
+ @text_on_warning
309
+ end
310
+ #: (Integer v) -> Integer
311
+ def text_on_warning=(v)
312
+ @text_on_warning = v
313
+ end
314
+ #: () -> Integer
315
+ def text_on_danger
316
+ @text_on_danger
317
+ end
318
+ #: (Integer v) -> Integer
319
+ def text_on_danger=(v)
320
+ @text_on_danger = v
321
+ end
322
+
323
+ # --- Kind hover ---
324
+ #: () -> Integer
325
+ def hover_normal
326
+ @hover_normal
327
+ end
328
+ #: (Integer v) -> Integer
329
+ def hover_normal=(v)
330
+ @hover_normal = v
331
+ end
332
+ #: () -> Integer
333
+ def hover_info
334
+ @hover_info
335
+ end
336
+ #: (Integer v) -> Integer
337
+ def hover_info=(v)
338
+ @hover_info = v
339
+ end
340
+ #: () -> Integer
341
+ def hover_success
342
+ @hover_success
343
+ end
344
+ #: (Integer v) -> Integer
345
+ def hover_success=(v)
346
+ @hover_success = v
347
+ end
348
+ #: () -> Integer
349
+ def hover_warning
350
+ @hover_warning
351
+ end
352
+ #: (Integer v) -> Integer
353
+ def hover_warning=(v)
354
+ @hover_warning = v
355
+ end
356
+ #: () -> Integer
357
+ def hover_danger
358
+ @hover_danger
359
+ end
360
+ #: (Integer v) -> Integer
361
+ def hover_danger=(v)
362
+ @hover_danger = v
363
+ end
364
+
365
+ # --- Kind-based color methods ---
366
+
367
+ #: (Integer kind) -> Integer
368
+ def button_bg(kind)
369
+ if kind == 1
370
+ @bg_info
371
+ elsif kind == 2
372
+ @bg_success
373
+ elsif kind == 3
374
+ @bg_warning
375
+ elsif kind == 4
376
+ @bg_danger
377
+ else
378
+ @accent
379
+ end
380
+ end
381
+
382
+ #: (Integer kind) -> Integer
383
+ def button_text(kind)
384
+ if kind == 1
385
+ @text_on_info
386
+ elsif kind == 2
387
+ @text_on_success
388
+ elsif kind == 3
389
+ @text_on_warning
390
+ elsif kind == 4
391
+ @text_on_danger
392
+ else
393
+ @bg_canvas
394
+ end
395
+ end
396
+
397
+ #: (Integer kind) -> Integer
398
+ def button_hover(kind)
399
+ if kind == 1
400
+ @hover_info
401
+ elsif kind == 2
402
+ @hover_success
403
+ elsif kind == 3
404
+ @hover_warning
405
+ elsif kind == 4
406
+ @hover_danger
407
+ else
408
+ @hover_normal
409
+ end
410
+ end
411
+
412
+ #: (Integer kind) -> Integer
413
+ def text_color_for_kind(kind)
414
+ if kind == 1
415
+ @info
416
+ elsif kind == 2
417
+ @success
418
+ elsif kind == 3
419
+ @warning
420
+ elsif kind == 4
421
+ @error
422
+ else
423
+ @text_primary
424
+ end
425
+ end
426
+ end
427
+
428
+ # --- Theme Presets ---
429
+ # Each returns a new Theme with preset colors.
430
+ # Usage: $theme = theme_nord()
431
+
432
+ #: () -> Theme
433
+ def theme_tokyo_night
434
+ Theme.new
435
+ end
436
+
437
+ #: () -> Theme
438
+ def theme_light
439
+ t = Theme.new
440
+ t.bg_canvas = 0xFFD5D6DB
441
+ t.bg_primary = 0xFFE1E2E7
442
+ t.bg_secondary = 0xFFC4C5CB
443
+ t.bg_overlay = 0xFFD5D6DB
444
+ t.text_primary = 0xFF343B58
445
+ t.text_secondary = 0xFF9699A3
446
+ t.accent = 0xFF34548A
447
+ t.info = 0xFF166775
448
+ t.success = 0xFF485E30
449
+ t.warning = 0xFF8F5E15
450
+ t.error = 0xFF8C4351
451
+ t.border = 0xFFC4C5CB
452
+ t.border_focus = 0xFF34548A
453
+ t.bg_info = 0xFF166775
454
+ t.bg_success = 0xFF485E30
455
+ t.bg_warning = 0xFF8F5E15
456
+ t.bg_danger = 0xFF8C4351
457
+ t.text_on_info = 0xFFE1E2E7
458
+ t.text_on_success = 0xFFE1E2E7
459
+ t.text_on_warning = 0xFFE1E2E7
460
+ t.text_on_danger = 0xFFE1E2E7
461
+ t.hover_info = 0xFF1A7A8A
462
+ t.hover_success = 0xFF567236
463
+ t.hover_warning = 0xFFA87020
464
+ t.hover_danger = 0xFFA35060
465
+ t.hover_normal = 0xFFC4C5CB
466
+ t.scrollbar_bg = 0xFFC4C5CB
467
+ t.scrollbar_fg = 0xFF9699A3
468
+ t.bg_selected = 0x8034548A
469
+ t
470
+ end
471
+
472
+ #: () -> Theme
473
+ def theme_nord
474
+ t = Theme.new
475
+ t.bg_canvas = 0xFF2E3440
476
+ t.bg_primary = 0xFF3B4252
477
+ t.bg_secondary = 0xFF434C5E
478
+ t.text_primary = 0xFFECEFF4
479
+ t.text_secondary = 0xFFD8DEE9
480
+ t.accent = 0xFF88C0D0
481
+ t.info = 0xFF88C0D0
482
+ t.success = 0xFFA3BE8C
483
+ t.warning = 0xFFEBCB8B
484
+ t.error = 0xFFBF616A
485
+ t.border = 0xFF4C566A
486
+ t.border_focus = 0xFF88C0D0
487
+ t.bg_info = 0xFF88C0D0
488
+ t.bg_success = 0xFFA3BE8C
489
+ t.bg_warning = 0xFFEBCB8B
490
+ t.bg_danger = 0xFFBF616A
491
+ t.text_on_info = 0xFF2E3440
492
+ t.text_on_success = 0xFF2E3440
493
+ t.text_on_warning = 0xFF2E3440
494
+ t.text_on_danger = 0xFFECEFF4
495
+ t.hover_info = 0xFF8FBCBB
496
+ t.hover_success = 0xFFB4D89C
497
+ t.hover_warning = 0xFFF5D9A0
498
+ t.hover_danger = 0xFFD08770
499
+ t.hover_normal = 0xFF4C566A
500
+ t
501
+ end
502
+
503
+ #: () -> Theme
504
+ def theme_dracula
505
+ t = Theme.new
506
+ t.bg_canvas = 0xFF282A36
507
+ t.bg_primary = 0xFF44475A
508
+ t.bg_secondary = 0xFF6272A4
509
+ t.text_primary = 0xFFF8F8F2
510
+ t.text_secondary = 0xFF6272A4
511
+ t.accent = 0xFFBD93F9
512
+ t.info = 0xFF8BE9FD
513
+ t.success = 0xFF50FA7B
514
+ t.warning = 0xFFF1FA8C
515
+ t.error = 0xFFFF5555
516
+ t.border = 0xFF6272A4
517
+ t.border_focus = 0xFFBD93F9
518
+ t.bg_info = 0xFF8BE9FD
519
+ t.bg_success = 0xFF50FA7B
520
+ t.bg_warning = 0xFFF1FA8C
521
+ t.bg_danger = 0xFFFF5555
522
+ t.text_on_info = 0xFF282A36
523
+ t.text_on_success = 0xFF282A36
524
+ t.text_on_warning = 0xFF282A36
525
+ t.text_on_danger = 0xFFF8F8F2
526
+ t.hover_info = 0xFFA4F0FF
527
+ t.hover_success = 0xFF69FF94
528
+ t.hover_warning = 0xFFFFFFA5
529
+ t.hover_danger = 0xFFFF6E6E
530
+ t.hover_normal = 0xFF6272A4
531
+ t
532
+ end
533
+
534
+ #: () -> Theme
535
+ def theme_catppuccin
536
+ t = Theme.new
537
+ t.bg_canvas = 0xFF1E1E2E
538
+ t.bg_primary = 0xFF313244
539
+ t.bg_secondary = 0xFF45475A
540
+ t.text_primary = 0xFFCDD6F4
541
+ t.text_secondary = 0xFFA6ADC8
542
+ t.accent = 0xFFCBA6F7
543
+ t.info = 0xFF89B4FA
544
+ t.success = 0xFFA6E3A1
545
+ t.warning = 0xFFF9E2AF
546
+ t.error = 0xFFF38BA8
547
+ t.border = 0xFF585B70
548
+ t.border_focus = 0xFFCBA6F7
549
+ t.bg_info = 0xFF89B4FA
550
+ t.bg_success = 0xFFA6E3A1
551
+ t.bg_warning = 0xFFF9E2AF
552
+ t.bg_danger = 0xFFF38BA8
553
+ t.text_on_info = 0xFF1E1E2E
554
+ t.text_on_success = 0xFF1E1E2E
555
+ t.text_on_warning = 0xFF1E1E2E
556
+ t.text_on_danger = 0xFF1E1E2E
557
+ t.hover_info = 0xFFA4C8FF
558
+ t.hover_success = 0xFFB9F0B4
559
+ t.hover_warning = 0xFFFFF0CC
560
+ t.hover_danger = 0xFFFFA0B8
561
+ t.hover_normal = 0xFF585B70
562
+ t
563
+ end
@@ -0,0 +1,35 @@
1
+ # Material Light theme
2
+
3
+ def material_theme
4
+ t = Theme.new
5
+ t.bg_canvas = 0xFFFEFEFE
6
+ t.bg_primary = 0xFFFFFFFF
7
+ t.bg_secondary = 0xFFF5F5F5
8
+ t.bg_overlay = 0xFFE8E8E8
9
+ t.text_primary = 0xFF1C1B1F
10
+ t.text_secondary = 0xFF757575
11
+ t.accent = 0xFF6200EE
12
+ t.info = 0xFF2196F3
13
+ t.success = 0xFF4CAF50
14
+ t.warning = 0xFFFF9800
15
+ t.error = 0xFFF44336
16
+ t.border = 0xFFE0E0E0
17
+ t.border_focus = 0xFF6200EE
18
+ t.bg_info = 0xFF2196F3
19
+ t.bg_success = 0xFF4CAF50
20
+ t.bg_warning = 0xFFFF9800
21
+ t.bg_danger = 0xFFF44336
22
+ t.text_on_info = 0xFFFFFFFF
23
+ t.text_on_success = 0xFFFFFFFF
24
+ t.text_on_warning = 0xFF1C1B1F
25
+ t.text_on_danger = 0xFFFFFFFF
26
+ t.hover_info = 0xFF42A5F5
27
+ t.hover_success = 0xFF66BB6A
28
+ t.hover_warning = 0xFFFFA726
29
+ t.hover_danger = 0xFFEF5350
30
+ t.hover_normal = 0xFFE0E0E0
31
+ t.scrollbar_bg = 0xFFE0E0E0
32
+ t.scrollbar_fg = 0xFFBDBDBD
33
+ t.bg_selected = 0x806200EE
34
+ t
35
+ end
@@ -0,0 +1,6 @@
1
+ # Tokyo Night dark theme
2
+ # Default theme for Castella/Konpeito
3
+
4
+ def tokyo_night_theme
5
+ Theme.new # Default values are already Tokyo Night
6
+ end
@@ -0,0 +1,103 @@
1
+ # Button widget - clickable button with label
2
+ # Port of Castella Button
3
+
4
+ class Button < Widget
5
+ def initialize(label)
6
+ super()
7
+ @label = label
8
+ @font_size_val = 14.0
9
+ @kind_val = 0
10
+ @custom_bg = false
11
+ @custom_text = false
12
+ @bg_color = 0xFF7AA2F7
13
+ @text_color = 0xFF1A1B26
14
+ @hover_color = 0xFF89B4FA
15
+ @radius = 4.0
16
+ @hovered = false
17
+ @click_handler = nil
18
+ @width_policy = CONTENT
19
+ @height_policy = CONTENT
20
+ @pad_top = 8.0
21
+ @pad_right = 16.0
22
+ @pad_bottom = 8.0
23
+ @pad_left = 16.0
24
+ end
25
+
26
+ def kind(k)
27
+ @kind_val = k
28
+ self
29
+ end
30
+
31
+ def on_click(&block)
32
+ @click_handler = block
33
+ self
34
+ end
35
+
36
+ def font_size(s)
37
+ @font_size_val = s
38
+ self
39
+ end
40
+
41
+ def bg(c)
42
+ @bg_color = c
43
+ @custom_bg = true
44
+ self
45
+ end
46
+
47
+ def text_color(c)
48
+ @text_color = c
49
+ @custom_text = true
50
+ self
51
+ end
52
+
53
+ def measure(painter)
54
+ tw = painter.measure_text_width(@label, $theme.font_family, @font_size_val)
55
+ th = painter.measure_text_height($theme.font_family, @font_size_val)
56
+ Size.new(tw + @pad_left + @pad_right, th + @pad_top + @pad_bottom)
57
+ end
58
+
59
+ def redraw(painter, completely)
60
+ # Use theme colors based on kind, unless custom colors were set
61
+ if @custom_bg
62
+ bg_c = @hovered ? @hover_color : @bg_color
63
+ else
64
+ if @hovered
65
+ bg_c = $theme.button_hover(@kind_val)
66
+ else
67
+ bg_c = $theme.button_bg(@kind_val)
68
+ end
69
+ end
70
+ if @custom_text
71
+ tc = @text_color
72
+ else
73
+ tc = $theme.button_text(@kind_val)
74
+ end
75
+
76
+ painter.fill_round_rect(0.0, 0.0, @width, @height, @radius, bg_c)
77
+ ascent = painter.get_text_ascent($theme.font_family, @font_size_val)
78
+ th = painter.measure_text_height($theme.font_family, @font_size_val)
79
+ text_y = (@height - th) / 2.0 + ascent
80
+ painter.draw_text(@label, @pad_left, text_y, $theme.font_family, @font_size_val, tc)
81
+ end
82
+
83
+ def mouse_up(ev)
84
+ @click_handler.call if @click_handler
85
+ end
86
+
87
+ def mouse_over
88
+ @hovered = true
89
+ mark_dirty
90
+ update
91
+ end
92
+
93
+ def mouse_out
94
+ @hovered = false
95
+ mark_dirty
96
+ update
97
+ end
98
+ end
99
+
100
+ # Top-level helper
101
+ def Button(label)
102
+ Button.new(label)
103
+ end