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,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kumiki
4
+ class WebViewWidget < Widget
5
+ def initialize(url: nil, html: nil)
6
+ super()
7
+ @initial_url = url
8
+ @initial_html = html
9
+ @webview = nil
10
+ @last_bounds = nil
11
+ @ipc_handler = nil
12
+ @nav_handler = nil
13
+ set_width_policy(EXPANDING)
14
+ set_height_policy(EXPANDING)
15
+ end
16
+
17
+ def load_url(url)
18
+ @webview ? @webview.load_url(url) : (@initial_url = url; @initial_html = nil)
19
+ self
20
+ end
21
+
22
+ def load_html(html)
23
+ @webview ? @webview.load_html(html) : (@initial_html = html; @initial_url = nil)
24
+ self
25
+ end
26
+
27
+ def evaluate_script(js) = (@webview&.evaluate_script(js); self)
28
+ def reload = (@webview&.reload; self)
29
+ def zoom(factor) = (@webview&.zoom(factor.to_f); self)
30
+
31
+ def on_ipc_message(&block)
32
+ @ipc_handler = block
33
+ @webview&.on_ipc_message(&block)
34
+ self
35
+ end
36
+
37
+ def on_navigation(&block)
38
+ @nav_handler = block
39
+ @webview&.on_navigation(&block)
40
+ self
41
+ end
42
+
43
+ # Native WebView handles its own OS-level events; kumiki doesn't dispatch into it
44
+ def dispatch(_pos) = [nil, nil]
45
+
46
+ # Called by Tabs when this widget's tab becomes hidden/shown
47
+ def on_tab_hide = @webview&.set_visible(false)
48
+ def on_tab_show = (@last_bounds = nil; @webview&.set_visible(true))
49
+
50
+ def redraw(_painter, _completely)
51
+ _ensure_created
52
+ _sync_bounds
53
+ end
54
+
55
+ def measure(_painter) = Size.new(400.0, 300.0)
56
+
57
+ private
58
+
59
+ def _ensure_created
60
+ return if @webview
61
+ frame = App.current&.instance_variable_get(:@frame)
62
+ window = frame&.window
63
+ return unless window
64
+
65
+ opts = {}
66
+ opts[:url] = @initial_url if @initial_url
67
+ opts[:html] = @initial_html if @initial_html && !@initial_url
68
+ @webview = Ranma::WebView.new(window, **opts)
69
+ @webview.on_ipc_message(&@ipc_handler) if @ipc_handler
70
+ @webview.on_navigation(&@nav_handler) if @nav_handler
71
+ @webview.set_visible(true)
72
+ end
73
+
74
+ def _sync_bounds
75
+ return unless @webview
76
+ bounds = [get_x.to_i, get_y.to_i, get_width.to_i, get_height.to_i]
77
+ if bounds != @last_bounds
78
+ @last_bounds = bounds
79
+ @webview.set_bounds(*bounds)
80
+ end
81
+ end
82
+ end
83
+
84
+ def WebView(url: nil, html: nil)
85
+ WebViewWidget.new(url: url, html: html)
86
+ end
87
+ end
data/lib/kumiki.rb ADDED
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Kumiki (組木) - Reactive GUI framework for Ruby
4
+ #
5
+ # A declarative, component-based UI framework powered by SDL3 + Skia.
6
+ #
7
+ # Usage:
8
+ # require "kumiki"
9
+ # include Kumiki
10
+ #
11
+ # class MyApp < Component
12
+ # def initialize
13
+ # super
14
+ # @count = state(0)
15
+ # end
16
+ #
17
+ # def view
18
+ # column(padding: 16.0) {
19
+ # text "Count: #{@count}", font_size: 32.0
20
+ # button("Click me") { @count += 1 }
21
+ # }
22
+ # end
23
+ # end
24
+ #
25
+ # Kumiki.run("My App", 400, 300) { MyApp.new }
26
+
27
+ require_relative "kumiki/version"
28
+
29
+ module Kumiki
30
+ # Theme accessor with lazy initialization (default: Tokyo Night)
31
+ def self.theme
32
+ @theme ||= Theme.new
33
+ end
34
+
35
+ def self.theme=(t)
36
+ @theme = t
37
+ end
38
+
39
+ # Background clear color propagation (internal use)
40
+ def self._bg_clear_color
41
+ @_bg_clear_color || 0
42
+ end
43
+
44
+ def self._bg_clear_color=(v)
45
+ @_bg_clear_color = v
46
+ end
47
+
48
+ # When `include Kumiki` is used, also include the DSL
49
+ def self.included(base)
50
+ base.include(Kumiki::DSL)
51
+ end
52
+
53
+ # Convenience: run an app
54
+ def self.run(title, width, height, &block)
55
+ widget = block.call
56
+ frame = RanmaFrame.new(title, width, height)
57
+ app = App.new(frame, widget)
58
+ app.run
59
+ end
60
+ end
61
+
62
+ # Core
63
+ require_relative "kumiki/render_node"
64
+ require_relative "kumiki/core"
65
+ require_relative "kumiki/column"
66
+ require_relative "kumiki/row"
67
+ require_relative "kumiki/box"
68
+ require_relative "kumiki/spacer"
69
+ require_relative "kumiki/theme"
70
+ require_relative "kumiki/themes/tokyo_night"
71
+ require_relative "kumiki/themes/material"
72
+
73
+ # Widgets
74
+ require_relative "kumiki/widgets/text"
75
+ require_relative "kumiki/widgets/button"
76
+ require_relative "kumiki/widgets/divider"
77
+ require_relative "kumiki/widgets/container"
78
+ require_relative "kumiki/widgets/input"
79
+ require_relative "kumiki/widgets/multiline_input"
80
+ require_relative "kumiki/widgets/multiline_text"
81
+ require_relative "kumiki/widgets/checkbox"
82
+ require_relative "kumiki/widgets/radio_buttons"
83
+ require_relative "kumiki/widgets/switch"
84
+ require_relative "kumiki/widgets/slider"
85
+ require_relative "kumiki/widgets/progress_bar"
86
+ require_relative "kumiki/widgets/tabs"
87
+ require_relative "kumiki/widgets/data_table"
88
+ require_relative "kumiki/widgets/tree"
89
+ require_relative "kumiki/widgets/calendar"
90
+ require_relative "kumiki/widgets/modal"
91
+ require_relative "kumiki/widgets/image"
92
+ require_relative "kumiki/widgets/net_image"
93
+ require_relative "kumiki/widgets/webview"
94
+
95
+ # Markdown
96
+ require_relative "kumiki/markdown/ast"
97
+ require_relative "kumiki/markdown/theme"
98
+ require_relative "kumiki/markdown/parser"
99
+ require_relative "kumiki/markdown/mermaid/models"
100
+ require_relative "kumiki/markdown/mermaid/parser"
101
+ require_relative "kumiki/markdown/mermaid/layout"
102
+ require_relative "kumiki/markdown/mermaid/renderer"
103
+ require_relative "kumiki/markdown/renderer"
104
+ require_relative "kumiki/widgets/markdown"
105
+
106
+ # Charts
107
+ require_relative "kumiki/chart/chart_helpers"
108
+ require_relative "kumiki/chart/scales"
109
+ require_relative "kumiki/chart/base_chart"
110
+ require_relative "kumiki/chart/bar_chart"
111
+ require_relative "kumiki/chart/line_chart"
112
+ require_relative "kumiki/chart/pie_chart"
113
+ require_relative "kumiki/chart/scatter_chart"
114
+ require_relative "kumiki/chart/area_chart"
115
+ require_relative "kumiki/chart/stacked_bar_chart"
116
+ require_relative "kumiki/chart/gauge_chart"
117
+ require_relative "kumiki/chart/heatmap_chart"
118
+
119
+ # Animation
120
+ require_relative "kumiki/animation/easing"
121
+ require_relative "kumiki/animation/value_tween"
122
+ require_relative "kumiki/animation/animated_state"
123
+
124
+ # RanmaFrame (ranma GPU) — default frame backend
125
+ require_relative "kumiki/frame_ranma"
126
+ require_relative "kumiki/app"
127
+
128
+ # DSL
129
+ require_relative "kumiki/style"
130
+ require_relative "kumiki/dsl"
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kumiki
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Yasushi Itoh
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ranma
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ description: Kumiki is a declarative, reactive GUI framework for Ruby with a DSL-based
27
+ component system, powered by ranma (tao + Vello) for native GPU rendering.
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - LICENSE
33
+ - README.md
34
+ - lib/kumiki.rb
35
+ - lib/kumiki/animation/animated_state.rb
36
+ - lib/kumiki/animation/easing.rb
37
+ - lib/kumiki/animation/value_tween.rb
38
+ - lib/kumiki/app.rb
39
+ - lib/kumiki/box.rb
40
+ - lib/kumiki/chart/area_chart.rb
41
+ - lib/kumiki/chart/bar_chart.rb
42
+ - lib/kumiki/chart/base_chart.rb
43
+ - lib/kumiki/chart/chart_helpers.rb
44
+ - lib/kumiki/chart/gauge_chart.rb
45
+ - lib/kumiki/chart/heatmap_chart.rb
46
+ - lib/kumiki/chart/line_chart.rb
47
+ - lib/kumiki/chart/pie_chart.rb
48
+ - lib/kumiki/chart/scales.rb
49
+ - lib/kumiki/chart/scatter_chart.rb
50
+ - lib/kumiki/chart/stacked_bar_chart.rb
51
+ - lib/kumiki/column.rb
52
+ - lib/kumiki/core.rb
53
+ - lib/kumiki/dsl.rb
54
+ - lib/kumiki/frame_ranma.rb
55
+ - lib/kumiki/markdown/ast.rb
56
+ - lib/kumiki/markdown/mermaid/layout.rb
57
+ - lib/kumiki/markdown/mermaid/models.rb
58
+ - lib/kumiki/markdown/mermaid/parser.rb
59
+ - lib/kumiki/markdown/mermaid/renderer.rb
60
+ - lib/kumiki/markdown/parser.rb
61
+ - lib/kumiki/markdown/renderer.rb
62
+ - lib/kumiki/markdown/theme.rb
63
+ - lib/kumiki/render_node.rb
64
+ - lib/kumiki/row.rb
65
+ - lib/kumiki/spacer.rb
66
+ - lib/kumiki/style.rb
67
+ - lib/kumiki/theme.rb
68
+ - lib/kumiki/themes/material.rb
69
+ - lib/kumiki/themes/tokyo_night.rb
70
+ - lib/kumiki/version.rb
71
+ - lib/kumiki/widgets/button.rb
72
+ - lib/kumiki/widgets/calendar.rb
73
+ - lib/kumiki/widgets/checkbox.rb
74
+ - lib/kumiki/widgets/container.rb
75
+ - lib/kumiki/widgets/data_table.rb
76
+ - lib/kumiki/widgets/divider.rb
77
+ - lib/kumiki/widgets/image.rb
78
+ - lib/kumiki/widgets/input.rb
79
+ - lib/kumiki/widgets/markdown.rb
80
+ - lib/kumiki/widgets/modal.rb
81
+ - lib/kumiki/widgets/multiline_input.rb
82
+ - lib/kumiki/widgets/multiline_text.rb
83
+ - lib/kumiki/widgets/net_image.rb
84
+ - lib/kumiki/widgets/progress_bar.rb
85
+ - lib/kumiki/widgets/radio_buttons.rb
86
+ - lib/kumiki/widgets/slider.rb
87
+ - lib/kumiki/widgets/switch.rb
88
+ - lib/kumiki/widgets/tabs.rb
89
+ - lib/kumiki/widgets/text.rb
90
+ - lib/kumiki/widgets/tree.rb
91
+ - lib/kumiki/widgets/webview.rb
92
+ homepage: https://github.com/i2y/kumiki
93
+ licenses:
94
+ - MIT
95
+ metadata: {}
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 3.1.0
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubygems_version: 4.0.3
111
+ specification_version: 4
112
+ summary: A reactive GUI framework for Ruby (ranma + Vello)
113
+ test_files: []