├── assets ├── less │ ├── elements │ │ ├── alerts.less │ │ ├── invoice.less │ │ ├── tables.less │ │ ├── panels.less │ │ ├── forms.less │ │ ├── images.less │ │ ├── callouts.less │ │ ├── navbar.less │ │ └── buttons.less │ ├── theme │ │ ├── mixins.less │ │ ├── boot.less │ │ └── variables.less │ ├── layouts │ │ ├── default.less │ │ └── home.less │ ├── controls │ │ ├── plans.less │ │ ├── terms.less │ │ ├── settings.less │ │ └── notifications.less │ ├── theme.less │ └── vendor.less ├── javascript │ ├── pages │ │ ├── account-register.js │ │ └── settings-subscribe.js │ ├── app.js │ └── controls │ │ ├── notifications.js │ │ ├── subscribe.js │ │ └── form-tools.js ├── images │ ├── october.png │ ├── mono-48px.png │ ├── mono-logo.png │ ├── spark-bg.png │ ├── color-48px.png │ ├── color-logo.png │ └── theme-preview.png └── vendor │ ├── font-awesome │ ├── font │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff │ └── less │ │ ├── path.less │ │ ├── mixins.less │ │ ├── font-awesome.less │ │ ├── bootstrap.less │ │ ├── extras.less │ │ └── core.less │ └── bootstrap │ ├── less │ ├── mixins │ │ ├── center-block.less │ │ ├── text-emphasis.less │ │ ├── size.less │ │ ├── opacity.less │ │ ├── background-variant.less │ │ ├── text-overflow.less │ │ ├── tab-focus.less │ │ ├── resize.less │ │ ├── labels.less │ │ ├── progress-bar.less │ │ ├── reset-filter.less │ │ ├── nav-divider.less │ │ ├── alerts.less │ │ ├── nav-vertical-align.less │ │ ├── responsive-visibility.less │ │ ├── pagination.less │ │ ├── border-radius.less │ │ ├── panels.less │ │ ├── list-group.less │ │ ├── hide-text.less │ │ ├── clearfix.less │ │ ├── table-row.less │ │ ├── image.less │ │ ├── buttons.less │ │ ├── forms.less │ │ ├── grid-framework.less │ │ ├── grid.less │ │ └── gradients.less │ ├── wells.less │ ├── breadcrumbs.less │ ├── responsive-embed.less │ ├── component-animations.less │ ├── close.less │ ├── thumbnails.less │ ├── utilities.less │ ├── media.less │ ├── pager.less │ ├── jumbotron.less │ ├── mixins.less │ ├── bootstrap.less │ ├── labels.less │ ├── badges.less │ ├── code.less │ ├── grid.less │ ├── alerts.less │ ├── progress-bars.less │ ├── pagination.less │ ├── print.less │ ├── tooltip.less │ ├── list-group.less │ ├── scaffolding.less │ ├── popovers.less │ ├── modals.less │ ├── buttons.less │ └── input-groups.less │ └── js │ ├── transition.js │ ├── alert.js │ ├── popover.js │ ├── button.js │ └── tab.js ├── pages ├── account │ ├── reset.htm │ ├── register.htm │ ├── signin.htm │ └── register-pay.htm ├── 404.htm ├── error.htm ├── terms.htm ├── dashboard.htm ├── home.htm ├── settings │ ├── invoice.htm │ ├── subscribe.htm │ ├── payment-method.htm │ ├── payment-methods.htm │ ├── security.htm │ ├── invoices.htm │ ├── invoice-payment.htm │ └── subscribe-pay.htm └── settings.htm ├── partials ├── nav │ ├── profile-photo.htm │ ├── brand.htm │ ├── subscriptions.htm │ ├── guest.htm │ └── settings.htm ├── payment │ ├── pay-form.htm │ ├── pay-success.htm │ └── pay-method.htm ├── settings │ ├── profile-photo.htm │ └── invoice-table.htm ├── site │ ├── flash-messages.htm │ ├── errors.htm │ ├── scripts.htm │ ├── meta.htm │ └── notifications-list.htm ├── settings-subscribe │ ├── trial-expire-notice.htm │ ├── cancel-confirm-form.htm │ ├── resume-confirm-form.htm │ ├── resume-subscription.htm │ ├── update-confirm-form.htm │ ├── update-subscription.htm │ └── new-subscriber.htm ├── plans │ ├── price-details.htm │ ├── feature-list-form.htm │ ├── tabs-heading.htm │ ├── tabs-content.htm │ └── table-items.htm ├── common │ └── country-state.htm └── account │ ├── register-plans.htm │ ├── fields-account.htm │ ├── fields-billing.htm │ ├── register-account.htm │ └── register-billing.htm ├── theme.yaml ├── README.md └── layouts ├── account.htm ├── default.htm ├── home.htm └── settings.htm /assets/less/elements/alerts.less: -------------------------------------------------------------------------------- 1 | .alert { 2 | font-weight: 300; 3 | } 4 | -------------------------------------------------------------------------------- /assets/javascript/pages/account-register.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Account registration 3 | */ 4 | -------------------------------------------------------------------------------- /assets/javascript/pages/settings-subscribe.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Account subscription 3 | */ 4 | -------------------------------------------------------------------------------- /assets/images/october.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/images/october.png -------------------------------------------------------------------------------- /assets/images/mono-48px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/images/mono-48px.png -------------------------------------------------------------------------------- /assets/images/mono-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/images/mono-logo.png -------------------------------------------------------------------------------- /assets/images/spark-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/images/spark-bg.png -------------------------------------------------------------------------------- /assets/images/color-48px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/images/color-48px.png -------------------------------------------------------------------------------- /assets/images/color-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/images/color-logo.png -------------------------------------------------------------------------------- /assets/images/theme-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/images/theme-preview.png -------------------------------------------------------------------------------- /pages/account/reset.htm: -------------------------------------------------------------------------------- 1 | title = "Password reset" 2 | url = "/signin/reset" 3 | layout = "default" 4 | == 5 | 6 | @todo 7 | -------------------------------------------------------------------------------- /assets/less/theme/mixins.less: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins file 3 | // 4 | // Space for any custom mixins used by this application 5 | // 6 | -------------------------------------------------------------------------------- /assets/javascript/app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Application 3 | */ 4 | 5 | $(document).tooltip({ 6 | selector: "[data-toggle=tooltip]" 7 | }) 8 | -------------------------------------------------------------------------------- /assets/less/elements/invoice.less: -------------------------------------------------------------------------------- 1 | .payment-invoice { 2 | th, td { 3 | &.numeric { text-align: right; } 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /assets/vendor/font-awesome/font/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/vendor/font-awesome/font/FontAwesome.otf -------------------------------------------------------------------------------- /partials/nav/profile-photo.htm: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /assets/vendor/font-awesome/font/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/vendor/font-awesome/font/fontawesome-webfont.eot -------------------------------------------------------------------------------- /assets/vendor/font-awesome/font/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/vendor/font-awesome/font/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /assets/vendor/font-awesome/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/responsiv/sparky-theme/HEAD/assets/vendor/font-awesome/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /partials/nav/brand.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/less/layouts/default.less: -------------------------------------------------------------------------------- 1 | // 2 | // Layouts 3 | // 4 | // Styles specific to different page layouts. 5 | // 6 | 7 | body { 8 | font-weight: 300; 9 | } 10 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/center-block.less: -------------------------------------------------------------------------------- 1 | // Center-align a block level element 2 | 3 | .center-block() { 4 | display: block; 5 | margin-left: auto; 6 | margin-right: auto; 7 | } 8 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/text-emphasis.less: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | .text-emphasis-variant(@color) { 4 | color: @color; 5 | a&:hover { 6 | color: darken(@color, 10%); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /partials/payment/pay-form.htm: -------------------------------------------------------------------------------- 1 | {% if paymentMethod %} 2 |
3 | {{ paymentMethod.renderPaymentProfileForm(this.controller)|raw }} 4 |
5 | {% endif %} 6 | -------------------------------------------------------------------------------- /partials/settings/profile-photo.htm: -------------------------------------------------------------------------------- 1 | 5 | 6 | -------------------------------------------------------------------------------- /assets/less/elements/tables.less: -------------------------------------------------------------------------------- 1 | .table-borderless { 2 | > thead > tr > th { 3 | border-bottom: 0; 4 | } 5 | 6 | > tbody > tr > td { 7 | border-top: 0; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/size.less: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | .size(@width; @height) { 4 | width: @width; 5 | height: @height; 6 | } 7 | 8 | .square(@size) { 9 | .size(@size; @size); 10 | } 11 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/opacity.less: -------------------------------------------------------------------------------- 1 | // Opacity 2 | 3 | .opacity(@opacity) { 4 | opacity: @opacity; 5 | // IE8 filter 6 | @opacity-ie: (@opacity * 100); 7 | filter: ~"alpha(opacity=@{opacity-ie})"; 8 | } 9 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/background-variant.less: -------------------------------------------------------------------------------- 1 | // Contextual backgrounds 2 | 3 | .bg-variant(@color) { 4 | background-color: @color; 5 | a&:hover { 6 | background-color: darken(@color, 10%); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /partials/site/flash-messages.htm: -------------------------------------------------------------------------------- 1 | {% flash %} 2 |

6 | {{ message }} 7 |

8 | {% endflash %} 9 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/text-overflow.less: -------------------------------------------------------------------------------- 1 | // Text overflow 2 | // Requires inline-block or block for proper styling 3 | 4 | .text-overflow() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/tab-focus.less: -------------------------------------------------------------------------------- 1 | // WebKit-style focus 2 | 3 | .tab-focus() { 4 | // Default 5 | outline: thin dotted; 6 | // WebKit 7 | outline: 5px auto -webkit-focus-ring-color; 8 | outline-offset: -2px; 9 | } 10 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/resize.less: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | .resizable(@direction) { 4 | resize: @direction; // Options: horizontal, vertical, both 5 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 6 | } 7 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/labels.less: -------------------------------------------------------------------------------- 1 | // Labels 2 | 3 | .label-variant(@color) { 4 | background-color: @color; 5 | 6 | &[href] { 7 | &:hover, 8 | &:focus { 9 | background-color: darken(@color, 10%); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/progress-bar.less: -------------------------------------------------------------------------------- 1 | // Progress bars 2 | 3 | .progress-bar-variant(@color) { 4 | background-color: @color; 5 | 6 | // Deprecated parent class requirement as of v3.2.0 7 | .progress-striped & { 8 | #gradient > .striped(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /pages/404.htm: -------------------------------------------------------------------------------- 1 | title = "Page not found (404)" 2 | url = "/404" 3 | layout = "default" 4 | == 5 |
6 |
7 |

Page not found

8 |

We're sorry, but the page you requested cannot be found.

9 |
10 |
-------------------------------------------------------------------------------- /pages/error.htm: -------------------------------------------------------------------------------- 1 | title = "Error page (500)" 2 | url = "/error" 3 | layout = "default" 4 | == 5 |
6 |
7 |

Error

8 |

We're sorry, but something went wrong and the page cannot be displayed.

9 |
10 |
-------------------------------------------------------------------------------- /partials/payment/pay-success.htm: -------------------------------------------------------------------------------- 1 |
2 |

3 | This invoice has been paid. Thank-you! 4 |

5 |
6 |

7 | Go to dashboard 8 |

9 |
10 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/reset-filter.less: -------------------------------------------------------------------------------- 1 | // Reset filters for IE 2 | // 3 | // When you need to remove a gradient background, do not forget to use this to reset 4 | // the IE filter for IE9 and below. 5 | 6 | .reset-filter() { 7 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); 8 | } 9 | -------------------------------------------------------------------------------- /assets/less/elements/panels.less: -------------------------------------------------------------------------------- 1 | .panel { 2 | overflow: hidden; 3 | } 4 | 5 | .panel-heading { 6 | font-size: 15px; 7 | font-weight: 400; 8 | } 9 | 10 | .panel-body { 11 | font-weight: 300; 12 | } 13 | 14 | .panel-flush { 15 | .panel-body, .panel-header { 16 | padding: 0; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/nav-divider.less: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | .nav-divider(@color: #e5e5e5) { 6 | height: 1px; 7 | margin: ((@line-height-computed / 2) - 1) 0; 8 | overflow: hidden; 9 | background-color: @color; 10 | } 11 | -------------------------------------------------------------------------------- /theme.yaml: -------------------------------------------------------------------------------- 1 | name: Sparky 2 | description: A starter template that implements subscription based payments. 3 | author: Responsiv Internet 4 | homepage: 'http://responsiv.com' 5 | code: '' 6 | require: 7 | - RainLab.User 8 | - RainLab.Notify 9 | - RainLab.UserPlus 10 | - Responsiv.Pay 11 | - Responsiv.Subscribe 12 | -------------------------------------------------------------------------------- /partials/nav/subscriptions.htm: -------------------------------------------------------------------------------- 1 | {% if user.onTrial %} 2 | 3 | 4 |
  • 5 | 6 | Subscribe 7 | 8 |
  • 9 |
  • 10 | {% endif %} 11 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/alerts.less: -------------------------------------------------------------------------------- 1 | // Alerts 2 | 3 | .alert-variant(@background; @border; @text-color) { 4 | background-color: @background; 5 | border-color: @border; 6 | color: @text-color; 7 | 8 | hr { 9 | border-top-color: darken(@border, 5%); 10 | } 11 | .alert-link { 12 | color: darken(@text-color, 10%); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /assets/less/theme/boot.less: -------------------------------------------------------------------------------- 1 | // 2 | // Boot file 3 | // 4 | // Includes non-output LESS files such as mixins and variables 5 | // 6 | 7 | @import "../../vendor/bootstrap/less/variables.less"; 8 | @import "../../vendor/bootstrap/less/mixins.less"; 9 | @import "../../vendor/font-awesome/less/variables.less"; 10 | @import "../../vendor/font-awesome/less/mixins.less"; 11 | @import "mixins.less"; 12 | @import "variables.less"; 13 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/nav-vertical-align.less: -------------------------------------------------------------------------------- 1 | // Navbar vertical align 2 | // 3 | // Vertically center elements in the navbar. 4 | // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. 5 | 6 | .navbar-vertical-align(@element-height) { 7 | margin-top: ((@navbar-height - @element-height) / 2); 8 | margin-bottom: ((@navbar-height - @element-height) / 2); 9 | } 10 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/responsive-visibility.less: -------------------------------------------------------------------------------- 1 | // Responsive utilities 2 | 3 | // 4 | // More easily include all the states for responsive-utilities.less. 5 | .responsive-visibility() { 6 | display: block !important; 7 | table& { display: table; } 8 | tr& { display: table-row !important; } 9 | th&, 10 | td& { display: table-cell !important; } 11 | } 12 | 13 | .responsive-invisibility() { 14 | display: none !important; 15 | } 16 | -------------------------------------------------------------------------------- /assets/less/elements/forms.less: -------------------------------------------------------------------------------- 1 | .spark-screen { 2 | form h2 { 3 | background-color: @panel-default-heading-bg; 4 | border-radius: @border-radius-base; 5 | font-size: 14px; 6 | font-weight: 300; 7 | margin-top: 0; 8 | margin-bottom: 15px; 9 | padding: 12px; 10 | } 11 | } 12 | 13 | .control-label { 14 | font-weight: 300; 15 | } 16 | 17 | .radio label, .checkbox label { 18 | font-weight: 300; 19 | } 20 | -------------------------------------------------------------------------------- /pages/terms.htm: -------------------------------------------------------------------------------- 1 | title = "Terms" 2 | url = "/terms" 3 | layout = "default" 4 | == 5 |
    6 | 7 |
    8 |
    9 |
    10 |
    Terms of Service
    11 | 12 |
    13 | Terms content goes here. 14 |
    15 |
    16 |
    17 |
    18 | 19 |
    20 | -------------------------------------------------------------------------------- /partials/settings-subscribe/trial-expire-notice.htm: -------------------------------------------------------------------------------- 1 | {% if user.subscriptionIsTrial %} 2 |
    3 |
    4 | Free Trial 5 |
    6 | 7 |
    8 | You are currently within your free trial period. Your trial will expire on 9 | {{ user.subscriptionTrialEnd.toFormattedDateString|default('soon') }}. 10 |
    11 |
    12 | {% endif %} 13 | -------------------------------------------------------------------------------- /pages/dashboard.htm: -------------------------------------------------------------------------------- 1 | title = "Demonstration" 2 | url = "/dashboard" 3 | layout = "account" 4 | == 5 |
    6 | 7 |
    8 |
    9 |
    10 |
    Dashboard
    11 | 12 |
    13 | Your application's dashboard goes here. 14 |
    15 |
    16 |
    17 |
    18 | 19 |
    20 | -------------------------------------------------------------------------------- /partials/plans/price-details.htm: -------------------------------------------------------------------------------- 1 | {% if plan.setup_price %} 2 |

    3 | Set up fee: 4 | {{ plan.setup_price|currency }} 5 |

    6 | {% endif %} 7 |

    8 | Subscription: 9 | {{ plan.price|currency }} / {{ plan.plan_type }} 10 |

    11 | {% if plan.total_tax %} 12 |

    13 | Tax: 14 | {{ plan.total_tax|currency }} 15 |

    16 | {% endif %} 17 |

    18 | Total: 19 | {{ plan.total_with_tax|currency }} 20 |

    21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # October Sparky 2 | 3 | ![Screenshot](https://raw.githubusercontent.com/responsiv/sparky-theme/master/assets/images/theme-preview.png) 4 | 5 | > **Note**: This project is a work in progress. 6 | 7 | October Sparky is a clone of Laravel Spark. This version offers more robust features with no external dependencies to manage plans, such as Stripe or Braintree. It also shares the spirit of October and is simplistic and easy to understand. 8 | 9 | Some key differences: 10 | 11 | - Teams are not supported out of the box 12 | - jQuery is used instead of Vue.js 13 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/pagination.less: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | .pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) { 4 | > li { 5 | > a, 6 | > span { 7 | padding: @padding-vertical @padding-horizontal; 8 | font-size: @font-size; 9 | } 10 | &:first-child { 11 | > a, 12 | > span { 13 | .border-left-radius(@border-radius); 14 | } 15 | } 16 | &:last-child { 17 | > a, 18 | > span { 19 | .border-right-radius(@border-radius); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/border-radius.less: -------------------------------------------------------------------------------- 1 | // Single side border-radius 2 | 3 | .border-top-radius(@radius) { 4 | border-top-right-radius: @radius; 5 | border-top-left-radius: @radius; 6 | } 7 | .border-right-radius(@radius) { 8 | border-bottom-right-radius: @radius; 9 | border-top-right-radius: @radius; 10 | } 11 | .border-bottom-radius(@radius) { 12 | border-bottom-right-radius: @radius; 13 | border-bottom-left-radius: @radius; 14 | } 15 | .border-left-radius(@radius) { 16 | border-bottom-left-radius: @radius; 17 | border-top-left-radius: @radius; 18 | } 19 | -------------------------------------------------------------------------------- /layouts/account.htm: -------------------------------------------------------------------------------- 1 | description = "User account pages" 2 | 3 | [session] 4 | security = "user" 5 | redirect = "account/signin" 6 | 7 | [notifications] 8 | includeAssets = "0" 9 | == 10 | 11 | 12 | 13 | {% partial 'site/meta' %} 14 | 15 | 16 | 17 | 18 | {% partial 'site/flash-messages' %} 19 | 20 |
    21 | {% partial 'nav/user' %} 22 | 23 | {% page %} 24 | 25 | {% partial 'site/scripts' %} 26 |
    27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /assets/less/controls/plans.less: -------------------------------------------------------------------------------- 1 | .plan-feature-list li { 2 | line-height: 35px; 3 | } 4 | 5 | .plan-select-button .btn-table-align a { 6 | color: @text-color; 7 | text-decoration: none; 8 | } 9 | 10 | .plan-select-button .btn-plan { 11 | width: 150px; 12 | 13 | &:first-child { 14 | display: none; 15 | } 16 | &:last-child { 17 | display: block; 18 | } 19 | } 20 | 21 | .plan-select-button.plan-selected .btn-plan { 22 | &:first-child { 23 | display: block; 24 | } 25 | &:last-child { 26 | display: none; 27 | } 28 | } 29 | 30 | .plan-price-details { 31 | margin: 0; 32 | } 33 | -------------------------------------------------------------------------------- /partials/site/errors.htm: -------------------------------------------------------------------------------- 1 | {% if errors|length %} 2 |
    3 | Whoops! Something went wrong! 4 |

    5 | 10 |
    11 | {% else %} 12 | {% flash error %} 13 |
    14 | Whoops! Something went wrong! 15 |

    16 | 19 |
    20 | {% endflash %} 21 | {% endif %} 22 | -------------------------------------------------------------------------------- /partials/site/scripts.htm: -------------------------------------------------------------------------------- 1 | 16 | {% scripts %} 17 | -------------------------------------------------------------------------------- /assets/less/controls/terms.less: -------------------------------------------------------------------------------- 1 | .terms-of-service { 2 | h1 { 3 | font-size: 26px; 4 | margin-top: 35px; 5 | margin-bottom: 20px; 6 | 7 | &:first-child { 8 | margin-top: 10px; 9 | } 10 | } 11 | 12 | h2 { 13 | font-size: 20px; 14 | } 15 | 16 | h3 { 17 | font-size: 18px; 18 | } 19 | 20 | h4 { 21 | font-size: 16px; 22 | margin-top: 20px; 23 | } 24 | 25 | p { 26 | line-height: 25px; 27 | margin: 0; 28 | } 29 | 30 | ul { 31 | margin-top: 15px; 32 | } 33 | 34 | li { 35 | line-height: 25px; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/panels.less: -------------------------------------------------------------------------------- 1 | // Panels 2 | 3 | .panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) { 4 | border-color: @border; 5 | 6 | & > .panel-heading { 7 | color: @heading-text-color; 8 | background-color: @heading-bg-color; 9 | border-color: @heading-border; 10 | 11 | + .panel-collapse > .panel-body { 12 | border-top-color: @border; 13 | } 14 | .badge { 15 | color: @heading-bg-color; 16 | background-color: @heading-text-color; 17 | } 18 | } 19 | & > .panel-footer { 20 | + .panel-collapse > .panel-body { 21 | border-bottom-color: @border; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /partials/plans/feature-list-form.htm: -------------------------------------------------------------------------------- 1 | 5 | 14 | 21 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @well-bg; 12 | border: 1px solid @well-border; 13 | border-radius: @border-radius-base; 14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: @border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: @border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/list-group.less: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | .list-group-item-variant(@state; @background; @color) { 4 | .list-group-item-@{state} { 5 | color: @color; 6 | background-color: @background; 7 | 8 | a& { 9 | color: @color; 10 | 11 | .list-group-item-heading { 12 | color: inherit; 13 | } 14 | 15 | &:hover, 16 | &:focus { 17 | color: @color; 18 | background-color: darken(@background, 5%); 19 | } 20 | &.active, 21 | &.active:hover, 22 | &.active:focus { 23 | color: #fff; 24 | background-color: @color; 25 | border-color: @color; 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/hide-text.less: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | // 3 | // Heads up! v3 launched with with only `.hide-text()`, but per our pattern for 4 | // mixins being reused as classes with the same name, this doesn't hold up. As 5 | // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. 6 | // 7 | // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 8 | 9 | // Deprecated as of v3.0.1 (will be removed in v4) 10 | .hide-text() { 11 | font: ~"0/0" a; 12 | color: transparent; 13 | text-shadow: none; 14 | background-color: transparent; 15 | border: 0; 16 | } 17 | 18 | // New mixin to use as of v3.0.1 19 | .text-hide() { 20 | .hide-text(); 21 | } 22 | -------------------------------------------------------------------------------- /layouts/default.htm: -------------------------------------------------------------------------------- 1 | description = "Default layout" 2 | 3 | [session] 4 | [notifications] 5 | includeAssets = "0" 6 | == 7 | 8 | 9 | 10 | {% partial 'site/meta' %} 11 | 12 | 13 | 14 | 15 | {% partial 'site/flash-messages' %} 16 | 17 |
    18 | {% if user %} 19 | {% partial 'nav/user' %} 20 | {% else %} 21 | {% partial 'nav/guest' %} 22 | {% endif %} 23 | 24 | {% page %} 25 | 26 | {% partial 'site/scripts' %} 27 |
    28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /assets/less/controls/settings.less: -------------------------------------------------------------------------------- 1 | .spark-settings-stacked-tabs { 2 | border-radius: @border-radius-base; 3 | font-weight: 300; 4 | 5 | a { 6 | border-bottom: 1px solid lighten(@spark-border-color, 5%); 7 | border-left: 3px solid transparent; 8 | color: @text-color; 9 | 10 | i { 11 | color: lighten(@text-color, 25%); 12 | position: relative; 13 | } 14 | } 15 | 16 | li:last-child a { 17 | border-bottom: 0; 18 | } 19 | 20 | li.active a { 21 | border-left: 3px solid @brand-primary; 22 | } 23 | 24 | li a:active, li a:hover, li a:link, li a:visited { 25 | background-color: white; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /partials/site/meta.htm: -------------------------------------------------------------------------------- 1 | 2 | {{ this.page.title }} 3 | 4 | 5 | 6 | 7 | 12 | 13 | {% styles %} 14 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/clearfix.less: -------------------------------------------------------------------------------- 1 | // Clearfix 2 | // 3 | // For modern browsers 4 | // 1. The space content is one way to avoid an Opera bug when the 5 | // contenteditable attribute is included anywhere else in the document. 6 | // Otherwise it causes space to appear at the top and bottom of elements 7 | // that are clearfixed. 8 | // 2. The use of `table` rather than `block` is only necessary if using 9 | // `:before` to contain the top-margins of child elements. 10 | // 11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/ 12 | 13 | .clearfix() { 14 | &:before, 15 | &:after { 16 | content: " "; // 1 17 | display: table; // 2 18 | } 19 | &:after { 20 | clear: both; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; 8 | margin-bottom: @line-height-computed; 9 | list-style: none; 10 | background-color: @breadcrumb-bg; 11 | border-radius: @border-radius-base; 12 | 13 | > li { 14 | display: inline-block; 15 | 16 | + li:before { 17 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space 18 | padding: 0 5px; 19 | color: @breadcrumb-color; 20 | } 21 | } 22 | 23 | > .active { 24 | color: @breadcrumb-active-color; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/responsive-embed.less: -------------------------------------------------------------------------------- 1 | // Embeds responsive 2 | // 3 | // Credit: Nicolas Gallagher and SUIT CSS. 4 | 5 | .embed-responsive { 6 | position: relative; 7 | display: block; 8 | height: 0; 9 | padding: 0; 10 | overflow: hidden; 11 | 12 | .embed-responsive-item, 13 | iframe, 14 | embed, 15 | object, 16 | video { 17 | position: absolute; 18 | top: 0; 19 | left: 0; 20 | bottom: 0; 21 | height: 100%; 22 | width: 100%; 23 | border: 0; 24 | } 25 | } 26 | 27 | // Modifier class for 16:9 aspect ratio 28 | .embed-responsive-16by9 { 29 | padding-bottom: 56.25%; 30 | } 31 | 32 | // Modifier class for 4:3 aspect ratio 33 | .embed-responsive-4by3 { 34 | padding-bottom: 75%; 35 | } 36 | -------------------------------------------------------------------------------- /layouts/home.htm: -------------------------------------------------------------------------------- 1 | description = "Home layout" 2 | == 3 | 4 | 5 | 6 | 7 | {{ this.page.title }} 8 | 9 | 10 | 11 | {% styles %} 12 | 15 | 16 | 17 | 18 | {% partial 'site/flash-messages' %} 19 | 20 | {% page %} 21 | 22 | 23 | -------------------------------------------------------------------------------- /pages/home.htm: -------------------------------------------------------------------------------- 1 | title = "Demonstration" 2 | url = "/" 3 | layout = "home" 4 | 5 | [session] 6 | == 7 |
    8 | 23 | 24 |
    25 |

    26 | 27 |

    28 |
    29 |
    30 | -------------------------------------------------------------------------------- /assets/vendor/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{FontAwesomePath}/fontawesome-webfont.eot?v=@{FontAwesomeVersion}'); 7 | src: url('@{FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=@{FontAwesomeVersion}') format('embedded-opentype'), 8 | url('@{FontAwesomePath}/fontawesome-webfont.woff?v=@{FontAwesomeVersion}') format('woff'), 9 | url('@{FontAwesomePath}/fontawesome-webfont.ttf?v=@{FontAwesomeVersion}') format('truetype'), 10 | url('@{FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=@{FontAwesomeVersion}') format('svg'); 11 | // src: url('@{FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /partials/common/country-state.htm: -------------------------------------------------------------------------------- 1 | {% set countryId = countryId|default(form_value('country_id')) %} 2 | {% set stateId = stateId|default(form_value('state_id')) %} 3 | 4 |
    5 | 6 | {{ form_select_country('country_id', countryId, { 7 | id: 'accountCountry', 8 | emptyOption: '', 9 | placeholder: 'Select country', 10 | 'data-request': 'onInit', 11 | 'data-request-update': { 12 | 'chunks/country-state': '#partialCountryState' 13 | } 14 | }) }} 15 |
    16 | 17 |
    18 | 19 | {{ form_select_state('state_id', countryId, stateId, { 20 | id: 'accountState', 21 | placeholder: 'Select state', 22 | emptyOption: '' 23 | }) }} 24 |
    25 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | .transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | 21 | &.in { display: block; } 22 | tr&.in { display: table-row; } 23 | tbody&.in { display: table-row-group; } 24 | } 25 | 26 | .collapsing { 27 | position: relative; 28 | height: 0; 29 | overflow: hidden; 30 | .transition-property(~"height, visibility"); 31 | .transition-duration(.35s); 32 | .transition-timing-function(ease); 33 | } 34 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/table-row.less: -------------------------------------------------------------------------------- 1 | // Tables 2 | 3 | .table-row-variant(@state; @background) { 4 | // Exact selectors below required to override `.table-striped` and prevent 5 | // inheritance to nested tables. 6 | .table > thead > tr, 7 | .table > tbody > tr, 8 | .table > tfoot > tr { 9 | > td.@{state}, 10 | > th.@{state}, 11 | &.@{state} > td, 12 | &.@{state} > th { 13 | background-color: @background; 14 | } 15 | } 16 | 17 | // Hover states for `.table-hover` 18 | // Note: this is not available for cells or rows within `thead` or `tfoot`. 19 | .table-hover > tbody > tr { 20 | > td.@{state}:hover, 21 | > th.@{state}:hover, 22 | &.@{state}:hover > td, 23 | &:hover > .@{state}, 24 | &.@{state}:hover > th { 25 | background-color: darken(@background, 5%); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /assets/less/elements/images.less: -------------------------------------------------------------------------------- 1 | .spark-profile-photo { 2 | border: 2px solid @spark-border-color; 3 | border-radius: 50%; 4 | height: 40px; 5 | padding: 2px; 6 | width: 40px; 7 | } 8 | 9 | .spark-profile-photo-lg { 10 | .spark-profile-photo; 11 | height: 75px; 12 | width: 75px; 13 | } 14 | 15 | .spark-profile-photo-xl { 16 | .spark-profile-photo; 17 | height: 125px; 18 | width: 125px; 19 | } 20 | 21 | .spark-nav-profile-photo { 22 | .spark-profile-photo; 23 | height: 50px; 24 | width: 50px; 25 | } 26 | 27 | .spark-screen { 28 | .profile-photo-preview { 29 | border-radius: @border-radius-large; 30 | display: inline-block; 31 | background-position: center; 32 | background-size: cover; 33 | height: 150px; 34 | vertical-align: middle; 35 | width: 150px; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /partials/settings-subscribe/cancel-confirm-form.htm: -------------------------------------------------------------------------------- 1 | {{ form_ajax('onCancelConfirm', { flash: true }) }} 2 | 6 | 11 | 24 | {{ form_close() }} 25 | -------------------------------------------------------------------------------- /pages/account/register.htm: -------------------------------------------------------------------------------- 1 | title = "Register" 2 | url = "/register" 3 | layout = "default" 4 | 5 | [subscribe] 6 | paymentPage = "account/register-pay" 7 | 8 | [subscribePlanList] 9 | 10 | [resources] 11 | js[] = "controls/subscribe.js" 12 | js[] = "pages/account-register.js" 13 | == 14 | {% set hasPlans = subscribePlanList.monthlyPlans or subscribePlanList.yearlyPlans %} 15 | 16 |
    17 | {{ form_ajax('onRegister', { id: 'subscribeForm', class: 'form-horizontal' }) }} 18 | 19 | 20 | {% if hasPlans %} 21 | {% partial 'account/register-plans' %} 22 | {% endif %} 23 | 24 | 25 | {% partial 'account/register-account' %} 26 | 27 | 28 | {% partial 'account/register-billing' %} 29 | 30 | {{ form_close() }} 31 |
    32 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: (@font-size-base * 1.5); 9 | font-weight: @close-font-weight; 10 | line-height: 1; 11 | color: @close-color; 12 | text-shadow: @close-text-shadow; 13 | .opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: @close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | .opacity(.5); 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile 27 | button& { 28 | padding: 0; 29 | cursor: pointer; 30 | background: transparent; 31 | border: 0; 32 | -webkit-appearance: none; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | display: block; 9 | padding: @thumbnail-padding; 10 | margin-bottom: @line-height-computed; 11 | line-height: @line-height-base; 12 | background-color: @thumbnail-bg; 13 | border: 1px solid @thumbnail-border; 14 | border-radius: @thumbnail-border-radius; 15 | .transition(border .2s ease-in-out); 16 | 17 | > img, 18 | a > img { 19 | &:extend(.img-responsive); 20 | margin-left: auto; 21 | margin-right: auto; 22 | } 23 | 24 | // Add a hover state for linked versions only 25 | a&:hover, 26 | a&:focus, 27 | a&.active { 28 | border-color: @link-color; 29 | } 30 | 31 | // Image captions 32 | .caption { 33 | padding: @thumbnail-caption-padding; 34 | color: @thumbnail-caption-color; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /partials/account/register-plans.htm: -------------------------------------------------------------------------------- 1 | {% set monthlyPlans = subscribePlanList.monthlyPlans %} 2 | {% set yearlyPlans = subscribePlanList.yearlyPlans %} 3 | {% set hasMonthlyAndYearlyPlans = monthlyPlans and yearlyPlans %} 4 | 5 |
    6 |
    7 |
    8 | 9 |
    10 |
    11 | Subscription 12 |
    13 | 14 | 15 | {% partial 'plans/tabs-heading' %} 16 | 17 |
    18 |
    19 | 20 |
    21 | 22 | 23 | {% partial 'plans/tabs-content' showTrials=1 %} 24 | 25 |
    26 | 27 |
    28 |
    29 |
    30 | -------------------------------------------------------------------------------- /assets/javascript/controls/notifications.js: -------------------------------------------------------------------------------- 1 | function toggleNotificationsPopover(el) { 2 | if ($(el).closest('form').toggleClass('active').hasClass('active')) { 3 | $(el).request('onLoadNotifications', { 4 | update: { 'site/notifications-list': '#notificationsContent' } 5 | }) 6 | } 7 | } 8 | 9 | function loadOlderNotifications(el) { 10 | var $form = $(el).closest('form'), 11 | height = $('ul.notifications', $form).get(0).scrollHeight 12 | 13 | $(el).request('onLoadOlderNotifications', { 14 | update: { 'site/notifications-list': '#notificationsContent' } 15 | }).done(function() { 16 | $('ul.notifications', $form).animate({ scrollTop: height }, 200) 17 | }) 18 | } 19 | 20 | function markNotificationsAsRead(el) { 21 | $(el).request('onMarkAllNotificationsAsRead', { 22 | update: { 'site/notifications-list': '#notificationsContent' } 23 | }).done(function() { 24 | $('.notifications-link').removeClass('has-notifications') 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Floats 7 | // ------------------------- 8 | 9 | .clearfix { 10 | .clearfix(); 11 | } 12 | .center-block { 13 | .center-block(); 14 | } 15 | .pull-right { 16 | float: right !important; 17 | } 18 | .pull-left { 19 | float: left !important; 20 | } 21 | 22 | 23 | // Toggling content 24 | // ------------------------- 25 | 26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 27 | .hide { 28 | display: none !important; 29 | } 30 | .show { 31 | display: block !important; 32 | } 33 | .invisible { 34 | visibility: hidden; 35 | } 36 | .text-hide { 37 | .text-hide(); 38 | } 39 | 40 | 41 | // Hide from screenreaders and browsers 42 | // 43 | // Credit: HTML5 Boilerplate 44 | 45 | .hidden { 46 | display: none !important; 47 | } 48 | 49 | 50 | // For Affix plugin 51 | // ------------------------- 52 | 53 | .affix { 54 | position: fixed; 55 | } 56 | -------------------------------------------------------------------------------- /partials/plans/tabs-heading.htm: -------------------------------------------------------------------------------- 1 | {% set monthlyPlans = subscribePlanList.monthlyPlans %} 2 | {% set yearlyPlans = subscribePlanList.yearlyPlans %} 3 | {% set hasMonthlyAndYearlyPlans = monthlyPlans and yearlyPlans %} 4 | 5 | {% if hasMonthlyAndYearlyPlans %} 6 |
    7 |
    8 | 15 | 23 |
    24 |
    25 | {% endif %} -------------------------------------------------------------------------------- /partials/account/fields-account.htm: -------------------------------------------------------------------------------- 1 | 2 |
    3 | 4 | 5 |
    6 | 7 |
    8 |
    9 | 10 | 11 |
    12 | 13 | 14 |
    15 | 16 |
    17 |
    18 | 19 | 20 |
    21 | 22 | 23 |
    24 | 25 |
    26 |
    27 | 28 | 29 |
    30 | 31 | 32 |
    33 | 34 |
    35 |
    36 | 37 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/media.less: -------------------------------------------------------------------------------- 1 | .media { 2 | // Proper spacing between instances of .media 3 | margin-top: 15px; 4 | 5 | &:first-child { 6 | margin-top: 0; 7 | } 8 | } 9 | 10 | .media, 11 | .media-body { 12 | zoom: 1; 13 | overflow: hidden; 14 | } 15 | 16 | .media-body { 17 | width: 10000px; 18 | } 19 | 20 | .media-object { 21 | display: block; 22 | } 23 | 24 | .media-right, 25 | .media > .pull-right { 26 | padding-left: 10px; 27 | } 28 | 29 | .media-left, 30 | .media > .pull-left { 31 | padding-right: 10px; 32 | } 33 | 34 | .media-left, 35 | .media-right, 36 | .media-body { 37 | display: table-cell; 38 | vertical-align: top; 39 | } 40 | 41 | .media-middle { 42 | vertical-align: middle; 43 | } 44 | 45 | .media-bottom { 46 | vertical-align: bottom; 47 | } 48 | 49 | // Reset margins on headings for tighter default spacing 50 | .media-heading { 51 | margin-top: 0; 52 | margin-bottom: 5px; 53 | } 54 | 55 | // Media list variation 56 | // 57 | // Undo default ul/ol styles 58 | .media-list { 59 | padding-left: 0; 60 | list-style: none; 61 | } 62 | -------------------------------------------------------------------------------- /layouts/settings.htm: -------------------------------------------------------------------------------- 1 | description = "User settings pages" 2 | 3 | [session] 4 | security = "user" 5 | redirect = "account/signin" 6 | 7 | [notifications] 8 | includeAssets = "0" 9 | == 10 | 11 | 12 | 13 | {% partial 'site/meta' %} 14 | 15 | 16 | 17 | 18 | {% partial 'site/flash-messages' %} 19 | 20 |
    21 | {% partial 'nav/user' %} 22 | 23 |
    24 |
    25 | 26 |
    27 | {% partial 'nav/settings' %} 28 |
    29 | 30 | 31 |
    32 | {% page %} 33 |
    34 |
    35 |
    36 | 37 | {% partial 'site/scripts' %} 38 |
    39 | 40 | 41 | -------------------------------------------------------------------------------- /partials/site/notifications-list.htm: -------------------------------------------------------------------------------- 1 | {% if notifications.total %} 2 | 11 | 12 | {% if notifications.lastItem() < notifications.total %} 13 | 18 | {% endif %} 19 | 20 | 21 | {% else %} 22 |

    There are no notifications for you

    23 | {% endif %} 24 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: @line-height-computed 0; 9 | list-style: none; 10 | text-align: center; 11 | &:extend(.clearfix all); 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: @pager-bg; 19 | border: 1px solid @pager-border; 20 | border-radius: @pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: @pager-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: @pager-disabled-color; 50 | background-color: @pager-bg; 51 | cursor: @cursor-disabled; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /pages/settings/invoice.htm: -------------------------------------------------------------------------------- 1 | title = "View Invoices" 2 | meta_title = "Invoice %s" 3 | url = "/settings/invoice/:id" 4 | layout = "settings" 5 | 6 | [invoice] 7 | isPrimary = "1" 8 | payPage = "settings/invoice-payment" 9 | 10 | [resources] 11 | vars[activeSetting] = "invoices" 12 | == 13 | 14 |
    15 |
    16 | {% partial 'settings/invoice-table' %} 17 | 18 | 19 |
    20 | {% if invoice.payment_method %} 21 | {% if invoice.isPaid %} 22 |

    This invoice has been paid!

    23 |

    Thank you for your business.

    24 | {% else %} 25 |

    This invoice has not been paid

    26 | 27 | Pay this Invoice 28 | 29 | {% endif %} 30 | {% else %} 31 |

    Sorry there are no payment gateways available to use!

    32 | {% endif %} 33 |
    34 |
    35 |
    36 | -------------------------------------------------------------------------------- /partials/nav/guest.htm: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /assets/less/elements/callouts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Callouts 3 | // -------------------------------------------------- 4 | 5 | .callout { 6 | margin-bottom: @line-height-computed; 7 | padding: @callout-padding; 8 | border-left: 3px solid @callout-border; 9 | code, .highlight { 10 | } 11 | h4 { 12 | margin-top: 0; 13 | margin-bottom: 5px; 14 | } 15 | p:last-child { 16 | margin-bottom: 0; 17 | } 18 | } 19 | 20 | .callout-danger { 21 | background-color: @callout-danger-bg; 22 | border-color: @callout-danger-border; 23 | h4 { 24 | color: @callout-danger-text; 25 | } 26 | } 27 | 28 | .callout-warning { 29 | background-color: @callout-warning-bg; 30 | border-color: @callout-warning-border; 31 | h4 { 32 | color: @callout-warning-text; 33 | } 34 | } 35 | 36 | .callout-info { 37 | background-color: @callout-info-bg; 38 | border-color: @callout-info-border; 39 | h4 { 40 | color: @callout-info-text; 41 | } 42 | } 43 | 44 | .callout-success { 45 | background-color: @callout-success-bg; 46 | border-color: @callout-success-border; 47 | h4 { 48 | color: @callout-success-text; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/jumbotron.less: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding: @jumbotron-padding (@jumbotron-padding / 2); 8 | margin-bottom: @jumbotron-padding; 9 | color: @jumbotron-color; 10 | background-color: @jumbotron-bg; 11 | 12 | h1, 13 | .h1 { 14 | color: @jumbotron-heading-color; 15 | } 16 | 17 | p { 18 | margin-bottom: (@jumbotron-padding / 2); 19 | font-size: @jumbotron-font-size; 20 | font-weight: 200; 21 | } 22 | 23 | > hr { 24 | border-top-color: darken(@jumbotron-bg, 10%); 25 | } 26 | 27 | .container &, 28 | .container-fluid & { 29 | border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container 30 | } 31 | 32 | .container { 33 | max-width: 100%; 34 | } 35 | 36 | @media screen and (min-width: @screen-sm-min) { 37 | padding: (@jumbotron-padding * 1.6) 0; 38 | 39 | .container &, 40 | .container-fluid & { 41 | padding-left: (@jumbotron-padding * 2); 42 | padding-right: (@jumbotron-padding * 2); 43 | } 44 | 45 | h1, 46 | .h1 { 47 | font-size: (@font-size-base * 4.5); 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/image.less: -------------------------------------------------------------------------------- 1 | // Image Mixins 2 | // - Responsive image 3 | // - Retina image 4 | 5 | 6 | // Responsive image 7 | // 8 | // Keep images from scaling beyond the width of their parents. 9 | .img-responsive(@display: block) { 10 | display: @display; 11 | max-width: 100%; // Part 1: Set a maximum relative to the parent 12 | height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching 13 | } 14 | 15 | 16 | // Retina image 17 | // 18 | // Short retina mixin for setting background-image and -size. Note that the 19 | // spelling of `min--moz-device-pixel-ratio` is intentional. 20 | .img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { 21 | background-image: url("@{file-1x}"); 22 | 23 | @media 24 | only screen and (-webkit-min-device-pixel-ratio: 2), 25 | only screen and ( min--moz-device-pixel-ratio: 2), 26 | only screen and ( -o-min-device-pixel-ratio: 2/1), 27 | only screen and ( min-device-pixel-ratio: 2), 28 | only screen and ( min-resolution: 192dpi), 29 | only screen and ( min-resolution: 2dppx) { 30 | background-image: url("@{file-2x}"); 31 | background-size: @width-1x @height-1x; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /partials/settings-subscribe/resume-confirm-form.htm: -------------------------------------------------------------------------------- 1 | {{ form_ajax('onResumeConfirm') }} 2 | 6 | 20 | 33 | {{ form_close() }} 34 | -------------------------------------------------------------------------------- /assets/less/layouts/home.less: -------------------------------------------------------------------------------- 1 | body, html { 2 | background: url('../../images/spark-bg.png'); 3 | background-repeat: repeat; 4 | background-size: 400px 400px; 5 | height: 100%; 6 | margin: 0; 7 | } 8 | 9 | .full-height { 10 | min-height: 100%; 11 | } 12 | 13 | .flex-column { 14 | display: flex; 15 | flex-direction: column; 16 | } 17 | 18 | .flex-fill { 19 | flex: 1; 20 | } 21 | 22 | .flex-center { 23 | align-items: center; 24 | display: flex; 25 | justify-content: center; 26 | } 27 | 28 | .text-center { 29 | text-align: center; 30 | } 31 | 32 | .links { 33 | padding: 1em; 34 | text-align: right; 35 | } 36 | 37 | .links > a { 38 | font-family: 'Open Sans'; 39 | font-size: 14px; 40 | font-weight: 600; 41 | text-decoration: none; 42 | display: inline-block; 43 | text-align: center; 44 | background-color: #3097d1; 45 | border: 0; 46 | border-radius: 4px; 47 | color: white; 48 | cursor: pointer; 49 | padding: 15px 0; 50 | text-transform: uppercase; 51 | width: 110px; 52 | margin-right: 15px; 53 | 54 | &:last-child { 55 | margin-right: 0; 56 | } 57 | 58 | &:active { 59 | background-color: #2b87bd; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /partials/plans/tabs-content.htm: -------------------------------------------------------------------------------- 1 | {% set monthlyPlans = subscribePlanList.monthlyPlans %} 2 | {% set yearlyPlans = subscribePlanList.yearlyPlans %} 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 |
    13 |
    14 | 15 | 16 | 17 | {% partial 'plans/table-items' plans=monthlyPlans activePlan=activePlan resumeMode=resumeMode showTrials=showTrials %} 18 | 19 |
    20 |
    21 |
    22 | 23 | 24 | 25 | {% partial 'plans/table-items' plans=yearlyPlans activePlan=activePlan resumeMode=resumeMode showTrials=showTrials %} 26 | 27 |
    28 |
    29 |
    30 | -------------------------------------------------------------------------------- /assets/less/theme.less: -------------------------------------------------------------------------------- 1 | // 2 | // Display warning notice inside the CSS file to deter any cowboy coding 3 | // 4 | 5 | /* 6 | * 7 | * !! WARNING !! THIS CSS FILE HAS BEEN AUTOMATICALLY GENERATED !! 8 | * 9 | * Any modifications made to this file will be lost next time it is generated. 10 | * Consider modifying the 'theme.less' file found in the 'less' folder instead 11 | * or create a new custom CSS file to override the rules in this one. 12 | * 13 | * !! YOU HAVE BEEN WARNED !! MODIFY THIS FILE AT YOUR OWN RISK !! 14 | * 15 | */ 16 | 17 | // 18 | // Boot theme 19 | // 20 | 21 | @import "theme/boot"; 22 | 23 | // 24 | // Controls 25 | // 26 | // These are interactive controls used in the site. 27 | // 28 | 29 | @import "controls/notifications"; 30 | @import "controls/plans"; 31 | @import "controls/settings"; 32 | @import "controls/terms"; 33 | 34 | // 35 | // Elements 36 | // 37 | // These are reusable elements used in the site. 38 | // 39 | 40 | @import "elements/alerts"; 41 | @import "elements/buttons"; 42 | @import "elements/callouts"; 43 | @import "elements/forms"; 44 | @import "elements/navbar"; 45 | @import "elements/panels"; 46 | @import "elements/tables"; 47 | @import "elements/utilities"; 48 | @import "elements/invoice"; 49 | @import "elements/images"; 50 | -------------------------------------------------------------------------------- /assets/vendor/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .icon(@icon) { 5 | .icon-FontAwesome(); 6 | content: @icon; 7 | } 8 | 9 | .icon-FontAwesome() { 10 | font-family: FontAwesome; 11 | font-weight: normal; 12 | font-style: normal; 13 | text-decoration: inherit; 14 | -webkit-font-smoothing: antialiased; 15 | *margin-right: .3em; // fixes ie7 issues 16 | } 17 | 18 | .border-radius(@radius) { 19 | -webkit-border-radius: @radius; 20 | -moz-border-radius: @radius; 21 | border-radius: @radius; 22 | } 23 | 24 | .icon-stack(@width: 2em, @height: 2em, @top-font-size: 1em, @base-font-size: 2em) { 25 | .icon-stack { 26 | position: relative; 27 | display: inline-block; 28 | width: @width; 29 | height: @height; 30 | line-height: @width; 31 | vertical-align: -35%; 32 | [class^="icon-"], 33 | [class*=" icon-"] { 34 | display: block; 35 | text-align: center; 36 | position: absolute; 37 | width: 100%; 38 | height: 100%; 39 | font-size: @top-font-size; 40 | line-height: inherit; 41 | *line-height: @height; 42 | } 43 | .icon-stack-base { 44 | font-size: @base-font-size; 45 | *line-height: @height / @base-font-size; 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /pages/settings/subscribe.htm: -------------------------------------------------------------------------------- 1 | title = "Subscription" 2 | url = "/settings/subscribe" 3 | layout = "settings" 4 | 5 | [subscribe] 6 | paymentPage = "settings/subscribe-pay" 7 | 8 | [subscribePlanList] 9 | 10 | [resources] 11 | vars[activeSetting] = "subscribe" 12 | js[] = "controls/subscribe.js" 13 | js[] = "pages/settings-subscribe.js" 14 | == 15 | 16 | {% partial 'settings-subscribe/trial-expire-notice' %} 17 | 18 | {% if user.hasMembership %} 19 | 20 | {% if user.subscriptionIsCancelled %} 21 | 22 | {% partial 'settings-subscribe/resume-subscription' %} 23 | 24 | {% else %} 25 | 26 | {% partial 'settings-subscribe/update-subscription' %} 27 | 28 |
    29 |
    30 | 37 |
    38 |
    39 | 40 | {% endif %} 41 | 42 | {% else %} 43 | 44 | {% partial 'settings-subscribe/new-subscriber' %} 45 | 46 | {% endif %} 47 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------------------------------- 3 | 4 | // Utilities 5 | @import "mixins/hide-text.less"; 6 | @import "mixins/opacity.less"; 7 | @import "mixins/image.less"; 8 | @import "mixins/labels.less"; 9 | @import "mixins/reset-filter.less"; 10 | @import "mixins/resize.less"; 11 | @import "mixins/responsive-visibility.less"; 12 | @import "mixins/size.less"; 13 | @import "mixins/tab-focus.less"; 14 | @import "mixins/text-emphasis.less"; 15 | @import "mixins/text-overflow.less"; 16 | @import "mixins/vendor-prefixes.less"; 17 | 18 | // Components 19 | @import "mixins/alerts.less"; 20 | @import "mixins/buttons.less"; 21 | @import "mixins/panels.less"; 22 | @import "mixins/pagination.less"; 23 | @import "mixins/list-group.less"; 24 | @import "mixins/nav-divider.less"; 25 | @import "mixins/forms.less"; 26 | @import "mixins/progress-bar.less"; 27 | @import "mixins/table-row.less"; 28 | 29 | // Skins 30 | @import "mixins/background-variant.less"; 31 | @import "mixins/border-radius.less"; 32 | @import "mixins/gradients.less"; 33 | 34 | // Layout 35 | @import "mixins/clearfix.less"; 36 | @import "mixins/center-block.less"; 37 | @import "mixins/nav-vertical-align.less"; 38 | @import "mixins/grid-framework.less"; 39 | @import "mixins/grid.less"; 40 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/buttons.less: -------------------------------------------------------------------------------- 1 | // Button variants 2 | // 3 | // Easily pump out default styles, as well as :hover, :focus, :active, 4 | // and disabled options for all buttons 5 | 6 | .button-variant(@color; @background; @border) { 7 | color: @color; 8 | background-color: @background; 9 | border-color: @border; 10 | 11 | &:hover, 12 | &:focus, 13 | &.focus, 14 | &:active, 15 | &.active, 16 | .open > .dropdown-toggle& { 17 | color: @color; 18 | background-color: darken(@background, 10%); 19 | border-color: darken(@border, 12%); 20 | } 21 | &:active, 22 | &.active, 23 | .open > .dropdown-toggle& { 24 | background-image: none; 25 | } 26 | &.disabled, 27 | &[disabled], 28 | fieldset[disabled] & { 29 | &, 30 | &:hover, 31 | &:focus, 32 | &.focus, 33 | &:active, 34 | &.active { 35 | background-color: @background; 36 | border-color: @border; 37 | } 38 | } 39 | 40 | .badge { 41 | color: @background; 42 | background-color: @color; 43 | } 44 | } 45 | 46 | // Button sizes 47 | .button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { 48 | padding: @padding-vertical @padding-horizontal; 49 | font-size: @font-size; 50 | line-height: @line-height; 51 | border-radius: @border-radius; 52 | } 53 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "variables.less"; 3 | @import "mixins.less"; 4 | 5 | // Reset and dependencies 6 | @import "normalize.less"; 7 | @import "print.less"; 8 | @import "glyphicons.less"; 9 | 10 | // Core CSS 11 | @import "scaffolding.less"; 12 | @import "type.less"; 13 | @import "code.less"; 14 | @import "grid.less"; 15 | @import "tables.less"; 16 | @import "forms.less"; 17 | @import "buttons.less"; 18 | 19 | // Components 20 | @import "component-animations.less"; 21 | @import "dropdowns.less"; 22 | @import "button-groups.less"; 23 | @import "input-groups.less"; 24 | @import "navs.less"; 25 | @import "navbar.less"; 26 | @import "breadcrumbs.less"; 27 | @import "pagination.less"; 28 | @import "pager.less"; 29 | @import "labels.less"; 30 | @import "badges.less"; 31 | @import "jumbotron.less"; 32 | @import "thumbnails.less"; 33 | @import "alerts.less"; 34 | @import "progress-bars.less"; 35 | @import "media.less"; 36 | @import "list-group.less"; 37 | @import "panels.less"; 38 | @import "responsive-embed.less"; 39 | @import "wells.less"; 40 | @import "close.less"; 41 | 42 | // Components w/ JavaScript 43 | @import "modals.less"; 44 | @import "tooltip.less"; 45 | @import "popovers.less"; 46 | @import "carousel.less"; 47 | 48 | // Utility classes 49 | @import "utilities.less"; 50 | @import "responsive-utilities.less"; 51 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/labels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: @label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // Add hover effects, but only for links 18 | a& { 19 | &:hover, 20 | &:focus { 21 | color: @label-link-hover-color; 22 | text-decoration: none; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Empty labels collapse automatically (not available in IE8) 28 | &:empty { 29 | display: none; 30 | } 31 | 32 | // Quick fix for labels in buttons 33 | .btn & { 34 | position: relative; 35 | top: -1px; 36 | } 37 | } 38 | 39 | // Colors 40 | // Contextual variations (linked labels get darker on :hover) 41 | 42 | .label-default { 43 | .label-variant(@label-default-bg); 44 | } 45 | 46 | .label-primary { 47 | .label-variant(@label-primary-bg); 48 | } 49 | 50 | .label-success { 51 | .label-variant(@label-success-bg); 52 | } 53 | 54 | .label-info { 55 | .label-variant(@label-info-bg); 56 | } 57 | 58 | .label-warning { 59 | .label-variant(@label-warning-bg); 60 | } 61 | 62 | .label-danger { 63 | .label-variant(@label-danger-bg); 64 | } 65 | -------------------------------------------------------------------------------- /pages/settings/payment-method.htm: -------------------------------------------------------------------------------- 1 | title = "Invoices" 2 | url = "/settings/payment-method/:id" 3 | layout = "settings" 4 | 5 | [payProfile] 6 | profilePage = "settings/payment-method" 7 | isPrimary = 1 8 | 9 | [resources] 10 | vars[activeSetting] = "payment-methods" 11 | == 12 | {% if paymentMethod %} 13 | 14 | {% if profile %} 15 |
    16 |
    17 | {{ form_ajax('onDeletePaymentProfile') }} 18 | 19 | 20 | 21 | Stored payment profile — {{ '************' ~ profile.card_last_four }} 22 | 23 | 26 | 27 | {{ form_close() }} 28 |
    29 |
    30 | {% endif %} 31 | 32 |
    33 |
    Update Payment Method
    34 | 35 |
    36 | {{ paymentMethod.renderPaymentProfileForm(this.controller)|raw }} 37 |
    38 |
    39 | 40 | {% else %} 41 | 42 |
    43 |
    44 |

    Payment method not found.

    45 |
    46 |
    47 | 48 | {% endif %} 49 | -------------------------------------------------------------------------------- /assets/vendor/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 3.2.1 3 | * the iconic font designed for Bootstrap 4 | * ------------------------------------------------------------------------------ 5 | * The full suite of pictographic icons, examples, and documentation can be 6 | * found at http://fontawesome.io. Stay up to date on Twitter at 7 | * http://twitter.com/fontawesome. 8 | * 9 | * License 10 | * ------------------------------------------------------------------------------ 11 | * - The Font Awesome font is licensed under SIL OFL 1.1 - 12 | * http://scripts.sil.org/OFL 13 | * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - 14 | * http://opensource.org/licenses/mit-license.html 15 | * - Font Awesome documentation licensed under CC BY 3.0 - 16 | * http://creativecommons.org/licenses/by/3.0/ 17 | * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: 18 | * "Font Awesome by Dave Gandy - http://fontawesome.io" 19 | * 20 | * Author - Dave Gandy 21 | * ------------------------------------------------------------------------------ 22 | * Email: dave@fontawesome.io 23 | * Twitter: http://twitter.com/davegandy 24 | * Work: Lead Product Designer @ Kyruus - http://kyruus.com 25 | */ 26 | 27 | @import "variables.less"; 28 | @import "mixins.less"; 29 | @import "path.less"; 30 | @import "core.less"; 31 | @import "bootstrap.less"; 32 | @import "extras.less"; 33 | @import "icons.less"; 34 | -------------------------------------------------------------------------------- /partials/account/fields-billing.htm: -------------------------------------------------------------------------------- 1 | 2 |
    3 | 4 | 5 |
    6 | 7 |
    8 |
    9 | 10 | 11 |
    12 | 13 | 14 |
    15 | 16 |
    17 |
    18 | 19 | 20 |
    21 | 22 | 23 | 24 |
    25 | 26 |
    27 | 28 | 29 |
    30 | 31 |
    32 |
    33 | 34 | 35 |
    36 | 37 | 38 |
    39 | {{ form_select_country('country', user.country_id, { 40 | emptyOption: '', 41 | class: 'form-control', 42 | onChange: onChangeCountry 43 | }) }} 44 |
    45 |
    46 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: @font-size-small; 12 | font-weight: @badge-font-weight; 13 | color: @badge-color; 14 | line-height: @badge-line-height; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: @badge-bg; 19 | border-radius: @badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | 26 | // Quick fix for badges in buttons 27 | .btn & { 28 | position: relative; 29 | top: -1px; 30 | } 31 | 32 | .btn-xs &, 33 | .btn-group-xs > .btn & { 34 | top: 0; 35 | padding: 1px 5px; 36 | } 37 | 38 | // Hover state, but only for links 39 | a& { 40 | &:hover, 41 | &:focus { 42 | color: @badge-link-hover-color; 43 | text-decoration: none; 44 | cursor: pointer; 45 | } 46 | } 47 | 48 | // Account for badges in navs 49 | .list-group-item.active > &, 50 | .nav-pills > .active > a > & { 51 | color: @badge-active-color; 52 | background-color: @badge-active-bg; 53 | } 54 | 55 | .list-group-item > & { 56 | float: right; 57 | } 58 | 59 | .list-group-item > & + & { 60 | margin-right: 5px; 61 | } 62 | 63 | .nav-pills > li > a > & { 64 | margin-left: 3px; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /pages/settings/payment-methods.htm: -------------------------------------------------------------------------------- 1 | title = "Payment Methods" 2 | url = "/settings/payment-methods" 3 | layout = "settings" 4 | 5 | [payProfiles] 6 | profilePage = "settings/payment-method" 7 | autoRedirect = 0 8 | 9 | [resources] 10 | vars[activeSetting] = "payment-methods" 11 | == 12 |
    13 |
    Payment Methods
    14 | 15 | {% if paymentMethods|length %} 16 | 35 | {% else %} 36 |
    37 |

    Payment profiles not found

    38 |
    39 | {% endif %} 40 |
    41 | -------------------------------------------------------------------------------- /pages/settings/security.htm: -------------------------------------------------------------------------------- 1 | title = "Security" 2 | url = "/settings/security" 3 | layout = "settings" 4 | 5 | [account] 6 | 7 | [resources] 8 | vars[activeSetting] = "security" 9 | == 10 | 11 |
    12 |
    Update Password
    13 | 14 |
    15 | 16 | {{ form_ajax('onUpdate', { model: user, class: 'form-horizontal' }) }} 17 | 18 | 19 | 20 |
    21 | 22 |
    23 | 24 |
    25 |
    26 | 27 |
    28 | 29 |
    30 | 31 |
    32 |
    33 | 34 | 35 |
    36 |
    37 | 38 |
    39 |
    40 | 41 | {{ form_close() }} 42 | 43 |
    44 |
    45 | -------------------------------------------------------------------------------- /partials/payment/pay-method.htm: -------------------------------------------------------------------------------- 1 | {% if invoice and not invoice.isPaymentProcessed %} 2 |
    3 | {% if paymentMethods|length %} 4 | 5 | 6 | {% if paymentMethods|length > 1 %} 7 |
    Please choose a payment method
    8 | 9 | {{ form_open() }} 10 | {% for type in paymentMethods %} 11 |
    12 | 24 |
    25 | {% endfor %} 26 | {{ form_close() }} 27 | 28 | {% endif %} 29 | 30 | 31 |
    {% partial 'payment/pay-form' %}
    32 | {% else %} 33 |

    Whoops! There are not payment methods set up, please contact site support.

    34 | {% endif %} 35 |
    36 | {% endif %} 37 | -------------------------------------------------------------------------------- /partials/settings-subscribe/resume-subscription.htm: -------------------------------------------------------------------------------- 1 | {% set monthlyPlans = subscribePlanList.monthlyPlans %} 2 | {% set yearlyPlans = subscribePlanList.yearlyPlans %} 3 | {% set hasMonthlyAndYearlyPlans = monthlyPlans and yearlyPlans %} 4 | {% set activeSubscription = user.activeSubscription %} 5 | {% set activePlan = activeSubscription.plan %} 6 | 7 | {{ form_ajax('onSubscribe', { id: 'subscribeForm', class: 'form-horizontal is-cancelled' }) }} 8 |
    9 |
    10 |
    11 | Resume Subscription 12 |
    13 | 14 | 15 | {% partial 'plans/tabs-heading' %} 16 | 17 |
    18 |
    19 | 20 |
    21 |
    22 | Your subscription to the {{ activePlan.name }} plan has been cancelled. 23 |
    24 | 25 | {% if activeSubscription.isDelayCancelled %} 26 |
    27 | The benefits of your subscription will continue until your current billing period ends on {{ activeSubscription.getCancelDate.toFormattedDateString }}. 28 | You may resume your subscription at no extra cost until the end of the billing period. 29 |
    30 | {% endif %} 31 | 32 | 33 | {% partial 'plans/tabs-content' resumeMode=1 %} 34 |
    35 |
    36 | {{ form_close() }} 37 | -------------------------------------------------------------------------------- /partials/settings-subscribe/update-confirm-form.htm: -------------------------------------------------------------------------------- 1 | {{ form_ajax('onUpdateConfirm') }} 2 | 6 | 29 | 44 | {{ form_close() }} 45 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and block) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: @font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 4px; 17 | font-size: 90%; 18 | color: @code-color; 19 | background-color: @code-bg; 20 | border-radius: @border-radius-base; 21 | } 22 | 23 | // User input typically entered via keyboard 24 | kbd { 25 | padding: 2px 4px; 26 | font-size: 90%; 27 | color: @kbd-color; 28 | background-color: @kbd-bg; 29 | border-radius: @border-radius-small; 30 | box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); 31 | 32 | kbd { 33 | padding: 0; 34 | font-size: 100%; 35 | font-weight: bold; 36 | box-shadow: none; 37 | } 38 | } 39 | 40 | // Blocks of code 41 | pre { 42 | display: block; 43 | padding: ((@line-height-computed - 1) / 2); 44 | margin: 0 0 (@line-height-computed / 2); 45 | font-size: (@font-size-base - 1); // 14px to 13px 46 | line-height: @line-height-base; 47 | word-break: break-all; 48 | word-wrap: break-word; 49 | color: @pre-color; 50 | background-color: @pre-bg; 51 | border: 1px solid @pre-border-color; 52 | border-radius: @border-radius-base; 53 | 54 | // Account for some code outputs that place code tags in pre tags 55 | code { 56 | padding: 0; 57 | font-size: inherit; 58 | color: inherit; 59 | white-space: pre-wrap; 60 | background-color: transparent; 61 | border-radius: 0; 62 | } 63 | } 64 | 65 | // Enable scrollable blocks of code 66 | .pre-scrollable { 67 | max-height: @pre-scrollable-max-height; 68 | overflow-y: scroll; 69 | } 70 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/grid.less: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | 6 | // Container widths 7 | // 8 | // Set the container width, and override it for fixed navbars in media queries. 9 | 10 | .container { 11 | .container-fixed(); 12 | 13 | @media (min-width: @screen-sm-min) { 14 | width: @container-sm; 15 | } 16 | @media (min-width: @screen-md-min) { 17 | width: @container-md; 18 | } 19 | @media (min-width: @screen-lg-min) { 20 | width: @container-lg; 21 | } 22 | } 23 | 24 | 25 | // Fluid container 26 | // 27 | // Utilizes the mixin meant for fixed width containers, but without any defined 28 | // width for fluid, full width layouts. 29 | 30 | .container-fluid { 31 | .container-fixed(); 32 | } 33 | 34 | 35 | // Row 36 | // 37 | // Rows contain and clear the floats of your columns. 38 | 39 | .row { 40 | .make-row(); 41 | } 42 | 43 | 44 | // Columns 45 | // 46 | // Common styles for small and large grid columns 47 | 48 | .make-grid-columns(); 49 | 50 | 51 | // Extra small grid 52 | // 53 | // Columns, offsets, pushes, and pulls for extra small devices like 54 | // smartphones. 55 | 56 | .make-grid(xs); 57 | 58 | 59 | // Small grid 60 | // 61 | // Columns, offsets, pushes, and pulls for the small device range, from phones 62 | // to tablets. 63 | 64 | @media (min-width: @screen-sm-min) { 65 | .make-grid(sm); 66 | } 67 | 68 | 69 | // Medium grid 70 | // 71 | // Columns, offsets, pushes, and pulls for the desktop device range. 72 | 73 | @media (min-width: @screen-md-min) { 74 | .make-grid(md); 75 | } 76 | 77 | 78 | // Large grid 79 | // 80 | // Columns, offsets, pushes, and pulls for the large desktop device range. 81 | 82 | @media (min-width: @screen-lg-min) { 83 | .make-grid(lg); 84 | } 85 | -------------------------------------------------------------------------------- /assets/less/elements/navbar.less: -------------------------------------------------------------------------------- 1 | .navbar-inverse .navbar-brand { 2 | color: @navbar-inverse-link-color; 3 | font-weight: 400; 4 | } 5 | 6 | .navbar-inverse .navbar-brand:hover, 7 | .navbar-inverse .navbar-brand:focus { 8 | color: @navbar-inverse-link-color; 9 | } 10 | 11 | .navbar-nav > li > form > a, 12 | .navbar-nav > li > a { 13 | cursor: pointer; 14 | font-weight: 400; 15 | } 16 | 17 | .navbar-nav > li > form > a, 18 | .navbar-nav > li > a, 19 | .navbar-brand, 20 | .hamburger { 21 | height: 70px; 22 | display: flex; 23 | flex-direction: row; 24 | justify-content: center; 25 | align-items: center; 26 | } 27 | 28 | .navbar-icon { 29 | padding-top: 3px; 30 | position: relative; 31 | 32 | .activity-indicator { 33 | width: 13px; 34 | height: 13px; 35 | border-radius: 10px; 36 | background: @brand-danger; 37 | border: 2px solid #fff; 38 | border-radius: 10px; 39 | position: absolute; 40 | right: -1px; 41 | transition: all .15s; 42 | transform: scale(.85); 43 | display: none; 44 | } 45 | 46 | .icon { font-size: 21px; } 47 | } 48 | 49 | .notifications-link.has-notifications .activity-indicator { 50 | display: inline-block; 51 | } 52 | 53 | .notifications-link:hover .activity-indicator { 54 | transform: scale(1.1); 55 | } 56 | 57 | .navbar .dropdown-header { 58 | font-weight: bold; 59 | margin-bottom: 5px; 60 | } 61 | 62 | .navbar .dropdown-menu > li > a { 63 | font-weight: 300; 64 | 65 | i { 66 | color: lighten(@text-color, 25%); 67 | } 68 | 69 | i.text-success { 70 | color: @brand-success; 71 | } 72 | } 73 | 74 | .hamburger { float: right; } 75 | 76 | .with-navbar { 77 | padding-top: 100px; 78 | } 79 | -------------------------------------------------------------------------------- /partials/account/register-account.htm: -------------------------------------------------------------------------------- 1 | {% set hasPaidPlans = subscribePlanList.hasPaidPlans %} 2 | 3 | 4 |
    5 |
    6 |
    7 |
    8 | {% if hasPaidPlans %} 9 | Profile 10 | {% else %} 11 | Register 12 | {% endif %} 13 |
    14 | 15 |
    16 | 17 | {% partial 'account/fields-account' %} 18 | 19 | 20 |
    21 |
    22 |
    23 | By registering you agree to the terms of service 24 |
    25 |
    26 | 27 |
    28 |
    29 | 38 |
    39 |
    40 |
    41 | 42 |
    43 |
    44 |
    45 |
    46 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: @alert-padding; 11 | margin-bottom: @line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: @alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing @headings-color 19 | color: inherit; 20 | } 21 | 22 | // Provide class for links that match alerts 23 | .alert-link { 24 | font-weight: @alert-link-font-weight; 25 | } 26 | 27 | // Improve alignment and spacing of inner content 28 | > p, 29 | > ul { 30 | margin-bottom: 0; 31 | } 32 | 33 | > p + p { 34 | margin-top: 5px; 35 | } 36 | } 37 | 38 | // Dismissible alerts 39 | // 40 | // Expand the right padding and account for the close button's positioning. 41 | 42 | .alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. 43 | .alert-dismissible { 44 | padding-right: (@alert-padding + 20); 45 | 46 | // Adjust close link position 47 | .close { 48 | position: relative; 49 | top: -2px; 50 | right: -21px; 51 | color: inherit; 52 | } 53 | } 54 | 55 | // Alternate styles 56 | // 57 | // Generate contextual modifier classes for colorizing the alert. 58 | 59 | .alert-success { 60 | .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); 61 | } 62 | 63 | .alert-info { 64 | .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); 65 | } 66 | 67 | .alert-warning { 68 | .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); 69 | } 70 | 71 | .alert-danger { 72 | .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); 73 | } 74 | -------------------------------------------------------------------------------- /partials/settings-subscribe/update-subscription.htm: -------------------------------------------------------------------------------- 1 | {% set monthlyPlans = subscribePlanList.monthlyPlans %} 2 | {% set yearlyPlans = subscribePlanList.yearlyPlans %} 3 | {% set hasMonthlyAndYearlyPlans = monthlyPlans and yearlyPlans %} 4 | {% set activePlan = user.activeSubscription.plan %} 5 | 6 | {{ form_ajax('onSubscribe', { id: 'subscribeForm', class: 'form-horizontal is-subscribed' }) }} 7 |
    8 |
    9 |
    10 | Update Subscription 11 |
    12 | 13 | 14 | {% partial 'plans/tabs-heading' %} 15 | 16 |
    17 |
    18 | 19 |
    20 | 21 | {% if activePlan.isActive %} 22 | 23 |
    24 | You are currently subscribed to the {{ activePlan.name }} plan. 25 |
    26 | {% else %} 27 | 28 |
    29 | You are currently subscribed to the {{ activePlan.name }} plan. 30 | This plan has been discontinued, but you may continue your subscription to this plan as long as you wish. 31 | If you cancel your subscription and later want to begin a new subscription, you will need to choose from one of the active plans listed below. 32 |
    33 | {% endif %} 34 | 35 | 36 | {% partial 'plans/tabs-content' activePlan=activePlan %} 37 |
    38 |
    39 | {{ form_close() }} 40 | -------------------------------------------------------------------------------- /pages/settings/invoices.htm: -------------------------------------------------------------------------------- 1 | title = "Invoices" 2 | url = "/settings/invoices" 3 | layout = "settings" 4 | 5 | [invoices] 6 | invoicePage = "settings/invoice" 7 | 8 | [resources] 9 | vars[activeSetting] = "invoices" 10 | == 11 |
    12 |
    Invoices
    13 | 14 |
    15 | {% if invoices|length %} 16 | 17 | 18 | 19 | 20 | {% for invoice in invoices %} 21 | 22 | 23 | 28 | 29 | 30 | 33 | 34 | 35 | 42 | 43 | {% endfor %} 44 | 45 |
    24 |
    25 | {{ invoice.sent_at }} 26 |
    27 |
    31 |
    {{ invoice.total|currency }}
    32 |
    36 | 37 | 40 | 41 |
    46 | {% else %} 47 | There are no invoices to display. 48 | {% endif %} 49 |
    50 |
    51 | -------------------------------------------------------------------------------- /partials/account/register-billing.htm: -------------------------------------------------------------------------------- 1 | 47 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/js/transition.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: transition.js v3.3.4 3 | * http://getbootstrap.com/javascript/#transitions 4 | * ======================================================================== 5 | * Copyright 2011-2015 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 14 | // ============================================================ 15 | 16 | function transitionEnd() { 17 | var el = document.createElement('bootstrap') 18 | 19 | var transEndEventNames = { 20 | WebkitTransition : 'webkitTransitionEnd', 21 | MozTransition : 'transitionend', 22 | OTransition : 'oTransitionEnd otransitionend', 23 | transition : 'transitionend' 24 | } 25 | 26 | for (var name in transEndEventNames) { 27 | if (el.style[name] !== undefined) { 28 | return { end: transEndEventNames[name] } 29 | } 30 | } 31 | 32 | return false // explicit for ie8 ( ._.) 33 | } 34 | 35 | // http://blog.alexmaccaw.com/css-transitions 36 | $.fn.emulateTransitionEnd = function (duration) { 37 | var called = false 38 | var $el = this 39 | $(this).one('bsTransitionEnd', function () { called = true }) 40 | var callback = function () { if (!called) $($el).trigger($.support.transition.end) } 41 | setTimeout(callback, duration) 42 | return this 43 | } 44 | 45 | $(function () { 46 | $.support.transition = transitionEnd() 47 | 48 | if (!$.support.transition) return 49 | 50 | $.event.special.bsTransitionEnd = { 51 | bindType: $.support.transition.end, 52 | delegateType: $.support.transition.end, 53 | handle: function (e) { 54 | if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) 55 | } 56 | } 57 | }) 58 | 59 | }(jQuery); 60 | -------------------------------------------------------------------------------- /assets/less/controls/notifications.less: -------------------------------------------------------------------------------- 1 | .control-notifications { 2 | position: relative; 3 | 4 | .notifications-popover { 5 | background: #fff; 6 | border: 1px solid #f0f0f0; 7 | position: absolute; 8 | width: 480px; 9 | z-index: 2; 10 | right: -10px; 11 | top: 0; 12 | display: none; 13 | box-shadow: 0 6px 12px rgba(0,0,0,.175); 14 | } 15 | 16 | &.active .notifications-popover { 17 | display: block; 18 | } 19 | 20 | .notifications-header { 21 | border-bottom: 1px solid #f0f0f0; 22 | padding: 15px; 23 | 24 | h4 { 25 | padding: 0; 26 | margin: 0; 27 | display: inline-block; 28 | } 29 | 30 | .close, .mark-all-read { 31 | float: right; 32 | margin: 0 5px; 33 | } 34 | } 35 | 36 | .notifications-content { 37 | .notifications-loading { 38 | padding: 20px; 39 | font-size: 24px; 40 | text-align: center; 41 | } 42 | 43 | .no-notifications { 44 | text-align: center; 45 | padding: 25px; 46 | margin: 0; 47 | } 48 | 49 | > ul { 50 | padding: 0; 51 | margin: 0; 52 | list-style: none; 53 | overflow: auto; 54 | max-height: 400px; 55 | } 56 | 57 | > ul > li { 58 | position: relative; 59 | padding: 10px 25px 10px 60px; 60 | border-bottom: 1px solid #f9f9f9; 61 | 62 | > i { 63 | position: absolute; 64 | left: 25px; 65 | top: 12px; 66 | font-size: 18px; 67 | opacity: .5; 68 | } 69 | 70 | .parsed-body > *:last-child { 71 | margin-bottom: 0; 72 | } 73 | 74 | .date { 75 | white-space: nowrap; 76 | opacity: .75; 77 | } 78 | } 79 | } 80 | 81 | .notifications-footer { 82 | border-top: 1px solid #f0f0f0; 83 | padding: 15px; 84 | text-align: center; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /pages/account/signin.htm: -------------------------------------------------------------------------------- 1 | title = "Sign in" 2 | url = "/signin" 3 | layout = "default" 4 | 5 | [account] 6 | redirect = "dashboard" 7 | 8 | [session] 9 | redirect = "dashboard" 10 | security = "guest" 11 | == 12 |
    13 |
    14 |
    15 |
    16 |
    Sign in
    17 | 18 |
    19 | {% partial 'site/errors' %} 20 | 21 | {{ form_open({ request: 'onSignin', class: 'form-horizontal' }) }} 22 | 23 |
    24 | 25 | 26 |
    27 | 28 |
    29 |
    30 | 31 | 32 |
    33 | 34 | 35 |
    36 | 37 |
    38 |
    39 | 40 | 41 |
    42 |
    43 | 46 | 47 | Forgot Your Password? 48 |
    49 |
    50 | {{ form_close() }} 51 | 52 |
    53 |
    54 |
    55 |
    56 |
    57 | -------------------------------------------------------------------------------- /assets/less/vendor.less: -------------------------------------------------------------------------------- 1 | // 2 | // Vendor file 3 | // 4 | // Includes all vendor LESS files that contain usable output 5 | // 6 | 7 | @import "theme/boot"; 8 | 9 | // 10 | // Bootstrap 11 | // 12 | 13 | // Reset 14 | @import "../vendor/bootstrap/less/normalize"; 15 | @import "../vendor/bootstrap/less/print"; 16 | 17 | // Core CSS 18 | @import "../vendor/bootstrap/less/scaffolding"; 19 | @import "../vendor/bootstrap/less/type"; 20 | @import "../vendor/bootstrap/less/code"; 21 | @import "../vendor/bootstrap/less/grid"; 22 | @import "../vendor/bootstrap/less/tables"; 23 | @import "../vendor/bootstrap/less/forms"; 24 | @import "../vendor/bootstrap/less/buttons"; 25 | 26 | // Components 27 | @import "../vendor/bootstrap/less/component-animations"; 28 | @import "../vendor/bootstrap/less/dropdowns"; 29 | @import "../vendor/bootstrap/less/button-groups"; 30 | @import "../vendor/bootstrap/less/input-groups"; 31 | @import "../vendor/bootstrap/less/navs"; 32 | @import "../vendor/bootstrap/less/navbar"; 33 | @import "../vendor/bootstrap/less/breadcrumbs"; 34 | @import "../vendor/bootstrap/less/pagination"; 35 | @import "../vendor/bootstrap/less/pager"; 36 | @import "../vendor/bootstrap/less/labels"; 37 | @import "../vendor/bootstrap/less/badges"; 38 | @import "../vendor/bootstrap/less/jumbotron"; 39 | @import "../vendor/bootstrap/less/thumbnails"; 40 | @import "../vendor/bootstrap/less/alerts"; 41 | @import "../vendor/bootstrap/less/progress-bars"; 42 | @import "../vendor/bootstrap/less/media"; 43 | @import "../vendor/bootstrap/less/list-group"; 44 | @import "../vendor/bootstrap/less/panels"; 45 | @import "../vendor/bootstrap/less/wells"; 46 | @import "../vendor/bootstrap/less/close"; 47 | 48 | // Components w/ JavaScript 49 | @import "../vendor/bootstrap/less/modals"; 50 | @import "../vendor/bootstrap/less/tooltip"; 51 | @import "../vendor/bootstrap/less/popovers"; 52 | @import "../vendor/bootstrap/less/carousel"; 53 | 54 | // Utility classes 55 | @import "../vendor/bootstrap/less/utilities"; 56 | @import "../vendor/bootstrap/less/responsive-utilities"; 57 | 58 | // 59 | // Font Awesome 60 | // 61 | 62 | @import "../vendor/font-awesome/less/path"; 63 | @import "../vendor/font-awesome/less/core"; 64 | @import "../vendor/font-awesome/less/bootstrap"; 65 | @import "../vendor/font-awesome/less/extras"; 66 | @import "../vendor/font-awesome/less/icons"; 67 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/progress-bars.less: -------------------------------------------------------------------------------- 1 | // 2 | // Progress bars 3 | // -------------------------------------------------- 4 | 5 | 6 | // Bar animations 7 | // ------------------------- 8 | 9 | // WebKit 10 | @-webkit-keyframes progress-bar-stripes { 11 | from { background-position: 40px 0; } 12 | to { background-position: 0 0; } 13 | } 14 | 15 | // Spec and IE10+ 16 | @keyframes progress-bar-stripes { 17 | from { background-position: 40px 0; } 18 | to { background-position: 0 0; } 19 | } 20 | 21 | 22 | // Bar itself 23 | // ------------------------- 24 | 25 | // Outer container 26 | .progress { 27 | overflow: hidden; 28 | height: @line-height-computed; 29 | margin-bottom: @line-height-computed; 30 | background-color: @progress-bg; 31 | border-radius: @progress-border-radius; 32 | .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); 33 | } 34 | 35 | // Bar of progress 36 | .progress-bar { 37 | float: left; 38 | width: 0%; 39 | height: 100%; 40 | font-size: @font-size-small; 41 | line-height: @line-height-computed; 42 | color: @progress-bar-color; 43 | text-align: center; 44 | background-color: @progress-bar-bg; 45 | .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); 46 | .transition(width .6s ease); 47 | } 48 | 49 | // Striped bars 50 | // 51 | // `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the 52 | // `.progress-bar-striped` class, which you just add to an existing 53 | // `.progress-bar`. 54 | .progress-striped .progress-bar, 55 | .progress-bar-striped { 56 | #gradient > .striped(); 57 | background-size: 40px 40px; 58 | } 59 | 60 | // Call animation for the active one 61 | // 62 | // `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the 63 | // `.progress-bar.active` approach. 64 | .progress.active .progress-bar, 65 | .progress-bar.active { 66 | .animation(progress-bar-stripes 2s linear infinite); 67 | } 68 | 69 | 70 | // Variations 71 | // ------------------------- 72 | 73 | .progress-bar-success { 74 | .progress-bar-variant(@progress-bar-success-bg); 75 | } 76 | 77 | .progress-bar-info { 78 | .progress-bar-variant(@progress-bar-info-bg); 79 | } 80 | 81 | .progress-bar-warning { 82 | .progress-bar-variant(@progress-bar-warning-bg); 83 | } 84 | 85 | .progress-bar-danger { 86 | .progress-bar-variant(@progress-bar-danger-bg); 87 | } 88 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/pagination.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pagination (multiple pages) 3 | // -------------------------------------------------- 4 | .pagination { 5 | display: inline-block; 6 | padding-left: 0; 7 | margin: @line-height-computed 0; 8 | border-radius: @border-radius-base; 9 | 10 | > li { 11 | display: inline; // Remove list-style and block-level defaults 12 | > a, 13 | > span { 14 | position: relative; 15 | float: left; // Collapse white-space 16 | padding: @padding-base-vertical @padding-base-horizontal; 17 | line-height: @line-height-base; 18 | text-decoration: none; 19 | color: @pagination-color; 20 | background-color: @pagination-bg; 21 | border: 1px solid @pagination-border; 22 | margin-left: -1px; 23 | } 24 | &:first-child { 25 | > a, 26 | > span { 27 | margin-left: 0; 28 | .border-left-radius(@border-radius-base); 29 | } 30 | } 31 | &:last-child { 32 | > a, 33 | > span { 34 | .border-right-radius(@border-radius-base); 35 | } 36 | } 37 | } 38 | 39 | > li > a, 40 | > li > span { 41 | &:hover, 42 | &:focus { 43 | color: @pagination-hover-color; 44 | background-color: @pagination-hover-bg; 45 | border-color: @pagination-hover-border; 46 | } 47 | } 48 | 49 | > .active > a, 50 | > .active > span { 51 | &, 52 | &:hover, 53 | &:focus { 54 | z-index: 2; 55 | color: @pagination-active-color; 56 | background-color: @pagination-active-bg; 57 | border-color: @pagination-active-border; 58 | cursor: default; 59 | } 60 | } 61 | 62 | > .disabled { 63 | > span, 64 | > span:hover, 65 | > span:focus, 66 | > a, 67 | > a:hover, 68 | > a:focus { 69 | color: @pagination-disabled-color; 70 | background-color: @pagination-disabled-bg; 71 | border-color: @pagination-disabled-border; 72 | cursor: @cursor-disabled; 73 | } 74 | } 75 | } 76 | 77 | // Sizing 78 | // -------------------------------------------------- 79 | 80 | // Large 81 | .pagination-lg { 82 | .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large); 83 | } 84 | 85 | // Small 86 | .pagination-sm { 87 | .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small); 88 | } 89 | -------------------------------------------------------------------------------- /partials/nav/settings.htm: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | Settings 4 |
    5 | 6 |
    7 |
    8 | 23 |
    24 |
    25 |
    26 | 27 | 28 |
    29 |
    30 | Billing 31 |
    32 | 33 |
    34 |
    35 | 57 |
    58 |
    59 |
    60 | -------------------------------------------------------------------------------- /assets/vendor/font-awesome/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | /* BOOTSTRAP SPECIFIC CLASSES 2 | * -------------------------- */ 3 | 4 | /* Bootstrap 2.0 sprites.less reset */ 5 | [class^="icon-"], 6 | [class*=" icon-"] { 7 | display: inline; 8 | width: auto; 9 | height: auto; 10 | line-height: normal; 11 | vertical-align: baseline; 12 | background-image: none; 13 | background-position: 0% 0%; 14 | background-repeat: repeat; 15 | margin-top: 0; 16 | } 17 | 18 | /* more sprites.less reset */ 19 | .icon-white, 20 | .nav-pills > .active > a > [class^="icon-"], 21 | .nav-pills > .active > a > [class*=" icon-"], 22 | .nav-list > .active > a > [class^="icon-"], 23 | .nav-list > .active > a > [class*=" icon-"], 24 | .navbar-inverse .nav > .active > a > [class^="icon-"], 25 | .navbar-inverse .nav > .active > a > [class*=" icon-"], 26 | .dropdown-menu > li > a:hover > [class^="icon-"], 27 | .dropdown-menu > li > a:hover > [class*=" icon-"], 28 | .dropdown-menu > .active > a > [class^="icon-"], 29 | .dropdown-menu > .active > a > [class*=" icon-"], 30 | .dropdown-submenu:hover > a > [class^="icon-"], 31 | .dropdown-submenu:hover > a > [class*=" icon-"] { 32 | background-image: none; 33 | } 34 | 35 | 36 | /* keeps Bootstrap styles with and without icons the same */ 37 | .btn, .nav { 38 | [class^="icon-"], 39 | [class*=" icon-"] { 40 | // display: inline; 41 | &.icon-large { line-height: .9em; } 42 | &.icon-spin { display: inline-block; } 43 | } 44 | } 45 | .nav-tabs, .nav-pills { 46 | [class^="icon-"], 47 | [class*=" icon-"] { 48 | &, &.icon-large { line-height: .9em; } 49 | } 50 | } 51 | .btn { 52 | [class^="icon-"], 53 | [class*=" icon-"] { 54 | &.pull-left, &.pull-right { 55 | &.icon-2x { margin-top: .18em; } 56 | } 57 | &.icon-spin.icon-large { line-height: .8em; } 58 | } 59 | } 60 | .btn.btn-small { 61 | [class^="icon-"], 62 | [class*=" icon-"] { 63 | &.pull-left, &.pull-right { 64 | &.icon-2x { margin-top: .25em; } 65 | } 66 | } 67 | } 68 | .btn.btn-large { 69 | [class^="icon-"], 70 | [class*=" icon-"] { 71 | margin-top: 0; // overrides bootstrap default 72 | &.pull-left, &.pull-right { 73 | &.icon-2x { margin-top: .05em; } 74 | } 75 | &.pull-left.icon-2x { margin-right: .2em; } 76 | &.pull-right.icon-2x { margin-left: .2em; } 77 | } 78 | } 79 | 80 | /* Fixes alignment in nav lists */ 81 | .nav-list [class^="icon-"], 82 | .nav-list [class*=" icon-"] { 83 | line-height: inherit; 84 | } 85 | -------------------------------------------------------------------------------- /partials/plans/table-items.htm: -------------------------------------------------------------------------------- 1 | {% for plan in plans %} 2 | 8 | 9 | 10 |
    11 | 12 | {{ plan.name }} 13 | 14 |
    15 | 16 | 17 | 18 | 19 | 25 | 26 | 27 | 28 | 29 |
    30 | {% if plan.isFree %} 31 | Free 32 | {% else %} 33 | {{ plan.price|currency }} / {{ plan.plan_type }} 34 | {% endif %} 35 |
    36 | 37 | 38 | 39 | 40 | {% if plan.hasTrialPeriod and showTrials %} 41 |
    42 | {{ plan.getTrialPeriod }} day trial 43 |
    44 | {% endif %} 45 | 46 | 47 | {% if resumeMode %} 48 | 49 | 50 | 56 | 57 | {% else %} 58 | 59 | 60 | 63 | 64 | 70 | 71 | {% endif %} 72 | 73 | {% endfor %} 74 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/js/alert.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: alert.js v3.3.4 3 | * http://getbootstrap.com/javascript/#alerts 4 | * ======================================================================== 5 | * Copyright 2011-2015 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // ALERT CLASS DEFINITION 14 | // ====================== 15 | 16 | var dismiss = '[data-dismiss="alert"]' 17 | var Alert = function (el) { 18 | $(el).on('click', dismiss, this.close) 19 | } 20 | 21 | Alert.VERSION = '3.3.4' 22 | 23 | Alert.TRANSITION_DURATION = 150 24 | 25 | Alert.prototype.close = function (e) { 26 | var $this = $(this) 27 | var selector = $this.attr('data-target') 28 | 29 | if (!selector) { 30 | selector = $this.attr('href') 31 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 32 | } 33 | 34 | var $parent = $(selector) 35 | 36 | if (e) e.preventDefault() 37 | 38 | if (!$parent.length) { 39 | $parent = $this.closest('.alert') 40 | } 41 | 42 | $parent.trigger(e = $.Event('close.bs.alert')) 43 | 44 | if (e.isDefaultPrevented()) return 45 | 46 | $parent.removeClass('in') 47 | 48 | function removeElement() { 49 | // detach from parent, fire event then clean up data 50 | $parent.detach().trigger('closed.bs.alert').remove() 51 | } 52 | 53 | $.support.transition && $parent.hasClass('fade') ? 54 | $parent 55 | .one('bsTransitionEnd', removeElement) 56 | .emulateTransitionEnd(Alert.TRANSITION_DURATION) : 57 | removeElement() 58 | } 59 | 60 | 61 | // ALERT PLUGIN DEFINITION 62 | // ======================= 63 | 64 | function Plugin(option) { 65 | return this.each(function () { 66 | var $this = $(this) 67 | var data = $this.data('bs.alert') 68 | 69 | if (!data) $this.data('bs.alert', (data = new Alert(this))) 70 | if (typeof option == 'string') data[option].call($this) 71 | }) 72 | } 73 | 74 | var old = $.fn.alert 75 | 76 | $.fn.alert = Plugin 77 | $.fn.alert.Constructor = Alert 78 | 79 | 80 | // ALERT NO CONFLICT 81 | // ================= 82 | 83 | $.fn.alert.noConflict = function () { 84 | $.fn.alert = old 85 | return this 86 | } 87 | 88 | 89 | // ALERT DATA-API 90 | // ============== 91 | 92 | $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) 93 | 94 | }(jQuery); 95 | -------------------------------------------------------------------------------- /assets/less/elements/buttons.less: -------------------------------------------------------------------------------- 1 | // Basic Buttons 2 | 3 | .btn { 4 | font-size: 13px; 5 | font-weight: 600; 6 | text-transform: uppercase; 7 | transition: background-color 0.2s; 8 | } 9 | 10 | .btn-primary, .btn-info, .btn-success, .btn-warning, .btn-danger { 11 | border: 0; 12 | } 13 | 14 | .btn-default:hover { 15 | background-color: white; 16 | } 17 | 18 | // Outline Buttons 19 | 20 | .button-outline-variant(@color; @activeTextColor: #fff) { 21 | color: @color; 22 | background-color: transparent; 23 | border-color: @color; 24 | 25 | &:focus, 26 | &.focus, 27 | &:hover, 28 | &:active, 29 | &.active, 30 | .open > .dropdown-toggle& { 31 | color: @activeTextColor; 32 | background-color: @color; 33 | box-shadow: none; 34 | } 35 | 36 | &.disabled, 37 | &[disabled], 38 | fieldset[disabled] & { 39 | &, 40 | &:hover, 41 | &:focus, 42 | &.focus, 43 | &:active, 44 | &.active { 45 | border-color: @color; 46 | } 47 | } 48 | } 49 | 50 | .btn-default-outline { 51 | .button-outline-variant(@btn-default-color); 52 | } 53 | 54 | .btn-primary-outline { 55 | .button-outline-variant(@btn-primary-border); 56 | } 57 | 58 | .btn-success-outline { 59 | .button-outline-variant(@btn-success-border); 60 | } 61 | 62 | .btn-info-outline { 63 | .button-outline-variant(@btn-info-border); 64 | } 65 | 66 | .btn-warning-outline { 67 | .button-outline-variant(@btn-warning-border); 68 | } 69 | 70 | .btn-danger-outline { 71 | .button-outline-variant(@btn-danger-border); 72 | } 73 | 74 | // File Upload Button 75 | 76 | .btn-upload { 77 | overflow: hidden; 78 | position: relative; 79 | 80 | input[type="file"] { 81 | cursor: pointer; 82 | margin: 0; 83 | opacity: 0; 84 | padding: 0; 85 | position: absolute; 86 | right: 0; 87 | top: 0; 88 | } 89 | } 90 | 91 | // Other Button Utilities 92 | 93 | .btn-table-align { 94 | padding-top: @padding-base-vertical + 1px; 95 | padding-bottom: @padding-base-vertical + 1px; 96 | } 97 | 98 | .fa-btn { 99 | margin-right: 5px; 100 | } 101 | 102 | // Submit / busy buttons 103 | 104 | .form-submit-btn > span { 105 | &:first-child { 106 | display: none; 107 | } 108 | &:last-child { 109 | display: block; 110 | } 111 | } 112 | 113 | .form-submit-btn.btn-busy > span { 114 | &:first-child { 115 | display: block; 116 | } 117 | &:last-child { 118 | display: none; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /pages/settings/invoice-payment.htm: -------------------------------------------------------------------------------- 1 | title = "View Invoices" 2 | meta_title = "Invoice %s" 3 | url = "/settings/invoice/payment/:hash" 4 | layout = "settings" 5 | 6 | [payment] 7 | invoicePage = "settings/invoice" 8 | 9 | [resources] 10 | vars[activeSetting] = "invoices" 11 | == 12 | 13 |
    14 |
    15 | 16 | {% if invoice.isPaid %} 17 | 18 |
    19 |

    20 | This invoice has been paid. Thank-you! 21 |

    22 |

    23 | View invoice {{ invoice.getUniqueId }} 24 |

    25 |
    26 | 27 | {% else %} 28 | 29 | {% partial 'settings/invoice-table' %} 30 | 31 |
    32 | {% if paymentMethods|length %} 33 | 34 | 35 | {% if paymentMethods|length > 1 %} 36 |
    Please choose a payment method
    37 | 38 | {{ form_open() }} 39 | {% for type in paymentMethods %} 40 |
    41 | 53 |
    54 | {% endfor %} 55 | {{ form_close() }} 56 | 57 | {% endif %} 58 | 59 | 60 |
    {% partial '@payment_form' %}
    61 | {% else %} 62 |

    Whoops! There are not payment methods set up, please contact site support.

    63 | {% endif %} 64 |
    65 | 66 | {% endif %} 67 | 68 |
    69 |
    70 | -------------------------------------------------------------------------------- /partials/settings-subscribe/new-subscriber.htm: -------------------------------------------------------------------------------- 1 | {% set monthlyPlans = subscribePlanList.monthlyPlans %} 2 | {% set yearlyPlans = subscribePlanList.yearlyPlans %} 3 | {% set hasMonthlyAndYearlyPlans = monthlyPlans and yearlyPlans %} 4 | 5 | {{ form_ajax('onSubscribe', { id: 'subscribeForm', class: 'form-horizontal' }) }} 6 |
    7 |
    8 |
    9 | Subscribe 10 |
    11 | 12 | 13 | {% partial 'plans/tabs-heading' %} 14 | 15 |
    16 |
    17 | 18 |
    19 | 20 |
    21 | You are not subscribed to a plan. Choose from the plans below to get started. 22 |
    23 | 24 | 25 | {% partial 'plans/tabs-content' %} 26 |
    27 |
    28 | 29 |
    30 |
    31 |
    Billing Information
    32 | 33 |
    34 | 35 | {% partial 'account/fields-billing' onChangeCountry='updatePlanPricing()' %} 36 | 37 | 38 |
    39 | 40 | 41 |
    42 |
    43 | {% partial 'plans/price-details' plan=null %} 44 |
    45 |
    46 |
    47 | 48 | 49 |
    50 |
    51 | 60 |
    61 |
    62 |
    63 |
    64 |
    65 | {{ form_close() }} 66 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/print.less: -------------------------------------------------------------------------------- 1 | /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ 2 | 3 | // ========================================================================== 4 | // Print styles. 5 | // Inlined to avoid the additional HTTP request: h5bp.com/r 6 | // ========================================================================== 7 | 8 | @media print { 9 | *, 10 | *:before, 11 | *:after { 12 | background: transparent !important; 13 | color: #000 !important; // Black prints faster: h5bp.com/s 14 | box-shadow: none !important; 15 | text-shadow: none !important; 16 | } 17 | 18 | a, 19 | a:visited { 20 | text-decoration: underline; 21 | } 22 | 23 | a[href]:after { 24 | content: " (" attr(href) ")"; 25 | } 26 | 27 | abbr[title]:after { 28 | content: " (" attr(title) ")"; 29 | } 30 | 31 | // Don't show links that are fragment identifiers, 32 | // or use the `javascript:` pseudo protocol 33 | a[href^="#"]:after, 34 | a[href^="javascript:"]:after { 35 | content: ""; 36 | } 37 | 38 | pre, 39 | blockquote { 40 | border: 1px solid #999; 41 | page-break-inside: avoid; 42 | } 43 | 44 | thead { 45 | display: table-header-group; // h5bp.com/t 46 | } 47 | 48 | tr, 49 | img { 50 | page-break-inside: avoid; 51 | } 52 | 53 | img { 54 | max-width: 100% !important; 55 | } 56 | 57 | p, 58 | h2, 59 | h3 { 60 | orphans: 3; 61 | widows: 3; 62 | } 63 | 64 | h2, 65 | h3 { 66 | page-break-after: avoid; 67 | } 68 | 69 | // Bootstrap specific changes start 70 | // 71 | // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245 72 | // Once fixed, we can just straight up remove this. 73 | select { 74 | background: #fff !important; 75 | } 76 | 77 | // Bootstrap components 78 | .navbar { 79 | display: none; 80 | } 81 | .btn, 82 | .dropup > .btn { 83 | > .caret { 84 | border-top-color: #000 !important; 85 | } 86 | } 87 | .label { 88 | border: 1px solid #000; 89 | } 90 | 91 | .table { 92 | border-collapse: collapse !important; 93 | 94 | td, 95 | th { 96 | background-color: #fff !important; 97 | } 98 | } 99 | .table-bordered { 100 | th, 101 | td { 102 | border: 1px solid #ddd !important; 103 | } 104 | } 105 | 106 | // Bootstrap specific changes end 107 | } 108 | -------------------------------------------------------------------------------- /assets/vendor/font-awesome/less/extras.less: -------------------------------------------------------------------------------- 1 | /* EXTRAS 2 | * -------------------------- */ 3 | 4 | /* Stacked and layered icon */ 5 | .icon-stack(); 6 | 7 | /* Animated rotating icon */ 8 | .icon-spin { 9 | display: inline-block; 10 | -moz-animation: spin 2s infinite linear; 11 | -o-animation: spin 2s infinite linear; 12 | -webkit-animation: spin 2s infinite linear; 13 | animation: spin 2s infinite linear; 14 | } 15 | 16 | /* Prevent stack and spinners from being taken inline when inside a link */ 17 | a .icon-stack, 18 | a .icon-spin { 19 | display: inline-block; 20 | text-decoration: none; 21 | } 22 | 23 | @-moz-keyframes spin { 24 | 0% { -moz-transform: rotate(0deg); } 25 | 100% { -moz-transform: rotate(359deg); } 26 | } 27 | @-webkit-keyframes spin { 28 | 0% { -webkit-transform: rotate(0deg); } 29 | 100% { -webkit-transform: rotate(359deg); } 30 | } 31 | @-o-keyframes spin { 32 | 0% { -o-transform: rotate(0deg); } 33 | 100% { -o-transform: rotate(359deg); } 34 | } 35 | @-ms-keyframes spin { 36 | 0% { -ms-transform: rotate(0deg); } 37 | 100% { -ms-transform: rotate(359deg); } 38 | } 39 | @keyframes spin { 40 | 0% { transform: rotate(0deg); } 41 | 100% { transform: rotate(359deg); } 42 | } 43 | 44 | /* Icon rotations and mirroring */ 45 | .icon-rotate-90:before { 46 | -webkit-transform: rotate(90deg); 47 | -moz-transform: rotate(90deg); 48 | -ms-transform: rotate(90deg); 49 | -o-transform: rotate(90deg); 50 | transform: rotate(90deg); 51 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 52 | } 53 | 54 | .icon-rotate-180:before { 55 | -webkit-transform: rotate(180deg); 56 | -moz-transform: rotate(180deg); 57 | -ms-transform: rotate(180deg); 58 | -o-transform: rotate(180deg); 59 | transform: rotate(180deg); 60 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); 61 | } 62 | 63 | .icon-rotate-270:before { 64 | -webkit-transform: rotate(270deg); 65 | -moz-transform: rotate(270deg); 66 | -ms-transform: rotate(270deg); 67 | -o-transform: rotate(270deg); 68 | transform: rotate(270deg); 69 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); 70 | } 71 | 72 | .icon-flip-horizontal:before { 73 | -webkit-transform: scale(-1, 1); 74 | -moz-transform: scale(-1, 1); 75 | -ms-transform: scale(-1, 1); 76 | -o-transform: scale(-1, 1); 77 | transform: scale(-1, 1); 78 | } 79 | 80 | .icon-flip-vertical:before { 81 | -webkit-transform: scale(1, -1); 82 | -moz-transform: scale(1, -1); 83 | -ms-transform: scale(1, -1); 84 | -o-transform: scale(1, -1); 85 | transform: scale(1, -1); 86 | } 87 | 88 | /* ensure rotation occurs inside anchor tags */ 89 | a { 90 | .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical { 91 | &:before { display: inline-block; } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /assets/vendor/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | /* FONT AWESOME CORE 2 | * -------------------------- */ 3 | 4 | [class^="icon-"], 5 | [class*=" icon-"] { 6 | .icon-FontAwesome(); 7 | } 8 | 9 | [class^="icon-"]:before, 10 | [class*=" icon-"]:before { 11 | text-decoration: inherit; 12 | display: inline-block; 13 | speak: none; 14 | } 15 | 16 | /* makes the font 33% larger relative to the icon container */ 17 | .icon-large:before { 18 | vertical-align: -10%; 19 | font-size: 4/3em; 20 | } 21 | 22 | /* makes sure icons active on rollover in links */ 23 | a { 24 | [class^="icon-"], 25 | [class*=" icon-"] { 26 | display: inline; 27 | } 28 | } 29 | 30 | /* increased font size for icon-large */ 31 | [class^="icon-"], 32 | [class*=" icon-"] { 33 | &.icon-fixed-width { 34 | display: inline-block; 35 | width: 16/14em; 36 | text-align: right; 37 | padding-right: 4/14em; 38 | &.icon-large { 39 | width: 20/14em; 40 | } 41 | } 42 | } 43 | 44 | .icons-ul { 45 | margin-left: @icons-li-width; 46 | list-style-type: none; 47 | 48 | > li { position: relative; } 49 | 50 | .icon-li { 51 | position: absolute; 52 | left: -@icons-li-width; 53 | width: @icons-li-width; 54 | text-align: center; 55 | line-height: inherit; 56 | } 57 | } 58 | 59 | // allows usage of the hide class directly on font awesome icons 60 | [class^="icon-"], 61 | [class*=" icon-"] { 62 | &.hide { 63 | display: none; 64 | } 65 | } 66 | 67 | .icon-muted { color: @iconMuted; } 68 | .icon-light { color: @iconLight; } 69 | .icon-dark { color: @iconDark; } 70 | 71 | // Icon Borders 72 | // ------------------------- 73 | 74 | .icon-border { 75 | border: solid 1px @borderColor; 76 | padding: .2em .25em .15em; 77 | .border-radius(3px); 78 | } 79 | 80 | // Icon Sizes 81 | // ------------------------- 82 | 83 | .icon-2x { 84 | font-size: 2em; 85 | &.icon-border { 86 | border-width: 2px; 87 | .border-radius(4px); 88 | } 89 | } 90 | .icon-3x { 91 | font-size: 3em; 92 | &.icon-border { 93 | border-width: 3px; 94 | .border-radius(5px); 95 | } 96 | } 97 | .icon-4x { 98 | font-size: 4em; 99 | &.icon-border { 100 | border-width: 4px; 101 | .border-radius(6px); 102 | } 103 | } 104 | 105 | .icon-5x { 106 | font-size: 5em; 107 | &.icon-border { 108 | border-width: 5px; 109 | .border-radius(7px); 110 | } 111 | } 112 | 113 | 114 | // Floats & Margins 115 | // ------------------------- 116 | 117 | // Quick floats 118 | .pull-right { float: right; } 119 | .pull-left { float: left; } 120 | 121 | [class^="icon-"], 122 | [class*=" icon-"] { 123 | &.pull-left { 124 | margin-right: .3em; 125 | } 126 | &.pull-right { 127 | margin-left: .3em; 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/mixins/forms.less: -------------------------------------------------------------------------------- 1 | // Form validation states 2 | // 3 | // Used in forms.less to generate the form validation CSS for warnings, errors, 4 | // and successes. 5 | 6 | .form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) { 7 | // Color the label and help text 8 | .help-block, 9 | .control-label, 10 | .radio, 11 | .checkbox, 12 | .radio-inline, 13 | .checkbox-inline, 14 | &.radio label, 15 | &.checkbox label, 16 | &.radio-inline label, 17 | &.checkbox-inline label { 18 | color: @text-color; 19 | } 20 | // Set the border and box shadow on specific inputs to match 21 | .form-control { 22 | border-color: @border-color; 23 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work 24 | &:focus { 25 | border-color: darken(@border-color, 10%); 26 | @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%); 27 | .box-shadow(@shadow); 28 | } 29 | } 30 | // Set validation states also for addons 31 | .input-group-addon { 32 | color: @text-color; 33 | border-color: @border-color; 34 | background-color: @background-color; 35 | } 36 | // Optional feedback icon 37 | .form-control-feedback { 38 | color: @text-color; 39 | } 40 | } 41 | 42 | 43 | // Form control focus state 44 | // 45 | // Generate a customized focus state and for any input with the specified color, 46 | // which defaults to the `@input-border-focus` variable. 47 | // 48 | // We highly encourage you to not customize the default value, but instead use 49 | // this to tweak colors on an as-needed basis. This aesthetic change is based on 50 | // WebKit's default styles, but applicable to a wider range of browsers. Its 51 | // usability and accessibility should be taken into account with any change. 52 | // 53 | // Example usage: change the default blue border and shadow to white for better 54 | // contrast against a dark gray background. 55 | .form-control-focus(@color: @input-border-focus) { 56 | @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); 57 | &:focus { 58 | border-color: @color; 59 | outline: 0; 60 | .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); 61 | } 62 | } 63 | 64 | // Form control sizing 65 | // 66 | // Relative text size, padding, and border-radii changes for form controls. For 67 | // horizontal sizing, wrap controls in the predefined grid classes. ` 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
    52 |
    Contact Information
    53 | 54 |
    55 | 56 | {{ form_ajax('onUpdate', { model: user, class: 'form-horizontal', flash: true }) }} 57 | 58 | 59 | 60 |
    61 | 62 |
    63 | 64 |
    65 |
    66 | 67 |
    68 | 69 |
    70 | 71 |
    72 |
    73 | 74 | {% partial 'account/fields-billing' %} 75 | 76 | 77 |
    78 |
    79 | 80 |
    81 |
    82 | 83 | {{ form_close() }} 84 | 85 |
    86 |
    87 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/tooltip.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tooltips 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .tooltip { 8 | position: absolute; 9 | z-index: @zindex-tooltip; 10 | display: block; 11 | // Reset font and text properties given new insertion method 12 | font-family: @font-family-base; 13 | font-size: @font-size-small; 14 | font-weight: normal; 15 | line-height: 1.4; 16 | .opacity(0); 17 | 18 | &.in { .opacity(@tooltip-opacity); } 19 | &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; } 20 | &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; } 21 | &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; } 22 | &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; } 23 | } 24 | 25 | // Wrapper for the tooltip content 26 | .tooltip-inner { 27 | max-width: @tooltip-max-width; 28 | padding: 3px 8px; 29 | color: @tooltip-color; 30 | text-align: center; 31 | text-decoration: none; 32 | background-color: @tooltip-bg; 33 | border-radius: @border-radius-base; 34 | } 35 | 36 | // Arrows 37 | .tooltip-arrow { 38 | position: absolute; 39 | width: 0; 40 | height: 0; 41 | border-color: transparent; 42 | border-style: solid; 43 | } 44 | // Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1 45 | .tooltip { 46 | &.top .tooltip-arrow { 47 | bottom: 0; 48 | left: 50%; 49 | margin-left: -@tooltip-arrow-width; 50 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 51 | border-top-color: @tooltip-arrow-color; 52 | } 53 | &.top-left .tooltip-arrow { 54 | bottom: 0; 55 | right: @tooltip-arrow-width; 56 | margin-bottom: -@tooltip-arrow-width; 57 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 58 | border-top-color: @tooltip-arrow-color; 59 | } 60 | &.top-right .tooltip-arrow { 61 | bottom: 0; 62 | left: @tooltip-arrow-width; 63 | margin-bottom: -@tooltip-arrow-width; 64 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 65 | border-top-color: @tooltip-arrow-color; 66 | } 67 | &.right .tooltip-arrow { 68 | top: 50%; 69 | left: 0; 70 | margin-top: -@tooltip-arrow-width; 71 | border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0; 72 | border-right-color: @tooltip-arrow-color; 73 | } 74 | &.left .tooltip-arrow { 75 | top: 50%; 76 | right: 0; 77 | margin-top: -@tooltip-arrow-width; 78 | border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width; 79 | border-left-color: @tooltip-arrow-color; 80 | } 81 | &.bottom .tooltip-arrow { 82 | top: 0; 83 | left: 50%; 84 | margin-left: -@tooltip-arrow-width; 85 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 86 | border-bottom-color: @tooltip-arrow-color; 87 | } 88 | &.bottom-left .tooltip-arrow { 89 | top: 0; 90 | right: @tooltip-arrow-width; 91 | margin-top: -@tooltip-arrow-width; 92 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 93 | border-bottom-color: @tooltip-arrow-color; 94 | } 95 | &.bottom-right .tooltip-arrow { 96 | top: 0; 97 | left: @tooltip-arrow-width; 98 | margin-top: -@tooltip-arrow-width; 99 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 100 | border-bottom-color: @tooltip-arrow-color; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /pages/account/register-pay.htm: -------------------------------------------------------------------------------- 1 | title = "Register Payment" 2 | url = "/register/pay/:hash" 3 | layout = "default" 4 | 5 | [subscribePayment] 6 | == 7 | {% set isCardOptional = not isCardUpfront %} 8 | 9 |
    10 |
    11 |
    12 | {% if invoice %} 13 | {% if user.subscriptionIsTrial %} 14 |
    15 |
    16 |
    17 | Free Trial 18 |
    19 | {% if isCardOptional %} 20 |
    21 | Skip this step 22 |
    23 | {% endif %} 24 |
    25 |
    26 |
    27 | You are on a free trial, we will collect the payment 28 | {{ user.subscriptionTrialEnd.toFormattedDateString|default('soon') }}. 29 |
    30 |
    31 | {% endif %} 32 | {% if hasProfile or invoice.isPaymentProcessed %} 33 |
    34 |
    35 | Account set up complete 36 |
    37 |
    38 |

    39 | {% if invoice.isPaymentProcessed %} 40 | This invoice has been paid. Thank-you! 41 | {% else %} 42 | Your account has been set up. Thank-you! 43 | {% endif %} 44 |

    45 |

    46 | Go to dashboard 47 |

    48 |
    49 |
    50 | {% else %} 51 |
    52 |
    53 | Payment method 54 |
    55 |
    56 | {% partial 'payment/pay-method' %} 57 |
    58 |
    59 | {% endif %} 60 | {% else %} 61 |
    62 |
    63 | Error 64 |
    65 |
    66 |
    67 |

    Sorry, that payment could not be found

    68 |
    69 |
    70 |
    71 | {% endif %} 72 |
    73 |
    74 |
    75 | -------------------------------------------------------------------------------- /assets/javascript/controls/subscribe.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Basic control for subscriptions 3 | */ 4 | 5 | +function ($) { "use strict"; 6 | 7 | // 8 | // Properties 9 | // 10 | 11 | var $form, 12 | hasSubscription = false, 13 | isCancelled = false 14 | 15 | function init() { 16 | $form = $('#subscribeForm') 17 | 18 | hasSubscription = $form.hasClass('is-subscribed') 19 | isCancelled = $form.hasClass('is-cancelled') 20 | 21 | setActivePlanFromPage() 22 | } 23 | 24 | // 25 | // Public 26 | // 27 | 28 | window.showPlanDetails = function(el) { 29 | var $el = $(el), 30 | plan = getPlanFromElement($el) 31 | 32 | $el.ajaxModal({ 33 | handler: 'onGetPlanDetails', 34 | updatePartial: 'plans/feature-list-form', 35 | extraData: { 36 | selected_plan: plan.id 37 | } 38 | }) 39 | } 40 | 41 | window.selectPlan = function(el, internal) { 42 | var $el = $(el), 43 | plan = getPlanFromElement($el), 44 | $container = $el.closest('.plan-select-button') 45 | 46 | if (!hasSubscription && !isCancelled) { 47 | $container.addClass('plan-selected') 48 | 49 | $('.plan-select-button') 50 | .not($container) 51 | .removeClass('plan-selected') 52 | } 53 | 54 | if (internal) { 55 | return 56 | } 57 | 58 | if (hasSubscription) { 59 | updateSubscription($el, plan) 60 | } 61 | else if (isCancelled) { 62 | resumeSubscription($el, plan) 63 | } 64 | else { 65 | makePlanActive(plan) 66 | } 67 | } 68 | 69 | window.updatePlanPricing = function() { 70 | $form.request('onGetPlanDetails', { 71 | update: { 72 | 'plans/price-details': '#partialPlansPriceDetails' 73 | } 74 | }) 75 | } 76 | 77 | window.setActivePlanFromPage = function() { 78 | var id = $('input[name=selected_plan]').val(), 79 | $el = $('[data-plan-object][data-id='+(id ? id : 0)+']:first') 80 | 81 | if ($el.length) { 82 | selectPlan($el, true) 83 | } 84 | } 85 | 86 | // 87 | // Protected 88 | // 89 | 90 | function updateSubscription($el, plan) { 91 | $el.ajaxModal({ 92 | handler: 'onLoadUpdateConfirmForm', 93 | updatePartial: 'settings-subscribe/update-confirm-form', 94 | extraData: { 95 | selected_plan: plan.id 96 | } 97 | }) 98 | } 99 | 100 | function resumeSubscription($el, plan) { 101 | $el.ajaxModal({ 102 | handler: 'onLoadResumeConfirmForm', 103 | updatePartial: 'settings-subscribe/resume-confirm-form', 104 | extraData: { 105 | selected_plan: plan.id 106 | } 107 | }) 108 | } 109 | 110 | function makePlanActive(plan) { 111 | $('input[name=selected_plan]').val(plan.id).trigger('change') 112 | 113 | $('[data-billing-form]').toggle(!plan.isFree) 114 | 115 | $('[data-common-form-submit]').toggle(!!plan.isFree) 116 | 117 | if (!plan.isFree) { 118 | updatePlanPricing(plan) 119 | } 120 | } 121 | 122 | function getPlanFromElement($el) { 123 | return $el.closest('[data-plan-object]').data() 124 | } 125 | 126 | // 127 | // Init 128 | // 129 | 130 | init() 131 | 132 | }(window.jQuery); 133 | -------------------------------------------------------------------------------- /assets/vendor/bootstrap/less/list-group.less: -------------------------------------------------------------------------------- 1 | // 2 | // List groups 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | // 8 | // Easily usable on