├── 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 | 5 | 6 | IndieWebify.Me - a guide to getting you on the IndieWeb 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | 23 | 24 | 25 |
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 , we got this problem:

25 |

26 | 27 | 28 |

We found the following rel=me URLs on your site:

29 | 30 |
    31 | 32 |
  • 33 | 34 |
35 | 36 | 37 | $url)) ?> 38 |
39 | 40 | 41 |
42 |
43 | 44 |
45 |
46 | 47 |
48 |
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 , we got this problem:

25 |

26 | 27 |

Successfully sent webmentions/pingbacks from

28 | 29 | 30 | 31 |
32 |

No h-entries were found on !

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 |
41 |
42 | 43 |
44 |
45 | 46 |
47 |
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 |
5 |

It looks like your site is hosted on the WordPress.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — here are some resources which might help you out:

6 |
    7 |
  1. Wordpress Support article on Domains
  2. 8 |
  3. Wordpress.com custom domain premium upgrade
  4. 9 |
10 |

Once you’ve got your own domain, check out the IndieWeb WordPress wiki page for tips and plugins for adding things like webmentions and microformats to your site.

11 |
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 | 26 | 27 | 28 | 29 | 30 | 31 | 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 |
71 | 74 |
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 = $('