kumiki 0.1.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 (62) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +256 -0
  4. data/lib/kumiki/animation/animated_state.rb +83 -0
  5. data/lib/kumiki/animation/easing.rb +62 -0
  6. data/lib/kumiki/animation/value_tween.rb +69 -0
  7. data/lib/kumiki/app.rb +381 -0
  8. data/lib/kumiki/box.rb +40 -0
  9. data/lib/kumiki/chart/area_chart.rb +308 -0
  10. data/lib/kumiki/chart/bar_chart.rb +291 -0
  11. data/lib/kumiki/chart/base_chart.rb +213 -0
  12. data/lib/kumiki/chart/chart_helpers.rb +74 -0
  13. data/lib/kumiki/chart/gauge_chart.rb +174 -0
  14. data/lib/kumiki/chart/heatmap_chart.rb +223 -0
  15. data/lib/kumiki/chart/line_chart.rb +292 -0
  16. data/lib/kumiki/chart/pie_chart.rb +222 -0
  17. data/lib/kumiki/chart/scales.rb +79 -0
  18. data/lib/kumiki/chart/scatter_chart.rb +306 -0
  19. data/lib/kumiki/chart/stacked_bar_chart.rb +279 -0
  20. data/lib/kumiki/column.rb +351 -0
  21. data/lib/kumiki/core.rb +2511 -0
  22. data/lib/kumiki/dsl.rb +408 -0
  23. data/lib/kumiki/frame_ranma.rb +570 -0
  24. data/lib/kumiki/markdown/ast.rb +127 -0
  25. data/lib/kumiki/markdown/mermaid/layout.rb +389 -0
  26. data/lib/kumiki/markdown/mermaid/models.rb +235 -0
  27. data/lib/kumiki/markdown/mermaid/parser.rb +522 -0
  28. data/lib/kumiki/markdown/mermaid/renderer.rb +339 -0
  29. data/lib/kumiki/markdown/parser.rb +808 -0
  30. data/lib/kumiki/markdown/renderer.rb +642 -0
  31. data/lib/kumiki/markdown/theme.rb +168 -0
  32. data/lib/kumiki/render_node.rb +262 -0
  33. data/lib/kumiki/row.rb +288 -0
  34. data/lib/kumiki/spacer.rb +20 -0
  35. data/lib/kumiki/style.rb +799 -0
  36. data/lib/kumiki/theme.rb +567 -0
  37. data/lib/kumiki/themes/material.rb +40 -0
  38. data/lib/kumiki/themes/tokyo_night.rb +11 -0
  39. data/lib/kumiki/version.rb +5 -0
  40. data/lib/kumiki/widgets/button.rb +105 -0
  41. data/lib/kumiki/widgets/calendar.rb +1028 -0
  42. data/lib/kumiki/widgets/checkbox.rb +119 -0
  43. data/lib/kumiki/widgets/container.rb +111 -0
  44. data/lib/kumiki/widgets/data_table.rb +670 -0
  45. data/lib/kumiki/widgets/divider.rb +31 -0
  46. data/lib/kumiki/widgets/image.rb +105 -0
  47. data/lib/kumiki/widgets/input.rb +485 -0
  48. data/lib/kumiki/widgets/markdown.rb +58 -0
  49. data/lib/kumiki/widgets/modal.rb +165 -0
  50. data/lib/kumiki/widgets/multiline_input.rb +970 -0
  51. data/lib/kumiki/widgets/multiline_text.rb +180 -0
  52. data/lib/kumiki/widgets/net_image.rb +100 -0
  53. data/lib/kumiki/widgets/progress_bar.rb +72 -0
  54. data/lib/kumiki/widgets/radio_buttons.rb +93 -0
  55. data/lib/kumiki/widgets/slider.rb +135 -0
  56. data/lib/kumiki/widgets/switch.rb +84 -0
  57. data/lib/kumiki/widgets/tabs.rb +175 -0
  58. data/lib/kumiki/widgets/text.rb +120 -0
  59. data/lib/kumiki/widgets/tree.rb +434 -0
  60. data/lib/kumiki/widgets/webview.rb +87 -0
  61. data/lib/kumiki.rb +130 -0
  62. metadata +113 -0
@@ -0,0 +1,567 @@
1
+ module Kumiki
2
+ # rbs_inline: enabled
3
+
4
+ # Theme system - design tokens for consistent styling
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 = 0xFF89B4FA
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: Kumiki.theme = Kumiki.theme_nord
431
+
432
+ module_function
433
+
434
+ #: () -> Theme
435
+ def theme_tokyo_night
436
+ Theme.new
437
+ end
438
+
439
+ #: () -> Theme
440
+ def theme_light
441
+ t = Theme.new
442
+ t.bg_canvas = 0xFFD5D6DB
443
+ t.bg_primary = 0xFFE1E2E7
444
+ t.bg_secondary = 0xFFC4C5CB
445
+ t.bg_overlay = 0xFFD5D6DB
446
+ t.text_primary = 0xFF343B58
447
+ t.text_secondary = 0xFF9699A3
448
+ t.accent = 0xFF34548A
449
+ t.info = 0xFF166775
450
+ t.success = 0xFF485E30
451
+ t.warning = 0xFF8F5E15
452
+ t.error = 0xFF8C4351
453
+ t.border = 0xFFC4C5CB
454
+ t.border_focus = 0xFF34548A
455
+ t.bg_info = 0xFF166775
456
+ t.bg_success = 0xFF485E30
457
+ t.bg_warning = 0xFF8F5E15
458
+ t.bg_danger = 0xFF8C4351
459
+ t.text_on_info = 0xFFE1E2E7
460
+ t.text_on_success = 0xFFE1E2E7
461
+ t.text_on_warning = 0xFFE1E2E7
462
+ t.text_on_danger = 0xFFE1E2E7
463
+ t.hover_info = 0xFF1A7A8A
464
+ t.hover_success = 0xFF567236
465
+ t.hover_warning = 0xFFA87020
466
+ t.hover_danger = 0xFFA35060
467
+ t.hover_normal = 0xFF4A6EA0
468
+ t.scrollbar_bg = 0xFFC4C5CB
469
+ t.scrollbar_fg = 0xFF9699A3
470
+ t.bg_selected = 0x8034548A
471
+ t
472
+ end
473
+
474
+ #: () -> Theme
475
+ def theme_nord
476
+ t = Theme.new
477
+ t.bg_canvas = 0xFF2E3440
478
+ t.bg_primary = 0xFF3B4252
479
+ t.bg_secondary = 0xFF434C5E
480
+ t.text_primary = 0xFFECEFF4
481
+ t.text_secondary = 0xFFD8DEE9
482
+ t.accent = 0xFF88C0D0
483
+ t.info = 0xFF88C0D0
484
+ t.success = 0xFFA3BE8C
485
+ t.warning = 0xFFEBCB8B
486
+ t.error = 0xFFBF616A
487
+ t.border = 0xFF4C566A
488
+ t.border_focus = 0xFF88C0D0
489
+ t.bg_info = 0xFF88C0D0
490
+ t.bg_success = 0xFFA3BE8C
491
+ t.bg_warning = 0xFFEBCB8B
492
+ t.bg_danger = 0xFFBF616A
493
+ t.text_on_info = 0xFF2E3440
494
+ t.text_on_success = 0xFF2E3440
495
+ t.text_on_warning = 0xFF2E3440
496
+ t.text_on_danger = 0xFFECEFF4
497
+ t.hover_info = 0xFF8FBCBB
498
+ t.hover_success = 0xFFB4D89C
499
+ t.hover_warning = 0xFFF5D9A0
500
+ t.hover_danger = 0xFFD08770
501
+ t.hover_normal = 0xFF9DD0DE
502
+ t
503
+ end
504
+
505
+ #: () -> Theme
506
+ def theme_dracula
507
+ t = Theme.new
508
+ t.bg_canvas = 0xFF282A36
509
+ t.bg_primary = 0xFF44475A
510
+ t.bg_secondary = 0xFF6272A4
511
+ t.text_primary = 0xFFF8F8F2
512
+ t.text_secondary = 0xFF6272A4
513
+ t.accent = 0xFFBD93F9
514
+ t.info = 0xFF8BE9FD
515
+ t.success = 0xFF50FA7B
516
+ t.warning = 0xFFF1FA8C
517
+ t.error = 0xFFFF5555
518
+ t.border = 0xFF6272A4
519
+ t.border_focus = 0xFFBD93F9
520
+ t.bg_info = 0xFF8BE9FD
521
+ t.bg_success = 0xFF50FA7B
522
+ t.bg_warning = 0xFFF1FA8C
523
+ t.bg_danger = 0xFFFF5555
524
+ t.text_on_info = 0xFF282A36
525
+ t.text_on_success = 0xFF282A36
526
+ t.text_on_warning = 0xFF282A36
527
+ t.text_on_danger = 0xFFF8F8F2
528
+ t.hover_info = 0xFFA4F0FF
529
+ t.hover_success = 0xFF69FF94
530
+ t.hover_warning = 0xFFFFFFA5
531
+ t.hover_danger = 0xFFFF6E6E
532
+ t.hover_normal = 0xFFD0ABFF
533
+ t
534
+ end
535
+
536
+ #: () -> Theme
537
+ def theme_catppuccin
538
+ t = Theme.new
539
+ t.bg_canvas = 0xFF1E1E2E
540
+ t.bg_primary = 0xFF313244
541
+ t.bg_secondary = 0xFF45475A
542
+ t.text_primary = 0xFFCDD6F4
543
+ t.text_secondary = 0xFFA6ADC8
544
+ t.accent = 0xFFCBA6F7
545
+ t.info = 0xFF89B4FA
546
+ t.success = 0xFFA6E3A1
547
+ t.warning = 0xFFF9E2AF
548
+ t.error = 0xFFF38BA8
549
+ t.border = 0xFF585B70
550
+ t.border_focus = 0xFFCBA6F7
551
+ t.bg_info = 0xFF89B4FA
552
+ t.bg_success = 0xFFA6E3A1
553
+ t.bg_warning = 0xFFF9E2AF
554
+ t.bg_danger = 0xFFF38BA8
555
+ t.text_on_info = 0xFF1E1E2E
556
+ t.text_on_success = 0xFF1E1E2E
557
+ t.text_on_warning = 0xFF1E1E2E
558
+ t.text_on_danger = 0xFF1E1E2E
559
+ t.hover_info = 0xFFA4C8FF
560
+ t.hover_success = 0xFFB9F0B4
561
+ t.hover_warning = 0xFFFFF0CC
562
+ t.hover_danger = 0xFFFFA0B8
563
+ t.hover_normal = 0xFFDEC0FF
564
+ t
565
+ end
566
+
567
+ end
@@ -0,0 +1,40 @@
1
+ module Kumiki
2
+ # Material Light theme
3
+
4
+ module_function
5
+
6
+ def material_theme
7
+ t = Theme.new
8
+ t.bg_canvas = 0xFFFEFEFE
9
+ t.bg_primary = 0xFFFFFFFF
10
+ t.bg_secondary = 0xFFF5F5F5
11
+ t.bg_overlay = 0xFFE8E8E8
12
+ t.text_primary = 0xFF1C1B1F
13
+ t.text_secondary = 0xFF757575
14
+ t.accent = 0xFF6200EE
15
+ t.info = 0xFF2196F3
16
+ t.success = 0xFF4CAF50
17
+ t.warning = 0xFFFF9800
18
+ t.error = 0xFFF44336
19
+ t.border = 0xFFE0E0E0
20
+ t.border_focus = 0xFF6200EE
21
+ t.bg_info = 0xFF2196F3
22
+ t.bg_success = 0xFF4CAF50
23
+ t.bg_warning = 0xFFFF9800
24
+ t.bg_danger = 0xFFF44336
25
+ t.text_on_info = 0xFFFFFFFF
26
+ t.text_on_success = 0xFFFFFFFF
27
+ t.text_on_warning = 0xFF1C1B1F
28
+ t.text_on_danger = 0xFFFFFFFF
29
+ t.hover_info = 0xFF42A5F5
30
+ t.hover_success = 0xFF66BB6A
31
+ t.hover_warning = 0xFFFFA726
32
+ t.hover_danger = 0xFFEF5350
33
+ t.hover_normal = 0xFFE0E0E0
34
+ t.scrollbar_bg = 0xFFE0E0E0
35
+ t.scrollbar_fg = 0xFFBDBDBD
36
+ t.bg_selected = 0x806200EE
37
+ t
38
+ end
39
+
40
+ end
@@ -0,0 +1,11 @@
1
+ module Kumiki
2
+ # Tokyo Night dark theme
3
+ # Default theme for kumiki
4
+
5
+ module_function
6
+
7
+ def tokyo_night_theme
8
+ Theme.new # Default values are already Tokyo Night
9
+ end
10
+
11
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kumiki
4
+ VERSION = "0.1.1"
5
+ end
@@ -0,0 +1,105 @@
1
+ module Kumiki
2
+ # Button widget - clickable button with label
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
+ @pad_top = 8.0
19
+ @pad_right = 16.0
20
+ @pad_bottom = 8.0
21
+ @pad_left = 16.0
22
+ end
23
+
24
+ def kind(k)
25
+ @kind_val = k
26
+ self
27
+ end
28
+
29
+ def on_click(&block)
30
+ @click_handler = block
31
+ self
32
+ end
33
+
34
+ def font_size(s)
35
+ @font_size_val = s
36
+ self
37
+ end
38
+
39
+ def bg(c)
40
+ @bg_color = c
41
+ @custom_bg = true
42
+ self
43
+ end
44
+
45
+ def text_color(c)
46
+ @text_color = c
47
+ @custom_text = true
48
+ self
49
+ end
50
+
51
+ def measure(painter)
52
+ tw = painter.measure_text_width(@label, Kumiki.theme.font_family, @font_size_val)
53
+ th = painter.measure_text_height(Kumiki.theme.font_family, @font_size_val)
54
+ Size.new(tw + @pad_left + @pad_right, th + @pad_top + @pad_bottom)
55
+ end
56
+
57
+ def redraw(painter, completely)
58
+ # Use theme colors based on kind, unless custom colors were set
59
+ if @custom_bg
60
+ bg_c = @hovered ? @hover_color : @bg_color
61
+ else
62
+ if @hovered
63
+ bg_c = Kumiki.theme.button_hover(@kind_val)
64
+ else
65
+ bg_c = Kumiki.theme.button_bg(@kind_val)
66
+ end
67
+ end
68
+ if @custom_text
69
+ tc = @text_color
70
+ else
71
+ tc = Kumiki.theme.button_text(@kind_val)
72
+ end
73
+
74
+ painter.fill_round_rect(0.0, 0.0, @width, @height, @radius, bg_c)
75
+ ascent = painter.get_text_ascent(Kumiki.theme.font_family, @font_size_val)
76
+ th = painter.measure_text_height(Kumiki.theme.font_family, @font_size_val)
77
+ tw = painter.measure_text_width(@label, Kumiki.theme.font_family, @font_size_val)
78
+ text_x = (@width - tw) / 2.0
79
+ text_y = (@height - th) / 2.0 + ascent
80
+ painter.draw_text(@label, text_x, text_y, Kumiki.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
104
+
105
+ end