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,119 @@
1
+ module Kumiki
2
+ # Checkbox widget - toggleable checkbox with label
3
+
4
+ class Checkbox < Widget
5
+ def initialize(label)
6
+ super()
7
+ @label = label
8
+ @checked = false
9
+ @on_toggle_handler = nil
10
+ @has_toggle_handler = false
11
+ @font_size_val = 14.0
12
+ @check_color = 0
13
+ @text_color_val = 0
14
+ @box_color = 0
15
+ @hover_color = 0
16
+ @custom_check = false
17
+ @custom_text = false
18
+ @hovered = false
19
+ end
20
+
21
+ def checked(v)
22
+ @checked = v
23
+ mark_dirty
24
+ self
25
+ end
26
+
27
+ def is_checked
28
+ @checked
29
+ end
30
+
31
+ def on_toggle(&block)
32
+ @on_toggle_handler = block
33
+ @has_toggle_handler = true
34
+ self
35
+ end
36
+
37
+ def font_size(s)
38
+ @font_size_val = s
39
+ self
40
+ end
41
+
42
+ def check_color(c)
43
+ @check_color = c
44
+ @custom_check = true
45
+ self
46
+ end
47
+
48
+ def text_color(c)
49
+ @text_color_val = c
50
+ @custom_text = true
51
+ self
52
+ end
53
+
54
+ def mouse_up(ev)
55
+ if @checked
56
+ @checked = false
57
+ else
58
+ @checked = true
59
+ end
60
+ mark_dirty
61
+ update
62
+ if @has_toggle_handler
63
+ @on_toggle_handler.call(@checked)
64
+ end
65
+ end
66
+
67
+ def mouse_over
68
+ @hovered = true
69
+ mark_dirty
70
+ update
71
+ end
72
+
73
+ def mouse_out
74
+ @hovered = false
75
+ mark_dirty
76
+ update
77
+ end
78
+
79
+ def measure(painter)
80
+ tw = painter.measure_text_width(@label, Kumiki.theme.font_family, @font_size_val)
81
+ th = painter.measure_text_height(Kumiki.theme.font_family, @font_size_val)
82
+ box_size = th
83
+ gap = 8.0
84
+ Size.new(box_size + gap + tw, th)
85
+ end
86
+
87
+ def redraw(painter, completely)
88
+ th = painter.measure_text_height(Kumiki.theme.font_family, @font_size_val)
89
+ ascent = painter.get_text_ascent(Kumiki.theme.font_family, @font_size_val)
90
+ box_size = th
91
+ gap = 8.0
92
+
93
+ # Resolve colors from theme
94
+ chk_c = @custom_check ? @check_color : Kumiki.theme.accent
95
+ txt_c = @custom_text ? @text_color_val : Kumiki.theme.text_primary
96
+ box_c = Kumiki.theme.border
97
+ hov_c = Kumiki.theme.bg_secondary
98
+
99
+ # Checkbox box border
100
+ border_c = @hovered ? hov_c : box_c
101
+ painter.stroke_rect(0.0, 0.0, box_size, box_size, border_c, 1.5)
102
+
103
+ # Checkmark fill (when checked)
104
+ if @checked
105
+ inset = 3.0
106
+ painter.fill_rect(inset, inset, box_size - inset * 2.0, box_size - inset * 2.0, chk_c)
107
+ end
108
+
109
+ # Label text
110
+ painter.draw_text(@label, box_size + gap, ascent, Kumiki.theme.font_family, @font_size_val, txt_c)
111
+ end
112
+ end
113
+
114
+ # Top-level helper
115
+ def Checkbox(label)
116
+ Checkbox.new(label)
117
+ end
118
+
119
+ end
@@ -0,0 +1,111 @@
1
+ module Kumiki
2
+ # Container widget - background + border + padding wrapper
3
+
4
+ class Container < Layout
5
+ def initialize(child)
6
+ super()
7
+ add(child) if child
8
+ @bg_color = 0
9
+ @border_color_val = 0
10
+ @custom_bg = false
11
+ @custom_border = false
12
+ @radius = 4.0
13
+ @border_width = 1.0
14
+ @pad_top = 12.0
15
+ @pad_right = 12.0
16
+ @pad_bottom = 12.0
17
+ @pad_left = 12.0
18
+ end
19
+
20
+ def bg_color(c)
21
+ @bg_color = c
22
+ @custom_bg = true
23
+ self
24
+ end
25
+
26
+ def border_color(c)
27
+ @border_color_val = c
28
+ @custom_border = true
29
+ self
30
+ end
31
+
32
+ def border_radius(r)
33
+ @radius = r
34
+ self
35
+ end
36
+
37
+ def padding(t, r, b, l)
38
+ @pad_top = t
39
+ @pad_right = r
40
+ @pad_bottom = b
41
+ @pad_left = l
42
+ self
43
+ end
44
+
45
+ def measure(painter)
46
+ if @children.length > 0
47
+ c = @children[0]
48
+ inner_w = @width - @pad_left - @pad_right
49
+ if inner_w < 0.0
50
+ inner_w = 0.0
51
+ end
52
+ # Set child width before measuring for word-wrap support
53
+ if c.get_width_policy != FIXED
54
+ c.resize_wh(inner_w, c.get_height)
55
+ end
56
+ cs = c.measure(painter)
57
+ Size.new(cs.width + @pad_left + @pad_right, cs.height + @pad_top + @pad_bottom)
58
+ else
59
+ Size.new(@pad_left + @pad_right, @pad_top + @pad_bottom)
60
+ end
61
+ end
62
+
63
+ def relocate_children(painter)
64
+ if @children.length > 0
65
+ c = @children[0]
66
+ c.move_xy(@x + @pad_left, @y + @pad_top)
67
+ inner_w = @width - @pad_left - @pad_right
68
+ inner_h = @height - @pad_top - @pad_bottom
69
+ if inner_w < 0.0
70
+ inner_w = 0.0
71
+ end
72
+ if inner_h < 0.0
73
+ inner_h = 0.0
74
+ end
75
+ c.resize_wh(inner_w, inner_h)
76
+ end
77
+ end
78
+
79
+ def redraw(painter, completely)
80
+ bg_c = 0
81
+ if @custom_bg
82
+ bg_c = @bg_color
83
+ else
84
+ bg_c = Kumiki.theme.bg_primary
85
+ end
86
+ if completely || is_dirty || is_subtree_dirty
87
+ brd_c = 0
88
+ if @custom_border
89
+ brd_c = @border_color_val
90
+ else
91
+ brd_c = Kumiki.theme.border
92
+ end
93
+ painter.fill_round_rect(0.0, 0.0, @width, @height, @radius, bg_c)
94
+ painter.stroke_round_rect(0.0, 0.0, @width, @height, @radius, brd_c, @border_width)
95
+ end
96
+ # Set bg_clear_color so redraw_children uses Container's background for child clearing
97
+ @bg_clear_color = bg_c
98
+ # Propagate to child layouts via global (save/restore for nesting)
99
+ saved_bg = Kumiki._bg_clear_color
100
+ Kumiki._bg_clear_color = bg_c
101
+ super(painter, completely)
102
+ Kumiki._bg_clear_color = saved_bg
103
+ end
104
+ end
105
+
106
+ # Top-level helper
107
+ def Container(child)
108
+ Container.new(child)
109
+ end
110
+
111
+ end