zephyr_rb 1.0.1b → 1.0.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.
data/src/component.rb DELETED
@@ -1,132 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'js'
4
-
5
- module ZephyrWasm
6
- class Component
7
- class << self
8
- attr_accessor :tag_name
9
- attr_reader :observed_attrs
10
-
11
- def inherited(subclass)
12
- super
13
- subclass.instance_variable_set(:@observed_attrs, [])
14
- end
15
-
16
- def observed_attributes(*attrs)
17
- @observed_attrs ||= []
18
- @observed_attrs.concat(attrs.map(&:to_s))
19
- end
20
-
21
- def on_connect(&block)
22
- define_method(:on_connect_impl, &block)
23
- end
24
-
25
- def on_disconnect(&block)
26
- define_method(:on_disconnect_impl, &block)
27
- end
28
-
29
- def template(&block)
30
- @template_block = block
31
- end
32
-
33
- def get_template_block
34
- @template_block
35
- end
36
- end
37
-
38
- attr_reader :element, :signal, :state
39
-
40
- def initialize(element)
41
- @element = element
42
- @abort_controller = JS.global[:AbortController].new
43
- @signal = @abort_controller[:signal]
44
- @state = {}
45
- end
46
-
47
- def connected
48
- setup_observed_attributes
49
- on_connect_impl if respond_to?(:on_connect_impl)
50
- end
51
-
52
- def disconnected
53
- @abort_controller.call(:abort)
54
- on_disconnect_impl if respond_to?(:on_disconnect_impl)
55
- end
56
-
57
- def attribute_changed(name, old_value, new_value)
58
- @state[name] = new_value
59
- render if @element[:isConnected]
60
- end
61
-
62
- def render
63
- template_block = self.class.get_template_block
64
- return unless template_block
65
-
66
- begin
67
- builder = DOMBuilder.new(@element, self)
68
- # Use instance_exec to pass builder while maintaining component context
69
- instance_exec(builder, &template_block)
70
- builder.apply
71
- rescue => e
72
- puts "Render error: #{e.message}"
73
- puts e.backtrace.first(5).join("\n")
74
- end
75
- end
76
-
77
- # State management
78
- def set_state(key, value)
79
- @state[key] = value
80
- render
81
- end
82
-
83
- # Attribute helpers
84
- def [](key)
85
- @element.call(:getAttribute, key.to_s)&.to_s
86
- end
87
-
88
- def []=(key, value)
89
- if value.nil?
90
- @element.call(:removeAttribute, key.to_s)
91
- else
92
- @element.call(:setAttribute, key.to_s, value.to_s)
93
- end
94
- end
95
-
96
- # Event helpers
97
- def on(event_name, selector = nil, &block)
98
- handler = ->(event) {
99
- target = event[:target]
100
-
101
- if selector
102
- # Event delegation
103
- element = target.call(:closest, selector)
104
- block.call(event) if element
105
- else
106
- block.call(event)
107
- end
108
- }.to_js
109
-
110
- options = { signal: @signal }.to_js
111
- @element.call(:addEventListener, event_name.to_s, handler, options)
112
- end
113
-
114
- # DOM query helpers
115
- def query(selector)
116
- @element.call(:querySelector, selector)
117
- end
118
-
119
- def query_all(selector)
120
- @element.call(:querySelectorAll, selector)
121
- end
122
-
123
- private
124
-
125
- def setup_observed_attributes
126
- self.class.observed_attrs&.each do |attr|
127
- value = @element.call(:getAttribute, attr)
128
- @state[attr] = value.to_s if value
129
- end
130
- end
131
- end
132
- end