ghost 4.38.1 → 4.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/.c8rc.json +1 -1
  2. package/Gruntfile.js +1 -1
  3. package/README.md +26 -18
  4. package/core/built/assets/{chunk.3.4906cf0b01d6d8e33374.js → chunk.3.6e2ed2d00856e12bd81a.js} +19 -19
  5. package/core/built/assets/ghost-dark-498ff8339a89bb68c3f78f59bee4146e.css +1 -0
  6. package/core/built/assets/ghost.min-77b93478f83b0def6ddc5a4f23ce963e.css +1 -0
  7. package/core/built/assets/{ghost.min-6386b02480494a69c3bfe66206754836.js → ghost.min-88c665c3ba304b4f220d08b8bcf9d246.js} +525 -538
  8. package/core/built/assets/icons/{event-changed-subscription.svg → event-subscriptions.svg} +0 -1
  9. package/core/built/assets/icons/member.svg +3 -0
  10. package/core/built/assets/{vendor.min-c814d3c4b3f543c4cd5ef3aacd0fc645.js → vendor.min-ed945ad80ea22f1d3ffeec6d5ae63aee.js} +2355 -1419
  11. package/core/frontend/apps/private-blogging/lib/middleware.js +1 -1
  12. package/core/frontend/apps/private-blogging/lib/views/private.hbs +9 -10
  13. package/core/frontend/public/ghost.css +205 -143
  14. package/core/frontend/public/ghost.min.css +1 -1
  15. package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +3 -1
  16. package/core/frontend/views/unsubscribe.hbs +28 -33
  17. package/core/frontend/web/middleware/error-handler.js +2 -2
  18. package/core/server/api/canary/authentication.js +7 -0
  19. package/core/server/api/canary/identities.js +0 -1
  20. package/core/server/api/canary/members.js +7 -1
  21. package/core/server/api/canary/tiers.js +3 -1
  22. package/core/server/api/canary/utils/serializers/input/pages.js +1 -1
  23. package/core/server/api/canary/utils/serializers/input/posts.js +1 -1
  24. package/core/server/api/canary/utils/serializers/input/tiers.js +17 -0
  25. package/core/server/api/canary/utils/serializers/output/actions.js +2 -2
  26. package/core/server/api/canary/utils/serializers/output/authentication.js +3 -3
  27. package/core/server/api/canary/utils/serializers/output/authors.js +3 -3
  28. package/core/server/api/canary/utils/serializers/output/email-posts.js +2 -2
  29. package/core/server/api/canary/utils/serializers/output/emails.js +3 -3
  30. package/core/server/api/canary/utils/serializers/output/images.js +2 -2
  31. package/core/server/api/canary/utils/serializers/output/integrations.js +5 -6
  32. package/core/server/api/canary/utils/serializers/output/labels.js +3 -3
  33. package/core/server/api/canary/utils/serializers/output/mappers/actions.js +7 -0
  34. package/core/server/api/canary/utils/serializers/output/mappers/emails.js +17 -0
  35. package/core/server/api/canary/utils/serializers/output/mappers/images.js +5 -0
  36. package/core/server/api/canary/utils/serializers/output/mappers/index.js +12 -0
  37. package/core/server/api/canary/utils/serializers/output/mappers/integrations.js +13 -0
  38. package/core/server/api/canary/utils/serializers/output/mappers/labels.js +4 -0
  39. package/core/server/api/canary/utils/serializers/output/mappers/pages.js +11 -0
  40. package/core/server/api/canary/utils/serializers/output/mappers/posts.js +101 -0
  41. package/core/server/api/canary/utils/serializers/output/mappers/settings.js +37 -0
  42. package/core/server/api/canary/utils/serializers/output/mappers/tags.js +11 -0
  43. package/core/server/api/canary/utils/serializers/output/mappers/users.js +12 -0
  44. package/core/server/api/canary/utils/serializers/output/members.js +2 -7
  45. package/core/server/api/canary/utils/serializers/output/pages.js +3 -3
  46. package/core/server/api/canary/utils/serializers/output/posts.js +3 -3
  47. package/core/server/api/canary/utils/serializers/output/preview.js +2 -2
  48. package/core/server/api/canary/utils/serializers/output/settings.js +2 -2
  49. package/core/server/api/canary/utils/serializers/output/tags.js +3 -3
  50. package/core/server/api/canary/utils/serializers/output/users.js +3 -3
  51. package/core/server/api/shared/serializers/handle.js +2 -2
  52. package/core/server/api/v2/utils/serializers/input/pages.js +1 -1
  53. package/core/server/api/v2/utils/serializers/input/posts.js +1 -1
  54. package/core/server/api/v3/utils/serializers/input/pages.js +1 -1
  55. package/core/server/api/v3/utils/serializers/input/posts.js +1 -1
  56. package/core/server/data/exporter/table-lists.js +1 -0
  57. package/core/server/data/importer/import-manager.js +152 -113
  58. package/core/server/data/migrations/versions/4.33/2022-01-14-11-51-add-default-free-tier.js +3 -0
  59. package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-free-products-visibility-column.js +66 -0
  60. package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-products-visibility-column.js +36 -0
  61. package/core/server/data/migrations/versions/4.40/2022-03-07-14-37-add-members-cancel-events-table.js +8 -0
  62. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-offers-admin-integration-permission-roles.js +23 -0
  63. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-tiers-admin-integration-permission-roles.js +20 -0
  64. package/core/server/data/schema/default-settings/default-settings.json +2 -2
  65. package/core/server/data/schema/fixtures/fixtures.json +17 -160
  66. package/core/server/data/schema/schema.js +6 -0
  67. package/core/server/lib/image/image-size.js +12 -4
  68. package/core/server/models/base/plugins/generate-slug.js +13 -1
  69. package/core/server/models/base/plugins/raw-knex.js +1 -1
  70. package/core/server/models/member-cancel-event.js +28 -0
  71. package/core/server/models/post.js +16 -6
  72. package/core/server/models/user.js +1 -1
  73. package/core/server/services/auth/setup.js +29 -13
  74. package/core/server/services/mega/mega.js +4 -4
  75. package/core/server/services/mega/template.js +2 -1
  76. package/core/server/services/members/api.js +1 -0
  77. package/core/server/services/members/content-gating.js +1 -1
  78. package/core/server/services/members/middleware.js +1 -0
  79. package/core/server/services/posts/posts-service.js +1 -1
  80. package/core/server/services/themes/validate.js +3 -3
  81. package/core/server/services/url/UrlGenerator.js +1 -1
  82. package/core/server/services/webhooks/webhooks-service.js +2 -0
  83. package/core/server/views/maintenance.html +2 -2
  84. package/core/server/web/admin/views/default-prod.html +4 -4
  85. package/core/server/web/admin/views/default.html +4 -4
  86. package/core/server/web/api/app.js +0 -3
  87. package/core/server/web/api/canary/admin/middleware.js +2 -0
  88. package/core/server/web/parent/backend.js +2 -1
  89. package/core/server/web/shared/middleware/uncapitalise.js +2 -1
  90. package/core/shared/config/defaults.json +2 -2
  91. package/core/shared/config/overrides.json +7 -3
  92. package/core/shared/labs.js +8 -10
  93. package/core/shared/url-utils.js +4 -1
  94. package/package.json +37 -36
  95. package/yarn.lock +513 -329
  96. package/core/built/assets/ghost-dark-9f760f16230b8bc52e188d6ce28516b0.css +0 -1
  97. package/core/built/assets/ghost.min-f4c59dd57a2136df8b0a34f87c099034.css +0 -1
  98. package/core/built/assets/icons/event-started-subscription.svg +0 -6
  99. package/core/built/assets/icons/locked-email-back.svg +0 -1
  100. package/core/built/assets/icons/locked-email-front.svg +0 -1
  101. package/core/built/assets/icons/locked-email-lock.svg +0 -1
  102. package/core/built/assets/img/ghost-logo-de2acf283f53ba1fd1149928faeaaa74.png +0 -0
  103. package/core/server/api/canary/utils/serializers/output/utils/mapper.js +0 -213
  104. package/core/server/frontend/ghost.min.css +0 -1
@@ -13,7 +13,7 @@ const privateRoute = '/private/';
13
13
 
14
14
  const messages = {
15
15
  pageNotFound: 'Page not found.',
16
- wrongPassword: 'Wrong password'
16
+ wrongPassword: 'Incorrect password.'
17
17
  };
18
18
 
19
19
  function verifySessionHash(salt, hash) {
@@ -22,23 +22,22 @@
22
22
  <main class="gh-main" role="main">
23
23
  <div class="gh-flow">
24
24
  <div class="gh-flow-content-wrap">
25
- <section class="gh-flow-content">
25
+ {{#if @site.icon}}
26
+ <img class="site-icon" src="{{img_url @site.icon absolute="true"}}" alt="icon">
27
+ {{/if}}
28
+ <section class="gh-flow-content private">
26
29
  <header>
27
- <h1>This site is private</h1>
30
+ <h1>This site is private.</h1>
28
31
  </header>
29
32
  <form class="gh-signin" method="post" novalidate="novalidate">
30
33
  <div class="form-group{{#if error}} error{{/if}}">
31
- <span class="gh-input-icon gh-icon-lock">
32
- <svg version="1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g><path d="M12 14c-.552 0-1 .449-1 1 0 .365.207.672.5.846v2.654c0 .276.224.5.5.5s.5-.224.5-.5v-2.654c.293-.174.5-.481.5-.846 0-.551-.448-1-1-1zM20.5 9h-2.5v-3c0-3.309-2.691-6-6-6s-6 2.691-6 6v3h-2.5c-.276 0-.5.224-.5.5v14c0 .276.224.5.5.5h17c.276 0 .5-.224.5-.5v-14c0-.276-.224-.5-.5-.5zm-13.5-3c0-2.757 2.243-5 5-5s5 2.243 5 5v3h-10v-3zm13 17h-16v-13h16v13z"/></g></svg>
33
34
  {{input_password class="gh-input" placeholder="Password"}}
34
- </span>
35
+ {{#if error}}
36
+ <p class="main-error">{{error.message}}</p>
37
+ {{/if}}
35
38
  </div>
36
- <button class="gh-btn gh-btn-blue gh-btn-block" type="submit"><span>Enter Now</span></button>
39
+ <button class="gh-btn" type="submit"><span>Access site &rarr;</span></button>
37
40
  </form>
38
-
39
- {{#if error}}
40
- <p class="main-error">{{error.message}}</p>
41
- {{/if}}
42
41
  </section>
43
42
  </div>
44
43
  </div>
@@ -349,49 +349,66 @@ th {
349
349
  }
350
350
  /* Colour classes
351
351
  /* ---------------------------------------------------------- */
352
+ .black {
353
+ color: #15171A;
354
+ }
355
+
352
356
  .darkgrey {
353
- color: #343f44;
357
+ color: #394047;
354
358
  }
359
+
355
360
  .midgrey {
356
- color: #738a94;
361
+ color: #7C8B9A;
357
362
  }
363
+
358
364
  .lightgrey {
359
- color: #e5eff5;
365
+ color: #CED4D9;
360
366
  }
367
+
361
368
  .blue {
362
- color: #3eb0ef;
369
+ color: #14b8ff;
363
370
  }
371
+
364
372
  .red {
365
- color: #f05230;
373
+ color: #f50b23;
366
374
  }
375
+
367
376
  .orange {
368
- color: #fecd35;
377
+ color: #ffb41f;
369
378
  }
379
+
370
380
  .green {
371
- color: #a4d037;
381
+ color: #30cf43;
372
382
  }
383
+
373
384
  /* Colour classes (hover)
374
385
  /* ---------------------------------------------------------- */
375
386
  .darkgrey-hover:hover {
376
- color: #343f44;
387
+ color: #394047
377
388
  }
389
+
378
390
  .midgrey-hover:hover {
379
- color: #738a94;
391
+ color: #7C8B9A;
380
392
  }
393
+
381
394
  .lightgrey-hover:hover {
382
- color: #e5eff5;
395
+ color: #CED4D9;
383
396
  }
397
+
384
398
  .blue-hover:hover {
385
- color: #3eb0ef;
399
+ color: #14b8ff;
386
400
  }
401
+
387
402
  .red-hover:hover {
388
- color: #f05230;
403
+ color: #f50b23;
389
404
  }
405
+
390
406
  .orange-hover:hover {
391
- color: #fecd35;
407
+ color: #ffb41f;
392
408
  }
409
+
393
410
  .green-hover:hover {
394
- color: #a4d037;
411
+ color: #30cf43;
395
412
  }
396
413
 
397
414
  /* Layout
@@ -493,7 +510,6 @@ h2 {
493
510
  outline: none;
494
511
  border: 1px solid rgb(214, 227, 235);
495
512
  color: rgb(130, 154, 168);
496
- text-shadow: 0 1px 0 #fff;
497
513
  text-decoration: none !important;
498
514
  -webkit-user-select: none;
499
515
  -moz-user-select: none;
@@ -608,6 +624,7 @@ h2 {
608
624
  overflow: hidden;
609
625
  height: 100%;
610
626
  }
627
+
611
628
  /* Content viewport, contains everything else */
612
629
  .gh-viewport {
613
630
  -ms-flex-positive: 1;
@@ -617,6 +634,7 @@ h2 {
617
634
  overflow: hidden;
618
635
  max-height: 100%;
619
636
  }
637
+
620
638
  .gh-main {
621
639
  position: relative;
622
640
  -ms-flex-positive: 1;
@@ -630,185 +648,229 @@ h2 {
630
648
  /* Full screen workflow
631
649
  /* ---------------------------------------------------------- */
632
650
  .gh-flow {
633
- -ms-flex-positive: 1;
634
- flex-grow: 1;
635
- display: -ms-flexbox;
651
+ flex-grow: 1;
636
652
  display: flex;
637
- -ms-flex-direction: column;
638
- flex-direction: column;
653
+ flex-direction: column;
639
654
  overflow-y: auto;
640
655
  min-height: 100%;
656
+ background: linear-gradient(315deg,#efefef,#fff);
641
657
  }
642
- .gh-flow-head {
643
- -ms-flex-negative: 0;
644
- flex-shrink: 0;
645
- display: -ms-flexbox;
646
- display: flex;
647
- -ms-flex-pack: justify;
648
- justify-content: space-between;
649
- padding-top: 4vh;
650
- padding-bottom: 20px;
651
- }
658
+
652
659
  .gh-flow-content-wrap {
653
- -ms-flex-positive: 1;
654
- flex-grow: 1;
655
- -ms-flex-negative: 0;
656
- flex-shrink: 0;
657
- display: -ms-flexbox;
658
660
  display: flex;
659
- -ms-flex-pack: center;
660
- justify-content: center;
661
- -ms-flex-align: center;
662
- align-items: center;
663
- margin: 0 5%;
661
+ flex-direction: column;
662
+ flex-grow: 1;
663
+ flex-shrink: 0;
664
+ justify-content: center;
665
+ align-items: center;
666
+ margin: 0 24px;
664
667
  padding-bottom: 8vh;
665
668
  }
666
- .gh-flow-back {
667
- position: absolute;
668
- top: 0;
669
- left: 0;
670
- display: -ms-flexbox;
671
- display: flex;
672
- -ms-flex-align: center;
673
- align-items: center;
674
- margin: 0 0 0 3%;
675
- padding: 2px 9px 2px 5px;
676
- border: transparent 1px solid;
677
- border-radius: 4px;
678
- color: #7d878a;
679
- font-weight: 100;
680
- transition: all 0.3s ease;
681
- }
682
- .gh-flow-back svg {
683
- margin-right: 4px;
684
- height: 12px;
685
- line-height: 14px;
686
- }
687
- .gh-flow-back svg path {
688
- stroke: #7d878a;
689
- stroke-width: 1.2px;
690
- }
691
- .gh-flow-back:hover {
692
- border: #dae1e3 1px solid;
693
- }
694
- .gh-flow-back-plain {
695
- position: absolute;
696
- top: 0;
697
- left: 0;
698
- display: -ms-flexbox;
699
- display: flex;
700
- -ms-flex-align: center;
701
- align-items: center;
702
- margin: 0 0 0 3%;
703
- padding: 2px 9px 2px 5px;
704
- color: #7d878a;
705
- font-weight: 300;
706
- transition: all 0.3s ease;
707
- text-decoration: none;
708
- }
709
- .gh-flow-back-plain svg {
710
- margin-right: 4px;
711
- height: 12px;
712
- line-height: 14px;
713
- }
714
- .gh-flow-back-plain svg path {
715
- stroke: #7d878a;
716
- stroke-width: 1.2px;
717
- }
718
- .gh-flow-back-plain:hover {
719
- color: #15212A;
720
- }
721
- .gh-flow-nav {
722
- position: relative;
723
- -ms-flex: 1;
724
- flex: 1;
669
+
670
+ .gh-flow-content-wrap .site-icon {
671
+ width: 70px;
672
+ height: 70px;
673
+ border-radius: 3px;
725
674
  }
675
+
726
676
  .gh-flow-content {
727
- display: -ms-flexbox;
728
677
  display: flex;
729
- -ms-flex-direction: column;
730
- flex-direction: column;
731
- max-width: 700px;
678
+ flex-direction: column;
679
+ max-width: 520px;
732
680
  width: 100%;
733
- color: #738a94;
734
- text-align: center;
681
+ margin: 4rem 0 6rem;
682
+ padding: 40px;
683
+ background: #fff;
684
+ color: var(--darkgrey);
735
685
  font-size: 1.9rem;
736
686
  line-height: 1.5em;
737
- font-weight: 100;
738
- }
739
-
740
- .gh-flow-content .gh-input-icon input {
741
- padding-left: 35px;
687
+ font-weight: 300;
688
+ border-radius: 3px;
689
+ box-shadow:
690
+ 0 2.8px 2.2px rgba(0,0,0,.02),
691
+ 0 6.7px 5.3px rgba(0,0,0,.02),
692
+ 0 12.5px 10px rgba(0,0,0,.02),
693
+ 0 22.3px 17.9px rgba(0,0,0,.03),
694
+ 0 41.8px 33.4px rgba(0,0,0,.03),
695
+ 0 100px 80px rgba(0,0,0,.05);
742
696
  }
743
697
 
744
- .gh-flow-content-unsubscribe {
745
- font-weight: 300;
698
+ .gh-flow-content.unsubscribe {
699
+ align-items: center;
700
+ justify-content: center;
701
+ max-width: 560px;
702
+ min-height: 200px;
703
+ margin: 4rem 0;
704
+ text-align: center;
746
705
  }
747
706
 
748
707
  @media (max-width: 500px) {
749
- .gh-flow-head-unsubscribe {
750
- padding-top: 2.8vh;
751
- }
752
708
  .gh-flow-content {
753
- font-size: 4vw;
754
- }
755
- .gh-flow-content-unsubscribe {
756
- font-size: 1.8rem;
757
- line-height: 1.6em;
709
+ padding: 0;
710
+ background: transparent;
711
+ box-shadow: none;
758
712
  }
759
713
  }
714
+
760
715
  .gh-flow-content header {
761
- margin: 0 auto;
762
- max-width: 520px;
716
+ display: flex;
717
+ flex-direction: column;
718
+ align-items: center;
763
719
  }
720
+
764
721
  .gh-flow-content h1 {
765
- font-size: 4.2rem;
766
- font-weight: 100;
722
+ margin-bottom: 24px;
723
+ color: #15171A;
724
+ font-size: 4.1rem;
725
+ font-weight: 700;
726
+ line-height: 1.15em;
727
+ }
728
+
729
+ .gh-flow-content.unsubscribe h1 {
730
+ font-size: 3.2rem;
767
731
  }
732
+
768
733
  @media (max-width: 600px) {
769
- .gh-flow-content h1 {
770
- font-size: 7vw;
734
+ .gh-flow-content h1,
735
+ .gh-flow-content.unsubscribe h1 {
736
+ font-size: 6vw;
737
+ }
738
+ }
739
+
740
+ .gh-flow-content.unsubscribe p {
741
+ margin: 0 0 .4em;
742
+ color: #394047;
743
+ font-size: 1.8rem;
744
+ }
745
+
746
+ @media (max-width: 500px) {
747
+ .gh-flow-content.unsubscribe p {
748
+ font-size: 1.6rem;
749
+ line-height: 1.5;
771
750
  }
772
751
  }
752
+
773
753
  .gh-flow-content .gh-btn {
774
754
  display: block;
775
755
  margin: 20px auto 0;
776
756
  max-width: 400px;
777
757
  }
758
+
778
759
  .gh-flow-content .form-group {
760
+ position: relative;
779
761
  margin-bottom: 2.5rem;
780
762
  }
781
- .gh-flow-content input {
782
- padding: 10px;
783
- border: #dae1e3 1px solid;
784
- font-size: 1.6rem;
785
- line-height: 1.4em;
786
- font-weight: 100;
763
+
764
+ .gh-flow-content .form-group.error .gh-input {
765
+ border-color: #f50b23;
766
+ box-shadow: 0 0 0 3px rgba(239,24,24,.15);
767
+ }
768
+
769
+ .gh-flow-content .main-error {
770
+ position: absolute;
771
+ right: 0;
772
+ margin: 0;
773
+ color: #7C8B9A;
774
+ font-size: 1.35rem;
775
+ font-weight: 400;
776
+ text-align: center;
777
+ user-select: text;
787
778
  }
779
+
788
780
  .gh-flow-em {
789
781
  font-weight: 500;
790
782
  }
791
783
 
784
+ .unsubscribe-footer {
785
+ text-align: center;
786
+ font-size: 1.5rem;
787
+ }
788
+
789
+ @media (max-width: 500px) {
790
+ .unsubscribe-footer {
791
+ padding: 0 24px;
792
+ font-size: 1.4rem;
793
+ line-height: 1.4em;
794
+ }
795
+ }
796
+
797
+ .unsubscribe-footer p {
798
+ color: #7C8B9A;
799
+ margin: 0 0 .4rem;
800
+ }
801
+
802
+ .unsubscribe-footer a {
803
+ color: #15171A;
804
+ text-decoration: none;
805
+ }
806
+
807
+ .unsubscribe-footer a:hover {
808
+ text-decoration: underline;
809
+ }
810
+
792
811
  /* Sign in
793
812
  /* ---------------------------------------------------------- */
794
813
  .gh-signin {
795
- position: relative;
796
- margin: 30px auto;
797
- padding: 40px;
798
- max-width: 400px;
799
- width: 100%;
800
- border: #dae1e3 1px solid;
801
- background: #f8fbfd;
802
- border-radius: 5px;
803
- text-align: left;
804
- }
805
- .gh-signin .form-group {
806
814
  margin-bottom: 1.5rem;
807
815
  }
816
+
817
+ .gh-signin .gh-input,
818
+ .gh-signin .gh-input:-webkit-autofill::first-line {
819
+ height: 54px;
820
+ padding: 12px 16px;
821
+ font-size: 1.8rem;
822
+ border-radius: 8px;
823
+ }
824
+
825
+ .gh-signin .gh-input::placeholder {
826
+ color: #abb4be;
827
+ font-weight: 400;
828
+ opacity: 1;
829
+ }
830
+
831
+ .gh-signin .gh-input::-webkit-input-placeholder {
832
+ color: #abb4be;
833
+ font-weight: 400;
834
+ }
835
+
836
+ .gh-signin .gh-input:-ms-input-placeholder {
837
+ color: #abb4be;
838
+ font-weight: 400;
839
+ }
840
+
841
+ .gh-signin .gh-input::-moz-placeholder {
842
+ color: #abb4be;
843
+ font-weight: 400;
844
+ opacity: 1;
845
+ }
846
+
847
+ .gh-signin .gh-input:focus {
848
+ border-color: #30cf43;
849
+ box-shadow: 0 0 0 3px rgba(26,170,96,.15);
850
+ }
851
+
808
852
  .gh-signin .gh-btn {
809
853
  margin: 0;
810
854
  }
811
855
 
856
+ .gh-signin .gh-btn {
857
+ width: 100%;
858
+ height: 54px;
859
+ max-width: unset;
860
+ margin-top: 32px;
861
+ background: #15171A;
862
+ font-weight: 300;
863
+ line-height: 54px;
864
+ border-radius: 8px;
865
+ transition: all 0.4s ease;
866
+ -webkit-font-smoothing: subpixel-antialiased;
867
+ }
868
+
869
+ .gh-signin .gh-btn span {
870
+ color: #fff;
871
+ font-size: 1.8rem;
872
+ }
873
+
812
874
  /* Error /ghost/404/
813
875
  /* ---------------------------------------------------------- */
814
876
 
@@ -1 +1 @@
1
- /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-family:sans-serif}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.darkgrey{color:#343f44}.midgrey{color:#738a94}.lightgrey{color:#e5eff5}.blue{color:#3eb0ef}.red{color:#f05230}.orange{color:#fecd35}.green{color:#a4d037}.darkgrey-hover:hover{color:#343f44}.midgrey-hover:hover{color:#738a94}.lightgrey-hover:hover{color:#e5eff5}.blue-hover:hover{color:#3eb0ef}.red-hover:hover{color:#f05230}.orange-hover:hover{color:#fecd35}.green-hover:hover{color:#a4d037}*,:after,:before{box-sizing:border-box}html{-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:62.5%;letter-spacing:.2px;line-height:1.65;overflow:hidden}body,html{height:100%;width:100%}body{color:#343f44;font-size:1.4rem;overflow:auto;overflow-x:hidden}.gh-view{-ms-flex-positive:1;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;flex-grow:1}h1,h2{text-rendering:optimizeLegibility;color:#343f44;font-size:2.9rem;line-height:1.15em;margin:0 0 .3em;text-indent:-1px}@media (max-width:500px){h1{font-size:2.4rem}}.gh-input{-webkit-appearance:none;border:1px solid #d6e3eb;border-radius:4px;color:#4b5b62;display:block;font-size:1.6rem;font-weight:300;height:40px;line-height:1em;padding:10px 12px;transition:border-color .15s linear;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:100%}.gh-input:focus{border-color:#b4cbda;outline:0}.gh-btn{fill:#829aa8;-webkit-font-smoothing:subpixel-antialiased;border:1px solid #d6e3eb;border-radius:5px;color:#829aa8;display:inline-block;outline:none;text-decoration:none!important;text-shadow:0 1px 0 #fff;transition:all .2s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.gh-btn span{border-radius:4px;display:block;font-size:1.3rem;font-weight:400;height:33px;letter-spacing:.2px;line-height:33px;padding:0 12px;text-align:center}.gh-btn:hover{border-color:#b4cbda}.gh-btn-hover-blue:hover{border-color:#3eb0ef;color:#3eb0ef}.gh-btn-blue{fill:#fff;background:linear-gradient(#3da1d6,#2288bf);border:0;box-shadow:0 1px 0 rgba(0,0,0,.12);color:#fff;padding:1px;text-shadow:0 -1px 0 rgba(0,0,0,.1);transition:none!important}.gh-btn-blue span{background:linear-gradient(#4ab6f0,#2fa5e4 60%,#2fa5e4 90%,#38a9e5);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.gh-btn-blue:active,.gh-btn-blue:focus{background:#1e78a9}.gh-btn-blue:active span,.gh-btn-blue:focus span{background:#29a0e0;box-shadow:none}.gh-btn-block{display:block;width:100%}.gh-input-icon{display:block;position:relative}.gh-input-icon svg{fill:color(var(--midgrey) l(15%));height:14px;left:10px;position:absolute;top:50%;transform:translateY(-7px);width:auto;z-index:2}.gh-input-icon input{padding-left:35px}.gh-app{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden}.gh-viewport{max-height:100%;overflow:hidden}.gh-main,.gh-viewport{-ms-flex-positive:1;display:-ms-flexbox;display:flex;flex-grow:1}.gh-main{background:#fff;overflow-y:auto;position:relative}.gh-flow{-ms-flex-positive:1;-ms-flex-direction:column;flex-direction:column;flex-grow:1;min-height:100%;overflow-y:auto}.gh-flow,.gh-flow-head{display:-ms-flexbox;display:flex}.gh-flow-head{-ms-flex-negative:0;-ms-flex-pack:justify;flex-shrink:0;justify-content:space-between;padding-bottom:20px;padding-top:4vh}.gh-flow-content-wrap{-ms-flex-positive:1;-ms-flex-negative:0;-ms-flex-pack:center;flex-grow:1;flex-shrink:0;justify-content:center;margin:0 5%;padding-bottom:8vh}.gh-flow-back,.gh-flow-content-wrap{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.gh-flow-back{border:1px solid transparent;border-radius:4px;color:#7d878a;font-weight:100;left:0;margin:0 0 0 3%;padding:2px 9px 2px 5px;position:absolute;top:0;transition:all .3s ease}.gh-flow-back svg{height:12px;line-height:14px;margin-right:4px}.gh-flow-back svg path{stroke:#7d878a;stroke-width:1.2px}.gh-flow-back:hover{border:1px solid #dae1e3}.gh-flow-back-plain{-ms-flex-align:center;align-items:center;color:#7d878a;display:-ms-flexbox;display:flex;font-weight:300;left:0;margin:0 0 0 3%;padding:2px 9px 2px 5px;position:absolute;text-decoration:none;top:0;transition:all .3s ease}.gh-flow-back-plain svg{height:12px;line-height:14px;margin-right:4px}.gh-flow-back-plain svg path{stroke:#7d878a;stroke-width:1.2px}.gh-flow-back-plain:hover{color:#15212a}.gh-flow-nav{-ms-flex:1;flex:1;position:relative}.gh-flow-content{color:#738a94;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;font-size:1.9rem;font-weight:100;line-height:1.5em;max-width:700px;text-align:center;width:100%}.gh-flow-content .gh-input-icon input{padding-left:35px}.gh-flow-content-unsubscribe{font-weight:300}@media (max-width:500px){.gh-flow-head-unsubscribe{padding-top:2.8vh}.gh-flow-content{font-size:4vw}.gh-flow-content-unsubscribe{font-size:1.8rem;line-height:1.6em}}.gh-flow-content header{margin:0 auto;max-width:520px}.gh-flow-content h1{font-size:4.2rem;font-weight:100}@media (max-width:600px){.gh-flow-content h1{font-size:7vw}}.gh-flow-content .gh-btn{display:block;margin:20px auto 0;max-width:400px}.gh-flow-content .form-group{margin-bottom:2.5rem}.gh-flow-content input{border:1px solid #dae1e3;font-size:1.6rem;font-weight:100;line-height:1.4em;padding:10px}.gh-flow-em{font-weight:500}.gh-signin{background:#f8fbfd;border:1px solid #dae1e3;border-radius:5px;margin:30px auto;max-width:400px;padding:40px;position:relative;text-align:left;width:100%}.gh-signin .form-group{margin-bottom:1.5rem}.gh-signin .gh-btn{margin:0}.error-content{flex-grow:1;justify-content:center;padding:8vw;user-select:text}.error-content,.error-details{align-items:center;display:flex}.error-details{margin-bottom:4rem}.error-ghost{height:115px;margin:15px}@media (max-width:630px){.error-ghost{display:none}}.error-code{color:#c5d2d9;font-size:10vw;font-weight:600;letter-spacing:-.4vw;line-height:.9em;margin:0}.error-description{border:none;color:#54666d;font-size:2.3rem;font-weight:300;line-height:1.3em;margin:0;padding:0}.error-message{align-items:center;display:flex;flex-direction:column;margin:15px}.error-message a{font-size:1.4rem;line-height:1;margin:8px 0}.error-link{background-color:transparent;color:#5ba4e5;text-decoration:none;transition:background .3s,color .3s}.error-stack{background-color:hsla(0,0%,100%,.3);margin:1rem auto;max-width:800px;padding:2rem}.error-stack-list{list-style-type:none;margin:0;padding:0}.error-stack-list li{display:block}.error-stack-list li:before{color:#bbb;content:"\21AA";display:inline-block;font-size:1.2rem;margin-right:.5rem}.error-stack-function{font-weight:700}
1
+ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-family:sans-serif}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.black{color:#15171a}.darkgrey{color:#394047}.midgrey{color:#7c8b9a}.lightgrey{color:#ced4d9}.blue{color:#14b8ff}.red{color:#f50b23}.orange{color:#ffb41f}.green{color:#30cf43}.darkgrey-hover:hover{color:#394047}.midgrey-hover:hover{color:#7c8b9a}.lightgrey-hover:hover{color:#ced4d9}.blue-hover:hover{color:#14b8ff}.red-hover:hover{color:#f50b23}.orange-hover:hover{color:#ffb41f}.green-hover:hover{color:#30cf43}*,:after,:before{box-sizing:border-box}html{-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:62.5%;letter-spacing:.2px;line-height:1.65;overflow:hidden}body,html{height:100%;width:100%}body{color:#343f44;font-size:1.4rem;overflow:auto;overflow-x:hidden}.gh-view{-ms-flex-positive:1;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;flex-grow:1}h1,h2{text-rendering:optimizeLegibility;color:#343f44;font-size:2.9rem;line-height:1.15em;margin:0 0 .3em;text-indent:-1px}@media (max-width:500px){h1{font-size:2.4rem}}.gh-input{-webkit-appearance:none;border:1px solid #d6e3eb;border-radius:4px;color:#4b5b62;display:block;font-size:1.6rem;font-weight:300;height:40px;line-height:1em;padding:10px 12px;transition:border-color .15s linear;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:100%}.gh-input:focus{border-color:#b4cbda;outline:0}.gh-btn{fill:#829aa8;-webkit-font-smoothing:subpixel-antialiased;border:1px solid #d6e3eb;border-radius:5px;color:#829aa8;display:inline-block;outline:none;text-decoration:none!important;transition:all .2s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.gh-btn span{border-radius:4px;display:block;font-size:1.3rem;font-weight:400;height:33px;letter-spacing:.2px;line-height:33px;padding:0 12px;text-align:center}.gh-btn:hover{border-color:#b4cbda}.gh-btn-hover-blue:hover{border-color:#3eb0ef;color:#3eb0ef}.gh-btn-blue{fill:#fff;background:linear-gradient(#3da1d6,#2288bf);border:0;box-shadow:0 1px 0 rgba(0,0,0,.12);color:#fff;padding:1px;text-shadow:0 -1px 0 rgba(0,0,0,.1);transition:none!important}.gh-btn-blue span{background:linear-gradient(#4ab6f0,#2fa5e4 60%,#2fa5e4 90%,#38a9e5);box-shadow:inset 0 1px 0 hsla(0,0%,100%,.1)}.gh-btn-blue:active,.gh-btn-blue:focus{background:#1e78a9}.gh-btn-blue:active span,.gh-btn-blue:focus span{background:#29a0e0;box-shadow:none}.gh-btn-block{display:block;width:100%}.gh-input-icon{display:block;position:relative}.gh-input-icon svg{fill:color(var(--midgrey) l(15%));height:14px;left:10px;position:absolute;top:50%;transform:translateY(-7px);width:auto;z-index:2}.gh-input-icon input{padding-left:35px}.gh-app{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden}.gh-viewport{max-height:100%;overflow:hidden}.gh-main,.gh-viewport{-ms-flex-positive:1;display:-ms-flexbox;display:flex;flex-grow:1}.gh-main{background:#fff;overflow-y:auto;position:relative}.gh-flow{background:linear-gradient(315deg,#efefef,#fff);min-height:100%;overflow-y:auto}.gh-flow,.gh-flow-content-wrap{display:flex;flex-direction:column;flex-grow:1}.gh-flow-content-wrap{align-items:center;flex-shrink:0;justify-content:center;margin:0 24px;padding-bottom:8vh}.gh-flow-content-wrap .site-icon{border-radius:3px;height:70px;width:70px}.gh-flow-content{background:#fff;border-radius:3px;box-shadow:0 2.8px 2.2px rgba(0,0,0,.02),0 6.7px 5.3px rgba(0,0,0,.02),0 12.5px 10px rgba(0,0,0,.02),0 22.3px 17.9px rgba(0,0,0,.03),0 41.8px 33.4px rgba(0,0,0,.03),0 100px 80px rgba(0,0,0,.05);color:var(--darkgrey);display:flex;flex-direction:column;font-size:1.9rem;font-weight:300;line-height:1.5em;margin:4rem 0 6rem;max-width:520px;padding:40px;width:100%}.gh-flow-content.unsubscribe{align-items:center;justify-content:center;margin:4rem 0;max-width:560px;min-height:200px;text-align:center}@media (max-width:500px){.gh-flow-content{background:transparent;box-shadow:none;padding:0}}.gh-flow-content header{align-items:center;display:flex;flex-direction:column}.gh-flow-content h1{color:#15171a;font-size:4.1rem;font-weight:700;line-height:1.15em;margin-bottom:24px}.gh-flow-content.unsubscribe h1{font-size:3.2rem}@media (max-width:600px){.gh-flow-content h1,.gh-flow-content.unsubscribe h1{font-size:6vw}}.gh-flow-content.unsubscribe p{color:#394047;font-size:1.8rem;margin:0 0 .4em}@media (max-width:500px){.gh-flow-content.unsubscribe p{font-size:1.6rem;line-height:1.5}}.gh-flow-content .gh-btn{display:block;margin:20px auto 0;max-width:400px}.gh-flow-content .form-group{margin-bottom:2.5rem;position:relative}.gh-flow-content .form-group.error .gh-input{border-color:#f50b23;box-shadow:0 0 0 3px rgba(239,24,24,.15)}.gh-flow-content .main-error{color:#7c8b9a;font-size:1.35rem;font-weight:400;margin:0;position:absolute;right:0;text-align:center;user-select:text}.gh-flow-em{font-weight:500}.unsubscribe-footer{font-size:1.5rem;text-align:center}@media (max-width:500px){.unsubscribe-footer{font-size:1.4rem;line-height:1.4em;padding:0 24px}}.unsubscribe-footer p{color:#7c8b9a;margin:0 0 .4rem}.unsubscribe-footer a{color:#15171a;text-decoration:none}.unsubscribe-footer a:hover{text-decoration:underline}.gh-signin{margin-bottom:1.5rem}.gh-signin .gh-input,.gh-signin .gh-input:-webkit-autofill:first-line{border-radius:8px;font-size:1.8rem;height:54px;padding:12px 16px}.gh-signin .gh-input::placeholder{color:#abb4be;font-weight:400;opacity:1}.gh-signin .gh-input::-webkit-input-placeholder{color:#abb4be;font-weight:400}.gh-signin .gh-input:-ms-input-placeholder{color:#abb4be;font-weight:400}.gh-signin .gh-input::-moz-placeholder{color:#abb4be;font-weight:400;opacity:1}.gh-signin .gh-input:focus{border-color:#30cf43;box-shadow:0 0 0 3px rgba(26,170,96,.15)}.gh-signin .gh-btn{-webkit-font-smoothing:subpixel-antialiased;background:#15171a;border-radius:8px;font-weight:300;height:54px;line-height:54px;margin:0;margin-top:32px;max-width:unset;transition:all .4s ease;width:100%}.gh-signin .gh-btn span{color:#fff;font-size:1.8rem}.error-content{flex-grow:1;justify-content:center;padding:8vw;user-select:text}.error-content,.error-details{align-items:center;display:flex}.error-details{margin-bottom:4rem}.error-ghost{height:115px;margin:15px}@media (max-width:630px){.error-ghost{display:none}}.error-code{color:#c5d2d9;font-size:10vw;font-weight:600;letter-spacing:-.4vw;line-height:.9em;margin:0}.error-description{border:none;color:#54666d;font-size:2.3rem;font-weight:300;line-height:1.3em;margin:0;padding:0}.error-message{align-items:center;display:flex;flex-direction:column;margin:15px}.error-message a{font-size:1.4rem;line-height:1;margin:8px 0}.error-link{background-color:transparent;color:#5ba4e5;text-decoration:none;transition:background .3s,color .3s}.error-stack{background-color:hsla(0,0%,100%,.3);margin:1rem auto;max-width:800px;padding:2rem}.error-stack-list{list-style-type:none;margin:0;padding:0}.error-stack-list li{display:block}.error-stack-list li:before{color:#bbb;content:"\21AA";display:inline-block;font-size:1.2rem;margin-right:.5rem}.error-stack-function{font-weight:700}
@@ -33,7 +33,9 @@ function updateLocalTemplateOptions(req, res, next) {
33
33
  default_payment_card_last4: sub.default_payment_card_last4 || '****'
34
34
  });
35
35
  }),
36
- paid: req.member.status !== 'free'
36
+ paid: req.member.status !== 'free',
37
+ status: req.member.status,
38
+ products: req.member.products
37
39
  } : null;
38
40
 
39
41
  hbs.updateLocalTemplateOptions(res.locals, _.merge({}, localTemplateOptions, {
@@ -5,8 +5,11 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
7
7
  <title>
8
- {{#if member}}Successfully Unsubscribed{{/if}}
9
- {{#if error}}Unsubscribe Failed{{/if}}
8
+ {{#if error}}
9
+ Unsubscribe Failed
10
+ {{else}}
11
+ Successfully Unsubscribed
12
+ {{/if}}
10
13
  </title>
11
14
  <link rel="stylesheet" href="{{asset "public/ghost.css" hasMinFile="true"}}" />
12
15
  </head>
@@ -15,42 +18,34 @@
15
18
  <div class="gh-viewport">
16
19
  <main class="gh-main" role="main">
17
20
  <div class="gh-flow">
18
- <header class="gh-flow-head gh-flow-head-unsubscribe">
19
- <nav class="gh-flow-nav">
20
- <a href="{{@site.url}}" class="gh-flow-back-plain">
21
- <!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
22
- <svg width="17px" height="27px" viewBox="0 0 17 27" version="1.1"
23
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
24
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"
25
- stroke-linecap="round" stroke-linejoin="round">
26
- <g id="Stroke-42" transform="translate(2.000000, 2.000000)" stroke-width="3"
27
- stroke="#7d878a">
28
- <polyline points="13.5401 0.4256 0.3971 11.9256 13.5401 23.4256"></polyline>
29
- </g>
30
- </g>
31
- </svg>
32
- Back to {{@site.title}}
33
- </a>
34
- </nav>
35
- </header>
36
-
37
21
  <div class="gh-flow-content-wrap">
38
- <section class="gh-flow-content gh-flow-content-unsubscribe">
22
+ {{#if @site.icon}}
23
+ <img class="site-icon" src="{{img_url @site.icon absolute="true"}}" layout="fixed">
24
+ {{/if}}
25
+ <section class="gh-flow-content unsubscribe">
39
26
  {{#if error}}
27
+ <h1>Unsubscribe failed.</h1>
40
28
  <p>{{error}}</p>
41
- {{else}}
42
- {{#if member}}
43
- <p>
44
- <span class="gh-flow-em">{{member.email}}</span> has been successfully unsubscribed from emails.
45
- {{#match member.status "!=" "free"}}
46
- <br>
47
- Don't worry, this will not cancel your paid subscription to {{@site.title}}.
48
- {{/match}}
49
- </p>
50
- <p>Didn't mean to do this? Manage your account <a href="{{@site.url}}/#/portal/account">here</a>.</p>
51
- {{/if}}
29
+ {{else if member}}
30
+ <h1>Successfully unsubscribed.</h1>
31
+ <p>
32
+ <span class="gh-flow-em">{{member.email}}</span> will no longer receive this newsletter.
33
+ {{#match member.status "!=" "free"}}
34
+ This will not cancel your paid subscription{{#if @site.title}} to {{@site.title}}{{/if}}.
35
+ {{/match}}
36
+ </p>
52
37
  {{/if}}
53
38
  </section>
39
+ <div class="unsubscribe-footer">
40
+ {{#unless error}}
41
+ <p>Didn't mean to do this? Manage your account <a href="{{@site.url}}/#/portal/account">here</a>.</p>
42
+ {{/unless}}
43
+ {{#if @site.title}}
44
+ <a href="{{@site.url}}">{{@site.title}}</a>
45
+ {{else}}
46
+ <a href="{{@site.url}}">Visit site</a>
47
+ {{/if}}
48
+ </div>
54
49
  </div>
55
50
  </div>
56
51
  </main>
@@ -84,10 +84,10 @@ const themeErrorRenderer = (err, req, res, next) => {
84
84
  };
85
85
 
86
86
  module.exports.handleThemeResponse = [
87
- // Make sure the error can be served
88
- prepareError,
89
87
  // Handle the error in Sentry
90
88
  sentry.errorHandler,
89
+ // Make sure the error can be served
90
+ prepareError,
91
91
  // Render the error using theme template
92
92
  themeErrorRenderer
93
93
  ];
@@ -49,6 +49,13 @@ module.exports = {
49
49
 
50
50
  return auth.setup.setupUser(setupDetails);
51
51
  })
52
+ .then((data) => {
53
+ try {
54
+ return auth.setup.doFixtures(data, api.products);
55
+ } catch (e) {
56
+ return data;
57
+ }
58
+ })
52
59
  .then((data) => {
53
60
  try {
54
61
  return auth.setup.doProduct(data, api.products);