⚑️ Supercharge your ViewComponent development process πŸš€

Related tags

Job Queues lookbook
Overview

L πŸ‘€ kbook

⚑️ Supercharge your ViewComponent development process πŸš€


About

Lookbook provides a ready-to-go UI for navigating, inspecting and interacting with ViewComponent previews. It uses (and extends) ViewComponent's in-built component preview functionality and is intended to integrate seamlessly with existing ViewComponent libraries.

The goal is to (eventually) give a Storybook-like development experience for ViewComponents, but hopefully with a more 'Railsy' feel and without having to learn a whole new DSL.

Lookbook uses RDoc/Yard-style comment tags to extend the capabilities of ViewComponent's preview functionality whilst maintaining compatability with the standard ViewComponent preview class format, so you can add or remove Lookbook at any time without having to rewrite any code.

⚠️ PLEASE NOTE! Lookbook is very much a work in progress at the moment. There may be breaking changes on point-releases before a 1.0 version is ready. ⚠️

Lookbook UI

Current features

  • πŸ‘€ Navigate your component previews with ease!
  • πŸ” Filter/search previews by name
  • πŸ–₯ Resizable, responsive preview window
  • πŸ”¦ Highlighted preview source code (with one-click copy to clipboard)
  • πŸ”¦ Highlighted HTML output
  • πŸ“ Add notes via comments in the preview file - markdown supported
  • πŸš€ Live UI, auto-updates when component or previews files are updated
  • πŸ™ˆ Supports 'hidden' previews and examples

Future plans and ideas

Check out the feature request issues) to get a feel for some of the potential features coming to Lookbook in the future. And please suggest your own if you have anything you'd like to see added!

Lookbook demo

If you want to have a quick play with Lookbook, the easiest way is to give the demo app a spin. It's a basic Rails/ViewComponent app with a few test components included to tinker with.

The demo app repo contains instructions on how to get it up and running.

Installing

Lookbook is current a work in progress and has not been published as a Gem yet.

If you wish to play with it in it's current state you can include it directly from Github using the instructions below.

1. Add as a dependency

In your Gemfile add:

gem "lookbook", '>= 0.1', git: "https://github.com/allmarkedup/lookbook", branch: "main"

This line should be placed below wherever you have specified the view_component gem.

2. Mount the Lookbook engine

You then need to mount the Lookbook engine (at a path of your choosing) in your routes.rb file:

Rails.application.routes.draw do
  # any other routes...
  if Rails.env.development?
    mount Lookbook::Engine, at: "/lookbook"
  end
end

The at property determines the root URL that the Lookbook UI will be served at.

If you would like to expose the Lookbook UI in production as well as in development, just remove the if Rails.env.development? wrapper from the mount statement.

Then you can start your app as normal and navigate to http://localhost:3000/lookbook (or whatever mount path you specified) to view your component previews in the Lookbook UI.

Usage

You don't need to do anything special to create ViewComponent previews for Lookbook.

Lookbook will use the ViewComponent configuration options for your project to find and render your components so you don't need to configure anything separately (unless you want to tweak the behaviour or look of Lookbook itself).

If you are new to ViewComponent development, checkout the ViewComponent docs on how to get started developing your components.

Lookbook uses the exact same preview files as 'regular' ViewComponent previews, so using preview templates, custom layouts and even bespoke preview controllers should all work just the same.

Comment tags

Lookbook uses Yard-style tags in class and method comments to extract additional information about previews, examples and components.

Tags are just strings identified by their @ prefix - for example @hidden. Tags are always placed in a comment above the relevant preview class or example method. The comments can still contain any other text, and multiple tags can be included in any one comment. For example:

# This is a class-level comment.
# @hidden
class MyClass
  # This is a method-level comment.
  # @hidden
  def my_method
  end
end

Some tags can also require additional arguments. Further informatin on the tags Lookbook uses are detailed in the docs below.

πŸ”¦ Viewing source code and rendered HTML output

Lookbook displays the source code of the current preview (or the contents of preview template, if one is being used), right underneath the rendered preview itself:

You can also inspect the HTML output of the rendered preview (without any of the layout cruft):

All code panels have a 'copy-to-clipboard' button at the top right of the panel, just click it to copy the un-highlighted code to your clipboard.

πŸ“ Adding notes to previews

Lookbook lets you add notes to your preview examples which are then displayed in the inspector panel. They look something like this:

Notes are generated from comments above example methods in your preview files. Below is an example of two preview examples that both have notes:

class ButtonComponentPreview < ViewComponent::Preview

  # Add notes as comments above the example methods.
  # Multi-line is just fine and **markdown** is supported too!
  #
  # It's a good place to put usage and implementation instructions
  # for people browsing the component previews in the UI.
  def default
    render ButtonComponent.new(text: "Click me")
  end

  # Each preview example has it's own notes, extracted from the method comments.
  def danger
    render ButtonComponent.new(text: "Don't do it!", theme: :danger)
  end
end

πŸ“ Hiding previews and examples

Sometimes you may want a preview or an individual example to be 'hidden' in the Lookbook UI. This means that the preview or example will not show up in the navigation, but will still be accessible via it's URL.

To hide a preview or example, the @hidden comment tag is used:

Hiding a preview

To hide an entire preview, include the @hidden tag in a class comment:

# @hidden
class MyComponentPreview < ViewComponent::Preview
  # examples here....
end

Hiding an example

To hide an individual example, include the @hidden tag in the appropriate method comment:

class MyComponentPreview < ViewComponent::Preview

  # Hidden Example
  # ----------
  # You won't see this in the nav!
  #
  # @hidden
  def hidden_example
    # example code...
  end

  def a_visible_example
    # example code...
  end

  # @hidden
  def another_hidden_example
    # example code...
  end
end

Configuration

Lookbook uses ViewComponent's configuration options for anything to do with previews, paths and general setup, so you won't need to duplicate any settings.

However the following Lookbook-specific config options are also available:

UI auto-refresh

Disable/enable the auto-updating of the Lookbook UI when files change. Enabled by default.

config.lookbook.auto_refresh = false # default is true

By default Lookbook will listen for changes in any preview directories as well as in the components directory itself.

If you wish to add additional paths to listen for changes in, you can use the listen_paths option:

config.lookbook.listen_paths << Rails.root.join('app/other/directory')

Contributing

Lookbook is very much a small hobby/side project at the moment. I'd love to hear from anyone who is interested in contributing but I'm terrible at replying to emails or messages, so don't be surprised if I take forever to get back to you. It's not personal 😜

However, I'm a frontend developer - not a Rails dev - so any thoughts, advice or PRs on how to improve the codebase will be always much appreciated. 🍻

Developing on a local version of Lookbook

The quickest way to get a development version of Lookbook up and running is to use the lookbook-demo app and link it to a local version of the Lookbook gem:

Initial setup:

  1. Clone this repository somewhere on your machine - git clone [email protected]:allmarkedup/lookbook.git
  2. Also pull down the lookbook-demo repository to your machine
  3. In the Gemfile of the lookbook-demo repository, replace gem "lookbook", '>= 0.1', git: "https://github.com/allmarkedup/lookbook", branch: "main" with gem "lookbook", path: "../path/to/lookbook" (use the path to your local copy of lookbook)
  4. Install dependencies - from the root of the parent project run bundle install

Starting development

  1. From within the lookbook root directory run the comand npm run dev (this will make sure the CSS/JS is recompiled if/when you make changes to the UI)
  2. From within the lookbook-demo root directory run npm run start - this will start a server and build the demo assets

Point your browser to http://localhost:3000/lookbook to see the UI. You can then make and test changes to the Lookbook code in your local copy of lookbook repo. PRs are welcome if you add anything useful :-)

Note that changes to files in the Lookbook lib/ directory will require a server restart in order to have them applied.

License

The gem is available as open source under the terms of the MIT License.

Comments
  • Preview classes are not reloaded when using forking servers

    Preview classes are not reloaded when using forking servers

    Hey!

    Thanks for the project, first of all.

    I would like to share a potential caveat (which worth mentioning in the Readme, though not sure whereβ€”that's why an issue).

    We've been using Puma in a clustered mode in development (which we prefer to catch forking related issues early), and noticed that preview classes are not being reloaded (thus, changes in the Ruby code are not reflected, we need to restart the dev server).

    After some investigation, I found that Preview.clear_cache is called in the Puma master process, while web requests (which use Preview.all) are handled by workers. That leads to @previews value to never been nullified.

    bug help wanted 
    opened by palkan 17
  • Parameter controls not working

    Parameter controls not working

    Describe the bug

    I've integrated Lookbook to our application but some of the parameter controls are not working. The once I've tested which are not working are: toggle and select. Nothing happens when I click on a toggle or a select box.

    To Reproduce

    1. Go to the Lookbook page of the application
    2. Select a component
    3. Click on the Params tab
    4. Click on the toggle for a parameter
    5. Nothing happens and no errors in the browser console

    Expected behavior

    I expect the toggle to change state and the preview to be updated.

    Version numbers

    • Lookbook: 1.3.3
    • ViewComponent: 2.74.1
    • Rails: 6.1.5.1
    • Ruby: 2.7.2p137 (2020-10-01 revision 5445e04352) [arm64-darwin20]
    • view_component-contrib: 0.1.1
    • Safari: 16.1 (18614.2.9.1.12)
    • Chrome: 107.0.5304.87 (Official Build) (arm64)

    Additional context

    It seems to be some issue with the JavaScript, but there are no errors in the browser console. The tree that lists the components are working properly so the JavaScript is not completely broken. If I change the parameter type to text everything works fine and the preview is automatically updated when I change the parameter value.

    I've also tested to generate a new Rails application with ViewComponent and Lookbook and then everything works as expected. So there's something weird with the setup/configuration in our application. I've tried to remove gems from our application until only the standard Rails gems (those that are included when generating a new Rails application) are left plus ViewComponent and Lookbook, more or less. It didn't help.

    I've included the debug data from Lookbook below. Note, config.components_path is not correct. We have our components in app/frontend/components and app/frontend/pages.

    {
      "version": "1.3.3",
      "env": "development",
      "config": {
        "project_name": "Lookbook",
        "log_level": 2,
        "log_use_rails_logger": true,
        "auto_refresh": true,
        "components_path": "app/components",
        "page_controller": "Lookbook::PageController",
        "page_route": "pages",
        "page_paths": [
          "test/components/docs"
        ],
        "page_extensions": [
          "html.*",
          "md.*"
        ],
        "page_options": {
        },
        "markdown_options": {
          "tables": true,
          "fenced_code_blocks": true,
          "disable_indented_code_blocks": true,
          "strikethrough": true,
          "highlight": true,
          "with_toc_data": true,
          "lax_spacing": true
        },
        "highlighter_options": {
          "theme": "github",
          "dark": false
        },
        "sort_examples": false,
        "preview_paths": [
          "/Users/jacobcarlborg/.rvm/gems/ruby-2.7.2@my-rails-app/gems/view_component-contrib-0.1.1/app/views",
          "/Users/jacobcarlborg/development/apoex/my-rails-app/app/frontend/components",
          "/Users/jacobcarlborg/development/apoex/my-rails-app/app/frontend/pages"
        ],
        "preview_display_options": {
        },
        "preview_disable_action_view_annotations": true,
        "preview_params_options_eval": false,
        "listen": true,
        "listen_paths": [
          "/Users/jacobcarlborg/.rvm/gems/ruby-2.7.2@my-rails-app/gems/view_component-contrib-0.1.1/app/views",
          "/Users/jacobcarlborg/development/apoex/my-rails-app/app/frontend/components",
          "/Users/jacobcarlborg/development/apoex/my-rails-app/app/frontend/pages",
          "app/components"
        ],
        "listen_extensions": [
          "rb",
          "html.*"
        ],
        "listen_use_polling": false,
        "ui_theme": "zinc",
        "ui_theme_overrides": {
        },
        "ui_favicon": true,
        "debug_menu": true,
        "experimental_features": false,
        "preview_controller": "ViewComponentsController",
        "panels": {
          "main": [
            {
              "label": "Preview",
              "hotkey": "v",
              "disabled": false,
              "show": true,
              "copy": null,
              "locals": {
              },
              "partial": "lookbook/inspector/panels/preview",
              "name": "preview",
              "group": "main"
            },
            {
              "label": "HTML",
              "hotkey": "h",
              "disabled": false,
              "show": true,
              "copy": null,
              "locals": {
              },
              "partial": "lookbook/inspector/panels/output",
              "name": "output",
              "group": "main"
            }
          ],
          "drawer": [
            {
              "label": "Source",
              "hotkey": "s",
              "disabled": false,
              "show": true,
              "copy": "#<Proc:0x0000000126d74200 (eval):1 (lambda)>",
              "locals": {
              },
              "partial": "lookbook/inspector/panels/source",
              "name": "source",
              "group": "drawer"
            },
            {
              "label": "Notes",
              "hotkey": "n",
              "disabled": "#<Proc:0x0000000126d6e030 (eval):1 (lambda)>",
              "show": true,
              "copy": null,
              "locals": {
              },
              "partial": "lookbook/inspector/panels/notes",
              "name": "notes",
              "group": "drawer"
            },
            {
              "label": "Params",
              "hotkey": "p",
              "disabled": "#<Proc:0x0000000126d674d8 (eval):1 (lambda)>",
              "show": true,
              "copy": null,
              "locals": {
              },
              "partial": "lookbook/inspector/panels/params",
              "name": "params",
              "group": "drawer"
            }
          ]
        },
        "inputs": {
          "select": {
            "name": "select",
            "partial": "lookbook/inspector/inputs/select",
            "options": {
              "opts": {
              }
            }
          },
          "textarea": {
            "name": "textarea",
            "partial": "lookbook/inspector/inputs/textarea",
            "options": {
              "opts": {
              }
            }
          },
          "toggle": {
            "name": "toggle",
            "partial": "lookbook/inspector/inputs/toggle",
            "options": {
              "opts": {
              }
            }
          },
          "color": {
            "name": "color",
            "partial": "lookbook/inspector/inputs/color",
            "options": {
              "opts": {
              }
            }
          },
          "range": {
            "name": "range",
            "partial": "lookbook/inspector/inputs/range",
            "options": {
              "opts": {
              }
            }
          },
          "text": {
            "name": "text",
            "partial": "lookbook/inspector/inputs/text",
            "options": {
              "opts": {
              }
            }
          },
          "email": {
            "name": "email",
            "partial": "lookbook/inspector/inputs/text",
            "options": {
              "opts": {
              }
            }
          },
          "number": {
            "name": "number",
            "partial": "lookbook/inspector/inputs/text",
            "options": {
              "opts": {
              }
            }
          },
          "tel": {
            "name": "tel",
            "partial": "lookbook/inspector/inputs/text",
            "options": {
              "opts": {
              }
            }
          },
          "url": {
            "name": "url",
            "partial": "lookbook/inspector/inputs/text",
            "options": {
              "opts": {
              }
            }
          },
          "date": {
            "name": "date",
            "partial": "lookbook/inspector/inputs/text",
            "options": {
              "opts": {
              }
            }
          },
          "datetime_local": {
            "name": "datetime_local",
            "partial": "lookbook/inspector/inputs/text",
            "options": {
              "opts": {
              }
            }
          }
        },
        "tags": {
          "hidden": {
            "name": "hidden",
            "label": "Hidden",
            "options": {
              "label": "Hidden status",
              "opts": {
              }
            }
          },
          "label": {
            "name": "label",
            "label": "Label",
            "options": {
              "label": "Label",
              "opts": {
              }
            }
          },
          "display": {
            "name": "display",
            "label": "Display",
            "options": {
              "label": "Display",
              "opts": {
              }
            }
          },
          "position": {
            "name": "position",
            "label": "Position",
            "options": {
              "label": "Position",
              "opts": {
              }
            }
          },
          "id": {
            "name": "id",
            "label": "Id",
            "options": {
              "label": "Id",
              "opts": {
              }
            }
          },
          "component": {
            "name": "component",
            "label": "Component",
            "options": {
              "label": "Component",
              "opts": {
              }
            }
          },
          "param": {
            "name": "param",
            "label": "Param",
            "options": {
              "label": "Param",
              "opts": {
              }
            }
          },
          "logical_path": {
            "name": "logical_path",
            "label": "Logical Path",
            "options": {
              "label": "Logical Path",
              "opts": {
              }
            }
          }
        }
      }
    }
    

    Below is a skeleton of a component that reproduces the issue.

    Preview:

    class Flowbite::Button::Preview < ViewComponent::Preview
      # @param foo [Boolean] toggle foobar
      def button_primary(foo: false)
        render(Flowbite::Button::Component.new(foo, "#"))
      end
    end
    

    Component:

    class Flowbite::Button::Component < ViewComponent::Base
      attr_reader :name
      attr_reader :options
    
      def initialize(name = nil, options = nil)
        @name = name
        @options = options
      end
    end
    

    Template:

    %flowbite-button= link_to(name, options)
    

    File structure:

    app/frontend/
    β”œβ”€β”€ components
    β”‚   β”œβ”€β”€ flowbite
    β”‚   β”‚   β”œβ”€β”€ button
    β”‚   β”‚   β”‚   β”œβ”€β”€ component.html.haml
    β”‚   β”‚   β”‚   β”œβ”€β”€ component.rb
    β”‚   β”‚   β”‚   └── preview.rb
    
    bug 
    opened by jacob-carlborg-apoex 15
  • Lookbook stalls out while rendering

    Lookbook stalls out while rendering

    Hey, I just upgraded to 1.0.3 and I'm seeing a new issue that just popped up. Some of the time (not 100%) while rendering lookbook, it stalls out and completely locks up my server. I've managed to capture the same request twice, once where it stalls and once where it doesn't. Hopefully this helps identify where the issue is coming from. This seems to happen pretty frequently. I can load lookbook and refresh 5-10 times and usually one of those will stall. Seems like a race condition of some type. Here are the logs:

    This request went just fine:

    Started GET "/lookbook/inspect/[redacted]" for 127.0.0.1 at 2022-09-06 20:42:51 +0000	
      ActiveRecord::SchemaMigration Pluck (0.2ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC	
    Processing by Lookbook::PreviewsController#show as HTML	
      Parameters: {"path"=>"[redacted]"}	
    Processing by ViewComponentsController#render_example_to_string as HTML	
      Parameters: {"path"=>"[redacted]"}	
      Rendering /gems/gems/view_component-2.71.0/app/views/view_components/preview.html.erb	
      Rendered /gems/gems/view_component-2.71.0/app/views/view_components/preview.html.erb (Duration: 17.8ms | Allocations: 24682)	
      Rendering html template	
      Rendered html template (Duration: 0.0ms | Allocations: 13)	
    Completed 200 OK in 22ms (Views: 0.9ms | ActiveRecord: 1.5ms | Allocations: 29233)	
      Rendering layout /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/inspector.html.erb	
      Rendering /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/show.html.erb within layouts/lookbook/inspector	
      Rendered /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/panels/_preview.html.erb (Duration: 1.3ms | Allocations: 1565)	
      Rendered /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/panels/_output.html.erb (Duration: 61.8ms | Allocations: 89377)	
      Rendered /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/panels/_source.html.erb (Duration: 1.2ms | Allocations: 1669)	
      Rendered /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/panels/_notes.html.erb (Duration: 1.4ms | Allocations: 1364)	
      Rendered /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/panels/_params.html.erb (Duration: 0.5ms | Allocations: 574)	
      Rendered /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/show.html.erb within layouts/lookbook/inspector (Duration: 115.6ms | Allocations: 143555)	
      Rendering /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/application.html.erb	
      Rendering /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/shell.html.erb	
      Rendering /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/skeleton.html.erb	
      Rendered /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/skeleton.html.erb (Duration: 1.2ms | Allocations: 1551)	
      Rendered /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/shell.html.erb (Duration: 5.7ms | Allocations: 7490)	
      Rendered /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/application.html.erb (Duration: 184.4ms | Allocations: 240100)	
      Rendered layout /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/inspector.html.erb (Duration: 301.3ms | Allocations: 385951)	
    Completed 200 OK in 428ms (Views: 301.9ms | ActiveRecord: 0.0ms | Allocations: 644331)	
    Started GET "/lookbook-assets/css/lookbook.css?v=1.0.3" for 127.0.0.1 at 2022-09-06 20:42:52 +0000	
    Started GET "/lookbook-assets/js/lookbook.js?v=1.0.3" for 127.0.0.1 at 2022-09-06 20:42:52 +0000	
    Started GET "/lookbook-assets/css/themes/indigo.css?v=1.0.3" for 127.0.0.1 at 2022-09-06 20:42:52 +0000	
    Started GET "/lookbook/preview/[redacted]?lookbook_timestamp=2022-09-06+20%3A42%3A51+%2B0000" for 127.0.0.1 at 2022-09-06 20:42:52 +0000	
    Processing by Lookbook::PreviewsController#preview as HTML	
      Parameters: {"lookbook_timestamp"=>"2022-09-06 20:42:51 +0000", "path"=>"[redacted]"}	
    Processing by ViewComponentsController#render_example_to_string as HTML	
      Parameters: {"lookbook_timestamp"=>"2022-09-06 20:42:51 +0000", "path"=>"[redacted]"}	
      Rendering /gems/gems/view_component-2.71.0/app/views/view_components/preview.html.erb	
      Rendered /gems/gems/view_component-2.71.0/app/views/view_components/preview.html.erb (Duration: 10.7ms | Allocations: 14947)	
      Rendering html template	
      Rendered html template (Duration: 0.0ms | Allocations: 7)	
    Completed 200 OK in 14ms (Views: 1.5ms | ActiveRecord: 0.0ms | Allocations: 17564)	
    Processing by ViewComponentsController#render_in_layout_to_string as HTML	
      Parameters: {"lookbook_timestamp"=>"2022-09-06 20:42:51 +0000", "path"=>"[redacted]"}	
      Rendering layout layouts/component_preview.html.haml	
      Rendering /gems/gems/lookbook-1.0.3/app/views/lookbook/preview.html.erb within layouts/component_preview	
      Rendered /gems/gems/lookbook-1.0.3/app/views/lookbook/preview.html.erb within layouts/component_preview (Duration: 1.1ms | Allocations: 577)	
    Started GET "/lookbook-assets/feather-sprite.svg" for 127.0.0.1 at 2022-09-06 20:42:52 +0000	
    Started GET "/lookbook/lookbook-cable?uid=1662496972521" for 127.0.0.1 at 2022-09-06 20:42:52 +0000	
      Rendered shared/_head_common.html.haml (Duration: 199.7ms | Allocations: 249524)	
      Rendered layout layouts/component_preview.html.haml (Duration: 205.5ms | Allocations: 254715)	
      Rendering html template	
      Rendered html template (Duration: 0.0ms | Allocations: 7)	
    Completed 200 OK in 209ms (Views: 1.0ms | ActiveRecord: 0.0ms | Allocations: 257898)	
      Rendering html template	
      Rendered html template (Duration: 0.0ms | Allocations: 4)	
    Completed 200 OK in 231ms (Views: 0.9ms | ActiveRecord: 0.0ms | Allocations: 293395)
    

    And here's an example of a request that stalled my server

    Started GET "/lookbook/inspect/[redacted]" for 127.0.0.1 at 2022-09-06 20:43:42 +0000
    Processing by Lookbook::PreviewsController#show as HTML
      Parameters: {"path"=>"[redacted]"}
    Processing by ViewComponentsController#render_example_to_string as HTML
      Parameters: {"path"=>"[redacted]"}
      Rendering /gems/gems/view_component-2.71.0/app/views/view_components/preview.html.erb
    Started GET "/lookbook/lookbook-cable?uid=1662497022169" for 127.0.0.1 at 2022-09-06 20:43:42 +0000
      Rendered /gems/gems/view_component-2.71.0/app/views/view_components/preview.html.erb (Duration: 16.1ms | Allocations: 16228)
      Rendering html template
      Rendered html template (Duration: 0.0ms | Allocations: 9)
    Completed 200 OK in 19ms (Views: 0.7ms | ActiveRecord: 0.0ms | Allocations: 18961)
    
    
      Rendering layout /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/inspector.html.erb
      Rendering /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/show.html.erb within layouts/lookbook/inspector
      Rendered /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/panels/_preview.html.erb (Duration: 0.9ms | Allocations: 895)
      Rendered /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/panels/_output.html.erb (Duration: 4.5ms | Allocations: 8706)
    Started GET "/lookbook/inspect/[redacted]" for 127.0.0.1 at 2022-09-06 20:43:42 +0000
    Processing by Lookbook::PreviewsController#show as HTML
      Parameters: {"path"=>"[redacted]"}
    Processing by ViewComponentsController#render_example_to_string as HTML
      Parameters: {"path"=>"[redacted]"}
      Rendering /gems/gems/view_component-2.71.0/app/views/view_components/preview.html.erb
      Rendered /gems/gems/view_component-2.71.0/app/views/view_components/preview.html.erb (Duration: 11.3ms | Allocations: 15147)
      Rendering html template
      Rendered html template (Duration: 0.0ms | Allocations: 7)
    Completed 200 OK in 14ms (Views: 1.0ms | ActiveRecord: 0.2ms | Allocations: 17753)
    
    
      Rendering layout /gems/gems/lookbook-1.0.3/app/views/layouts/lookbook/inspector.html.erb
      Rendering /gems/gems/lookbook-1.0.3/app/views/lookbook/previews/show.html.erb within layouts/lookbook/inspector
    

    And it just hangs there forever.

    This has been confirmed by multiple members of my team. Please let me know what other information I can get you to help diagnose the bug.

    bug 
    opened by trappar 15
  • Lookbook Listening

    Lookbook Listening

    I am having trouble getting the listener to catch preview changes. I regret bothering you with this here as an issue since I am sure it is something I am doing but if you have any suggestions about the best way to debug this please let me know. Thanks so much.

    opened by jonsgreen 14
  • NameError when ViewComponent source code preview is turned on

    NameError when ViewComponent source code preview is turned on

    Hi there!

    I pulled down the latest version of Lookbook and set it up like the following in my development.rb environment.

    We're using view_component 2.35

      # ViewComponent preview configuration
      config.view_component.preview_paths << Rails.root.join("spec", "components", "previews")
      config.view_component.show_previews_source = true
      config.view_component.preview_route = "/view_component/previews"
      config.view_component.default_preview_layout = "view_component_preview"
    

    Upon installing Lookbook per the Readme (add the gem from GitHub, add the mount line into routes and trying to view a basic view component preview (inside of Lookbook), I ran into this error:

    CleanShot 2021-07-29 at 20 12 55@2x

    We would love the ability to retain the ViewComponent source code previews in the native ViewComponent previews while Lookbook rapidly improves.

    Let me know if you need me to dive into this!

    bug 
    opened by afomera 14
  • ViewComponent::Preview.all returns empty

    ViewComponent::Preview.all returns empty

    [follow up of https://github.com/github/view_component/issues/1252 ]

    description:

    ViewComponent::Preview.all returns [] after a component.rb file changes. I managed to fix it by removing this line in view_component ).

    But I think @allmarkedup has a solution directly in lookbook

    Many thanks

    opened by muriloime 13
  • Test and support a a wide range of possible ViewComponent project setups and structures

    Test and support a a wide range of possible ViewComponent project setups and structures

    Right now Lookbook has only been tested with very 'vanilla' ViewComponent/Rails setups. It needs testing and patching to support the widest possible (sensible) range of different project structures/setups.

    help wanted feature request 
    opened by allmarkedup 13
  • Custom inputs?

    Custom inputs?

    It used to be you could define a custom input by adding a partial to app/views/lookbook/previews/inputs, but that doesn't seem to work anymore for Lookbook v1.x. The docs mention custom tags, but it's unclear to me how to specify a partial or component to render. Are custom inputs still a thing?

    feature request 
    opened by camertron 12
  • Template Error within preview window

    Template Error within preview window

    My components get recognized by lookbook but the preview window throws an ActionView::Template::Error. This is happening with all my components.

    No route matches {:action=>"preview", :controller=>"lookbook/previews", :page=>nil, :path=>"button/sizes"}
    

    2022-08-02 at 11 20 53@2x

    Worth noting that I can see the previews through http://localhost:3000/rails/view_components/ without any issues.

    I am currently using lookbook (0.9.3), and just to confirm, my routes are configured as per the documentation:

    mount Lookbook::Engine, at: "/lookbook"
    
    bug 
    opened by magico 12
  • Adding tabs to pages

    Adding tabs to pages

    Currently our team at Wrapbook uses Lookbook for our ViewComponent library. We have a separate "Style Guide" and also keep usage details/documentation for designers in Figma. Our goal is to move all of this into Lookbook Pages. Because there are different audiences using the Design System:

    • Designer
    • Frontend Engineer
    • Other Engineers
    • Mobile Engineers

    We wanted to split up content into separate tabs, using Shopify's Polaris as an example, as can be seen on their Avatar page.

    This PR provides an opt-in way to add Tabs to Pages, and it is done within separate files (with similar names) that are detected and then added within a Page.

    Example with code: image (6)

    Example with embedded preview: image (7)

    File naming uses square brackets to indicate you want it as a tab on an existing page. If the underlying page does not exist, the tab is ignored.

    test/components/docs/
      β”œβ”€β”€ 01_avatar.md.erb
      β”œβ”€β”€ 01_avatar[design].md.erb
      β”œβ”€β”€ 01_avatar[mobile].md.erb
      β”œβ”€β”€ 01_avatar[web].md.erb
    

    Would love your feedback!

    opened by leighhalliday 12
  • In-browser editable dynamic preview parameters

    In-browser editable dynamic preview parameters

    ViewComponent previews allow setting dynamic values that be changed by editing query string parameters.

    Lookbook could parse the parameters and generate fields in the UI so that these values could be edited live and the changes instantly reflected in the rendered component preview, much like the way StorybookJS controls work.

    feature request 
    opened by allmarkedup 12
  • chore(deps-dev): bump husky from 8.0.2 to 8.0.3

    chore(deps-dev): bump husky from 8.0.2 to 8.0.3

    Bumps husky from 8.0.2 to 8.0.3.

    Release notes

    Sourced from husky's releases.

    v8.0.3

    • fix: add git not installed message #1208
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies javascript 
    opened by dependabot[bot] 1
  • chore(deps-dev): bump prettier from 2.8.0 to 2.8.2

    chore(deps-dev): bump prettier from 2.8.0 to 2.8.2

    Bumps prettier from 2.8.0 to 2.8.2.

    Release notes

    Sourced from prettier's releases.

    2.8.2

    πŸ”— Changelog

    2.8.1

    πŸ”— Changelog

    Changelog

    Sourced from prettier's changelog.

    2.8.2

    diff

    Don't lowercase link references (#13155 by @​DerekNonGeneric & @​fisker)

    <!-- Input -->
    We now don't strictly follow the release notes format suggested by [Keep a Changelog].
    

    <!-- Prettier 2.8.1 --> We now don't strictly follow the release notes format suggested by Keep a Changelog.

    <!-- ^^^^^^^^^^^^^^^^^^ lowercased -->

    <!-- Prettier 2.8.2 --> <Same as input>

    Preserve self-closing tags (#13691 by @​dcyriller)

    {{! Input }}
    <div />
    <div></div>
    <custom-component />
    <custom-component></custom-component>
    <i />
    <i></i>
    <Component />
    <Component></Component>
    

    {{! Prettier 2.8.1 }} <div></div> <div></div> <custom-component></custom-component> <custom-component></custom-component> <i></i> <i></i> <Component /> <Component />

    {{! Prettier 2.8.2 }} </tr></table>

    ... (truncated)

    Commits
    • ac88438 Release 2.8.2
    • aaf9190 Fix comments after directive (#14081)
    • 9e09a78 Stop inserting space in LESS property access (#14103)
    • 0c5d4f3 Fix removing commas from function arguments in maps (#14089)
    • b77d912 ember / glimmer: Preserve self-closing tags (#13691)
    • cf36209 Handlebars: Add tests for {{! prettier-ignore}} (#13693)
    • f8e1ad8 Add parens to head of ExpressionStatement instead of whole statement (#14077)
    • 8034bad Build(deps): Bump json5 from 2.2.0 to 2.2.3 in /scripts/release (#14104)
    • 31d4010 Build(deps): Bump json5 from 2.2.1 to 2.2.3 in /website (#14101)
    • 41cee06 Do not change case of property name if inside a variable declaration in LESS ...
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies javascript 
    opened by dependabot[bot] 1
  • chore(deps): bump standard from 1.19.1 to 1.21.1

    chore(deps): bump standard from 1.19.1 to 1.21.1

    Bumps standard from 1.19.1 to 1.21.1.

    Changelog

    Sourced from standard's changelog.

    1.21.1

    • Fix standard comment directives #498

    1.21.0

    • Update rubocop-performance from 1.15.1 to 1.15.2
    • Update rubocop from 1.40.0 to 1.42.0

    1.20.0

    • Update rubocop from 1.39.0 to 1.40.0
    Commits
    • 2f90872 1.21.1
    • df531ab Merge pull request #498 from andreccosta/fix-ignored-standard-directives
    • 632ebd6 πŸ’ v1.21.0
    • 7f32165 Merge pull request #503 from testdouble/update-deps-2023-01-02
    • 1d67308 Configures base.yml for 2023-01-02
    • c5dd63f Merge pull request #484 from testdouble/scheduling-updates
    • bbb3c0c Merge pull request #499 from petergoldstein/feature/add_ruby_3_2_to_ci
    • 6630a4d [ 2023-01-02 ] - Update dependencies
    • 777baf0 Adds Ruby 3.2 to the CI matrix
    • f1983d2 Add test for isolated comment directive
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies ruby 
    opened by dependabot[bot] 1
  • Support for Stimulus

    Support for Stimulus

    I migrated our components to Lookbook, but I haven't found any documentation regarding running component's JavaScript code in the preview.

    As example could be a dropdown, that could expand and hide directly in the preview.

    Am I missing something or is this not supported? If it isn't do you have some pointers where to start in an attempt to add this support?

    feature request 
    opened by strzibny 1
  • chore(deps): bump css_parser from 1.12.0 to 1.13.0

    chore(deps): bump css_parser from 1.12.0 to 1.13.0

    Bumps css_parser from 1.12.0 to 1.13.0.

    Changelog

    Sourced from css_parser's changelog.

    Ruby CSS Parser CHANGELOG

    Unreleased

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies ruby 
    opened by dependabot[bot] 1
  • chore(deps-dev): bump release-it from 15.5.1 to 15.6.0

    chore(deps-dev): bump release-it from 15.5.1 to 15.6.0

    Bumps release-it from 15.5.1 to 15.6.0.

    Release notes

    Sourced from release-it's releases.

    Release 15.6.0

    • Fix specs for #966 (39a318b)
    • Move space (quickfix) (cfae247)
    • fix: use spec formdata (#958) (c21e6b6)
    • Fix npm.isCollaborator() on npm v9 (#966) (3bd405a)
    • feat(git): added option to use --exclude option on git describe (#963) (2b484bf)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies javascript 
    opened by dependabot[bot] 1
Releases(v1.4.5)
  • v1.4.5(Dec 21, 2022)

  • v1.4.4(Dec 10, 2022)

    Fixed

    • fix layout breaking when source tab contains HTML button elements - thanks @tleish!
    • ensure '_preview' suffixes are stripped from preview paths correctly
    Source code(tar.gz)
    Source code(zip)
  • v1.4.3(Dec 6, 2022)

  • v1.4.2(Dec 5, 2022)

    Improved

    • Better sidebar nav loading performance (#253 - thanks @kirillplatonov)

    Fixed

    • Description parsing in @param tags
    • Incorrect left-hand side padding in sidebar nav
    • Ugly FOUC on initial page load
    • Base path detection when multiple preview directories are specified
    • Issue with view_component-contrib abstract classes compatability
    • Occasional issue with unresponsive toggle @param inputs
    Source code(tar.gz)
    Source code(zip)
  • v1.4.1(Nov 24, 2022)

    Fixed

    • Sort order of examples in nav
    • Prev/next navigation on pages
    • Intermittent nav morph errors
    • @param options file resolver path error
    • Nav icon for single-example previews
    Source code(tar.gz)
    Source code(zip)
  • v1.4.0(Nov 20, 2022)

  • v1.3.4(Nov 17, 2022)

  • v1.3.3(Nov 6, 2022)

  • v1.3.2(Nov 6, 2022)

  • v1.3.1(Nov 6, 2022)

  • v1.3.0(Nov 6, 2022)

    New

    • Add logical_path tag (#215)

    Changed

    • Update CSP handling in controllers to match the way ViewComponent handles it (#202)
    • Refactor tag parsing system
    • Refactor file watching and websocket handling

    Fixed

    • Ensure 'empty' param values are cast to nil (#219)
    • Don't start websocket when running in console
    Source code(tar.gz)
    Source code(zip)
  • v1.2.1(Oct 17, 2022)

  • v1.2.0(Oct 16, 2022)

  • v1.1.1(Oct 11, 2022)

    Fixed

    • Remove over-zealous all:unset css declaration from grouped examples wrapper
    • Don't override Listen logger

    Changed

    • Use Zeitwerk for autoloading
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Oct 1, 2022)

    Lots of @param improvements

    • Support for custom inputs!
    • Updated params panel UI
    • Input options available for all input types
    • color input type
    • range input type

    Other additions

    • config option to make rails logger optional
    • 'collapse all' nav items button
    • loading indicator

    Fixed

    • style tag removal in custom inspector panels
    • truncation of long nav item labels
    • remove action view annotations from preview HTML
    • prevent class_names error in older Rails versions
    Source code(tar.gz)
    Source code(zip)
  • v1.0.8(Sep 15, 2022)

    • Adding FreeAgent to the list of Lookbook users (ac5a01c)
    • docs(config): deprecate runtime_parsing and parser_registry_path config options (ec267ca)
    • fix(examples): fix example source rendering for multiline method definitions (44a91ae)
    • ci: update appraisal lock files (dd8fe30)
    • fix(websockets): fix websocket connection when mounting Lookbook at root (ba73538)
    • docs(deployment): update deployment notes to remove preparsing step requirements (4fed00a)
    • Add config option to disable action view annotations in source (9aa796e)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.7(Sep 13, 2022)

  • v1.0.6(Sep 13, 2022)

  • v1.0.5(Sep 13, 2022)

    • fix(previews): correctly handle preview classes with errors (19331b3)
    • fix(helpers): support passing of code lang as option value (b40f6ea)
    • refactor: reload previews as part of main request thread (921585f)
    • refactor(views): assign collections to instance variables (2e7ce7b)
    • refactor: Use throttle-debounce package for debouncing (8e1a915)
    • fix(stores): fix recursive Store conversions (bd9ab39)
    • fix(examples): always strip extensions from template paths (8dbd7d5)
    • fix(websockets): correctly mount websocket to prevent extra requests (fead8aa)
    • refactor(previews): rework parsing process (b85a13b)
    • fix(*): debounce DOM updates (3aff7a4)
    • docs: add CoverageBook to list of Lookbook users (7a33afe)
    • docs: fix link styling in method descriptions (429b91d)
    • docs: add package dependents link to list of users (ad85b94)
    • ci: fix CI branch name (eb52672)
    • ci(*): add GH Actions CI workflow (8cd8f42)
    • docs(api): correct display tag example (819f2fb)
    • chore: Add Within3 to list of companies using lookbook (f1cb3fc)
    • docs: Update for date and datetime-local inputs (4678254)
    • docs: Fix broken link in quick start (9fa6dfc)
    • fix: Conditionally call content_security_policy (abcd666)
    • docs: Add list of companies who use Lookbook (d8e86d1)
    Source code(tar.gz)
    Source code(zip)
  • v0.9.8(Sep 13, 2022)

  • v1.0.4(Sep 6, 2022)

    • fix(components): fix encoding issues with Alpine data (47f4740)
    • fix(helpers): fix code helper args error (2f1bbdd)
    • test(helpers): add test for code helpers (dd97f82)
    • test(websockets): don't init websocket in test env (ad93b16)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.3(Sep 5, 2022)

  • v1.0.2(Sep 5, 2022)

    • fix(websocket): only init websocket in server context (4b58d70)
    • chore(release): customise release commit message template (d7fd1a2)
    • docs(tags): add tags reference (333b7f2)
    • docs: tighten up method info styling (19363ed)
    • docs(groups): add API docs for example groups (4e145e2)
    • refactor(previews): rename render target instance variable to reduce confusion (6a67e2d)
    • docs(components): add Component entity API docs (1ad4850)
    • feat(entity): add .rel_path method to components, pages and previews (2b5c442)
    • fix(page): ensure .full_path returns a Pathname instance (e97d850)
    • docs(panels): document available helpers in panel templates (3b5e4b7)
    • docs(panels): document use of JavaScript within panel templates (3a3770d)
    • fix(icon): fix use of style attribute on icon component (5e8f4ac)
    • docs: keep docs version in sync with Lookbook version (e481f7c)
    • chore(hooks): remove commitizen git commit hook (cf7e6be)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Sep 3, 2022)

    • fix(panels): fix style tag stripping from panel templates (329412f)
    • fix(helpers): fix missing code helper (3678f94)
    • chore: add commitizen and set up commit hook (500f1ce)
    • fix(docs): sidebar scroll position in docs (111a1b3)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Sep 3, 2022)

  • v1.0.0-rc.3(Sep 3, 2022)

    • Fix duplicate combustion gem (91526df)
    • Add doc server script (2119e14)
    • Add system test for text field params (78aa10d)
    • Fix params field encoding (7672518)
    • Move release scripts out of rake tasks (9ff092b)
    • Run dummy app from bin script (d981d3a)
    • Run workbench from bin script (6c04bf0)
    • Remove unnecessary rails require (c060c62)
    Source code(tar.gz)
    Source code(zip)
  • v0.9.7(Sep 3, 2022)

  • v1.0.0-rc.2(Sep 1, 2022)

    • Fix embed new window link (447c218)
    • Fix missing HTML elements when copying (7de55d8)
    • Disable CSP in development environment (a2fc7d0)
    • Fix string rendering for Ruby > 3.0 (45544e8)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0-rc.1(Aug 29, 2022)

    • Highlight previews in nav (d0ae841)
    • Fixes for older rails and ruby versions (e5ec8ef)
    • Ensure page objects are available to page templates as local variables (3e3d934)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0-beta.8(Aug 29, 2022)

Owner
Mark Perkins
Senior Frontend Engineer @ Coveragebook.com
Mark Perkins
Build and deploy a roadmap voting app for your porject

Roadmap Voting App You can deploy Roadmap application yourself and get feedback from your users about your roadmap features. See the live example. In

Upstash 91 Jan 3, 2023
Making service workers easy so that your app is fast and reliable, even offline.

tulo.js Making service workers easy to use so that your app can be fast and reliable, even offline. Welcome to tulo.js, a service worker library that

OSLabs Beta 37 Nov 16, 2022
Out of the box modern User Interface, so you can see and manage your Workhorse jobs in realtime

WORKHORSE UI Out of the box modern User Interface, so you can see and manage your Workhorse jobs in realtime. Start local Run npm i Copy and name prox

Workhorse 2 Apr 15, 2022
Use Cloudflare Workers Cron Triggers to keep your Hetzner Cloud Firewall allowing the latest list of Cloudflare IPs, or any other lists!

Hetzner Cloud Firewall automation with Cloudflare Workers Heavily inspired by xopez/Hetzner-Cloud-Firewall-API-examples, this repository holds a Cloud

Erisa A 9 Dec 17, 2022
Build your Cloudflare Workers with esbuild.

build-worker Bundle your Cloudflare Worker with esbuild instead of webpack. (It's ridiculously faster!) Wrangler v1 uses webpack. Wrangler v2 is using

Rom 7 Oct 24, 2022
A Remix.run stack to monitor your BullMQ queues

Remix Matador stack A bold interface that helps you monitor your BullMQ queues. Learn more about Remix Stacks. $ npx create-remix@latest --template nu

Andrea 19 Dec 15, 2022
Adds clap button (like medium) to any page for your Next.js apps.

@upstash/claps Add a claps button (like medium) to any page for your Next.js apps. Nothing to maintain, it is completely serverless ?? Check out the d

Upstash 49 Nov 23, 2022
A bot that notifies you on Slack whenever your company/product is mentioned on Hacker News. Powered by Vercel Functions & Upstash.

Hacker News Slack Bot A bot that notifies you on Slack whenever your company/product is mentioned on Hacker News. or deploy your own Built With Vercel

Vercel Labs 162 Jan 3, 2023
Supercharge your All-in-One workspace with the Command Palette within Notion πŸ•ΉοΈ

Notion Palette Supercharge your All-in-One workspace with the Command Palette within Notion ??️ Notion Palette is a free and open source extension, yo

Ruter 13 Nov 10, 2022
Supercharge Notion with custom commands to record, draw, and more ✍️

Slashy Supercharge Notion with custom commands to record, draw, and more ✨ Slashy is an open source extension that lets you create custom commands for

Alyssa X 425 Dec 28, 2022
Supercharge Multicall.js with nitro features πŸ’¨

multicall-nitro Supercharge Multicall.js with nitro features ?? Highlights TypeScript support βœ… Ready-to-use calls ✍?? React hook βš›οΈ One time call ??

Enzo Ferey 5 Dec 15, 2022
Library agnostic in-process recording of http(s) requests and responses

@gr2m/http-recorder Library agnostic in-process recording of http(s) requests and responses Install npm install @gr2m/http-recorder Usage import http

Gregor Martynus 4 May 12, 2022
This is a project to testing coding habilities, it is part of the recruiting process of Liven.tech company

This is a project to testing coding habilities, it is part of the recruiting process of Liven.tech company

Romualdo 1 Feb 26, 2022
A realtime code-editor and compiler to ease coding interview process

A realtime code-editor and compiler to ease coding interview process. Users can create their rooms and can invite others to their rooms. So, millions can work on a same code at the same time together !

Archan Banerjee 1 Jan 2, 2023
Some process handle JavaScript function parameter.

Function parameter handle or paremeter error control Example 1: Just checking if all arguments were passed / defined. const required = (name) => {

Md. Nazmul Islam 4 Mar 14, 2022
Node Express Template (NET.ts) - a small template project which help you to speed up the process of building RESTful API

Node Express Template (NET.ts) - a small template project which help you to speed up the process of building RESTful API

Przemek Nowicki 26 Jan 4, 2023
A set of connectors to describe, parse and process the data sources provided by websites and social networks

HUDI-PACKAGE-CONNECTORS What is this repository for? A set of connectors to describe, parse and process the data sources provided by websites and soci

HUDI 8 Aug 5, 2022
A nodejs module for local and remote Inter Process Communication with full support for Linux, Mac and Windows

A nodejs module for local and remote Inter Process Communication with full support for Linux, Mac and Windows

Rifa Achrinza 15 Sep 28, 2022
A CLI tool that allows you to ensure a database is live before closing the process

Wait for a database to be available prior to launching subsequent commands. ??βŒ›

Rida F'kih 3 Apr 16, 2022
A plugin that uses multiple block, Tailwind and is fully integrated into the standard build process

Tailwind CSS Custom Block Plugin This repo leverages the @wordpress/scripts package and it's ability to use PostCSS to introduce TailwindCSS to the bu

Ryan Welcher 3 Dec 31, 2022