├── .github ├── FUNDING.yml └── workflows │ ├── continuous-deployment-workflow.yml │ └── continuous-integration-workflow.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── create-templates.sh ├── docs └── images │ └── devtools-settings.png ├── project.clj ├── resources └── leiningen │ └── new │ └── re_frame │ ├── README.md │ ├── clj-kondo │ └── config.edn │ ├── dev │ └── user.cljs │ ├── dir-locals.el │ ├── github │ └── workflows │ │ └── test.yaml │ ├── gitignore │ ├── karma.conf.js │ ├── package.json │ ├── resources │ └── public │ │ ├── index.html │ │ └── vendor │ │ ├── css │ │ ├── bootstrap.css │ │ ├── chosen-sprite.png │ │ ├── chosen-sprite@2x.png │ │ ├── material-design-iconic-font.min.css │ │ └── re-com.css │ │ └── fonts │ │ ├── Material-Design-Iconic-Font.eot │ │ ├── Material-Design-Iconic-Font.svg │ │ ├── Material-Design-Iconic-Font.ttf │ │ ├── Material-Design-Iconic-Font.woff │ │ └── Material-Design-Iconic-Font.woff2 │ ├── shadow-cljs.edn │ ├── src │ ├── config.cljs │ ├── core.cljs │ ├── db.cljs │ ├── events.cljs │ ├── routes.cljs │ ├── styles.cljs │ ├── subs.cljs │ ├── views.cljs │ ├── views_recom.cljs │ ├── views_recom_routes.cljs │ └── views_routes.cljs │ └── test │ └── core_test.cljs └── src └── leiningen └── new ├── options ├── base.clj ├── cider.clj ├── garden.clj ├── github_actions.clj ├── helpers.clj ├── kondo.clj ├── re_com.clj ├── routes.clj ├── test.clj └── views.clj └── re_frame.clj /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: mike-thompson-day8 2 | -------------------------------------------------------------------------------- /.github/workflows/continuous-deployment-workflow.yml: -------------------------------------------------------------------------------- 1 | name: cd 2 | on: 3 | push: 4 | tags: 5 | - "v[0-9]+.[0-9]+.[0-9]+*" 6 | 7 | jobs: 8 | test: 9 | name: Test 10 | runs-on: ubuntu-latest 11 | container: 12 | # Source: https://github.com/day8/dockerfiles-for-dev-ci-images 13 | image: ghcr.io/day8/chrome-56:2 14 | credentials: 15 | username: ${{ github.actor }} 16 | password: ${{ secrets.GITHUB_TOKEN }} 17 | steps: 18 | - uses: actions/checkout@v2 19 | with: 20 | # All of the Git history is required for day8/lein-git-inject to determine the version string. 21 | fetch-depth: 0 22 | - name: Maven cache 23 | uses: actions/cache@v4 24 | with: 25 | path: /root/.m2/repository 26 | key: ${{ runner.os }}-maven-${{ hashFiles('project.clj', '.github/workflows/**') }} 27 | restore-keys: | 28 | ${{ runner.os }}-maven- 29 | - name: npm cache 30 | uses: actions/cache@v4 31 | with: 32 | path: ~/.npm 33 | key: ${{ runner.os }}-npm-${{ hashFiles('project.clj') }}-${{ hashFiles('**/package.json') }} 34 | restore-keys: | 35 | ${{ runner.os }}-npm- 36 | - name: Test Templates 37 | run: ./create-templates.sh 38 | - name: Slack notification 39 | uses: homoluctus/slatify@v2.0.1 40 | if: failure() || cancelled() 41 | with: 42 | type: ${{ job.status }} 43 | job_name: re-frame-template Tests 44 | channel: '#oss-robots' 45 | url: ${{ secrets.SLACK_WEBHOOK }} 46 | commit: true 47 | token: ${{ secrets.GITHUB_TOKEN }} 48 | release: 49 | name: Release 50 | needs: test 51 | runs-on: ubuntu-latest 52 | container: 53 | # Source: https://github.com/day8/dockerfiles-for-dev-ci-images 54 | image: ghcr.io/day8/chrome-56:2 55 | credentials: 56 | username: ${{ github.actor }} 57 | password: ${{ secrets.GITHUB_TOKEN }} 58 | steps: 59 | - uses: actions/checkout@v2 60 | with: 61 | # All of the Git history is required for day8/lein-git-inject to determine the version string. 62 | fetch-depth: 0 63 | - name: Maven cache 64 | uses: actions/cache@v4 65 | with: 66 | path: /root/.m2/repository 67 | key: ${{ runner.os }}-maven-${{ hashFiles('project.clj', '.github/workflows/**') }} 68 | restore-keys: | 69 | ${{ runner.os }}-maven- 70 | - name: Run lein release 71 | env: 72 | CLOJARS_USERNAME: ${{ secrets.CLOJARS_USERNAME }} 73 | CLOJARS_TOKEN: ${{ secrets.CLOJARS_TOKEN }} 74 | GITHUB_USERNAME: ${{ github.actor }} 75 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 76 | run: | 77 | lein release 78 | # This creates a 'GitHub Release' from the tag and includes link to the CHANGELOG.md 79 | # We do not use draft or prerelease features as 80 | # we always want the latest release to show in the right hand column of the project 81 | # page regardless of if it is a stable release. 82 | - name: Create GitHub Release 83 | uses: actions/create-release@v1 84 | env: 85 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 86 | with: 87 | tag_name: ${{ github.ref }} 88 | release_name: ${{ github.ref }} 89 | body: | 90 | [Changelog](https://github.com/day8/re-frame-template/blob/master/CHANGELOG.md) 91 | draft: false 92 | prerelease: false 93 | - name: Slack notification 94 | uses: homoluctus/slatify@v2.0.1 95 | if: always() 96 | with: 97 | type: ${{ job.status }} 98 | job_name: re-frame-template Deployment 99 | channel: '#oss-robots' 100 | url: ${{ secrets.SLACK_WEBHOOK }} 101 | commit: true 102 | token: ${{ secrets.GITHUB_TOKEN }} 103 | -------------------------------------------------------------------------------- /.github/workflows/continuous-integration-workflow.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | on: 3 | push: 4 | paths-ignore: 5 | - "docs/**" 6 | - ".gitignore" 7 | - "CHANGELOG.md" 8 | - "LICENSE" 9 | - "README.md" 10 | 11 | jobs: 12 | test: 13 | name: Test 14 | runs-on: ubuntu-latest 15 | container: 16 | # Source: https://github.com/day8/dockerfiles-for-dev-ci-images 17 | image: ghcr.io/day8/chrome-56:2 18 | credentials: 19 | username: ${{ github.actor }} 20 | password: ${{ secrets.GITHUB_TOKEN }} 21 | steps: 22 | - uses: actions/checkout@v2 23 | with: 24 | # All of the Git history is required for day8/lein-git-inject to determine the version string. 25 | fetch-depth: 0 26 | - name: Maven cache 27 | uses: actions/cache@v4 28 | with: 29 | path: /root/.m2/repository 30 | key: ${{ runner.os }}-maven-${{ hashFiles('project.clj', '.github/workflows/**') }} 31 | restore-keys: | 32 | ${{ runner.os }}-maven- 33 | - name: npm cache 34 | uses: actions/cache@v4 35 | with: 36 | path: ~/.npm 37 | key: ${{ runner.os }}-npm-${{ hashFiles('project.clj') }}-${{ hashFiles('**/package.json') }} 38 | restore-keys: | 39 | ${{ runner.os }}-npm- 40 | - name: Test Templates 41 | run: ./create-templates.sh 42 | - name: Slack notification 43 | uses: homoluctus/slatify@v2.0.1 44 | if: failure() || cancelled() 45 | with: 46 | type: ${{ job.status }} 47 | job_name: re-frame-template Tests 48 | channel: '#oss-robots' 49 | url: ${{ secrets.SLACK_WEBHOOK }} 50 | commit: true 51 | token: ${{ secrets.GITHUB_TOKEN }} 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /classes 3 | /checkouts 4 | pom.xml 5 | pom.xml.asc 6 | *.jar 7 | *.class 8 | /.lein-* 9 | /.nrepl-port 10 | .hgignore 11 | .hg/ 12 | /.idea 13 | *.iml 14 | temp 15 | .lsp/sqlite*.db 16 | .calva/output-window/*.calva-repl 17 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 2.4.13 2 | 3 | #### Fixed 4 | 5 | - default shadow build for cider-jack-in-cljs now works correctly 6 | (.dir-locals.el) 7 | 8 | ## 2.4.12 9 | 10 | #### Changed 11 | 12 | - Conform to [structure best-practices](https://github.com/technomancy/leiningen/blob/master/doc/TEMPLATES.md#structure) 13 | 14 | ## 2.4.11 15 | 16 | #### Changed 17 | 18 | - Upgrade re-frame to 1.4.2 19 | 20 | ## 2.4.10 21 | 22 | #### Changed 23 | 24 | - Upgrade re-frame-10x to 1.9.3 25 | - Upgrade shadow-cljs to 2.26.2 26 | - Upgrade cider-nrepl to 0.44.0 27 | 28 | ## 2.4.8 29 | 30 | #### Changed 31 | 32 | - Upgrade re-frame to 1.3.0 33 | - Upgrade shadow-cljs to 2.19.9 34 | - Upgrade karma to 6.4.0 35 | - Upgrade karma-chrome-launcher to 3.1.1 36 | 37 | ## 2.4.7 38 | 39 | #### Changed 40 | 41 | - Upgrade shadow-cljs to 2.19.8 42 | - Upgrade re-frame-10x to 1.5.0 43 | 44 | ## 2.4.6 45 | 46 | #### Changed 47 | 48 | - Upgrade re-frame-10x to 1.2.8 49 | - Upgrade re-frisk to 1.6.0 50 | - Upgrade re-pressed to 0.3.2 51 | - Upgrade cider-nrepl to 0.28.4 52 | - Upgrade shadow-cljs to 2.19.0 53 | 54 | ## 2.4.5 55 | 56 | #### Changed 57 | 58 | - Upgrade re-frame-10x to 1.2.6 59 | - Upgrade binaryage/devtools to 1.0.6. This has critical fixes for re-frame-10x. 60 | - Upgrade shadow-cljs to 2.18.0 61 | 62 | ## 2.4.4 63 | 64 | #### Changed 65 | 66 | - Upgrade binaryage/devtools to 1.0.5. This has critical fixes for re-frame-10x. 67 | - Upgrade re-frame-10x to 1.2.4 68 | - Upgrade reagent to 1.1.1 69 | - Upgrade shadow-cljs to 2.17.8 70 | - Upgrade cider-nrepl to 0.28.3 71 | 72 | ## 2.4.3 73 | 74 | #### Changed 75 | 76 | - Upgrade re-frame-10x to [1.2.0](https://github.com/day8/re-frame-10x/blob/master/CHANGELOG.md#120-2021-11-03) 77 | 78 | ## 2.3.1 (2021-07-21) 79 | 80 | #### Changed 81 | 82 | - Upgrade shadow-cljs to [2.15.2](https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md#2152). 83 | 84 | ## 2.3.0 (2021-07-14) 85 | 86 | #### Added 87 | 88 | - Add 'npm run ancient' as an alias for [antq](https://github.com/liquidz/antq). Requires `clojure` CLI tools. 89 | 90 | #### Changed 91 | 92 | - Upgrade shadow-cljs to [2.15.1](https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md#2151) 93 | - Upgrade karma to 6.3.4 94 | - Upgrade cider-nrepl to 0.26.0 95 | 96 | ## 2.2.7 (2021-07-07) 97 | 98 | #### Changed 99 | 100 | - Upgrade shadow-cljs to [2.14.6](https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md#2146) 101 | - Upgrade pushy to 0.3.10 102 | - Upgrade re-frame-10x to 1.1.10 103 | 104 | ## 2.2.6 (2021-06-22) 105 | 106 | #### Changed 107 | 108 | - Upgrade re-frame-10x to 1.1.7. Fixes [several bugs](https://github.com/day8/re-frame-10x/blob/master/CHANGELOG.md#117-2021-06-22); 109 | 110 | ## 2.2.5 (2021-06-20) 111 | 112 | #### Changed 113 | 114 | - Upgrade re-frame-10x to 1.1.4 115 | - Upgrade reagent to 1.1.0 116 | - Upgrade shadow-cljs to [2.14.5](https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md#2145) 117 | 118 | ## 2.2.4 (2021-05-27) 119 | 120 | #### Fixed 121 | 122 | - Fix hot code reloading breaking navigation with `+routes` option. 123 | See [#163](https://github.com/day8/re-frame-template/issues/163). 124 | Thanks to [@Sose](https://github.com/Sose). 125 | 126 | ## 2.2.3 (2021-05-18) 127 | 128 | #### Fixed 129 | 130 | - Fix `+test` shadow-cljs `karma-test` and `browser-test` configs. 131 | See [#159](https://github.com/day8/re-frame-template/pull/159). 132 | Thanks to [@ertugrulcetin](https://github.com/ertugrulcetin). 133 | - Fix styles.cljs path in generated `README.md`. 134 | Thanks to [@aaronshim](https://github.com/aaronshim). 135 | - Fix fallback to `index.html`. See [#161](https://github.com/day8/re-frame-template/issues/161). 136 | Thanks to [@mattdamon108](https://github.com/mattdamon108). 137 | 138 | ## 2.2.2 (2021-04-28) 139 | 140 | #### Changed 141 | 142 | - Upgrade re-frisk to 1.5.1. Fixes [flexsurfer/re-frisk#63](https://github.com/flexsurfer/re-frisk/issues/63). 143 | Thanks to [@flexsurfer](https://github.com/flexsurfer). 144 | 145 | ## 2.2.1 (2021-04-20) 146 | 147 | #### Changed 148 | 149 | - Upgrade re-frisk to 1.5.0 150 | 151 | ## 2.2.0 (2021-04-17) 152 | 153 | #### Removed 154 | 155 | - Remove broken `+calva` option as Calva has built in support for pure shadow-cljs projects. 156 | Fixes [#155](https://github.com/day8/re-frame-template/issues/155) and 157 | [BetterThanTomorrow/calva#1121](https://github.com/BetterThanTomorrow/calva/issues/1121). 158 | Addresses [BetterThanTomorrow/calva#314](https://github.com/BetterThanTomorrow/calva/issues/314). Thanks to [@PEZ](https://github.com/PEZ). 159 | 160 | #### Changed 161 | 162 | - Upgrade shadow-cljs to [2.12.5](https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md#2125) 163 | - Upgrade karma to 6.3.2 164 | 165 | ## 2.1.2 (2021-04-13) 166 | 167 | #### Changed 168 | 169 | - Upgrade shadow-cljs to [2.12.4](https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md#2124) 170 | - Upgrade re-frisk to 1.4.0 171 | - Upgrade cider-nrepl to 0.25.11 172 | 173 | ## 2.1.1 (2021-04-06) 174 | 175 | #### Changed 176 | 177 | - Move `:preloads` to `:devtools` to align with current [shadow-cljs documentation](https://shadow-cljs.github.io/docs/UsersGuide.html#_preloads) 178 | 179 | ## 2.1.0 (2021-04-06) 180 | 181 | #### Changed 182 | 183 | - Upgrade to shadow-cljs 2.12.1 (includes [ClojureScript 1.10.844](https://github.com/clojure/clojurescript/blob/master/changes.md#110844)). 184 | - Upgrade karma to 6.3.0 185 | 186 | ## 2.0.5 (2021-04-05) 187 | 188 | #### Changed 189 | 190 | - Upgrade shadow-git-inject to 0.0.5 191 | 192 | ## 2.0.4 (2021-04-01) 193 | 194 | #### Changed 195 | 196 | - Upgrade shadow-git-inject to 0.0.4 197 | 198 | ## 2.0.3 (2021-04-01) 199 | 200 | #### Changed 201 | 202 | - Upgrade shadow-git-inject to 0.0.3 203 | 204 | ## 2.0.2 (2021-03-31) 205 | 206 | #### Fixed 207 | 208 | - Fix `+git-inject` option build hook configuration in `shadow-cljs.edn`. 209 | Thanks to [@thheller](https://github.com/thheller) for reporting the issue and fix. 210 | 211 | ## 2.0.1 (2021-03-31) 212 | 213 | #### Fixed 214 | 215 | - Fix deprecated usage of `:devtools` in `shadow-cljs.edn` by using `:dev-http` instead. 216 | Thanks to [@thheller](https://github.com/thheller) for reporting the issue and fix. 217 | 218 | ## 2.0.0 (2021-03-31) 219 | 220 | **BREAKING CHANGES:** `+handler` and `+less` options have been removed. 221 | 222 | **MAJOR COMMAND CHANGES:**` After creating your templated project instead of: 223 | - `lein watch` now use `npm run watch` 224 | - `lein shadow ...` now use `npx shadow-cljs ...` 225 | - `lein release` now use `npm run release` 226 | 227 | #### Changed 228 | 229 | - Replace lein with shadow-cljs. Leiningen is still used for templating (i.e. `lein new re-frame ...`), but the resulting 230 | output is now a pure shadow-cljs build with no dependency on Leiningen. This resolves a whole class of bugs and beginner 231 | confusion that was being caused by the more complex Leiningen setup. It also enables users to have a `npm` or `yarn` 232 | focused workflow for dependencies, as we no longer wrap those tools. 233 | 234 | #### Removed 235 | 236 | - Remove `+handler` option. Due to change from Leiningen to pure shadow-cljs. This is a client-focused template, and 237 | it is not worthwhile for us to maintain a backend implementation when there are other templates focused on that use 238 | case. We will not re-add this option. 239 | - Remove `+less` option. Due to change from Leiningen to pure shadow-cljs. We might be amenable to re-adding this 240 | if/when a shadow-cljs build hook for less is available. 241 | 242 | ## 1.5.0 (2021-03-23) 243 | 244 | #### Changed 245 | 246 | - Upgrade re-frame-10x to 1.0.2. Fixes [#150](https://github.com/day8/re-frame-template/issues/150). 247 | - Upgrade re-frame tracing to 0.6.2 248 | - Upgrade shadow-cljs to [2.11.24](https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md#21124) 249 | - Upgrade re-frisk to 1.3.12 250 | - Upgrade karma to 6.2.0 251 | - Upgrade ring to 1.9.2 252 | 253 | #### Added 254 | 255 | - Add `+git-inject` 256 | 257 | ## 1.4.2 (2021-03-08) 258 | 259 | #### Changed 260 | 261 | - Change to bidi and pushy for `+routes` 262 | - Upgrade karma 6.1.1 263 | - Upgrade shadow-cljs 2.11.21 264 | - Upgrade re-frame-10x to 1.0.1 265 | - Upgrade Clojure to 1.10.3 266 | 267 | ## 1.4.1 (2021-03-05) 268 | 269 | #### Fixed 270 | 271 | - Fix cider integration. See [#148](https://github.com/day8/re-frame-template/issues/148). Thanks to [@MrSFGriffin](https://github.com/MrSFGriffin). 272 | 273 | ## 1.4.0 (2021-02-25) 274 | 275 | #### Changed 276 | 277 | - Upgrade re-frame to 1.2.0 278 | - Upgrade re-frame-10x to 1.0.0 279 | - Upgrade re-com to 2.13.2 280 | - Upgrade reagent to 1.0.0 281 | - Upgrade shadow-cljs to 2.11.18 282 | - Upgrade Clojure to 1.10.2 283 | - Upgrade ring to 1.9.1 284 | 285 | ## 1.3.1 (2020-11-11) 286 | 287 | #### Fixed 288 | 289 | - Fix uberjar target, +handler profile and Heroku instructions. Thanks to 290 | [@dominem](https://github.com/dominem) and [@paulbutcher](https://github.com/paulbutcher). 291 | See [#139](https://github.com/day8/re-frame-template/pull/139) and [#145](https://github.com/day8/re-frame-template/pull/145). 292 | 293 | #### Changed 294 | 295 | - Upgrade [re-frame to 1.1.2](http://day8.github.io/re-frame/) 296 | - Upgrade shadow-cljs to 2.11.7 297 | - Upgrade ring to 1.8.2 298 | 299 | ## 1.3.0 (2020-09-28) 300 | 301 | #### Changed 302 | 303 | - Upgrade [lein-shadow to 0.3.1](https://gitlab.com/nikperic/lein-shadow/-/blob/master/CHANGELOG.md#030-2020-09-22) 304 | - Upgrade shadow-cljs to 2.11.4 305 | - Upgrade karma to 5.2.3 306 | 307 | ## 1.2.4 (2020-09-04) 308 | 309 | #### Fixed 310 | 311 | - Fix exception in `server.clj` when port is given from environment. See #140 312 | 313 | #### Changed 314 | 315 | - Upgrade [karma to 5.2.1](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md#521-2020-09-02) 316 | 317 | ## 1.2.3 (2020-08-26) 318 | 319 | #### Changed 320 | 321 | - Upgrade [re-frame to 1.1.1](http://day8.github.io/re-frame/releases/2020/#110-2020-08-24) 322 | 323 | ## 1.2.2 (2020-08-25) 324 | 325 | #### Changed 326 | 327 | - Upgrade [lein-shadow to 0.2.2](https://gitlab.com/nikperic/lein-shadow/-/blob/master/CHANGELOG.md#022-2020-08-07) 328 | - Upgrade [shadow-cljs to 2.11.0](https://github.com/thheller/shadow-cljs/commit/28169be104149e496b31bad443be7ecb6d16cd4a) 329 | - Upgrade [re-frame to 1.1.0](http://day8.github.io/re-frame/releases/2020/#110-2020-08-24) 330 | - Upgrade re-com to 2.9.0 331 | - Upgrade karma to 5.1.1 332 | - Upgrade compojure to 1.6.2 333 | 334 | ## 1.2.1 (2020-08-05) 335 | 336 | #### Fixed 337 | 338 | - Fix karma lein aliases on Windows 339 | 340 | #### Changed 341 | 342 | - Rename lein aliases to align with shadow-cljs terminology. Prints deprecated 343 | warning on use of old aliases so that it is not yet a breaking change. Old 344 | aliases will be removed in a future release. 345 | - Change `lein watch` (previously, `lein dev`) to watch all builds including 346 | the browser and karma test runners instead of just the application. 347 | - Upgrade shadow-cljs to 2.10.19 348 | 349 | ## 1.2.0 (2020-07-21) 350 | 351 | #### Changed 352 | 353 | - Upgrade re-frame to 1.0.0 354 | - Upgrade shadow-cljs to 2.10.17 355 | 356 | ## 1.1.4 (2020-07-16) 357 | 358 | #### Changed 359 | 360 | - Upgrade re-frame-10x to 0.7.0 361 | - Upgrade re-frisk to 1.3.4 362 | - Upgrade re-frame-tracing to 0.6.0 363 | 364 | ## 1.1.3 (2020-06-30) 365 | 366 | #### Changed 367 | 368 | - Upgrade [re-frame-tracing to 0.5.6](https://github.com/day8/re-frame-debux/blob/master/CHANGELOG.md) 369 | - Upgrade re-frame-10x to 0.6.6 370 | - Upgrade binaryage/devtools to 1.0.2 371 | - Upgrade ClojureScript 1.10.773 372 | - Upgrade shadow-cljs to 2.10.13 373 | 374 | ## 1.1.2 (2020-05-27) 375 | 376 | #### Added 377 | 378 | - Add Calva support. See [#132](https://github.com/day8/re-frame-template/pull/132). 379 | Thanks to [@PEZ](https://github.com/PEZ). 380 | 381 | ## 1.1.1 (2020-05-15) 382 | 383 | #### Changed 384 | 385 | - Upgrade re-frame-10x to [0.6.5](https://github.com/day8/re-frame-10x/blob/master/CHANGELOG.md#065---2020-05-15) 386 | 387 | ## 1.1.0 (2020-05-14) 388 | 389 | #### Changed 390 | 391 | - Upgrade ClojureScript to [1.10.764](https://github.com/clojure/clojurescript/blob/master/changes.md#110764) 392 | - Raise minimum Leiningen version for the generated project to `2.9.0` or later. Older versions *might* 393 | work, but we don't test them, so we may as well specify a properly tested and supported version. The 394 | previous required minimum `2.5.3` is also 5 years old, so thats really old. The new minimum `2.9.0` is 395 | 1.25 years old already, so its reasonable. 396 | - Upgrade shadow-cljs to 2.9.3 397 | 398 | ## 1.0.34 (2020-05-14) 399 | 400 | #### Changed 401 | 402 | - Upgrade `lein-shadow` to 0.2.0. 403 | See the [`lein-shadow` `CHANGELOG.md`](https://gitlab.com/nikperic/lein-shadow/-/blob/master/CHANGELOG.md) 404 | and [merge request](https://gitlab.com/nikperic/lein-shadow/-/merge_requests/3) for a full list of changes. 405 | See issues [#127](https://github.com/day8/re-frame-template/issues/127) and 406 | [#128](https://github.com/day8/re-frame-template/issues/128) for some of the background and ongoing 407 | discussion. Further changes to align with `shadow-cljs` and `npm` while maintaining a `lein`-focus may 408 | be forthcoming. Thanks to [@thheller](https://github.com/thheller) for his input. 409 | - Upgrade secretary to 1.2.4. Fixes day8/re-frame#530. Thanks to [@JDurstberger](https://github.com/JDurstberger). 410 | - Upgrade shadow-cljs to 2.9.2 411 | - Upgrade re-frisk to 1.3.2 412 | 413 | ## 1.0.33 (2020-05-11) 414 | 415 | #### Changed 416 | 417 | - Upgrade shadow-cljs to 2.9.0 418 | 419 | ## 1.0.32 (2020-05-06) 420 | 421 | #### Changed 422 | 423 | - Upgrade ClojureScript to [1.10.758](https://github.com/clojure/clojurescript/blob/master/changes.md#110758) 424 | - Upgrade shadow-cljs to 2.8.110 425 | - Upgrade garden to 1.3.10 426 | - Upgrade ring to 1.8.1 427 | 428 | ## 1.0.31 (2020-05-04) 429 | 430 | #### Changed 431 | 432 | - Upgrade re-frisk to 1.3.0 433 | 434 | ## 1.0.30 (2020-05-01) 435 | 436 | #### Changed 437 | 438 | - Use [lein-shadow](https://gitlab.com/nikperic/lein-shadow) and [ns aliases for tracing-stubs](https://github.com/day8/re-frame-debux/issues/30). 439 | - Upgrade re-frame-10x to [0.6.4](https://github.com/day8/re-frame-10x/blob/master/CHANGELOG.md#064---2020-05-01) 440 | - Upgrade re-frame-debux to 0.5.5 441 | 442 | #### Fixed 443 | 444 | - Fix use of deprecated reagent fns 445 | 446 | ## 1.0.29 (2020-04-30) 447 | 448 | #### Fixed 449 | 450 | - Fix missing clj-kondo config. See [#124](https://github.com/day8/re-frame-template/pull/124) 451 | 452 | #### Changed 453 | 454 | - Upgrade ClojureScript to [1.10.748](https://github.com/clojure/clojurescript/blob/master/changes.md) 455 | - Upgrade shadow-cljs to 2.8.109 456 | - Upgrade reagent to [0.10.0](https://github.com/reagent-project/reagent/blob/master/CHANGELOG.md#0100-2020-03-06) 457 | - Upgrade re-frame to [0.12.0](https://github.com/day8/re-frame/blob/master/CHANGELOG.md#0120-2020-03-08) 458 | - Upgrade re-com to [2.8.0](https://github.com/day8/re-com/blob/master/CHANGELOG.md#280-2020-03-08) 459 | - Upgrade re-frame-10x to [0.6.3](https://github.com/day8/re-frame-10x/blob/master/CHANGELOG.md#063---2020-04-30) 460 | - Upgrade re-frisk to 1.2.0 461 | - Upgrade ring to [1.8.0](https://github.com/ring-clojure/ring/blob/master/CHANGELOG.md#180-2019-11-13) 462 | 463 | ## 1.0.28 (2020-02-14) 464 | 465 | #### Changed 466 | 467 | - Upgrade binaryage/devtools to 1.0.0 468 | - Upgrade re-frame-10x to 0.5.1 469 | - Upgrade re-com to 2.7.0 470 | 471 | Overall these upgrades result in a consistent React version across all 472 | dependencies of [16.9.0](https://reactjs.org/blog/2019/08/08/react-v16.9.0.html). 473 | 474 | ## 1.0.27 (2020-01-20) 475 | 476 | #### Changed 477 | 478 | - Upgrade reagent to 0.9.1 479 | - Upgrade re-frame to 0.11.0 480 | 481 | #### Fixed 482 | 483 | - Some of the uberjar issues thanks to [Derek Passen](https://github.com/dpassen). 484 | See [#95](https://github.com/day8/re-frame-template/issues/95). 485 | - Add Garden/Less CSS compilation to build prep-tasks thanks to 486 | [@stevejmp](https://github.com/stevejmp). 487 | - Add lein, node, shadow-cljs items to .gitignore thanks to 488 | [@stevejmp](https://github.com/stevejmp). 489 | 490 | #### Added 491 | 492 | - +kondo profile thanks to [@stevejmp](https://github.com/stevejmp). 493 | 494 | #### Removed 495 | 496 | - Remove clean from lein aliases to workaround [#95](https://github.com/day8/re-frame-template/issues/95). 497 | - Unused test/cljs/runner.cljs thanks to [@stevejmp](https://github.com/stevejmp). 498 | - Unused leiningen.new.options.helpers/invoke-option fn thanks to 499 | [@stevejmp](https://github.com/stevejmp). 500 | 501 | ## [1.0.26 (2019-12-18)](https://github.com/day8/re-frame-template/runs/352988356) 502 | 503 | #### Fixed 504 | 505 | - Fixed docs re lein aliases thanks to [@stevejmp](https://github.com/stevejmp) 506 | 507 | #### Changed 508 | 509 | - Upgrade shadow-cljs to 2.8.83 510 | - Upgrade yogthos/config to 1.1.7 511 | 512 | ## [1.0.25 (2019-12-05)](https://github.com/day8/re-frame-template/runs/333630252) 513 | 514 | #### Changed 515 | 516 | - Upgrade shadow-cljs to 2.8.80 517 | 518 | ## [1.0.24 (2019-11-30)](https://github.com/day8/re-frame-template/runs/326469035) 519 | 520 | #### Changed 521 | 522 | - Upgrade shadow-cljs to 2.8.76 523 | - Downgrade re-frame-10x to 0.4.4 524 | 525 | #### Added 526 | 527 | - Add org.clojure/google-closure-library-third-party exclusion to ClojureScript dependency 528 | 529 | ## [1.0.23 (2019-11-20)](https://github.com/day8/re-frame-template/runs/311234380) 530 | 531 | #### Changed 532 | 533 | - Upgrade [ClojureScript to 1.10.597](https://clojurescript.org/news/2019-11-18-release) 534 | - Upgrade binaryage/devtools to 0.9.11 535 | - Upgrade shadow-cljs to 2.8.73 536 | 537 | ## [1.0.22 (2019-11-02)](https://github.com/day8/re-frame-template/runs/285090579) 538 | 539 | #### Changed 540 | 541 | - Upgrade shadow-cljs to 2.8.69 542 | - Upgrade re-frame-10x to 0.4.5 543 | - Migrate to me.arrdem/lein-git-version 544 | - Migrate to GitHub Actions based continuous integration and continuous deployment 545 | 546 | #### Added 547 | 548 | - Add LICENSE. Maintains the same LICENSE (MIT) that has always been present in the README.md file. Just makes it more 549 | accessible and obvious. 550 | 551 | ## 1.0.21 (2019-10-30) 552 | 553 | #### Changed 554 | 555 | - Upgrade shadow-cljs to 2.8.68 556 | 557 | ## 1.0.20 (2019-10-24) 558 | 559 | #### Added 560 | 561 | - Add lein build-report alias 562 | - Add clean to all lein aliases 563 | 564 | #### Changed 565 | 566 | - Rename lein karma-once alias to karma 567 | 568 | #### Fixed 569 | 570 | - Fix missing karma-junit-reporter dependency 571 | 572 | ## 1.0.19 (2019-10-24) 573 | 574 | #### Changed 575 | 576 | - Upgrade shadow-cljs to 2.8.67 577 | 578 | ## 1.0.18 (2019-10-22) 579 | 580 | #### Changed 581 | 582 | - Upgrade shadow-cljs to 2.8.65 583 | - Upgrade karma to 4.4.1 584 | 585 | ## 1.0.17 (2019-10-18) 586 | 587 | #### Fixed 588 | 589 | - Import goog.history.EventType properly. 590 | See [#94](https://github.com/day8/re-frame-template/pull/94). 591 | Thanks to [@Wegi](https://github.com/Wegi). 592 | 593 | #### Added 594 | 595 | - Added lein karma-once alias 596 | 597 | #### Changed 598 | 599 | - Upgrade shadow-cljs to 2.8.64 600 | - Upgrade yogthos/config to 1.1.6 601 | - Upgrade karma to 4.4.0 602 | 603 | ## 1.0.16 (2019-10-15) 604 | 605 | #### Changed 606 | 607 | - Upgrade re-frame-10x to 0.4.4 608 | 609 | ## 1.0.15 (2019-10-11) 610 | 611 | #### Changed 612 | 613 | - Upgrade shadow-cljs to 2.8.62 614 | 615 | ## 1.0.14 (2019-10-09) 616 | 617 | #### Changed 618 | 619 | - Upgrade shadow-cljs to 2.8.61 620 | 621 | ## 1.0.13 (2019-09-27) 622 | 623 | #### Changed 624 | 625 | - Upgrade shadow-cljs to 2.8.59 626 | 627 | ## 1.0.12 (2019-09-25) 628 | 629 | #### Changed 630 | 631 | - Upgrade shadow-cljs to 2.8.58 632 | 633 | ## 1.0.11 (2019-09-25) 634 | 635 | #### Changed 636 | 637 | - Upgrade shadow-cljs to 2.8.57 638 | 639 | ## 1.0.10 (2019-09-24) 640 | 641 | #### Changed 642 | 643 | - Upgrade shadow-cljs to 2.8.56 644 | 645 | ## 1.0.9 (2019-09-22) 646 | 647 | #### Changed 648 | 649 | - Upgrade shadow-cljs to 2.8.55 650 | 651 | ## 1.0.8 (2019-09-20) 652 | 653 | #### Changed 654 | 655 | - Upgrade shadow-cljs to 2.8.53 656 | - Upgrade re-com to 2.6.0 657 | - Upgrade re-pressed to 0.3.1 658 | 659 | ## 1.0.7 (2019-09-11) 660 | 661 | #### Changed 662 | 663 | - Upgrade re-frame-10x to 0.4.3 664 | - Upgrade lein-garden to 0.3.0 665 | 666 | #### Removed 667 | 668 | - Empty generated `core.clj` [#93](https://github.com/day8/re-frame-template/pull/93) 669 | thanks to @thheller 670 | 671 | ## 1.0.6 (2019-08-28) 672 | 673 | #### Changed 674 | 675 | - Upgrade shadow-cljs to 2.8.52 676 | - Upgrade re-frame to 0.10.9 677 | - Upgrade karma to 4.3.0 678 | 679 | ## 1.0.5 (2019-08-24) 680 | 681 | #### Fixed 682 | 683 | - 1.0.4 introduced a regression whereby if the +10x profile was not used an 684 | extra bracket in `shadow-cljs.edn` would cause the build to fail. This is 685 | fixed in 1.0.5. See [#92](https://github.com/day8/re-frame-template/issues/92). 686 | 687 | ## 1.0.4 (2019-08-21) 688 | 689 | #### Changed 690 | 691 | - Greatly simplified shadow-cljs config thanks to @thheller 692 | - Upgrade react-flip-move to 3.0.3. Fixes warning of depedency conflict with re-frame-10x. 693 | - Upgrade karma-chrome-launcher to 3.1.0 694 | - Upgrade to shadow-cljs 2.8.51 695 | 696 | #### Fixed 697 | 698 | - +cider profile adds -Xmx1G :jvm-opts as a workaround for Emacs cider-jack-in-cljs failure 699 | thanks to investigation and report by @Quezion 700 | 701 | ## 1.0.3 (2019-08-18) 702 | 703 | #### Fixed 704 | 705 | - Don't use unsafe version ranges in package.json 706 | 707 | ## 1.0.2 (2019-08-16) 708 | 709 | #### Changed 710 | 711 | - Upgrade shadow-cljs to 2.8.48 712 | 713 | ## 1.0.1 (2019-08-12) 714 | 715 | #### Changed 716 | 717 | - Upgrade shadow-cljs to 2.8.45 718 | 719 | #### Removed 720 | 721 | - Remove +gadfly profile 722 | 723 | ## 1.0.0 (2019-08-06) 724 | 725 | #### Changed 726 | 727 | - Migrate to shadow-cljs 728 | 729 | ## 0.3.23 (2019-07-15) 730 | 731 | #### Changed 732 | 733 | - Upgrade re-frame to 0.10.8 734 | 735 | ## 0.3.22 (2019-06-08) 736 | 737 | #### Changed 738 | 739 | - Upgrade compojure to 1.6.1 740 | - Upgrade garden to 1.3.9 741 | - Upgrade Clojure to 1.10.1 742 | - Upgrade re-com to 2.5.0 743 | - Upgrade re-pressed to 0.3.0 744 | - Upgrade re-frame-10x to 0.4.0 745 | - Upgrade ns-tracker to 0.4.0 746 | - Upgrade re-frisk to 0.5.4.1 747 | - Upgrade ring to 1.7.1 748 | - Upgrade yogthos/config 1.1.2 749 | - Upgrade figwheel-sidecar to 0.5.18 750 | - Upgrade cider/piggieback to 0.4.1 751 | 752 | ## 0.3.20 (2019-03-12) 753 | 754 | #### Fixed 755 | 756 | - Ensure that .gitignore is created 757 | 758 | ## 0.3.19 (2019-03-11) 759 | 760 | #### Changed 761 | 762 | - Upgrade re-com to 2.4.0 763 | 764 | #### Removed 765 | 766 | - Transitive dependencies on cljs-time and core.async 767 | 768 | ## 0.3.18 (2019-03-11) 769 | 770 | #### Changed 771 | 772 | - Upgrade Clojure to 1.10.0 773 | - Upgrade ClojureScript to 1.10.520 774 | - Upgrade reagent to 0.8.1 775 | - Upgrade re-frame to 0.10.6 776 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2015-2018 Matthew Jaoudi 4 | Copyright (c) 2015 Dylan Paris 5 | Copyright (c) 2015 Michael Thompson 6 | Copyright (c) 2015 Markku Rontu 7 | Copyright (c) 2016 Daniel Compton 8 | Copyright (c) 2019 Isaac Johnston 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 7 | [![Clojars Project](https://img.shields.io/clojars/v/re-frame/lein-template?style=for-the-badge&logo=clojure&logoColor=fff)](https://clojars.org/re-frame/lein-template) 8 | [![GitHub issues](https://img.shields.io/github/issues-raw/day8/re-frame-template?style=for-the-badge&logo=github)](https://github.com/day8/re-frame-template/issues) 9 | [![GitHub](https://img.shields.io/github/license/day8/re-frame-template?style=for-the-badge)](https://github.com/day8/re-frame-template/blob/master/LICENSE) 10 | 11 | # re-frame-template 12 | 13 | This is a `Leiningen` template for creating a [re-frame](https://github.com/day8/re-frame) application scaffold (client only) 14 | with a [shadow-cljs](https://shadow-cljs.github.io/docs/UsersGuide.html) build. 15 | It will take you 60 seconds to create your first re-frame app and start to edit it. 16 | 17 | 18 | 19 | You can pick and choose what "extras" you'd like included into the scaffold - "extras" like libraries to do routing, debugging and CSS. 20 | 21 | ## Before You Start 22 | 23 | You'll need to install `Leiningen` (a build tool) by following [these instructions](https://purelyfunctional.tv/guide/how-to-install-clojure/). 24 | 25 | You'll also need [Node.js](https://nodejs.org/en/download/). 26 | 27 | ## Basic Usage 28 | 29 | The base template includes: 30 | 31 | * [re-frame](https://github.com/day8/re-frame) 32 | * [shadow-cljs](https://shadow-cljs.github.io/docs/UsersGuide.html) 33 | * [cljs-devtools](https://github.com/binaryage/cljs-devtools) 34 | 35 | To create an application with just the base template, use this commandline: 36 | ```sh 37 | $ lein new re-frame 38 | ``` 39 | When using this command, you'll need to substitute in your own `` - perhaps `my-killer-app` or `an-early-masterpiece`. 40 | 41 | > **Troubleshooting note:** for `` don't use `cljs`. That name will confuse the compiler (long story) and you will later see errors like `cljs.core.init is not a function`. 42 | 43 | ## Extras 44 | 45 | The following "extras" can be nominated on the commandline when you create the template: 46 | 47 | * CSS 48 | * [garden](https://github.com/noprompt/garden) with [spade](https://github.com/dhleong/spade) (`+garden`) 49 | * Debug 50 | * [re-frame-10x](https://github.com/day8/re-frame-10x) (`+10x`) 51 | * [re-frisk](https://github.com/flexsurfer/re-frisk) (`+re-frisk`) 52 | * Development 53 | * [cider](https://github.com/clojure-emacs/cider) (`+cider`) 54 | * [clj-kondo](https://github.com/borkdude/clj-kondo) (`+kondo`) 55 | * [cljs.test](https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/test.cljs) (`+test`) 56 | * [git-inject](https://github.com/day8/shadow-git-inject) (`+git-inject`) 57 | * Misc. 58 | * [re-com](https://github.com/day8/re-com) (`+re-com`) 59 | * [re-pressed](https://github.com/gadfly361/re-pressed) (`+re-pressed`) 60 | * [breaking-point](https://github.com/gadfly361/breaking-point) (`+breaking-point`) 61 | * [github-actions](https://github.com/features/actions) (`+github-actions`) 62 | * Routing 63 | * [bidi](https://github.com/juxt/bidi) and [pushy](https://github.com/clj-commons/pushy) (`+routes`) 64 | 65 | To add an `extra` to the base template, append its name to the commandline, with a leading `+`. Here's an example of adding `re-com`: 66 | 67 | ``` 68 | lein new re-frame +re-com 69 | ``` 70 | Note: it is `+re-com`, not just `re-com`. 71 | 72 | Any combination of `extras` can be added at once: 73 | 74 | ``` 75 | lein new re-frame +garden +re-com +routes +test +10x 76 | ``` 77 | 78 | > Note: to assist debugging, you'll want to include either `+10x` or `+re-frisk` 79 | 80 | ## Start Cider from Emacs (if using +cider): 81 | 82 | Refer to the [shadow-cljs Emacs / CIDER documentation](https://shadow-cljs.github.io/docs/UsersGuide.html#cider). 83 | 84 | The mentioned `dir-local.el` file is created by this template. 85 | 86 | ## Connect Calva from VS Code: 87 | 88 | [Calva](https://github.com/BetterThanTomorrow/calva) has built-in support for `shadow-cljs` projects (that's why there is no `+calva` option for creating this project). 89 | 90 | 0. `npm install` 91 | 1. From VS Code, issue the command **Calva: Start a Project REPL and Connect (a.k.a Jack-in)**, `ctrl+alt+c ctrl+alt+j`. 92 | * Calva will auto-detect that this is a `shadow-cljs` project and ask for which build to compile. 93 | * Calva's output window will open and log some progress information. 94 | 1. When prompted for which build to start, select `:app`. 95 | * `:app` is the only configured build, but the VS Code menu for this is a bit strange so _make sure the `:app` checkbox is really ticked before proceeding_. 96 | * This will start the app, so in this workflow you don't do the **Run application** steps outlined below. 97 | 1. When prompted for which build to connect to, select `:app`. 98 | * In the **View** menu of VS Code, you can tell it to show the **Terminal** view, where you see which command the jack-in process is started with, and it's output. `Ctrl+C` in this pane will kill your app and free up all resources it has allocated. 99 | 1. When the app is compiled 100 | 1. Open http://localhost:8280 in your browser. 101 | 1. Confirm that it says *Hello from re-frame*. (Depending on how long the app takes to compile, you might need to reload the page a few times.) 102 | 1. Open the `views.cljs` file from `src/` and issue **Calva: Load Current File and Dependencies**. `ctrl+alt+c enter`. 103 | 1. Confirm that you are connected by adding evaluating `(js/alert "Hello from Calva")` (`alt+enter` and `ctrl+enter` are your friends). 104 | 1. Confirm that Shadow is hot reloading by changing the greeting message. 105 | 106 | 107 | See https://calva.io for more on how to use Calva. 108 | 109 | 110 | ## Run application: 111 | 112 | ```sh 113 | npm install 114 | npm run watch 115 | ``` 116 | 117 | or 118 | 119 | ```sh 120 | npm install 121 | npx shadow-cljs watch app browser-test karma-test 122 | ``` 123 | 124 | Wait a bit, perhaps 20 seconds, keeping an eye out for a sign the compile has finished, then browse to [http://localhost:8280](http://localhost:8280). 125 | 126 | To see the other available `shadow-cljs` commands run: 127 | ``` 128 | npx shadow-cljs --help 129 | ``` 130 | 131 | ## Setting Up Your Browser 132 | 133 | So, you now have the application running. 134 | 135 | Before you start developing, you should tweak two settings within your 136 | browser's `devtools`. These are one-time actions (for each browser and laptop you use). 137 | I'll assume Chrome for the purposes of further explanation: 138 | 139 | 1. Open devtools. Press press `F12` or `Ctrl-Shift-i` ([actually there's a variety of ways](https://developer.chrome.com/devtools)) 140 | 1. Open the devtools "Settings" panel. Press F1. (Careful. Not the settings panel for Chrome itself!! The settings panel for devtools) 141 | 1. Under the "Network" heading, tick the option "Disable cache (while DevTools is open)". You don't want shadow-clj's attempts at reloading to be defeated by caching. 142 | 1. Under the "Console" heading, tick the option "Enable custom formatters". This allows [cljs-devtools](https://github.com/binaryage/cljs-devtools) to perform its magic. 143 | 1. Close Settings. Close Devtools. 144 | 1. Reopen Devtools 145 | 146 | ![settings](docs/images/devtools-settings.png) 147 | 148 | ## Open 10x Panel (if using +10x): 149 | 150 | To use `re-frame-10x` for debugging your app: 151 | 1. click on the application, minimal through it is, to give it "input focus" (you want to be sure that any key presses are going to your new app) 152 | 2. press `Ctrl-Shift-X` and you should see the `re-frame-10x` panel appear on the right side of the window 153 | 154 | Sometimes achieving Step 1 on a really simple app - one without widgets - can be fiddly, 155 | because the browser itself hogs "input focus" and grabs all the keystrokes (like `Ctrl-Shift-X`) which don't 156 | then make it through to your app. You may need to be determined and creative with Step 1. 157 | I have every confidence in you. 158 | 159 | ## Hot Reloading Is Now Go 160 | 161 | If you now edit files, shadow-cljs will automatically 162 | recompile your changes and "hot load" them into your running app, without your app needing 163 | to be re-started. The resulting fast, iterative workflow tends to make you very productive, and 164 | is cherished by those lucky enough to experience it. 165 | 166 | Start by editing this file: `/src/cljs//views.cljs`. 167 | 168 | ### debug?: 169 | 170 | In the namespace _app-name.config_, there is a var called `debug?`, which defaults to 171 | _true_ in the `dev` build, and _false_ in the `prod` build. 172 | 173 | If, for example, you wrap your `println`s with a `when` block as shown below, 174 | then you will get logs printed to the browser's console for the `dev` build and 175 | not the `prod` build. 176 | 177 | ```clojure 178 | (when config/debug? 179 | (println "dev mode")) 180 | ``` 181 | 182 | ## Run tests (if using +test): 183 | 184 | Run your tests 185 | 186 | ``` 187 | npm install 188 | npm run watch 189 | ``` 190 | 191 | And in another terminal: 192 | ``` 193 | karma start 194 | ``` 195 | 196 | ## GitHub Actions 197 | 198 | After a push, head to the actions section of GitHub repo to see the pipeline processing. 199 | 200 | 201 | ## Production Build 202 | 203 | To compile clojurescript to javascript: 204 | 205 | ```sh 206 | npm run release 207 | ``` 208 | 209 | ## How to Add Dependencies 210 | 211 | Your new application is built by a tool chain controlled by [shadow-cljs](http://shadow-cljs.org/) (a modern CLJS compiler). 212 | 213 | There are two files of interest: 214 | - `shadow-cljs.edn` - edit this file if you want to add Clojure and ClojureScript dependency as [you would for a normal 215 | Leiningen project](https://github.com/technomancy/leiningen/blob/stable/doc/TUTORIAL.md#dependencies). 216 | - `package.json` - edit this file if you want to add a JavaScript and NPM dependency. 217 | 218 | ## Other Templates 219 | 220 | * [chestnut](https://github.com/plexus/chestnut) 221 | * [luminus](https://github.com/luminus-framework/luminus-template) (full stack) 222 | * [reagent-figwheel](https://github.com/gadfly361/reagent-figwheel) 223 | * [reagent-seed](https://github.com/gadfly361/reagent-seed) 224 | 225 | ## Backend Options 226 | 227 | This template does NOT include a backend. You may want to look at the following for backend options: 228 | 229 | * [ring](https://github.com/ring-clojure/ring) and [liberator](http://clojure-liberator.github.io/liberator/) 230 | * [duct](https://github.com/duct-framework/duct) 231 | * [yada](https://github.com/juxt/yada) 232 | * [pedestal](https://github.com/pedestal/pedestal) and [vase](https://github.com/cognitect-labs/vase) 233 | 234 | ## More re-frame 235 | 236 | Looking for more re-frame inspiration, templates or example applications? 237 | See the [external resources](https://github.com/day8/re-frame/blob/master/docs/External-Resources.md) docs page. 238 | 239 | ## Contributing 240 | 241 | Contributions are welcomed! To add a new profile, this is what I'd recommend: 242 | 243 | 1. Add a file with the name of the profile [here](https://github.com/day8/re-frame-template/tree/master/src/leiningen/new/options) 244 | 2. Look at the existing options in that folder for inspiration for what to include in that file 245 | 3. Update [re_frame.clj](https://github.com/day8/re-frame-template/blob/master/src/leiningen/new/re_frame.clj) with the profile 246 | 4. Add any new files [here](https://github.com/day8/re-frame-template/tree/master/src/leiningen/new/re_frame) and use the {{ var-name }} syntax as needed 247 | 5. Update the [README](https://github.com/day8/re-frame-template/tree/master/src/leiningen/new/re_frame) that will result when the template is used, as well as the top-level [README](https://github.com/day8/re-frame-template/blob/master/README.md) for re-frame-template itself 248 | 6. In a terminal, at the root of re-frame-template, run `lein install` 249 | 7. Locally test that your profile works, `lein new re-frame +` 250 | 8. Add your profile to [create-templates](https://github.com/day8/re-frame-template/blob/master/create-templates.sh) and run the script to make sure the other profiles didn't break. 251 | 252 | ## License 253 | 254 | ``` 255 | The MIT License (MIT) 256 | 257 | Copyright © 2015-2018 Matthew Jaoudi 258 | Copyright © 2015 Dylan Paris 259 | Copyright © 2015 Michael Thompson 260 | Copyright © 2015 Markku Rontu 261 | Copyright © 2016 Daniel Compton 262 | Copyright © 2019-2021 Isaac Johnston 263 | 264 | Permission is hereby granted, free of charge, to any person obtaining a copy 265 | of this software and associated documentation files (the "Software"), to deal 266 | in the Software without restriction, including without limitation the rights 267 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 268 | copies of the Software, and to permit persons to whom the Software is 269 | furnished to do so, subject to the following conditions: 270 | 271 | The above copyright notice and this permission notice shall be included in all 272 | copies or substantial portions of the Software. 273 | 274 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 275 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 276 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 277 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 278 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 279 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 280 | SOFTWARE. 281 | ``` 282 | -------------------------------------------------------------------------------- /create-templates.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm -r temp 4 | mkdir temp 5 | cd temp 6 | 7 | printf "\ncreating base\n" 8 | lein new re-frame base 9 | cd base 10 | npm install 11 | npm run release 12 | cd resources/public 13 | google-chrome --headless --disable-gpu index.html || chromium --headless --disable-gpu index.html 14 | cd ../../.. 15 | 16 | printf "\ncreating base +routes\n" 17 | lein new re-frame base-routes +routes 18 | cd base-routes 19 | npm install 20 | npm run release 21 | cd resources/public 22 | google-chrome --headless --disable-gpu index.html || chromium --headless --disable-gpu index.html 23 | cd ../../.. 24 | 25 | printf "\ncreating base +re-com\n" 26 | lein new re-frame base-recom +re-com 27 | cd base-recom 28 | npm install 29 | npm run release 30 | cd resources/public 31 | google-chrome --headless --disable-gpu index.html || chromium --headless --disable-gpu index.html 32 | cd ../../.. 33 | 34 | printf "\ncreating base +routes +re-com\n" 35 | lein new re-frame base-routes-recom +routes +re-com 36 | cd base-routes-recom 37 | npm install 38 | npm run release 39 | cd resources/public 40 | google-chrome --headless --disable-gpu index.html || chromium --headless --disable-gpu index.html 41 | cd ../../.. 42 | 43 | printf "\ncreating base +10x +breaking-point +cider +garden +handler +kondo +re-com +re-frisk +re-pressed +routes +test +github-actions\n" 44 | lein new re-frame everything +10x +breaking-point +cider +garden +git-inject +kondo +re-com +re-frisk +re-pressed +routes +test +github-actions 45 | cd everything 46 | npm install 47 | npm run release 48 | npm run ci 49 | cd resources/public 50 | google-chrome --headless --disable-gpu index.html || chromium --headless --disable-gpu index.html 51 | 52 | cd ../../.. 53 | -------------------------------------------------------------------------------- /docs/images/devtools-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/day8/re-frame-template/3d4358f14bc2e85b22ba6bafaddfb9561b204d15/docs/images/devtools-settings.png -------------------------------------------------------------------------------- /project.clj: -------------------------------------------------------------------------------- 1 | (defproject re-frame/lein-template "lein-git-inject/version" 2 | :description "Leiningen template for a Reagent web app that implements the re-frame pattern." 3 | :url "https://github.com/day8/re-frame-template" 4 | :license {:name "MIT"} 5 | 6 | :plugins [[day8/lein-git-inject "0.0.14"]] 7 | 8 | :middleware [leiningen.git-inject/middleware] 9 | 10 | :deploy-repositories [["clojars" {:sign-releases false 11 | :url "https://clojars.org/repo" 12 | :username :env/CLOJARS_USERNAME 13 | :password :env/CLOJARS_TOKEN}]] 14 | 15 | :release-tasks [["deploy" "clojars"]] 16 | 17 | :scm {:name "git" 18 | :url "https://github.com/day8/re-frame-template"} 19 | 20 | :eval-in-leiningen true) 21 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/README.md: -------------------------------------------------------------------------------- 1 | # {{name}} 2 | 3 | A [re-frame](https://github.com/day8/re-frame) application designed to ... well, that part is up to 4 | you. 5 | 6 | ## Getting Started 7 | 8 | ### Project Overview 9 | 10 | * Architecture: 11 | [Single Page Application (SPA)](https://en.wikipedia.org/wiki/Single-page_application) 12 | * Languages 13 | - Front end is [ClojureScript](https://clojurescript.org/) with ([re-frame](https://github.com/day8/re-frame)){{#garden?}} 14 | - CSS compilation is [Garden](https://github.com/noprompt/garden) with [Spade](https://github.com/dhleong/spade){{/garden?}} 15 | * Dependencies 16 | - UI framework: [re-frame](https://github.com/day8/re-frame) 17 | ([docs](https://github.com/day8/re-frame/blob/master/docs/README.md), 18 | [FAQs](https://github.com/day8/re-frame/blob/master/docs/FAQs/README.md)) -> 19 | [Reagent](https://github.com/reagent-project/reagent) -> 20 | [React](https://github.com/facebook/react){{#routes?}} 21 | - Client-side routing: [bidi](https://github.com/juxt/bidi) and [pushy](https://github.com/clj-commons/pushy){{/routes?}}{{#garden?}} 22 | - CSS rendering: [Garden](https://github.com/noprompt/garden){{/garden?}}{{#re-com?}} 23 | - UI components: [re-com](https://github.com/day8/re-com){{/re-com?}}{{#re-pressed?}} 24 | - Keyboard event handler: [re-pressed](https://github.com/gadfly361/re-pressed){{/re-pressed?}}{{#breaking-point?}} 25 | - Screen breakpoints tool: [BREAKING-POINT](https://github.com/gadfly361/breaking-point){{/breaking-point?}} 26 | * Build tools 27 | - CLJS compilation, dependency management, REPL, & hot reload: [`shadow-cljs`](https://github.com/thheller/shadow-cljs){{#test?}} 28 | - Test framework: [cljs.test](https://clojurescript.org/tools/testing) 29 | - Test runner: [Karma](https://github.com/karma-runner/karma){{/test?}} 30 | * Development tools 31 | - Debugging: [CLJS DevTools](https://github.com/binaryage/cljs-devtools){{#10x?}}, 32 | [`re-frame-10x`](https://github.com/day8/re-frame-10x){{/10x?}}{{#re-frisk?}}, 33 | [re-frisk](https://github.com/flexsurfer/re-frisk){{/re-frisk?}}{{#cider?}} 34 | - Emacs integration: [CIDER](https://github.com/clojure-emacs/cider){{/cider?}}{{#kondo?}} 35 | - Linter: [clj-kondo](https://github.com/borkdude/clj-kondo){{/kondo?}} 36 | 37 | #### Directory structure 38 | 39 | * [`/`](/../../): project config files{{#kondo?}} 40 | * [`.clj-kondo/`](.clj-kondo/): lint config and cache files (cache files are not tracked; see 41 | [`.gitignore`](.gitignore)){{/kondo?}} 42 | * [`dev/`](dev/): source files compiled only with the [dev](#running-the-app) profile 43 | - [`user.cljs`](dev/cljs/user.cljs): symbols for use during development in the 44 | [ClojureScript REPL](#connecting-to-the-browser-repl-from-a-terminal) 45 | * [`resources/public/`](resources/public/): SPA root directory; 46 | [dev](#running-the-app) / [prod](#production) profile depends on the most recent build{{#re-com?}} 47 | - [`vendor/`](resources/public/vendor/): UI component CSS, fonts, and images 48 | ([re-com](https://github.com/day8/re-com)){{/re-com?}} 49 | - [`index.html`](resources/public/index.html): SPA home page 50 | - Dynamic SPA content rendered in the following `div`: 51 | ```html 52 |
53 | ``` 54 | - Customizable; add headers, footers, links to other scripts and styles, etc. 55 | - Generated directories and files 56 | - Created on build with either the [dev](#running-the-app) or [prod](#production) profile 57 | - `js/compiled/`: compiled CLJS (`shadow-cljs`) 58 | - Not tracked in source control; see [`.gitignore`](.gitignore){{#garden?}} 59 | * [`src/{{sanitized}}/styles.cljs`](src/{{sanitized}}/styles.cljs): CSS compilation source file (ClojureScript, 60 | [Garden](https://github.com/noprompt/garden)){{/garden?}} 61 | * [`src/{{sanitized}}/`](src/{{sanitized}}/): SPA source files (ClojureScript, 62 | [re-frame](https://github.com/Day8/re-frame)) 63 | - [`core.cljs`](src/{{sanitized}}/core.cljs): contains the SPA entry point, `init`{{#test?}} 64 | * [`test/{{sanitized}}/`](test/{{sanitized}}/): test files (ClojureScript, 65 | [cljs.test](https://clojurescript.org/tools/testing)) 66 | - Only namespaces ending in `-test` (files `*_test.cljs`) are compiled and sent to the test runner{{/test?}} 67 | * [`.github/workflows/`](.github/workflows/): contains the 68 | [github actions](https://github.com/features/actions) pipelines. 69 | - [`test.yaml`](.github/workflows/test.yaml): Pipeline for testing. 70 | 71 | 72 | ### Editor/IDE 73 | 74 | Use your preferred editor or IDE that supports Clojure/ClojureScript development. See 75 | [Clojure tools](https://clojure.org/community/resources#_clojure_tools) for some popular options. 76 | 77 | ### Environment Setup 78 | 79 | 1. Install [JDK 8 or later](https://openjdk.java.net/install/) (Java Development Kit) 80 | 2. Install [Node.js](https://nodejs.org/) (JavaScript runtime environment) which should include 81 | [NPM](https://docs.npmjs.com/cli/npm) or if your Node.js installation does not include NPM also install it.{{#test?}} 82 | 3. Install [Chrome](https://www.google.com/chrome/) or 83 | [Chromium](https://www.chromium.org/getting-involved/download-chromium) version 59 or later 84 | (headless test environment) 85 | * For Chromium, set the `CHROME_BIN` environment variable in your shell to the command that 86 | launches Chromium. For example, in Ubuntu, add the following line to your `.bashrc`: 87 | ```bash 88 | export CHROME_BIN=chromium-browser 89 | ```{{/test?}}{{#kondo?}} 90 | 4. Install [clj-kondo](https://github.com/borkdude/clj-kondo/blob/master/doc/install.md) (linter){{/kondo?}} 91 | 5. Clone this repo and open a terminal in the `{{name}}` project root directory{{#kondo?}} 92 | 6. (Optional) Setup [lint cache](https://github.com/borkdude/clj-kondo#project-setup): 93 | ```sh 94 | clj-kondo --lint "$(npx shadow-cljs classpath)" 95 | ``` 96 | 7. Setup 97 | [linting in your editor](https://github.com/borkdude/clj-kondo/blob/master/doc/editor-integration.md){{/kondo?}} 98 | 99 | ### Browser Setup 100 | 101 | Browser caching should be disabled when developer tools are open to prevent interference with 102 | [`shadow-cljs`](https://github.com/thheller/shadow-cljs) hot reloading. 103 | 104 | Custom formatters must be enabled in the browser before 105 | [CLJS DevTools](https://github.com/binaryage/cljs-devtools) can display ClojureScript data in the 106 | console in a more readable way. 107 | 108 | #### Chrome/Chromium 109 | 110 | 1. Open [DevTools](https://developers.google.com/web/tools/chrome-devtools/) (Linux/Windows: `F12` 111 | or `Ctrl-Shift-I`; macOS: `⌘-Option-I`) 112 | 2. Open DevTools Settings (Linux/Windows: `?` or `F1`; macOS: `?` or `Fn+F1`) 113 | 3. Select `Preferences` in the navigation menu on the left, if it is not already selected 114 | 4. Under the `Network` heading, enable the `Disable cache (while DevTools is open)` option 115 | 5. Under the `Console` heading, enable the `Enable custom formatters` option 116 | 117 | #### Firefox 118 | 119 | 1. Open [Developer Tools](https://developer.mozilla.org/en-US/docs/Tools) (Linux/Windows: `F12` or 120 | `Ctrl-Shift-I`; macOS: `⌘-Option-I`) 121 | 2. Open [Developer Tools Settings](https://developer.mozilla.org/en-US/docs/Tools/Settings) 122 | (Linux/macOS/Windows: `F1`) 123 | 3. Under the `Advanced settings` heading, enable the `Disable HTTP Cache (when toolbox is open)` 124 | option 125 | 126 | Unfortunately, Firefox does not yet support custom formatters in their devtools. For updates, follow 127 | the enhancement request in their bug tracker: 128 | [1262914 - Add support for Custom Formatters in devtools](https://bugzilla.mozilla.org/show_bug.cgi?id=1262914). 129 | 130 | ## Development 131 | 132 | ### Running the App 133 | 134 | Start a temporary local web server, build the app with the `dev` profile, and serve the app, 135 | browser test runner and karma test runner with hot reload: 136 | 137 | ```sh 138 | npm install 139 | npx shadow-cljs watch app 140 | ``` 141 | 142 | Please be patient; it may take over 20 seconds to see any output, and over 40 seconds to complete. 143 | 144 | When `[:app] Build completed` appears in the output, browse to 145 | [http://localhost:8280/](http://localhost:8280/). 146 | 147 | [`shadow-cljs`](https://github.com/thheller/shadow-cljs) will automatically push ClojureScript code 148 | changes to your browser on save. To prevent a few common issues, see 149 | [Hot Reload in ClojureScript: Things to avoid](https://code.thheller.com/blog/shadow-cljs/2019/08/25/hot-reload-in-clojurescript.html#things-to-avoid). 150 | 151 | Opening the app in your browser starts a 152 | [ClojureScript browser REPL](https://clojurescript.org/reference/repl#using-the-browser-as-an-evaluation-environment), 153 | to which you may now connect.{{#cider?}} 154 | 155 | #### Connecting to the browser REPL from Emacs with CIDER 156 | 157 | Connect to the browser REPL: 158 | ``` 159 | M-x cider-jack-in-cljs 160 | ``` 161 | 162 | See 163 | [Shadow CLJS User's Guide: Emacs/CIDER](https://shadow-cljs.github.io/docs/UsersGuide.html#cider) 164 | for more information. Note that the mentioned [`.dir-locals.el`](.dir-locals.el) file has already 165 | been created for you. 166 | 167 | #### Connecting to the browser REPL from VS Code with Calva 168 | 169 | See the [re-frame-template README](https://github.com/day8/re-frame-template) for [Calva](https://github.com/BetterThanTomorrow/calva) instuctions. See also https://calva.io for Calva documentation. 170 | 171 | 172 | #### Connecting to the browser REPL from other editors{{/cider?}}{{^cider?}} 173 | 174 | #### Connecting to the browser REPL from your editor{{/cider?}} 175 | 176 | See 177 | [Shadow CLJS User's Guide: Editor Integration](https://shadow-cljs.github.io/docs/UsersGuide.html#_editor_integration). 178 | Note that `npm run watch` runs `npx shadow-cljs watch` for you, and that this project's running build ids is 179 | `app`, `browser-test`, `karma-test`, or the keywords `:app`, `:browser-test`, `:karma-test` in a Clojure context. 180 | 181 | Alternatively, search the web for info on connecting to a `shadow-cljs` ClojureScript browser REPL 182 | from your editor and configuration. 183 | 184 | For example, in Vim / Neovim with `fireplace.vim` 185 | 1. Open a `.cljs` file in the project to activate `fireplace.vim` 186 | 2. In normal mode, execute the `Piggieback` command with this project's running build id, `:app`: 187 | ```vim 188 | :Piggieback :app 189 | ``` 190 | 191 | #### Connecting to the browser REPL from a terminal 192 | 193 | 1. Connect to the `shadow-cljs` nREPL: 194 | ```sh 195 | lein repl :connect localhost:8777 196 | ``` 197 | The REPL prompt, `shadow.user=>`, indicates that is a Clojure REPL, not ClojureScript. 198 | 199 | 2. In the REPL, switch the session to this project's running build id, `:app`: 200 | ```clj 201 | (shadow.cljs.devtools.api/nrepl-select :app) 202 | ``` 203 | The REPL prompt changes to `cljs.user=>`, indicating that this is now a ClojureScript REPL. 204 | 3. See [`user.cljs`](dev/cljs/user.cljs) for symbols that are immediately accessible in the REPL 205 | without needing to `require`.{{#test?}} 206 | 207 | ### Running Tests 208 | 209 | Build the app with the `prod` profile, start a temporary local web server, launch headless 210 | Chrome/Chromium, run tests, and stop the web server: 211 | 212 | ```sh 213 | npm install 214 | npm run ci 215 | ``` 216 | 217 | Please be patient; it may take over 15 seconds to see any output, and over 25 seconds to complete. 218 | 219 | Or, for auto-reload: 220 | ```sh 221 | npm install 222 | npm run watch 223 | ``` 224 | 225 | Then in another terminal: 226 | ```sh 227 | karma start 228 | ```{{/test?}} 229 | 230 | ### Running `shadow-cljs` Actions 231 | 232 | See a list of [`shadow-cljs CLI`](https://shadow-cljs.github.io/docs/UsersGuide.html#_command_line) 233 | actions: 234 | ```sh 235 | npx shadow-cljs --help 236 | ``` 237 | 238 | Please be patient; it may take over 10 seconds to see any output. Also note that some actions shown 239 | may not actually be supported, outputting "Unknown action." when run. 240 | 241 | Run a shadow-cljs action on this project's build id (without the colon, just `app`): 242 | ```sh 243 | npx shadow-cljs app 244 | ``` 245 | ### Debug Logging 246 | 247 | The `debug?` variable in [`config.cljs`](src/cljs/{{sanitized}}/config.cljs) defaults to `true` in 248 | [`dev`](#running-the-app) builds, and `false` in [`prod`](#production) builds. 249 | 250 | Use `debug?` for logging or other tasks that should run only on `dev` builds: 251 | 252 | ```clj 253 | (ns {{ns-name}}.example 254 | (:require [{{ns-name}}.config :as config]) 255 | 256 | (when config/debug? 257 | (println "This message will appear in the browser console only on dev builds.")) 258 | ``` 259 | 260 | ## Production 261 | 262 | Build the app with the `prod` profile: 263 | 264 | ```sh 265 | npm install 266 | npm run release 267 | ``` 268 | 269 | Please be patient; it may take over 15 seconds to see any output, and over 30 seconds to complete. 270 | 271 | The `resources/public/js/compiled` directory is created, containing the compiled `app.js` and 272 | `manifest.edn` files. 273 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/clj-kondo/config.edn: -------------------------------------------------------------------------------- 1 | {:lint-as {{=<% %>=}}{<%#10x?%><%={{ }}=%>day8.re-frame.tracing/defn-traced clojure.core/defn 2 | day8.re-frame.tracing/fn-traced clojure.core/fn{{/10x?}}{{#garden?}} 3 | garden.def/defcssfn clojure.core/defn 4 | garden.def/defkeyframes clojure.core/def 5 | garden.def/defrule clojure.core/def 6 | garden.def/defstyles clojure.core/def 7 | garden.def/defstylesheet clojure.core/def 8 | garden.units/defunit clojure.core/def 9 | spade.core/defglobal clojure.core/def 10 | spade.core/defclass clojure.core/def{{/garden?}}} 11 | :linters {:unresolved-symbol {:exclude [goog.DEBUG]} 12 | :unused-namespace {:exclude [cljs.repl]} 13 | :unused-referred-var {:exclude {cljs.repl [Error->map 14 | apropos 15 | dir 16 | doc 17 | error->str 18 | ex-str 19 | ex-triage 20 | find-doc 21 | print-doc 22 | pst 23 | source]}}}} 24 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/dev/user.cljs: -------------------------------------------------------------------------------- 1 | (ns cljs.user 2 | "Commonly used symbols for easy access in the ClojureScript REPL during 3 | development." 4 | (:require 5 | [cljs.repl :refer (Error->map apropos dir doc error->str ex-str ex-triage 6 | find-doc print-doc pst source)] 7 | [clojure.pprint :refer (pprint)] 8 | [clojure.string :as str])){{#kondo?}} 9 | 10 | (comment 11 | (pprint (str/trim "This line suppresses some clj-kondo warnings."))){{/kondo?}} 12 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/dir-locals.el: -------------------------------------------------------------------------------- 1 | ((nil . ((cider-default-cljs-repl . shadow) 2 | (cider-shadow-default-options . "app")))) 3 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/github/workflows/test.yaml: -------------------------------------------------------------------------------- 1 | name: Run tests 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | name: Tests 8 | runs-on: ubuntu-latest 9 | container: 10 | image: ghcr.io/day8/chrome-latest:2 11 | steps: 12 | - uses: actions/checkout@v2 13 | - name: npm install 14 | run: 'npm install' 15 | - name: run tests 16 | run: | 17 | nohup npm run watch & 18 | sleep 180 19 | karma start --single-run 20 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/gitignore: -------------------------------------------------------------------------------- 1 | /out/ 2 | /resources/public/js/compiled/ 3 | /target/ 4 | /*-init.clj 5 | /*.log 6 | 7 | # Leiningen 8 | /.lein-* 9 | /.nrepl-port 10 | 11 | # Node.js dependencies 12 | /node_modules/ 13 | 14 | # shadow-cljs cache, port files 15 | /.shadow-cljs/{{#kondo?}} 16 | 17 | # clj-kondo cache and configs from libs 18 | /.clj-kondo/* 19 | 20 | # clj-kondo config 21 | !/.clj-kondo/config.edn 22 | 23 | # clojure-lsp cache 24 | /.lsp/.cache{{/kondo?}} 25 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/karma.conf.js: -------------------------------------------------------------------------------- 1 | module.exports = function (config) { 2 | var junitOutputDir = process.env.CIRCLE_TEST_REPORTS || "target/junit" 3 | 4 | config.set({ 5 | browsers: ['ChromeHeadless'], 6 | basePath: 'target', 7 | files: ['karma-test.js'], 8 | frameworks: ['cljs-test'], 9 | plugins: [ 10 | 'karma-cljs-test', 11 | 'karma-chrome-launcher', 12 | 'karma-junit-reporter' 13 | ], 14 | colors: true, 15 | logLevel: config.LOG_INFO, 16 | client: { 17 | args: ['shadow.test.karma.init'] 18 | }, 19 | 20 | // the default configuration 21 | junitReporter: { 22 | outputDir: junitOutputDir + '/karma', // results will be saved as outputDir/browserName.xml 23 | outputFile: undefined, // if included, results will be saved as outputDir/browserName/outputFile 24 | suite: '' // suite will become the package name attribute in xml testsuite element 25 | } 26 | }) 27 | } 28 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "{{ns-name}}", 3 | "scripts": { 4 | "ancient": "clojure -Sdeps '{:deps {com.github.liquidz/antq {:mvn/version \"RELEASE\"}}}' -m antq.core", 5 | "watch": "npx shadow-cljs watch app browser-test karma-test", 6 | "release": "npx shadow-cljs release app", 7 | "build-report": "npx shadow-cljs run shadow.cljs.build-report app target/build-report.html"{{#test?}}, 8 | "ci": "npx shadow-cljs compile karma-test && npx karma start --single-run --reporters junit,dots"{{/test?}} 9 | }, 10 | "dependencies": { 11 | "react": "17.0.2", 12 | "react-dom": "17.0.2" 13 | }, 14 | "devDependencies": { 15 | "shadow-cljs": "2.26.2"{{#test?}}, 16 | "karma": "6.4.0", 17 | "karma-chrome-launcher": "3.1.1", 18 | "karma-cljs-test": "0.1.0", 19 | "karma-junit-reporter": "2.0.1"{{/test?}} 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/resources/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{#re-com?}} 6 | 7 | 8 | 9 | 10 | {{/re-com?}}{{#less?}} 11 | {{/less?}} 12 | {{name}} 13 | 14 | 15 | 18 |
19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/resources/public/vendor/css/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/day8/re-frame-template/3d4358f14bc2e85b22ba6bafaddfb9561b204d15/resources/leiningen/new/re_frame/resources/public/vendor/css/chosen-sprite.png -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/resources/public/vendor/css/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/day8/re-frame-template/3d4358f14bc2e85b22ba6bafaddfb9561b204d15/resources/leiningen/new/re_frame/resources/public/vendor/css/chosen-sprite@2x.png -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/resources/public/vendor/css/material-design-iconic-font.min.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:Material-Design-Iconic-Font;src:url(../fonts/Material-Design-Iconic-Font.woff2?v=2.1.0) format('woff2'),url(../fonts/Material-Design-Iconic-Font.woff?v=2.1.0) format('woff'),url(../fonts/Material-Design-Iconic-Font.ttf?v=2.1.0) format('truetype')}.zmdi{display:inline-block;font:normal normal normal 14px/1 'Material-Design-Iconic-Font';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.zmdi-hc-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.zmdi-hc-2x{font-size:2em}.zmdi-hc-3x{font-size:3em}.zmdi-hc-4x{font-size:4em}.zmdi-hc-5x{font-size:5em}.zmdi-hc-fw{width:1.28571429em;text-align:center}.zmdi-hc-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.zmdi-hc-ul>li{position:relative}.zmdi-hc-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.zmdi-hc-li.zmdi-hc-lg{left:-1.85714286em}.zmdi-hc-border{padding:.1em .25em;border:solid .1em #9e9e9e;border-radius:2px}.zmdi-hc-border-circle{padding:.1em .25em;border:solid .1em #9e9e9e;border-radius:50%}.zmdi.pull-left{float:left;margin-right:.15em}.zmdi.pull-right{float:right;margin-left:.15em}.zmdi-hc-spin{-webkit-animation:zmdi-spin 1.5s infinite linear;animation:zmdi-spin 1.5s infinite linear}.zmdi-hc-spin-reverse{-webkit-animation:zmdi-spin-reverse 1.5s infinite linear;animation:zmdi-spin-reverse 1.5s infinite linear}@-webkit-keyframes zmdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes zmdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes zmdi-spin-reverse{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(-359deg);transform:rotate(-359deg)}}@keyframes zmdi-spin-reverse{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(-359deg);transform:rotate(-359deg)}}.zmdi-hc-rotate-90{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.zmdi-hc-rotate-180{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.zmdi-hc-rotate-270{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.zmdi-hc-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.zmdi-hc-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}.zmdi-hc-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.zmdi-hc-stack-1x,.zmdi-hc-stack-2x{position:absolute;left:0;width:100%;text-align:center}.zmdi-hc-stack-1x{line-height:inherit}.zmdi-hc-stack-2x{font-size:2em}.zmdi-hc-inverse{color:#fff}.zmdi-3d-rotation:before{content:'\f101'}.zmdi-airplane-off:before{content:'\f102'}.zmdi-airplane:before{content:'\f103'}.zmdi-album:before{content:'\f104'}.zmdi-archive:before{content:'\f105'}.zmdi-assignment-account:before{content:'\f106'}.zmdi-assignment-alert:before{content:'\f107'}.zmdi-assignment-check:before{content:'\f108'}.zmdi-assignment-o:before{content:'\f109'}.zmdi-assignment-return:before{content:'\f10a'}.zmdi-assignment-returned:before{content:'\f10b'}.zmdi-assignment:before{content:'\f10c'}.zmdi-attachment-alt:before{content:'\f10d'}.zmdi-attachment:before{content:'\f10e'}.zmdi-audio:before{content:'\f10f'}.zmdi-badge-check:before{content:'\f110'}.zmdi-balance-wallet:before{content:'\f111'}.zmdi-balance:before{content:'\f112'}.zmdi-battery-alert:before{content:'\f113'}.zmdi-battery-flash:before{content:'\f114'}.zmdi-battery-unknown:before{content:'\f115'}.zmdi-battery:before{content:'\f116'}.zmdi-bike:before{content:'\f117'}.zmdi-block-alt:before{content:'\f118'}.zmdi-block:before{content:'\f119'}.zmdi-boat:before{content:'\f11a'}.zmdi-book-image:before{content:'\f11b'}.zmdi-book:before{content:'\f11c'}.zmdi-bookmark-outline:before{content:'\f11d'}.zmdi-bookmark:before{content:'\f11e'}.zmdi-brush:before{content:'\f11f'}.zmdi-bug:before{content:'\f120'}.zmdi-bus:before{content:'\f121'}.zmdi-cake:before{content:'\f122'}.zmdi-car-taxi:before{content:'\f123'}.zmdi-car-wash:before{content:'\f124'}.zmdi-car:before{content:'\f125'}.zmdi-card-giftcard:before{content:'\f126'}.zmdi-card-membership:before{content:'\f127'}.zmdi-card-travel:before{content:'\f128'}.zmdi-card:before{content:'\f129'}.zmdi-case-check:before{content:'\f12a'}.zmdi-case-download:before{content:'\f12b'}.zmdi-case-play:before{content:'\f12c'}.zmdi-case:before{content:'\f12d'}.zmdi-cast-connected:before{content:'\f12e'}.zmdi-cast:before{content:'\f12f'}.zmdi-chart-donut:before{content:'\f130'}.zmdi-chart:before{content:'\f131'}.zmdi-city-alt:before{content:'\f132'}.zmdi-city:before{content:'\f133'}.zmdi-close-circle-o:before{content:'\f134'}.zmdi-close-circle:before{content:'\f135'}.zmdi-close:before{content:'\f136'}.zmdi-cocktail:before{content:'\f137'}.zmdi-code-setting:before{content:'\f138'}.zmdi-code-smartphone:before{content:'\f139'}.zmdi-code:before{content:'\f13a'}.zmdi-coffee:before{content:'\f13b'}.zmdi-collection-bookmark:before{content:'\f13c'}.zmdi-collection-case-play:before{content:'\f13d'}.zmdi-collection-folder-image:before{content:'\f13e'}.zmdi-collection-image-o:before{content:'\f13f'}.zmdi-collection-image:before{content:'\f140'}.zmdi-collection-item-1:before{content:'\f141'}.zmdi-collection-item-2:before{content:'\f142'}.zmdi-collection-item-3:before{content:'\f143'}.zmdi-collection-item-4:before{content:'\f144'}.zmdi-collection-item-5:before{content:'\f145'}.zmdi-collection-item-6:before{content:'\f146'}.zmdi-collection-item-7:before{content:'\f147'}.zmdi-collection-item-8:before{content:'\f148'}.zmdi-collection-item-9-plus:before{content:'\f149'}.zmdi-collection-item-9:before{content:'\f14a'}.zmdi-collection-item:before{content:'\f14b'}.zmdi-collection-music:before{content:'\f14c'}.zmdi-collection-pdf:before{content:'\f14d'}.zmdi-collection-plus:before{content:'\f14e'}.zmdi-collection-speaker:before{content:'\f14f'}.zmdi-collection-text:before{content:'\f150'}.zmdi-collection-video:before{content:'\f151'}.zmdi-compass:before{content:'\f152'}.zmdi-cutlery:before{content:'\f153'}.zmdi-delete:before{content:'\f154'}.zmdi-dialpad:before{content:'\f155'}.zmdi-dns:before{content:'\f156'}.zmdi-drink:before{content:'\f157'}.zmdi-edit:before{content:'\f158'}.zmdi-email-open:before{content:'\f159'}.zmdi-email:before{content:'\f15a'}.zmdi-eye-off:before{content:'\f15b'}.zmdi-eye:before{content:'\f15c'}.zmdi-eyedropper:before{content:'\f15d'}.zmdi-favorite-outline:before{content:'\f15e'}.zmdi-favorite:before{content:'\f15f'}.zmdi-filter-list:before{content:'\f160'}.zmdi-fire:before{content:'\f161'}.zmdi-flag:before{content:'\f162'}.zmdi-flare:before{content:'\f163'}.zmdi-flash-auto:before{content:'\f164'}.zmdi-flash-off:before{content:'\f165'}.zmdi-flash:before{content:'\f166'}.zmdi-flip:before{content:'\f167'}.zmdi-flower-alt:before{content:'\f168'}.zmdi-flower:before{content:'\f169'}.zmdi-font:before{content:'\f16a'}.zmdi-fullscreen-alt:before{content:'\f16b'}.zmdi-fullscreen-exit:before{content:'\f16c'}.zmdi-fullscreen:before{content:'\f16d'}.zmdi-functions:before{content:'\f16e'}.zmdi-gas-station:before{content:'\f16f'}.zmdi-gesture:before{content:'\f170'}.zmdi-globe-alt:before{content:'\f171'}.zmdi-globe-lock:before{content:'\f172'}.zmdi-globe:before{content:'\f173'}.zmdi-graduation-cap:before{content:'\f174'}.zmdi-home:before{content:'\f175'}.zmdi-hospital-alt:before{content:'\f176'}.zmdi-hospital:before{content:'\f177'}.zmdi-hotel:before{content:'\f178'}.zmdi-hourglass-alt:before{content:'\f179'}.zmdi-hourglass-outline:before{content:'\f17a'}.zmdi-hourglass:before{content:'\f17b'}.zmdi-http:before{content:'\f17c'}.zmdi-image-alt:before{content:'\f17d'}.zmdi-image-o:before{content:'\f17e'}.zmdi-image:before{content:'\f17f'}.zmdi-inbox:before{content:'\f180'}.zmdi-invert-colors-off:before{content:'\f181'}.zmdi-invert-colors:before{content:'\f182'}.zmdi-key:before{content:'\f183'}.zmdi-label-alt-outline:before{content:'\f184'}.zmdi-label-alt:before{content:'\f185'}.zmdi-label-heart:before{content:'\f186'}.zmdi-label:before{content:'\f187'}.zmdi-labels:before{content:'\f188'}.zmdi-lamp:before{content:'\f189'}.zmdi-landscape:before{content:'\f18a'}.zmdi-layers-off:before{content:'\f18b'}.zmdi-layers:before{content:'\f18c'}.zmdi-library:before{content:'\f18d'}.zmdi-link:before{content:'\f18e'}.zmdi-lock-open:before{content:'\f18f'}.zmdi-lock-outline:before{content:'\f190'}.zmdi-lock:before{content:'\f191'}.zmdi-mail-reply-all:before{content:'\f192'}.zmdi-mail-reply:before{content:'\f193'}.zmdi-mail-send:before{content:'\f194'}.zmdi-mall:before{content:'\f195'}.zmdi-map:before{content:'\f196'}.zmdi-menu:before{content:'\f197'}.zmdi-money-box:before{content:'\f198'}.zmdi-money-off:before{content:'\f199'}.zmdi-money:before{content:'\f19a'}.zmdi-more-vert:before{content:'\f19b'}.zmdi-more:before{content:'\f19c'}.zmdi-movie-alt:before{content:'\f19d'}.zmdi-movie:before{content:'\f19e'}.zmdi-nature-people:before{content:'\f19f'}.zmdi-nature:before{content:'\f1a0'}.zmdi-navigation:before{content:'\f1a1'}.zmdi-open-in-browser:before{content:'\f1a2'}.zmdi-open-in-new:before{content:'\f1a3'}.zmdi-palette:before{content:'\f1a4'}.zmdi-parking:before{content:'\f1a5'}.zmdi-pin-account:before{content:'\f1a6'}.zmdi-pin-assistant:before{content:'\f1a7'}.zmdi-pin-drop:before{content:'\f1a8'}.zmdi-pin-help:before{content:'\f1a9'}.zmdi-pin-off:before{content:'\f1aa'}.zmdi-pin:before{content:'\f1ab'}.zmdi-pizza:before{content:'\f1ac'}.zmdi-plaster:before{content:'\f1ad'}.zmdi-power-setting:before{content:'\f1ae'}.zmdi-power:before{content:'\f1af'}.zmdi-print:before{content:'\f1b0'}.zmdi-puzzle-piece:before{content:'\f1b1'}.zmdi-quote:before{content:'\f1b2'}.zmdi-railway:before{content:'\f1b3'}.zmdi-receipt:before{content:'\f1b4'}.zmdi-refresh-alt:before{content:'\f1b5'}.zmdi-refresh-sync-alert:before{content:'\f1b6'}.zmdi-refresh-sync-off:before{content:'\f1b7'}.zmdi-refresh-sync:before{content:'\f1b8'}.zmdi-refresh:before{content:'\f1b9'}.zmdi-roller:before{content:'\f1ba'}.zmdi-ruler:before{content:'\f1bb'}.zmdi-scissors:before{content:'\f1bc'}.zmdi-screen-rotation-lock:before{content:'\f1bd'}.zmdi-screen-rotation:before{content:'\f1be'}.zmdi-search-for:before{content:'\f1bf'}.zmdi-search-in-file:before{content:'\f1c0'}.zmdi-search-in-page:before{content:'\f1c1'}.zmdi-search-replace:before{content:'\f1c2'}.zmdi-search:before{content:'\f1c3'}.zmdi-seat:before{content:'\f1c4'}.zmdi-settings-square:before{content:'\f1c5'}.zmdi-settings:before{content:'\f1c6'}.zmdi-shield-check:before{content:'\f1c7'}.zmdi-shield-security:before{content:'\f1c8'}.zmdi-shopping-basket:before{content:'\f1c9'}.zmdi-shopping-cart-plus:before{content:'\f1ca'}.zmdi-shopping-cart:before{content:'\f1cb'}.zmdi-sign-in:before{content:'\f1cc'}.zmdi-sort-amount-asc:before{content:'\f1cd'}.zmdi-sort-amount-desc:before{content:'\f1ce'}.zmdi-sort-asc:before{content:'\f1cf'}.zmdi-sort-desc:before{content:'\f1d0'}.zmdi-spellcheck:before{content:'\f1d1'}.zmdi-storage:before{content:'\f1d2'}.zmdi-store-24:before{content:'\f1d3'}.zmdi-store:before{content:'\f1d4'}.zmdi-subway:before{content:'\f1d5'}.zmdi-sun:before{content:'\f1d6'}.zmdi-tab-unselected:before{content:'\f1d7'}.zmdi-tab:before{content:'\f1d8'}.zmdi-tag-close:before{content:'\f1d9'}.zmdi-tag-more:before{content:'\f1da'}.zmdi-tag:before{content:'\f1db'}.zmdi-thumb-down:before{content:'\f1dc'}.zmdi-thumb-up-down:before{content:'\f1dd'}.zmdi-thumb-up:before{content:'\f1de'}.zmdi-ticket-star:before{content:'\f1df'}.zmdi-toll:before{content:'\f1e0'}.zmdi-toys:before{content:'\f1e1'}.zmdi-traffic:before{content:'\f1e2'}.zmdi-translate:before{content:'\f1e3'}.zmdi-triangle-down:before{content:'\f1e4'}.zmdi-triangle-up:before{content:'\f1e5'}.zmdi-truck:before{content:'\f1e6'}.zmdi-turning-sign:before{content:'\f1e7'}.zmdi-wallpaper:before{content:'\f1e8'}.zmdi-washing-machine:before{content:'\f1e9'}.zmdi-window-maximize:before{content:'\f1ea'}.zmdi-window-minimize:before{content:'\f1eb'}.zmdi-window-restore:before{content:'\f1ec'}.zmdi-wrench:before{content:'\f1ed'}.zmdi-zoom-in:before{content:'\f1ee'}.zmdi-zoom-out:before{content:'\f1ef'}.zmdi-alert-circle-o:before{content:'\f1f0'}.zmdi-alert-circle:before{content:'\f1f1'}.zmdi-alert-octagon:before{content:'\f1f2'}.zmdi-alert-polygon:before{content:'\f1f3'}.zmdi-alert-triangle:before{content:'\f1f4'}.zmdi-help-outline:before{content:'\f1f5'}.zmdi-help:before{content:'\f1f6'}.zmdi-info-outline:before{content:'\f1f7'}.zmdi-info:before{content:'\f1f8'}.zmdi-notifications-active:before{content:'\f1f9'}.zmdi-notifications-add:before{content:'\f1fa'}.zmdi-notifications-none:before{content:'\f1fb'}.zmdi-notifications-off:before{content:'\f1fc'}.zmdi-notifications-paused:before{content:'\f1fd'}.zmdi-notifications:before{content:'\f1fe'}.zmdi-account-add:before{content:'\f1ff'}.zmdi-account-box-mail:before{content:'\f200'}.zmdi-account-box-o:before{content:'\f201'}.zmdi-account-box-phone:before{content:'\f202'}.zmdi-account-box:before{content:'\f203'}.zmdi-account-calendar:before{content:'\f204'}.zmdi-account-circle:before{content:'\f205'}.zmdi-account-o:before{content:'\f206'}.zmdi-account:before{content:'\f207'}.zmdi-accounts-add:before{content:'\f208'}.zmdi-accounts-alt:before{content:'\f209'}.zmdi-accounts-list-alt:before{content:'\f20a'}.zmdi-accounts-list:before{content:'\f20b'}.zmdi-accounts-outline:before{content:'\f20c'}.zmdi-accounts:before{content:'\f20d'}.zmdi-face:before{content:'\f20e'}.zmdi-female:before{content:'\f20f'}.zmdi-male-alt:before{content:'\f210'}.zmdi-male-female:before{content:'\f211'}.zmdi-male:before{content:'\f212'}.zmdi-mood-bad:before{content:'\f213'}.zmdi-mood:before{content:'\f214'}.zmdi-run:before{content:'\f215'}.zmdi-walk:before{content:'\f216'}.zmdi-cloud-box:before{content:'\f217'}.zmdi-cloud-circle:before{content:'\f218'}.zmdi-cloud-done:before{content:'\f219'}.zmdi-cloud-download:before{content:'\f21a'}.zmdi-cloud-off:before{content:'\f21b'}.zmdi-cloud-outline-alt:before{content:'\f21c'}.zmdi-cloud-outline:before{content:'\f21d'}.zmdi-cloud-upload:before{content:'\f21e'}.zmdi-cloud:before{content:'\f21f'}.zmdi-download:before{content:'\f220'}.zmdi-file-plus:before{content:'\f221'}.zmdi-file-text:before{content:'\f222'}.zmdi-file:before{content:'\f223'}.zmdi-folder-outline:before{content:'\f224'}.zmdi-folder-person:before{content:'\f225'}.zmdi-folder-star-alt:before{content:'\f226'}.zmdi-folder-star:before{content:'\f227'}.zmdi-folder:before{content:'\f228'}.zmdi-gif:before{content:'\f229'}.zmdi-upload:before{content:'\f22a'}.zmdi-border-all:before{content:'\f22b'}.zmdi-border-bottom:before{content:'\f22c'}.zmdi-border-clear:before{content:'\f22d'}.zmdi-border-color:before{content:'\f22e'}.zmdi-border-horizontal:before{content:'\f22f'}.zmdi-border-inner:before{content:'\f230'}.zmdi-border-left:before{content:'\f231'}.zmdi-border-outer:before{content:'\f232'}.zmdi-border-right:before{content:'\f233'}.zmdi-border-style:before{content:'\f234'}.zmdi-border-top:before{content:'\f235'}.zmdi-border-vertical:before{content:'\f236'}.zmdi-copy:before{content:'\f237'}.zmdi-crop:before{content:'\f238'}.zmdi-format-align-center:before{content:'\f239'}.zmdi-format-align-justify:before{content:'\f23a'}.zmdi-format-align-left:before{content:'\f23b'}.zmdi-format-align-right:before{content:'\f23c'}.zmdi-format-bold:before{content:'\f23d'}.zmdi-format-clear-all:before{content:'\f23e'}.zmdi-format-clear:before{content:'\f23f'}.zmdi-format-color-fill:before{content:'\f240'}.zmdi-format-color-reset:before{content:'\f241'}.zmdi-format-color-text:before{content:'\f242'}.zmdi-format-indent-decrease:before{content:'\f243'}.zmdi-format-indent-increase:before{content:'\f244'}.zmdi-format-italic:before{content:'\f245'}.zmdi-format-line-spacing:before{content:'\f246'}.zmdi-format-list-bulleted:before{content:'\f247'}.zmdi-format-list-numbered:before{content:'\f248'}.zmdi-format-ltr:before{content:'\f249'}.zmdi-format-rtl:before{content:'\f24a'}.zmdi-format-size:before{content:'\f24b'}.zmdi-format-strikethrough-s:before{content:'\f24c'}.zmdi-format-strikethrough:before{content:'\f24d'}.zmdi-format-subject:before{content:'\f24e'}.zmdi-format-underlined:before{content:'\f24f'}.zmdi-format-valign-bottom:before{content:'\f250'}.zmdi-format-valign-center:before{content:'\f251'}.zmdi-format-valign-top:before{content:'\f252'}.zmdi-redo:before{content:'\f253'}.zmdi-select-all:before{content:'\f254'}.zmdi-space-bar:before{content:'\f255'}.zmdi-text-format:before{content:'\f256'}.zmdi-transform:before{content:'\f257'}.zmdi-undo:before{content:'\f258'}.zmdi-wrap-text:before{content:'\f259'}.zmdi-comment-alert:before{content:'\f25a'}.zmdi-comment-alt-text:before{content:'\f25b'}.zmdi-comment-alt:before{content:'\f25c'}.zmdi-comment-edit:before{content:'\f25d'}.zmdi-comment-image:before{content:'\f25e'}.zmdi-comment-list:before{content:'\f25f'}.zmdi-comment-more:before{content:'\f260'}.zmdi-comment-outline:before{content:'\f261'}.zmdi-comment-text-alt:before{content:'\f262'}.zmdi-comment-text:before{content:'\f263'}.zmdi-comment-video:before{content:'\f264'}.zmdi-comment:before{content:'\f265'}.zmdi-comments:before{content:'\f266'}.zmdi-check-all:before{content:'\f267'}.zmdi-check-circle-u:before{content:'\f268'}.zmdi-check-circle:before{content:'\f269'}.zmdi-check-square:before{content:'\f26a'}.zmdi-check:before{content:'\f26b'}.zmdi-circle-o:before{content:'\f26c'}.zmdi-circle:before{content:'\f26d'}.zmdi-dot-circle-alt:before{content:'\f26e'}.zmdi-dot-circle:before{content:'\f26f'}.zmdi-minus-circle-outline:before{content:'\f270'}.zmdi-minus-circle:before{content:'\f271'}.zmdi-minus-square:before{content:'\f272'}.zmdi-minus:before{content:'\f273'}.zmdi-plus-circle-o-duplicate:before{content:'\f274'}.zmdi-plus-circle-o:before{content:'\f275'}.zmdi-plus-circle:before{content:'\f276'}.zmdi-plus-square:before{content:'\f277'}.zmdi-plus:before{content:'\f278'}.zmdi-square-o:before{content:'\f279'}.zmdi-star-circle:before{content:'\f27a'}.zmdi-star-half:before{content:'\f27b'}.zmdi-star-outline:before{content:'\f27c'}.zmdi-star:before{content:'\f27d'}.zmdi-bluetooth-connected:before{content:'\f27e'}.zmdi-bluetooth-off:before{content:'\f27f'}.zmdi-bluetooth-search:before{content:'\f280'}.zmdi-bluetooth-setting:before{content:'\f281'}.zmdi-bluetooth:before{content:'\f282'}.zmdi-camera-add:before{content:'\f283'}.zmdi-camera-alt:before{content:'\f284'}.zmdi-camera-bw:before{content:'\f285'}.zmdi-camera-front:before{content:'\f286'}.zmdi-camera-mic:before{content:'\f287'}.zmdi-camera-party-mode:before{content:'\f288'}.zmdi-camera-rear:before{content:'\f289'}.zmdi-camera-roll:before{content:'\f28a'}.zmdi-camera-switch:before{content:'\f28b'}.zmdi-camera:before{content:'\f28c'}.zmdi-card-alert:before{content:'\f28d'}.zmdi-card-off:before{content:'\f28e'}.zmdi-card-sd:before{content:'\f28f'}.zmdi-card-sim:before{content:'\f290'}.zmdi-desktop-mac:before{content:'\f291'}.zmdi-desktop-windows:before{content:'\f292'}.zmdi-device-hub:before{content:'\f293'}.zmdi-devices-off:before{content:'\f294'}.zmdi-devices:before{content:'\f295'}.zmdi-dock:before{content:'\f296'}.zmdi-floppy:before{content:'\f297'}.zmdi-gamepad:before{content:'\f298'}.zmdi-gps-dot:before{content:'\f299'}.zmdi-gps-off:before{content:'\f29a'}.zmdi-gps:before{content:'\f29b'}.zmdi-headset-mic:before{content:'\f29c'}.zmdi-headset:before{content:'\f29d'}.zmdi-input-antenna:before{content:'\f29e'}.zmdi-input-composite:before{content:'\f29f'}.zmdi-input-hdmi:before{content:'\f2a0'}.zmdi-input-power:before{content:'\f2a1'}.zmdi-input-svideo:before{content:'\f2a2'}.zmdi-keyboard-hide:before{content:'\f2a3'}.zmdi-keyboard:before{content:'\f2a4'}.zmdi-laptop-chromebook:before{content:'\f2a5'}.zmdi-laptop-mac:before{content:'\f2a6'}.zmdi-laptop:before{content:'\f2a7'}.zmdi-mic-off:before{content:'\f2a8'}.zmdi-mic-outline:before{content:'\f2a9'}.zmdi-mic-setting:before{content:'\f2aa'}.zmdi-mic:before{content:'\f2ab'}.zmdi-mouse:before{content:'\f2ac'}.zmdi-network-alert:before{content:'\f2ad'}.zmdi-network-locked:before{content:'\f2ae'}.zmdi-network-off:before{content:'\f2af'}.zmdi-network-outline:before{content:'\f2b0'}.zmdi-network-setting:before{content:'\f2b1'}.zmdi-network:before{content:'\f2b2'}.zmdi-phone-bluetooth:before{content:'\f2b3'}.zmdi-phone-end:before{content:'\f2b4'}.zmdi-phone-forwarded:before{content:'\f2b5'}.zmdi-phone-in-talk:before{content:'\f2b6'}.zmdi-phone-locked:before{content:'\f2b7'}.zmdi-phone-missed:before{content:'\f2b8'}.zmdi-phone-msg:before{content:'\f2b9'}.zmdi-phone-paused:before{content:'\f2ba'}.zmdi-phone-ring:before{content:'\f2bb'}.zmdi-phone-setting:before{content:'\f2bc'}.zmdi-phone-sip:before{content:'\f2bd'}.zmdi-phone:before{content:'\f2be'}.zmdi-portable-wifi-changes:before{content:'\f2bf'}.zmdi-portable-wifi-off:before{content:'\f2c0'}.zmdi-portable-wifi:before{content:'\f2c1'}.zmdi-radio:before{content:'\f2c2'}.zmdi-reader:before{content:'\f2c3'}.zmdi-remote-control-alt:before{content:'\f2c4'}.zmdi-remote-control:before{content:'\f2c5'}.zmdi-router:before{content:'\f2c6'}.zmdi-scanner:before{content:'\f2c7'}.zmdi-smartphone-android:before{content:'\f2c8'}.zmdi-smartphone-download:before{content:'\f2c9'}.zmdi-smartphone-erase:before{content:'\f2ca'}.zmdi-smartphone-info:before{content:'\f2cb'}.zmdi-smartphone-iphone:before{content:'\f2cc'}.zmdi-smartphone-landscape-lock:before{content:'\f2cd'}.zmdi-smartphone-landscape:before{content:'\f2ce'}.zmdi-smartphone-lock:before{content:'\f2cf'}.zmdi-smartphone-portrait-lock:before{content:'\f2d0'}.zmdi-smartphone-ring:before{content:'\f2d1'}.zmdi-smartphone-setting:before{content:'\f2d2'}.zmdi-smartphone-setup:before{content:'\f2d3'}.zmdi-smartphone:before{content:'\f2d4'}.zmdi-speaker:before{content:'\f2d5'}.zmdi-tablet-android:before{content:'\f2d6'}.zmdi-tablet-mac:before{content:'\f2d7'}.zmdi-tablet:before{content:'\f2d8'}.zmdi-tv-alt-play:before{content:'\f2d9'}.zmdi-tv-list:before{content:'\f2da'}.zmdi-tv-play:before{content:'\f2db'}.zmdi-tv:before{content:'\f2dc'}.zmdi-usb:before{content:'\f2dd'}.zmdi-videocam-off:before{content:'\f2de'}.zmdi-videocam-switch:before{content:'\f2df'}.zmdi-videocam:before{content:'\f2e0'}.zmdi-watch:before{content:'\f2e1'}.zmdi-wifi-alt-2:before{content:'\f2e2'}.zmdi-wifi-alt:before{content:'\f2e3'}.zmdi-wifi-info:before{content:'\f2e4'}.zmdi-wifi-lock:before{content:'\f2e5'}.zmdi-wifi-off:before{content:'\f2e6'}.zmdi-wifi-outline:before{content:'\f2e7'}.zmdi-wifi:before{content:'\f2e8'}.zmdi-arrow-left-bottom:before{content:'\f2e9'}.zmdi-arrow-left:before{content:'\f2ea'}.zmdi-arrow-merge:before{content:'\f2eb'}.zmdi-arrow-missed:before{content:'\f2ec'}.zmdi-arrow-right-top:before{content:'\f2ed'}.zmdi-arrow-right:before{content:'\f2ee'}.zmdi-arrow-split:before{content:'\f2ef'}.zmdi-arrows:before{content:'\f2f0'}.zmdi-caret-down-circle:before{content:'\f2f1'}.zmdi-caret-down:before{content:'\f2f2'}.zmdi-caret-left-circle:before{content:'\f2f3'}.zmdi-caret-left:before{content:'\f2f4'}.zmdi-caret-right-circle:before{content:'\f2f5'}.zmdi-caret-right:before{content:'\f2f6'}.zmdi-caret-up-circle:before{content:'\f2f7'}.zmdi-caret-up:before{content:'\f2f8'}.zmdi-chevron-down:before{content:'\f2f9'}.zmdi-chevron-left:before{content:'\f2fa'}.zmdi-chevron-right:before{content:'\f2fb'}.zmdi-chevron-up:before{content:'\f2fc'}.zmdi-forward:before{content:'\f2fd'}.zmdi-long-arrow-down:before{content:'\f2fe'}.zmdi-long-arrow-left:before{content:'\f2ff'}.zmdi-long-arrow-return:before{content:'\f300'}.zmdi-long-arrow-right:before{content:'\f301'}.zmdi-long-arrow-tab:before{content:'\f302'}.zmdi-long-arrow-up:before{content:'\f303'}.zmdi-rotate-ccw:before{content:'\f304'}.zmdi-rotate-cw:before{content:'\f305'}.zmdi-rotate-left:before{content:'\f306'}.zmdi-rotate-right:before{content:'\f307'}.zmdi-square-down:before{content:'\f308'}.zmdi-square-right:before{content:'\f309'}.zmdi-swap-alt:before{content:'\f30a'}.zmdi-swap-vertical-circle:before{content:'\f30b'}.zmdi-swap-vertical:before{content:'\f30c'}.zmdi-swap:before{content:'\f30d'}.zmdi-trending-down:before{content:'\f30e'}.zmdi-trending-flat:before{content:'\f30f'}.zmdi-trending-up:before{content:'\f310'}.zmdi-unfold-less:before{content:'\f311'}.zmdi-unfold-more:before{content:'\f312'}.zmdi-apps:before{content:'\f313'}.zmdi-grid-off:before{content:'\f314'}.zmdi-grid:before{content:'\f315'}.zmdi-view-agenda:before{content:'\f316'}.zmdi-view-array:before{content:'\f317'}.zmdi-view-carousel:before{content:'\f318'}.zmdi-view-column:before{content:'\f319'}.zmdi-view-comfy:before{content:'\f31a'}.zmdi-view-compact:before{content:'\f31b'}.zmdi-view-dashboard:before{content:'\f31c'}.zmdi-view-day:before{content:'\f31d'}.zmdi-view-headline:before{content:'\f31e'}.zmdi-view-list-alt:before{content:'\f31f'}.zmdi-view-list:before{content:'\f320'}.zmdi-view-module:before{content:'\f321'}.zmdi-view-quilt:before{content:'\f322'}.zmdi-view-stream:before{content:'\f323'}.zmdi-view-subtitles:before{content:'\f324'}.zmdi-view-toc:before{content:'\f325'}.zmdi-view-web:before{content:'\f326'}.zmdi-view-week:before{content:'\f327'}.zmdi-widgets:before{content:'\f328'}.zmdi-alarm-check:before{content:'\f329'}.zmdi-alarm-off:before{content:'\f32a'}.zmdi-alarm-plus:before{content:'\f32b'}.zmdi-alarm-snooze:before{content:'\f32c'}.zmdi-alarm:before{content:'\f32d'}.zmdi-calendar-alt:before{content:'\f32e'}.zmdi-calendar-check:before{content:'\f32f'}.zmdi-calendar-close:before{content:'\f330'}.zmdi-calendar-note:before{content:'\f331'}.zmdi-calendar:before{content:'\f332'}.zmdi-time-countdown:before{content:'\f333'}.zmdi-time-interval:before{content:'\f334'}.zmdi-time-restore-setting:before{content:'\f335'}.zmdi-time-restore:before{content:'\f336'}.zmdi-time:before{content:'\f337'}.zmdi-timer-off:before{content:'\f338'}.zmdi-timer:before{content:'\f339'}.zmdi-android-alt:before{content:'\f33a'}.zmdi-android:before{content:'\f33b'}.zmdi-apple:before{content:'\f33c'}.zmdi-behance:before{content:'\f33d'}.zmdi-codepen:before{content:'\f33e'}.zmdi-dribbble:before{content:'\f33f'}.zmdi-dropbox:before{content:'\f340'}.zmdi-evernote:before{content:'\f341'}.zmdi-facebook-box:before{content:'\f342'}.zmdi-facebook:before{content:'\f343'}.zmdi-github-box:before{content:'\f344'}.zmdi-github:before{content:'\f345'}.zmdi-google-drive:before{content:'\f346'}.zmdi-google-earth:before{content:'\f347'}.zmdi-google-glass:before{content:'\f348'}.zmdi-google-maps:before{content:'\f349'}.zmdi-google-pages:before{content:'\f34a'}.zmdi-google-play:before{content:'\f34b'}.zmdi-google-plus-box:before{content:'\f34c'}.zmdi-google-plus:before{content:'\f34d'}.zmdi-google:before{content:'\f34e'}.zmdi-instagram:before{content:'\f34f'}.zmdi-language-css3:before{content:'\f350'}.zmdi-language-html5:before{content:'\f351'}.zmdi-language-javascript:before{content:'\f352'}.zmdi-language-python-alt:before{content:'\f353'}.zmdi-language-python:before{content:'\f354'}.zmdi-lastfm:before{content:'\f355'}.zmdi-linkedin-box:before{content:'\f356'}.zmdi-paypal:before{content:'\f357'}.zmdi-pinterest-box:before{content:'\f358'}.zmdi-pocket:before{content:'\f359'}.zmdi-polymer:before{content:'\f35a'}.zmdi-share:before{content:'\f35b'}.zmdi-stack-overflow:before{content:'\f35c'}.zmdi-steam-square:before{content:'\f35d'}.zmdi-steam:before{content:'\f35e'}.zmdi-twitter-box:before{content:'\f35f'}.zmdi-twitter:before{content:'\f360'}.zmdi-vk:before{content:'\f361'}.zmdi-wikipedia:before{content:'\f362'}.zmdi-windows:before{content:'\f363'}.zmdi-aspect-ratio-alt:before{content:'\f364'}.zmdi-aspect-ratio:before{content:'\f365'}.zmdi-blur-circular:before{content:'\f366'}.zmdi-blur-linear:before{content:'\f367'}.zmdi-blur-off:before{content:'\f368'}.zmdi-blur:before{content:'\f369'}.zmdi-brightness-2:before{content:'\f36a'}.zmdi-brightness-3:before{content:'\f36b'}.zmdi-brightness-4:before{content:'\f36c'}.zmdi-brightness-5:before{content:'\f36d'}.zmdi-brightness-6:before{content:'\f36e'}.zmdi-brightness-7:before{content:'\f36f'}.zmdi-brightness-auto:before{content:'\f370'}.zmdi-brightness-setting:before{content:'\f371'}.zmdi-broken-image:before{content:'\f372'}.zmdi-center-focus-strong:before{content:'\f373'}.zmdi-center-focus-weak:before{content:'\f374'}.zmdi-compare:before{content:'\f375'}.zmdi-crop-16-9:before{content:'\f376'}.zmdi-crop-3-2:before{content:'\f377'}.zmdi-crop-5-4:before{content:'\f378'}.zmdi-crop-7-5:before{content:'\f379'}.zmdi-crop-din:before{content:'\f37a'}.zmdi-crop-free:before{content:'\f37b'}.zmdi-crop-landscape:before{content:'\f37c'}.zmdi-crop-portrait:before{content:'\f37d'}.zmdi-crop-square:before{content:'\f37e'}.zmdi-exposure-alt:before{content:'\f37f'}.zmdi-exposure:before{content:'\f380'}.zmdi-filter-b-and-w:before{content:'\f381'}.zmdi-filter-center-focus:before{content:'\f382'}.zmdi-filter-frames:before{content:'\f383'}.zmdi-filter-tilt-shift:before{content:'\f384'}.zmdi-gradient:before{content:'\f385'}.zmdi-grain:before{content:'\f386'}.zmdi-graphic-eq:before{content:'\f387'}.zmdi-hdr-off:before{content:'\f388'}.zmdi-hdr-strong:before{content:'\f389'}.zmdi-hdr-weak:before{content:'\f38a'}.zmdi-hdr:before{content:'\f38b'}.zmdi-iridescent:before{content:'\f38c'}.zmdi-leak-off:before{content:'\f38d'}.zmdi-leak:before{content:'\f38e'}.zmdi-looks:before{content:'\f38f'}.zmdi-loupe:before{content:'\f390'}.zmdi-panorama-horizontal:before{content:'\f391'}.zmdi-panorama-vertical:before{content:'\f392'}.zmdi-panorama-wide-angle:before{content:'\f393'}.zmdi-photo-size-select-large:before{content:'\f394'}.zmdi-photo-size-select-small:before{content:'\f395'}.zmdi-picture-in-picture:before{content:'\f396'}.zmdi-slideshow:before{content:'\f397'}.zmdi-texture:before{content:'\f398'}.zmdi-tonality:before{content:'\f399'}.zmdi-vignette:before{content:'\f39a'}.zmdi-wb-auto:before{content:'\f39b'}.zmdi-eject-alt:before{content:'\f39c'}.zmdi-eject:before{content:'\f39d'}.zmdi-equalizer:before{content:'\f39e'}.zmdi-fast-forward:before{content:'\f39f'}.zmdi-fast-rewind:before{content:'\f3a0'}.zmdi-forward-10:before{content:'\f3a1'}.zmdi-forward-30:before{content:'\f3a2'}.zmdi-forward-5:before{content:'\f3a3'}.zmdi-hearing:before{content:'\f3a4'}.zmdi-pause-circle-outline:before{content:'\f3a5'}.zmdi-pause-circle:before{content:'\f3a6'}.zmdi-pause:before{content:'\f3a7'}.zmdi-play-circle-outline:before{content:'\f3a8'}.zmdi-play-circle:before{content:'\f3a9'}.zmdi-play:before{content:'\f3aa'}.zmdi-playlist-audio:before{content:'\f3ab'}.zmdi-playlist-plus:before{content:'\f3ac'}.zmdi-repeat-one:before{content:'\f3ad'}.zmdi-repeat:before{content:'\f3ae'}.zmdi-replay-10:before{content:'\f3af'}.zmdi-replay-30:before{content:'\f3b0'}.zmdi-replay-5:before{content:'\f3b1'}.zmdi-replay:before{content:'\f3b2'}.zmdi-shuffle:before{content:'\f3b3'}.zmdi-skip-next:before{content:'\f3b4'}.zmdi-skip-previous:before{content:'\f3b5'}.zmdi-stop:before{content:'\f3b6'}.zmdi-surround-sound:before{content:'\f3b7'}.zmdi-tune:before{content:'\f3b8'}.zmdi-volume-down:before{content:'\f3b9'}.zmdi-volume-mute:before{content:'\f3ba'}.zmdi-volume-off:before{content:'\f3bb'}.zmdi-volume-up:before{content:'\f3bc'}.zmdi-n-1-square:before{content:'\f3bd'}.zmdi-n-2-square:before{content:'\f3be'}.zmdi-n-3-square:before{content:'\f3bf'}.zmdi-n-4-square:before{content:'\f3c0'}.zmdi-n-5-square:before{content:'\f3c1'}.zmdi-n-6-square:before{content:'\f3c2'}.zmdi-neg-1:before{content:'\f3c3'}.zmdi-neg-2:before{content:'\f3c4'}.zmdi-plus-1:before{content:'\f3c5'}.zmdi-plus-2:before{content:'\f3c6'}.zmdi-sec-10:before{content:'\f3c7'}.zmdi-sec-3:before{content:'\f3c8'}.zmdi-zero:before{content:'\f3c9'}.zmdi-airline-seat-flat-angled:before{content:'\f3ca'}.zmdi-airline-seat-flat:before{content:'\f3cb'}.zmdi-airline-seat-individual-suite:before{content:'\f3cc'}.zmdi-airline-seat-legroom-extra:before{content:'\f3cd'}.zmdi-airline-seat-legroom-normal:before{content:'\f3ce'}.zmdi-airline-seat-legroom-reduced:before{content:'\f3cf'}.zmdi-airline-seat-recline-extra:before{content:'\f3d0'}.zmdi-airline-seat-recline-normal:before{content:'\f3d1'}.zmdi-airplay:before{content:'\f3d2'}.zmdi-closed-caption:before{content:'\f3d3'}.zmdi-confirmation-number:before{content:'\f3d4'}.zmdi-developer-board:before{content:'\f3d5'}.zmdi-disc-full:before{content:'\f3d6'}.zmdi-explicit:before{content:'\f3d7'}.zmdi-flight-land:before{content:'\f3d8'}.zmdi-flight-takeoff:before{content:'\f3d9'}.zmdi-flip-to-back:before{content:'\f3da'}.zmdi-flip-to-front:before{content:'\f3db'}.zmdi-group-work:before{content:'\f3dc'}.zmdi-hd:before{content:'\f3dd'}.zmdi-hq:before{content:'\f3de'}.zmdi-markunread-mailbox:before{content:'\f3df'}.zmdi-memory:before{content:'\f3e0'}.zmdi-nfc:before{content:'\f3e1'}.zmdi-play-for-work:before{content:'\f3e2'}.zmdi-power-input:before{content:'\f3e3'}.zmdi-present-to-all:before{content:'\f3e4'}.zmdi-satellite:before{content:'\f3e5'}.zmdi-tap-and-play:before{content:'\f3e6'}.zmdi-vibration:before{content:'\f3e7'}.zmdi-voicemail:before{content:'\f3e8'}.zmdi-3d-rotation:before{content:'\f101'}.zmdi-airplane-off:before{content:'\f102'}.zmdi-airplane:before{content:'\f103'}.zmdi-album:before{content:'\f104'}.zmdi-archive:before{content:'\f105'}.zmdi-assignment-account:before{content:'\f106'}.zmdi-assignment-alert:before{content:'\f107'}.zmdi-assignment-check:before{content:'\f108'}.zmdi-assignment-o:before{content:'\f109'}.zmdi-assignment-return:before{content:'\f10a'}.zmdi-assignment-returned:before{content:'\f10b'}.zmdi-assignment:before{content:'\f10c'}.zmdi-attachment-alt:before{content:'\f10d'}.zmdi-attachment:before{content:'\f10e'}.zmdi-audio:before{content:'\f10f'}.zmdi-badge-check:before{content:'\f110'}.zmdi-balance-wallet:before{content:'\f111'}.zmdi-balance:before{content:'\f112'}.zmdi-battery-alert:before{content:'\f113'}.zmdi-battery-flash:before{content:'\f114'}.zmdi-battery-unknown:before{content:'\f115'}.zmdi-battery:before{content:'\f116'}.zmdi-bike:before{content:'\f117'}.zmdi-block-alt:before{content:'\f118'}.zmdi-block:before{content:'\f119'}.zmdi-boat:before{content:'\f11a'}.zmdi-book-image:before{content:'\f11b'}.zmdi-book:before{content:'\f11c'}.zmdi-bookmark-outline:before{content:'\f11d'}.zmdi-bookmark:before{content:'\f11e'}.zmdi-brush:before{content:'\f11f'}.zmdi-bug:before{content:'\f120'}.zmdi-bus:before{content:'\f121'}.zmdi-cake:before{content:'\f122'}.zmdi-car-taxi:before{content:'\f123'}.zmdi-car-wash:before{content:'\f124'}.zmdi-car:before{content:'\f125'}.zmdi-card-giftcard:before{content:'\f126'}.zmdi-card-membership:before{content:'\f127'}.zmdi-card-travel:before{content:'\f128'}.zmdi-card:before{content:'\f129'}.zmdi-case-check:before{content:'\f12a'}.zmdi-case-download:before{content:'\f12b'}.zmdi-case-play:before{content:'\f12c'}.zmdi-case:before{content:'\f12d'}.zmdi-cast-connected:before{content:'\f12e'}.zmdi-cast:before{content:'\f12f'}.zmdi-chart-donut:before{content:'\f130'}.zmdi-chart:before{content:'\f131'}.zmdi-city-alt:before{content:'\f132'}.zmdi-city:before{content:'\f133'}.zmdi-close-circle-o:before{content:'\f134'}.zmdi-close-circle:before{content:'\f135'}.zmdi-close:before{content:'\f136'}.zmdi-cocktail:before{content:'\f137'}.zmdi-code-setting:before{content:'\f138'}.zmdi-code-smartphone:before{content:'\f139'}.zmdi-code:before{content:'\f13a'}.zmdi-coffee:before{content:'\f13b'}.zmdi-collection-bookmark:before{content:'\f13c'}.zmdi-collection-case-play:before{content:'\f13d'}.zmdi-collection-folder-image:before{content:'\f13e'}.zmdi-collection-image-o:before{content:'\f13f'}.zmdi-collection-image:before{content:'\f140'}.zmdi-collection-item-1:before{content:'\f141'}.zmdi-collection-item-2:before{content:'\f142'}.zmdi-collection-item-3:before{content:'\f143'}.zmdi-collection-item-4:before{content:'\f144'}.zmdi-collection-item-5:before{content:'\f145'}.zmdi-collection-item-6:before{content:'\f146'}.zmdi-collection-item-7:before{content:'\f147'}.zmdi-collection-item-8:before{content:'\f148'}.zmdi-collection-item-9-plus:before{content:'\f149'}.zmdi-collection-item-9:before{content:'\f14a'}.zmdi-collection-item:before{content:'\f14b'}.zmdi-collection-music:before{content:'\f14c'}.zmdi-collection-pdf:before{content:'\f14d'}.zmdi-collection-plus:before{content:'\f14e'}.zmdi-collection-speaker:before{content:'\f14f'}.zmdi-collection-text:before{content:'\f150'}.zmdi-collection-video:before{content:'\f151'}.zmdi-compass:before{content:'\f152'}.zmdi-cutlery:before{content:'\f153'}.zmdi-delete:before{content:'\f154'}.zmdi-dialpad:before{content:'\f155'}.zmdi-dns:before{content:'\f156'}.zmdi-drink:before{content:'\f157'}.zmdi-edit:before{content:'\f158'}.zmdi-email-open:before{content:'\f159'}.zmdi-email:before{content:'\f15a'}.zmdi-eye-off:before{content:'\f15b'}.zmdi-eye:before{content:'\f15c'}.zmdi-eyedropper:before{content:'\f15d'}.zmdi-favorite-outline:before{content:'\f15e'}.zmdi-favorite:before{content:'\f15f'}.zmdi-filter-list:before{content:'\f160'}.zmdi-fire:before{content:'\f161'}.zmdi-flag:before{content:'\f162'}.zmdi-flare:before{content:'\f163'}.zmdi-flash-auto:before{content:'\f164'}.zmdi-flash-off:before{content:'\f165'}.zmdi-flash:before{content:'\f166'}.zmdi-flip:before{content:'\f167'}.zmdi-flower-alt:before{content:'\f168'}.zmdi-flower:before{content:'\f169'}.zmdi-font:before{content:'\f16a'}.zmdi-fullscreen-alt:before{content:'\f16b'}.zmdi-fullscreen-exit:before{content:'\f16c'}.zmdi-fullscreen:before{content:'\f16d'}.zmdi-functions:before{content:'\f16e'}.zmdi-gas-station:before{content:'\f16f'}.zmdi-gesture:before{content:'\f170'}.zmdi-globe-alt:before{content:'\f171'}.zmdi-globe-lock:before{content:'\f172'}.zmdi-globe:before{content:'\f173'}.zmdi-graduation-cap:before{content:'\f174'}.zmdi-home:before{content:'\f175'}.zmdi-hospital-alt:before{content:'\f176'}.zmdi-hospital:before{content:'\f177'}.zmdi-hotel:before{content:'\f178'}.zmdi-hourglass-alt:before{content:'\f179'}.zmdi-hourglass-outline:before{content:'\f17a'}.zmdi-hourglass:before{content:'\f17b'}.zmdi-http:before{content:'\f17c'}.zmdi-image-alt:before{content:'\f17d'}.zmdi-image-o:before{content:'\f17e'}.zmdi-image:before{content:'\f17f'}.zmdi-inbox:before{content:'\f180'}.zmdi-invert-colors-off:before{content:'\f181'}.zmdi-invert-colors:before{content:'\f182'}.zmdi-key:before{content:'\f183'}.zmdi-label-alt-outline:before{content:'\f184'}.zmdi-label-alt:before{content:'\f185'}.zmdi-label-heart:before{content:'\f186'}.zmdi-label:before{content:'\f187'}.zmdi-labels:before{content:'\f188'}.zmdi-lamp:before{content:'\f189'}.zmdi-landscape:before{content:'\f18a'}.zmdi-layers-off:before{content:'\f18b'}.zmdi-layers:before{content:'\f18c'}.zmdi-library:before{content:'\f18d'}.zmdi-link:before{content:'\f18e'}.zmdi-lock-open:before{content:'\f18f'}.zmdi-lock-outline:before{content:'\f190'}.zmdi-lock:before{content:'\f191'}.zmdi-mail-reply-all:before{content:'\f192'}.zmdi-mail-reply:before{content:'\f193'}.zmdi-mail-send:before{content:'\f194'}.zmdi-mall:before{content:'\f195'}.zmdi-map:before{content:'\f196'}.zmdi-menu:before{content:'\f197'}.zmdi-money-box:before{content:'\f198'}.zmdi-money-off:before{content:'\f199'}.zmdi-money:before{content:'\f19a'}.zmdi-more-vert:before{content:'\f19b'}.zmdi-more:before{content:'\f19c'}.zmdi-movie-alt:before{content:'\f19d'}.zmdi-movie:before{content:'\f19e'}.zmdi-nature-people:before{content:'\f19f'}.zmdi-nature:before{content:'\f1a0'}.zmdi-navigation:before{content:'\f1a1'}.zmdi-open-in-browser:before{content:'\f1a2'}.zmdi-open-in-new:before{content:'\f1a3'}.zmdi-palette:before{content:'\f1a4'}.zmdi-parking:before{content:'\f1a5'}.zmdi-pin-account:before{content:'\f1a6'}.zmdi-pin-assistant:before{content:'\f1a7'}.zmdi-pin-drop:before{content:'\f1a8'}.zmdi-pin-help:before{content:'\f1a9'}.zmdi-pin-off:before{content:'\f1aa'}.zmdi-pin:before{content:'\f1ab'}.zmdi-pizza:before{content:'\f1ac'}.zmdi-plaster:before{content:'\f1ad'}.zmdi-power-setting:before{content:'\f1ae'}.zmdi-power:before{content:'\f1af'}.zmdi-print:before{content:'\f1b0'}.zmdi-puzzle-piece:before{content:'\f1b1'}.zmdi-quote:before{content:'\f1b2'}.zmdi-railway:before{content:'\f1b3'}.zmdi-receipt:before{content:'\f1b4'}.zmdi-refresh-alt:before{content:'\f1b5'}.zmdi-refresh-sync-alert:before{content:'\f1b6'}.zmdi-refresh-sync-off:before{content:'\f1b7'}.zmdi-refresh-sync:before{content:'\f1b8'}.zmdi-refresh:before{content:'\f1b9'}.zmdi-roller:before{content:'\f1ba'}.zmdi-ruler:before{content:'\f1bb'}.zmdi-scissors:before{content:'\f1bc'}.zmdi-screen-rotation-lock:before{content:'\f1bd'}.zmdi-screen-rotation:before{content:'\f1be'}.zmdi-search-for:before{content:'\f1bf'}.zmdi-search-in-file:before{content:'\f1c0'}.zmdi-search-in-page:before{content:'\f1c1'}.zmdi-search-replace:before{content:'\f1c2'}.zmdi-search:before{content:'\f1c3'}.zmdi-seat:before{content:'\f1c4'}.zmdi-settings-square:before{content:'\f1c5'}.zmdi-settings:before{content:'\f1c6'}.zmdi-shield-check:before{content:'\f1c7'}.zmdi-shield-security:before{content:'\f1c8'}.zmdi-shopping-basket:before{content:'\f1c9'}.zmdi-shopping-cart-plus:before{content:'\f1ca'}.zmdi-shopping-cart:before{content:'\f1cb'}.zmdi-sign-in:before{content:'\f1cc'}.zmdi-sort-amount-asc:before{content:'\f1cd'}.zmdi-sort-amount-desc:before{content:'\f1ce'}.zmdi-sort-asc:before{content:'\f1cf'}.zmdi-sort-desc:before{content:'\f1d0'}.zmdi-spellcheck:before{content:'\f1d1'}.zmdi-storage:before{content:'\f1d2'}.zmdi-store-24:before{content:'\f1d3'}.zmdi-store:before{content:'\f1d4'}.zmdi-subway:before{content:'\f1d5'}.zmdi-sun:before{content:'\f1d6'}.zmdi-tab-unselected:before{content:'\f1d7'}.zmdi-tab:before{content:'\f1d8'}.zmdi-tag-close:before{content:'\f1d9'}.zmdi-tag-more:before{content:'\f1da'}.zmdi-tag:before{content:'\f1db'}.zmdi-thumb-down:before{content:'\f1dc'}.zmdi-thumb-up-down:before{content:'\f1dd'}.zmdi-thumb-up:before{content:'\f1de'}.zmdi-ticket-star:before{content:'\f1df'}.zmdi-toll:before{content:'\f1e0'}.zmdi-toys:before{content:'\f1e1'}.zmdi-traffic:before{content:'\f1e2'}.zmdi-translate:before{content:'\f1e3'}.zmdi-triangle-down:before{content:'\f1e4'}.zmdi-triangle-up:before{content:'\f1e5'}.zmdi-truck:before{content:'\f1e6'}.zmdi-turning-sign:before{content:'\f1e7'}.zmdi-wallpaper:before{content:'\f1e8'}.zmdi-washing-machine:before{content:'\f1e9'}.zmdi-window-maximize:before{content:'\f1ea'}.zmdi-window-minimize:before{content:'\f1eb'}.zmdi-window-restore:before{content:'\f1ec'}.zmdi-wrench:before{content:'\f1ed'}.zmdi-zoom-in:before{content:'\f1ee'}.zmdi-zoom-out:before{content:'\f1ef'}.zmdi-alert-circle-o:before{content:'\f1f0'}.zmdi-alert-circle:before{content:'\f1f1'}.zmdi-alert-octagon:before{content:'\f1f2'}.zmdi-alert-polygon:before{content:'\f1f3'}.zmdi-alert-triangle:before{content:'\f1f4'}.zmdi-help-outline:before{content:'\f1f5'}.zmdi-help:before{content:'\f1f6'}.zmdi-info-outline:before{content:'\f1f7'}.zmdi-info:before{content:'\f1f8'}.zmdi-notifications-active:before{content:'\f1f9'}.zmdi-notifications-add:before{content:'\f1fa'}.zmdi-notifications-none:before{content:'\f1fb'}.zmdi-notifications-off:before{content:'\f1fc'}.zmdi-notifications-paused:before{content:'\f1fd'}.zmdi-notifications:before{content:'\f1fe'}.zmdi-account-add:before{content:'\f1ff'}.zmdi-account-box-mail:before{content:'\f200'}.zmdi-account-box-o:before{content:'\f201'}.zmdi-account-box-phone:before{content:'\f202'}.zmdi-account-box:before{content:'\f203'}.zmdi-account-calendar:before{content:'\f204'}.zmdi-account-circle:before{content:'\f205'}.zmdi-account-o:before{content:'\f206'}.zmdi-account:before{content:'\f207'}.zmdi-accounts-add:before{content:'\f208'}.zmdi-accounts-alt:before{content:'\f209'}.zmdi-accounts-list-alt:before{content:'\f20a'}.zmdi-accounts-list:before{content:'\f20b'}.zmdi-accounts-outline:before{content:'\f20c'}.zmdi-accounts:before{content:'\f20d'}.zmdi-face:before{content:'\f20e'}.zmdi-female:before{content:'\f20f'}.zmdi-male-alt:before{content:'\f210'}.zmdi-male-female:before{content:'\f211'}.zmdi-male:before{content:'\f212'}.zmdi-mood-bad:before{content:'\f213'}.zmdi-mood:before{content:'\f214'}.zmdi-run:before{content:'\f215'}.zmdi-walk:before{content:'\f216'}.zmdi-cloud-box:before{content:'\f217'}.zmdi-cloud-circle:before{content:'\f218'}.zmdi-cloud-done:before{content:'\f219'}.zmdi-cloud-download:before{content:'\f21a'}.zmdi-cloud-off:before{content:'\f21b'}.zmdi-cloud-outline-alt:before{content:'\f21c'}.zmdi-cloud-outline:before{content:'\f21d'}.zmdi-cloud-upload:before{content:'\f21e'}.zmdi-cloud:before{content:'\f21f'}.zmdi-download:before{content:'\f220'}.zmdi-file-plus:before{content:'\f221'}.zmdi-file-text:before{content:'\f222'}.zmdi-file:before{content:'\f223'}.zmdi-folder-outline:before{content:'\f224'}.zmdi-folder-person:before{content:'\f225'}.zmdi-folder-star-alt:before{content:'\f226'}.zmdi-folder-star:before{content:'\f227'}.zmdi-folder:before{content:'\f228'}.zmdi-gif:before{content:'\f229'}.zmdi-upload:before{content:'\f22a'}.zmdi-border-all:before{content:'\f22b'}.zmdi-border-bottom:before{content:'\f22c'}.zmdi-border-clear:before{content:'\f22d'}.zmdi-border-color:before{content:'\f22e'}.zmdi-border-horizontal:before{content:'\f22f'}.zmdi-border-inner:before{content:'\f230'}.zmdi-border-left:before{content:'\f231'}.zmdi-border-outer:before{content:'\f232'}.zmdi-border-right:before{content:'\f233'}.zmdi-border-style:before{content:'\f234'}.zmdi-border-top:before{content:'\f235'}.zmdi-border-vertical:before{content:'\f236'}.zmdi-copy:before{content:'\f237'}.zmdi-crop:before{content:'\f238'}.zmdi-format-align-center:before{content:'\f239'}.zmdi-format-align-justify:before{content:'\f23a'}.zmdi-format-align-left:before{content:'\f23b'}.zmdi-format-align-right:before{content:'\f23c'}.zmdi-format-bold:before{content:'\f23d'}.zmdi-format-clear-all:before{content:'\f23e'}.zmdi-format-clear:before{content:'\f23f'}.zmdi-format-color-fill:before{content:'\f240'}.zmdi-format-color-reset:before{content:'\f241'}.zmdi-format-color-text:before{content:'\f242'}.zmdi-format-indent-decrease:before{content:'\f243'}.zmdi-format-indent-increase:before{content:'\f244'}.zmdi-format-italic:before{content:'\f245'}.zmdi-format-line-spacing:before{content:'\f246'}.zmdi-format-list-bulleted:before{content:'\f247'}.zmdi-format-list-numbered:before{content:'\f248'}.zmdi-format-ltr:before{content:'\f249'}.zmdi-format-rtl:before{content:'\f24a'}.zmdi-format-size:before{content:'\f24b'}.zmdi-format-strikethrough-s:before{content:'\f24c'}.zmdi-format-strikethrough:before{content:'\f24d'}.zmdi-format-subject:before{content:'\f24e'}.zmdi-format-underlined:before{content:'\f24f'}.zmdi-format-valign-bottom:before{content:'\f250'}.zmdi-format-valign-center:before{content:'\f251'}.zmdi-format-valign-top:before{content:'\f252'}.zmdi-redo:before{content:'\f253'}.zmdi-select-all:before{content:'\f254'}.zmdi-space-bar:before{content:'\f255'}.zmdi-text-format:before{content:'\f256'}.zmdi-transform:before{content:'\f257'}.zmdi-undo:before{content:'\f258'}.zmdi-wrap-text:before{content:'\f259'}.zmdi-comment-alert:before{content:'\f25a'}.zmdi-comment-alt-text:before{content:'\f25b'}.zmdi-comment-alt:before{content:'\f25c'}.zmdi-comment-edit:before{content:'\f25d'}.zmdi-comment-image:before{content:'\f25e'}.zmdi-comment-list:before{content:'\f25f'}.zmdi-comment-more:before{content:'\f260'}.zmdi-comment-outline:before{content:'\f261'}.zmdi-comment-text-alt:before{content:'\f262'}.zmdi-comment-text:before{content:'\f263'}.zmdi-comment-video:before{content:'\f264'}.zmdi-comment:before{content:'\f265'}.zmdi-comments:before{content:'\f266'}.zmdi-check-all:before{content:'\f267'}.zmdi-check-circle-u:before{content:'\f268'}.zmdi-check-circle:before{content:'\f269'}.zmdi-check-square:before{content:'\f26a'}.zmdi-check:before{content:'\f26b'}.zmdi-circle-o:before{content:'\f26c'}.zmdi-circle:before{content:'\f26d'}.zmdi-dot-circle-alt:before{content:'\f26e'}.zmdi-dot-circle:before{content:'\f26f'}.zmdi-minus-circle-outline:before{content:'\f270'}.zmdi-minus-circle:before{content:'\f271'}.zmdi-minus-square:before{content:'\f272'}.zmdi-minus:before{content:'\f273'}.zmdi-plus-circle-o-duplicate:before{content:'\f274'}.zmdi-plus-circle-o:before{content:'\f275'}.zmdi-plus-circle:before{content:'\f276'}.zmdi-plus-square:before{content:'\f277'}.zmdi-plus:before{content:'\f278'}.zmdi-square-o:before{content:'\f279'}.zmdi-star-circle:before{content:'\f27a'}.zmdi-star-half:before{content:'\f27b'}.zmdi-star-outline:before{content:'\f27c'}.zmdi-star:before{content:'\f27d'}.zmdi-bluetooth-connected:before{content:'\f27e'}.zmdi-bluetooth-off:before{content:'\f27f'}.zmdi-bluetooth-search:before{content:'\f280'}.zmdi-bluetooth-setting:before{content:'\f281'}.zmdi-bluetooth:before{content:'\f282'}.zmdi-camera-add:before{content:'\f283'}.zmdi-camera-alt:before{content:'\f284'}.zmdi-camera-bw:before{content:'\f285'}.zmdi-camera-front:before{content:'\f286'}.zmdi-camera-mic:before{content:'\f287'}.zmdi-camera-party-mode:before{content:'\f288'}.zmdi-camera-rear:before{content:'\f289'}.zmdi-camera-roll:before{content:'\f28a'}.zmdi-camera-switch:before{content:'\f28b'}.zmdi-camera:before{content:'\f28c'}.zmdi-card-alert:before{content:'\f28d'}.zmdi-card-off:before{content:'\f28e'}.zmdi-card-sd:before{content:'\f28f'}.zmdi-card-sim:before{content:'\f290'}.zmdi-desktop-mac:before{content:'\f291'}.zmdi-desktop-windows:before{content:'\f292'}.zmdi-device-hub:before{content:'\f293'}.zmdi-devices-off:before{content:'\f294'}.zmdi-devices:before{content:'\f295'}.zmdi-dock:before{content:'\f296'}.zmdi-floppy:before{content:'\f297'}.zmdi-gamepad:before{content:'\f298'}.zmdi-gps-dot:before{content:'\f299'}.zmdi-gps-off:before{content:'\f29a'}.zmdi-gps:before{content:'\f29b'}.zmdi-headset-mic:before{content:'\f29c'}.zmdi-headset:before{content:'\f29d'}.zmdi-input-antenna:before{content:'\f29e'}.zmdi-input-composite:before{content:'\f29f'}.zmdi-input-hdmi:before{content:'\f2a0'}.zmdi-input-power:before{content:'\f2a1'}.zmdi-input-svideo:before{content:'\f2a2'}.zmdi-keyboard-hide:before{content:'\f2a3'}.zmdi-keyboard:before{content:'\f2a4'}.zmdi-laptop-chromebook:before{content:'\f2a5'}.zmdi-laptop-mac:before{content:'\f2a6'}.zmdi-laptop:before{content:'\f2a7'}.zmdi-mic-off:before{content:'\f2a8'}.zmdi-mic-outline:before{content:'\f2a9'}.zmdi-mic-setting:before{content:'\f2aa'}.zmdi-mic:before{content:'\f2ab'}.zmdi-mouse:before{content:'\f2ac'}.zmdi-network-alert:before{content:'\f2ad'}.zmdi-network-locked:before{content:'\f2ae'}.zmdi-network-off:before{content:'\f2af'}.zmdi-network-outline:before{content:'\f2b0'}.zmdi-network-setting:before{content:'\f2b1'}.zmdi-network:before{content:'\f2b2'}.zmdi-phone-bluetooth:before{content:'\f2b3'}.zmdi-phone-end:before{content:'\f2b4'}.zmdi-phone-forwarded:before{content:'\f2b5'}.zmdi-phone-in-talk:before{content:'\f2b6'}.zmdi-phone-locked:before{content:'\f2b7'}.zmdi-phone-missed:before{content:'\f2b8'}.zmdi-phone-msg:before{content:'\f2b9'}.zmdi-phone-paused:before{content:'\f2ba'}.zmdi-phone-ring:before{content:'\f2bb'}.zmdi-phone-setting:before{content:'\f2bc'}.zmdi-phone-sip:before{content:'\f2bd'}.zmdi-phone:before{content:'\f2be'}.zmdi-portable-wifi-changes:before{content:'\f2bf'}.zmdi-portable-wifi-off:before{content:'\f2c0'}.zmdi-portable-wifi:before{content:'\f2c1'}.zmdi-radio:before{content:'\f2c2'}.zmdi-reader:before{content:'\f2c3'}.zmdi-remote-control-alt:before{content:'\f2c4'}.zmdi-remote-control:before{content:'\f2c5'}.zmdi-router:before{content:'\f2c6'}.zmdi-scanner:before{content:'\f2c7'}.zmdi-smartphone-android:before{content:'\f2c8'}.zmdi-smartphone-download:before{content:'\f2c9'}.zmdi-smartphone-erase:before{content:'\f2ca'}.zmdi-smartphone-info:before{content:'\f2cb'}.zmdi-smartphone-iphone:before{content:'\f2cc'}.zmdi-smartphone-landscape-lock:before{content:'\f2cd'}.zmdi-smartphone-landscape:before{content:'\f2ce'}.zmdi-smartphone-lock:before{content:'\f2cf'}.zmdi-smartphone-portrait-lock:before{content:'\f2d0'}.zmdi-smartphone-ring:before{content:'\f2d1'}.zmdi-smartphone-setting:before{content:'\f2d2'}.zmdi-smartphone-setup:before{content:'\f2d3'}.zmdi-smartphone:before{content:'\f2d4'}.zmdi-speaker:before{content:'\f2d5'}.zmdi-tablet-android:before{content:'\f2d6'}.zmdi-tablet-mac:before{content:'\f2d7'}.zmdi-tablet:before{content:'\f2d8'}.zmdi-tv-alt-play:before{content:'\f2d9'}.zmdi-tv-list:before{content:'\f2da'}.zmdi-tv-play:before{content:'\f2db'}.zmdi-tv:before{content:'\f2dc'}.zmdi-usb:before{content:'\f2dd'}.zmdi-videocam-off:before{content:'\f2de'}.zmdi-videocam-switch:before{content:'\f2df'}.zmdi-videocam:before{content:'\f2e0'}.zmdi-watch:before{content:'\f2e1'}.zmdi-wifi-alt-2:before{content:'\f2e2'}.zmdi-wifi-alt:before{content:'\f2e3'}.zmdi-wifi-info:before{content:'\f2e4'}.zmdi-wifi-lock:before{content:'\f2e5'}.zmdi-wifi-off:before{content:'\f2e6'}.zmdi-wifi-outline:before{content:'\f2e7'}.zmdi-wifi:before{content:'\f2e8'}.zmdi-arrow-left-bottom:before{content:'\f2e9'}.zmdi-arrow-left:before{content:'\f2ea'}.zmdi-arrow-merge:before{content:'\f2eb'}.zmdi-arrow-missed:before{content:'\f2ec'}.zmdi-arrow-right-top:before{content:'\f2ed'}.zmdi-arrow-right:before{content:'\f2ee'}.zmdi-arrow-split:before{content:'\f2ef'}.zmdi-arrows:before{content:'\f2f0'}.zmdi-caret-down-circle:before{content:'\f2f1'}.zmdi-caret-down:before{content:'\f2f2'}.zmdi-caret-left-circle:before{content:'\f2f3'}.zmdi-caret-left:before{content:'\f2f4'}.zmdi-caret-right-circle:before{content:'\f2f5'}.zmdi-caret-right:before{content:'\f2f6'}.zmdi-caret-up-circle:before{content:'\f2f7'}.zmdi-caret-up:before{content:'\f2f8'}.zmdi-chevron-down:before{content:'\f2f9'}.zmdi-chevron-left:before{content:'\f2fa'}.zmdi-chevron-right:before{content:'\f2fb'}.zmdi-chevron-up:before{content:'\f2fc'}.zmdi-forward:before{content:'\f2fd'}.zmdi-long-arrow-down:before{content:'\f2fe'}.zmdi-long-arrow-left:before{content:'\f2ff'}.zmdi-long-arrow-return:before{content:'\f300'}.zmdi-long-arrow-right:before{content:'\f301'}.zmdi-long-arrow-tab:before{content:'\f302'}.zmdi-long-arrow-up:before{content:'\f303'}.zmdi-rotate-ccw:before{content:'\f304'}.zmdi-rotate-cw:before{content:'\f305'}.zmdi-rotate-left:before{content:'\f306'}.zmdi-rotate-right:before{content:'\f307'}.zmdi-square-down:before{content:'\f308'}.zmdi-square-right:before{content:'\f309'}.zmdi-swap-alt:before{content:'\f30a'}.zmdi-swap-vertical-circle:before{content:'\f30b'}.zmdi-swap-vertical:before{content:'\f30c'}.zmdi-swap:before{content:'\f30d'}.zmdi-trending-down:before{content:'\f30e'}.zmdi-trending-flat:before{content:'\f30f'}.zmdi-trending-up:before{content:'\f310'}.zmdi-unfold-less:before{content:'\f311'}.zmdi-unfold-more:before{content:'\f312'}.zmdi-apps:before{content:'\f313'}.zmdi-grid-off:before{content:'\f314'}.zmdi-grid:before{content:'\f315'}.zmdi-view-agenda:before{content:'\f316'}.zmdi-view-array:before{content:'\f317'}.zmdi-view-carousel:before{content:'\f318'}.zmdi-view-column:before{content:'\f319'}.zmdi-view-comfy:before{content:'\f31a'}.zmdi-view-compact:before{content:'\f31b'}.zmdi-view-dashboard:before{content:'\f31c'}.zmdi-view-day:before{content:'\f31d'}.zmdi-view-headline:before{content:'\f31e'}.zmdi-view-list-alt:before{content:'\f31f'}.zmdi-view-list:before{content:'\f320'}.zmdi-view-module:before{content:'\f321'}.zmdi-view-quilt:before{content:'\f322'}.zmdi-view-stream:before{content:'\f323'}.zmdi-view-subtitles:before{content:'\f324'}.zmdi-view-toc:before{content:'\f325'}.zmdi-view-web:before{content:'\f326'}.zmdi-view-week:before{content:'\f327'}.zmdi-widgets:before{content:'\f328'}.zmdi-alarm-check:before{content:'\f329'}.zmdi-alarm-off:before{content:'\f32a'}.zmdi-alarm-plus:before{content:'\f32b'}.zmdi-alarm-snooze:before{content:'\f32c'}.zmdi-alarm:before{content:'\f32d'}.zmdi-calendar-alt:before{content:'\f32e'}.zmdi-calendar-check:before{content:'\f32f'}.zmdi-calendar-close:before{content:'\f330'}.zmdi-calendar-note:before{content:'\f331'}.zmdi-calendar:before{content:'\f332'}.zmdi-time-countdown:before{content:'\f333'}.zmdi-time-interval:before{content:'\f334'}.zmdi-time-restore-setting:before{content:'\f335'}.zmdi-time-restore:before{content:'\f336'}.zmdi-time:before{content:'\f337'}.zmdi-timer-off:before{content:'\f338'}.zmdi-timer:before{content:'\f339'}.zmdi-android-alt:before{content:'\f33a'}.zmdi-android:before{content:'\f33b'}.zmdi-apple:before{content:'\f33c'}.zmdi-behance:before{content:'\f33d'}.zmdi-codepen:before{content:'\f33e'}.zmdi-dribbble:before{content:'\f33f'}.zmdi-dropbox:before{content:'\f340'}.zmdi-evernote:before{content:'\f341'}.zmdi-facebook-box:before{content:'\f342'}.zmdi-facebook:before{content:'\f343'}.zmdi-github-box:before{content:'\f344'}.zmdi-github:before{content:'\f345'}.zmdi-google-drive:before{content:'\f346'}.zmdi-google-earth:before{content:'\f347'}.zmdi-google-glass:before{content:'\f348'}.zmdi-google-maps:before{content:'\f349'}.zmdi-google-pages:before{content:'\f34a'}.zmdi-google-play:before{content:'\f34b'}.zmdi-google-plus-box:before{content:'\f34c'}.zmdi-google-plus:before{content:'\f34d'}.zmdi-google:before{content:'\f34e'}.zmdi-instagram:before{content:'\f34f'}.zmdi-language-css3:before{content:'\f350'}.zmdi-language-html5:before{content:'\f351'}.zmdi-language-javascript:before{content:'\f352'}.zmdi-language-python-alt:before{content:'\f353'}.zmdi-language-python:before{content:'\f354'}.zmdi-lastfm:before{content:'\f355'}.zmdi-linkedin-box:before{content:'\f356'}.zmdi-paypal:before{content:'\f357'}.zmdi-pinterest-box:before{content:'\f358'}.zmdi-pocket:before{content:'\f359'}.zmdi-polymer:before{content:'\f35a'}.zmdi-share:before{content:'\f35b'}.zmdi-stack-overflow:before{content:'\f35c'}.zmdi-steam-square:before{content:'\f35d'}.zmdi-steam:before{content:'\f35e'}.zmdi-twitter-box:before{content:'\f35f'}.zmdi-twitter:before{content:'\f360'}.zmdi-vk:before{content:'\f361'}.zmdi-wikipedia:before{content:'\f362'}.zmdi-windows:before{content:'\f363'}.zmdi-aspect-ratio-alt:before{content:'\f364'}.zmdi-aspect-ratio:before{content:'\f365'}.zmdi-blur-circular:before{content:'\f366'}.zmdi-blur-linear:before{content:'\f367'}.zmdi-blur-off:before{content:'\f368'}.zmdi-blur:before{content:'\f369'}.zmdi-brightness-2:before{content:'\f36a'}.zmdi-brightness-3:before{content:'\f36b'}.zmdi-brightness-4:before{content:'\f36c'}.zmdi-brightness-5:before{content:'\f36d'}.zmdi-brightness-6:before{content:'\f36e'}.zmdi-brightness-7:before{content:'\f36f'}.zmdi-brightness-auto:before{content:'\f370'}.zmdi-brightness-setting:before{content:'\f371'}.zmdi-broken-image:before{content:'\f372'}.zmdi-center-focus-strong:before{content:'\f373'}.zmdi-center-focus-weak:before{content:'\f374'}.zmdi-compare:before{content:'\f375'}.zmdi-crop-16-9:before{content:'\f376'}.zmdi-crop-3-2:before{content:'\f377'}.zmdi-crop-5-4:before{content:'\f378'}.zmdi-crop-7-5:before{content:'\f379'}.zmdi-crop-din:before{content:'\f37a'}.zmdi-crop-free:before{content:'\f37b'}.zmdi-crop-landscape:before{content:'\f37c'}.zmdi-crop-portrait:before{content:'\f37d'}.zmdi-crop-square:before{content:'\f37e'}.zmdi-exposure-alt:before{content:'\f37f'}.zmdi-exposure:before{content:'\f380'}.zmdi-filter-b-and-w:before{content:'\f381'}.zmdi-filter-center-focus:before{content:'\f382'}.zmdi-filter-frames:before{content:'\f383'}.zmdi-filter-tilt-shift:before{content:'\f384'}.zmdi-gradient:before{content:'\f385'}.zmdi-grain:before{content:'\f386'}.zmdi-graphic-eq:before{content:'\f387'}.zmdi-hdr-off:before{content:'\f388'}.zmdi-hdr-strong:before{content:'\f389'}.zmdi-hdr-weak:before{content:'\f38a'}.zmdi-hdr:before{content:'\f38b'}.zmdi-iridescent:before{content:'\f38c'}.zmdi-leak-off:before{content:'\f38d'}.zmdi-leak:before{content:'\f38e'}.zmdi-looks:before{content:'\f38f'}.zmdi-loupe:before{content:'\f390'}.zmdi-panorama-horizontal:before{content:'\f391'}.zmdi-panorama-vertical:before{content:'\f392'}.zmdi-panorama-wide-angle:before{content:'\f393'}.zmdi-photo-size-select-large:before{content:'\f394'}.zmdi-photo-size-select-small:before{content:'\f395'}.zmdi-picture-in-picture:before{content:'\f396'}.zmdi-slideshow:before{content:'\f397'}.zmdi-texture:before{content:'\f398'}.zmdi-tonality:before{content:'\f399'}.zmdi-vignette:before{content:'\f39a'}.zmdi-wb-auto:before{content:'\f39b'}.zmdi-eject-alt:before{content:'\f39c'}.zmdi-eject:before{content:'\f39d'}.zmdi-equalizer:before{content:'\f39e'}.zmdi-fast-forward:before{content:'\f39f'}.zmdi-fast-rewind:before{content:'\f3a0'}.zmdi-forward-10:before{content:'\f3a1'}.zmdi-forward-30:before{content:'\f3a2'}.zmdi-forward-5:before{content:'\f3a3'}.zmdi-hearing:before{content:'\f3a4'}.zmdi-pause-circle-outline:before{content:'\f3a5'}.zmdi-pause-circle:before{content:'\f3a6'}.zmdi-pause:before{content:'\f3a7'}.zmdi-play-circle-outline:before{content:'\f3a8'}.zmdi-play-circle:before{content:'\f3a9'}.zmdi-play:before{content:'\f3aa'}.zmdi-playlist-audio:before{content:'\f3ab'}.zmdi-playlist-plus:before{content:'\f3ac'}.zmdi-repeat-one:before{content:'\f3ad'}.zmdi-repeat:before{content:'\f3ae'}.zmdi-replay-10:before{content:'\f3af'}.zmdi-replay-30:before{content:'\f3b0'}.zmdi-replay-5:before{content:'\f3b1'}.zmdi-replay:before{content:'\f3b2'}.zmdi-shuffle:before{content:'\f3b3'}.zmdi-skip-next:before{content:'\f3b4'}.zmdi-skip-previous:before{content:'\f3b5'}.zmdi-stop:before{content:'\f3b6'}.zmdi-surround-sound:before{content:'\f3b7'}.zmdi-tune:before{content:'\f3b8'}.zmdi-volume-down:before{content:'\f3b9'}.zmdi-volume-mute:before{content:'\f3ba'}.zmdi-volume-off:before{content:'\f3bb'}.zmdi-volume-up:before{content:'\f3bc'}.zmdi-n-1-square:before{content:'\f3bd'}.zmdi-n-2-square:before{content:'\f3be'}.zmdi-n-3-square:before{content:'\f3bf'}.zmdi-n-4-square:before{content:'\f3c0'}.zmdi-n-5-square:before{content:'\f3c1'}.zmdi-n-6-square:before{content:'\f3c2'}.zmdi-neg-1:before{content:'\f3c3'}.zmdi-neg-2:before{content:'\f3c4'}.zmdi-plus-1:before{content:'\f3c5'}.zmdi-plus-2:before{content:'\f3c6'}.zmdi-sec-10:before{content:'\f3c7'}.zmdi-sec-3:before{content:'\f3c8'}.zmdi-zero:before{content:'\f3c9'}.zmdi-airline-seat-flat-angled:before{content:'\f3ca'}.zmdi-airline-seat-flat:before{content:'\f3cb'}.zmdi-airline-seat-individual-suite:before{content:'\f3cc'}.zmdi-airline-seat-legroom-extra:before{content:'\f3cd'}.zmdi-airline-seat-legroom-normal:before{content:'\f3ce'}.zmdi-airline-seat-legroom-reduced:before{content:'\f3cf'}.zmdi-airline-seat-recline-extra:before{content:'\f3d0'}.zmdi-airline-seat-recline-normal:before{content:'\f3d1'}.zmdi-airplay:before{content:'\f3d2'}.zmdi-closed-caption:before{content:'\f3d3'}.zmdi-confirmation-number:before{content:'\f3d4'}.zmdi-developer-board:before{content:'\f3d5'}.zmdi-disc-full:before{content:'\f3d6'}.zmdi-explicit:before{content:'\f3d7'}.zmdi-flight-land:before{content:'\f3d8'}.zmdi-flight-takeoff:before{content:'\f3d9'}.zmdi-flip-to-back:before{content:'\f3da'}.zmdi-flip-to-front:before{content:'\f3db'}.zmdi-group-work:before{content:'\f3dc'}.zmdi-hd:before{content:'\f3dd'}.zmdi-hq:before{content:'\f3de'}.zmdi-markunread-mailbox:before{content:'\f3df'}.zmdi-memory:before{content:'\f3e0'}.zmdi-nfc:before{content:'\f3e1'}.zmdi-play-for-work:before{content:'\f3e2'}.zmdi-power-input:before{content:'\f3e3'}.zmdi-present-to-all:before{content:'\f3e4'}.zmdi-satellite:before{content:'\f3e5'}.zmdi-tap-and-play:before{content:'\f3e6'}.zmdi-vibration:before{content:'\f3e7'}.zmdi-voicemail:before{content:'\f3e8'}.zmdi-import-export:before{content:'\f30c'}.zmdi-swap-vertical-:before{content:'\f30c'}.zmdi-airplanemode-inactive:before{content:'\f102'}.zmdi-airplanemode-active:before{content:'\f103'}.zmdi-rate-review:before{content:'\f103'}.zmdi-comment-sign:before{content:'\f25a'}.zmdi-network-warning:before{content:'\f2ad'}.zmdi-shopping-cart-add:before{content:'\f1ca'}.zmdi-file-add:before{content:'\f221'}.zmdi-network-wifi-scan:before{content:'\f2e4'}.zmdi-collection-add:before{content:'\f14e'}.zmdi-format-playlist-add:before{content:'\f3ac'}.zmdi-format-queue-music:before{content:'\f3ab'}.zmdi-plus-box:before{content:'\f277'}.zmdi-tag-backspace:before{content:'\f1d9'}.zmdi-alarm-add:before{content:'\f32b'}.zmdi-battery-charging:before{content:'\f114'}.zmdi-daydream-setting:before{content:'\f217'}.zmdi-more-horiz:before{content:'\f19c'}.zmdi-book-photo:before{content:'\f11b'}.zmdi-incandescent:before{content:'\f189'}.zmdi-wb-iridescent:before{content:'\f38c'}.zmdi-calendar-remove:before{content:'\f330'}.zmdi-refresh-sync-disabled:before{content:'\f1b7'}.zmdi-refresh-sync-problem:before{content:'\f1b6'}.zmdi-crop-original:before{content:'\f17e'}.zmdi-power-off:before{content:'\f1af'}.zmdi-power-off-setting:before{content:'\f1ae'}.zmdi-leak-remove:before{content:'\f38d'}.zmdi-star-border:before{content:'\f27c'}.zmdi-brightness-low:before{content:'\f36d'}.zmdi-brightness-medium:before{content:'\f36e'}.zmdi-brightness-high:before{content:'\f36f'}.zmdi-smartphone-portrait:before{content:'\f2d4'}.zmdi-live-tv:before{content:'\f2d9'}.zmdi-format-textdirection-l-to-r:before{content:'\f249'}.zmdi-format-textdirection-r-to-l:before{content:'\f24a'}.zmdi-arrow-back:before{content:'\f2ea'}.zmdi-arrow-forward:before{content:'\f2ee'}.zmdi-arrow-in:before{content:'\f2e9'}.zmdi-arrow-out:before{content:'\f2ed'}.zmdi-rotate-90-degrees-ccw:before{content:'\f304'}.zmdi-adb:before{content:'\f33a'}.zmdi-network-wifi:before{content:'\f2e8'}.zmdi-network-wifi-alt:before{content:'\f2e3'}.zmdi-network-wifi-lock:before{content:'\f2e5'}.zmdi-network-wifi-off:before{content:'\f2e6'}.zmdi-network-wifi-outline:before{content:'\f2e7'}.zmdi-network-wifi-info:before{content:'\f2e4'}.zmdi-layers-clear:before{content:'\f18b'}.zmdi-colorize:before{content:'\f15d'}.zmdi-format-paint:before{content:'\f1ba'}.zmdi-format-quote:before{content:'\f1b2'}.zmdi-camera-monochrome-photos:before{content:'\f285'}.zmdi-sort-by-alpha:before{content:'\f1cf'}.zmdi-folder-shared:before{content:'\f225'}.zmdi-folder-special:before{content:'\f226'}.zmdi-comment-dots:before{content:'\f260'}.zmdi-reorder:before{content:'\f31e'}.zmdi-dehaze:before{content:'\f197'}.zmdi-sort:before{content:'\f1ce'}.zmdi-pages:before{content:'\f34a'}.zmdi-calendar-account:before{content:'\f204'}.zmdi-paste:before{content:'\f109'}.zmdi-cut:before{content:'\f1bc'}.zmdi-save:before{content:'\f297'}.zmdi-smartphone-code:before{content:'\f139'}.zmdi-directions-bike:before{content:'\f117'}.zmdi-directions-boat:before{content:'\f11a'}.zmdi-directions-bus:before{content:'\f121'}.zmdi-directions-car:before{content:'\f125'}.zmdi-directions-railway:before{content:'\f1b3'}.zmdi-directions-run:before{content:'\f215'}.zmdi-directions-subway:before{content:'\f1d5'}.zmdi-directions-walk:before{content:'\f216'}.zmdi-local-hotel:before{content:'\f178'}.zmdi-local-activity:before{content:'\f1df'}.zmdi-local-play:before{content:'\f1df'}.zmdi-local-airport:before{content:'\f103'}.zmdi-local-atm:before{content:'\f198'}.zmdi-local-bar:before{content:'\f137'}.zmdi-local-cafe:before{content:'\f13b'}.zmdi-local-car-wash:before{content:'\f124'}.zmdi-local-convenience-store:before{content:'\f1d3'}.zmdi-local-dining:before{content:'\f153'}.zmdi-local-drink:before{content:'\f157'}.zmdi-local-florist:before{content:'\f168'}.zmdi-local-gas-station:before{content:'\f16f'}.zmdi-local-grocery-store:before{content:'\f1cb'}.zmdi-local-hospital:before{content:'\f177'}.zmdi-local-laundry-service:before{content:'\f1e9'}.zmdi-local-library:before{content:'\f18d'}.zmdi-local-mall:before{content:'\f195'}.zmdi-local-movies:before{content:'\f19d'}.zmdi-local-offer:before{content:'\f187'}.zmdi-local-parking:before{content:'\f1a5'}.zmdi-local-parking:before{content:'\f1a5'}.zmdi-local-pharmacy:before{content:'\f176'}.zmdi-local-phone:before{content:'\f2be'}.zmdi-local-pizza:before{content:'\f1ac'}.zmdi-local-post-office:before{content:'\f15a'}.zmdi-local-printshop:before{content:'\f1b0'}.zmdi-local-see:before{content:'\f28c'}.zmdi-local-shipping:before{content:'\f1e6'}.zmdi-local-store:before{content:'\f1d4'}.zmdi-local-taxi:before{content:'\f123'}.zmdi-local-wc:before{content:'\f211'}.zmdi-my-location:before{content:'\f299'}.zmdi-directions:before{content:'\f1e7'} -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/resources/public/vendor/css/re-com.css: -------------------------------------------------------------------------------- 1 | /*---------------------------------------------------------------------------------------- 2 | re-com.css 3 | 4 | This file is required for styling the re-com UI library components. 5 | To use the library, bootstrap.css is also required, which is best obtained from a CDN. 6 | So, place the following lines in the section of the html file: 7 | 8 | 9 | 10 | 11 | The following is required for constraining an application to the 12 | height of the browser window and setting some global defaults like font... 13 | ----------------------------------------------------------------------------------------*/ 14 | 15 | /* The following style addresses: http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox */ 16 | * { 17 | min-height: 0px; 18 | min-width: 0px; 19 | } 20 | 21 | html, body { 22 | font-family: Segoe UI, Roboto, sans-serif; 23 | font-size: 14px; 24 | font-weight: 400; 25 | color: rgba(68, 68, 68, 1.0); 26 | letter-spacing: 0.002em; 27 | height: 100%; 28 | margin: 0px; 29 | padding: 0px; 30 | } 31 | 32 | /*---------------------------------------------------------------------------------------- 33 | Bootstrap overrides after upgrading to 3.3.5 34 | ----------------------------------------------------------------------------------------*/ 35 | 36 | .popover, .tooltip { 37 | font-family: Segoe UI, Roboto, sans-serif; 38 | } 39 | 40 | .popover-title { 41 | font-weight: normal; 42 | } 43 | 44 | .form-control-feedback { 45 | pointer-events: initial; 46 | } 47 | 48 | 49 | /*---------------------------------------------------------------------------------------- 50 | The section immediately below is required for the drop-down components and comes from 51 | the bootstrap-chosen library: 52 | 53 | https://github.com/alxlit/bootstrap-chosen 54 | License: MIT. 55 | 56 | That library provides it's css as a .less file. 57 | To compile the less file into the css below, use the following steps from 58 | a command prompt (you'll need git and the lessc compiler (http://lesscss.org): 59 | 60 | git clone https://github.com/alxlit/bootstrap-chosen 61 | 62 | cd bootstrap-chosen 63 | 64 | git clone --depth=1 https://github.com/twbs/bootstrap 65 | 66 | Now edit bootstrap-chosen.less and add the following two lines before the first @import: 67 | @import "bootstrap/less/variables.less"; 68 | @import "bootstrap/less/mixins.less"; 69 | 70 | lessc bootstrap-chosen.less > bootstrap-chosen.css 71 | 72 | Finally, replace the section below with the contents of bootstrap-chosen.css. 73 | 74 | START OF BOOTSTRAP-CHOSEN SECTION... 75 | ----------------------------------------------------------------------------------------*/ 76 | 77 | .chosen-select { 78 | width: 100%; 79 | } 80 | .chosen-select-deselect { 81 | width: 100%; 82 | } 83 | .chosen-container { 84 | display: inline-block; 85 | font-size: 14px; 86 | position: relative; 87 | vertical-align: middle; 88 | } 89 | .chosen-container .chosen-drop { 90 | background: #ffffff; 91 | border: 1px solid #cccccc; 92 | border-bottom-right-radius: 4px; 93 | border-bottom-left-radius: 4px; 94 | -webkit-box-shadow: 0 8px 8px rgba(0, 0, 0, .25); 95 | box-shadow: 0 8px 8px rgba(0, 0, 0, .25); 96 | margin-top: -1px; 97 | position: absolute; 98 | top: 100%; 99 | left: -9000px; 100 | z-index: 1060; 101 | } 102 | .chosen-container.chosen-with-drop .chosen-drop { 103 | left: 0; 104 | right: 0; 105 | } 106 | .chosen-container .chosen-results { 107 | color: #555555; 108 | margin: 0 4px 4px 0; 109 | max-height: 240px; 110 | padding: 0 0 0 4px; 111 | position: relative; 112 | overflow-x: hidden; 113 | overflow-y: auto; 114 | -webkit-overflow-scrolling: touch; 115 | } 116 | .chosen-container .chosen-results li { 117 | display: none; 118 | line-height: 1.42857143; 119 | list-style: none; 120 | margin: 0; 121 | padding: 5px 6px; 122 | } 123 | .chosen-container .chosen-results li em { 124 | background: #feffde; 125 | font-style: normal; 126 | } 127 | .chosen-container .chosen-results li.group-result { 128 | display: list-item; 129 | cursor: default; 130 | color: #999; 131 | font-weight: bold; 132 | } 133 | .chosen-container .chosen-results li.group-option { 134 | padding-left: 15px; 135 | } 136 | .chosen-container .chosen-results li.active-result { 137 | cursor: pointer; 138 | display: list-item; 139 | } 140 | .chosen-container .chosen-results li.highlighted { 141 | background-color: #428bca; 142 | background-image: none; 143 | color: white; 144 | } 145 | .chosen-container .chosen-results li.highlighted em { 146 | background: transparent; 147 | } 148 | .chosen-container .chosen-results li.disabled-result { 149 | display: list-item; 150 | color: #777777; 151 | } 152 | .chosen-container .chosen-results .no-results { 153 | background: #eeeeee; 154 | display: list-item; 155 | } 156 | .chosen-container .chosen-results .error { 157 | text-align: center; 158 | background: #f2dede; 159 | display: list-item; 160 | } 161 | .chosen-container .chosen-results .loading { 162 | text-align: center; 163 | color: #ccc; 164 | display: list-item; 165 | } 166 | .chosen-container .chosen-results-scroll { 167 | background: white; 168 | margin: 0 4px; 169 | position: absolute; 170 | text-align: center; 171 | width: 321px; 172 | z-index: 1; 173 | } 174 | .chosen-container .chosen-results-scroll span { 175 | display: inline-block; 176 | height: 1.42857143; 177 | text-indent: -5000px; 178 | width: 9px; 179 | } 180 | .chosen-container .chosen-results-scroll-down { 181 | bottom: 0; 182 | } 183 | .chosen-container .chosen-results-scroll-down span { 184 | background: url("chosen-sprite.png") no-repeat -4px -3px; 185 | } 186 | .chosen-container .chosen-results-scroll-up span { 187 | background: url("chosen-sprite.png") no-repeat -22px -3px; 188 | } 189 | .chosen-container-single .chosen-single { 190 | background-color: #ffffff; 191 | -webkit-background-clip: padding-box; 192 | -moz-background-clip: padding; 193 | background-clip: padding-box; 194 | border: 1px solid #cccccc; 195 | border-top-right-radius: 4px; 196 | border-top-left-radius: 4px; 197 | border-bottom-right-radius: 4px; 198 | border-bottom-left-radius: 4px; 199 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 200 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 201 | color: #555555; 202 | display: block; 203 | height: 34px; 204 | overflow: hidden; 205 | line-height: 34px; 206 | padding: 0 0 0 8px; 207 | position: relative; 208 | text-decoration: none; 209 | white-space: nowrap; 210 | } 211 | .chosen-container-single .chosen-single span { 212 | display: block; 213 | margin-right: 26px; 214 | overflow: hidden; 215 | text-overflow: ellipsis; 216 | white-space: nowrap; 217 | } 218 | .chosen-container-single .chosen-single abbr { 219 | background: url("chosen-sprite.png") right top no-repeat; 220 | display: block; 221 | font-size: 1px; 222 | height: 10px; 223 | position: absolute; 224 | right: 26px; 225 | top: 12px; 226 | width: 12px; 227 | } 228 | .chosen-container-single .chosen-single abbr:hover { 229 | background-position: right -11px; 230 | } 231 | .chosen-container-single .chosen-single.chosen-disabled .chosen-single abbr:hover { 232 | background-position: right 2px; 233 | } 234 | .chosen-container-single .chosen-single div { 235 | display: block; 236 | height: 100%; 237 | position: absolute; 238 | top: 0; 239 | right: 0; 240 | width: 18px; 241 | } 242 | .chosen-container-single .chosen-single div b { 243 | background: url("chosen-sprite.png") no-repeat 0 7px; 244 | display: block; 245 | height: 100%; 246 | width: 100%; 247 | } 248 | .chosen-container-single .chosen-default { 249 | color: #777777; 250 | } 251 | .chosen-container-single .chosen-search { 252 | margin: 0; 253 | padding: 3px 4px; 254 | position: relative; 255 | white-space: nowrap; 256 | z-index: 1000; 257 | } 258 | .chosen-container-single .chosen-search input[type="text"] { 259 | background: url("chosen-sprite.png") no-repeat 100% -20px, #ffffff; 260 | border: 1px solid #cccccc; 261 | border-top-right-radius: 4px; 262 | border-top-left-radius: 4px; 263 | border-bottom-right-radius: 4px; 264 | border-bottom-left-radius: 4px; 265 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 266 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 267 | margin: 1px 0; 268 | padding: 4px 20px 4px 4px; 269 | width: 100%; 270 | } 271 | .chosen-container-single .chosen-drop { 272 | margin-top: -1px; 273 | border-bottom-right-radius: 4px; 274 | border-bottom-left-radius: 4px; 275 | -webkit-background-clip: padding-box; 276 | -moz-background-clip: padding; 277 | background-clip: padding-box; 278 | } 279 | .chosen-container-single-nosearch .chosen-search input { 280 | position: absolute; 281 | left: -9000px; 282 | } 283 | .chosen-container-multi .chosen-choices { 284 | background-color: #ffffff; 285 | border: 1px solid #cccccc; 286 | border-top-right-radius: 4px; 287 | border-top-left-radius: 4px; 288 | border-bottom-right-radius: 4px; 289 | border-bottom-left-radius: 4px; 290 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 291 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 292 | cursor: text; 293 | height: auto !important; 294 | height: 1%; 295 | margin: 0; 296 | overflow: hidden; 297 | padding: 0; 298 | position: relative; 299 | } 300 | .chosen-container-multi .chosen-choices li { 301 | float: left; 302 | list-style: none; 303 | } 304 | .chosen-container-multi .chosen-choices .search-field { 305 | margin: 0; 306 | padding: 0; 307 | white-space: nowrap; 308 | } 309 | .chosen-container-multi .chosen-choices .search-field input[type="text"] { 310 | background: transparent !important; 311 | border: 0 !important; 312 | -webkit-box-shadow: none; 313 | box-shadow: none; 314 | color: #555555; 315 | height: 32px; 316 | margin: 0; 317 | padding: 4px; 318 | outline: 0; 319 | } 320 | .chosen-container-multi .chosen-choices .search-field .default { 321 | color: #999; 322 | } 323 | .chosen-container-multi .chosen-choices .search-choice { 324 | -webkit-background-clip: padding-box; 325 | -moz-background-clip: padding; 326 | background-clip: padding-box; 327 | background-color: #eeeeee; 328 | border: 1px solid #cccccc; 329 | border-top-right-radius: 4px; 330 | border-top-left-radius: 4px; 331 | border-bottom-right-radius: 4px; 332 | border-bottom-left-radius: 4px; 333 | background-image: -webkit-linear-gradient(top, #ffffff 0%, #eeeeee 100%); 334 | background-image: -o-linear-gradient(top, #ffffff 0%, #eeeeee 100%); 335 | background-image: linear-gradient(to bottom, #ffffff 0%, #eeeeee 100%); 336 | background-repeat: repeat-x; 337 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeeeeee', GradientType=0); 338 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 339 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 340 | color: #333333; 341 | cursor: default; 342 | line-height: 13px; 343 | margin: 6px 0 3px 5px; 344 | padding: 3px 20px 3px 5px; 345 | position: relative; 346 | } 347 | .chosen-container-multi .chosen-choices .search-choice .search-choice-close { 348 | background: url("chosen-sprite.png") right top no-repeat; 349 | display: block; 350 | font-size: 1px; 351 | height: 10px; 352 | position: absolute; 353 | right: 4px; 354 | top: 5px; 355 | width: 12px; 356 | cursor: pointer; 357 | } 358 | .chosen-container-multi .chosen-choices .search-choice .search-choice-close:hover { 359 | background-position: right -11px; 360 | } 361 | .chosen-container-multi .chosen-choices .search-choice-focus { 362 | background: #d4d4d4; 363 | } 364 | .chosen-container-multi .chosen-choices .search-choice-focus .search-choice-close { 365 | background-position: right -11px; 366 | } 367 | .chosen-container-multi .chosen-results { 368 | margin: 0 0 0 0; 369 | padding: 0; 370 | } 371 | .chosen-container-multi .chosen-drop .result-selected { 372 | display: none; 373 | } 374 | .chosen-container-active .chosen-single { 375 | border: 1px solid #66afe9; 376 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6); 377 | box-shadow: 0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6); 378 | -webkit-transition: border linear .2s, box-shadow linear .2s; 379 | -o-transition: border linear .2s, box-shadow linear .2s; 380 | transition: border linear .2s, box-shadow linear .2s; 381 | } 382 | .chosen-container-active.chosen-with-drop .chosen-single { 383 | background-color: #ffffff; 384 | border: 1px solid #66afe9; 385 | border-bottom-right-radius: 0; 386 | border-bottom-left-radius: 0; 387 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6); 388 | box-shadow: 0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6); 389 | -webkit-transition: border linear .2s, box-shadow linear .2s; 390 | -o-transition: border linear .2s, box-shadow linear .2s; 391 | transition: border linear .2s, box-shadow linear .2s; 392 | } 393 | .chosen-container-active.chosen-with-drop .chosen-single div { 394 | background: transparent; 395 | border-left: none; 396 | } 397 | .chosen-container-active.chosen-with-drop .chosen-single div b { 398 | background-position: -18px 7px; 399 | } 400 | .chosen-container-active .chosen-choices { 401 | border: 1px solid #66afe9; 402 | border-bottom-right-radius: 0; 403 | border-bottom-left-radius: 0; 404 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6); 405 | box-shadow: 0 1px 1px rgba(0, 0, 0, .075) inset, 0 0 8px rgba(82, 168, 236, .6); 406 | -webkit-transition: border linear .2s, box-shadow linear .2s; 407 | -o-transition: border linear .2s, box-shadow linear .2s; 408 | transition: border linear .2s, box-shadow linear .2s; 409 | } 410 | .chosen-container-active .chosen-choices .search-field input[type="text"] { 411 | color: #111 !important; 412 | } 413 | .chosen-container-active.chosen-with-drop .chosen-choices { 414 | border-bottom-right-radius: 0; 415 | border-bottom-left-radius: 0; 416 | } 417 | .chosen-disabled { 418 | cursor: default; 419 | opacity: 0.5 !important; 420 | } 421 | .chosen-disabled .chosen-single { 422 | cursor: default; 423 | } 424 | .chosen-disabled .chosen-choices .search-choice .search-choice-close { 425 | cursor: default; 426 | } 427 | .chosen-rtl { 428 | text-align: right; 429 | } 430 | .chosen-rtl .chosen-single { 431 | padding: 0 8px 0 0; 432 | overflow: visible; 433 | } 434 | .chosen-rtl .chosen-single span { 435 | margin-left: 26px; 436 | margin-right: 0; 437 | direction: rtl; 438 | } 439 | .chosen-rtl .chosen-single div { 440 | left: 7px; 441 | right: auto; 442 | } 443 | .chosen-rtl .chosen-single abbr { 444 | left: 26px; 445 | right: auto; 446 | } 447 | .chosen-rtl .chosen-choices .search-field input[type="text"] { 448 | direction: rtl; 449 | } 450 | .chosen-rtl .chosen-choices li { 451 | float: right; 452 | } 453 | .chosen-rtl .chosen-choices .search-choice { 454 | margin: 6px 5px 3px 0; 455 | padding: 3px 5px 3px 19px; 456 | } 457 | .chosen-rtl .chosen-choices .search-choice .search-choice-close { 458 | background-position: right top; 459 | left: 4px; 460 | right: auto; 461 | } 462 | .chosen-rtl.chosen-container-single .chosen-results { 463 | margin: 0 0 4px 4px; 464 | padding: 0 4px 0 0; 465 | } 466 | .chosen-rtl .chosen-results .group-option { 467 | padding-left: 0; 468 | padding-right: 15px; 469 | } 470 | .chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { 471 | border-right: none; 472 | } 473 | .chosen-rtl .chosen-search input[type="text"] { 474 | background: url("chosen-sprite.png") no-repeat -28px -20px, #ffffff; 475 | direction: rtl; 476 | padding: 4px 5px 4px 20px; 477 | } 478 | @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) { 479 | .chosen-rtl .chosen-search input[type="text"], 480 | .chosen-container-single .chosen-single abbr, 481 | .chosen-container-single .chosen-single div b, 482 | .chosen-container-single .chosen-search input[type="text"], 483 | .chosen-container-multi .chosen-choices .search-choice .search-choice-close, 484 | .chosen-container .chosen-results-scroll-down span, 485 | .chosen-container .chosen-results-scroll-up span { 486 | background-image: url("chosen-sprite@2x.png") !important; 487 | background-size: 52px 37px !important; 488 | background-repeat: no-repeat !important; 489 | } 490 | } 491 | 492 | /*---------------------------------------------------------------------------------------- 493 | ...END OF BOOTSTRAP-CHOSEN SECTION 494 | 495 | bootstrap-chosen additions 496 | ----------------------------------------------------------------------------------------*/ 497 | 498 | /* Mouse hover color in drop-downs */ 499 | .chosen-container .chosen-results li.mouseover { 500 | background-color: #eeeeee; 501 | background-image: none; 502 | } 503 | 504 | /*---------------------------------------------------------------------------------------- 505 | Stylesheet for re-com.date Date Picker variants inline-picker & dropdown-picker 506 | Day8 variation loosely based on: 507 | Copyright 2013 Dan Grossman ( http://www.dangrossman.info ) 508 | Licensed under the Apache License v2.0 509 | http://www.apache.org/licenses/LICENSE-2.0 510 | Built for http://www.improvely.com 511 | http://eternicode.github.io/bootstrap-datepicker 512 | 513 | START OF DATE PICKER SECTION... 514 | ----------------------------------------------------------------------------------------*/ 515 | 516 | .datepicker.single .calendar { 517 | float: none; 518 | } 519 | 520 | .datepicker .calendar { 521 | display: none; 522 | max-width: 200px; 523 | } 524 | 525 | .datepicker .calendar.single .calendar-date { 526 | border: none; 527 | } 528 | 529 | .datepicker .calendar th, .datepicker .calendar td { 530 | white-space: nowrap; 531 | text-align: center; 532 | min-width: 32px; 533 | } 534 | 535 | .datepicker .calendar-date { 536 | border: 1px solid #ddd; 537 | padding: 4px; 538 | border-radius: 4px; 539 | background: #fff; 540 | } 541 | 542 | .datepicker .calendar-time { 543 | text-align: center; 544 | margin: 8px auto 0 auto; 545 | line-height: 30px; 546 | } 547 | 548 | .datepicker { 549 | position: absolute; 550 | background: #fff; 551 | top: 100px; 552 | left: 20px; 553 | padding: 10px 10px 5px; 554 | margin-top: 1px; 555 | -webkit-border-radius: 4px; 556 | -moz-border-radius: 4px; 557 | line-height: 16px; 558 | border-radius: 4px; 559 | } 560 | 561 | .datepicker table { 562 | width: 100%; 563 | margin: 0; 564 | border-collapse: separate; 565 | } 566 | 567 | .datepicker td, .datepicker th { 568 | text-align: center; 569 | width: 27px; 570 | height: 26px; 571 | max-width: 27px; 572 | max-height: 26px; 573 | min-width: 27px; 574 | min-height: 26px; 575 | -webkit-border-radius: 4px; 576 | -moz-border-radius: 4px; 577 | border-radius: 4px; 578 | padding: 4px; 579 | cursor: default; 580 | white-space: nowrap; 581 | font-weight: normal; 582 | } 583 | 584 | .datepicker td.off { 585 | padding: 4px; 586 | color: #999; 587 | } 588 | 589 | .datepicker td.disabled { 590 | color: #999; 591 | } 592 | 593 | .datepicker th.disabled { 594 | color: #999; 595 | } 596 | 597 | .datepicker td.available:hover, .datepicker th.available:hover { 598 | background: #eee; 599 | cursor: pointer; 600 | } 601 | 602 | .datepicker td.in-range { 603 | background: #ebf4f8; 604 | -webkit-border-radius: 0; 605 | -moz-border-radius: 0; 606 | border-radius: 0; 607 | } 608 | 609 | .datepicker td.start-date { 610 | -webkit-border-radius: 4px 0 0 4px; 611 | -moz-border-radius: 4px 0 0 4px; 612 | border-radius: 4px 0 0 4px; 613 | } 614 | 615 | .datepicker td.end-date { 616 | -webkit-border-radius: 0 4px 4px 0; 617 | -moz-border-radius: 0 4px 4px 0; 618 | border-radius: 0 4px 4px 0; 619 | } 620 | 621 | .datepicker td.start-date.end-date { 622 | -webkit-border-radius: 4px; 623 | -moz-border-radius: 4px; 624 | border-radius: 4px; 625 | } 626 | 627 | .datepicker td.active, .datepicker td.active:hover { 628 | background-color: #357ebd; 629 | border-color: #3071a9; 630 | color: #fff; 631 | } 632 | 633 | /* Introduced by Day8 from http://eternicode.github.io/bootstrap-datepicker */ 634 | .datepicker td.today, .datepicker td.today:hover { 635 | background-color: #ffcd70; 636 | border-color: #f59e00; 637 | border-radius: 18px; 638 | color: #fff; 639 | } 640 | 641 | .datepicker th.day-enabled, label.day-enabled { 642 | font-weight: normal; 643 | font-size: 10px; 644 | color: #333; 645 | } 646 | 647 | .datepicker th.selectable { 648 | font-weight: normal; 649 | color: #357ebd; 650 | } 651 | 652 | .datepicker th.day-disabled { 653 | font-weight: normal; 654 | font-size: 10px; 655 | color: #999; 656 | } 657 | 658 | .datepicker td.week, .datepicker th.week { 659 | font-size: 80%; 660 | color: #ccc; 661 | } 662 | 663 | 664 | .datepicker th.prev { 665 | border: 1px solid #ccc; 666 | border-right-style: none; 667 | border-top-right-radius: 0; 668 | border-bottom-right-radius: 0; 669 | background-color: #F7F7F7; 670 | } 671 | 672 | .datepicker th.next { 673 | border: 1px solid #ccc; 674 | border-left-style: none; 675 | border-top-left-radius: 0; 676 | border-bottom-left-radius: 0; 677 | background-color: #F7F7F7; 678 | } 679 | 680 | .datepicker th.month { 681 | width: auto; 682 | font-size: 14px; 683 | color: #777; 684 | border-radius: 0; 685 | border: 1px solid #CCC; 686 | border-right-style: none; 687 | border-left-style: none; 688 | background-color: #F7F7F7; 689 | } 690 | 691 | .dropdown-button { 692 | cursor: pointer; 693 | height: 32px; 694 | font-size: 13px; 695 | font-weight: normal; 696 | } 697 | 698 | .dropdown-button.activator { 699 | width: 40px; 700 | color: #777; 701 | background-color: #F7F7F7 702 | } 703 | 704 | /*---------------------------------------------------------------------------------------- 705 | END OF DATE PICKER SECTION... 706 | 707 | 708 | CSS THROBBER 709 | ----------------------------------------------------------------------------------------*/ 710 | @keyframes blink { 711 | 0% { 712 | transform: scale(1); 713 | opacity: 1; 714 | } 715 | 100% { 716 | transform: scale(.5); 717 | opacity: 0; 718 | } 719 | } 720 | @-moz-keyframes blink { 721 | 0% { 722 | -moz-transform: scale(1); 723 | opacity: 1; 724 | } 725 | 100% { 726 | -moz-transform: scale(.5); 727 | opacity: 0; 728 | } 729 | } 730 | @-webkit-keyframes blink { 731 | 0% { 732 | -webkit-transform: scale(1); 733 | opacity: 1; 734 | } 735 | 100% { 736 | -webkit-transform: scale(.5); 737 | opacity: 0; 738 | } 739 | } 740 | 741 | .loader { 742 | position: relative; 743 | display: inline-block; 744 | vertical-align: middle; 745 | width: 20px; 746 | height: 20px; 747 | margin: 20px; 748 | padding: 0px; 749 | } 750 | 751 | .loader li { 752 | position: absolute; 753 | display: block; 754 | border-radius: 4px; 755 | background-color: #999; 756 | width: 6px; 757 | height: 6px; 758 | margin-top: -3px; 759 | margin-left: -3px; 760 | opacity: 0; 761 | -webkit-animation: blink .8s ease infinite; 762 | -moz-animation: blink .8s ease infinite; 763 | animation: blink .8s ease infinite; 764 | } 765 | 766 | .loader li:nth-child(1) { 767 | top: 0%; 768 | left: 50%; 769 | -webkit-animation-delay: -.7s; 770 | -moz-animation-delay: -.7s; 771 | animation-delay: -.7s; 772 | } 773 | 774 | .loader li:nth-child(2) { 775 | top: 15%; 776 | left: 85%; 777 | -webkit-animation-delay: -.6s; 778 | -moz-animation-delay: -.6s; 779 | animation-delay: -.6s; 780 | } 781 | 782 | .loader li:nth-child(3) { 783 | top: 50%; 784 | left: 100%; 785 | -webkit-animation-delay: -.5s; 786 | -moz-animation-delay: -.5s; 787 | animation-delay: -.5s; 788 | } 789 | 790 | .loader li:nth-child(4) { 791 | top: 85%; 792 | left: 85%; 793 | -webkit-animation-delay: -.4s; 794 | -moz-animation-delay: -.4s; 795 | animation-delay: -.4s; 796 | } 797 | 798 | .loader li:nth-child(5) { 799 | top: 100%; 800 | left: 50%; 801 | -webkit-animation-delay: -.3s; 802 | -moz-animation-delay: -.3s; 803 | animation-delay: -.3s; 804 | } 805 | 806 | .loader li:nth-child(6) { 807 | top: 85%; 808 | left: 15%; 809 | -webkit-animation-delay: -.2s; 810 | -moz-animation-delay: -.2s; 811 | animation-delay: -.2s; 812 | } 813 | 814 | .loader li:nth-child(7) { 815 | top: 50%; 816 | left: 0%; 817 | -webkit-animation-delay: -.1s; 818 | -moz-animation-delay: -.1s; 819 | animation-delay: -.1s; 820 | 821 | } 822 | 823 | .loader li:nth-child(8) { 824 | top: 15%; 825 | left: 15%; 826 | } 827 | 828 | .loader.smaller { 829 | width: 9px; 830 | height: 10px; 831 | margin: 7px; 832 | } 833 | 834 | .loader.smaller li { 835 | width: 4px; 836 | height: 4px; 837 | margin-top: -2px; 838 | margin-left: -2px; 839 | } 840 | 841 | .loader.small { 842 | width: 12px; 843 | height: 12px; 844 | margin: 10px; 845 | } 846 | 847 | .loader.small li { 848 | width: 4px; 849 | height: 4px; 850 | margin-top: -2px; 851 | margin-left: -2px; 852 | } 853 | 854 | .loader.large { 855 | width: 48px; 856 | height: 48px; 857 | margin: 20px; 858 | } 859 | 860 | .loader.large li { 861 | border-radius: 14px; 862 | width: 14px; 863 | height: 14px; 864 | margin-top: -7px; 865 | margin-left: -7px; 866 | } 867 | 868 | /*---------------------------------------------------------------------------------------- 869 | END OF CSS THROBBER SECTION... 870 | 871 | 872 | Bootstrap list-group-item variation (only used in selection-list component) 873 | ----------------------------------------------------------------------------------------*/ 874 | /* TODO: re-demo CSS */ 875 | .compact { 876 | margin: 0; 877 | height: 19px; 878 | white-space: nowrap; 879 | border: none; 880 | padding: 0; 881 | overflow: hidden; 882 | cursor: default; 883 | font-size: small; 884 | text-overflow: ellipsis; 885 | } 886 | /* TODO: re-demo CSS */ 887 | .list-group-item:hover { 888 | background-color: #eeeeee; 889 | } 890 | 891 | /*---------------------------------------------------------------------------------------- 892 | Custom scrollbars 893 | - http://css-tricks.com/custom-scrollbars-in-webkit 894 | - http://codemug.com/html/custom-scrollbars-using-css 895 | ----------------------------------------------------------------------------------------*/ 896 | 897 | ::-webkit-scrollbar { 898 | width: 10px; 899 | border-radius: 5px; 900 | background-color: rgba(0,0,0,0.05); 901 | } 902 | ::-webkit-scrollbar:horizontal { 903 | height:10px; 904 | } 905 | ::-webkit-scrollbar:hover { 906 | background-color:rgba(0,0,0,0.20); 907 | } 908 | ::-webkit-scrollbar-thumb:horizontal, ::-webkit-scrollbar-thumb:vertical { 909 | background:rgba(0,0,0,0.25); 910 | border-radius: 5px; 911 | } 912 | ::-webkit-scrollbar-thumb:horizontal:active, ::-webkit-scrollbar-thumb:vertical:active { 913 | background:rgba(0,0,0,0.45); 914 | } 915 | 916 | /* Color of selected text*/ 917 | /* 918 | ::-moz-selection { color: gold; background: red; } 919 | ::selection { color: gold; background: red; } 920 | */ 921 | 922 | 923 | /*---------------------------------------------------------------------------------------- 924 | Override bootstrap input text placeholder color (it's too dark) 925 | ----------------------------------------------------------------------------------------*/ 926 | 927 | .form-control::-webkit-input-placeholder { 928 | color: #bbb; 929 | } 930 | 931 | /*---------------------------------------------------------------------------------------- 932 | Override bootstrap warning color (from horrible brown/orange to orange) 933 | ----------------------------------------------------------------------------------------*/ 934 | 935 | .has-warning .form-control { 936 | border-color: #f57c00; 937 | } 938 | 939 | .has-warning .form-control:focus { 940 | border-color: #f57c00; 941 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px rgba(245, 124, 0, 0.6); 942 | } 943 | 944 | /* TODO: REMOVE */ 945 | .has-warning .form-control-feedback { 946 | color: #f57c00; 947 | } 948 | 949 | .rc-input-text .zmdi-alert-triangle { 950 | color: #f57c00; 951 | } 952 | 953 | .has-error .form-control { 954 | border-color: #d50000; 955 | } 956 | 957 | .has-error .form-control:focus { 958 | border-color: #d50000; 959 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px rgba(213, 0, 0, 0.6); 960 | } 961 | 962 | /* TODO: REMOVE */ 963 | .has-error .form-control-feedback { 964 | color: #d50000; 965 | } 966 | 967 | /* Override bootstrap green validation */ 968 | 969 | .has-success .form-control { 970 | border-color: #13C200; 971 | } 972 | 973 | .has-success .form-control:focus { 974 | border-color: #13C200; 975 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px rgba(19, 194, 0, 0.6); 976 | } 977 | 978 | .rc-input-text .zmdi-alert-circle { 979 | color: #d50000; 980 | } 981 | 982 | .rc-input-text .zmdi-check-circle { 983 | color: #13C200; 984 | } 985 | 986 | .alert-warning { 987 | color: #ea6b00; 988 | background-color: #ffecdc; 989 | border-color: #faebcc; 990 | } 991 | 992 | code { 993 | margin-right: 0.2em; 994 | border-radius: 4px; 995 | color: #333; 996 | background: #eee; 997 | border: 1px solid #ddd; 998 | padding: 0.1em 0.3em; 999 | } 1000 | 1001 | 1002 | /*---------------------------------------------------------------------------------------- 1003 | Time component 1004 | ----------------------------------------------------------------------------------------*/ 1005 | 1006 | .time-entry { 1007 | flex: none; 1008 | padding-left: 0.3em; 1009 | padding-top: 2px; 1010 | border: 1px solid #ccc; 1011 | border-radius: 4px 0 0 4px; 1012 | width: 3.3em; 1013 | } 1014 | .time-entry:last-child { 1015 | border-radius: 4px; 1016 | } 1017 | .time-icon { 1018 | display: flex; 1019 | padding: 0 0.3em; 1020 | border: 1px solid #ccc; 1021 | border-left: none; 1022 | border-radius: 0 4px 4px 0; 1023 | background-color: #ddd; 1024 | } 1025 | 1026 | /*---------------------------------------------------------------------------------------- 1027 | md-circle-icon-button 1028 | ----------------------------------------------------------------------------------------*/ 1029 | 1030 | .rc-md-circle-icon-button { 1031 | width: 40px; /* material design dimensions */ 1032 | height: 40px; 1033 | text-align: center; /* to horizontally center the icon */ 1034 | border: 1px solid lightgrey; 1035 | border-radius: 50%; 1036 | background-color: inherit; 1037 | opacity: 0.9; 1038 | } 1039 | 1040 | .rc-md-circle-icon-button > i { 1041 | font-size : 24px; 1042 | line-height: 40px; /* to vertically center in surrounding :div */ 1043 | color: inherit; 1044 | } 1045 | 1046 | .rc-md-circle-icon-button:hover { 1047 | border: 1px solid #428bca; 1048 | color: #428bca; 1049 | } 1050 | 1051 | .rc-circle-smaller { 1052 | width: 26px; 1053 | height: 26px; 1054 | } 1055 | 1056 | .rc-circle-smaller > i { 1057 | font-size: 16px; 1058 | line-height: 24px; 1059 | } 1060 | 1061 | .rc-circle-larger { 1062 | width: 56px; 1063 | height: 56px; 1064 | } 1065 | 1066 | .rc-circle-larger > i { 1067 | font-size: 24px; 1068 | line-height: 56px; 1069 | } 1070 | 1071 | .rc-circle-emphasis { 1072 | border: 1px solid #428bca; 1073 | background-color: #428bca; 1074 | color: white; 1075 | } 1076 | 1077 | .rc-circle-emphasis:hover { 1078 | border: 1px solid #2196f3; 1079 | background-color: #2196f3; 1080 | color: white; 1081 | } 1082 | 1083 | .rc-circle-disabled { 1084 | border: none; 1085 | } 1086 | 1087 | .rc-circle-disabled:hover { 1088 | border: none; 1089 | } 1090 | 1091 | .rc-circle-disabled > i { 1092 | color: lightgrey; 1093 | } 1094 | 1095 | /*---------------------------------------------------------------------------------------- 1096 | md-icon-button 1097 | ----------------------------------------------------------------------------------------*/ 1098 | 1099 | .rc-md-icon-button { 1100 | height: 24px; 1101 | font-size: 24px; 1102 | line-height: 24px; 1103 | text-align: center; /* to horizontally center the icon */ 1104 | background-color: inherit; 1105 | border-radius: 3px; 1106 | } 1107 | 1108 | .rc-md-icon-button > i { 1109 | color: inherit; 1110 | } 1111 | 1112 | .rc-md-icon-button:hover { 1113 | color: #2196f3; 1114 | } 1115 | 1116 | .rc-icon-smaller { 1117 | height: 16px; 1118 | font-size: 16px; 1119 | line-height: 16px; 1120 | } 1121 | 1122 | .rc-icon-larger { 1123 | height: 32px; 1124 | font-size: 32px; 1125 | line-height: 32px; 1126 | } 1127 | 1128 | .rc-icon-emphasis { 1129 | background-color: #428bca; 1130 | color: white; 1131 | } 1132 | 1133 | .rc-icon-emphasis:hover { 1134 | background-color: #2196f3; 1135 | color: white; 1136 | } 1137 | 1138 | .rc-icon-disabled > i { 1139 | color: lightgrey; 1140 | } 1141 | 1142 | /*---------------------------------------------------------------------------------------- 1143 | info-button 1144 | 1145 | CSS styles below are taken from https://github.com/oakmac/cljs.info... 1146 | 1147 | The MIT License (MIT) 1148 | Copyright (c) 2014 Chris Oakman and contributors 1149 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), 1150 | to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 1151 | and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 1152 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 1153 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1154 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1155 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 1156 | IN THE SOFTWARE. 1157 | ----------------------------------------------------------------------------------------*/ 1158 | 1159 | .rc-info-button { 1160 | padding-left: 3px; 1161 | padding-right: 3px; 1162 | fill: #bdbdbd; 1163 | } 1164 | 1165 | .rc-info-button:hover { 1166 | fill: #2962ff; 1167 | } 1168 | 1169 | .popover-content .info-heading { 1170 | font-size: 22px; 1171 | } 1172 | 1173 | .popover-content .info-subheading { 1174 | font-size: 18px; 1175 | margin-top: 8px; 1176 | } 1177 | 1178 | .popover-content .info-bold { 1179 | background-color: #555; 1180 | padding-left: 3px; 1181 | padding-right: 3px; 1182 | border-radius: 3px; 1183 | font-weight: bold; 1184 | } 1185 | 1186 | .popover-content a { 1187 | color: #ccf; 1188 | } 1189 | 1190 | .popover-content code { 1191 | color: white; 1192 | background-color: #555; 1193 | border: none; 1194 | } 1195 | 1196 | /*---------------------------------------------------------------------------------------- 1197 | row-button 1198 | ----------------------------------------------------------------------------------------*/ 1199 | 1200 | .rc-row-button { 1201 | text-align: center; /* to horizontally center the icon */ 1202 | color: #2167f2; /2196f3; 1203 | background-color: inherit; 1204 | opacity: 0; 1205 | cursor: pointer; 1206 | } 1207 | 1208 | .rc-row-button > i { 1209 | color: inherit; 1210 | } 1211 | 1212 | .rc-row-mouse-over-row { 1213 | opacity: 0.4; 1214 | } 1215 | 1216 | .rc-row-button:hover, rc-row-mouse-over-row:hover { 1217 | opacity: 1; 1218 | } 1219 | 1220 | .rc-row-disabled { 1221 | opacity: 1; 1222 | color: lightgrey; 1223 | cursor: default; 1224 | } 1225 | 1226 | /*---------------------------------------------------------------------------------------- 1227 | div-table 1228 | ----------------------------------------------------------------------------------------*/ 1229 | 1230 | .rc-div-table { 1231 | flex: none; 1232 | width: auto; 1233 | border: 2px solid lightgrey; 1234 | cursor: default; 1235 | } 1236 | 1237 | .rc-div-table-header > div { 1238 | background-color: #e8e8e8; 1239 | font-weight: bold; 1240 | padding: 5px; 1241 | } 1242 | 1243 | .rc-div-table-row { 1244 | border-top: 1px solid lightgrey; 1245 | } 1246 | 1247 | .rc-div-table-row:hover { 1248 | background-color: #f2f2f2; 1249 | } 1250 | 1251 | .rc-div-table-row > div { 1252 | padding: 5px; 1253 | } 1254 | 1255 | /*---------------------------------------------------------------------------------------- 1256 | General Typography 1257 | ----------------------------------------------------------------------------------------*/ 1258 | 1259 | .semibold { 1260 | font-weight: 500; 1261 | } 1262 | .bold { 1263 | font-weight: 700; 1264 | } 1265 | .italic { 1266 | font-style: italic; 1267 | } 1268 | .uppercase { 1269 | text-transform: uppercase; 1270 | } 1271 | .all-small-caps { 1272 | font-variant: small-caps; 1273 | } 1274 | 1275 | .level1 { 1276 | font-family: Roboto, sans-serif; 1277 | font-weight: 200; 1278 | font-size: 40px; 1279 | color: rgba(68, 68, 68, 1.0); 1280 | letter-spacing: normal; 1281 | /*-ms-font-feature-settings: 'ss20' 1;*/ 1282 | } 1283 | .level2 { 1284 | font-family: Roboto, sans-serif; 1285 | font-weight: 200; 1286 | font-size: 26px; 1287 | color: rgba(0, 0, 0, 1.0); 1288 | letter-spacing: 0.001em; 1289 | } 1290 | .level3 { 1291 | font-family: Roboto, sans-serif; 1292 | font-weight: 500; 1293 | font-size: 15px; 1294 | color: rgba(68, 68, 68, 1.0); 1295 | letter-spacing: 0.002em; 1296 | } 1297 | .level4 { 1298 | font-family: Roboto, sans-serif; 1299 | font-weight: 500; 1300 | font-size: 15px; 1301 | color: rgba(68, 68, 68, 0.6); 1302 | letter-spacing: 0.002em; 1303 | } 1304 | .field-label { 1305 | font-family: Roboto, sans-serif; 1306 | font-weight: 400; 1307 | font-size: 14px; 1308 | color: rgba(68, 68, 68, 0.6); 1309 | letter-spacing: 0.002em; 1310 | font-variant: small-caps; 1311 | flex: none; 1312 | } 1313 | 1314 | .noselect { 1315 | -webkit-user-select: none; 1316 | -moz-user-select: none; 1317 | -ms-user-select: none; 1318 | user-select: none; 1319 | } 1320 | /*---------------------------------------------------------------------------------------- 1321 | Flexbox "display" styles 1322 | Requires 2 display values which we can't represent in a Clojure map 1323 | ----------------------------------------------------------------------------------------*/ 1324 | 1325 | .display-flex { 1326 | display: -webkit-flex; 1327 | display: flex; 1328 | } 1329 | .display-inline-flex { 1330 | display: -webkit-inline-flex; 1331 | display: inline-flex; 1332 | } 1333 | 1334 | .zmdi-hc-fw-rc { 1335 | width: 1em; 1336 | text-align: center; 1337 | } 1338 | 1339 | .rc-typeahead-suggestions-container { 1340 | position: absolute; 1341 | width: 100%; 1342 | background-color: #eee; 1343 | } 1344 | 1345 | .rc-typeahead-suggestion { 1346 | background-color: #eee; 1347 | padding: 0.4em; 1348 | } 1349 | 1350 | .rc-typeahead-suggestion.active { 1351 | background-color: #ddd; 1352 | } 1353 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/resources/public/vendor/fonts/Material-Design-Iconic-Font.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/day8/re-frame-template/3d4358f14bc2e85b22ba6bafaddfb9561b204d15/resources/leiningen/new/re_frame/resources/public/vendor/fonts/Material-Design-Iconic-Font.eot -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/resources/public/vendor/fonts/Material-Design-Iconic-Font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/day8/re-frame-template/3d4358f14bc2e85b22ba6bafaddfb9561b204d15/resources/leiningen/new/re_frame/resources/public/vendor/fonts/Material-Design-Iconic-Font.ttf -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/resources/public/vendor/fonts/Material-Design-Iconic-Font.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/day8/re-frame-template/3d4358f14bc2e85b22ba6bafaddfb9561b204d15/resources/leiningen/new/re_frame/resources/public/vendor/fonts/Material-Design-Iconic-Font.woff -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/resources/public/vendor/fonts/Material-Design-Iconic-Font.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/day8/re-frame-template/3d4358f14bc2e85b22ba6bafaddfb9561b204d15/resources/leiningen/new/re_frame/resources/public/vendor/fonts/Material-Design-Iconic-Font.woff2 -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/shadow-cljs.edn: -------------------------------------------------------------------------------- 1 | {:nrepl {:port 8777} 2 | 3 | {{#cider?}}:jvm-opts ["-Xmx1G"]{{/cider?}} 4 | 5 | :source-paths ["src" "test"] 6 | 7 | :dependencies 8 | [[reagent "1.1.1"] 9 | [re-frame "1.4.2"]{{#10x?}} 10 | [day8.re-frame/tracing "0.6.2"]{{/10x?}}{{#re-com?}} 11 | [re-com "2.13.2"]{{/re-com?}}{{#routes?}} 12 | [bidi "2.1.6"] 13 | [clj-commons/pushy "0.3.10"]{{/routes?}}{{#garden?}} 14 | [garden "1.3.10"] 15 | [net.dhleong/spade "1.1.0"]{{/garden?}} 16 | {{#re-pressed?}} 17 | [re-pressed "0.3.2"]{{/re-pressed?}}{{#breaking-point?}} 18 | [breaking-point "0.1.2"]{{/breaking-point?}} 19 | [binaryage/devtools "1.0.6"]{{#10x?}} 20 | [day8.re-frame/re-frame-10x "1.9.3"]{{/10x?}}{{#re-frisk?}} 21 | [re-frisk "1.6.0"]{{/re-frisk?}}{{#cider?}} 22 | [cider/cider-nrepl "0.44.0"]{{/cider?}}{{#git-inject?}} 23 | [day8/shadow-git-inject "0.0.5"]{{/git-inject?}}]{{#git-inject?}} 24 | 25 | :build-defaults 26 | {:build-hooks [(shadow-git-inject.core/hook)]}{{/git-inject?}} 27 | 28 | :dev-http 29 | {8280 "resources/public" 30 | 8290 "target/browser-test"} 31 | 32 | :builds 33 | {:app 34 | {:target :browser 35 | :output-dir "resources/public/js/compiled" 36 | :asset-path "/js/compiled" 37 | :modules 38 | {:app {:init-fn {{name}}.core/init}}{{#git-inject?}} 39 | :compiler-options 40 | {:closure-defines 41 | { {{name}}.config/version :shadow-git-inject/version}}{{/git-inject?}} 42 | :devtools 43 | {:preloads [{{#10x?}}day8.re-frame-10x.preload{{/10x?}}{{#re-frisk?}} 44 | re-frisk.preload{{/re-frisk?}}]} 45 | :dev 46 | {:compiler-options 47 | {:closure-defines 48 | { {{#10x?}}re-frame.trace.trace-enabled? true 49 | day8.re-frame.tracing.trace-enabled? true{{/10x?}}{{#re-com?}} 50 | re-com.config/root-url-for-compiler-output "http://localhost:8290/js/compiled/app/cljs-runtime/"{{/re-com?}}}}}{{#10x?}} 51 | :release 52 | {:build-options 53 | {:ns-aliases 54 | {day8.re-frame.tracing day8.re-frame.tracing-stubs}}}{{/10x?}}}{{#test?}} 55 | :browser-test 56 | {:target :browser-test 57 | :ns-regexp "-test$" 58 | :runner-ns shadow.test.browser 59 | :test-dir "target/browser-test"} 60 | :karma-test 61 | {:target :karma 62 | :ns-regexp "-test$" 63 | :output-to "target/karma-test.js"}{{/test?}}}} 64 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/config.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.config) 2 | 3 | (def debug? 4 | ^boolean goog.DEBUG){{#git-inject?}} 5 | 6 | (goog-define ^js/String version "unknown"){{/git-inject?}} -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/core.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.core 2 | (:require 3 | [reagent.dom :as rdom] 4 | [re-frame.core :as re-frame]{{#re-pressed?}} 5 | [re-pressed.core :as rp]{{/re-pressed?}}{{#breaking-point?}} 6 | [breaking-point.core :as bp]{{/breaking-point?}} 7 | [{{ns-name}}.events :as events]{{#routes?}} 8 | [{{ns-name}}.routes :as routes]{{/routes?}} 9 | [{{ns-name}}.views :as views] 10 | [{{ns-name}}.config :as config] 11 | )) 12 | 13 | 14 | (defn dev-setup [] 15 | (when config/debug? 16 | (println "dev mode"))) 17 | 18 | (defn ^:dev/after-load mount-root [] 19 | (re-frame/clear-subscription-cache!) 20 | (let [root-el (.getElementById js/document "app")] 21 | (rdom/unmount-component-at-node root-el) 22 | (rdom/render [views/main-panel] root-el))) 23 | 24 | (defn init []{{#routes?}} 25 | (routes/start!){{/routes?}} 26 | (re-frame/dispatch-sync [::events/initialize-db]){{#re-pressed?}} 27 | (re-frame/dispatch-sync [::rp/add-keyboard-event-listener "keydown"]){{/re-pressed?}}{{#breaking-point?}} 28 | (re-frame/dispatch-sync [::bp/set-breakpoints 29 | {:breakpoints [:mobile 30 | 768 31 | :tablet 32 | 992 33 | :small-monitor 34 | 1200 35 | :large-monitor] 36 | :debounce-ms 166}]){{/breaking-point?}} 37 | (dev-setup) 38 | (mount-root)) 39 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/db.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.db) 2 | 3 | (def default-db 4 | {:name "re-frame"}) 5 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/events.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.events 2 | (:require 3 | [re-frame.core :as re-frame]{{#re-pressed?}} 4 | [re-pressed.core :as rp]{{/re-pressed?}} 5 | [{{ns-name}}.db :as db]{{#10x?}} 6 | [day8.re-frame.tracing :refer-macros [fn-traced]]{{/10x?}} 7 | )) 8 | 9 | (re-frame/reg-event-db 10 | ::initialize-db 11 | ({{^10x?}}fn{{/10x?}}{{#10x?}}fn-traced{{/10x?}} [_ _] 12 | db/default-db)) 13 | {{#routes?}} 14 | 15 | (re-frame/reg-event-fx 16 | ::navigate 17 | ({{^10x?}}fn{{/10x?}}{{#10x?}}fn-traced{{/10x?}} [_ [_ handler]] 18 | {:navigate handler})) 19 | 20 | (re-frame/reg-event-fx 21 | ::set-active-panel 22 | ({{^10x?}}fn{{/10x?}}{{#10x?}}fn-traced{{/10x?}} [{:keys [db]} [_ active-panel]] 23 | {:db (assoc db :active-panel active-panel){{#re-pressed?}} 24 | :dispatch [::rp/set-keydown-rules 25 | {:event-keys [[[::set-re-pressed-example "Hello, world!"] 26 | [{:keyCode 72} ;; h 27 | {:keyCode 69} ;; e 28 | {:keyCode 76} ;; l 29 | {:keyCode 76} ;; l 30 | {:keyCode 79} ;; o 31 | ]]] 32 | :clear-keys 33 | [[{:keyCode 27} ;; escape 34 | ]]}]{{/re-pressed?}}})) 35 | {{/routes?}} 36 | {{#re-pressed?}} 37 | 38 | (re-frame/reg-event-db 39 | ::set-re-pressed-example 40 | (fn [db [_ value]] 41 | (assoc db :re-pressed-example value))) 42 | {{/re-pressed?}} 43 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/routes.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.routes 2 | (:require 3 | [bidi.bidi :as bidi] 4 | [pushy.core :as pushy] 5 | [re-frame.core :as re-frame] 6 | [{{ns-name}}.events :as events])) 7 | 8 | (defmulti panels identity) 9 | (defmethod panels :default [] [:div "No panel found for this route."]) 10 | 11 | (def routes 12 | (atom 13 | ["/" {"" :home 14 | "about" :about}])) 15 | 16 | (defn parse 17 | [url] 18 | (bidi/match-route @routes url)) 19 | 20 | (defn url-for 21 | [& args] 22 | (apply bidi/path-for (into [@routes] args))) 23 | 24 | (defn dispatch 25 | [route] 26 | (let [panel (keyword (str (name (:handler route)) "-panel"))] 27 | (re-frame/dispatch [::events/set-active-panel panel]))) 28 | 29 | (defonce history 30 | (pushy/pushy dispatch parse)) 31 | 32 | (defn navigate! 33 | [handler] 34 | (pushy/set-token! history (url-for handler))) 35 | 36 | (defn start! 37 | [] 38 | (pushy/start! history)) 39 | 40 | (re-frame/reg-fx 41 | :navigate 42 | (fn [handler] 43 | (navigate! handler))) 44 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/styles.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.styles 2 | (:require-macros 3 | [garden.def :refer [defcssfn]]) 4 | (:require 5 | [spade.core :refer [defglobal defclass]] 6 | [garden.units :refer [deg px]] 7 | [garden.color :refer [rgba]])) 8 | 9 | (defcssfn linear-gradient 10 | ([c1 p1 c2 p2] 11 | [[c1 p1] [c2 p2]]) 12 | ([dir c1 p1 c2 p2] 13 | [dir [c1 p1] [c2 p2]])) 14 | 15 | (defglobal defaults 16 | [:body 17 | {:color :red 18 | :background-color :#ddd 19 | :background-image [(linear-gradient :white (px 2) :transparent (px 2)) 20 | (linear-gradient (deg 90) :white (px 2) :transparent (px 2)) 21 | (linear-gradient (rgba 255 255 255 0.3) (px 1) :transparent (px 1)) 22 | (linear-gradient (deg 90) (rgba 255 255 255 0.3) (px 1) :transparent (px 1))] 23 | :background-size [[(px 100) (px 100)] [(px 100) (px 100)] [(px 20) (px 20)] [(px 20) (px 20)]] 24 | :background-position [[(px -2) (px -2)] [(px -2) (px -2)] [(px -1) (px -1)] [(px -1) (px -1)]]}]) 25 | 26 | (defclass level1 27 | [] 28 | {:color :green}) -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/subs.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.subs 2 | (:require 3 | [re-frame.core :as re-frame])) 4 | 5 | (re-frame/reg-sub 6 | ::name 7 | (fn [db] 8 | (:name db))) 9 | {{#routes?}} 10 | 11 | (re-frame/reg-sub 12 | ::active-panel 13 | (fn [db _] 14 | (:active-panel db))) 15 | {{/routes?}} 16 | {{#re-pressed?}} 17 | 18 | (re-frame/reg-sub 19 | ::re-pressed-example 20 | (fn [db _] 21 | (:re-pressed-example db))) 22 | {{/re-pressed?}} 23 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/views.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.views 2 | (:require 3 | [re-frame.core :as re-frame]{{#breaking-point?}} 4 | [breaking-point.core :as bp]{{/breaking-point?}}{{#re-pressed?}} 5 | [re-pressed.core :as rp] 6 | [{{ns-name}}.events :as events]{{/re-pressed?}}{{#garden?}} 7 | [{{ns-name}}.styles :as styles]{{/garden?}} 8 | [{{ns-name}}.subs :as subs]{{#git-inject?}} 9 | [{{ns-name}}.config :as config]{{/git-inject?}} 10 | )) 11 | 12 | {{#re-pressed?}} 13 | (defn dispatch-keydown-rules [] 14 | (re-frame/dispatch 15 | [::rp/set-keydown-rules 16 | {:event-keys [[[::events/set-re-pressed-example "Hello, world!"] 17 | [{:keyCode 72} ;; h 18 | {:keyCode 69} ;; e 19 | {:keyCode 76} ;; l 20 | {:keyCode 76} ;; l 21 | {:keyCode 79} ;; o 22 | ]]] 23 | 24 | :clear-keys 25 | [[{:keyCode 27} ;; escape 26 | ]]}])) 27 | 28 | (defn display-re-pressed-example [] 29 | (let [re-pressed-example (re-frame/subscribe [::subs/re-pressed-example])] 30 | [:div 31 | 32 | [:p 33 | "Re-pressed is listening for keydown events. However, re-pressed 34 | won't trigger any events until you set some keydown rules."] 35 | 36 | [:div 37 | [:button 38 | {:on-click dispatch-keydown-rules} 39 | "set keydown rules"]] 40 | 41 | [:p 42 | [:span 43 | "After clicking the button, you will have defined a rule that 44 | will display a message when you type "] 45 | [:strong [:code "hello"]] 46 | [:span ". So go ahead, try it out!"]] 47 | 48 | (when-let [rpe @re-pressed-example] 49 | [:div 50 | {:style {:padding "16px" 51 | :background-color "lightgrey" 52 | :border "solid 1px grey" 53 | :border-radius "4px" 54 | :margin-top "16px" 55 | }} 56 | rpe])])) 57 | 58 | {{/re-pressed?}} 59 | (defn main-panel [] 60 | (let [name (re-frame/subscribe [::subs/name])] 61 | [:div 62 | [:h1{{#garden?}} 63 | {:class (styles/level1)}{{/garden?}} 64 | "Hello from " @name{{#git-inject?}}". Version " config/version{{/git-inject?}}]{{#re-pressed?}} 65 | [display-re-pressed-example]{{/re-pressed?}}{{#breaking-point?}} 66 | [:div 67 | [:h3 (str "screen-width: " @(re-frame/subscribe [::bp/screen-width]))] 68 | [:h3 (str "screen: " @(re-frame/subscribe [::bp/screen]))]]{{/breaking-point?}} 69 | ])) 70 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/views_recom.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.views 2 | (:require 3 | [re-frame.core :as re-frame] 4 | [re-com.core :as re-com :refer [at]]{{#breaking-point?}} 5 | [breaking-point.core :as bp]{{/breaking-point?}}{{#re-pressed?}} 6 | [re-pressed.core :as rp] 7 | [{{ns-name}}.events :as events]{{/re-pressed?}}{{#garden?}} 8 | [{{ns-name}}.styles :as styles]{{/garden?}}{{#git-inject?}} 9 | [{{ns-name}}.config :as config]{{/git-inject?}} 10 | [{{ns-name}}.subs :as subs] 11 | )) 12 | 13 | {{#re-pressed?}} 14 | (defn dispatch-keydown-rules [] 15 | (re-frame/dispatch 16 | [::rp/set-keydown-rules 17 | {:event-keys [[[::events/set-re-pressed-example "Hello, world!"] 18 | [{:keyCode 72} ;; h 19 | {:keyCode 69} ;; e 20 | {:keyCode 76} ;; l 21 | {:keyCode 76} ;; l 22 | {:keyCode 79} ;; o 23 | ]]] 24 | 25 | :clear-keys 26 | [[{:keyCode 27} ;; escape 27 | ]]}])) 28 | 29 | (defn display-re-pressed-example [] 30 | (let [re-pressed-example (re-frame/subscribe [::subs/re-pressed-example])] 31 | [:div 32 | 33 | [:p 34 | "Re-pressed is listening for keydown events. However, re-pressed 35 | won't trigger any events until you set some keydown rules."] 36 | 37 | [:div 38 | [re-com/button 39 | :src (at) 40 | :on-click dispatch-keydown-rules 41 | :label "set keydown rules"]] 42 | 43 | [:p 44 | [:span 45 | "After clicking the button, you will have defined a rule that 46 | will display a message when you type "] 47 | [:strong [:code "hello"]] 48 | [:span ". So go ahead, try it out!"]] 49 | 50 | (when-let [rpe @re-pressed-example] 51 | [re-com/alert-box 52 | :src (at) 53 | :alert-type :info 54 | :body rpe])])) 55 | 56 | {{/re-pressed?}} 57 | (defn title [] 58 | (let [name (re-frame/subscribe [::subs/name])] 59 | [re-com/title 60 | :src (at) 61 | :label (str "Hello from " @name{{#git-inject?}}". Git version " config/version{{/git-inject?}}) 62 | :level :level1{{#garden?}} 63 | :class (styles/level1){{/garden?}}])) 64 | 65 | (defn main-panel [] 66 | [re-com/v-box 67 | :src (at) 68 | :height "100%" 69 | :children [[title]{{#re-pressed?}} 70 | [display-re-pressed-example]{{/re-pressed?}}{{#breaking-point?}} 71 | [:div 72 | [:h3 (str "screen-width: " @(re-frame/subscribe [::bp/screen-width]))] 73 | [:h3 (str "screen: " @(re-frame/subscribe [::bp/screen]))]]{{/breaking-point?}} 74 | ]]) 75 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/views_recom_routes.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.views 2 | (:require 3 | [re-frame.core :as re-frame] 4 | [re-com.core :as re-com :refer [at]]{{#breaking-point?}} 5 | [breaking-point.core :as bp]{{/breaking-point?}}{{#garden?}} 6 | [{{ns-name}}.styles :as styles]{{/garden?}}{{#git-inject?}} 7 | [{{ns-name}}.config :as config]{{/git-inject?}} 8 | [{{ns-name}}.events :as events] 9 | [{{ns-name}}.routes :as routes] 10 | [{{ns-name}}.subs :as subs])) 11 | 12 | 13 | 14 | ;; home 15 | 16 | {{#re-pressed?}} 17 | (defn display-re-pressed-example [] 18 | (let [re-pressed-example (re-frame/subscribe [::subs/re-pressed-example])] 19 | [:div 20 | 21 | [:p 22 | [:span "Re-pressed is listening for keydown events. A message will be displayed when you type "] 23 | [:strong [:code "hello"]] 24 | [:span ". So go ahead, try it out!"]] 25 | 26 | (when-let [rpe @re-pressed-example] 27 | [re-com/alert-box 28 | :src (at) 29 | :alert-type :info 30 | :body rpe])])) 31 | 32 | {{/re-pressed?}} 33 | (defn home-title [] 34 | (let [name (re-frame/subscribe [::subs/name])] 35 | [re-com/title 36 | :src (at) 37 | :label (str "Hello from " @name ". This is the Home Page." {{#git-inject?}}" Git version " config/version{{/git-inject?}}) 38 | :level :level1{{#garden?}} 39 | :class (styles/level1){{/garden?}}])) 40 | 41 | (defn link-to-about-page [] 42 | [re-com/hyperlink 43 | :src (at) 44 | :label "go to About Page" 45 | :on-click #(re-frame/dispatch [::events/navigate :about])]) 46 | 47 | (defn home-panel [] 48 | [re-com/v-box 49 | :src (at) 50 | :gap "1em" 51 | :children [[home-title] 52 | [link-to-about-page]{{#re-pressed?}} 53 | [display-re-pressed-example]{{/re-pressed?}}{{#breaking-point?}} 54 | [:div 55 | [:h3 (str "screen-width: " @(re-frame/subscribe [::bp/screen-width]))] 56 | [:h3 (str "screen: " @(re-frame/subscribe [::bp/screen]))]]{{/breaking-point?}}]]) 57 | 58 | 59 | (defmethod routes/panels :home-panel [] [home-panel]) 60 | 61 | ;; about 62 | 63 | (defn about-title [] 64 | [re-com/title 65 | :src (at) 66 | :label "This is the About Page." 67 | :level :level1]) 68 | 69 | (defn link-to-home-page [] 70 | [re-com/hyperlink 71 | :src (at) 72 | :label "go to Home Page" 73 | :on-click #(re-frame/dispatch [::events/navigate :home])]) 74 | 75 | (defn about-panel [] 76 | [re-com/v-box 77 | :src (at) 78 | :gap "1em" 79 | :children [[about-title] 80 | [link-to-home-page]]]) 81 | 82 | (defmethod routes/panels :about-panel [] [about-panel]) 83 | 84 | ;; main 85 | 86 | (defn main-panel [] 87 | (let [active-panel (re-frame/subscribe [::subs/active-panel])] 88 | [re-com/v-box 89 | :src (at) 90 | :height "100%" 91 | :children [(routes/panels @active-panel)]])) 92 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/src/views_routes.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.views 2 | (:require 3 | [re-frame.core :as re-frame]{{#breaking-point?}} 4 | [breaking-point.core :as bp]{{/breaking-point?}}{{#garden?}} 5 | [{{ns-name}}.styles :as styles]{{/garden?}}{{#git-inject?}} 6 | [{{ns-name}}.config :as config]{{/git-inject?}} 7 | [{{ns-name}}.events :as events] 8 | [{{ns-name}}.routes :as routes] 9 | [{{ns-name}}.subs :as subs] 10 | )) 11 | 12 | 13 | ;; home 14 | 15 | {{#re-pressed?}} 16 | (defn display-re-pressed-example [] 17 | (let [re-pressed-example (re-frame/subscribe [::subs/re-pressed-example])] 18 | [:div 19 | 20 | [:p 21 | [:span "Re-pressed is listening for keydown events. A message will be displayed when you type "] 22 | [:strong [:code "hello"]] 23 | [:span ". So go ahead, try it out!"]] 24 | 25 | (when-let [rpe @re-pressed-example] 26 | [:div 27 | {:style {:padding "16px" 28 | :background-color "lightgrey" 29 | :border "solid 1px grey" 30 | :border-radius "4px" 31 | :margin-top "16px" 32 | }} 33 | rpe])])) 34 | 35 | {{/re-pressed?}} 36 | (defn home-panel [] 37 | (let [name (re-frame/subscribe [::subs/name])] 38 | [:div 39 | [:h1{{#garden?}} 40 | {:class (styles/level1)}{{/garden?}} 41 | (str "Hello from " @name ". This is the Home Page."{{#git-inject?}}" Git version " config/version{{/git-inject?}})] 42 | 43 | [:div 44 | [:a {:on-click #(re-frame/dispatch [::events/navigate :about])} 45 | "go to About Page"]]{{#re-pressed?}} 46 | 47 | [display-re-pressed-example]{{/re-pressed?}}{{#breaking-point?}} 48 | [:div 49 | [:h3 (str "screen-width: " @(re-frame/subscribe [::bp/screen-width]))] 50 | [:h3 (str "screen: " @(re-frame/subscribe [::bp/screen]))]]{{/breaking-point?}} 51 | ])) 52 | 53 | (defmethod routes/panels :home-panel [] [home-panel]) 54 | 55 | ;; about 56 | 57 | (defn about-panel [] 58 | [:div 59 | [:h1 "This is the About Page."] 60 | 61 | [:div 62 | [:a {:on-click #(re-frame/dispatch [::events/navigate :home])} 63 | "go to Home Page"]]]) 64 | 65 | (defmethod routes/panels :about-panel [] [about-panel]) 66 | 67 | ;; main 68 | 69 | (defn main-panel [] 70 | (let [active-panel (re-frame/subscribe [::subs/active-panel])] 71 | (routes/panels @active-panel))) 72 | -------------------------------------------------------------------------------- /resources/leiningen/new/re_frame/test/core_test.cljs: -------------------------------------------------------------------------------- 1 | (ns {{ns-name}}.core-test 2 | (:require [cljs.test :refer-macros [deftest testing is]] 3 | [{{ns-name}}.core :as core])) 4 | 5 | (deftest fake-test 6 | (testing "fake description" 7 | (is (= 1 2)))) 8 | -------------------------------------------------------------------------------- /src/leiningen/new/options/base.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.base 2 | (:require [leiningen.new.options.helpers :as helpers])) 3 | 4 | (defn files [data] 5 | [[".gitignore" (helpers/render "gitignore" data)] 6 | ["README.md" (helpers/render "README.md" data)] 7 | ["package.json" (helpers/render "package.json" data)] 8 | ["shadow-cljs.edn" (helpers/render "shadow-cljs.edn" data)] 9 | ["karma.conf.js" (helpers/render "karma.conf.js" data)] 10 | ["dev/user.cljs" (helpers/render "dev/user.cljs" data)] 11 | ["resources/public/index.html" (helpers/render "resources/public/index.html" data)] 12 | ["src/{{sanitized}}/core.cljs" (helpers/render "src/core.cljs" data)] 13 | ["src/{{sanitized}}/config.cljs" (helpers/render "src/config.cljs" data)] 14 | ["src/{{sanitized}}/db.cljs" (helpers/render "src/db.cljs" data)] 15 | ["src/{{sanitized}}/subs.cljs" (helpers/render "src/subs.cljs" data)] 16 | ["src/{{sanitized}}/events.cljs" (helpers/render "src/events.cljs" data)]]) 17 | -------------------------------------------------------------------------------- /src/leiningen/new/options/cider.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.cider 2 | (:require [leiningen.new.options.helpers :as helpers])) 3 | 4 | (def option "+cider") 5 | 6 | (defn files [data] 7 | [[".dir-locals.el" (helpers/render "dir-locals.el" data)]]) 8 | -------------------------------------------------------------------------------- /src/leiningen/new/options/garden.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.garden 2 | (:require [leiningen.new.options.helpers :as helpers])) 3 | 4 | (def option "+garden") 5 | 6 | (defn files [data] 7 | [["src/{{sanitized}}/styles.cljs" (helpers/render "src/styles.cljs" data)]]) 8 | -------------------------------------------------------------------------------- /src/leiningen/new/options/github_actions.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.github-actions 2 | (:require [leiningen.new.options.helpers :as helpers])) 3 | 4 | (def option "+github-actions") 5 | 6 | (defn files [data] 7 | [[".github/workflows/test.yaml" (helpers/render "github/workflows/test.yaml" data)]]) 8 | -------------------------------------------------------------------------------- /src/leiningen/new/options/helpers.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.helpers 2 | (:use [leiningen.new.templates :only [renderer sanitize]] 3 | [clojure.java.io :as io])) 4 | 5 | (def template-name "re-frame") 6 | 7 | (def render-text (renderer template-name)) 8 | 9 | (defn resource-input 10 | "Get resource input stream. Useful for binary resources like images." 11 | [resource-path] 12 | (-> (str "leiningen/new/" (sanitize template-name) "/" resource-path) 13 | io/resource 14 | io/input-stream)) 15 | 16 | (defn render 17 | "Render the content of a resource" 18 | ([resource-path] 19 | (resource-input resource-path)) 20 | ([resource-path data] 21 | (render-text resource-path data))) 22 | 23 | (defn option? [option-name options] 24 | (boolean 25 | (some #{option-name} options))) 26 | -------------------------------------------------------------------------------- /src/leiningen/new/options/kondo.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.kondo 2 | (:require [leiningen.new.options.helpers :as helpers])) 3 | 4 | (def option "+kondo") 5 | 6 | (defn files [data] 7 | [[".clj-kondo/config.edn" (helpers/render "clj-kondo/config.edn" data)]]) 8 | -------------------------------------------------------------------------------- /src/leiningen/new/options/re_com.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.re-com 2 | (:require [leiningen.new.options.helpers :as helpers])) 3 | 4 | (def option "+re-com") 5 | 6 | (defn assets [data] 7 | [["resources/public/vendor/css/re-com.css" (helpers/render "resources/public/vendor/css/re-com.css" data)] 8 | ["resources/public/vendor/css/chosen-sprite@2x.png" (helpers/render "resources/public/vendor/css/chosen-sprite@2x.png")] 9 | ["resources/public/vendor/css/chosen-sprite.png" (helpers/render "resources/public/vendor/css/chosen-sprite.png")] 10 | ["resources/public/vendor/css/material-design-iconic-font.min.css" (helpers/render "resources/public/vendor/css/material-design-iconic-font.min.css" data)] 11 | 12 | ["resources/public/vendor/fonts/Material-Design-Iconic-Font.eot" (helpers/render "resources/public/vendor/fonts/Material-Design-Iconic-Font.eot")] 13 | ["resources/public/vendor/fonts/Material-Design-Iconic-Font.svg" (helpers/render "resources/public/vendor/fonts/Material-Design-Iconic-Font.svg")] 14 | ["resources/public/vendor/fonts/Material-Design-Iconic-Font.ttf" (helpers/render "resources/public/vendor/fonts/Material-Design-Iconic-Font.ttf")] 15 | ["resources/public/vendor/fonts/Material-Design-Iconic-Font.woff" (helpers/render "resources/public/vendor/fonts/Material-Design-Iconic-Font.woff")] 16 | ["resources/public/vendor/fonts/Material-Design-Iconic-Font.woff2" (helpers/render "resources/public/vendor/fonts/Material-Design-Iconic-Font.woff2")]]) 17 | -------------------------------------------------------------------------------- /src/leiningen/new/options/routes.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.routes 2 | (:require [leiningen.new.options.helpers :as helpers])) 3 | 4 | (def option "+routes") 5 | 6 | (defn routes-cljs [data] 7 | [["src/{{sanitized}}/routes.cljs" (helpers/render "src/routes.cljs" data)]]) 8 | -------------------------------------------------------------------------------- /src/leiningen/new/options/test.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.test 2 | (:require [leiningen.new.options.helpers :as helpers])) 3 | 4 | (def option "+test") 5 | 6 | (defn files [data] 7 | [["test/{{sanitized}}/core_test.cljs" (helpers/render "test/core_test.cljs" data)]]) 8 | -------------------------------------------------------------------------------- /src/leiningen/new/options/views.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.options.views 2 | (:require [leiningen.new.options.helpers :as helpers] 3 | [leiningen.new.options.re-com :as re-com] 4 | [leiningen.new.options.routes :as routes])) 5 | 6 | (defn file [name data] 7 | [ ["src/{{sanitized}}/views.cljs" 8 | (helpers/render (str "src/" name ".cljs") 9 | data)]]) 10 | 11 | 12 | (defn view-cljs [options data] 13 | (cond (and (helpers/option? re-com/option options) (helpers/option? routes/option options)) 14 | (file "views_recom_routes" data) 15 | 16 | (helpers/option? re-com/option options) 17 | (file "views_recom" data) 18 | 19 | (helpers/option? routes/option options) 20 | (file "views_routes" data) 21 | 22 | :else 23 | (file "views" data))) 24 | -------------------------------------------------------------------------------- /src/leiningen/new/re_frame.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.re-frame 2 | (:require 3 | [leiningen.core.main :as main] 4 | [leiningen.new.options.base :as base] 5 | [leiningen.new.options.garden :as garden] 6 | [leiningen.new.options.kondo :as kondo] 7 | [leiningen.new.options.re-com :as re-com] 8 | [leiningen.new.options.routes :as routes] 9 | [leiningen.new.options.test :as test] 10 | [leiningen.new.options.views :as views] 11 | [leiningen.new.options.helpers :as helpers] 12 | [leiningen.new.options.cider :as cider] 13 | [leiningen.new.options.github-actions :as github-actions] 14 | [clojure.set :as set]) 15 | (:use [leiningen.new.templates :only [name-to-path sanitize-ns ->files]])) 16 | 17 | 18 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 19 | ;; Files & Data for Template 20 | 21 | (defn app-files [data options] 22 | (concat 23 | (base/files data) 24 | (views/view-cljs options data) 25 | 26 | ;; css 27 | (when (helpers/option? garden/option options) (garden/files data)) 28 | 29 | ;; debug 30 | ;; 31 | 32 | ;; development 33 | (when (helpers/option? kondo/option options) (kondo/files data)) 34 | (when (helpers/option? test/option options) (test/files data)) 35 | 36 | ;; full-stack 37 | (when (helpers/option? cider/option options) (cider/files data)) 38 | 39 | ;; misc. 40 | (when (helpers/option? re-com/option options) (re-com/assets data)) 41 | (when (helpers/option? github-actions/option options) (github-actions/files data)) 42 | 43 | ;; routing 44 | (when (helpers/option? routes/option options) (routes/routes-cljs data)))) 45 | 46 | 47 | 48 | (defn template-data [name options] 49 | {:name name 50 | :ns-name (sanitize-ns name) 51 | :sanitized (name-to-path name) 52 | 53 | ;; css 54 | :garden? (helpers/option? garden/option options) 55 | 56 | ;; debug 57 | :re-frisk? (helpers/option? "+re-frisk" options) 58 | :10x? (helpers/option? "+10x" options) 59 | 60 | ;; development 61 | :cider? (helpers/option? cider/option options) 62 | :kondo? (helpers/option? kondo/option options) 63 | :test? (helpers/option? test/option options) 64 | :git-inject? (helpers/option? "+git-inject" options) 65 | 66 | ;; misc. 67 | :re-com? (helpers/option? re-com/option options) 68 | :re-pressed? (helpers/option? "+re-pressed" options) 69 | :breaking-point? (helpers/option? "+breaking-point" options) 70 | :github-actions? (helpers/option? github-actions/option options) 71 | 72 | ;; routing 73 | :routes? (helpers/option? routes/option options)}) 74 | 75 | 76 | 77 | 78 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 79 | ;; Check Options 80 | 81 | (def available-set 82 | #{;; css 83 | garden/option 84 | 85 | ;; debug 86 | "+re-frisk" 87 | "+10x" 88 | 89 | ;; development 90 | cider/option 91 | kondo/option 92 | test/option 93 | "+git-inject" 94 | 95 | ;; misc. 96 | re-com/option 97 | "+re-pressed" 98 | "+breaking-point" 99 | github-actions/option 100 | 101 | ;; routing 102 | routes/option}) 103 | 104 | 105 | 106 | (defn check-available [options] 107 | (let [options-set (into #{} options) 108 | abort? (not (set/superset? available-set 109 | options-set))] 110 | (when abort? 111 | (main/abort "\nError: invalid profile(s)\n")))) 112 | 113 | 114 | (defn check-options 115 | "Check the user-provided options" 116 | [options] 117 | (doto options 118 | check-available)) 119 | 120 | 121 | 122 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 123 | ;; Main 124 | 125 | (defn re-frame [name & options] 126 | (let [data (template-data name options)] 127 | (check-options options) 128 | (main/info "Generating re-frame project.") 129 | (apply ->files data 130 | (app-files data options)))) 131 | --------------------------------------------------------------------------------