A ClojureScript library of UI components for Reagent.
- familiar UI widgetry components such as dropdowns, date pickers, popovers, tabs, etc.
- layout components, which arrange widgets vertically and horizontally, within splitters, etc. Plus components which put borders around their children. These various pieces can be arbitrarily nested to create sophisticated layouts.
- a mostly Bootstrap look, mixed with some Material Design Icons.
In short, re-com attempts to provide the kind of UI basics you'd need to build a desktop-class SPA app.
Warning #1: Uses Flexbox
The entire layout side of this library plus a few of the widgets rely on Flexbox
Pretty much every modern browser that you probably care about has support for Flexbox so this is probably a non-issue these days, unless you need to support old versions of IE.
We build desktop-class apps to run in controlled browser environments like Electron. So, we know we're dealing with Chrome.
Warning: No Mobile Focus
We can also confirm that none of the components have been designed with mobile in mind, and that there's no attempt to handle media queries. We said we had a desktop app focus, right?
Neither have we been worried too much about code size because other design goals have
taken precedence. To give you some idea, our main demo app which includes every component, plus all demo
code and plenty of yadda yadda explanatory strings, comes to about 167K compressed when
:optimizations :advanced (700K uncompressed).
That number includes ReactJS plus the ClojureScript libs and runtime. So, everything.
So, Without Ado Being Any Furthered ...
Start by looking at the demo.
Navigating The Source
When you are running the demo app, you'll see hyperlinks, to the right of page titles, which take you to the associated source code. That's a convenient way to navigate to either the components themselves or the demo code.
When browsing more generally, look in the
src directory or this repo, you'll notice
- re-com - the library itself - the components
- re-demo - the demo app, which shows how to use the components
Getting The Repo
git clone https://github.com/day8/re-com.git
Compiling And Running The Demo
This will run the demo, by doing:
- a clean
- a compile
[:demo] Build completed. is displayed in the console indicating
the dev HTTP server is ready.
Now you can open
http://localhost:3449/ in your
Run The (erm, modest) Tests
- compile the tests
- compile in release mode as a basic optimized build check
Run or Debug the tests:
Deploy The Demo App To S3 bucket
This will only work if you have the right credentials in your env:
re-com is available from clojars. Add it to your project.clj dependencies:
You should now be able to require the
re-com.core namespace, which exposes all of the API functions documented in the
re-demo example app.
You'll then need to include these asset folders in your app: https://github.com/day8/re-com/tree/master/run/resources/public/assets
As far as your
index.html is concerned, take inspiration from here:
In particular, you'll need bootstrap (assumedly via a CDN):
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.css">
And a reference to these two CSS files (make sure
re-com.css appears after
<link rel="stylesheet" href="assets/css/material-design-iconic-font.min.css"> <link rel="stylesheet" href="assets/css/re-com.css">
And a reference to the Roboto fonts (but this can be overridden relatively easily):
<link href="http://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic" rel="stylesheet" type="text/css"> <link href='http://fonts.googleapis.com/css?family=Roboto+Condensed:400,300' rel='stylesheet' type='text/css'>
Reagent comes bundled with a matching version of ReactJS, so you don't need to include it explicitly.
If you decide to use re-com, consider also using re-frame (an MVC-ish framework).
re-com can be used independently of each other, they dovetail well.
The Missing Components
- tree (not hard, just haven't needed one yet)
- menus - there's a dropdown, but no cascading menus
- maybe a dockable LHS navbar
- virtual grid. Straight v-box is good enough at small grids, so no problem there. But when the number of rows gets huge, you need a widget which does virtual rows, otherwise there's just too much DOM and there's performance problems. Can we use Fixed Data Tables for React?
- drag and drop.
- animations / transitions. We have ideas. They seem clunky.
- Focus management - When the user presses tab, to which field does focus move?
- Where the docs are wrong or fall short, write up something better. Because our docs take the form of an app written in ClojureScript using re-com, you're actually exercising your knowledge of re-com as you do this.
- See the list of missing components above. You'll have to produce the component itself, including a params spec, plus the extra page in the demo app.
- Test re-com on new browsers and iron out any quirks. Our focus is strictly Chrome.
Also, please refer to CONTRIBUTING.md for further details on creating issues and pull requests.
Copyright © 2015-2019 Michael Thompson
Distributed under The MIT License (MIT) - See LICENSE.txt