relay_ui 0.1.1 → 0.2.3

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +100 -0
  4. data/dist/relay_ui/relay_ui.css +595 -0
  5. data/lib/relay_ui/engine.rb +6 -7
  6. data/lib/relay_ui/version.rb +2 -2
  7. data/lib/relay_ui.rb +1 -1
  8. data/lib/rui/badges/base.rb +5 -0
  9. data/lib/rui/badges/blue.rb +5 -0
  10. data/lib/rui/badges/gray.rb +5 -0
  11. data/lib/rui/badges/green.rb +5 -0
  12. data/lib/rui/badges/purple.rb +5 -0
  13. data/lib/rui/badges/red.rb +5 -0
  14. data/lib/rui/badges/yellow.rb +5 -0
  15. data/{app/components → lib/rui}/base.rb +1 -3
  16. data/lib/rui/buttons/base.rb +27 -0
  17. data/lib/rui/buttons/destructive.rb +5 -0
  18. data/lib/rui/buttons/ghost.rb +5 -0
  19. data/lib/rui/buttons/outline.rb +5 -0
  20. data/lib/rui/buttons/primary.rb +5 -0
  21. data/lib/rui/buttons/secondary.rb +5 -0
  22. data/{app/components → lib/rui}/icon.rb +3 -1
  23. data/lib/rui/links/base.rb +28 -0
  24. data/lib/rui/links/destructive.rb +5 -0
  25. data/lib/rui/links/ghost.rb +5 -0
  26. data/lib/rui/links/outline.rb +5 -0
  27. data/lib/rui/links/primary.rb +5 -0
  28. data/lib/rui/links/secondary.rb +5 -0
  29. data/lib/rui/markdown/generator.rb +35 -0
  30. data/lib/rui/markdown/safe.rb +7 -0
  31. data/lib/rui/markdown/safe_renderer.rb +13 -0
  32. data/lib/rui/markdown/unsafe.rb +7 -0
  33. data/lib/rui/markdown/unsafe_renderer.rb +34 -0
  34. data/lib/rui/navigation.rb +51 -0
  35. data/lib/rui/slideout.rb +20 -0
  36. data/lib/rui/text.rb +19 -0
  37. metadata +80 -37
  38. data/Rakefile +0 -64
  39. data/app/assets/javascripts/relay_ui/index.js +0 -5
  40. data/app/assets/stylesheets/relay_ui/application.css +0 -1
  41. data/app/components/badges/base.rb +0 -5
  42. data/app/components/badges/blue.rb +0 -5
  43. data/app/components/badges/gray.rb +0 -5
  44. data/app/components/badges/green.rb +0 -5
  45. data/app/components/badges/purple.rb +0 -5
  46. data/app/components/badges/red.rb +0 -5
  47. data/app/components/badges/yellow.rb +0 -5
  48. data/app/components/buttons/base.rb +0 -30
  49. data/app/components/buttons/destructive.rb +0 -5
  50. data/app/components/buttons/ghost.rb +0 -5
  51. data/app/components/buttons/link.rb +0 -9
  52. data/app/components/buttons/outline.rb +0 -5
  53. data/app/components/buttons/primary.rb +0 -5
  54. data/app/components/buttons/secondary.rb +0 -5
  55. data/app/components/code_block.rb +0 -13
  56. data/app/components/headings.rb +0 -37
  57. data/app/components/lists/base.rb +0 -13
  58. data/app/components/lists/ordered.rb +0 -5
  59. data/app/components/lists/unordered.rb +0 -5
  60. data/app/components/navigation.rb +0 -49
  61. data/app/components/slideout.rb +0 -20
  62. data/app/components/text.rb +0 -19
  63. data/package.json +0 -16
  64. data/tailwind.config.js +0 -10
  65. data/vendor/assets/javascripts/relay_ui/dist/relay_ui.js +0 -2471
  66. data/vendor/assets/stylesheets/relay_ui/relay_ui.css +0 -2528
@@ -0,0 +1,27 @@
1
+ class RUI::Buttons::Base < RUI::Base
2
+ def initialize(icon: nil, data: {})
3
+ @icon = icon
4
+ @data = data
5
+ end
6
+
7
+ def view_template
8
+ button(class: classes, data: @data) do
9
+ div(class: "rui:flex rui:flex-row rui:items-center rui:gap-2") do
10
+ if @icon
11
+ div(class: "rui:size-4 rui:my-1") do
12
+ render RUI::Icon.new(@icon)
13
+ end
14
+ end
15
+ span { yield } if block_given?
16
+ end
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def classes
23
+ "#{base_classes} #{variant_classes}"
24
+ end
25
+
26
+ def base_classes = "rui:inline-block rui:px-3 rui:py-1 rui:hover:cursor-pointer rui:rounded rui:transition rui:duration-200 rui:ease-in-out"
27
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Buttons::Destructive < RUI::Buttons::Base
2
+ private
3
+
4
+ def variant_classes = "rui:bg-red-700 rui:hover:bg-red-900 rui:text-white"
5
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Buttons::Ghost < RUI::Buttons::Base
2
+ private
3
+
4
+ def variant_classes = "rui:hover:bg-zinc-100"
5
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Buttons::Outline < RUI::Buttons::Base
2
+ private
3
+
4
+ def variant_classes = "rui:border rui:rounded rui:border-zinc-700 rui:hover:border-zinc-900 rui:text-zinc-700 rui:hover:text-zinc-900 rui:hover:bg-zinc-100"
5
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Buttons::Primary < RUI::Buttons::Base
2
+ private
3
+
4
+ def variant_classes = "rui:bg-blue-700 rui:hover:bg-blue-900 rui:text-white"
5
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Buttons::Secondary < RUI::Buttons::Base
2
+ private
3
+
4
+ def variant_classes = "rui:bg-zinc-700 rui:hover:bg-zinc-900 rui:text-white"
5
+ end
@@ -1,4 +1,6 @@
1
- class RelayUi::Icon < RelayUi::Base
1
+ require "tabler_icons_ruby"
2
+
3
+ class RUI::Icon < RUI::Base
2
4
  def initialize(icon)
3
5
  @icon = icon
4
6
  end
@@ -0,0 +1,28 @@
1
+ class RUI::Links::Base < RUI::Base
2
+ def initialize(href: "#", icon: nil, data: {})
3
+ @href = href
4
+ @icon = icon
5
+ @data = data
6
+ end
7
+
8
+ def view_template
9
+ a(href: @href, class: classes, data: @data) do
10
+ div(class: "rui:flex rui:flex-row rui:items-center rui:gap-2") do
11
+ if @icon
12
+ div(class: "rui:size-4 rui:my-1") do
13
+ render RUI::Icon.new(@icon)
14
+ end
15
+ end
16
+ span { yield } if block_given?
17
+ end
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def classes
24
+ "#{base_classes} #{variant_classes}"
25
+ end
26
+
27
+ def base_classes = "rui:inline-block rui:px-3 rui:py-1 rui:hover:cursor-pointer rui:rounded rui:transition rui:duration-200 rui:ease-in-out"
28
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Links::Destructive < RUI::Links::Base
2
+ private
3
+
4
+ def variant_classes = "rui:bg-red-700 rui:hover:bg-red-900 rui:text-white"
5
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Links::Ghost < RUI::Links::Base
2
+ private
3
+
4
+ def variant_classes = "rui:hover:bg-zinc-100"
5
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Links::Outline < RUI::Links::Base
2
+ private
3
+
4
+ def variant_classes = "rui:border rui:rounded rui:border-zinc-700 rui:hover:border-zinc-900 rui:text-zinc-700 rui:hover:text-zinc-900 rui:hover:bg-zinc-100"
5
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Links::Primary < RUI::Links::Base
2
+ private
3
+
4
+ def variant_classes = "rui:bg-blue-700 rui:hover:bg-blue-900 rui:text-white"
5
+ end
@@ -0,0 +1,5 @@
1
+ class RUI::Links::Secondary < RUI::Links::Base
2
+ private
3
+
4
+ def variant_classes = "rui:bg-zinc-700 rui:hover:bg-zinc-900 rui:text-white"
5
+ end
@@ -0,0 +1,35 @@
1
+ require "redcarpet"
2
+
3
+ class RUI::Markdown::Generator
4
+ include Singleton
5
+
6
+ def initialize
7
+ options = {
8
+ filter_html: true,
9
+ hard_wrap: true,
10
+ link_attributes: { rel: "nofollow", target: "_blank" },
11
+ escape_html: true
12
+ }
13
+
14
+ unsafe_renderer = RUI::Markdown::UnsafeRenderer.new options
15
+ safe_renderer = RUI::Markdown::SafeRenderer.new options
16
+
17
+ extensions = {
18
+ autolink: true,
19
+ tables: true,
20
+ fenced_code_blocks: true,
21
+ lax_spacing: true,
22
+ no_intra_emphasis: true,
23
+ strikethrough: true,
24
+ superscript: true,
25
+ disable_indented_code_blocks: true
26
+ }
27
+
28
+ @unsafe_generator = Redcarpet::Markdown.new unsafe_renderer, extensions
29
+ @safe_generator = Redcarpet::Markdown.new safe_renderer, extensions
30
+ end
31
+
32
+ def get_unsafe(markdown) = @unsafe_generator.render(markdown).html_safe
33
+
34
+ def get_safe(markdown) = @safe_generator.render(markdown).html_safe
35
+ end
@@ -0,0 +1,7 @@
1
+ class RUI::Markdown::Safe < RUI::Base
2
+ def view_template(&block)
3
+ article(class: "rui:markdown") do
4
+ RUI::Markdown::Generator.instance.get_safe(capture(&block))
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ require "rouge"
2
+ require "rouge/plugins/redcarpet"
3
+ require "redcarpet"
4
+
5
+ class RUI::Markdown::SafeRenderer < Redcarpet::Render::XHTML
6
+ include Rouge::Plugins::Redcarpet
7
+
8
+ private
9
+
10
+ def rouge_formatter(lexer)
11
+ Rouge::Formatters::HTMLLegacy.new(inline_theme: "github.dark")
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ class RUI::Markdown::Unsafe < RUI::Base
2
+ def view_template(&block)
3
+ article(class: "rui:markdown") do
4
+ RUI::Markdown::Generator.instance.get_unsafe(capture(&block))
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,34 @@
1
+ require "rouge"
2
+ require "rouge/plugins/redcarpet"
3
+ require "redcarpet"
4
+
5
+ class RUI::Markdown::UnsafeRenderer < Redcarpet::Render::XHTML
6
+ include Rouge::Plugins::Redcarpet
7
+
8
+ def block_code(code, lang)
9
+ lexer =
10
+ begin
11
+ Rouge::Lexer.find_fancy(lang, code)
12
+ rescue Rouge::Guesser::Ambiguous => e
13
+ e.alternatives.first
14
+ end
15
+ lexer ||= Rouge::Lexers::PlainText
16
+
17
+ if lexer.tag == "make"
18
+ code.gsub! %r{^ }, "\t"
19
+ end
20
+
21
+ formatter = rouge_formatter(lexer)
22
+
23
+ # This is a hack to unescape HTML entities in code blocks
24
+ unescaped = CGI.unescapeHTML(code)
25
+
26
+ formatter.format(lexer.lex(unescaped))
27
+ end
28
+
29
+ private
30
+
31
+ def rouge_formatter(lexer)
32
+ Rouge::Formatters::HTMLLegacy.new(inline_theme: "github.dark")
33
+ end
34
+ end
@@ -0,0 +1,51 @@
1
+ class RUI::Navigation < RUI::Base
2
+ register_value_helper :request
3
+
4
+ def view_template
5
+ div(class: "rui:flex rui:flex-col rui:sticky rui:top-0 rui:max-h-screen rui:overflow-y-auto rui:mx-10 rui:py-10") do
6
+ yield
7
+ end
8
+ end
9
+
10
+ def section_heading
11
+ p(class: "rui:pt-8 rui:pb-4 rui:mt-6 rui:text-sm rui:font-semibold rui:uppercase rui:text-zinc-400 rui:border-t rui:border-zinc-200") do
12
+ yield
13
+ end
14
+ end
15
+
16
+ def icon_link(href:, icon:)
17
+ if request.path == href
18
+ state_classes = "rui:border-blue-700 rui:text-zinc-700 rui:**:[svg]:stroke-blue-700"
19
+ else
20
+ state_classes = "rui:border-transparent rui:text-zinc-400 rui:hover:border-zinc-200 rui:hover:text-zinc-700 rui:**:[svg]:stroke-zinc-300 rui:hover:**:[svg]:stroke-zinc-700"
21
+ end
22
+
23
+ a(href:, class: "rui:inline-flex rui:items-center rui:gap-2 rui:py-1 #{state_classes}") do
24
+ div(class: "rui:size-4") do
25
+ render RUI::Icon.new(icon)
26
+ end
27
+ span { yield }
28
+ end
29
+ end
30
+
31
+ def text_link(href)
32
+ if request.path == href
33
+ state_classes = "rui:border-blue-700 rui:text-zinc-700"
34
+ else
35
+ state_classes = "rui:border-transparent rui:text-zinc-400 rui:hover:border-zinc-200 rui:hover:text-zinc-700"
36
+ end
37
+
38
+ a(href:, class: "rui:text-zinc-400 rui:px-5 rui:py-1 rui:border-l-3 #{state_classes}") do
39
+ span { yield }
40
+ end
41
+ end
42
+
43
+ def coming_soon
44
+ div(class: "rui:flex rui:flex-row rui:items-center") do
45
+ span(class: "rui:text-zinc-400 rui:px-5 rui:py-1 rui:border-l-3 rui:border-transparent") do
46
+ yield
47
+ end
48
+ render RUI::Badges::Gray.new { "Coming Soon" }
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,20 @@
1
+ class RUI::Slideout < RUI::Base
2
+ include Phlex::Rails::Helpers::TurboFrameTag
3
+
4
+ def view_template
5
+ turbo_frame_tag "slideout" do
6
+ div(class: "rui:absolute rui:inset-0 rui:z-50", data: { controller: "slideout" }) do
7
+ a(href: "#", class: "rui:cursor-default", data: { action: "slideout#hide" }) do
8
+ div(id: "modal-curtain", class: "rui:w-screen rui:h-screen rui:bg-black rui:transition-opacity rui:opacity-75", data: { slideout_target: "curtain" })
9
+ end
10
+ div(class: "rui:right-0 rui:fixed rui:inset-y-0 rui:flex rui:max-w-1/2 rui:pointer-events-none") do
11
+ div(class: "rui:w-screen rui:pointer-events-auto", data: { slideout_target: "slideout" }) do
12
+ div(class: "rui:w-full rui:h-full rui:bg-white rui:shadow") do
13
+ yield
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/rui/text.rb ADDED
@@ -0,0 +1,19 @@
1
+ module RUI::Text
2
+ class Large < RUI::Base
3
+ def view_template
4
+ p(class: "rui:text-lg rui:text-zinc-700 rui:mb-4") { yield }
5
+ end
6
+ end
7
+
8
+ class Medium < RUI::Base
9
+ def view_template
10
+ p(class: "rui:text-base rui:text-zinc-700 rui:mb-4") { yield }
11
+ end
12
+ end
13
+
14
+ class Small < RUI::Base
15
+ def view_template
16
+ p(class: "rui:text-sm rui:text-zinc-700 rui:mb-4") { yield }
17
+ end
18
+ end
19
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relay_ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - logicrelay
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-06 00:00:00.000000000 Z
10
+ date: 2025-03-12 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: phlex
@@ -15,28 +15,56 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 2.1.0
18
+ version: '2.1'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 2.1.0
25
+ version: '2.1'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: tabler_icons_ruby
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: 3.11.0
32
+ version: '3.11'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 3.11.0
39
+ version: '3.11'
40
+ - !ruby/object:Gem::Dependency
41
+ name: redcarpet
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.6'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.6'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rouge
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '4.5'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '4.5'
40
68
  - !ruby/object:Gem::Dependency
41
69
  name: rake
42
70
  requirement: !ruby/object:Gem::Requirement
@@ -93,6 +121,20 @@ dependencies:
93
121
  - - ">="
94
122
  - !ruby/object:Gem::Version
95
123
  version: '0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rubocop-rails-omakase
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
96
138
  description: 'RelayUI is an opinionated UI kit for Rails applications, leveraging
97
139
  Phlex and TailwindCSS to provide a robust and cohesive design system, particularly
98
140
  suited for B2B backend interfaces.
@@ -104,40 +146,41 @@ executables: []
104
146
  extensions: []
105
147
  extra_rdoc_files: []
106
148
  files:
107
- - Rakefile
108
- - app/assets/javascripts/relay_ui/index.js
109
- - app/assets/stylesheets/relay_ui/application.css
110
- - app/components/badges/base.rb
111
- - app/components/badges/blue.rb
112
- - app/components/badges/gray.rb
113
- - app/components/badges/green.rb
114
- - app/components/badges/purple.rb
115
- - app/components/badges/red.rb
116
- - app/components/badges/yellow.rb
117
- - app/components/base.rb
118
- - app/components/buttons/base.rb
119
- - app/components/buttons/destructive.rb
120
- - app/components/buttons/ghost.rb
121
- - app/components/buttons/link.rb
122
- - app/components/buttons/outline.rb
123
- - app/components/buttons/primary.rb
124
- - app/components/buttons/secondary.rb
125
- - app/components/code_block.rb
126
- - app/components/headings.rb
127
- - app/components/icon.rb
128
- - app/components/lists/base.rb
129
- - app/components/lists/ordered.rb
130
- - app/components/lists/unordered.rb
131
- - app/components/navigation.rb
132
- - app/components/slideout.rb
133
- - app/components/text.rb
149
+ - LICENSE.txt
150
+ - README.md
151
+ - dist/relay_ui/relay_ui.css
134
152
  - lib/relay_ui.rb
135
153
  - lib/relay_ui/engine.rb
136
154
  - lib/relay_ui/version.rb
137
- - package.json
138
- - tailwind.config.js
139
- - vendor/assets/javascripts/relay_ui/dist/relay_ui.js
140
- - vendor/assets/stylesheets/relay_ui/relay_ui.css
155
+ - lib/rui/badges/base.rb
156
+ - lib/rui/badges/blue.rb
157
+ - lib/rui/badges/gray.rb
158
+ - lib/rui/badges/green.rb
159
+ - lib/rui/badges/purple.rb
160
+ - lib/rui/badges/red.rb
161
+ - lib/rui/badges/yellow.rb
162
+ - lib/rui/base.rb
163
+ - lib/rui/buttons/base.rb
164
+ - lib/rui/buttons/destructive.rb
165
+ - lib/rui/buttons/ghost.rb
166
+ - lib/rui/buttons/outline.rb
167
+ - lib/rui/buttons/primary.rb
168
+ - lib/rui/buttons/secondary.rb
169
+ - lib/rui/icon.rb
170
+ - lib/rui/links/base.rb
171
+ - lib/rui/links/destructive.rb
172
+ - lib/rui/links/ghost.rb
173
+ - lib/rui/links/outline.rb
174
+ - lib/rui/links/primary.rb
175
+ - lib/rui/links/secondary.rb
176
+ - lib/rui/markdown/generator.rb
177
+ - lib/rui/markdown/safe.rb
178
+ - lib/rui/markdown/safe_renderer.rb
179
+ - lib/rui/markdown/unsafe.rb
180
+ - lib/rui/markdown/unsafe_renderer.rb
181
+ - lib/rui/navigation.rb
182
+ - lib/rui/slideout.rb
183
+ - lib/rui/text.rb
141
184
  homepage: https://www.relayui.com
142
185
  licenses:
143
186
  - MIT
data/Rakefile DELETED
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- require "rubocop/rake_task"
9
-
10
- RuboCop::RakeTask.new
11
-
12
- task default: %i[spec rubocop]
13
-
14
- namespace :build do
15
- desc "Build JavaScript"
16
- task :js do
17
- sh "npm run build:js"
18
- end
19
-
20
- desc "Build CSS"
21
- task :css do
22
- sh "npm run build:css"
23
- end
24
-
25
- desc "Build all assets"
26
- task :assets => [:js, :css]
27
- end
28
-
29
- namespace :watch do
30
- desc "Watch JavaScript files and rebuild on changes"
31
- task :js do
32
- sh "npm run watch:js"
33
- end
34
-
35
- desc "Watch CSS files and rebuild on changes"
36
- task :css do
37
- sh "npm run watch:css"
38
- end
39
-
40
- desc "Watch all assets and rebuild on changes"
41
- task :assets do
42
- puts "Starting asset watchers for both JS and CSS..."
43
- puts "Press Ctrl-C to stop watching"
44
-
45
- # Run both watchers in parallel using a basic approach that works across platforms
46
- trap("INT") { exit }
47
-
48
- # Fork processes for each watcher
49
- pid1 = Process.fork { sh "npm run watch:js" }
50
- pid2 = Process.fork { sh "npm run watch:css" }
51
-
52
- # Wait for any process to exit
53
- Process.wait(pid1)
54
- Process.wait(pid2)
55
- rescue Interrupt
56
- puts "\nShutting down watchers..."
57
- end
58
- end
59
-
60
- task :build => ["build:assets"]
61
- task :watch => ["watch:assets"]
62
- task :default => ["build"]
63
-
64
- CLEAN.include("vendor")
@@ -1,5 +0,0 @@
1
- import ToggleController from './controllers/toggle_controller'
2
- import { Application } from '@hotwired/stimulus'
3
-
4
- const application = Application.start();
5
- application.register("toggle", ToggleController);
@@ -1 +0,0 @@
1
- @import 'tailwindcss';
@@ -1,5 +0,0 @@
1
- class RelayUi::Badges::Base < RelayUi::Base
2
- def view_template
3
- span(class: "px-3 py-0.5 text-xs rounded-full #{variant_classes}") { yield }
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class RelayUi::Badges::Blue < RelayUi::Badges::Base
2
- private
3
-
4
- def variant_classes = "bg-blue-100 text-blue-700"
5
- end
@@ -1,5 +0,0 @@
1
- class RelayUi::Badges::Gray < RelayUi::Badges::Base
2
- private
3
-
4
- def variant_classes = "bg-gray-100 text-gray-700"
5
- end
@@ -1,5 +0,0 @@
1
- class RelayUi::Badges::Green < RelayUi::Badges::Base
2
- private
3
-
4
- def variant_classes = "bg-green-100 text-green-700"
5
- end
@@ -1,5 +0,0 @@
1
- class RelayUi::Badges::Purple < RelayUi::Badges::Base
2
- private
3
-
4
- def variant_classes = "bg-purple-100 text-purple-700"
5
- end
@@ -1,5 +0,0 @@
1
- class RelayUi::Badges::Red < RelayUi::Badges::Base
2
- private
3
-
4
- def variant_classes = "bg-red-100 text-red-700"
5
- end
@@ -1,5 +0,0 @@
1
- class RelayUi::Badges::Yellow < RelayUi::Badges::Base
2
- private
3
-
4
- def variant_classes = "bg-yellow-100 text-yellow-700"
5
- end
@@ -1,30 +0,0 @@
1
- class RelayUi::Buttons::Base < RelayUi::Base
2
- def initialize(data: {}, href: "#", icon: nil)
3
- @data = data
4
- @href = href
5
- @icon = icon
6
- end
7
-
8
- def view_template
9
- div do
10
- a(href: @href, class: classes, data: @data) do
11
- div(class: "flex flex-row items-center gap-2") do
12
- if @icon
13
- div(class: "size-4 my-1") do
14
- render RelayUi::Icon.new(@icon)
15
- end
16
- end
17
- span { yield } if block_given?
18
- end
19
- end
20
- end
21
- end
22
-
23
- private
24
-
25
- def classes
26
- "#{base_classes} #{variant_classes}"
27
- end
28
-
29
- def base_classes = "inline-block px-3 py-1 hover:cursor-pointer rounded transition duration-200 ease-in-out"
30
- end
@@ -1,5 +0,0 @@
1
- class RelayUi::Buttons::Destructive < RelayUi::Buttons::Base
2
- private
3
-
4
- def variant_classes = "bg-red-700 hover:bg-red-900 text-white"
5
- end
@@ -1,5 +0,0 @@
1
- class RelayUi::Buttons::Ghost < RelayUi::Buttons::Base
2
- private
3
-
4
- def variant_classes = "hover:bg-zinc-100"
5
- end