opal-vite 0.2.8 → 0.2.11

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