opal-vite 0.2.7 → 0.2.9

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.
@@ -0,0 +1,324 @@
1
+ # backtick_javascript: true
2
+
3
+ module OpalVite
4
+ module Concerns
5
+ module V1
6
+ # ReactHelpers - DSL helpers for React applications with Opal
7
+ # Reduces backtick JavaScript usage in React components
8
+ module ReactHelpers
9
+ # ===================
10
+ # React Access
11
+ # ===================
12
+
13
+ # Get React from window
14
+ def react
15
+ Native(`window.React`)
16
+ end
17
+
18
+ # Get ReactDOM from window
19
+ def react_dom
20
+ Native(`window.ReactDOM`)
21
+ end
22
+
23
+ # ===================
24
+ # Window/Global Access
25
+ # ===================
26
+
27
+ # Get a property from window
28
+ def window_get(key)
29
+ `window[#{key}]`
30
+ end
31
+
32
+ # Set a property on window
33
+ def window_set(key, value)
34
+ `window[#{key}] = #{value}`
35
+ end
36
+
37
+ # Delete a property from window
38
+ def window_delete(key)
39
+ `delete window[#{key}]`
40
+ end
41
+
42
+ # ===================
43
+ # Console
44
+ # ===================
45
+
46
+ # Console log
47
+ def console_log(*args)
48
+ `console.log(...#{args})`
49
+ end
50
+
51
+ # Console warn
52
+ def console_warn(*args)
53
+ `console.warn(...#{args})`
54
+ end
55
+
56
+ # Console error
57
+ def console_error(*args)
58
+ `console.error(...#{args})`
59
+ end
60
+
61
+ # ===================
62
+ # Alerts/Dialogs
63
+ # ===================
64
+
65
+ # Show alert dialog
66
+ def alert_message(message)
67
+ `alert(#{message})`
68
+ end
69
+
70
+ # Show confirm dialog
71
+ def confirm_message(message)
72
+ `confirm(#{message})`
73
+ end
74
+
75
+ # Show prompt dialog
76
+ def prompt_message(message, default_value = '')
77
+ `prompt(#{message}, #{default_value})`
78
+ end
79
+
80
+ # ===================
81
+ # DOM Events
82
+ # ===================
83
+
84
+ # Execute block when DOM is ready
85
+ def on_dom_ready(&block)
86
+ `document.addEventListener('DOMContentLoaded', #{block})`
87
+ end
88
+
89
+ # Add event listener to window
90
+ def on_window_event(event_name, &block)
91
+ `window.addEventListener(#{event_name}, #{block})`
92
+ end
93
+
94
+ # Remove event listener from window
95
+ def off_window_event(event_name, handler)
96
+ `window.removeEventListener(#{event_name}, #{handler})`
97
+ end
98
+
99
+ # ===================
100
+ # DOM Query
101
+ # ===================
102
+
103
+ # Query single element
104
+ def query(selector)
105
+ `document.querySelector(#{selector})`
106
+ end
107
+
108
+ # Query all elements
109
+ def query_all(selector)
110
+ `Array.from(document.querySelectorAll(#{selector}))`
111
+ end
112
+
113
+ # Get element by ID
114
+ def get_element_by_id(id)
115
+ `document.getElementById(#{id})`
116
+ end
117
+
118
+ # ===================
119
+ # DOM Manipulation
120
+ # ===================
121
+
122
+ # Create element
123
+ def create_element(tag)
124
+ `document.createElement(#{tag})`
125
+ end
126
+
127
+ # Set innerHTML
128
+ def set_html(element, html)
129
+ `#{element}.innerHTML = #{html}`
130
+ end
131
+
132
+ # Set textContent
133
+ def set_text(element, text)
134
+ `#{element}.textContent = #{text}`
135
+ end
136
+
137
+ # Add class to element
138
+ def add_class(element, *classes)
139
+ `#{element}.classList.add(...#{classes})`
140
+ end
141
+
142
+ # Remove class from element
143
+ def remove_class(element, *classes)
144
+ `#{element}.classList.remove(...#{classes})`
145
+ end
146
+
147
+ # ===================
148
+ # React Element Creation Helpers
149
+ # ===================
150
+
151
+ # Create React element (shorthand)
152
+ def el(type, props = nil, *children)
153
+ react.createElement(type, props, *children)
154
+ end
155
+
156
+ # Create div element
157
+ def div(props = nil, *children, &block)
158
+ if block_given?
159
+ react.createElement('div', props, block.call)
160
+ else
161
+ react.createElement('div', props, *children)
162
+ end
163
+ end
164
+
165
+ # Create span element
166
+ def span(props = nil, *children, &block)
167
+ if block_given?
168
+ react.createElement('span', props, block.call)
169
+ else
170
+ react.createElement('span', props, *children)
171
+ end
172
+ end
173
+
174
+ # Create button element
175
+ def button(props = nil, *children, &block)
176
+ if block_given?
177
+ react.createElement('button', props, block.call)
178
+ else
179
+ react.createElement('button', props, *children)
180
+ end
181
+ end
182
+
183
+ # Create p element
184
+ def paragraph(props = nil, *children, &block)
185
+ if block_given?
186
+ react.createElement('p', props, block.call)
187
+ else
188
+ react.createElement('p', props, *children)
189
+ end
190
+ end
191
+
192
+ # Create heading elements
193
+ def h1(props = nil, *children)
194
+ react.createElement('h1', props, *children)
195
+ end
196
+
197
+ def h2(props = nil, *children)
198
+ react.createElement('h2', props, *children)
199
+ end
200
+
201
+ def h3(props = nil, *children)
202
+ react.createElement('h3', props, *children)
203
+ end
204
+
205
+ # ===================
206
+ # Timing
207
+ # ===================
208
+
209
+ # Set timeout
210
+ def set_timeout(delay_ms, &block)
211
+ `setTimeout(#{block}, #{delay_ms})`
212
+ end
213
+
214
+ # Set interval
215
+ def set_interval(interval_ms, &block)
216
+ `setInterval(#{block}, #{interval_ms})`
217
+ end
218
+
219
+ # Clear timeout
220
+ def clear_timeout(timeout_id)
221
+ `clearTimeout(#{timeout_id})`
222
+ end
223
+
224
+ # Clear interval
225
+ def clear_interval(interval_id)
226
+ `clearInterval(#{interval_id})`
227
+ end
228
+
229
+ # ===================
230
+ # LocalStorage
231
+ # ===================
232
+
233
+ # Get from localStorage
234
+ def storage_get(key)
235
+ `localStorage.getItem(#{key})`
236
+ end
237
+
238
+ # Set to localStorage
239
+ def storage_set(key, value)
240
+ `localStorage.setItem(#{key}, #{value})`
241
+ end
242
+
243
+ # Remove from localStorage
244
+ def storage_remove(key)
245
+ `localStorage.removeItem(#{key})`
246
+ end
247
+
248
+ # ===================
249
+ # Fetch API
250
+ # ===================
251
+
252
+ # Fetch with promise (returns Native promise)
253
+ def fetch_url(url, options = nil)
254
+ if options
255
+ Native(`fetch(#{url}, #{options.to_n})`)
256
+ else
257
+ Native(`fetch(#{url})`)
258
+ end
259
+ end
260
+
261
+ # ===================
262
+ # JSON
263
+ # ===================
264
+
265
+ # Parse JSON string
266
+ def parse_json(json_string)
267
+ `JSON.parse(#{json_string})`
268
+ end
269
+
270
+ # Stringify to JSON
271
+ def to_json(object)
272
+ `JSON.stringify(#{object})`
273
+ end
274
+
275
+ # ===================
276
+ # Type Conversion
277
+ # ===================
278
+
279
+ # Parse string to integer (wrapper for JavaScript parseInt)
280
+ # @param value [String, Number] Value to parse
281
+ # @param radix [Integer] Radix (default: 10)
282
+ # @return [Integer, NaN] Parsed integer
283
+ def parse_int(value, radix = 10)
284
+ `parseInt(#{value}, #{radix})`
285
+ end
286
+
287
+ # Parse string to float (wrapper for JavaScript parseFloat)
288
+ # @param value [String, Number] Value to parse
289
+ # @return [Float, NaN] Parsed float
290
+ def parse_float(value)
291
+ `parseFloat(#{value})`
292
+ end
293
+
294
+ # Check if value is NaN
295
+ # @param value [Number] Value to check
296
+ # @return [Boolean] true if NaN
297
+ def is_nan?(value)
298
+ `Number.isNaN(#{value})`
299
+ end
300
+
301
+ # Parse integer with default value (returns default if NaN)
302
+ # @param value [String, Number] Value to parse
303
+ # @param default_value [Integer] Default value if parsing fails
304
+ # @return [Integer] Parsed integer or default
305
+ def parse_int_or(value, default_value = 0)
306
+ result = parse_int(value)
307
+ is_nan?(result) ? default_value : result
308
+ end
309
+
310
+ # Parse float with default value (returns default if NaN)
311
+ # @param value [String, Number] Value to parse
312
+ # @param default_value [Float] Default value if parsing fails
313
+ # @return [Float] Parsed float or default
314
+ def parse_float_or(value, default_value = 0.0)
315
+ result = parse_float(value)
316
+ is_nan?(result) ? default_value : result
317
+ end
318
+ end
319
+ end
320
+ end
321
+ end
322
+
323
+ # Alias for backward compatibility
324
+ ReactHelpers = OpalVite::Concerns::V1::ReactHelpers