showcase-rails 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +121 -90
- data/app/models/showcase/path.rb +4 -0
- data/app/views/showcase/engine/path/_tree.html.erb +2 -2
- data/lib/showcase/version.rb +1 -1
- data/lib/showcase.rb +11 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c5d33100bd6414501e65b9739978d060032490a480bcf17cac74b689c556605
|
4
|
+
data.tar.gz: ac2cf1b91db211cce86ad10ac4b9acc9dbfd5c19a7d4fdda17e853b3e81ebade
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 754d2bfcd10de161792834a56b470dc88652ac393429295d794e05b6c97b8da6a309af9aad284456742f34fde3faa6f7de50583f43f341178e2a0f22f13e314d
|
7
|
+
data.tar.gz: 2bb6891dd5236ce84728bb6c86db146de9724152f471b5e7f71fd1149941866572e9e2d5fd23e575e87019db5c62eb4597ef3807e28b3c20c33265cc896c479d
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ Here's how to showcase a standard button component written with standard Rails p
|
|
38
38
|
|
39
39
|
### Components with ViewComponent
|
40
40
|
|
41
|
-
If we take the `MessageComponent` as seen on [https://viewcomponent.org]():
|
41
|
+
If we take the `MessageComponent` as seen on [https://viewcomponent.org](https://viewcomponent.org):
|
42
42
|
|
43
43
|
```ruby
|
44
44
|
# app/components/message_component.rb
|
@@ -168,9 +168,67 @@ We can then render it to showcase it:
|
|
168
168
|
|
169
169
|
Note that by adding `events: "welcome:greeting"` we're listening for any time that event is dispatched. Events are logged with `console.log`, but also output alongside the sample in the browser.
|
170
170
|
|
171
|
-
##
|
171
|
+
## Installation
|
172
|
+
|
173
|
+
Add these lines to your application's Gemfile. See next section for why Showcase is in the test group.
|
174
|
+
|
175
|
+
```ruby
|
176
|
+
group :development, :test do
|
177
|
+
gem "showcase-rails"
|
178
|
+
gem "rouge" # Optional. For out-of-the-box syntax highlighting.
|
179
|
+
end
|
180
|
+
```
|
181
|
+
|
182
|
+
And then execute:
|
183
|
+
|
184
|
+
```bash
|
185
|
+
$ bundle
|
186
|
+
```
|
187
|
+
|
188
|
+
Or install it yourself as:
|
189
|
+
```bash
|
190
|
+
$ gem install showcase-rails
|
191
|
+
```
|
192
|
+
|
193
|
+
Then add the following in your `config/routes.rb` within the block passed to `Rails.application.routes.draw`:
|
194
|
+
|
195
|
+
```ruby
|
196
|
+
mount Showcase::Engine, at: "/docs/showcase" if defined?(Showcase::Engine)
|
197
|
+
```
|
198
|
+
|
199
|
+
### Automatic previews testing
|
200
|
+
|
201
|
+
To have Showcase generate tests to exercise all your previews on CI, run `bin/rails showcase:install:previews_test` to add `test/views/showcase_test.rb`.
|
202
|
+
|
203
|
+
There you can add `setup` and `teardown` hooks, plus override the provided `assert_showcase_preview` to add custom assertions for any preview.
|
204
|
+
|
205
|
+
If you need custom assertions for specific previews, you can use the `test` helper:
|
206
|
+
|
207
|
+
```ruby
|
208
|
+
# test/views/showcase_test.rb
|
209
|
+
require "test_helper"
|
210
|
+
|
211
|
+
class ShowcaseTest < Showcase::PreviewsTest
|
212
|
+
test showcase: "combobox" do
|
213
|
+
# This test block runs within the #combobox container element.
|
214
|
+
assert_text "This is a combobox, for sure."
|
215
|
+
end
|
216
|
+
|
217
|
+
test showcase: "button" do
|
218
|
+
assert_selector id: "basic" do
|
219
|
+
assert_button class: ["text-xs"]
|
220
|
+
end
|
221
|
+
end
|
172
222
|
|
173
|
-
|
223
|
+
test "some non-Showcase test" do
|
224
|
+
# You can still use the regular Rails `test` method too.
|
225
|
+
end
|
226
|
+
end
|
227
|
+
```
|
228
|
+
|
229
|
+
### Syntax Highlighting
|
230
|
+
|
231
|
+
Add `gem "rouge"` to your Gemfile and Showcase will set syntax highlighting up for you. Any denoted syntaxes in your samples are then highlighted, e.g.:
|
174
232
|
|
175
233
|
```erb
|
176
234
|
# app/views/showcase/previews/_plain_ruby.ruby
|
@@ -179,102 +237,106 @@ To have out of the box syntax highlighting, add `gem "rouge"` to your Gemfile an
|
|
179
237
|
<% end %>
|
180
238
|
```
|
181
239
|
|
182
|
-
|
240
|
+
By default, `syntax: :erb` is used, so you don't need to mark the majority of your samples.
|
241
|
+
|
242
|
+
#### Replacing the highlighter
|
183
243
|
|
184
|
-
To use a different syntax highlighter,
|
244
|
+
To use a different syntax highlighter, assign your own Proc to `sample_renderer` like this:
|
185
245
|
|
186
246
|
```ruby
|
187
247
|
# config/initializers/showcase.rb
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
248
|
+
return unless defined?(Showcase)
|
249
|
+
|
250
|
+
Showcase.sample_renderer = ->(source, syntax) do
|
251
|
+
# Return a String of lexed and formatted code.
|
192
252
|
end
|
193
253
|
```
|
194
254
|
|
195
|
-
|
255
|
+
#### Replacing the theme
|
196
256
|
|
197
|
-
By default, Showcase's syntax highlighting runs on Rouge's "github" theme.
|
257
|
+
By default, Showcase's syntax highlighting runs on Rouge's `"github"` theme.
|
198
258
|
|
199
|
-
To use a different theme, override [showcase/engine/_stylesheets.html.erb]
|
259
|
+
To use a different theme, override [showcase/engine/_stylesheets.html.erb](app/views/showcase/engine/_stylesheets.html.erb) with the following, replacing `:magritte` with a [valid theme](rouge-themes):
|
200
260
|
|
201
261
|
```erb
|
202
|
-
<%= stylesheet_link_tag "showcase" %>
|
262
|
+
<%= stylesheet_link_tag "showcase" %> <%# We've removed the default showcase.highlights file here. %>
|
203
263
|
<%= tag.style Rouge::Theme.find(:magritte).render(scope: ".sc-highlight") %>
|
204
264
|
```
|
205
265
|
|
206
266
|
[rouge-themes]: https://github.com/rouge-ruby/rouge/tree/master/lib/rouge/themes
|
207
267
|
|
208
|
-
##
|
268
|
+
## Taking Showcase further
|
209
269
|
|
210
|
-
|
270
|
+
### View examples
|
211
271
|
|
212
|
-
|
272
|
+
Clone the repository, run `bundle install`, then run `bin/rails server`, and visit localhost:3000 in your browser. You'll see the examples from [test/dummy/app/views/showcase/previews](test/dummy/app/views/showcase/previews).
|
213
273
|
|
214
|
-
|
274
|
+
### Configuring what trees to open
|
275
|
+
|
276
|
+
Showcase's sidebar mirrors your `app/views/showcase/previews` directory with their paths, and then trees at each directory level.
|
277
|
+
|
278
|
+
So a `showcase/previews` directory with `_top_level.html.erb`, `components/_button.html.erb`, `deeply/nested/_partial.html.erb`, will generate a sidebar like this:
|
279
|
+
|
280
|
+
- Previews
|
281
|
+
- Top Level
|
282
|
+
- Components
|
283
|
+
- Button
|
284
|
+
- Deeply
|
285
|
+
- Nested
|
286
|
+
- Partial
|
287
|
+
|
288
|
+
Internally, Showcase renders an open `details` element for each tree. You can control that with this:
|
215
289
|
|
216
290
|
```ruby
|
217
291
|
# config/initializers/showcase.rb
|
218
292
|
return unless defined?(Showcase)
|
219
293
|
|
220
|
-
Showcase.
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
end
|
294
|
+
Showcase.tree_opens = true # All trees are open (the default).
|
295
|
+
Showcase.tree_opens = false # All trees are closed.
|
296
|
+
Showcase.tree_opens = ->(tree) { tree.root? } # Only open the root level trees (Previews, Components, Deeply but not Nested).
|
297
|
+
Showcase.tree_opens = ->(tree) { tree.id.start_with? ".", "components" } # Just open the top-level tree and the components tree.
|
225
298
|
```
|
226
299
|
|
227
|
-
|
300
|
+
### Linking to previews
|
301
|
+
|
302
|
+
Call `showcase.link_to` with the URL path to the other Showcase:
|
228
303
|
|
229
304
|
```erb
|
230
|
-
|
231
|
-
|
232
|
-
|
305
|
+
<%= showcase.link_to "stimulus_controllers/welcome" %>
|
306
|
+
<%= showcase.link_to "components/button", id: "extra-large" %> <%# Pass an id to link to a specific sample %>
|
307
|
+
|
308
|
+
<%# You can also pass just an id: to target a sample on the current showcase %>
|
309
|
+
<%= showcase.link_to id: "extra-large" %>
|
233
310
|
```
|
234
311
|
|
235
|
-
|
312
|
+
### Adding options contexts
|
236
313
|
|
237
|
-
Showcase
|
314
|
+
Showcase also supports custom options contexts. They're useful for cases where the options have a very specific format and it would be nice to keep them standardized.
|
238
315
|
|
239
|
-
|
316
|
+
By default, Showcase ships Nice Partials and Stimulus contexts out of the box. See [lib/showcase.rb](lib/showcase.rb) for how they're defined.
|
240
317
|
|
241
|
-
|
318
|
+
To add a new context, you can do this:
|
242
319
|
|
243
320
|
```ruby
|
244
|
-
#
|
245
|
-
|
246
|
-
|
247
|
-
class ShowcaseTest < Showcase::PreviewsTest
|
248
|
-
test showcase: "combobox" do
|
249
|
-
# This test block runs within the #combobox container element.
|
250
|
-
assert_text "This is a combobox, for sure."
|
251
|
-
end
|
252
|
-
|
253
|
-
test showcase: "button" do
|
254
|
-
assert_selector id: "basic" do
|
255
|
-
assert_button class: ["text-xs"]
|
256
|
-
end
|
257
|
-
end
|
321
|
+
# config/initializers/showcase.rb
|
322
|
+
return unless defined?(Showcase)
|
258
323
|
|
259
|
-
|
260
|
-
|
324
|
+
Showcase.options.define :some_context do
|
325
|
+
def targets(name, ...)
|
326
|
+
option("data-#{@prefix}-#{name}", ...)
|
261
327
|
end
|
262
328
|
end
|
263
329
|
```
|
264
330
|
|
265
|
-
|
266
|
-
|
267
|
-
Call `showcase.link_to` with the URL path to the other Showcase:
|
331
|
+
And now we can use it, here passing in `prefix:` which becomes an instance variable available in the `define` block.
|
268
332
|
|
269
333
|
```erb
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
<%# You can also pass just an id: to target a sample on the current showcase %>
|
274
|
-
<%= showcase.link_to id: "extra-large" %>
|
334
|
+
<% showcase.options.context :some_context, prefix: "super-" do |o| %>
|
335
|
+
<% o.required.targets :title %>
|
336
|
+
<% end %>
|
275
337
|
```
|
276
338
|
|
277
|
-
|
339
|
+
### Full Rails engine support
|
278
340
|
|
279
341
|
Any Rails engines in your app that ships previews in their `app/views/showcase/previews` directory will automatically be surfaced in your app. Here's an example from the [bullet_train-themes-light Rails engine](https://github.com/bullet-train-co/bullet_train-core/tree/main/bullet_train-themes-light/app/views/showcase/previews).
|
280
342
|
|
@@ -282,11 +344,7 @@ Showcase respects the Rails views rendering order, allowing you to override a sp
|
|
282
344
|
|
283
345
|
_📖 How does this work? 📖_ Internally, Showcase leverages Rails controllers' ordered set of `view_paths` — which each engine automatically prepends their app/views directory to by calling something like [`ActionController::Base.prepend_view_path`](https://github.com/rails/rails/blob/e78ed07e008676752b2ed2cff97e74b31ffacaf5/railties/lib/rails/engine.rb#L606) when initializing.
|
284
346
|
|
285
|
-
|
286
|
-
|
287
|
-
Clone the repository, run `bundle install`, then run `bin/rails server`, visit localhost:3000 in your browser.
|
288
|
-
|
289
|
-
## Overriding Showcase's default rendering
|
347
|
+
### Overriding Showcase's default rendering
|
290
348
|
|
291
349
|
Showcase's rendering happens through two controllers:
|
292
350
|
|
@@ -330,36 +388,9 @@ partials, make sure to include `"showcase"` in your list of assets.
|
|
330
388
|
|
331
389
|
[javascript_include_tag]: https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html#method-i-javascript_include_tag
|
332
390
|
[stylesheet_link_tag]: https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html#method-i-stylesheet_link_tag
|
333
|
-
[showcase/engine/_head.html.erb]:
|
334
|
-
[showcase/engine/_javascripts.html.erb]:
|
335
|
-
[showcase/engine/_stylesheets.html.erb]:
|
336
|
-
|
337
|
-
## Installation
|
338
|
-
|
339
|
-
Add this line to your application's Gemfile. To get the previews testing make sure the `showcase-rails` gem is available to your test environment:
|
340
|
-
|
341
|
-
```ruby
|
342
|
-
group :development, :test do
|
343
|
-
gem "showcase-rails"
|
344
|
-
gem "rouge" # For syntax highlighting in Showcase.
|
345
|
-
end
|
346
|
-
```
|
347
|
-
|
348
|
-
And then execute:
|
349
|
-
```bash
|
350
|
-
$ bundle
|
351
|
-
```
|
352
|
-
|
353
|
-
Or install it yourself as:
|
354
|
-
```bash
|
355
|
-
$ gem install showcase-rails
|
356
|
-
```
|
357
|
-
|
358
|
-
Then add the following in your `config/routes.rb` within the block passed to `Rails.application.routes.draw`:
|
359
|
-
|
360
|
-
```ruby
|
361
|
-
mount Showcase::Engine, at: "/docs/showcase" if defined?(Showcase::Engine)
|
362
|
-
```
|
391
|
+
[showcase/engine/_head.html.erb]: app/views/showcase/engine/_head.html.erb
|
392
|
+
[showcase/engine/_javascripts.html.erb]: app/views/showcase/engine/_javascripts.html.erb
|
393
|
+
[showcase/engine/_stylesheets.html.erb]: app/views/showcase/engine/_stylesheets.html.erb
|
363
394
|
|
364
395
|
## Contributing
|
365
396
|
Contribution directions go here.
|
data/app/models/showcase/path.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
<%= tag.details open: tree.open?, class: ["sc-flex sc-flex-col", "sc-pl-4" => !tree.root?] do %>
|
2
2
|
<%= tag.summary tree.name.titleize, class: "sc-list-item hover:sc-bg-indigo-50 dark:hover:sc-bg-neutral-700/50 sc-font-medium sc-text-base sc-py-2 sc-pl-4 sc-cursor-pointer" %>
|
3
3
|
<%= render tree.ordered_children %>
|
4
|
-
|
4
|
+
<% end %>
|
data/lib/showcase/version.rb
CHANGED
data/lib/showcase.rb
CHANGED
@@ -12,6 +12,17 @@ module Showcase
|
|
12
12
|
autoload :RouteHelper, "showcase/route_helper"
|
13
13
|
autoload :Options, "showcase/options"
|
14
14
|
|
15
|
+
class << self
|
16
|
+
attr_reader :tree_opens
|
17
|
+
|
18
|
+
def tree_opens=(opens)
|
19
|
+
@tree_opens = opens.respond_to?(:call) ? opens : proc { opens }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
self.tree_opens = true # All open by default
|
23
|
+
# self.tree_opens = false # All closed by default
|
24
|
+
# self.tree_opens = ->(tree) { tree.root? } # Just keep the root-level trees open.
|
25
|
+
|
15
26
|
singleton_class.attr_accessor :sample_renderer
|
16
27
|
@sample_renderer = proc { _1 }
|
17
28
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: showcase-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Pence
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-03-
|
12
|
+
date: 2023-03-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|