├── php.ini
├── .gitignore
├── web
├── images
│ ├── favicon.ico
│ ├── todo
│ │ ├── done.png
│ │ ├── todo.png
│ │ ├── done-2x.png
│ │ ├── search.png
│ │ ├── todo-2x.png
│ │ └── search-2x.png
│ ├── demo
│ │ ├── browser.png
│ │ ├── video.jpg
│ │ ├── html-icon.png
│ │ ├── logo-mask.png
│ │ ├── browser-2x.png
│ │ ├── logo-mask-2x.png
│ │ ├── browser-author.jpg
│ │ ├── browser-pic-1.jpg
│ │ ├── browser-pic-2.jpg
│ │ ├── browser-pic-3.jpg
│ │ ├── browser-pic-4.jpg
│ │ ├── browser-pic-5.jpg
│ │ └── browser-pic-6.jpg
│ ├── footer
│ │ └── logo.png
│ ├── icons
│ │ ├── Map@2x.png
│ │ ├── Book@2x.png
│ │ ├── Chat@2x.png
│ │ ├── Mail@2x.png
│ │ ├── Calendar@2x.png
│ │ ├── Compas@2x.png
│ │ ├── Gift-Box@2x.png
│ │ ├── Pensils@2x.png
│ │ ├── Pocket@2x.png
│ │ ├── Watches@2x.png
│ │ ├── Clipboard@2x.png
│ │ ├── Infinity-Loop@2x.png
│ │ ├── Retina-Ready@2x.png
│ │ └── Toilet-Paper@2x.png
│ ├── login
│ │ ├── icon.png
│ │ ├── imac.png
│ │ └── imac-2x.png
│ ├── switch
│ │ ├── mask.png
│ │ └── mask-square.png
│ ├── tile
│ │ ├── ribbon.png
│ │ └── ribbon-2x.png
│ └── video
│ │ ├── pause.png
│ │ ├── play.png
│ │ ├── poster.jpg
│ │ ├── pause-2x.png
│ │ ├── play-2x.png
│ │ ├── fullscreen.png
│ │ ├── volume-full.png
│ │ ├── volume-off.png
│ │ ├── fullscreen-2x.png
│ │ ├── volume-off-2x.png
│ │ └── volume-full-2x.png
├── fonts
│ ├── Flat-UI-Icons.eot
│ ├── Flat-UI-Icons.ttf
│ └── Flat-UI-Icons.woff
├── bootstrap
│ ├── img
│ │ ├── glyphicons-halflings.png
│ │ └── glyphicons-halflings-white.png
│ ├── css
│ │ └── prettify.css
│ └── js
│ │ ├── application.js
│ │ └── google-code-prettify
│ │ └── prettify.js
├── .htaccess
├── less
│ ├── modules
│ │ ├── caret.less
│ │ ├── share.less
│ │ ├── progress.less
│ │ ├── type.less
│ │ ├── tooltip.less
│ │ ├── palette.less
│ │ ├── pager.less
│ │ ├── ui-slider.less
│ │ ├── footer.less
│ │ ├── tile.less
│ │ ├── checkbox-and-radio.less
│ │ ├── tagsinput.less
│ │ ├── todo.less
│ │ ├── login.less
│ │ ├── select.less
│ │ ├── switch.less
│ │ ├── input.less
│ │ ├── buttons.less
│ │ ├── pagination.less
│ │ ├── dropdown.less
│ │ ├── demo.less
│ │ ├── video.less
│ │ └── navbar.less
│ ├── flat-ui.less
│ ├── spaces.less
│ ├── icon-font.less
│ ├── config.less
│ └── mixins.less
├── css
│ └── indiewebify.css
└── js
│ ├── jquery.ui.touch-punch.min.js
│ ├── icon-font-ie7.js
│ ├── jquery.stacktable.js
│ ├── application.js
│ ├── html5shiv.js
│ ├── flatui-checkbox.js
│ ├── flatui-radio.js
│ ├── jquery.placeholder.js
│ ├── bootstrap-switch.js
│ └── jquery.tagsinput.js
├── indiewebify-8c3770012eff.json.enc
├── .editorconfig
├── phpunit.xml
├── app.yaml
├── tests
├── bootstrap.php
├── html-test-runner.php
├── rel-me-test.html
└── RelMeTest.php
├── .travis.yml
├── composer.json
├── templates
├── header.html.php
├── footer.html.php
├── validate-rel-me.html.php
├── send-webmentions.html.php
├── silo-hint.html.php
├── index.html.php
├── validate-h-card.html.php
└── validate-h-entry.html.php
└── README.md
/php.ini:
--------------------------------------------------------------------------------
1 | extension = "curl.so"
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | composer.phar
2 | /nbproject/
3 | /vendor/
4 | deploy
5 | .DS_Store
6 | .idea/
--------------------------------------------------------------------------------
/web/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/favicon.ico
--------------------------------------------------------------------------------
/web/images/todo/done.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/todo/done.png
--------------------------------------------------------------------------------
/web/images/todo/todo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/todo/todo.png
--------------------------------------------------------------------------------
/web/fonts/Flat-UI-Icons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/fonts/Flat-UI-Icons.eot
--------------------------------------------------------------------------------
/web/fonts/Flat-UI-Icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/fonts/Flat-UI-Icons.ttf
--------------------------------------------------------------------------------
/web/images/demo/browser.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/browser.png
--------------------------------------------------------------------------------
/web/images/demo/video.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/video.jpg
--------------------------------------------------------------------------------
/web/images/footer/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/footer/logo.png
--------------------------------------------------------------------------------
/web/images/icons/Map@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Map@2x.png
--------------------------------------------------------------------------------
/web/images/login/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/login/icon.png
--------------------------------------------------------------------------------
/web/images/login/imac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/login/imac.png
--------------------------------------------------------------------------------
/web/images/switch/mask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/switch/mask.png
--------------------------------------------------------------------------------
/web/images/tile/ribbon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/tile/ribbon.png
--------------------------------------------------------------------------------
/web/images/todo/done-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/todo/done-2x.png
--------------------------------------------------------------------------------
/web/images/todo/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/todo/search.png
--------------------------------------------------------------------------------
/web/images/todo/todo-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/todo/todo-2x.png
--------------------------------------------------------------------------------
/web/images/video/pause.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/pause.png
--------------------------------------------------------------------------------
/web/images/video/play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/play.png
--------------------------------------------------------------------------------
/web/images/video/poster.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/poster.jpg
--------------------------------------------------------------------------------
/web/fonts/Flat-UI-Icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/fonts/Flat-UI-Icons.woff
--------------------------------------------------------------------------------
/web/images/demo/html-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/html-icon.png
--------------------------------------------------------------------------------
/web/images/demo/logo-mask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/logo-mask.png
--------------------------------------------------------------------------------
/web/images/icons/Book@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Book@2x.png
--------------------------------------------------------------------------------
/web/images/icons/Chat@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Chat@2x.png
--------------------------------------------------------------------------------
/web/images/icons/Mail@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Mail@2x.png
--------------------------------------------------------------------------------
/web/images/login/imac-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/login/imac-2x.png
--------------------------------------------------------------------------------
/web/images/tile/ribbon-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/tile/ribbon-2x.png
--------------------------------------------------------------------------------
/web/images/todo/search-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/todo/search-2x.png
--------------------------------------------------------------------------------
/web/images/video/pause-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/pause-2x.png
--------------------------------------------------------------------------------
/web/images/video/play-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/play-2x.png
--------------------------------------------------------------------------------
/web/images/demo/browser-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/browser-2x.png
--------------------------------------------------------------------------------
/web/images/demo/logo-mask-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/logo-mask-2x.png
--------------------------------------------------------------------------------
/web/images/icons/Calendar@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Calendar@2x.png
--------------------------------------------------------------------------------
/web/images/icons/Compas@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Compas@2x.png
--------------------------------------------------------------------------------
/web/images/icons/Gift-Box@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Gift-Box@2x.png
--------------------------------------------------------------------------------
/web/images/icons/Pensils@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Pensils@2x.png
--------------------------------------------------------------------------------
/web/images/icons/Pocket@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Pocket@2x.png
--------------------------------------------------------------------------------
/web/images/icons/Watches@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Watches@2x.png
--------------------------------------------------------------------------------
/web/images/video/fullscreen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/fullscreen.png
--------------------------------------------------------------------------------
/web/images/video/volume-full.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/volume-full.png
--------------------------------------------------------------------------------
/web/images/video/volume-off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/volume-off.png
--------------------------------------------------------------------------------
/indiewebify-8c3770012eff.json.enc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/indiewebify-8c3770012eff.json.enc
--------------------------------------------------------------------------------
/web/images/demo/browser-author.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/browser-author.jpg
--------------------------------------------------------------------------------
/web/images/demo/browser-pic-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/browser-pic-1.jpg
--------------------------------------------------------------------------------
/web/images/demo/browser-pic-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/browser-pic-2.jpg
--------------------------------------------------------------------------------
/web/images/demo/browser-pic-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/browser-pic-3.jpg
--------------------------------------------------------------------------------
/web/images/demo/browser-pic-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/browser-pic-4.jpg
--------------------------------------------------------------------------------
/web/images/demo/browser-pic-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/browser-pic-5.jpg
--------------------------------------------------------------------------------
/web/images/demo/browser-pic-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/demo/browser-pic-6.jpg
--------------------------------------------------------------------------------
/web/images/icons/Clipboard@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Clipboard@2x.png
--------------------------------------------------------------------------------
/web/images/switch/mask-square.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/switch/mask-square.png
--------------------------------------------------------------------------------
/web/images/video/fullscreen-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/fullscreen-2x.png
--------------------------------------------------------------------------------
/web/images/video/volume-off-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/volume-off-2x.png
--------------------------------------------------------------------------------
/web/images/icons/Infinity-Loop@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Infinity-Loop@2x.png
--------------------------------------------------------------------------------
/web/images/icons/Retina-Ready@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Retina-Ready@2x.png
--------------------------------------------------------------------------------
/web/images/icons/Toilet-Paper@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/icons/Toilet-Paper@2x.png
--------------------------------------------------------------------------------
/web/images/video/volume-full-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/images/video/volume-full-2x.png
--------------------------------------------------------------------------------
/web/bootstrap/img/glyphicons-halflings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/bootstrap/img/glyphicons-halflings.png
--------------------------------------------------------------------------------
/web/bootstrap/img/glyphicons-halflings-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/indieweb/indiewebify-me/main/web/bootstrap/img/glyphicons-halflings-white.png
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*]
2 | end_of_line = lf
3 | trim_trailing_whitespace = true
4 | insert_final_newline = true
5 | charset = utf-8
6 | indent_style = tab
7 | indent_size = 4
8 |
9 |
--------------------------------------------------------------------------------
/phpunit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | tests/
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app.yaml:
--------------------------------------------------------------------------------
1 | runtime: php55
2 | api_version: 1
3 | automatic_scaling:
4 | max_idle_instances: 1
5 | handlers:
6 | - url: /bootstrap
7 | static_dir: web/bootstrap
8 | - url: /css
9 | static_dir: web/css
10 | - url: /fonts
11 | static_dir: web/fonts
12 | - url: /images
13 | static_dir: web/images
14 | - url: /js
15 | static_dir: web/js
16 | - url: /.*
17 | script: web/index.php
18 |
--------------------------------------------------------------------------------
/tests/bootstrap.php:
--------------------------------------------------------------------------------
1 |
2 | RewriteEngine On
3 | RewriteBase /
4 |
5 | # Checks to see if the user is attempting to access a valid file,
6 | # such as an image or css document, if this isn't true it sends the
7 | # request to index.php
8 | RewriteCond %{REQUEST_FILENAME} !-f
9 | RewriteCond %{REQUEST_FILENAME} !-d
10 | RewriteRule ^(.*)$ index.php/
11 |
12 |
13 |
14 | # If we don't have mod_rewrite installed, all 404's
15 | # can be sent to index.php, and everything works as normal.
16 | # Submitted by: ElliotHaughin
17 | ErrorDocument 404 /index.php
18 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: php
2 | php:
3 | - 5.6
4 | - 7.0
5 | - 7.1
6 | - 7.2
7 | - 7.3
8 | - nightly
9 | matrix:
10 | fast_finish: true
11 | allow_failures:
12 | - php: nightly
13 | sudo: false
14 | before_script:
15 | - composer self-update
16 | - composer install --prefer-dist --no-interaction
17 | before_install:
18 | - '[ "${TRAVIS_PULL_REQUEST}" = "false" ] && openssl aes-256-cbc -K $encrypted_3b574c5f323d_key -iv $encrypted_3b574c5f323d_iv
19 | -in indiewebify-8c3770012eff.json.enc -out indiewebify-8c3770012eff.json -d || true'
20 | deploy:
21 | skip_cleanup: true
22 | provider: gae
23 | keyfile: indiewebify-8c3770012eff.json
24 | default: true
25 | project: indiewebify
26 | on: master
27 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "indieweb/indiewebify-me",
3 | "description": "Tools to help you get the best out of your indieweb site",
4 | "authors": [{
5 | "name": "Brennan Novak",
6 | "homepage": "https://brennannovak.com"
7 | },
8 | {
9 | "name": "Barnaby Walters",
10 | "homepage": "http://waterpigs.co.uk"
11 | }],
12 | "require": {
13 | "barnabywalters/mf-cleaner": "^0.2",
14 | "ezyang/htmlpurifier": "4.7.*",
15 | "silex/silex": "*",
16 | "guzzlehttp/guzzle": "*",
17 | "tantek/cassis": "*",
18 | "indieweb/mention-client": ">=1.1.6",
19 | "indieweb/rel-me": "^0.1.1"
20 | },
21 | "require-dev": {
22 | "phpunit/phpunit": "*"
23 | },
24 | "autoload": {
25 | "files": []
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/web/less/modules/caret.less:
--------------------------------------------------------------------------------
1 | //
2 | // Caret
3 | // --------------------------------------------------
4 |
5 | .caret(@color: @base) {
6 | border-left-width: 6px;
7 | border-right-width: 6px;
8 | border-top-width: 8px;
9 | border-bottom-color: @color;
10 | border-style: solid;
11 | border-bottom-style: none;
12 | border-top-color: @color;
13 | .transition(.25s);
14 | }
15 |
16 | .caret {
17 | .caret();
18 | }
19 |
20 | .dropup .caret,
21 | .dropup .btn-large .caret,
22 | .navbar-fixed-bottom .dropdown .caret {
23 | border-bottom-width: 8px;
24 | }
25 |
26 | .btn-mini .caret,
27 | .btn-small .caret,
28 | .btn-large .caret {
29 | margin-top: 7px;
30 | }
31 |
32 | .btn-large .caret {
33 | border-top-width: 8px;
34 | border-right-width: 6px;
35 | border-left-width: 6px;
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/web/less/modules/share.less:
--------------------------------------------------------------------------------
1 | //
2 | // Sharing box
3 | // --------------------------------------------------
4 |
5 | // Module color variable
6 | @share-color: mix(@base, @inverse, 8%);
7 |
8 | .share {
9 | background-color: @share-color;
10 | position: relative;
11 | .dropdown-arrow(@share-color, -9px, 23px);
12 | .border-radius(6px);
13 |
14 | ul {
15 | list-style-type: none;
16 | margin: 0;
17 | padding: 15px;
18 | }
19 | li {
20 | padding-top: 11px;
21 | .clearfix();
22 |
23 | &:first-child {
24 | padding-top: 0;
25 | }
26 | }
27 | .toggle {
28 | float: right;
29 | margin: 0;
30 | }
31 | .btn {
32 | .border-radius(0 0 6px 6px);
33 | }
34 | }
35 |
36 | .share-label {
37 | float: left;
38 | font-size: 15px;
39 | padding-top: 5px;
40 | width: 50%;
41 | }
42 |
--------------------------------------------------------------------------------
/web/less/modules/progress.less:
--------------------------------------------------------------------------------
1 | //
2 | // Progress bar
3 | // --------------------------------------------------
4 |
5 | .progress {
6 | background: mix(@base, white, 10%);
7 | border-radius: 32px;
8 | height: @progress-height;
9 | .box-shadow(none);
10 | .drop-ie-gradient();
11 |
12 | // Alternate Colors
13 | // --------------------------------------------------
14 |
15 | .bar {
16 | background: @firm;
17 | .box-shadow(~"none !important");
18 | .drop-ie-gradient();
19 | }
20 | .bar-success {
21 | background-color: @success;
22 | .drop-ie-gradient();
23 | }
24 | .bar-warning {
25 | background-color: @warning;
26 | .drop-ie-gradient();
27 | }
28 | .bar-danger {
29 | background-color: @danger;
30 | .drop-ie-gradient();
31 | }
32 | .bar-info {
33 | background-color: @info;
34 | .drop-ie-gradient();
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/templates/header.html.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
26 |
--------------------------------------------------------------------------------
/web/bootstrap/css/prettify.css:
--------------------------------------------------------------------------------
1 | .com { color: #93a1a1; }
2 | .lit { color: #195f91; }
3 | .pun, .opn, .clo { color: #93a1a1; }
4 | .fun { color: #dc322f; }
5 | .str, .atv { color: #D14; }
6 | .kwd, .prettyprint .tag { color: #1e347b; }
7 | .typ, .atn, .dec, .var { color: teal; }
8 | .pln { color: #48484c; }
9 |
10 | .prettyprint {
11 | padding: 8px;
12 | background-color: #f7f7f9;
13 | border: 1px solid #e1e1e8;
14 | }
15 | .prettyprint.linenums {
16 | -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
17 | -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
18 | box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
19 | }
20 |
21 | /* Specify class=linenums on a pre to get line numbering */
22 | ol.linenums {
23 | margin: 0 0 0 33px; /* IE indents via margin-left */
24 | }
25 | ol.linenums li {
26 | padding-left: 12px;
27 | color: #bebec5;
28 | line-height: 20px;
29 | text-shadow: 0 1px 0 #fff;
30 | }
--------------------------------------------------------------------------------
/web/css/indiewebify.css:
--------------------------------------------------------------------------------
1 | .empty-property-block {
2 | background: #555;
3 | color: #efefef;
4 | text-shadow: none;
5 | border: #334 1px solid;
6 | box-shadow: #333 0 0 1em inset;
7 | padding: 0.5em;
8 | }
9 |
10 | .property-block-name {
11 | margin-bottom: 0.1em;
12 | margin-top: 1em;
13 | font-variant: small-caps;
14 | color: #555;
15 | font-size: 0.8em;
16 | clear: both;
17 | }
18 |
19 | .preview-block {
20 | background: #efefef;
21 | padding: 1em;
22 | max-width: 30em;
23 | border: 2px solid #DDD;
24 | }
25 |
26 | /* h-card validation */
27 | .preview-h-card .photo-block {
28 | max-width: 13em;
29 | max-height: 7em;
30 | float: left;
31 | margin: 0 0.5em 0.5em 0;
32 | }
33 |
34 | .preview-h-card .p-name {
35 | float: left;
36 | font-size: 2em;
37 | }
38 |
39 | /* h-entry validation */
40 | .preview-h-entry .p-author .u-photo {
41 | max-height: 2em;
42 | }
43 |
44 | .preview-h-entry .e-content {
45 | border-left: 0.5em #ddd solid;
46 | padding: 0.1em 0.5em;
47 | font-size: 0.9em;
48 | color: #333;
49 | background: #fff;
50 | }
51 |
52 | li {
53 | line-height: 1.6;
54 | }
--------------------------------------------------------------------------------
/web/less/modules/type.less:
--------------------------------------------------------------------------------
1 | // Typography
2 | // --------------------------------------------------
3 |
4 | body {
5 | color: @base;
6 | font-family: @base-font-family;
7 | font-size: @base-font-size;
8 | line-height: @base-line-height;
9 | }
10 |
11 | input,
12 | button,
13 | select,
14 | textarea {
15 | font-family: @base-font-family;
16 | font-size: @base-font-size;
17 | }
18 |
19 | a {
20 | color: @link-color;
21 | text-decoration: underline;
22 | .transition(0.25s);
23 |
24 | &:hover {
25 | color: @link-hover-color;
26 | text-decoration: none;
27 | }
28 | }
29 |
30 | // H1—H6 specific styling
31 | h1 {
32 | font-size: 32px;
33 | font-weight: 900;
34 | }
35 | h2 {
36 | font-size: 26px;
37 | font-weight: 700;
38 | margin-bottom: 2px;
39 | }
40 | h3 {
41 | font-size: 24px;
42 | font-weight: 700;
43 | margin-bottom: 4px;
44 | margin-top: 2px;
45 | }
46 | h4 {
47 | font-size: 18px;
48 | font-weight: 500;
49 | margin-top: 4px;
50 | }
51 | h5 {
52 | font-size: 16px;
53 | font-weight: 500;
54 | text-transform: uppercase;
55 | }
56 | h6 {
57 | font-size: 13px;
58 | font-weight: 500;
59 | text-transform: uppercase;
60 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # IndieWebify.me
2 |
3 | This tool offers a fast and easy way to get you & your website on the Indieweb, to use go to [indiewebify.me](http://indiewebify.me).
4 |
5 | To learn more about the IndieWeb go to [indieweb.org](https://indieweb.org).
6 |
7 | Made by Brennan Novak, Barnaby Walters, and others at the 2013 IndieWebCamps in [Reykjavik](http://indieweb.org/2013/#Remote_Indiewebcamp_Parties) and [Brighton](http://indieweb.org/2013/UK).
8 |
9 | ## Installation
10 |
11 | Requirements:
12 | * PHP 7.2
13 |
14 | How to run your own instance of indiewebify.me for development:
15 |
16 | 1. `git clone https://github.com/indieweb/indiewebify-me.git && cd indiewebify-me`
17 | 1. If you don’t have [Composer](https://getcomposer.org) installed, do so:
18 | * `curl -s https://getcomposer.org/installer | php`
19 | 1. Install dependencies: `./composer.phar install`
20 | 1. Point your web server at `indiewebify-me/web/`.
21 | * The included .htaccess should route apache requests correctly. For other servers file an issue or send us a pull request
22 |
23 | All of the interesting stuff is in `/web/index.php` — or at least is until that gets too big and needs moving.
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/web/less/flat-ui.less:
--------------------------------------------------------------------------------
1 | // Flat UI main stylesheet that aggregates all modules
2 |
3 | // Loading custom fonts
4 | @import url("https://fonts.googleapis.com/css?family=Lato:400,700,700italic,900,400italic,300");
5 | @import "icon-font";
6 |
7 | // Loading config with variables (changing them leads to changing a color scheme)
8 | @import "config";
9 |
10 | // Utility mixins for greater good
11 | @import "mixins";
12 |
13 | // Modules
14 | @import "modules/demo";
15 | @import "modules/type";
16 | @import "modules/buttons";
17 | @import "modules/caret";
18 | @import "modules/navbar";
19 | @import "modules/select";
20 | @import "modules/input";
21 | @import "modules/checkbox-and-radio";
22 | @import "modules/tagsinput";
23 | @import "modules/progress";
24 | @import "modules/ui-slider";
25 | @import "modules/pager";
26 | @import "modules/pagination";
27 | @import "modules/tooltip";
28 | @import "modules/dropdown";
29 | @import "modules/switch";
30 | @import "modules/share";
31 | @import "modules/palette";
32 | @import "modules/tile";
33 | @import "modules/todo";
34 | @import "modules/footer";
35 | @import "modules/video";
36 | @import "modules/login";
37 |
38 | // Spaces
39 | @import "spaces";
40 |
--------------------------------------------------------------------------------
/web/js/jquery.ui.touch-punch.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | * jQuery UI Touch Punch 0.2.2
3 | *
4 | * Copyright 2011, Dave Furfero
5 | * Dual licensed under the MIT or GPL Version 2 licenses.
6 | *
7 | * Depends:
8 | * jquery.ui.widget.js
9 | * jquery.ui.mouse.js
10 | */
11 | (function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return;}var c=b.ui.mouse.prototype,e=c._mouseInit,a;function d(g,h){if(g.originalEvent.touches.length>1){return;}g.preventDefault();var i=g.originalEvent.changedTouches[0],f=document.createEvent("MouseEvents");f.initMouseEvent(h,true,true,window,1,i.screenX,i.screenY,i.clientX,i.clientY,false,false,false,false,0,null);g.target.dispatchEvent(f);}c._touchStart=function(g){var f=this;if(a||!f._mouseCapture(g.originalEvent.changedTouches[0])){return;}a=true;f._touchMoved=false;d(g,"mouseover");d(g,"mousemove");d(g,"mousedown");};c._touchMove=function(f){if(!a){return;}this._touchMoved=true;d(f,"mousemove");};c._touchEnd=function(f){if(!a){return;}d(f,"mouseup");d(f,"mouseout");if(!this._touchMoved){d(f,"click");}a=false;};c._mouseInit=function(){var f=this;f.element.bind("touchstart",b.proxy(f,"_touchStart")).bind("touchmove",b.proxy(f,"_touchMove")).bind("touchend",b.proxy(f,"_touchEnd"));e.call(f);};})(jQuery);
--------------------------------------------------------------------------------
/web/less/modules/tooltip.less:
--------------------------------------------------------------------------------
1 | // Tooltip
2 | // --------------------------------------------------
3 |
4 | .tooltip {
5 | font-size: @base-font-size;
6 |
7 | &.in {
8 | opacity: 1;
9 | }
10 | &.top {
11 | padding-bottom: 9px;
12 |
13 | .tooltip-arrow {
14 | border-top-color: @base;
15 | border-width: 9px 9px 0;
16 | bottom: 0;
17 | margin-left: -9px;
18 | }
19 | }
20 | &.right {
21 | .tooltip-arrow {
22 | border-right-color: @base;
23 | border-width: 9px 9px 9px 0;
24 | margin-top: -9px;
25 | left: -3px;
26 | }
27 | }
28 | &.bottom {
29 | padding-top: 8px;
30 |
31 | .tooltip-arrow {
32 | border-bottom-color: @base;
33 | border-width: 0 9px 9px;
34 | margin-left: -9px;
35 | top: -1px;
36 | }
37 | }
38 | &.left {
39 | .tooltip-arrow {
40 | border-left-color: @base;
41 | border-width: 9px 0 9px 9px;
42 | margin-top: -9px;
43 | right: -3px;
44 | }
45 | }
46 | }
47 |
48 | .tooltip-inner {
49 | background-color: @base;
50 | line-height: @base-font-size * 1.285;
51 | padding: 12px 12px;
52 | text-align: center;
53 | width: 183px;
54 | .border-radius(6px);
55 | }
56 |
--------------------------------------------------------------------------------
/web/less/modules/palette.less:
--------------------------------------------------------------------------------
1 | //
2 | // Palette
3 | // --------------------------------------------------
4 |
5 | .palette {
6 | color: @inverse;
7 | margin: 0;
8 | padding: 15px;
9 | text-transform: uppercase;
10 |
11 | dt {
12 | display: block;
13 | font-weight: 500;
14 | .opacity(80);
15 | }
16 | dd {
17 | font-weight: 200;
18 | margin-left: 0;
19 | .opacity(80);
20 | }
21 | }
22 |
23 | //
24 | // Pallet grid
25 | // --------------------------------------------------
26 | .calc-color(~"turquoise", ~"green-sea");
27 | .calc-color(~"emerald", ~"nephritis");
28 | .calc-color(~"peter-river", ~"belize-hole");
29 | .calc-color(~"amethyst", ~"wisteria");
30 | .calc-color(~"wet-asphalt", ~"midnight-blue");
31 |
32 | .calc-color(~"sun-flower", ~"orange");
33 | .calc-color(~"carrot", ~"pumpkin");
34 | .calc-color(~"alizarin", ~"pomegranate");
35 | .calc-color(~"clouds", ~"silver");
36 | .calc-color(~"concrete", ~"asbestos");
37 |
38 | .palette-clouds {
39 | color: #bdc3c7;
40 | }
41 |
42 | // Palette paragraph
43 | .palette-paragraph {
44 | color: #7f8c8d;
45 | font-size: 12px;
46 | line-height: 17px;
47 |
48 | span {
49 | color: #bdc3c7;
50 | }
51 | }
52 |
53 | // Headline
54 | .palette-headline {
55 | color: #7f8c8d;
56 | font-weight: 700;
57 | margin-top: -5px;
58 | }
59 |
--------------------------------------------------------------------------------
/web/less/modules/pager.less:
--------------------------------------------------------------------------------
1 | //
2 | // Pager
3 | // --------------------------------------------------
4 |
5 | .pager {
6 | background-color: @base;
7 | border-radius: 6px;
8 | color: @inverse;
9 | font-size: 16px;
10 | font-weight: 700;
11 | .inline-block();
12 |
13 | li {
14 | &:first-child {
15 | > a,
16 | > span {
17 | border-left: none;
18 | .border-radius(6px 0 0 6px);
19 | }
20 | }
21 | &.pager-center {
22 | padding: @pager-padding;
23 | padding-left: 0;
24 | padding-right: 0;
25 | .inline-block();
26 | }
27 | > a,
28 | > span {
29 | background: none;
30 | border: none;
31 | border-left: 2px solid mix(@base, black, 85%);
32 | color: @inverse;
33 | padding: @pager-padding;
34 | text-decoration: none;
35 | white-space: nowrap;
36 | .border-radius(0 6px 6px 0);
37 |
38 | &:hover, &:focus {
39 | background-color: mix(@base, black, 85%);
40 | }
41 | &:active {
42 | background-color: mix(@base, black, 85%);
43 | }
44 |
45 | // Add some spacing between the icon and text
46 | [class*="fui-"] + span {
47 | margin-left: 8px;
48 | }
49 | span + [class*="fui-"] {
50 | margin-left: 8px;
51 | }
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/web/less/modules/ui-slider.less:
--------------------------------------------------------------------------------
1 | // Slider
2 | // --------------------------------------------------
3 |
4 | .ui-slider {
5 | .progress();
6 | margin-bottom: 20px;
7 | position: relative;
8 | }
9 |
10 | .ui-slider-handle {
11 | background-color: mix(@firm, black, 85%);
12 | border-radius: 50%;
13 | cursor: pointer;
14 | height: 18px;
15 | margin-left: -9px;
16 | position: absolute;
17 | top: -3px;
18 | width: 18px;
19 | z-index: 2;
20 | .transition(background 0.25s);
21 |
22 | &[style*='100'] {
23 | margin-left: -15px;
24 | }
25 | &:hover,
26 | &:focus {
27 | background-color: mix(@firm, white, 80%);
28 | outline: none;
29 | }
30 | &:active {
31 | background-color: mix(@firm, black, 85%);
32 | }
33 | }
34 |
35 | .ui-slider-range {
36 | background-color: @firm;
37 | border-radius: 30px 0 0 30px;
38 | display: block;
39 | height: 100%;
40 | position: absolute;
41 | z-index: 1;
42 | }
43 |
44 | .ui-slider-segment {
45 | background-color: mix(desaturate(@base, 15%), white, 20%);
46 | border-radius: 50%;
47 | float: left;
48 | height: 6px;
49 | margin: 3px -6px 0 0;
50 | width: 6px;
51 | }
52 |
53 | .ui-slider-value {
54 | float: right;
55 | font-weight: 500;
56 | margin-top: @progress-height;
57 |
58 | &.first {
59 | clear: left;
60 | float: left;
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/web/less/modules/footer.less:
--------------------------------------------------------------------------------
1 | //
2 | // Footer
3 | // --------------------------------------------------
4 |
5 | footer {
6 | background-color: mix(@base, @inverse, 9%);
7 | color: mix(@base, @inverse, 34%);
8 | font-size: 15px;
9 | padding: 0;
10 |
11 | a {
12 | color: mix(@base, @inverse, 50%);
13 | font-weight: 700;
14 | }
15 | p {
16 | font-size: 15px;
17 | line-height: 20px;
18 | }
19 | }
20 |
21 | .footer-title {
22 | margin: 0 0 22px;
23 | padding-top: 21px;
24 | }
25 |
26 | .footer-brand {
27 | display: block;
28 | margin-bottom: 26px;
29 | width: 220px;
30 |
31 | img {
32 | width: 216px;
33 | }
34 | }
35 |
36 | // FOOTER BANNER
37 | // ----------------------
38 | .footer-banner {
39 | background-color: @firm;
40 | color: mix(@firm, @inverse, 20%);
41 | margin-left: 42px;
42 | min-height: 286px;
43 | padding: 0 30px 30px;
44 |
45 | .footer-title {
46 | color: @inverse;
47 | }
48 | a {
49 | color: lighten(@firm, 42%);
50 | text-decoration: underline;
51 |
52 | &:hover {
53 | text-decoration: none;
54 | }
55 | }
56 | ul {
57 | list-style-type: none;
58 | margin: 0 0 26px;
59 |
60 | li {
61 | border-top: 1px solid lighten(@firm, 2%);
62 | line-height: 19px;
63 | padding: 6px 0;
64 |
65 | &:first-child {
66 | border-top: none;
67 | padding-top: 1px;
68 | }
69 | }
70 | }
71 | }
72 |
73 |
--------------------------------------------------------------------------------
/web/less/modules/tile.less:
--------------------------------------------------------------------------------
1 | //
2 | // Tile
3 | // -------------------------------------------------
4 |
5 | .tile {
6 | background-color: mix(@base, @inverse, 8%);
7 | border-radius: 6px;
8 | padding: 14px;
9 | position: relative;
10 | text-align: center;
11 |
12 | &.tile-hot {
13 | &:before {
14 | background: url(../images/tile/ribbon.png) 0 0 no-repeat;
15 | background-size: 82px 82px;
16 | content: '';
17 | height: 82px;
18 | position: absolute;
19 | right: -4px;
20 | top: -4px;
21 | width: 82px;
22 | }
23 | }
24 | p {
25 | font-size: 15px;
26 | margin-bottom: 33px;
27 | }
28 | }
29 | .tile-image {
30 | height: 100px;
31 | margin: 31px 0 27px;
32 | vertical-align: bottom;
33 |
34 | &.big-illustration {
35 | height: 111px;
36 | margin-top: 20px;
37 | width: 112px;
38 | }
39 | }
40 | .tile-title {
41 | font-size: 20px;
42 | margin: 0;
43 | }
44 |
45 | // Retina Support
46 | @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-moz-min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 2) {
47 | .tile {
48 | &.tile-hot {
49 | &:before {
50 | background-image: url(../images/tile/ribbon-2x.png);
51 | }
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/tests/html-test-runner.php:
--------------------------------------------------------------------------------
1 | parse();
16 |
17 | $testSuites = Mf2\findMicroformatsByType($mf, 'h-x-test-suite');
18 |
19 | if (count($testSuites) === 0)
20 | die("Found no test suites in rel-me-test.html");
21 |
22 | $testSuite = $testSuites[0];
23 |
24 | echo "\n" . Mf2\getProp($testSuite, 'name') . "\n";
25 | echo "============================\n";
26 |
27 | foreach ($testSuite['properties']['x-test-case'] as $testCase) {
28 | echo "\n";
29 | $params = $testCase['properties']['x-parameter'];
30 | $meUrl = array_shift($params);
31 | if (count($params) === 0)
32 | $redirects = mockFollowOneRedirect(array(null));
33 | else
34 | $redirects = mockFollowOneRedirect($params);
35 |
36 | list($expectedUrl, $expectedSecure) = $testCase['properties']['x-expected-result'];
37 | $expectedSecure = $expectedSecure === 'true';
38 |
39 | // Begin testing
40 | $meUrl = normaliseUrl($meUrl);
41 | list($url, $secure, $previous) = relMeDocumentUrl($meUrl, $redirects);
42 | // end testing
43 |
44 | if ($url === $expectedUrl and $secure === $expectedSecure):
45 | echo "(pass) " . Mf2\getProp($testCase, 'name') . "\n";
46 | else:
47 | echo "(fail) " . Mf2\getProp($testCase, 'name') . "\n";
48 | if ($url != $expectedUrl)
49 | echo "- {$url} should match {$expectedUrl}\n";
50 | if ($secure != $expectedSecure)
51 | echo "- {$secure} didn’t match {$expectedSecure}\n";
52 | endif;
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/web/js/icon-font-ie7.js:
--------------------------------------------------------------------------------
1 | /* Load this script using conditional IE comments if you need to support IE 7 and IE 6. */
2 |
3 | window.onload = function() {
4 | function addIcon(el, entity) {
5 | var html = el.innerHTML;
6 | el.innerHTML = '
' + entity + '' + html;
7 | }
8 | var icons = {
9 | 'fui-arrow-right' : '',
10 | 'fui-arrow-left' : '',
11 | 'fui-cmd' : '',
12 | 'fui-check-inverted' : '',
13 | 'fui-heart' : '',
14 | 'fui-location' : '',
15 | 'fui-plus' : '',
16 | 'fui-check' : '',
17 | 'fui-cross' : '',
18 | 'fui-list' : '',
19 | 'fui-new' : '',
20 | 'fui-video' : '',
21 | 'fui-photo' : '',
22 | 'fui-volume' : '',
23 | 'fui-time' : '',
24 | 'fui-eye' : '',
25 | 'fui-chat' : '',
26 | 'fui-search' : '',
27 | 'fui-user' : '',
28 | 'fui-mail' : '',
29 | 'fui-lock' : '',
30 | 'fui-gear' : '',
31 | 'fui-radio-unchecked' : '',
32 | 'fui-radio-checked' : '',
33 | 'fui-checkbox-unchecked' : '',
34 | 'fui-checkbox-checked' : '',
35 | 'fui-calendar-solid' : '',
36 | 'fui-pause' : '',
37 | 'fui-play' : '',
38 | 'fui-check-inverted-2' : ''
39 | },
40 | els = document.getElementsByTagName('*'),
41 | i, attr, html, c, el;
42 | for (i = 0; ; i += 1) {
43 | el = els[i];
44 | if(!el) {
45 | break;
46 | }
47 | attr = el.getAttribute('data-icon');
48 | if (attr) {
49 | addIcon(el, attr);
50 | }
51 | c = el.className;
52 | c = c.match(/fui-[^\s'"]+/);
53 | if (c && icons[c[0]]) {
54 | addIcon(el, icons[c[0]]);
55 | }
56 | }
57 | };
--------------------------------------------------------------------------------
/web/js/jquery.stacktable.js:
--------------------------------------------------------------------------------
1 | /**
2 | * MODIFIED CAUSE WE NEEDED OUR OWN MARKUP
3 | * stacktable.js
4 | * Author & copyright (c) 2012: John Polacek
5 | * Dual MIT & GPL license
6 | *
7 | * Page: http://johnpolacek.github.com/stacktable.js
8 | * Repo: https://github.com/johnpolacek/stacktable.js/
9 | *
10 | * jQuery plugin for stacking tables on small screens
11 | *
12 | */
13 | ;(function($) {
14 |
15 | $.fn.stacktable = function(options) {
16 | var $tables = this,
17 | defaults = {id:'stacktable',hideOriginal:false},
18 | settings = $.extend({}, defaults, options),
19 | stacktable;
20 |
21 | return $tables.each(function() {
22 | var $stacktable = $('
');
23 | if (typeof settings.myClass !== undefined) $stacktable.addClass(settings.myClass);
24 | var markup = '';
25 | $table = $(this);
26 | $topRow = $table.find('tr').eq(0);
27 | $table.find('tr').each(function(index,value) {
28 | var zebra = "";
29 | if (index % 2 === 0) {
30 | zebra = "even";
31 | } else {
32 | zebra = "odd";
33 | }
34 | markup += '
';
35 | $(this).find('td').each(function(index,value) {
36 | if ($(this).html() !== ''){
37 | markup += '
';
38 | if ($topRow.find('td,th').eq(index).html()){
39 | markup += '| '+$topRow.find('td,th').eq(index).html()+' | ';
40 | } else {
41 | markup += ' | ';
42 | }
43 | markup += ''+$(this).html()+' | ';
44 | markup += '
';
45 | }
46 | });
47 | });
48 | $stacktable.append($(markup));
49 | $table.before($stacktable);
50 | if (settings.hideOriginal) $table.hide();
51 | });
52 | };
53 |
54 | }(jQuery));
55 |
--------------------------------------------------------------------------------
/web/less/modules/checkbox-and-radio.less:
--------------------------------------------------------------------------------
1 | //
2 | // Checkbox & Radio
3 | // --------------------------------------------------
4 |
5 | .checkbox,
6 | .radio {
7 | margin-bottom: 12px;
8 | padding-left: 32px;
9 | position: relative;
10 | .transition(color .25s linear);
11 |
12 | input {
13 | outline: none !important;
14 | display: none;
15 | }
16 |
17 | // Replace icons
18 | // --------------------------------------------------
19 | .icons {
20 | color: @lightgray;
21 | display: block;
22 | height: 20px;
23 | left: 0;
24 | position: absolute;
25 | top: 0;
26 | width: 20px;
27 | text-align: center;
28 | line-height: 20px;
29 | font-size: 20px;
30 | .transition(color .25s linear);
31 |
32 | .first-icon-icon,
33 | .second-icon {
34 | position: absolute;
35 | left: 0;
36 | top: 0;
37 | .opacity(100);
38 | }
39 | .second-icon {
40 | .opacity(0);
41 | }
42 | }
43 |
44 | // Alternate States
45 | // --------------------------------------------------
46 |
47 | // Hover State
48 | &:hover {
49 | .first-icon {
50 | .opacity(0);
51 | }
52 | .second-icon {
53 | .opacity(100);
54 | }
55 | }
56 |
57 | // Checked State
58 | &.checked {
59 | color: @link-color;
60 |
61 | .icons {
62 | color: @firm;
63 | }
64 | .first-icon {
65 | .opacity(0);
66 | }
67 | .second-icon {
68 | .opacity(100);
69 | }
70 | }
71 |
72 | // Disabled state
73 | &.disabled {
74 | cursor: default;
75 | color: mix(@lightgray, white, 38%);
76 |
77 | .icons {
78 | color: mix(@lightgray, white, 38%);
79 | }
80 | .first-icon {
81 | .opacity(100);
82 | }
83 | .second-icon {
84 | .opacity(0);
85 | }
86 | &.checked {
87 | .icons {
88 | color: mix(@lightgray, white, 38%);
89 | }
90 | .first-icon {
91 | .opacity(0);
92 | }
93 | .second-icon {
94 | .opacity(100);
95 | }
96 | }
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/web/js/application.js:
--------------------------------------------------------------------------------
1 | // Some general UI pack related JS
2 | // Extend JS String with repeat method
3 | String.prototype.repeat = function(num) {
4 | return new Array(num + 1).join(this);
5 | };
6 |
7 | (function($) {
8 |
9 | // Add segments to a slider
10 | $.fn.addSliderSegments = function (amount) {
11 | return this.each(function () {
12 | var segmentGap = 100 / (amount - 1) + "%"
13 | , segment = "
";
14 | $(this).prepend(segment.repeat(amount - 2));
15 | });
16 | };
17 |
18 | $(function() {
19 |
20 | // Todo list
21 | $(".todo li").click(function() {
22 | $(this).toggleClass("todo-done");
23 | });
24 |
25 | // Custom Select
26 | $("select[name='herolist']").selectpicker({style: 'btn-primary', menuStyle: 'dropdown-inverse'});
27 |
28 | // Tooltips
29 | $("[data-toggle=tooltip]").tooltip("show");
30 |
31 | // Tags Input
32 | $(".tagsinput").tagsInput();
33 |
34 | // jQuery UI Sliders
35 | var $slider = $("#slider");
36 | if ($slider.length) {
37 | $slider.slider({
38 | min: 1,
39 | max: 5,
40 | value: 2,
41 | orientation: "horizontal",
42 | range: "min"
43 | }).addSliderSegments($slider.slider("option").max);
44 | }
45 |
46 | // Placeholders for input/textarea
47 | $("input, textarea").placeholder();
48 |
49 | // Make pagination demo work
50 | $(".pagination a").on('click', function() {
51 | $(this).parent().siblings("li").removeClass("active").end().addClass("active");
52 | });
53 |
54 | $(".btn-group a").on('click', function() {
55 | $(this).siblings().removeClass("active").end().addClass("active");
56 | });
57 |
58 | // Disable link clicks to prevent page scrolling
59 | $('a[href="#fakelink"]').on('click', function (e) {
60 | e.preventDefault();
61 | });
62 |
63 | // Switch
64 | $("[data-toggle='switch']").wrap('
').parent().bootstrapSwitch();
65 |
66 | });
67 |
68 | })(jQuery);
--------------------------------------------------------------------------------
/web/js/html5shiv.js:
--------------------------------------------------------------------------------
1 | /*
2 | HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
3 | */
4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x";
6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="
";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();
8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/templates/validate-rel-me.html.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Become a citizen of the IndieWeb Level 1
5 |
6 |
1. Get your own domain name
7 |
8 |
A personal domain name is an inexpensive, internationally universal identifier which gives you more control over your space than other IDs (e.g. email address or phone number.)
9 |
10 |
On the wiki: Personal Domains.
11 |
12 |
2. Set up Web Sign In
13 |
14 |
In order to be able to sign in using your domain name, connect it to your existing identities.
15 |
16 |
You probably already have many disconnected profiles on the web. Linking between them and your domain name with the rel=me microformat ensures that it’s easy to see that you on Google/Twitter/Github/Flickr/Facebook/email are all the same person as your domain name.
17 |
18 |
On the wiki: How to set up Web Sign In.
19 |
20 |
21 |
22 |
23 |
Something Went Wrong!
24 |
When fetching = $url ?>, we got this problem:
25 |
= $error['message'] ?>
26 |
27 |
28 |
We found the following rel=me URLs on your site:
29 |
30 |
35 |
36 |
37 | = $render('silo-hint.html', array('url' => $url)) ?>
38 |
39 |
40 |
41 |
49 |
50 |
Want to be able to use rel-me data in your code? Check out the open source implementations.
51 |
52 |
53 |
54 |
Home | Next Step
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/web/less/modules/tagsinput.less:
--------------------------------------------------------------------------------
1 | //
2 | // Tags Input
3 | // --------------------------------------------------
4 |
5 | .tagsinput {
6 | background: white;
7 | border: 2px solid @firm;
8 | border-radius: 6px;
9 | height: 100px;
10 | margin-bottom: 18px;
11 | padding: 6px 1px 1px 6px;
12 | overflow-y: auto;
13 | text-align: left;
14 |
15 | .tag {
16 | border-radius: 4px;
17 | background-color: @firm;
18 | color: @inverse;
19 | cursor: pointer;
20 | margin-right: 5px;
21 | margin-bottom: 5px;
22 | overflow: hidden;
23 | line-height: 15px;
24 | padding: 6px 13px 8px 19px;
25 | position: relative;
26 | vertical-align: middle;
27 | .inline-block();
28 | .transition(0.14s linear);
29 |
30 | &:hover {
31 | background-color: mix(@firm, black, 85%);
32 | color: @inverse;
33 | padding-left: 12px;
34 | padding-right: 20px;
35 |
36 | .tagsinput-remove-link {
37 | color: @inverse;
38 | opacity: 1;
39 | // Opacity fallback for IE
40 | display: block\9;
41 | }
42 | }
43 | }
44 |
45 | input {
46 | background: transparent;
47 | border: none;
48 | color: @base;
49 | font-family: @base-font-family;
50 | font-size: @base-font-size;
51 | margin: 0px;
52 | padding: 0 0 0 5px;
53 | outline: 0;
54 | margin-right: 5px;
55 | margin-bottom: 5px;
56 | width: 12px;
57 | }
58 | }
59 |
60 | .tagsinput-remove-link {
61 | bottom: 0;
62 | color: @inverse;
63 | cursor: pointer;
64 | font-size: 12px;
65 | opacity: 0;
66 | padding: 7px 7px 5px 0;
67 | position: absolute;
68 | right: 0;
69 | text-align: right;
70 | text-decoration: none;
71 | top: 0;
72 | width: 100%;
73 | z-index: 2;
74 | // Opacity fallback for IE
75 | display: none\9;
76 |
77 | &:before {
78 | color: @inverse;
79 | content: "\e00b";
80 | font-family: "Flat-UI-Icons";
81 | }
82 | }
83 |
84 | .tagsinput-add-container {
85 | vertical-align: middle;
86 | .inline-block();
87 | }
88 |
89 | .tagsinput-add {
90 | background-color: mix(@inverse, @base, 80%);
91 | border-radius: 3px;
92 | color: @inverse;
93 | cursor: pointer;
94 | margin-bottom: 5px;
95 | padding: 6px 9px;
96 | .inline-block();
97 | .transition(0.25s);
98 |
99 | &:hover {
100 | background-color: @firm;
101 | }
102 | &:before {
103 | content: "\e009";
104 | font-family: "Flat-UI-Icons";
105 | }
106 | }
107 |
108 | .tags_clear {
109 | clear: both;
110 | width: 100%;
111 | height: 0px;
112 | }
113 | .not_valid {
114 | background: #fbd8db !important;
115 | color: #90111a !important;
116 | }
117 |
118 |
--------------------------------------------------------------------------------
/web/less/modules/todo.less:
--------------------------------------------------------------------------------
1 | //
2 | // Todo list
3 | // --------------------------------------------------
4 |
5 | .todo {
6 | background-color: mix(@base, black, 85%);
7 | color: mix(@base, @inverse, 66%);
8 | margin-bottom: 20px;
9 | .border-radius(8px 8px 6px 6px);
10 |
11 | ul {
12 | margin: 0;
13 | list-style-type: none;
14 | }
15 | li {
16 | background: @base url(../images/todo/todo.png) 92% center no-repeat;
17 | background-size: 20px 20px;
18 | cursor: pointer;
19 | margin-top: 2px;
20 | padding: 18px 42px 17px 25px;
21 | position: relative;
22 | .transition(.25s);
23 |
24 | &:first-child {
25 | margin-top: 0;
26 | }
27 | &:last-child {
28 | .border-radius(0 0 6px 6px);
29 | padding-bottom: 18px;
30 | }
31 | &.todo-done {
32 | background: transparent url(../images/todo/done.png) 92% center no-repeat;
33 | background-size: 20px 20px;
34 | color: @firm;
35 |
36 | .todo-name {
37 | color: @firm;
38 | }
39 | }
40 | }
41 | }
42 |
43 | .todo-search {
44 | position: relative;
45 | background: @firm;
46 | background-size: 16px 16px;
47 | border-radius: 6px 6px 0 0;
48 | color: @base;
49 | padding: 19px 25px 20px;
50 |
51 | &:before {
52 | position: absolute;
53 | font-family: 'Flat-UI-Icons';
54 | content: "\e01c";
55 | font-size: 16px;
56 | display: inline-block;
57 | top: 50%;
58 | left: 92%;
59 | margin: -0.5em 0 0 -1em;
60 | }
61 | }
62 |
63 | input.todo-search-field {
64 | background: none;
65 | border: none;
66 | color: @base;
67 | font-size: 19px;
68 | font-weight: 700;
69 | margin: 0;
70 | line-height: 23px;
71 | padding: 5px 0;
72 | text-indent: 0;
73 | .box-shadow(none);
74 | .placeholder-color(@base);
75 | }
76 |
77 | .todo-icon {
78 | float: left;
79 | font-size: 24px;
80 | padding: 11px 22px 0 0;
81 | }
82 |
83 | .todo-content {
84 | padding-top: 1px;
85 | overflow: hidden;
86 | }
87 |
88 | .todo-name {
89 | color: @inverse;
90 | font-size: 17px;
91 | margin: 1px 0 3px;
92 | }
93 |
94 | // Retina Support
95 | @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-moz-min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 2) {
96 | .todo {
97 | li {
98 | background-image: url(../images/todo/todo-2x.png);
99 |
100 | &.todo-done {
101 | background-image: url(../images/todo/done-2x.png);
102 | }
103 | }
104 | }
105 | .todo-search {
106 | background-image: url(../images/todo/search-2x.png);
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/web/less/spaces.less:
--------------------------------------------------------------------------------
1 | // Should be used to modify the default spacing between objects (not between nodes of * the same object)
2 | // p,m = padding,margin
3 | // a,t,r,b,l,h,v = all,top,right,bottom,left,horizontal,vertical
4 | // x,s,m,l,n = extra-small(@x),small(@s),medium(@m),large(@l),none(0px)
5 | @x: 3px;
6 | @s: 5px;
7 | @m: 10px;
8 | @l: 20px;
9 |
10 | .last-col {
11 | overflow: hidden;
12 | }
13 |
14 | .ptn, .pvn, .pan {
15 | padding-top: 0;
16 | }
17 |
18 | .ptx, .pvx, .pax {
19 | padding-top: @x;
20 | }
21 |
22 | .pts, .pvs, .pas {
23 | padding-top: @s;
24 | }
25 |
26 | .ptm, .pvm, .pam {
27 | padding-top: @m;
28 | }
29 |
30 | .ptl, .pvl, .pal {
31 | padding-top: @l;
32 | }
33 |
34 | .prn, .phn, .pan {
35 | padding-right: 0;
36 | }
37 |
38 | .prx, .phx, .pax {
39 | padding-right: @x;
40 | }
41 |
42 | .prs, .phs, .pas {
43 | padding-right: @s;
44 | }
45 |
46 | .prm, .phm, .pam {
47 | padding-right: @m;
48 | }
49 |
50 | .prl, .phl, .pal {
51 | padding-right: @l;
52 | }
53 |
54 | .pbn, .pvn, .pan {
55 | padding-bottom: 0;
56 | }
57 |
58 | .pbx, .pvx, .pax {
59 | padding-bottom: @x;
60 | }
61 |
62 | .pbs, .pvs, .pas {
63 | padding-bottom: @s;
64 | }
65 |
66 | .pbm, .pvm, .pam {
67 | padding-bottom: @m;
68 | }
69 |
70 | .pbl, .pvl, .pal {
71 | padding-bottom: @l;
72 | }
73 |
74 | .pln, .phn, .pan {
75 | padding-left: 0;
76 | }
77 |
78 | .plx, .phx, .pax {
79 | padding-left: @x;
80 | }
81 |
82 | .pls, .phs, .pas {
83 | padding-left: @s;
84 | }
85 |
86 | .plm, .phm, .pam {
87 | padding-left: @m;
88 | }
89 |
90 | .pll, .phl, .pal {
91 | padding-left: @l;
92 | }
93 |
94 | .mtn, .mvn, .man {
95 | margin-top: 0px;
96 | }
97 |
98 | .mtx, .mvx, .max {
99 | margin-top: @x;
100 | }
101 |
102 | .mts, .mvs, .mas {
103 | margin-top: @s;
104 | }
105 |
106 | .mtm, .mvm, .mam {
107 | margin-top: @m;
108 | }
109 |
110 | .mtl, .mvl, .mal {
111 | margin-top: @l;
112 | }
113 |
114 | .mrn, .mhn, .man {
115 | margin-right: 0px;
116 | }
117 |
118 | .mrx, .mhx, .max {
119 | margin-right: @x;
120 | }
121 |
122 | .mrs, .mhs, .mas {
123 | margin-right: @s;
124 | }
125 |
126 | .mrm, .mhm, .mam {
127 | margin-right: @m;
128 | }
129 |
130 | .mrl, .mhl, .mal {
131 | margin-right: @l;
132 | }
133 |
134 | .mbn, .mvn, .man {
135 | margin-bottom: 0px;
136 | }
137 |
138 | .mbx, .mvx, .max {
139 | margin-bottom: @x;
140 | }
141 |
142 | .mbs, .mvs, .mas {
143 | margin-bottom: @s;
144 | }
145 |
146 | .mbm, .mvm, .mam {
147 | margin-bottom: @m;
148 | }
149 |
150 | .mbl, .mvl, .mal {
151 | margin-bottom: @l;
152 | }
153 |
154 | .mln, .mhn, .man {
155 | margin-left: 0px;
156 | }
157 |
158 | .mlx, .mhx, .max {
159 | margin-left: @x;
160 | }
161 |
162 | .mls, .mhs, .mas {
163 | margin-left: @s;
164 | }
165 |
166 | .mlm, .mhm, .mam {
167 | margin-left: @m;
168 | }
169 |
170 | .mll, .mhl, .mal {
171 | margin-left: @l;
172 | }
173 |
--------------------------------------------------------------------------------
/templates/send-webmentions.html.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
2. Add the ability to send Webmentions to other IndieWeb sites
5 |
6 |
When you reply to something on another indieweb site, or mention someone with an indieweb site, sending a webmention lets them know they’ve been linked to.
7 |
8 |
Sending webmentions allows you to write replies to other content and participate in cross-site conversations. You can send webmentions by:
9 |
10 |
17 |
18 |
On the wiki: webmention
19 |
20 |
21 |
22 |
23 |
Something Went Wrong!
24 |
When sending webmentions and pingbacks for = $url ?>, we got this problem:
25 |
= $error['message'] ?>
26 |
27 |
Successfully sent = $numSent ?> webmentions/pingbacks from = $url ?>
28 |
29 |
30 |
31 |
32 |
No h-entries were found on = $url ?>!
33 |
34 |
When you send webmentions from a page, the pages you’ve mentioned will usually fetch it and parse it for h-entry markup, to display as comments or notifications. You should mark up your posts with h-entry so the people you mention can do something useful with the information.
35 |
36 |
37 |
38 |
39 |
40 |
48 |
49 |
50 |
51 |
Previous Step | Home
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/web/less/modules/login.less:
--------------------------------------------------------------------------------
1 | //
2 | // Login screen
3 | // --------------------------------------------------
4 |
5 | // Module color variable
6 | @form-color: mix(@base, @inverse, 9%);
7 |
8 | .login {
9 | background: url(../images/login/imac.png) 0 0 no-repeat;
10 | background-size: 940px 778px;
11 | color: @inverse;
12 | margin-bottom: 77px;
13 | padding: 38px 38px 267px;
14 | position: relative;
15 | }
16 |
17 | .login-screen {
18 | background-color: @firm;
19 | min-height: 317px;
20 | padding: 123px 199px 33px 306px;
21 | }
22 |
23 | .login-icon {
24 | left: 200px;
25 | position: absolute;
26 | top: 160px;
27 | width: 96px;
28 |
29 | > img {
30 | display: block;
31 | margin-bottom: 6px;
32 | width: 100%;
33 | }
34 | > h4 {
35 | font-size: 17px;
36 | font-weight: 200;
37 | line-height: 34px;
38 | .opacity(95);
39 |
40 | small {
41 | color: inherit;
42 | display: block;
43 | font-size: inherit;
44 | font-weight: 700;
45 | }
46 | }
47 | }
48 |
49 | // LOGIN FORM
50 | // -----------
51 | .login-form {
52 | background-color: @form-color;
53 | padding: 24px 23px 20px;
54 | position: relative;
55 | .border-radius(6px);
56 |
57 | // Ear
58 | &:before {
59 | content: '';
60 | border-style: solid;
61 | border-width: 12px 12px 12px 0;
62 | border-color: transparent @form-color transparent transparent;
63 | height: 0;
64 | position: absolute;
65 | left: -12px;
66 | top: 35px;
67 | width: 0;
68 | -webkit-transform: rotate(360deg); // Make corners smooth
69 | }
70 | .control-group {
71 | margin-bottom: 6px;
72 | position: relative;
73 | }
74 | .login-field {
75 | border-color: transparent;
76 | font-size: 17px;
77 | padding-bottom: 11px;
78 | padding-top: 11px;
79 | text-indent: 3px;
80 | width: 299px;
81 | margin-bottom: 10px !important;
82 |
83 | &:focus {
84 | & + .login-field-icon {
85 | color: @firm;
86 | }
87 | }
88 | }
89 | .login-field-icon {
90 | color: mix(@gray, @inverse, 60%);
91 | font-size: 16px;
92 | position: absolute;
93 | right: 13px;
94 | top: 14px;
95 | .transition(.25s);
96 | }
97 | }
98 |
99 | .login-link {
100 | color: mix(@gray, @inverse, 60%);
101 | display: block;
102 | font-size: 13px;
103 | margin-top: 15px;
104 | text-align: center;
105 | }
106 |
107 | // Retina support
108 | @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-moz-min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 2) {
109 | .login {
110 | background-image: url(../images/login/imac-2x.png);
111 | }
112 | }
113 |
114 |
--------------------------------------------------------------------------------
/templates/silo-hint.html.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
13 |
14 |
15 |
It looks like your site is hosted on Tumblr.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Tumblr has an article demonstrating how to give your web presence your own domain.
16 |
Once you’ve got your own domain, check out the IndieWeb Tumblr wiki page for tips on adding indieweb functionality to your site, or exporting your data elsewhere.
17 |
18 |
19 |
20 |
21 |
It looks like your site is hosted on Github.io Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Github has an article demonstrating how to give your web presence your own domain.
22 |
Once you’ve got your own domain, check out the IndieWeb Github wiki page for tips on adding indieweb functionality to your site.
23 |
24 |
25 |
26 | It looks like you’re using WordPress to power your site — check out the IndieWeb WordPress wiki page for tips on how to indiewebify your WordPress site!
27 |
28 |
29 | It looks like you’re using MediaWiki to power your site — check out the IndieWeb MediaWiki wiki page for tips on how to indiewebify your MediaWiki site!
30 |
31 |
32 | It looks like you’re using idno to power your site — check out the IndieWeb idno wiki page for tips on how to indiewebify your idno site!
33 |
34 |
--------------------------------------------------------------------------------
/tests/rel-me-test.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | rel-me test suite
5 |
6 |
7 |
8 | rel-me Document URL Tests
9 |
10 | Given the raw “me” URL the use is trying to authenticate as, fetch it and follow redirects until either the end of the chain is reached, a redirect loop is encountered or the scheme changes.
11 |
12 |
13 |
No Redirect
14 |
15 |
The simplest case, where fetching the given “me” URL results in no redirect.
16 |
17 |
Given a “me” URL of http://waterpigs.co.uk, which redirects nowhere, the result should be http://waterpigs.co.uk/ (secure) — note the trailing slash, a product of normalising the URL.
18 |
19 |
20 |
21 |
Single Secure HTTP Redirect
22 |
23 |
Just like the previous case except with one, non-scheme-altering redirect between the me URL and the final rel-me document URL.
24 |
25 |
Given a “me” URL of http://example.org, which redirects to http://foo.com/, the result should be http://foo.com/ (secure).
26 |
27 |
28 |
29 |
Multiple Secure HTTP Redirects
30 |
31 |
Just like the previous case but with multiple non-scheme-altering redirects.
32 |
33 |
Given a “me” URL of http://example.org, which redirects to http://example.com, which in turn redirects to http://foo.com/, the result should be http://foo.com/ (secure).
34 |
35 |
36 |
37 |
Single Secure HTTPS Redirect
38 |
39 |
Just like the first case but with https.
40 |
41 |
Given a “me” URL of https://example.org, which doesn’t redirect anywhere, the result should be https://example.org/ (secure).
42 |
43 |
44 |
45 |
Single Insecure Redirect
46 |
47 |
Given a “me” URL of http://example.org, which redirects to https://example.com/ (note change from HTTP to HTTPS), the result should be https://example.com/ (insecure).
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/web/less/modules/select.less:
--------------------------------------------------------------------------------
1 | //
2 | // Bootstrap Select
3 | // --------------------------------------------------
4 | // Credits: Silvio Moreto
5 | // http://github.com/silviomoreto/bootstrap-select
6 |
7 | .select {
8 | display: inline-block;
9 | margin-bottom: 10px;
10 |
11 | // Select grid
12 | &[class*="span"] {
13 | [class*="span"] > & {
14 | margin-left: 0; // No margin if select is a closest child of the grid
15 | }
16 | .btn {
17 | width: 100%; // Button should take all available space of its parent
18 | .box-sizing();
19 | }
20 | }
21 |
22 | // Fluid width. Takes all available space and behaves like a block
23 | &.select-block {
24 | display: block;
25 | float: none;
26 | margin-left: 0;
27 | width: auto;
28 |
29 | .btn {
30 | width: 100%;
31 | .box-sizing();
32 | }
33 | }
34 |
35 |
36 | // Button Sizes
37 | // --------------------------------------------------
38 |
39 | .btn {
40 | width: 220px; // Default select width until .span* is applied
41 |
42 | // Huge
43 | &.btn-huge {
44 | .filter-option {
45 | left: 20px;
46 | right: 40px;
47 | top: 16px;
48 | }
49 | .caret {
50 | right: 20px;
51 | }
52 | }
53 |
54 | // Large
55 | &.btn-large {
56 | .filter-option {
57 | left: 18px;
58 | right: 38px;
59 | top: 12px;
60 | }
61 | }
62 |
63 | // Small
64 | &.btn-small {
65 | .filter-option {
66 | left: 13px;
67 | right: 33px;
68 | top: 7px;
69 | }
70 | .caret {
71 | right: 13px;
72 | }
73 | }
74 |
75 | // Mini
76 | &.btn-mini {
77 | .filter-option {
78 | left: 13px;
79 | right: 33px;
80 | top: 5px;
81 | }
82 | .caret {
83 | right: 13px;
84 | }
85 | }
86 | .filter-option {
87 | height: 26px;
88 | left: 13px;
89 | overflow: hidden;
90 | position: absolute;
91 | right: 33px;
92 | text-align: left;
93 | top: 10px;
94 | }
95 | .caret {
96 | position: absolute;
97 | right: 16px;
98 | }
99 | .dropdown-toggle {
100 | .border-radius(6px);
101 | }
102 |
103 | // Dropdown menu
104 | .dropdown-menu {
105 | min-width: 100%;
106 | .box-sizing;
107 |
108 | dt {
109 | cursor: default;
110 | display: block;
111 | padding: 3px 20px;
112 | }
113 | li {
114 | &:not(.disabled) > a:hover small {
115 | color: fade(@inverse, .4);
116 | }
117 | > a {
118 | min-height: 20px;
119 |
120 | &.opt {
121 | padding-left: 35px;
122 | }
123 | }
124 | small {
125 | padding-left: 0.5em;
126 | }
127 | > dt small {
128 | font-weight: normal;
129 | }
130 | }
131 | }
132 |
133 | // Disabled state
134 | > .disabled,
135 | .dropdown-menu li.disabled > a {
136 | cursor: default;
137 | }
138 | }
139 |
140 | // Caret
141 | .caret {
142 | .caret(@inverse);
143 | }
144 | }
145 |
146 |
--------------------------------------------------------------------------------
/web/less/icon-font.less:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'Flat-UI-Icons';
3 | src:url('../fonts/Flat-UI-Icons.eot');
4 | src:url('../fonts/Flat-UI-Icons.eot?#iefix') format('embedded-opentype'),
5 | url('../fonts/Flat-UI-Icons.woff') format('woff'),
6 | url('../fonts/Flat-UI-Icons.ttf') format('truetype'),
7 | url('../fonts/Flat-UI-Icons.svg#Flat-UI-Icons') format('svg');
8 | font-weight: normal;
9 | font-style: normal;
10 | }
11 |
12 | /* Use the following CSS code if you want to use data attributes for inserting your icons */
13 | [data-icon]:before {
14 | font-family: 'Flat-UI-Icons';
15 | content: attr(data-icon);
16 | speak: none;
17 | font-weight: normal;
18 | font-variant: normal;
19 | text-transform: none;
20 | -webkit-font-smoothing: antialiased;
21 | }
22 |
23 | /* Use the following CSS code if you want to have a class per icon */
24 | /*
25 | Instead of a list of all class selectors,
26 | you can use the generic selector below, but it's slower:
27 | [class*="fui-"] {
28 | */
29 | .fui-arrow-right, .fui-arrow-left, .fui-cmd, .fui-check-inverted, .fui-heart, .fui-location, .fui-plus, .fui-check, .fui-cross, .fui-list, .fui-new, .fui-video, .fui-photo, .fui-volume, .fui-time, .fui-eye, .fui-chat, .fui-search, .fui-user, .fui-mail, .fui-lock, .fui-gear, .fui-radio-unchecked, .fui-radio-checked, .fui-checkbox-unchecked, .fui-checkbox-checked, .fui-calendar-solid, .fui-pause, .fui-play, .fui-check-inverted-2 {
30 | display: inline-block;
31 | font-family: 'Flat-UI-Icons';
32 | speak: none;
33 | font-style: normal;
34 | font-weight: normal;
35 | font-variant: normal;
36 | text-transform: none;
37 | -webkit-font-smoothing: antialiased;
38 | }
39 | .fui-arrow-right:before {
40 | content: "\e02c";
41 | }
42 | .fui-arrow-left:before {
43 | content: "\e02d";
44 | }
45 | .fui-cmd:before {
46 | content: "\e02f";
47 | }
48 | .fui-check-inverted:before {
49 | content: "\e006";
50 | }
51 | .fui-heart:before {
52 | content: "\e007";
53 | }
54 | .fui-location:before {
55 | content: "\e008";
56 | }
57 | .fui-plus:before {
58 | content: "\e009";
59 | }
60 | .fui-check:before {
61 | content: "\e00a";
62 | }
63 | .fui-cross:before {
64 | content: "\e00b";
65 | }
66 | .fui-list:before {
67 | content: "\e00c";
68 | }
69 | .fui-new:before {
70 | content: "\e00d";
71 | }
72 | .fui-video:before {
73 | content: "\e00e";
74 | }
75 | .fui-photo:before {
76 | content: "\e00f";
77 | }
78 | .fui-volume:before {
79 | content: "\e010";
80 | }
81 | .fui-time:before {
82 | content: "\e011";
83 | }
84 | .fui-eye:before {
85 | content: "\e012";
86 | }
87 | .fui-chat:before {
88 | content: "\e013";
89 | }
90 | .fui-search:before {
91 | content: "\e01c";
92 | }
93 | .fui-user:before {
94 | content: "\e01d";
95 | }
96 | .fui-mail:before {
97 | content: "\e01e";
98 | }
99 | .fui-lock:before {
100 | content: "\e01f";
101 | }
102 | .fui-gear:before {
103 | content: "\e024";
104 | }
105 | .fui-radio-unchecked:before {
106 | content: "\e02b";
107 | }
108 | .fui-radio-checked:before {
109 | content: "\e032";
110 | }
111 | .fui-checkbox-unchecked:before {
112 | content: "\e033";
113 | }
114 | .fui-checkbox-checked:before {
115 | content: "\e034";
116 | }
117 | .fui-calendar-solid:before {
118 | content: "\e022";
119 | }
120 | .fui-pause:before {
121 | content: "\e03b";
122 | }
123 | .fui-play:before {
124 | content: "\e03c";
125 | }
126 | .fui-check-inverted-2:before {
127 | content: "\e000";
128 | }
129 |
--------------------------------------------------------------------------------
/web/less/config.less:
--------------------------------------------------------------------------------
1 | //
2 | // Variables
3 | // --------------------------------------------------
4 |
5 | // Global values
6 | // --------------------------------------------------
7 |
8 | //
9 | // Color Swatches
10 | // --------------------------------------------------
11 | @turquoise: #1abc9c;
12 | @green-sea: #16a085;
13 |
14 | @emerald: #2ecc71;
15 | @nephritis: #27ae60;
16 |
17 | @peter-river: #3498db;
18 | @belize-hole: #2980b9;
19 |
20 | @amethyst: #9b59b6;
21 | @wisteria: #8e44ad;
22 |
23 | @wet-asphalt: #34495e;
24 | @midnight-blue: #2c3e50;
25 |
26 | @sun-flower: #f1c40f;
27 | @orange: #f39c12;
28 |
29 | @carrot: #e67e22;
30 | @pumpkin: #d35400;
31 |
32 | @alizarin: #e74c3c;
33 | @pomegranate: #c0392b;
34 |
35 | @clouds: #ecf0f1;
36 | @silver: #bdc3c7;
37 |
38 | @concrete: #95a5a6;
39 | @asbestos: #7f8c8d;
40 |
41 | // Main Colors
42 | // -------------------------
43 | @base: @wet-asphalt;
44 | @firm: @turquoise;
45 |
46 | @gray: @concrete;
47 | @lightgray: @silver;
48 | @inverse: white;
49 |
50 | @success: @emerald;
51 | @danger: @alizarin;
52 | @warning: @sun-flower;
53 | @info: @peter-river;
54 |
55 | @link-color: @green-sea;
56 | @link-hover-color: @turquoise;
57 |
58 |
59 | // Typography
60 | // -------------------------
61 | @base-font-family: "Lato", sans-serif;
62 | @base-font-size: 18px;
63 | @base-line-height: 1.231;
64 |
65 | @h1: @base-font-size * 5.214; /* 62px */
66 | @h2: @base-font-size * 4.429; /* 52px */
67 | @h3: @base-font-size * 3.714; /* 40px */
68 | @h4: @base-font-size * 2.857; /* 29px */
69 | @h5: @base-font-size * 2.071; /* 28px */
70 | @h6: @base-font-size * 1.714; /* 24px */
71 |
72 | // Icons
73 | @icon-normal: 16px;
74 | @icon-medium: 18px;
75 | @icon-large: 32px;
76 |
77 | // Inputs
78 | // -------------------------
79 | @input-border-radius: 6px;
80 |
81 | // Pagination
82 | // -------------------------
83 | @pagination-color: mix(@base, white, 20%);
84 |
85 | // Pager
86 | // -------------------------
87 | @pager-padding: 9px 15px 10px;
88 |
89 | // Buttons
90 | @button-text: @inverse;
91 | @button-hover: mix(@lightgray, white, 80%);
92 | @button-active: mix(@lightgray, black, 85%);
93 | @button-primary-hover: mix(@firm, white, 80%);
94 | @button-primary-active: mix(@firm, black, 85%);
95 | @button-info-hover: mix(@info, white, 80%);
96 | @button-info-active: mix(@info, black, 85%);
97 | @button-success-hover: mix(@success, white, 80%);
98 | @button-success-active: mix(@success, black, 85%);
99 | @button-danger-hover: mix(@danger, white, 80%);
100 | @button-danger-active: mix(@danger, black, 85%);
101 | @button-warning-hover: overlay(@warning, darken(white, 37.5%));
102 | @button-warning-active: mix(@warning, black, 85%);
103 | @button-inverse-hover: overlay(@base, darken(white, 37.5%));
104 | @button-inverse-active: mix(@base, black, 85%);
105 |
106 | // Navbar
107 | // -------------------------
108 | @navbar-link-space: 20px;
109 | @navbar-sublink-space: 9px;
110 |
111 | // Dropdown Menu
112 | // -------------------------
113 | @dropdown-background: mix(@inverse, @base, 94%);
114 |
115 | // Progress/slider
116 | // -------------------------
117 | @progress-height: 12px;
118 |
119 | // Switch
120 | // -------------------------
121 | @switch-border-radius: 30px;
122 | @switch-width: 80px;
123 |
124 |
--------------------------------------------------------------------------------
/web/js/flatui-checkbox.js:
--------------------------------------------------------------------------------
1 | /* =============================================================
2 | * flatui-checkbox.js v0.0.2
3 | * ============================================================ */
4 |
5 | !function ($) {
6 |
7 | /* CHECKBOX PUBLIC CLASS DEFINITION
8 | * ============================== */
9 |
10 | var Checkbox = function (element, options) {
11 | this.init(element, options);
12 | }
13 |
14 | Checkbox.prototype = {
15 |
16 | constructor: Checkbox
17 |
18 | , init: function (element, options) {
19 | var $el = this.$element = $(element)
20 |
21 | this.options = $.extend({}, $.fn.checkbox.defaults, options);
22 | $el.before(this.options.template);
23 | this.setState();
24 | }
25 |
26 | , setState: function () {
27 | var $el = this.$element
28 | , $parent = $el.closest('.checkbox');
29 |
30 | $el.prop('disabled') && $parent.addClass('disabled');
31 | $el.prop('checked') && $parent.addClass('checked');
32 | }
33 |
34 | , toggle: function () {
35 | var ch = 'checked'
36 | , $el = this.$element
37 | , $parent = $el.closest('.checkbox')
38 | , checked = $el.prop(ch)
39 | , e = $.Event('toggle')
40 |
41 | if ($el.prop('disabled') == false) {
42 | $parent.toggleClass(ch) && checked ? $el.removeAttr(ch) : $el.attr(ch, true);
43 | $el.trigger(e).trigger('change');
44 | }
45 | }
46 |
47 | , setCheck: function (option) {
48 | var d = 'disabled'
49 | , ch = 'checked'
50 | , $el = this.$element
51 | , $parent = $el.closest('.checkbox')
52 | , checkAction = option == 'check' ? true : false
53 | , e = $.Event(option)
54 |
55 | $parent[checkAction ? 'addClass' : 'removeClass' ](ch) && checkAction ? $el.attr(ch, true) : $el.removeAttr(ch);
56 | $el.trigger(e).trigger('change');
57 | }
58 |
59 | }
60 |
61 |
62 | /* CHECKBOX PLUGIN DEFINITION
63 | * ======================== */
64 |
65 | var old = $.fn.checkbox
66 |
67 | $.fn.checkbox = function (option) {
68 | return this.each(function () {
69 | var $this = $(this)
70 | , data = $this.data('checkbox')
71 | , options = $.extend({}, $.fn.checkbox.defaults, $this.data(), typeof option == 'object' && option);
72 | if (!data) $this.data('checkbox', (data = new Checkbox(this, options)));
73 | if (option == 'toggle') data.toggle()
74 | if (option == 'check' || option == 'uncheck') data.setCheck(option)
75 | else if (option) data.setState();
76 | });
77 | }
78 |
79 | $.fn.checkbox.defaults = {
80 | template: ''
81 | }
82 |
83 |
84 | /* CHECKBOX NO CONFLICT
85 | * ================== */
86 |
87 | $.fn.checkbox.noConflict = function () {
88 | $.fn.checkbox = old;
89 | return this;
90 | }
91 |
92 |
93 | /* CHECKBOX DATA-API
94 | * =============== */
95 |
96 | $(document).on('click.checkbox.data-api', '[data-toggle^=checkbox], .checkbox', function (e) {
97 | var $checkbox = $(e.target);
98 | if (e.target.tagName != "A") {
99 | e && e.preventDefault() && e.stopPropagation();
100 | if (!$checkbox.hasClass('checkbox')) $checkbox = $checkbox.closest('.checkbox');
101 | $checkbox.find(':checkbox').checkbox('toggle');
102 | }
103 | });
104 |
105 | $(window).on('load', function () {
106 | $('[data-toggle="checkbox"]').each(function () {
107 | var $checkbox = $(this);
108 | $checkbox.checkbox();
109 | });
110 | });
111 |
112 | }(window.jQuery);
--------------------------------------------------------------------------------
/web/less/modules/switch.less:
--------------------------------------------------------------------------------
1 | /* ============================================================
2 | * bootstrapSwitch v1.3 by Larentis Mattia @spiritualGuru
3 | * http://www.larentis.eu/switch/
4 | * ============================================================
5 | * Licensed under the Apache License, Version 2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | * ============================================================ */
8 |
9 | .has-switch {
10 | border-radius: @switch-border-radius;
11 | display: inline-block;
12 | cursor: pointer;
13 | line-height: @base-line-height;
14 | overflow: hidden;
15 | position: relative;
16 | text-align: left;
17 | width: @switch-width;
18 | .mask(~"url('../images/switch/mask.png') 0 0 no-repeat");
19 | .user-select(none);
20 |
21 | &.deactivate {
22 | .opacity(50);
23 | cursor: default !important;
24 | label, span {
25 | cursor: default !important;
26 | }
27 | }
28 |
29 | > div {
30 | width: 162%;
31 | position: relative;
32 | top: 0;
33 |
34 | &.switch-animate {
35 | .transition(left 0.25s ease-out);
36 | }
37 |
38 | &.switch-off {
39 | left: -63%;
40 |
41 | label {
42 | background-color: mix(@base, white, 63%);
43 | border-color: @lightgray;
44 | .box-shadow(-1px 0 0 fade(@inverse, 50%));
45 | }
46 | }
47 |
48 | &.switch-on {
49 | left: 0%;
50 |
51 | label {
52 | background-color: @firm;
53 | }
54 | }
55 | }
56 |
57 | input[type=checkbox] {
58 | display: none;
59 | }
60 |
61 | span {
62 | cursor: pointer;
63 | font-size: @base-font-size * 1.071;
64 | font-weight: 700;
65 | float: left;
66 | height: 29px;
67 | line-height: 19px;
68 | margin: 0;
69 | padding-bottom: 6px;
70 | padding-top: 5px;
71 | position: relative;
72 | text-align: center;
73 | width: 50%;
74 | z-index: 1;
75 | .box-sizing();
76 | .transition(.25s ease-out);
77 |
78 | &.switch-left {
79 | border-radius: @switch-border-radius 0 0 @switch-border-radius;
80 | background-color: @base;
81 | color: @firm;
82 | border-left: 1px solid transparent;
83 | }
84 |
85 | &.switch-right {
86 | border-radius: 0 @switch-border-radius @switch-border-radius 0;
87 | background-color: @lightgray;
88 | color: @inverse;
89 | text-indent: 7px;
90 |
91 | [class*="fui-"] {
92 | text-indent: 0;
93 | }
94 | }
95 | }
96 |
97 | label {
98 | border: 4px solid @base;
99 | border-radius: 50%;
100 | float: left;
101 | height: 21px;
102 | margin: 0 -15px 0 -14px;
103 | padding: 0;
104 | position: relative;
105 | vertical-align: middle;
106 | width: 21px;
107 | z-index: 100;
108 | .transition(.25s ease-out);
109 | }
110 | }
111 |
112 | // Square Switch
113 | // -------------------------------
114 | .switch-square {
115 | border-radius: 6px;
116 | .mask(~"url('../images/switch/mask.png') 0 0 no-repeat");
117 |
118 | > div {
119 | &.switch-off {
120 | label {
121 | border-color: mix(@base, white, 63%);
122 | border-radius: 6px 0 0 6px;
123 | }
124 | }
125 | }
126 |
127 | span {
128 | &.switch-left {
129 | border-radius: 6px 0 0 6px;
130 | [class*="fui-"] {
131 | text-indent: -10px;
132 | }
133 | }
134 |
135 | &.switch-right {
136 | border-radius: 0 6px 6px 0;
137 | [class*="fui-"] {
138 | text-indent: 5px;
139 | }
140 | }
141 | }
142 |
143 | label {
144 | border-radius: 0 6px 6px 0;
145 | border-color: @firm;
146 | }
147 | }
148 |
149 |
--------------------------------------------------------------------------------
/web/less/modules/input.less:
--------------------------------------------------------------------------------
1 | //
2 | // Inputs
3 | // --------------------------------------------------
4 |
5 | // Text fields
6 | textarea,
7 | input[type="text"],
8 | input[type="password"],
9 | input[type="datetime"],
10 | input[type="datetime-local"],
11 | input[type="date"],
12 | input[type="month"],
13 | input[type="time"],
14 | input[type="week"],
15 | input[type="number"],
16 | input[type="email"],
17 | input[type="url"],
18 | input[type="search"],
19 | input[type="tel"],
20 | input[type="color"],
21 | .uneditable-input {
22 | border: 2px solid @lightgray;
23 | color: @base;
24 | font-family: @base-font-family;
25 | font-size: @base-font-size;
26 | padding: 8px 5px;
27 | height: 21px;
28 | text-indent: 6px;
29 | -webkit-appearance: none;
30 | .border-radius(6px);
31 | .box-shadow(none);
32 | .placeholder-color(desaturate(lighten(@base, 45%), 15%));
33 | .transition(~"border .25s linear, color .25s linear");
34 |
35 | // Alternate state
36 | // --------------------------------------------------
37 | .control-group.focus &,
38 | &:focus {
39 | border-color: @firm;
40 | .box-shadow(none);
41 | }
42 |
43 | .row-fluid & {
44 | height: 41px;
45 | width: 100%;
46 | }
47 |
48 | // Flat (without border)
49 | &.flat {
50 | border-color: transparent;
51 | &:hover {
52 | border-color: @lightgray;
53 | }
54 | &:focus {
55 | border-color: @firm;
56 | }
57 | }
58 |
59 | // Alternate Colors
60 | // --------------------------------------------------
61 | .control-group.error & { .input-states(@danger) }
62 | .control-group.success & { .input-states(@success) }
63 | .control-group.warning & { .input-states(@warning) }
64 | .control-group.info & { .input-states(@info) }
65 |
66 | .control-group & { margin-bottom: 0; }
67 | }
68 |
69 | // INPUT ICONS
70 | // ----------------------
71 | .control-group {
72 | position: relative;
73 |
74 | > .input-icon {
75 | position: absolute;
76 | top: 2px;
77 | right: 2px;
78 | line-height: 37px;
79 | vertical-align: middle;
80 | font-size: @base-font-size * 1.428; /* 20px */
81 | color: desaturate(lighten(@base, 45%), 15%);
82 | background-color: #ffffff;
83 | padding: 0 10px;
84 | .border-radius(6px);
85 | }
86 |
87 | input:focus + .input-icon { color: @base; }
88 |
89 | // Icon Sizes
90 | // --------------------------------------------------
91 |
92 | // Huge
93 | &.huge {
94 | > .input-icon {
95 | line-height: 49px;
96 | }
97 | }
98 |
99 | //Large
100 | &.large {
101 | > .input-icon {
102 | line-height: 41px;
103 | }
104 | }
105 |
106 | // Small
107 | &.small {
108 | > .input-icon {
109 | font-size: @base-font-size * 1.142; /* 16px */
110 | line-height: 30px;
111 | }
112 | }
113 |
114 |
115 | // Icon Colors
116 | // --------------------------------------------------
117 | &.success {
118 | > .input-icon, input + .input-icon {
119 | color: @success;
120 | }
121 | }
122 | &.warning {
123 | > .input-icon, input + .input-icon {
124 | color: @warning;
125 | }
126 | }
127 | &.error {
128 | > .input-icon, input + .input-icon {
129 | color: @danger;
130 | }
131 | }
132 | &.disabled {
133 | > .input-icon, input + .input-icon {
134 | color: mix(@gray, white, 40%);
135 | background-color: mix(@gray, white, 10%);
136 | }
137 | }
138 |
139 | }
140 |
141 | // Disabled state
142 | input[disabled],
143 | input[readonly],
144 | textarea[disabled],
145 | textarea[readonly] {
146 | background-color: mix(@gray, white, 10%);
147 | border-color: mix(@gray, white, 40%);
148 | color: mix(@gray, white, 40%);
149 | cursor: default;
150 | }
151 |
152 | // Text field grids
153 | input,
154 | textarea,
155 | .uneditable-input {
156 | width: 192px;
157 | }
158 |
159 | // Textarea
160 | textarea {
161 | height: auto;
162 | font-size: @base-font-size * 1.071; /* 15px */
163 | line-height: 24px;
164 | padding: 5px 11px;
165 | text-indent: 0;
166 |
167 | .row-fluid & {
168 | height: auto;
169 | width: 100% !important;
170 | }
171 | }
172 | textarea[class*="span"] {
173 | width: 100% !important;
174 | .box-sizing(border-box);
175 | }
--------------------------------------------------------------------------------
/web/js/flatui-radio.js:
--------------------------------------------------------------------------------
1 | /* =============================================================
2 | * flatui-radio.js v0.0.2
3 | * ============================================================ */
4 |
5 | !function ($) {
6 |
7 | /* RADIO PUBLIC CLASS DEFINITION
8 | * ============================== */
9 |
10 | var Radio = function (element, options) {
11 | this.init(element, options);
12 | }
13 |
14 | Radio.prototype = {
15 |
16 | constructor: Radio
17 |
18 | , init: function (element, options) {
19 | var $el = this.$element = $(element)
20 |
21 | this.options = $.extend({}, $.fn.radio.defaults, options);
22 | $el.before(this.options.template);
23 | this.setState();
24 | }
25 |
26 | , setState: function () {
27 | var $el = this.$element
28 | , $parent = $el.closest('.radio');
29 |
30 | $el.prop('disabled') && $parent.addClass('disabled');
31 | $el.prop('checked') && $parent.addClass('checked');
32 | }
33 |
34 | , toggle: function () {
35 | var d = 'disabled'
36 | , ch = 'checked'
37 | , $el = this.$element
38 | , checked = $el.prop(ch)
39 | , $parent = $el.closest('.radio')
40 | , $parentWrap = $el.closest('form').length ? $el.closest('form') : $el.closest('body')
41 | , $elemGroup = $parentWrap.find(':radio[name="' + $el.attr('name') + '"]')
42 | , e = $.Event('toggle')
43 |
44 | $elemGroup.not($el).each(function () {
45 | var $el = $(this)
46 | , $parent = $(this).closest('.radio');
47 |
48 | if ($el.prop(d) == false) {
49 | $parent.removeClass(ch) && $el.attr(ch, false).trigger('change');
50 | }
51 | });
52 |
53 | if ($el.prop(d) == false) {
54 | if (checked == false) $parent.addClass(ch) && $el.attr(ch, true);
55 | $el.trigger(e);
56 |
57 | if (checked !== $el.prop(ch)) {
58 | $el.trigger('change');
59 | }
60 | }
61 | }
62 |
63 | , setCheck: function (option) {
64 | var ch = 'checked'
65 | , $el = this.$element
66 | , $parent = $el.closest('.radio')
67 | , checkAction = option == 'check' ? true : false
68 | , checked = $el.prop(ch)
69 | , $parentWrap = $el.closest('form').length ? $el.closest('form') : $el.closest('body')
70 | , $elemGroup = $parentWrap.find(':radio[name="' + $el['attr']('name') + '"]')
71 | , e = $.Event(option)
72 |
73 | $elemGroup.not($el).each(function () {
74 | var $el = $(this)
75 | , $parent = $(this).closest('.radio');
76 |
77 | $parent.removeClass(ch) && $el.removeAttr(ch);
78 | });
79 |
80 | $parent[checkAction ? 'addClass' : 'removeClass'](ch) && checkAction ? $el.attr(ch, true) : $el.removeAttr(ch);
81 | $el.trigger(e);
82 |
83 | if (checked !== $el.prop(ch)) {
84 | $el.trigger('change');
85 | }
86 | }
87 |
88 | }
89 |
90 |
91 | /* RADIO PLUGIN DEFINITION
92 | * ======================== */
93 |
94 | var old = $.fn.radio
95 |
96 | $.fn.radio = function (option) {
97 | return this.each(function () {
98 | var $this = $(this)
99 | , data = $this.data('radio')
100 | , options = $.extend({}, $.fn.radio.defaults, $this.data(), typeof option == 'object' && option);
101 | if (!data) $this.data('radio', (data = new Radio(this, options)));
102 | if (option == 'toggle') data.toggle()
103 | if (option == 'check' || option == 'uncheck') data.setCheck(option)
104 | else if (option) data.setState();
105 | });
106 | }
107 |
108 | $.fn.radio.defaults = {
109 | template: ''
110 | }
111 |
112 |
113 | /* RADIO NO CONFLICT
114 | * ================== */
115 |
116 | $.fn.radio.noConflict = function () {
117 | $.fn.radio = old;
118 | return this;
119 | }
120 |
121 |
122 | /* RADIO DATA-API
123 | * =============== */
124 |
125 | $(document).on('click.radio.data-api', '[data-toggle^=radio], .radio', function (e) {
126 | var $radio = $(e.target);
127 | if (e.target.tagName != "A") {
128 | e && e.preventDefault() && e.stopPropagation();
129 | if (!$radio.hasClass('radio')) $radio = $radio.closest('.radio');
130 | $radio.find(':radio').radio('toggle');
131 | }
132 | });
133 |
134 | $(window).on('load', function () {
135 | $('[data-toggle="radio"]').each(function () {
136 | var $radio = $(this);
137 | $radio.radio();
138 | });
139 | });
140 |
141 | }(window.jQuery);
--------------------------------------------------------------------------------
/web/less/modules/buttons.less:
--------------------------------------------------------------------------------
1 | //
2 | // Buttons
3 | // --------------------------------------------------
4 |
5 | // Base styles
6 | // --------------------------------------------------
7 | .btn,
8 | .btn-group > .btn,
9 | .btn-group > .dropdown-menu,
10 | .btn-group > .popover {
11 | font-size: @base-font-size * 1.071; /* 15px */
12 | font-weight: 500;
13 | }
14 |
15 | .btn {
16 | border: none;
17 | background: @lightgray;
18 | color: @button-text;
19 | padding: 9px 12px 10px;
20 | line-height: 22px;
21 | text-decoration: none;
22 | text-shadow: none;
23 | .border-radius(6px);
24 | .box-shadow(none);
25 | .transition(0.25s);
26 |
27 | // Alternate states
28 | // --------------------------------------------------
29 | &:hover,
30 | &:focus,
31 | .btn-group:focus &.dropdown-toggle {
32 | background-color: @button-hover;
33 | color: @button-text;
34 | outline: none;
35 | .transition(0.25s);
36 | }
37 |
38 | // Active State
39 | &:active,
40 | .btn-group.open &.dropdown-toggle,
41 | &.active {
42 | background-color: @button-active;
43 | color: fade(@button-text, 75%);
44 | .box-shadow(none);
45 | }
46 |
47 | // Disabled state
48 | &.disabled,
49 | &[disabled] {
50 | background-color: @lightgray;
51 | color: fade(@button-text, 75%);
52 | .box-shadow(none);
53 | .opacity(70);
54 | }
55 |
56 | // Button sizes
57 | // --------------------------------------------------
58 |
59 | // Large
60 | &.btn-large {
61 | font-size: @base-font-size * 1.214; /* 17px */
62 | line-height: 20px;
63 | padding: 12px 18px 13px;
64 |
65 | > [class^="fui-"] {
66 | top: 0;
67 |
68 | &.pull-right {
69 | margin-right: -2px;
70 | }
71 | }
72 | }
73 |
74 | // Set the backgrounds
75 | // -------------------------
76 | &.btn-primary {
77 | .swap-button-color(@firm, @button-primary-hover, @button-primary-active);
78 | }
79 | &.btn-info {
80 | .swap-button-color(@info, @button-info-hover, @button-info-active);
81 | }
82 | &.btn-danger {
83 | .swap-button-color(@danger, @button-danger-hover, @button-danger-active);
84 | }
85 | &.btn-success {
86 | .swap-button-color(@success, @button-success-hover, @button-success-active);
87 | }
88 | &.btn-warning {
89 | .swap-button-color(@warning, @button-warning-hover, @button-warning-active);
90 | }
91 | &.btn-inverse {
92 | .swap-button-color(@base, @button-inverse-hover, @button-inverse-active);
93 | }
94 |
95 | // Button icon
96 | // --------------------------------------------------
97 | > [class^="fui-"] {
98 | margin: 0 4px;
99 | position: relative;
100 | top: 1px;
101 | vertical-align: top;
102 | .inline-block();
103 |
104 | &.pull-right {
105 | margin-right: 0px;
106 | }
107 | }
108 | }
109 |
110 | // Other button locations
111 | // Button with icon inside
112 | .btn-toolbar .btn {
113 | &.active {
114 | color: @button-text;
115 | }
116 | &:first-child {
117 | .border-radius(6px 0 0 6px);
118 | }
119 | &:last-child {
120 | .border-radius(0 6px 6px 0);
121 | }
122 | > [class^="fui-"] {
123 | font-size: @icon-normal;
124 | top: 0;
125 | }
126 | }
127 |
128 | // Button tip
129 | .btn-tip {
130 | font-weight: 300;
131 | padding-left: 10px;
132 | }
133 |
134 | // BUTTON GROUP
135 | // ----------------------
136 | .btn-group {
137 | > .btn {
138 | border-radius: 0;
139 | text-align: center;
140 |
141 | &:active,
142 | &.active {
143 | & + .btn {
144 | border-left-color: transparent;
145 | }
146 | }
147 | &:first-of-type {
148 | border-top-left-radius: 6px;
149 | border-bottom-left-radius: 6px;
150 | }
151 | &:last-of-type {
152 | border-top-right-radius: 6px;
153 | border-bottom-right-radius: 6px;
154 | }
155 | & + .btn {
156 | margin-left: 0;
157 | }
158 | & + .dropdown-toggle {
159 | border-left: 2px solid fade(@base, 15%);
160 | padding-left: 13px;
161 | padding-right: 13px;
162 | .box-shadow(none);
163 |
164 | .caret {
165 | margin-left: 3px;
166 | margin-right: 3px;
167 | }
168 | }
169 | &.btn-huge + .dropdown-toggle {
170 | .caret {
171 | margin-left: 7px;
172 | margin-right: 7px;
173 | }
174 | }
175 | &.btn-small + .dropdown-toggle {
176 | .caret {
177 | margin-left: 0;
178 | margin-right: 0;
179 | }
180 | }
181 | }
182 | }
--------------------------------------------------------------------------------
/templates/index.html.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | IndieWebify.Me
7 | A guide to getting you on the IndieWeb
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
What is the IndieWeb?
16 |
17 |
18 | We should all own the content we're creating, rather than just posting to third-party content silos.Publish on your own domain, and syndicate out to silos. This is the basis of the "Indie Web" movement. – IndieWeb.org
19 |
20 |
21 |
22 |
23 |
24 |
25 | = $render('validate-rel-me.html', $render) ?>
26 |
27 | = $render('validate-h-card.html', $render) ?>
28 |
29 | = $render('validate-h-entry.html', $render) ?>
30 |
31 | = $render('send-webmentions.html', $render) ?>
32 |
33 |
34 |
35 |
36 |
37 |
Federating IndieWeb Conversations Level 3
38 |
39 |
1. Add Reply Contexts to your site
40 |
41 |
Posting replies to other people’s posts is the next step after just being able to mention them with webmention.
42 |
43 |
Usually a reply is a note just like any other, but linking in a special way to the post it’s in reply to. When marked up with h-entry and rel=in-reply-to and/or class=u-in-reply-to, your reply can show up as a comment on the original post.
44 |
45 |
To test if your webmention sending is working, try replying to a post by someone who’s implemented comment receiving. There’s a list on the wiki.
46 |
47 |
If you wish you can also go the extra mile and display a copy of the post you’re replying to. This is called a reply context, and is an excellent way to practise parsing posts on other people’s sites.
48 |
49 |
2. Receive webmentions on your site
50 |
Now you can post replies which show up as comments on other people’s sites, the next step is to be able to receive comments yourself. There are several ways to do this.
51 |
52 |
53 | - If you’re using a project like Known, it may already support indieweb comments — you don’t have to do anything!
54 | - If you’re using a project like WordPress, there may already be a plugin enabling receiving of indieweb comments. See if the software you’re using is on the project list on the wiki
55 | - If you’re rolling your own project and want to implement webmention yourself, have a read through the spec and the wiki page for tips
56 | - If you want to get started quickly without implementing receiving of webmentions yourself, take a look at a hosted service like webmention.io
57 |
58 |
59 |
Once you’ve got webmention receiving set up, there are a few different ways of making sure it’s working correctly:
60 |
61 |
62 | - Link to one of your own posts and send yourself a mention. This works best if you know you can send webmentions successfully
63 | - Ask a friend (or a new friend in the online #indieweb chat to reply or mention one of your posts
64 | - If you’re POSSEing your content, setting up backfeed so that silo replies, likes, reshares, and event RSVPs show up on your own site. You can use a service like Bridgy, a server plugin, or roll your own
65 |
66 |
67 |
68 |
69 |
70 |
75 |
--------------------------------------------------------------------------------
/web/bootstrap/js/application.js:
--------------------------------------------------------------------------------
1 | // NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
2 | // IT'S ALL JUST JUNK FOR OUR DOCS!
3 | // ++++++++++++++++++++++++++++++++++++++++++
4 |
5 | !function ($) {
6 |
7 | $(function(){
8 |
9 | var $window = $(window)
10 |
11 | // Disable certain links in docs
12 | $('section [href^=#]').click(function (e) {
13 | e.preventDefault()
14 | })
15 |
16 | // side bar
17 | setTimeout(function () {
18 | $('.bs-docs-sidenav').affix({
19 | offset: {
20 | top: function () { return $window.width() <= 980 ? 290 : 210 }
21 | , bottom: 270
22 | }
23 | })
24 | }, 100)
25 |
26 | // make code pretty
27 | window.prettyPrint && prettyPrint()
28 |
29 | // add-ons
30 | $('.add-on :checkbox').on('click', function () {
31 | var $this = $(this)
32 | , method = $this.attr('checked') ? 'addClass' : 'removeClass'
33 | $(this).parents('.add-on')[method]('active')
34 | })
35 |
36 | // add tipsies to grid for scaffolding
37 | if ($('#gridSystem').length) {
38 | $('#gridSystem').tooltip({
39 | selector: '.show-grid > [class*="span"]'
40 | , title: function () { return $(this).width() + 'px' }
41 | })
42 | }
43 |
44 | // tooltip demo
45 | $('.tooltip-demo').tooltip({
46 | selector: "a[data-toggle=tooltip]"
47 | })
48 |
49 | $('.tooltip-test').tooltip()
50 | $('.popover-test').popover()
51 |
52 | // popover demo
53 | $("a[data-toggle=popover]")
54 | .popover()
55 | .click(function(e) {
56 | e.preventDefault()
57 | })
58 |
59 | // button state demo
60 | $('#fat-btn')
61 | .click(function () {
62 | var btn = $(this)
63 | btn.button('loading')
64 | setTimeout(function () {
65 | btn.button('reset')
66 | }, 3000)
67 | })
68 |
69 | // carousel demo
70 | $('#myCarousel').carousel()
71 |
72 | // javascript build logic
73 | var inputsComponent = $("#components.download input")
74 | , inputsPlugin = $("#plugins.download input")
75 | , inputsVariables = $("#variables.download input")
76 |
77 | // toggle all plugin checkboxes
78 | $('#components.download .toggle-all').on('click', function (e) {
79 | e.preventDefault()
80 | inputsComponent.attr('checked', !inputsComponent.is(':checked'))
81 | })
82 |
83 | $('#plugins.download .toggle-all').on('click', function (e) {
84 | e.preventDefault()
85 | inputsPlugin.attr('checked', !inputsPlugin.is(':checked'))
86 | })
87 |
88 | $('#variables.download .toggle-all').on('click', function (e) {
89 | e.preventDefault()
90 | inputsVariables.val('')
91 | })
92 |
93 | // request built javascript
94 | $('.download-btn .btn').on('click', function () {
95 |
96 | var css = $("#components.download input:checked")
97 | .map(function () { return this.value })
98 | .toArray()
99 | , js = $("#plugins.download input:checked")
100 | .map(function () { return this.value })
101 | .toArray()
102 | , vars = {}
103 | , img = ['glyphicons-halflings.png', 'glyphicons-halflings-white.png']
104 |
105 | $("#variables.download input")
106 | .each(function () {
107 | $(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
108 | })
109 |
110 | $.ajax({
111 | type: 'POST'
112 | , url: /\?dev/.test(window.location) ? 'http://localhost:3000' : 'http://bootstrap.herokuapp.com'
113 | , dataType: 'jsonpi'
114 | , params: {
115 | js: js
116 | , css: css
117 | , vars: vars
118 | , img: img
119 | }
120 | })
121 | })
122 | })
123 |
124 | // Modified from the original jsonpi https://github.com/benvinegar/jquery-jsonpi
125 | $.ajaxTransport('jsonpi', function(opts, originalOptions, jqXHR) {
126 | var url = opts.url;
127 |
128 | return {
129 | send: function(_, completeCallback) {
130 | var name = 'jQuery_iframe_' + jQuery.now()
131 | , iframe, form
132 |
133 | iframe = $('