senren-ui 0.1.0

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 (182) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +33 -0
  3. data/CONTRIBUTING.md +63 -0
  4. data/LICENSE +21 -0
  5. data/README.md +135 -0
  6. data/Rakefile +22 -0
  7. data/docs/visual_style.md +51 -0
  8. data/lib/generators/senren/component/component_generator.rb +62 -0
  9. data/lib/generators/senren/component/templates/component.html.erb.tt +3 -0
  10. data/lib/generators/senren/component/templates/component.rb.tt +13 -0
  11. data/lib/generators/senren/component/templates/component_test.rb.tt +16 -0
  12. data/lib/generators/senren/component/templates/controller.js.tt +23 -0
  13. data/lib/generators/senren/component/templates/system_test.rb.tt +7 -0
  14. data/lib/generators/senren/install/install_generator.rb +67 -0
  15. data/lib/generators/senren/install/templates/base_component.rb.tt +45 -0
  16. data/lib/generators/senren/install/templates/conventions.md.tt +66 -0
  17. data/lib/generators/senren/install/templates/installed_components.yml.tt +4 -0
  18. data/lib/generators/senren/install/templates/senren.css.tt +164 -0
  19. data/lib/senren/rails/component_copier.rb +111 -0
  20. data/lib/senren/rails/doctor.rb +86 -0
  21. data/lib/senren/rails/engine.rb +16 -0
  22. data/lib/senren/rails/host_paths.rb +36 -0
  23. data/lib/senren/rails/installer.rb +83 -0
  24. data/lib/senren/rails/llms_writer.rb +149 -0
  25. data/lib/senren/rails/registry.rb +161 -0
  26. data/lib/senren/rails/skill_writer.rb +166 -0
  27. data/lib/senren/rails/version.rb +7 -0
  28. data/lib/senren/rails.rb +39 -0
  29. data/lib/tasks/senren.rake +74 -0
  30. data/registry/components.yml +1053 -0
  31. data/registry/groups.yml +25 -0
  32. data/registry/recipes.yml +79 -0
  33. data/templates/components/accordion/accordion_component.html.erb +16 -0
  34. data/templates/components/accordion/accordion_component.rb +31 -0
  35. data/templates/components/activity_feed/activity_feed_component.html.erb +22 -0
  36. data/templates/components/activity_feed/activity_feed_component.rb +19 -0
  37. data/templates/components/alert/alert_component.html.erb +9 -0
  38. data/templates/components/alert/alert_component.rb +18 -0
  39. data/templates/components/alert_dialog/alert_dialog_component.html.erb +34 -0
  40. data/templates/components/alert_dialog/alert_dialog_component.rb +21 -0
  41. data/templates/components/api_key_field/api_key_field_component.html.erb +13 -0
  42. data/templates/components/api_key_field/api_key_field_component.rb +20 -0
  43. data/templates/components/app_shell/app_shell_component.html.erb +28 -0
  44. data/templates/components/app_shell/app_shell_component.rb +24 -0
  45. data/templates/components/aspect_ratio/aspect_ratio_component.html.erb +3 -0
  46. data/templates/components/aspect_ratio/aspect_ratio_component.rb +14 -0
  47. data/templates/components/avatar/avatar_component.html.erb +27 -0
  48. data/templates/components/avatar/avatar_component.rb +30 -0
  49. data/templates/components/badge/badge_component.html.erb +1 -0
  50. data/templates/components/badge/badge_component.rb +16 -0
  51. data/templates/components/billing_plan_card/billing_plan_card_component.html.erb +28 -0
  52. data/templates/components/billing_plan_card/billing_plan_card_component.rb +27 -0
  53. data/templates/components/breadcrumb/breadcrumb_component.html.erb +23 -0
  54. data/templates/components/breadcrumb/breadcrumb_component.rb +30 -0
  55. data/templates/components/bulk_action_bar/bulk_action_bar_component.html.erb +12 -0
  56. data/templates/components/bulk_action_bar/bulk_action_bar_component.rb +24 -0
  57. data/templates/components/button/button_component.html.erb +6 -0
  58. data/templates/components/button/button_component.rb +29 -0
  59. data/templates/components/calendar/calendar_component.html.erb +21 -0
  60. data/templates/components/calendar/calendar_component.rb +30 -0
  61. data/templates/components/card/card_component.html.erb +13 -0
  62. data/templates/components/card/card_component.rb +17 -0
  63. data/templates/components/carousel/carousel_component.html.erb +68 -0
  64. data/templates/components/carousel/carousel_component.rb +34 -0
  65. data/templates/components/checkbox/checkbox_component.html.erb +8 -0
  66. data/templates/components/checkbox/checkbox_component.rb +19 -0
  67. data/templates/components/checkbox_group/checkbox_group_component.html.erb +10 -0
  68. data/templates/components/checkbox_group/checkbox_group_component.rb +30 -0
  69. data/templates/components/clipboard/clipboard_component.html.erb +7 -0
  70. data/templates/components/clipboard/clipboard_component.rb +17 -0
  71. data/templates/components/codeblock/codeblock_component.html.erb +11 -0
  72. data/templates/components/codeblock/codeblock_component.rb +31 -0
  73. data/templates/components/collapsible/collapsible_component.html.erb +9 -0
  74. data/templates/components/collapsible/collapsible_component.rb +19 -0
  75. data/templates/components/combobox/combobox_component.html.erb +19 -0
  76. data/templates/components/combobox/combobox_component.rb +38 -0
  77. data/templates/components/command/command_component.html.erb +22 -0
  78. data/templates/components/command/command_component.rb +38 -0
  79. data/templates/components/context_menu/context_menu_component.html.erb +11 -0
  80. data/templates/components/context_menu/context_menu_component.rb +11 -0
  81. data/templates/components/data_table/data_table_component.html.erb +50 -0
  82. data/templates/components/data_table/data_table_component.rb +42 -0
  83. data/templates/components/date_picker/date_picker_component.html.erb +5 -0
  84. data/templates/components/date_picker/date_picker_component.rb +21 -0
  85. data/templates/components/dialog/dialog_component.html.erb +38 -0
  86. data/templates/components/dialog/dialog_component.rb +22 -0
  87. data/templates/components/dropdown_menu/dropdown_menu_component.html.erb +12 -0
  88. data/templates/components/dropdown_menu/dropdown_menu_component.rb +36 -0
  89. data/templates/components/empty_state/empty_state_component.html.erb +18 -0
  90. data/templates/components/empty_state/empty_state_component.rb +22 -0
  91. data/templates/components/filter_bar/filter_bar_component.html.erb +5 -0
  92. data/templates/components/filter_bar/filter_bar_component.rb +15 -0
  93. data/templates/components/form/form_component.html.erb +3 -0
  94. data/templates/components/form/form_component.rb +18 -0
  95. data/templates/components/hover_card/hover_card_component.html.erb +10 -0
  96. data/templates/components/hover_card/hover_card_component.rb +11 -0
  97. data/templates/components/input/input_component.html.erb +1 -0
  98. data/templates/components/input/input_component.rb +28 -0
  99. data/templates/components/invite_member_dialog/invite_member_dialog_component.html.erb +35 -0
  100. data/templates/components/invite_member_dialog/invite_member_dialog_component.rb +26 -0
  101. data/templates/components/label/label_component.html.erb +4 -0
  102. data/templates/components/label/label_component.rb +19 -0
  103. data/templates/components/link/link_component.html.erb +1 -0
  104. data/templates/components/link/link_component.rb +25 -0
  105. data/templates/components/masked_input/masked_input_component.html.erb +1 -0
  106. data/templates/components/masked_input/masked_input_component.rb +18 -0
  107. data/templates/components/native_select/native_select_component.html.erb +14 -0
  108. data/templates/components/native_select/native_select_component.rb +52 -0
  109. data/templates/components/page_header/page_header_component.html.erb +20 -0
  110. data/templates/components/page_header/page_header_component.rb +19 -0
  111. data/templates/components/pagination/pagination_component.html.erb +11 -0
  112. data/templates/components/pagination/pagination_component.rb +24 -0
  113. data/templates/components/popover/popover_component.html.erb +9 -0
  114. data/templates/components/popover/popover_component.rb +11 -0
  115. data/templates/components/progress/progress_component.html.erb +11 -0
  116. data/templates/components/progress/progress_component.rb +26 -0
  117. data/templates/components/radio_button/radio_button_component.html.erb +8 -0
  118. data/templates/components/radio_button/radio_button_component.rb +19 -0
  119. data/templates/components/rich_text_editor_lite/rich_text_editor_lite_component.html.erb +32 -0
  120. data/templates/components/rich_text_editor_lite/rich_text_editor_lite_component.rb +30 -0
  121. data/templates/components/search_input/search_input_component.html.erb +14 -0
  122. data/templates/components/search_input/search_input_component.rb +18 -0
  123. data/templates/components/select/select_component.html.erb +1 -0
  124. data/templates/components/select/select_component.rb +19 -0
  125. data/templates/components/separator/separator_component.html.erb +1 -0
  126. data/templates/components/separator/separator_component.rb +12 -0
  127. data/templates/components/settings_section/settings_section_component.html.erb +20 -0
  128. data/templates/components/settings_section/settings_section_component.rb +18 -0
  129. data/templates/components/sheet/sheet_component.html.erb +37 -0
  130. data/templates/components/sheet/sheet_component.rb +27 -0
  131. data/templates/components/shortcut_key/shortcut_key_component.html.erb +6 -0
  132. data/templates/components/shortcut_key/shortcut_key_component.rb +15 -0
  133. data/templates/components/sidebar/sidebar_component.html.erb +14 -0
  134. data/templates/components/sidebar/sidebar_component.rb +37 -0
  135. data/templates/components/skeleton/skeleton_component.html.erb +1 -0
  136. data/templates/components/skeleton/skeleton_component.rb +13 -0
  137. data/templates/components/stat_card/stat_card_component.html.erb +20 -0
  138. data/templates/components/stat_card/stat_card_component.rb +31 -0
  139. data/templates/components/switch/switch_component.html.erb +11 -0
  140. data/templates/components/switch/switch_component.rb +19 -0
  141. data/templates/components/table/table_component.html.erb +26 -0
  142. data/templates/components/table/table_component.rb +35 -0
  143. data/templates/components/tabs/tabs_component.html.erb +18 -0
  144. data/templates/components/tabs/tabs_component.rb +35 -0
  145. data/templates/components/team_member_list/team_member_list_component.html.erb +22 -0
  146. data/templates/components/team_member_list/team_member_list_component.rb +26 -0
  147. data/templates/components/textarea/textarea_component.html.erb +1 -0
  148. data/templates/components/textarea/textarea_component.rb +23 -0
  149. data/templates/components/theme_toggle/theme_toggle_component.html.erb +4 -0
  150. data/templates/components/theme_toggle/theme_toggle_component.rb +15 -0
  151. data/templates/components/tooltip/tooltip_component.html.erb +9 -0
  152. data/templates/components/tooltip/tooltip_component.rb +16 -0
  153. data/templates/components/top_nav/top_nav_component.html.erb +21 -0
  154. data/templates/components/top_nav/top_nav_component.rb +44 -0
  155. data/templates/components/typography/typography_component.html.erb +1 -0
  156. data/templates/components/typography/typography_component.rb +24 -0
  157. data/templates/controllers/accordion_controller.js +27 -0
  158. data/templates/controllers/alert_dialog_controller.js +38 -0
  159. data/templates/controllers/api_key_field_controller.js +36 -0
  160. data/templates/controllers/calendar_controller.js +16 -0
  161. data/templates/controllers/carousel_controller.js +50 -0
  162. data/templates/controllers/clipboard_controller.js +17 -0
  163. data/templates/controllers/collapsible_controller.js +13 -0
  164. data/templates/controllers/combobox_controller.js +64 -0
  165. data/templates/controllers/command_controller.js +80 -0
  166. data/templates/controllers/context_menu_controller.js +36 -0
  167. data/templates/controllers/data_table_controller.js +34 -0
  168. data/templates/controllers/date_picker_controller.js +17 -0
  169. data/templates/controllers/dialog_controller.js +50 -0
  170. data/templates/controllers/dropdown_menu_controller.js +92 -0
  171. data/templates/controllers/hover_card_controller.js +17 -0
  172. data/templates/controllers/invite_member_dialog_controller.js +28 -0
  173. data/templates/controllers/masked_input_controller.js +30 -0
  174. data/templates/controllers/popover_controller.js +42 -0
  175. data/templates/controllers/rich_text_editor_lite_controller.js +443 -0
  176. data/templates/controllers/select_controller.js +10 -0
  177. data/templates/controllers/sheet_controller.js +34 -0
  178. data/templates/controllers/sidebar_controller.js +10 -0
  179. data/templates/controllers/tabs_controller.js +41 -0
  180. data/templates/controllers/theme_toggle_controller.js +24 -0
  181. data/templates/controllers/tooltip_controller.js +10 -0
  182. metadata +257 -0
@@ -0,0 +1,10 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ // senren--select
4
+ // v0.1: a no-op pass-through. Future versions will swap a native select for a
5
+ // listbox-style component while preserving form submission semantics.
6
+ export default class extends Controller {
7
+ connect() {
8
+ // ready
9
+ }
10
+ }
@@ -0,0 +1,34 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ // senren--sheet
4
+ // Side panel; behaves like a dialog.
5
+ export default class extends Controller {
6
+ static targets = ["overlay", "panel", "trigger"]
7
+
8
+ connect() { this._onKey = this._onKey.bind(this) }
9
+ disconnect() {
10
+ document.removeEventListener("keydown", this._onKey)
11
+ document.body.style.overflow = ""
12
+ }
13
+
14
+ open(event) {
15
+ event?.preventDefault()
16
+ this.overlayTarget.hidden = false
17
+ this.panelTarget.hidden = false
18
+ this.panelTarget.dataset.open = "true"
19
+ document.addEventListener("keydown", this._onKey)
20
+ document.body.style.overflow = "hidden"
21
+ queueMicrotask(() => this.panelTarget?.focus())
22
+ }
23
+
24
+ close(event) {
25
+ event?.preventDefault()
26
+ this.overlayTarget.hidden = true
27
+ this.panelTarget.hidden = true
28
+ this.panelTarget.dataset.open = "false"
29
+ document.removeEventListener("keydown", this._onKey)
30
+ document.body.style.overflow = ""
31
+ }
32
+
33
+ _onKey(event) { if (event.key === "Escape") this.close() }
34
+ }
@@ -0,0 +1,10 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ // senren--sidebar
4
+ // Local UI: compact/expanded visual state only.
5
+ export default class extends Controller {
6
+ toggle() {
7
+ this.element.classList.toggle("w-20")
8
+ this.element.classList.toggle("w-64")
9
+ }
10
+ }
@@ -0,0 +1,41 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ // senren--tabs
4
+ // Local UI: tab activation plus arrow-key navigation.
5
+ export default class extends Controller {
6
+ static targets = ["tab", "panel"]
7
+
8
+ select(event) {
9
+ event.preventDefault()
10
+ this._activate(event.currentTarget)
11
+ }
12
+
13
+ onKey(event) {
14
+ if (!["ArrowRight", "ArrowLeft", "Home", "End"].includes(event.key)) return
15
+ event.preventDefault()
16
+ const tabs = this.tabTargets
17
+ const index = tabs.indexOf(event.currentTarget)
18
+ const nextIndex = this._nextIndex(event.key, index, tabs.length)
19
+ tabs[nextIndex]?.focus()
20
+ this._activate(tabs[nextIndex])
21
+ }
22
+
23
+ _activate(tab) {
24
+ const panelId = tab.dataset.panelId
25
+ this.tabTargets.forEach((target) => {
26
+ const selected = target === tab
27
+ target.setAttribute("aria-selected", selected ? "true" : "false")
28
+ target.tabIndex = selected ? 0 : -1
29
+ })
30
+ this.panelTargets.forEach((panel) => {
31
+ panel.hidden = panel.dataset.panelId !== panelId
32
+ })
33
+ }
34
+
35
+ _nextIndex(key, index, length) {
36
+ if (key === "Home") return 0
37
+ if (key === "End") return length - 1
38
+ if (key === "ArrowRight") return (index + 1) % length
39
+ return (index - 1 + length) % length
40
+ }
41
+ }
@@ -0,0 +1,24 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ // senren--theme-toggle
4
+ // Local UI: toggles the document dark class and stores the preference.
5
+ export default class extends Controller {
6
+ static targets = ["label", "icon"]
7
+
8
+ connect() {
9
+ this._sync()
10
+ }
11
+
12
+ toggle() {
13
+ document.documentElement.classList.toggle("dark")
14
+ localStorage.setItem("senren-theme", document.documentElement.classList.contains("dark") ? "dark" : "light")
15
+ this._sync()
16
+ }
17
+
18
+ _sync() {
19
+ const dark = document.documentElement.classList.contains("dark")
20
+ this.element.setAttribute("aria-pressed", dark ? "true" : "false")
21
+ if (this.hasLabelTarget) this.labelTarget.textContent = dark ? "Light theme" : "Dark theme"
22
+ if (this.hasIconTarget) this.iconTarget.textContent = dark ? "L" : "D"
23
+ }
24
+ }
@@ -0,0 +1,10 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ // senren--tooltip
4
+ // Show/hide a small tooltip bubble on hover or focus.
5
+ export default class extends Controller {
6
+ static targets = ["bubble"]
7
+
8
+ show() { if (this.hasBubbleTarget) this.bubbleTarget.hidden = false }
9
+ hide() { if (this.hasBubbleTarget) this.bubbleTarget.hidden = true }
10
+ }
metadata ADDED
@@ -0,0 +1,257 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: senren-ui
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - vutt
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: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '7.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '7.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: view_component
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '3.0'
40
+ description: |
41
+ Senren UI is a Rails-native UI component library inspired by the developer
42
+ experience of shadcn/ui. It ships generators, a registry, and a centralized
43
+ AI-agent skill system. Components are copied into the host app (source-copy
44
+ architecture) so developers and AI agents can read and edit them directly.
45
+ email:
46
+ - thanhvu8a1@gmail.com
47
+ executables: []
48
+ extensions: []
49
+ extra_rdoc_files: []
50
+ files:
51
+ - CHANGELOG.md
52
+ - CONTRIBUTING.md
53
+ - LICENSE
54
+ - README.md
55
+ - Rakefile
56
+ - docs/visual_style.md
57
+ - lib/generators/senren/component/component_generator.rb
58
+ - lib/generators/senren/component/templates/component.html.erb.tt
59
+ - lib/generators/senren/component/templates/component.rb.tt
60
+ - lib/generators/senren/component/templates/component_test.rb.tt
61
+ - lib/generators/senren/component/templates/controller.js.tt
62
+ - lib/generators/senren/component/templates/system_test.rb.tt
63
+ - lib/generators/senren/install/install_generator.rb
64
+ - lib/generators/senren/install/templates/base_component.rb.tt
65
+ - lib/generators/senren/install/templates/conventions.md.tt
66
+ - lib/generators/senren/install/templates/installed_components.yml.tt
67
+ - lib/generators/senren/install/templates/senren.css.tt
68
+ - lib/senren/rails.rb
69
+ - lib/senren/rails/component_copier.rb
70
+ - lib/senren/rails/doctor.rb
71
+ - lib/senren/rails/engine.rb
72
+ - lib/senren/rails/host_paths.rb
73
+ - lib/senren/rails/installer.rb
74
+ - lib/senren/rails/llms_writer.rb
75
+ - lib/senren/rails/registry.rb
76
+ - lib/senren/rails/skill_writer.rb
77
+ - lib/senren/rails/version.rb
78
+ - lib/tasks/senren.rake
79
+ - registry/components.yml
80
+ - registry/groups.yml
81
+ - registry/recipes.yml
82
+ - templates/components/accordion/accordion_component.html.erb
83
+ - templates/components/accordion/accordion_component.rb
84
+ - templates/components/activity_feed/activity_feed_component.html.erb
85
+ - templates/components/activity_feed/activity_feed_component.rb
86
+ - templates/components/alert/alert_component.html.erb
87
+ - templates/components/alert/alert_component.rb
88
+ - templates/components/alert_dialog/alert_dialog_component.html.erb
89
+ - templates/components/alert_dialog/alert_dialog_component.rb
90
+ - templates/components/api_key_field/api_key_field_component.html.erb
91
+ - templates/components/api_key_field/api_key_field_component.rb
92
+ - templates/components/app_shell/app_shell_component.html.erb
93
+ - templates/components/app_shell/app_shell_component.rb
94
+ - templates/components/aspect_ratio/aspect_ratio_component.html.erb
95
+ - templates/components/aspect_ratio/aspect_ratio_component.rb
96
+ - templates/components/avatar/avatar_component.html.erb
97
+ - templates/components/avatar/avatar_component.rb
98
+ - templates/components/badge/badge_component.html.erb
99
+ - templates/components/badge/badge_component.rb
100
+ - templates/components/billing_plan_card/billing_plan_card_component.html.erb
101
+ - templates/components/billing_plan_card/billing_plan_card_component.rb
102
+ - templates/components/breadcrumb/breadcrumb_component.html.erb
103
+ - templates/components/breadcrumb/breadcrumb_component.rb
104
+ - templates/components/bulk_action_bar/bulk_action_bar_component.html.erb
105
+ - templates/components/bulk_action_bar/bulk_action_bar_component.rb
106
+ - templates/components/button/button_component.html.erb
107
+ - templates/components/button/button_component.rb
108
+ - templates/components/calendar/calendar_component.html.erb
109
+ - templates/components/calendar/calendar_component.rb
110
+ - templates/components/card/card_component.html.erb
111
+ - templates/components/card/card_component.rb
112
+ - templates/components/carousel/carousel_component.html.erb
113
+ - templates/components/carousel/carousel_component.rb
114
+ - templates/components/checkbox/checkbox_component.html.erb
115
+ - templates/components/checkbox/checkbox_component.rb
116
+ - templates/components/checkbox_group/checkbox_group_component.html.erb
117
+ - templates/components/checkbox_group/checkbox_group_component.rb
118
+ - templates/components/clipboard/clipboard_component.html.erb
119
+ - templates/components/clipboard/clipboard_component.rb
120
+ - templates/components/codeblock/codeblock_component.html.erb
121
+ - templates/components/codeblock/codeblock_component.rb
122
+ - templates/components/collapsible/collapsible_component.html.erb
123
+ - templates/components/collapsible/collapsible_component.rb
124
+ - templates/components/combobox/combobox_component.html.erb
125
+ - templates/components/combobox/combobox_component.rb
126
+ - templates/components/command/command_component.html.erb
127
+ - templates/components/command/command_component.rb
128
+ - templates/components/context_menu/context_menu_component.html.erb
129
+ - templates/components/context_menu/context_menu_component.rb
130
+ - templates/components/data_table/data_table_component.html.erb
131
+ - templates/components/data_table/data_table_component.rb
132
+ - templates/components/date_picker/date_picker_component.html.erb
133
+ - templates/components/date_picker/date_picker_component.rb
134
+ - templates/components/dialog/dialog_component.html.erb
135
+ - templates/components/dialog/dialog_component.rb
136
+ - templates/components/dropdown_menu/dropdown_menu_component.html.erb
137
+ - templates/components/dropdown_menu/dropdown_menu_component.rb
138
+ - templates/components/empty_state/empty_state_component.html.erb
139
+ - templates/components/empty_state/empty_state_component.rb
140
+ - templates/components/filter_bar/filter_bar_component.html.erb
141
+ - templates/components/filter_bar/filter_bar_component.rb
142
+ - templates/components/form/form_component.html.erb
143
+ - templates/components/form/form_component.rb
144
+ - templates/components/hover_card/hover_card_component.html.erb
145
+ - templates/components/hover_card/hover_card_component.rb
146
+ - templates/components/input/input_component.html.erb
147
+ - templates/components/input/input_component.rb
148
+ - templates/components/invite_member_dialog/invite_member_dialog_component.html.erb
149
+ - templates/components/invite_member_dialog/invite_member_dialog_component.rb
150
+ - templates/components/label/label_component.html.erb
151
+ - templates/components/label/label_component.rb
152
+ - templates/components/link/link_component.html.erb
153
+ - templates/components/link/link_component.rb
154
+ - templates/components/masked_input/masked_input_component.html.erb
155
+ - templates/components/masked_input/masked_input_component.rb
156
+ - templates/components/native_select/native_select_component.html.erb
157
+ - templates/components/native_select/native_select_component.rb
158
+ - templates/components/page_header/page_header_component.html.erb
159
+ - templates/components/page_header/page_header_component.rb
160
+ - templates/components/pagination/pagination_component.html.erb
161
+ - templates/components/pagination/pagination_component.rb
162
+ - templates/components/popover/popover_component.html.erb
163
+ - templates/components/popover/popover_component.rb
164
+ - templates/components/progress/progress_component.html.erb
165
+ - templates/components/progress/progress_component.rb
166
+ - templates/components/radio_button/radio_button_component.html.erb
167
+ - templates/components/radio_button/radio_button_component.rb
168
+ - templates/components/rich_text_editor_lite/rich_text_editor_lite_component.html.erb
169
+ - templates/components/rich_text_editor_lite/rich_text_editor_lite_component.rb
170
+ - templates/components/search_input/search_input_component.html.erb
171
+ - templates/components/search_input/search_input_component.rb
172
+ - templates/components/select/select_component.html.erb
173
+ - templates/components/select/select_component.rb
174
+ - templates/components/separator/separator_component.html.erb
175
+ - templates/components/separator/separator_component.rb
176
+ - templates/components/settings_section/settings_section_component.html.erb
177
+ - templates/components/settings_section/settings_section_component.rb
178
+ - templates/components/sheet/sheet_component.html.erb
179
+ - templates/components/sheet/sheet_component.rb
180
+ - templates/components/shortcut_key/shortcut_key_component.html.erb
181
+ - templates/components/shortcut_key/shortcut_key_component.rb
182
+ - templates/components/sidebar/sidebar_component.html.erb
183
+ - templates/components/sidebar/sidebar_component.rb
184
+ - templates/components/skeleton/skeleton_component.html.erb
185
+ - templates/components/skeleton/skeleton_component.rb
186
+ - templates/components/stat_card/stat_card_component.html.erb
187
+ - templates/components/stat_card/stat_card_component.rb
188
+ - templates/components/switch/switch_component.html.erb
189
+ - templates/components/switch/switch_component.rb
190
+ - templates/components/table/table_component.html.erb
191
+ - templates/components/table/table_component.rb
192
+ - templates/components/tabs/tabs_component.html.erb
193
+ - templates/components/tabs/tabs_component.rb
194
+ - templates/components/team_member_list/team_member_list_component.html.erb
195
+ - templates/components/team_member_list/team_member_list_component.rb
196
+ - templates/components/textarea/textarea_component.html.erb
197
+ - templates/components/textarea/textarea_component.rb
198
+ - templates/components/theme_toggle/theme_toggle_component.html.erb
199
+ - templates/components/theme_toggle/theme_toggle_component.rb
200
+ - templates/components/tooltip/tooltip_component.html.erb
201
+ - templates/components/tooltip/tooltip_component.rb
202
+ - templates/components/top_nav/top_nav_component.html.erb
203
+ - templates/components/top_nav/top_nav_component.rb
204
+ - templates/components/typography/typography_component.html.erb
205
+ - templates/components/typography/typography_component.rb
206
+ - templates/controllers/accordion_controller.js
207
+ - templates/controllers/alert_dialog_controller.js
208
+ - templates/controllers/api_key_field_controller.js
209
+ - templates/controllers/calendar_controller.js
210
+ - templates/controllers/carousel_controller.js
211
+ - templates/controllers/clipboard_controller.js
212
+ - templates/controllers/collapsible_controller.js
213
+ - templates/controllers/combobox_controller.js
214
+ - templates/controllers/command_controller.js
215
+ - templates/controllers/context_menu_controller.js
216
+ - templates/controllers/data_table_controller.js
217
+ - templates/controllers/date_picker_controller.js
218
+ - templates/controllers/dialog_controller.js
219
+ - templates/controllers/dropdown_menu_controller.js
220
+ - templates/controllers/hover_card_controller.js
221
+ - templates/controllers/invite_member_dialog_controller.js
222
+ - templates/controllers/masked_input_controller.js
223
+ - templates/controllers/popover_controller.js
224
+ - templates/controllers/rich_text_editor_lite_controller.js
225
+ - templates/controllers/select_controller.js
226
+ - templates/controllers/sheet_controller.js
227
+ - templates/controllers/sidebar_controller.js
228
+ - templates/controllers/tabs_controller.js
229
+ - templates/controllers/theme_toggle_controller.js
230
+ - templates/controllers/tooltip_controller.js
231
+ homepage: https://github.com/vuth-dogo/senren-ui
232
+ licenses:
233
+ - MIT
234
+ metadata:
235
+ homepage_uri: https://github.com/vuth-dogo/senren-ui
236
+ source_code_uri: https://github.com/vuth-dogo/senren-ui/tree/main
237
+ changelog_uri: https://github.com/vuth-dogo/senren-ui/blob/main/CHANGELOG.md
238
+ rubygems_mfa_required: 'true'
239
+ rdoc_options: []
240
+ require_paths:
241
+ - lib
242
+ required_ruby_version: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ version: 3.1.0
247
+ required_rubygems_version: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - ">="
250
+ - !ruby/object:Gem::Version
251
+ version: '0'
252
+ requirements: []
253
+ rubygems_version: 4.0.3
254
+ specification_version: 4
255
+ summary: Rails-native UI component library with ViewComponent, Hotwire, Tailwind,
256
+ and AI-agent skill files.
257
+ test_files: []