stimeo-ui 0.1.0.pre.alpha.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 (85) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +72 -0
  4. data/dist/controllers/accordion_controller.js +76 -0
  5. data/dist/controllers/announcer_controller.js +184 -0
  6. data/dist/controllers/aspect_ratio_controller.js +36 -0
  7. data/dist/controllers/auto_submit_controller.js +147 -0
  8. data/dist/controllers/avatar_controller.js +66 -0
  9. data/dist/controllers/breadcrumb_controller.js +123 -0
  10. data/dist/controllers/bulk_select_controller.js +104 -0
  11. data/dist/controllers/calendar_controller.js +394 -0
  12. data/dist/controllers/character_counter_controller.js +179 -0
  13. data/dist/controllers/checkbox_controller.js +73 -0
  14. data/dist/controllers/combobox_controller.js +186 -0
  15. data/dist/controllers/command_palette_controller.js +381 -0
  16. data/dist/controllers/conditional_fields_controller.js +112 -0
  17. data/dist/controllers/confirm_controller.js +276 -0
  18. data/dist/controllers/context_menu_controller.js +112 -0
  19. data/dist/controllers/countdown_controller.js +202 -0
  20. data/dist/controllers/dialog_controller.js +207 -0
  21. data/dist/controllers/direct_upload_controller.js +212 -0
  22. data/dist/controllers/dirty_form_controller.js +128 -0
  23. data/dist/controllers/dropdown_controller.js +66 -0
  24. data/dist/controllers/empty_state_controller.js +67 -0
  25. data/dist/controllers/flash_controller.js +221 -0
  26. data/dist/controllers/focus_controller.js +216 -0
  27. data/dist/controllers/form_field_controller.js +154 -0
  28. data/dist/controllers/form_validation_controller.js +202 -0
  29. data/dist/controllers/frame_loading_controller.js +177 -0
  30. data/dist/controllers/highlight_controller.js +107 -0
  31. data/dist/controllers/hover_card_controller.js +165 -0
  32. data/dist/controllers/idle_controller.js +141 -0
  33. data/dist/controllers/input_mask_controller.js +166 -0
  34. data/dist/controllers/lazy_frame_controller.js +68 -0
  35. data/dist/controllers/listbox_controller.js +256 -0
  36. data/dist/controllers/local_time_controller.js +81 -0
  37. data/dist/controllers/menu_controller.js +134 -0
  38. data/dist/controllers/meter_controller.js +96 -0
  39. data/dist/controllers/nested_form_controller.js +131 -0
  40. data/dist/controllers/network_status_controller.js +126 -0
  41. data/dist/controllers/number_input_controller.js +306 -0
  42. data/dist/controllers/otp_controller.js +201 -0
  43. data/dist/controllers/overflow_indicator_controller.js +169 -0
  44. data/dist/controllers/overflow_menu_controller.js +274 -0
  45. data/dist/controllers/pagination_controller.js +89 -0
  46. data/dist/controllers/password_strength_controller.js +175 -0
  47. data/dist/controllers/persist_controller.js +259 -0
  48. data/dist/controllers/popover_controller.js +94 -0
  49. data/dist/controllers/portal_controller.js +63 -0
  50. data/dist/controllers/preview_guard_controller.js +69 -0
  51. data/dist/controllers/progress_controller.js +93 -0
  52. data/dist/controllers/radio_group_controller.js +128 -0
  53. data/dist/controllers/rating_controller.js +179 -0
  54. data/dist/controllers/relative_time_controller.js +129 -0
  55. data/dist/controllers/reset_before_cache_controller.js +62 -0
  56. data/dist/controllers/resizable_controller.js +163 -0
  57. data/dist/controllers/roving_controller.js +116 -0
  58. data/dist/controllers/scroll_area_controller.js +183 -0
  59. data/dist/controllers/scroll_visibility_controller.js +103 -0
  60. data/dist/controllers/scrollspy_controller.js +171 -0
  61. data/dist/controllers/skeleton_controller.js +125 -0
  62. data/dist/controllers/slider_controller.js +109 -0
  63. data/dist/controllers/spinner_controller.js +164 -0
  64. data/dist/controllers/step_indicator_controller.js +55 -0
  65. data/dist/controllers/stepper_controller.js +78 -0
  66. data/dist/controllers/stick_to_bottom_controller.js +100 -0
  67. data/dist/controllers/sticky_observer_controller.js +53 -0
  68. data/dist/controllers/submit_once_controller.js +206 -0
  69. data/dist/controllers/switch_controller.js +50 -0
  70. data/dist/controllers/tabs_controller.js +63 -0
  71. data/dist/controllers/textarea_autosize_controller.js +72 -0
  72. data/dist/controllers/theme_controller.js +154 -0
  73. data/dist/controllers/toast_controller.js +310 -0
  74. data/dist/controllers/toggle_group_controller.js +130 -0
  75. data/dist/controllers/toolbar_controller.js +113 -0
  76. data/dist/controllers/tooltip_controller.js +165 -0
  77. data/dist/controllers/transition_controller.js +203 -0
  78. data/dist/index.js +12241 -0
  79. data/dist/positioning/index.js +145 -0
  80. data/lib/generators/stimeo/install/install_generator.rb +114 -0
  81. data/lib/generators/stimeo/install/templates/stimeo.js +12 -0
  82. data/lib/stimeo/ui/version.rb +10 -0
  83. data/lib/stimeo/ui.rb +19 -0
  84. data/lib/stimeo-ui.rb +4 -0
  85. metadata +152 -0
@@ -0,0 +1,145 @@
1
+ import { computePosition, autoUpdate, offset, flip, shift } from '@floating-ui/dom';
2
+ import { Controller } from '@hotwired/stimulus';
3
+
4
+ // src/positioning/index.ts
5
+ var AnchoredController = class extends Controller {
6
+ static targets = ["anchor", "floating"];
7
+ static values = {
8
+ placement: { type: String, default: "bottom" },
9
+ offset: { type: Number, default: 0 },
10
+ flip: { type: Boolean, default: true },
11
+ shift: { type: Boolean, default: true },
12
+ padding: { type: Number, default: 0 },
13
+ strategy: { type: String, default: "absolute" },
14
+ active: { type: Boolean, default: true }
15
+ };
16
+ static events = ["position"];
17
+ /** `autoUpdate` cleanup while tracking; `null` when detached. */
18
+ #stop = null;
19
+ /** True between connect and disconnect (Stimulus may fire value callbacks before connect). */
20
+ #connected = false;
21
+ /** Serialized options of the live observer, or `null` when detached — see {@link #sync}. */
22
+ #appliedKey = null;
23
+ connect() {
24
+ this.#connected = true;
25
+ this.#sync();
26
+ }
27
+ disconnect() {
28
+ this.#connected = false;
29
+ this.#sync();
30
+ }
31
+ // Every value change (active or an option) re-syncs. `#sync` is idempotent and
32
+ // order-independent, so no Value has to be declared in a particular position.
33
+ activeValueChanged() {
34
+ this.#sync();
35
+ }
36
+ placementValueChanged() {
37
+ this.#sync();
38
+ }
39
+ offsetValueChanged() {
40
+ this.#sync();
41
+ }
42
+ flipValueChanged() {
43
+ this.#sync();
44
+ }
45
+ shiftValueChanged() {
46
+ this.#sync();
47
+ }
48
+ paddingValueChanged() {
49
+ this.#sync();
50
+ }
51
+ strategyValueChanged() {
52
+ this.#sync();
53
+ }
54
+ /** Current Values mapped to the positioning engine's options. */
55
+ get #options() {
56
+ return {
57
+ placement: this.placementValue,
58
+ offset: this.offsetValue,
59
+ flip: this.flipValue,
60
+ shift: this.shiftValue,
61
+ padding: this.paddingValue,
62
+ // Narrow the free-form Value to the engine's union; anything but "fixed"
63
+ // falls back to the default "absolute".
64
+ strategy: this.strategyValue === "fixed" ? "fixed" : "absolute"
65
+ };
66
+ }
67
+ /**
68
+ * Reconciles the live observer with the desired state — track iff connected,
69
+ * `active`, and both targets exist — re-attaching only when that state or the
70
+ * options actually changed. Stimulus fires the value-changed callbacks on
71
+ * connect in declaration order and may run them before or after `connect()`;
72
+ * keying on the applied options collapses that whole burst (in any order) to a
73
+ * single attach, while an option change at runtime re-attaches exactly once. So
74
+ * correctness never depends on `active` being declared last.
75
+ */
76
+ #sync() {
77
+ const shouldTrack = this.#connected && this.activeValue && this.hasAnchorTarget && this.hasFloatingTarget;
78
+ const key = shouldTrack ? JSON.stringify(this.#options) : null;
79
+ if (key === this.#appliedKey) return;
80
+ this.#detach();
81
+ this.#appliedKey = key;
82
+ if (shouldTrack) this.#attach();
83
+ }
84
+ #attach() {
85
+ this.#stop = attachPositioning(
86
+ this.anchorTarget,
87
+ this.floatingTarget,
88
+ this.#options,
89
+ (result) => this.#onComputed(result)
90
+ );
91
+ }
92
+ #detach() {
93
+ this.#stop?.();
94
+ this.#stop = null;
95
+ }
96
+ /** Reflects the resolved side onto the CSS hook and announces the placement. */
97
+ #onComputed(result) {
98
+ this.floatingTarget.setAttribute("data-anchored-placement", result.placement);
99
+ this.dispatch("position", {
100
+ detail: { placement: result.placement, x: result.x, y: result.y }
101
+ });
102
+ }
103
+ };
104
+
105
+ // src/positioning/index.ts
106
+ function buildMiddleware(options) {
107
+ const padding = options.padding ?? 0;
108
+ const middleware = [];
109
+ if (options.offset) middleware.push(offset(options.offset));
110
+ if (options.flip !== false) middleware.push(flip({ padding }));
111
+ if (options.shift !== false) middleware.push(shift({ padding }));
112
+ return middleware;
113
+ }
114
+ async function position(anchor, floating, options = {}) {
115
+ const strategy = options.strategy ?? "absolute";
116
+ const config = {
117
+ placement: options.placement ?? "bottom",
118
+ middleware: buildMiddleware(options),
119
+ strategy
120
+ };
121
+ const { x, y, placement } = await computePosition(anchor, floating, config);
122
+ Object.assign(floating.style, {
123
+ position: strategy,
124
+ left: `${x}px`,
125
+ top: `${y}px`
126
+ });
127
+ return { x, y, placement };
128
+ }
129
+ function attachPositioning(anchor, floating, options = {}, onComputed) {
130
+ return autoUpdate(anchor, floating, () => {
131
+ void position(anchor, floating, options).then((result) => onComputed?.(result));
132
+ });
133
+ }
134
+ var positioningControllers = {
135
+ "stimeo--anchored": AnchoredController
136
+ };
137
+ function registerPositioning(application) {
138
+ for (const [identifier, controller] of Object.entries(positioningControllers)) {
139
+ application.register(identifier, controller);
140
+ }
141
+ }
142
+
143
+ export { AnchoredController, attachPositioning, position, positioningControllers, registerPositioning };
144
+ //# sourceMappingURL=index.js.map
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "pathname"
5
+ require "rails/generators/base"
6
+ require "stimeo/ui"
7
+
8
+ module Stimeo
9
+ module Generators
10
+ # `bin/rails generate stimeo:install`
11
+ #
12
+ # Sets up an importmap-rails app to use Stimeo UI without npm:
13
+ # 1. vendors the gem's prebuilt JS into vendor/javascript/stimeo/
14
+ # 2. pins "stimeo-ui" in config/importmap.rb
15
+ # 3. registers every stimeo--* controller with the app's Stimulus
16
+ # application (app/javascript/controllers/stimeo.js)
17
+ #
18
+ # Re-running is safe: the vendor copy is refreshed in place, while pins
19
+ # and imports are only appended when missing — so after a gem update you
20
+ # just run the generator again to pick up the new JS.
21
+ class InstallGenerator < Rails::Generators::Base
22
+ source_root File.expand_path("templates", __dir__)
23
+
24
+ VENDOR_DIR = "vendor/javascript/stimeo"
25
+
26
+ def copy_dist
27
+ source = Pathname.new(Stimeo::UI.dist_dir)
28
+ vendor = destination_pathname.join(VENDOR_DIR)
29
+ # Refresh: wipe the vendored copy first so files removed/renamed in a
30
+ # newer gem release don't linger here after re-running the generator.
31
+ FileUtils.rm_rf(vendor)
32
+ Dir[source.join("**/*.js").to_s].each do |file|
33
+ relative = Pathname.new(file).relative_path_from(source)
34
+ # The inspector CLI is a Node tool, not browser code — keep it out
35
+ # of the asset path (use the npm package for `stimeo check`).
36
+ next if relative.to_s.start_with?("inspector/")
37
+
38
+ target = vendor.join(relative)
39
+ FileUtils.mkdir_p(target.dirname)
40
+ FileUtils.cp(file, target)
41
+ end
42
+ say_status :vendor, "#{VENDOR_DIR} (prebuilt JS from the stimeo-ui gem)"
43
+ end
44
+
45
+ def pin_importmap
46
+ importmap = destination_pathname.join("config/importmap.rb")
47
+ unless importmap.exist?
48
+ say_status :skip, "config/importmap.rb not found — this generator targets " \
49
+ "importmap-rails; with a JS bundler use `npm install stimeo-ui` " \
50
+ "instead (see the README)", :yellow
51
+ return
52
+ end
53
+
54
+ if importmap.read.include?('pin "stimeo-ui"')
55
+ say_status :identical, "config/importmap.rb (stimeo-ui already pinned)", :blue
56
+ else
57
+ append_to_file "config/importmap.rb", <<~RUBY
58
+
59
+ # Stimeo UI (vendored by `rails g stimeo:install`)
60
+ pin "stimeo-ui", to: "stimeo/index.js"
61
+ # Opt-in positioning module — also pin @floating-ui/dom if you enable it:
62
+ # pin "stimeo-ui/positioning", to: "stimeo/positioning/index.js"
63
+ RUBY
64
+ end
65
+ end
66
+
67
+ def register_controllers
68
+ # Only create it the first time. The file is "safe to edit"; re-running
69
+ # the generator must not clobber a user's customised registration.
70
+ registration = destination_pathname.join("app/javascript/controllers/stimeo.js")
71
+ if registration.exist?
72
+ say_status :identical, "app/javascript/controllers/stimeo.js (kept your edits)", :blue
73
+ else
74
+ copy_file "stimeo.js", "app/javascript/controllers/stimeo.js"
75
+ end
76
+
77
+ index = destination_pathname.join("app/javascript/controllers/index.js")
78
+ if !index.exist?
79
+ say_status :action_required, 'add `import "controllers/stimeo"` wherever your ' \
80
+ "Stimulus application boots", :yellow
81
+ elsif index.read.include?("controllers/stimeo")
82
+ say_status :identical, "controllers/index.js (already imports controllers/stimeo)", :blue
83
+ else
84
+ append_to_file "app/javascript/controllers/index.js", <<~JS
85
+ import "controllers/stimeo"
86
+ JS
87
+ end
88
+ end
89
+
90
+ def show_next_steps
91
+ say <<~MSG
92
+
93
+ Stimeo UI is installed. Drive components from HTML alone, e.g.:
94
+
95
+ <div data-controller="stimeo--dropdown">
96
+ <button data-stimeo--dropdown-target="trigger"
97
+ data-action="click->stimeo--dropdown#toggle">Menu</button>
98
+ <div data-stimeo--dropdown-target="menu" hidden>...</div>
99
+ </div>
100
+
101
+ Docs: https://github.com/taiyaky/stimeo-ui
102
+ MSG
103
+ end
104
+
105
+ private
106
+
107
+ # Generator actions (copy_file/append_to_file) already resolve against
108
+ # destination_root; this helper is for the direct file checks above.
109
+ def destination_pathname
110
+ Pathname.new(destination_root)
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,12 @@
1
+ // Registers every stimeo--* controller with the app's Stimulus application.
2
+ // Generated by `rails g stimeo:install`. Safe to edit.
3
+ //
4
+ // To cherry-pick instead of registering all controllers, import them
5
+ // individually from "stimeo-ui/controllers/<name>" and register under your own
6
+ // identifiers. Note: with a JS bundler this works as-is; with importmap-rails
7
+ // each "stimeo-ui/controllers/<name>" needs its own pin (this generator only
8
+ // pins the "stimeo-ui" entrypoint), so add those pins to config/importmap.rb.
9
+ import { application } from "controllers/application";
10
+ import { registerStimeo } from "stimeo-ui";
11
+
12
+ registerStimeo(application);
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stimeo
4
+ module UI
5
+ # Kept in lockstep with package.json: npm `0.1.0-alpha.1` ⇔ gem
6
+ # `0.1.0.pre.alpha.1` (RubyGems forbids dashes). Bump both together —
7
+ # see RELEASING.md for the synchronized release procedure.
8
+ VERSION = "0.1.0.pre.alpha.1"
9
+ end
10
+ end
data/lib/stimeo/ui.rb ADDED
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "ui/version"
4
+
5
+ module Stimeo
6
+ # The stimeo-ui gem is distribution only: it bundles the prebuilt JS
7
+ # (dist/, identical to the npm package) and the `stimeo:install`
8
+ # generator that vendors it into a Rails app. All behavior lives in
9
+ # the JS; there is no Ruby runtime component.
10
+ module UI
11
+ # Gem root — inside the packaged gem, dist/ sits alongside lib/.
12
+ ROOT = File.expand_path("../..", __dir__)
13
+
14
+ # The prebuilt JS payload shipped inside the gem.
15
+ def self.dist_dir
16
+ File.join(ROOT, "dist")
17
+ end
18
+ end
19
+ end
data/lib/stimeo-ui.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Entry point matching the gem name (`require "stimeo-ui"`).
4
+ require_relative "stimeo/ui"
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stimeo-ui
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.pre.alpha.1
5
+ platform: ruby
6
+ authors:
7
+ - Stimeo Labs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-06-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '7.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '9'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '7.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '9'
33
+ description: 'Behavior-only, accessible UI primitives for Rails: WAI-ARIA state, keyboard
34
+ interaction, focus management and Turbo resilience as data-attribute-driven Stimulus
35
+ controllers, with no CSS. Ships the prebuilt stimeo-ui JS and a `stimeo:install`
36
+ generator that vendors it into an importmap-rails app.'
37
+ email:
38
+ executables: []
39
+ extensions: []
40
+ extra_rdoc_files: []
41
+ files:
42
+ - LICENSE
43
+ - README.md
44
+ - dist/controllers/accordion_controller.js
45
+ - dist/controllers/announcer_controller.js
46
+ - dist/controllers/aspect_ratio_controller.js
47
+ - dist/controllers/auto_submit_controller.js
48
+ - dist/controllers/avatar_controller.js
49
+ - dist/controllers/breadcrumb_controller.js
50
+ - dist/controllers/bulk_select_controller.js
51
+ - dist/controllers/calendar_controller.js
52
+ - dist/controllers/character_counter_controller.js
53
+ - dist/controllers/checkbox_controller.js
54
+ - dist/controllers/combobox_controller.js
55
+ - dist/controllers/command_palette_controller.js
56
+ - dist/controllers/conditional_fields_controller.js
57
+ - dist/controllers/confirm_controller.js
58
+ - dist/controllers/context_menu_controller.js
59
+ - dist/controllers/countdown_controller.js
60
+ - dist/controllers/dialog_controller.js
61
+ - dist/controllers/direct_upload_controller.js
62
+ - dist/controllers/dirty_form_controller.js
63
+ - dist/controllers/dropdown_controller.js
64
+ - dist/controllers/empty_state_controller.js
65
+ - dist/controllers/flash_controller.js
66
+ - dist/controllers/focus_controller.js
67
+ - dist/controllers/form_field_controller.js
68
+ - dist/controllers/form_validation_controller.js
69
+ - dist/controllers/frame_loading_controller.js
70
+ - dist/controllers/highlight_controller.js
71
+ - dist/controllers/hover_card_controller.js
72
+ - dist/controllers/idle_controller.js
73
+ - dist/controllers/input_mask_controller.js
74
+ - dist/controllers/lazy_frame_controller.js
75
+ - dist/controllers/listbox_controller.js
76
+ - dist/controllers/local_time_controller.js
77
+ - dist/controllers/menu_controller.js
78
+ - dist/controllers/meter_controller.js
79
+ - dist/controllers/nested_form_controller.js
80
+ - dist/controllers/network_status_controller.js
81
+ - dist/controllers/number_input_controller.js
82
+ - dist/controllers/otp_controller.js
83
+ - dist/controllers/overflow_indicator_controller.js
84
+ - dist/controllers/overflow_menu_controller.js
85
+ - dist/controllers/pagination_controller.js
86
+ - dist/controllers/password_strength_controller.js
87
+ - dist/controllers/persist_controller.js
88
+ - dist/controllers/popover_controller.js
89
+ - dist/controllers/portal_controller.js
90
+ - dist/controllers/preview_guard_controller.js
91
+ - dist/controllers/progress_controller.js
92
+ - dist/controllers/radio_group_controller.js
93
+ - dist/controllers/rating_controller.js
94
+ - dist/controllers/relative_time_controller.js
95
+ - dist/controllers/reset_before_cache_controller.js
96
+ - dist/controllers/resizable_controller.js
97
+ - dist/controllers/roving_controller.js
98
+ - dist/controllers/scroll_area_controller.js
99
+ - dist/controllers/scroll_visibility_controller.js
100
+ - dist/controllers/scrollspy_controller.js
101
+ - dist/controllers/skeleton_controller.js
102
+ - dist/controllers/slider_controller.js
103
+ - dist/controllers/spinner_controller.js
104
+ - dist/controllers/step_indicator_controller.js
105
+ - dist/controllers/stepper_controller.js
106
+ - dist/controllers/stick_to_bottom_controller.js
107
+ - dist/controllers/sticky_observer_controller.js
108
+ - dist/controllers/submit_once_controller.js
109
+ - dist/controllers/switch_controller.js
110
+ - dist/controllers/tabs_controller.js
111
+ - dist/controllers/textarea_autosize_controller.js
112
+ - dist/controllers/theme_controller.js
113
+ - dist/controllers/toast_controller.js
114
+ - dist/controllers/toggle_group_controller.js
115
+ - dist/controllers/toolbar_controller.js
116
+ - dist/controllers/tooltip_controller.js
117
+ - dist/controllers/transition_controller.js
118
+ - dist/index.js
119
+ - dist/positioning/index.js
120
+ - lib/generators/stimeo/install/install_generator.rb
121
+ - lib/generators/stimeo/install/templates/stimeo.js
122
+ - lib/stimeo-ui.rb
123
+ - lib/stimeo/ui.rb
124
+ - lib/stimeo/ui/version.rb
125
+ homepage: https://github.com/taiyaky/stimeo-ui
126
+ licenses:
127
+ - MIT
128
+ metadata:
129
+ source_code_uri: https://github.com/taiyaky/stimeo-ui
130
+ bug_tracker_uri: https://github.com/taiyaky/stimeo-ui/issues
131
+ changelog_uri: https://github.com/taiyaky/stimeo-ui/releases
132
+ rubygems_mfa_required: 'true'
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '3.1'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubygems_version: 3.5.22
149
+ signing_key:
150
+ specification_version: 4
151
+ summary: Headless Stimulus UI framework for Ruby on Rails.
152
+ test_files: []